diff --git a/.cproject b/.cproject
new file mode 100644
index 0000000..de263d0
--- /dev/null
+++ b/.cproject
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.mxproject b/.mxproject
new file mode 100644
index 0000000..5f69d25
--- /dev/null
+++ b/.mxproject
@@ -0,0 +1,64 @@
+[PreviousLibFiles]
+LibFiles=Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_cortex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_cortex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_crc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_crc_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_crc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_bus.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_rcc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_crs.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_system.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_utils.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_gpio.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_hsem.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_hsem.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_dma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_dmamux.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_mdma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_pwr.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_def.h;Drivers\STM32H7xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_exti.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_exti.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma2d.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_dma2d.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_i2c.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_ltdc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_ltdc_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_ospi.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_tim.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_tim_ex.h;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_hsem.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_exti.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma2d.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ltdc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ltdc_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ospi.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim_ex.c;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_cortex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_cortex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_crc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_crc_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_crc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_bus.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_rcc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_crs.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_system.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_utils.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_gpio.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_hsem.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_hsem.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_dma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_dmamux.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_mdma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_pwr.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_def.h;Drivers\STM32H7xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_exti.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_exti.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma2d.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_dma2d.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_i2c.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_ltdc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_ltdc_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_ospi.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_tim.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_tim_ex.h;Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7b3xxq.h;Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h;Drivers\CMSIS\Device\ST\STM32H7xx\Include\system_stm32h7xx.h;Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_armclang_ltm.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv81mml.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm35p.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_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\tx_initialize_low_level.S;Core\Src\app_threadx.c;AZURE_RTOS\App\app_azure_rtos.c;TouchGFX\target\generated\TouchGFXConfiguration.cpp;TouchGFX\target\generated\TouchGFXGeneratedHAL.cpp;TouchGFX\target\TouchGFXHAL.cpp;TouchGFX\target\STM32TouchController.cpp;TouchGFX\target\generated\STM32DMA.cpp;TouchGFX\target\generated\OSWrappers.cpp;TouchGFX\target\TouchGFXGPIO.cpp;TouchGFX\App\app_touchgfx.c;Core\Src\stm32h7xx_it.c;Core\Src\stm32h7xx_hal_msp.c;Core\Src\stm32h7xx_hal_timebase_tim.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_hsem.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_exti.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma2d.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ltdc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ltdc_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ospi.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim_ex.c;Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c;Core\Src\system_stm32h7xx.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_crc_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_hsem.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_exti.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma2d.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ltdc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ltdc_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ospi.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim_ex.c;Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c;Core\Src\system_stm32h7xx.c;;;
+HeaderPath=Drivers\STM32H7xx_HAL_Driver\Inc;Drivers\STM32H7xx_HAL_Driver\Inc\Legacy;Drivers\CMSIS\Device\ST\STM32H7xx\Include;Drivers\CMSIS\Include;Middlewares\ST\threadx\common\inc\;Middlewares\ST\threadx\ports\cortex_m7\gnu\inc\;Core\Inc;AZURE_RTOS\App;TouchGFX\App;TouchGFX\target\generated;TouchGFX\target;
+CDefines=TX_INCLUDE_USER_DEFINE_FILE;USE_HAL_DRIVER;STM32H7B3xxQ;USE_HAL_DRIVER;USE_HAL_DRIVER;
+
+[PreviousGenFiles]
+AdvancedFolderStructure=true
+HeaderFileListSize=13
+HeaderFiles#0=..\Core\Inc\tx_user.h
+HeaderFiles#1=..\AZURE_RTOS\App\app_azure_rtos_config.h
+HeaderFiles#2=..\Core\Inc\app_threadx.h
+HeaderFiles#3=..\AZURE_RTOS\App\app_azure_rtos.h
+HeaderFiles#4=..\TouchGFX\App\app_touchgfx.h
+HeaderFiles#5=..\TouchGFX\target\generated\TouchGFXGeneratedHAL.hpp
+HeaderFiles#6=..\TouchGFX\target\TouchGFXHAL.hpp
+HeaderFiles#7=..\TouchGFX\target\STM32TouchController.hpp
+HeaderFiles#8=..\TouchGFX\target\generated\STM32DMA.hpp
+HeaderFiles#9=..\Core\Inc\stm32h7xx_it.h
+HeaderFiles#10=..\Core\Inc\RTE_Components.h
+HeaderFiles#11=..\Core\Inc\stm32h7xx_hal_conf.h
+HeaderFiles#12=..\Core\Inc\main.h
+HeaderFolderListSize=5
+HeaderPath#0=..\Core\Inc
+HeaderPath#1=..\AZURE_RTOS\App
+HeaderPath#2=..\TouchGFX\App
+HeaderPath#3=..\TouchGFX\target\generated
+HeaderPath#4=..\TouchGFX\target
+HeaderFiles=;
+SourceFileListSize=15
+SourceFiles#0=..\Core\Src\tx_initialize_low_level.S
+SourceFiles#1=..\Core\Src\app_threadx.c
+SourceFiles#2=..\AZURE_RTOS\App\app_azure_rtos.c
+SourceFiles#3=..\TouchGFX\target\generated\TouchGFXConfiguration.cpp
+SourceFiles#4=..\TouchGFX\target\generated\TouchGFXGeneratedHAL.cpp
+SourceFiles#5=..\TouchGFX\target\TouchGFXHAL.cpp
+SourceFiles#6=..\TouchGFX\target\STM32TouchController.cpp
+SourceFiles#7=..\TouchGFX\target\generated\STM32DMA.cpp
+SourceFiles#8=..\TouchGFX\target\generated\OSWrappers.cpp
+SourceFiles#9=..\TouchGFX\target\TouchGFXGPIO.cpp
+SourceFiles#10=..\TouchGFX\App\app_touchgfx.c
+SourceFiles#11=..\Core\Src\stm32h7xx_it.c
+SourceFiles#12=..\Core\Src\stm32h7xx_hal_msp.c
+SourceFiles#13=..\Core\Src\stm32h7xx_hal_timebase_tim.c
+SourceFiles#14=..\Core\Src\main.c
+SourceFolderListSize=5
+SourcePath#0=..\Core\Src
+SourcePath#1=..\AZURE_RTOS\App
+SourcePath#2=..\TouchGFX\target\generated
+SourcePath#3=..\TouchGFX\target
+SourcePath#4=..\TouchGFX\App
+SourceFiles=;
+
+[ThirdPartyIp]
+ThirdPartyIpNumber=1
+ThirdPartyIpName#0=STMicroelectronics.X-CUBE-AZRTOS-H7.2.1.0
+
+[ThirdPartyIp#STMicroelectronics.X-CUBE-AZRTOS-H7.2.1.0]
+include=Middlewares\ST\threadx\common\inc;Middlewares\ST\threadx\ports\cortex_m7\gnu\inc;
+sourceAsm=Middlewares\ST\threadx\ports\cortex_m7\gnu\src\tx_thread_context_restore.S;Middlewares\ST\threadx\ports\cortex_m7\gnu\src\tx_thread_context_save.S;Middlewares\ST\threadx\ports\cortex_m7\gnu\src\tx_thread_interrupt_control.S;Middlewares\ST\threadx\ports\cortex_m7\gnu\src\tx_thread_schedule.S;Middlewares\ST\threadx\ports\cortex_m7\gnu\src\tx_thread_stack_build.S;Middlewares\ST\threadx\ports\cortex_m7\gnu\src\tx_thread_system_return.S;Middlewares\ST\threadx\ports\cortex_m7\gnu\src\tx_timer_interrupt.S;
+source=Middlewares\ST\threadx\common\src\tx_initialize_high_level.c;Middlewares\ST\threadx\common\src\tx_initialize_kernel_enter.c;Middlewares\ST\threadx\common\src\tx_initialize_kernel_setup.c;Middlewares\ST\threadx\common\src\tx_block_allocate.c;Middlewares\ST\threadx\common\src\tx_block_pool_cleanup.c;Middlewares\ST\threadx\common\src\tx_block_pool_create.c;Middlewares\ST\threadx\common\src\tx_block_pool_delete.c;Middlewares\ST\threadx\common\src\tx_block_pool_info_get.c;Middlewares\ST\threadx\common\src\tx_block_pool_initialize.c;Middlewares\ST\threadx\common\src\tx_block_pool_prioritize.c;Middlewares\ST\threadx\common\src\tx_block_release.c;Middlewares\ST\threadx\common\src\tx_byte_allocate.c;Middlewares\ST\threadx\common\src\tx_byte_pool_cleanup.c;Middlewares\ST\threadx\common\src\tx_byte_pool_create.c;Middlewares\ST\threadx\common\src\tx_byte_pool_delete.c;Middlewares\ST\threadx\common\src\tx_byte_pool_info_get.c;Middlewares\ST\threadx\common\src\tx_byte_pool_initialize.c;Middlewares\ST\threadx\common\src\tx_byte_pool_prioritize.c;Middlewares\ST\threadx\common\src\tx_byte_pool_search.c;Middlewares\ST\threadx\common\src\tx_byte_release.c;Middlewares\ST\threadx\common\src\tx_event_flags_cleanup.c;Middlewares\ST\threadx\common\src\tx_event_flags_create.c;Middlewares\ST\threadx\common\src\tx_event_flags_delete.c;Middlewares\ST\threadx\common\src\tx_event_flags_get.c;Middlewares\ST\threadx\common\src\tx_event_flags_info_get.c;Middlewares\ST\threadx\common\src\tx_event_flags_initialize.c;Middlewares\ST\threadx\common\src\tx_event_flags_set.c;Middlewares\ST\threadx\common\src\tx_event_flags_set_notify.c;Middlewares\ST\threadx\common\src\tx_mutex_cleanup.c;Middlewares\ST\threadx\common\src\tx_mutex_create.c;Middlewares\ST\threadx\common\src\tx_mutex_delete.c;Middlewares\ST\threadx\common\src\tx_mutex_get.c;Middlewares\ST\threadx\common\src\tx_mutex_info_get.c;Middlewares\ST\threadx\common\src\tx_mutex_initialize.c;Middlewares\ST\threadx\common\src\tx_mutex_prioritize.c;Middlewares\ST\threadx\common\src\tx_mutex_priority_change.c;Middlewares\ST\threadx\common\src\tx_mutex_put.c;Middlewares\ST\threadx\common\src\tx_queue_cleanup.c;Middlewares\ST\threadx\common\src\tx_queue_create.c;Middlewares\ST\threadx\common\src\tx_queue_delete.c;Middlewares\ST\threadx\common\src\tx_queue_flush.c;Middlewares\ST\threadx\common\src\tx_queue_front_send.c;Middlewares\ST\threadx\common\src\tx_queue_info_get.c;Middlewares\ST\threadx\common\src\tx_queue_initialize.c;Middlewares\ST\threadx\common\src\tx_queue_prioritize.c;Middlewares\ST\threadx\common\src\tx_queue_receive.c;Middlewares\ST\threadx\common\src\tx_queue_send.c;Middlewares\ST\threadx\common\src\tx_queue_send_notify.c;Middlewares\ST\threadx\common\src\tx_semaphore_ceiling_put.c;Middlewares\ST\threadx\common\src\tx_semaphore_cleanup.c;Middlewares\ST\threadx\common\src\tx_semaphore_create.c;Middlewares\ST\threadx\common\src\tx_semaphore_delete.c;Middlewares\ST\threadx\common\src\tx_semaphore_get.c;Middlewares\ST\threadx\common\src\tx_semaphore_info_get.c;Middlewares\ST\threadx\common\src\tx_semaphore_initialize.c;Middlewares\ST\threadx\common\src\tx_semaphore_prioritize.c;Middlewares\ST\threadx\common\src\tx_semaphore_put.c;Middlewares\ST\threadx\common\src\tx_semaphore_put_notify.c;Middlewares\ST\threadx\common\src\tx_thread_create.c;Middlewares\ST\threadx\common\src\tx_thread_delete.c;Middlewares\ST\threadx\common\src\tx_thread_entry_exit_notify.c;Middlewares\ST\threadx\common\src\tx_thread_identify.c;Middlewares\ST\threadx\common\src\tx_thread_info_get.c;Middlewares\ST\threadx\common\src\tx_thread_initialize.c;Middlewares\ST\threadx\common\src\tx_thread_preemption_change.c;Middlewares\ST\threadx\common\src\tx_thread_priority_change.c;Middlewares\ST\threadx\common\src\tx_thread_relinquish.c;Middlewares\ST\threadx\common\src\tx_thread_reset.c;Middlewares\ST\threadx\common\src\tx_thread_resume.c;Middlewares\ST\threadx\common\src\tx_thread_shell_entry.c;Middlewares\ST\threadx\common\src\tx_thread_sleep.c;Middlewares\ST\threadx\common\src\tx_thread_stack_analyze.c;Middlewares\ST\threadx\common\src\tx_thread_stack_error_handler.c;Middlewares\ST\threadx\common\src\tx_thread_stack_error_notify.c;Middlewares\ST\threadx\common\src\tx_thread_suspend.c;Middlewares\ST\threadx\common\src\tx_thread_system_preempt_check.c;Middlewares\ST\threadx\common\src\tx_thread_system_resume.c;Middlewares\ST\threadx\common\src\tx_thread_system_suspend.c;Middlewares\ST\threadx\common\src\tx_thread_terminate.c;Middlewares\ST\threadx\common\src\tx_thread_time_slice.c;Middlewares\ST\threadx\common\src\tx_thread_time_slice_change.c;Middlewares\ST\threadx\common\src\tx_thread_timeout.c;Middlewares\ST\threadx\common\src\tx_thread_wait_abort.c;Middlewares\ST\threadx\common\src\tx_time_get.c;Middlewares\ST\threadx\common\src\tx_time_set.c;Middlewares\ST\threadx\common\src\txe_block_allocate.c;Middlewares\ST\threadx\common\src\txe_block_pool_create.c;Middlewares\ST\threadx\common\src\txe_block_pool_delete.c;Middlewares\ST\threadx\common\src\txe_block_pool_info_get.c;Middlewares\ST\threadx\common\src\txe_block_pool_prioritize.c;Middlewares\ST\threadx\common\src\txe_block_release.c;Middlewares\ST\threadx\common\src\txe_byte_allocate.c;Middlewares\ST\threadx\common\src\txe_byte_pool_create.c;Middlewares\ST\threadx\common\src\txe_byte_pool_delete.c;Middlewares\ST\threadx\common\src\txe_byte_pool_info_get.c;Middlewares\ST\threadx\common\src\txe_byte_pool_prioritize.c;Middlewares\ST\threadx\common\src\txe_byte_release.c;Middlewares\ST\threadx\common\src\txe_event_flags_create.c;Middlewares\ST\threadx\common\src\txe_event_flags_delete.c;Middlewares\ST\threadx\common\src\txe_event_flags_get.c;Middlewares\ST\threadx\common\src\txe_event_flags_info_get.c;Middlewares\ST\threadx\common\src\txe_event_flags_set.c;Middlewares\ST\threadx\common\src\txe_event_flags_set_notify.c;Middlewares\ST\threadx\common\src\txe_mutex_create.c;Middlewares\ST\threadx\common\src\txe_mutex_delete.c;Middlewares\ST\threadx\common\src\txe_mutex_get.c;Middlewares\ST\threadx\common\src\txe_mutex_info_get.c;Middlewares\ST\threadx\common\src\txe_mutex_prioritize.c;Middlewares\ST\threadx\common\src\txe_mutex_put.c;Middlewares\ST\threadx\common\src\txe_queue_create.c;Middlewares\ST\threadx\common\src\txe_queue_delete.c;Middlewares\ST\threadx\common\src\txe_queue_flush.c;Middlewares\ST\threadx\common\src\txe_queue_front_send.c;Middlewares\ST\threadx\common\src\txe_queue_info_get.c;Middlewares\ST\threadx\common\src\txe_queue_prioritize.c;Middlewares\ST\threadx\common\src\txe_queue_receive.c;Middlewares\ST\threadx\common\src\txe_queue_send.c;Middlewares\ST\threadx\common\src\txe_queue_send_notify.c;Middlewares\ST\threadx\common\src\txe_semaphore_ceiling_put.c;Middlewares\ST\threadx\common\src\txe_semaphore_create.c;Middlewares\ST\threadx\common\src\txe_semaphore_delete.c;Middlewares\ST\threadx\common\src\txe_semaphore_get.c;Middlewares\ST\threadx\common\src\txe_semaphore_info_get.c;Middlewares\ST\threadx\common\src\txe_semaphore_prioritize.c;Middlewares\ST\threadx\common\src\txe_semaphore_put.c;Middlewares\ST\threadx\common\src\txe_semaphore_put_notify.c;Middlewares\ST\threadx\common\src\txe_thread_create.c;Middlewares\ST\threadx\common\src\txe_thread_delete.c;Middlewares\ST\threadx\common\src\txe_thread_entry_exit_notify.c;Middlewares\ST\threadx\common\src\txe_thread_info_get.c;Middlewares\ST\threadx\common\src\txe_thread_preemption_change.c;Middlewares\ST\threadx\common\src\txe_thread_priority_change.c;Middlewares\ST\threadx\common\src\txe_thread_relinquish.c;Middlewares\ST\threadx\common\src\txe_thread_reset.c;Middlewares\ST\threadx\common\src\txe_thread_resume.c;Middlewares\ST\threadx\common\src\txe_thread_suspend.c;Middlewares\ST\threadx\common\src\txe_thread_terminate.c;Middlewares\ST\threadx\common\src\txe_thread_time_slice_change.c;Middlewares\ST\threadx\common\src\txe_thread_wait_abort.c;Middlewares\ST\threadx\common\src\tx_timer_activate.c;Middlewares\ST\threadx\common\src\tx_timer_change.c;Middlewares\ST\threadx\common\src\tx_timer_create.c;Middlewares\ST\threadx\common\src\tx_timer_deactivate.c;Middlewares\ST\threadx\common\src\tx_timer_delete.c;Middlewares\ST\threadx\common\src\tx_timer_expiration_process.c;Middlewares\ST\threadx\common\src\tx_timer_info_get.c;Middlewares\ST\threadx\common\src\tx_timer_initialize.c;Middlewares\ST\threadx\common\src\tx_timer_system_activate.c;Middlewares\ST\threadx\common\src\tx_timer_system_deactivate.c;Middlewares\ST\threadx\common\src\tx_timer_thread_entry.c;Middlewares\ST\threadx\common\src\txe_timer_activate.c;Middlewares\ST\threadx\common\src\txe_timer_change.c;Middlewares\ST\threadx\common\src\txe_timer_create.c;Middlewares\ST\threadx\common\src\txe_timer_deactivate.c;Middlewares\ST\threadx\common\src\txe_timer_delete.c;Middlewares\ST\threadx\common\src\txe_timer_info_get.c;Middlewares\ST\threadx\common\src\tx_trace_buffer_full_notify.c;Middlewares\ST\threadx\common\src\tx_trace_disable.c;Middlewares\ST\threadx\common\src\tx_trace_enable.c;Middlewares\ST\threadx\common\src\tx_trace_event_filter.c;Middlewares\ST\threadx\common\src\tx_trace_event_unfilter.c;Middlewares\ST\threadx\common\src\tx_trace_initialize.c;Middlewares\ST\threadx\common\src\tx_trace_interrupt_control.c;Middlewares\ST\threadx\common\src\tx_trace_isr_enter_insert.c;Middlewares\ST\threadx\common\src\tx_trace_isr_exit_insert.c;Middlewares\ST\threadx\common\src\tx_trace_object_register.c;Middlewares\ST\threadx\common\src\tx_trace_object_unregister.c;Middlewares\ST\threadx\common\src\tx_trace_user_event_insert.c;
+
diff --git a/.project b/.project
new file mode 100644
index 0000000..f40975d
--- /dev/null
+++ b/.project
@@ -0,0 +1,33 @@
+
+
+ AZRTOS
+
+
+
+
+
+ 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
+ org.eclipse.cdt.core.ccnature
+
+
diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml
new file mode 100644
index 0000000..59f49dc
--- /dev/null
+++ b/.settings/language.settings.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.settings/stm32cubeide.project.prefs b/.settings/stm32cubeide.project.prefs
new file mode 100644
index 0000000..da9ffff
--- /dev/null
+++ b/.settings/stm32cubeide.project.prefs
@@ -0,0 +1,5 @@
+635E684B79701B039C64EA45C3F84D30=E3E279001597F4D5DBB561EDC0519B13
+66BE74F758C12D739921AEA421D593D3=3
+8DF89ED150041C4CBC7CB9A9CAA90856=A0F022B0F4C1A3726F29A646A6C3D307
+DC22A860405A8BF2F2C095E5B6529F12=A0F022B0F4C1A3726F29A646A6C3D307
+eclipse.preferences.version=1
diff --git a/AZRTOS Debug.launch b/AZRTOS Debug.launch
new file mode 100644
index 0000000..3e9f161
--- /dev/null
+++ b/AZRTOS Debug.launch
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AZRTOS.ioc b/AZRTOS.ioc
new file mode 100644
index 0000000..fdfa6af
--- /dev/null
+++ b/AZRTOS.ioc
@@ -0,0 +1,923 @@
+#MicroXplorer Configuration settings - do not modify
+DMA2D.ColorMode=DMA2D_OUTPUT_RGB565
+DMA2D.IPParameters=ColorMode
+File.Version=6
+GPIO.groupedBy=Group By Peripherals
+I2C4.IPParameters=Timing
+I2C4.Timing=0xC010151E
+KeepUserPlacement=false
+LTDC.ActiveH=272
+LTDC.ActiveW=480
+LTDC.Alpha_L0=255
+LTDC.Blue_L0=255
+LTDC.HBP=2
+LTDC.HFP=32
+LTDC.HSync=41
+LTDC.IPParameters=ActiveW,ActiveH,HBP,HFP,VBP,VFP,HSync,VSync,Layers,WindowX1_L0,WindowY1_L0,PixelFormat_L0,Alpha_L0,ImageWidth_L0,ImageHeight_L0,Blue_L0
+LTDC.ImageHeight_L0=272
+LTDC.ImageWidth_L0=480
+LTDC.Layers=0
+LTDC.PixelFormat_L0=LTDC_PIXEL_FORMAT_RGB888
+LTDC.VBP=2
+LTDC.VFP=2
+LTDC.VSync=10
+LTDC.WindowX1_L0=480
+LTDC.WindowY1_L0=272
+Mcu.CPN=STM32H7B3LIH6Q
+Mcu.Family=STM32H7
+Mcu.IP0=CORTEX_M7
+Mcu.IP1=CRC
+Mcu.IP2=DMA2D
+Mcu.IP3=I2C4
+Mcu.IP4=LTDC
+Mcu.IP5=NVIC
+Mcu.IP6=OCTOSPI1
+Mcu.IP7=RCC
+Mcu.IP8=SYS
+Mcu.IPNb=9
+Mcu.Name=STM32H7B3LIHxQ
+Mcu.Package=TFBGA225
+Mcu.Pin0=PI4
+Mcu.Pin1=PG15
+Mcu.Pin10=PE0
+Mcu.Pin100=PJ4
+Mcu.Pin101=PF14
+Mcu.Pin102=PG1
+Mcu.Pin103=PE9
+Mcu.Pin104=PE15
+Mcu.Pin105=PA2
+Mcu.Pin106=PA3
+Mcu.Pin107=PB2
+Mcu.Pin108=PJ2
+Mcu.Pin109=PJ3
+Mcu.Pin11=PB4
+Mcu.Pin110=PF12
+Mcu.Pin111=PG0
+Mcu.Pin112=PE8
+Mcu.Pin113=PE11
+Mcu.Pin114=PH7
+Mcu.Pin115=VP_CRC_VS_CRC
+Mcu.Pin116=VP_DMA2D_VS_DMA2D
+Mcu.Pin117=VP_OCTOSPI1_VS_octo
+Mcu.Pin118=VP_SYS_VS_tim6
+Mcu.Pin119=VP_STMicroelectronics.X-CUBE-AZRTOS-H7_VS_RTOSJjThreadX_6.1.10_2.1.0
+Mcu.Pin12=PK6
+Mcu.Pin120=VP_STMicroelectronics.X-CUBE-TOUCHGFX_VS_GraphicsJjApplication_4.19.0
+Mcu.Pin13=PK3
+Mcu.Pin14=PG11
+Mcu.Pin15=PJ15
+Mcu.Pin16=PD2
+Mcu.Pin17=PC12
+Mcu.Pin18=PA14
+Mcu.Pin19=PI8
+Mcu.Pin2=PK5
+Mcu.Pin20=PE1
+Mcu.Pin21=PB3
+Mcu.Pin22=PK4
+Mcu.Pin23=PG12
+Mcu.Pin24=PJ14
+Mcu.Pin25=PD0
+Mcu.Pin26=PA15
+Mcu.Pin27=PA12
+Mcu.Pin28=PA11
+Mcu.Pin29=PC14-OSC32_IN
+Mcu.Pin3=PG14
+Mcu.Pin30=PC15-OSC32_OUT
+Mcu.Pin31=PK7
+Mcu.Pin32=PG13
+Mcu.Pin33=PJ13
+Mcu.Pin34=PC11
+Mcu.Pin35=PI2
+Mcu.Pin36=PJ12
+Mcu.Pin37=PI1
+Mcu.Pin38=PA13
+Mcu.Pin39=PA10
+Mcu.Pin4=PG9
+Mcu.Pin40=PC9
+Mcu.Pin41=PC13
+Mcu.Pin42=PA9
+Mcu.Pin43=PC8
+Mcu.Pin44=PG8
+Mcu.Pin45=PF1
+Mcu.Pin46=PF0
+Mcu.Pin47=PA8
+Mcu.Pin48=PG6
+Mcu.Pin49=PG5
+Mcu.Pin5=PD7
+Mcu.Pin50=PG3
+Mcu.Pin51=PF2
+Mcu.Pin52=PI12
+Mcu.Pin53=PF4
+Mcu.Pin54=PI14
+Mcu.Pin55=PI13
+Mcu.Pin56=PG4
+Mcu.Pin57=PG2
+Mcu.Pin58=PK2
+Mcu.Pin59=PK1
+Mcu.Pin6=PD1
+Mcu.Pin60=PF3
+Mcu.Pin61=PF5
+Mcu.Pin62=PC2
+Mcu.Pin63=PJ11
+Mcu.Pin64=PK0
+Mcu.Pin65=PJ10
+Mcu.Pin66=PJ9
+Mcu.Pin67=PJ8
+Mcu.Pin68=PD13
+Mcu.Pin69=PD14
+Mcu.Pin7=PC10
+Mcu.Pin70=PD15
+Mcu.Pin71=PJ6
+Mcu.Pin72=PJ7
+Mcu.Pin73=PH0-OSC_IN
+Mcu.Pin74=PH1-OSC_OUT
+Mcu.Pin75=PE12
+Mcu.Pin76=PD8
+Mcu.Pin77=PD10
+Mcu.Pin78=PD12
+Mcu.Pin79=PC1
+Mcu.Pin8=PI3
+Mcu.Pin80=PH2
+Mcu.Pin81=PI15
+Mcu.Pin82=PF13
+Mcu.Pin83=PE7
+Mcu.Pin84=PE13
+Mcu.Pin85=PH6
+Mcu.Pin86=PC3
+Mcu.Pin87=PH3
+Mcu.Pin88=PC5
+Mcu.Pin89=PJ0
+Mcu.Pin9=PI5
+Mcu.Pin90=PF11
+Mcu.Pin91=PF15
+Mcu.Pin92=PE14
+Mcu.Pin93=PE10
+Mcu.Pin94=PJ5
+Mcu.Pin95=PD9
+Mcu.Pin96=PA0
+Mcu.Pin97=PA1
+Mcu.Pin98=PH5
+Mcu.Pin99=PJ1
+Mcu.PinsNb=121
+Mcu.ThirdParty0=STMicroelectronics.X-CUBE-AZRTOS-H7.2.1.0
+Mcu.ThirdParty1=STMicroelectronics.X-CUBE-TOUCHGFX.4.19.0
+Mcu.ThirdPartyNb=2
+Mcu.UserConstants=
+Mcu.UserName=STM32H7B3LIHxQ
+MxCube.Version=6.6.0
+MxDb.Version=DB.6.0.60
+NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
+NVIC.DMA2D_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true\:true
+NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
+NVIC.EXTI2_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true\:true
+NVIC.ForceEnableDMAVector=true
+NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
+NVIC.LTDC_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true\:true
+NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
+NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
+NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false\:false
+NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
+NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false\:false
+NVIC.SavedPendsvIrqHandlerGenerated=true
+NVIC.SavedSvcallIrqHandlerGenerated=true
+NVIC.SavedSystickIrqHandlerGenerated=true
+NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:true\:false
+NVIC.TIM6_DAC_IRQn=true\:15\:0\:false\:false\:true\:false\:false\:true\:true
+NVIC.TimeBase=TIM6_DAC_IRQn
+NVIC.TimeBaseIP=TIM6
+NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
+OCTOSPI1.IPParameters=MemoryType
+OCTOSPI1.MemoryType=HAL_OSPI_MEMTYPE_MACRONIX
+PA0.GPIOParameters=GPIO_Label
+PA0.GPIO_Label=I2S6_WS
+PA0.Locked=true
+PA0.Signal=I2S6_WS
+PA1.GPIOParameters=PinState,GPIO_Label
+PA1.GPIO_Label=LCD_BL_CTRL
+PA1.Locked=true
+PA1.PinState=GPIO_PIN_SET
+PA1.Signal=GPIO_Output
+PA10.GPIOParameters=GPIO_Label
+PA10.GPIO_Label=VCP_RX
+PA10.Locked=true
+PA10.Signal=USART1_RX
+PA11.GPIOParameters=GPIO_Label
+PA11.GPIO_Label=SPI2_NSS
+PA11.Locked=true
+PA11.Signal=GPIO_Output
+PA12.GPIOParameters=GPIO_Label
+PA12.GPIO_Label=SPI2_SCK
+PA12.Locked=true
+PA12.Signal=SPI2_SCK
+PA13.GPIOParameters=GPIO_Label
+PA13.GPIO_Label=JTMS
+PA13.Locked=true
+PA13.Signal=DEBUG_JTMS-SWDIO
+PA14.GPIOParameters=GPIO_Label
+PA14.GPIO_Label=JTCK
+PA14.Locked=true
+PA14.Signal=DEBUG_JTCK-SWCLK
+PA15.GPIOParameters=GPIO_Label
+PA15.GPIO_Label=JTDI
+PA15.Locked=true
+PA15.Signal=DEBUG_JTDI
+PA2.GPIOParameters=PinState,GPIO_Label
+PA2.GPIO_Label=LCD_ON/OFF
+PA2.Locked=true
+PA2.PinState=GPIO_PIN_SET
+PA2.Signal=GPIO_Output
+PA3.GPIOParameters=GPIO_Label
+PA3.GPIO_Label=I2S6_MCK
+PA3.Locked=true
+PA3.Signal=I2S6_MCK
+PA8.GPIOParameters=GPIO_Label
+PA8.GPIO_Label=MCO
+PA8.Locked=true
+PA8.Mode=Clock-out-1
+PA8.Signal=RCC_MCO_1
+PA9.GPIOParameters=GPIO_Label
+PA9.GPIO_Label=VCP_TX
+PA9.Locked=true
+PA9.Signal=USART1_TX
+PB2.GPIOParameters=GPIO_Label
+PB2.GPIO_Label=OCSPI1_CLK
+PB2.Locked=true
+PB2.Mode=O1_P1_CLK
+PB2.Signal=OCTOSPIM_P1_CLK
+PB3.GPIOParameters=GPIO_Label
+PB3.GPIO_Label=JTDO_TRACESWO
+PB3.Locked=true
+PB3.Signal=DEBUG_JTDO-SWO
+PB4.Locked=true
+PB4.Signal=DEBUG_JTRST
+PC1.GPIOParameters=GPIO_Label
+PC1.GPIO_Label=OCSPI1_IO4
+PC1.Locked=true
+PC1.Mode=OCTOSPI1_IOL_Port1H
+PC1.Signal=OCTOSPIM_P1_IO4
+PC10.GPIOParameters=GPIO_Label
+PC10.GPIO_Label=SDIO1_D2
+PC10.Locked=true
+PC10.Signal=SDMMC1_D2
+PC11.GPIOParameters=GPIO_Label
+PC11.GPIO_Label=SDIO1_D3
+PC11.Locked=true
+PC11.Signal=SDMMC1_D3
+PC12.GPIOParameters=GPIO_Label
+PC12.GPIO_Label=SDIO1_CK
+PC12.Locked=true
+PC12.Signal=SDMMC1_CK
+PC13.GPIOParameters=GPIO_Label
+PC13.GPIO_Label=WAKEUP
+PC13.Locked=true
+PC13.Signal=GPXTI13
+PC14-OSC32_IN.Locked=true
+PC14-OSC32_IN.Mode=LSE-External-Oscillator
+PC14-OSC32_IN.Signal=RCC_OSC32_IN
+PC15-OSC32_OUT.Locked=true
+PC15-OSC32_OUT.Mode=LSE-External-Oscillator
+PC15-OSC32_OUT.Signal=RCC_OSC32_OUT
+PC2.GPIOParameters=GPIO_Label
+PC2.GPIO_Label=SPI2_MISO
+PC2.Locked=true
+PC2.Signal=SPI2_MISO
+PC3.GPIOParameters=GPIO_Label
+PC3.GPIO_Label=SPI2_MOSI
+PC3.Locked=true
+PC3.Signal=SPI2_MOSI
+PC5.GPIOParameters=GPIO_Label
+PC5.GPIO_Label=OCSPI1_DQS
+PC5.Locked=true
+PC5.Mode=OCTOSPI1_Port1_DQS
+PC5.Signal=OCTOSPIM_P1_DQS
+PC8.GPIOParameters=GPIO_Label
+PC8.GPIO_Label=SDIO1_D0
+PC8.Locked=true
+PC8.Signal=SDMMC1_D0
+PC9.GPIOParameters=GPIO_Label
+PC9.GPIO_Label=SDIO1_D1
+PC9.Locked=true
+PC9.Signal=SDMMC1_D1
+PD0.GPIOParameters=GPIO_Label
+PD0.GPIO_Label=D2
+PD0.Locked=true
+PD0.Signal=FMC_D2_DA2
+PD1.GPIOParameters=GPIO_Label
+PD1.GPIO_Label=D3
+PD1.Locked=true
+PD1.Signal=FMC_D3_DA3
+PD10.GPIOParameters=GPIO_Label
+PD10.GPIO_Label=D15
+PD10.Locked=true
+PD10.Signal=FMC_D15_DA15
+PD12.GPIOParameters=GPIO_Label,GPIO_Pu
+PD12.GPIO_Label=I2C4_SCL
+PD12.GPIO_Pu=GPIO_PULLUP
+PD12.Locked=true
+PD12.Mode=I2C
+PD12.Signal=I2C4_SCL
+PD13.GPIOParameters=GPIO_Label,GPIO_Pu
+PD13.GPIO_Label=I2C4_SDA
+PD13.GPIO_Pu=GPIO_PULLUP
+PD13.Locked=true
+PD13.Mode=I2C
+PD13.Signal=I2C4_SDA
+PD14.GPIOParameters=GPIO_Label
+PD14.GPIO_Label=D0
+PD14.Locked=true
+PD14.Signal=FMC_D0_DA0
+PD15.GPIOParameters=GPIO_Label
+PD15.GPIO_Label=D1
+PD15.Locked=true
+PD15.Signal=FMC_D1_DA1
+PD2.GPIOParameters=GPIO_Label
+PD2.GPIO_Label=SDIO1_CMD
+PD2.Locked=true
+PD2.Signal=SDMMC1_CMD
+PD7.GPIOParameters=GPIO_Label
+PD7.GPIO_Label=OCSPI1_IO7
+PD7.Locked=true
+PD7.Mode=OCTOSPI1_IOL_Port1H
+PD7.Signal=OCTOSPIM_P1_IO7
+PD8.GPIOParameters=GPIO_Label
+PD8.GPIO_Label=D13
+PD8.Locked=true
+PD8.Signal=FMC_D13_DA13
+PD9.GPIOParameters=GPIO_Label
+PD9.GPIO_Label=D14
+PD9.Locked=true
+PD9.Signal=FMC_D14_DA14
+PE0.GPIOParameters=GPIO_Label
+PE0.GPIO_Label=FMC_NBL0
+PE0.Locked=true
+PE0.Signal=FMC_NBL0
+PE1.GPIOParameters=GPIO_Label
+PE1.GPIO_Label=FMC_NBL1
+PE1.Locked=true
+PE1.Signal=FMC_NBL1
+PE10.GPIOParameters=GPIO_Label
+PE10.GPIO_Label=D7
+PE10.Locked=true
+PE10.Signal=FMC_D7_DA7
+PE11.GPIOParameters=GPIO_Label
+PE11.GPIO_Label=D8
+PE11.Locked=true
+PE11.Signal=FMC_D8_DA8
+PE12.GPIOParameters=GPIO_Label
+PE12.GPIO_Label=D9
+PE12.Locked=true
+PE12.Signal=FMC_D9_DA9
+PE13.GPIOParameters=GPIO_Label
+PE13.GPIO_Label=D10
+PE13.Locked=true
+PE13.Signal=FMC_D10_DA10
+PE14.GPIOParameters=GPIO_Label
+PE14.GPIO_Label=D11
+PE14.Locked=true
+PE14.Signal=FMC_D11_DA11
+PE15.GPIOParameters=GPIO_Label
+PE15.GPIO_Label=D12
+PE15.Locked=true
+PE15.Signal=FMC_D12_DA12
+PE7.GPIOParameters=GPIO_Label
+PE7.GPIO_Label=D4
+PE7.Locked=true
+PE7.Signal=FMC_D4_DA4
+PE8.GPIOParameters=GPIO_Label
+PE8.GPIO_Label=D5
+PE8.Locked=true
+PE8.Signal=FMC_D5_DA5
+PE9.GPIOParameters=GPIO_Label
+PE9.GPIO_Label=D6
+PE9.Locked=true
+PE9.Signal=FMC_D6_DA6
+PF0.GPIOParameters=GPIO_Label
+PF0.GPIO_Label=A0
+PF0.Locked=true
+PF0.Signal=FMC_A0
+PF1.GPIOParameters=GPIO_Label
+PF1.GPIO_Label=A1
+PF1.Locked=true
+PF1.Signal=FMC_A1
+PF11.GPIOParameters=GPIO_Label
+PF11.GPIO_Label=SDNRAS
+PF11.Locked=true
+PF11.Signal=FMC_SDNRAS
+PF12.GPIOParameters=GPIO_Label
+PF12.GPIO_Label=A6
+PF12.Locked=true
+PF12.Signal=FMC_A6
+PF13.GPIOParameters=GPIO_Label
+PF13.GPIO_Label=A7
+PF13.Locked=true
+PF13.Signal=FMC_A7
+PF14.GPIOParameters=GPIO_Label
+PF14.GPIO_Label=A8
+PF14.Locked=true
+PF14.Signal=FMC_A8
+PF15.GPIOParameters=GPIO_Label
+PF15.GPIO_Label=A9
+PF15.Locked=true
+PF15.Signal=FMC_A9
+PF2.GPIOParameters=GPIO_Label
+PF2.GPIO_Label=A2
+PF2.Locked=true
+PF2.Signal=FMC_A2
+PF3.GPIOParameters=GPIO_Label
+PF3.GPIO_Label=A3
+PF3.Locked=true
+PF3.Signal=FMC_A3
+PF4.GPIOParameters=GPIO_Label
+PF4.GPIO_Label=A4
+PF4.Locked=true
+PF4.Signal=FMC_A4
+PF5.GPIOParameters=GPIO_Label
+PF5.GPIO_Label=A5
+PF5.Locked=true
+PF5.Signal=FMC_A5
+PG0.GPIOParameters=GPIO_Label
+PG0.GPIO_Label=A10
+PG0.Locked=true
+PG0.Signal=FMC_A10
+PG1.GPIOParameters=GPIO_Label
+PG1.GPIO_Label=A11
+PG1.Locked=true
+PG1.Signal=FMC_A11
+PG11.GPIOParameters=GPIO_Label
+PG11.GPIO_Label=USER_LED1
+PG11.Locked=true
+PG11.Signal=GPIO_Output
+PG12.GPIOParameters=GPIO_Label
+PG12.GPIO_Label=I2S6_SDI
+PG12.Locked=true
+PG12.Signal=I2S6_SDI
+PG13.GPIOParameters=GPIO_Label
+PG13.GPIO_Label=I2S6_CK
+PG13.Locked=true
+PG13.Signal=I2S6_CK
+PG14.GPIOParameters=GPIO_Label
+PG14.GPIO_Label=I2S6_SDO
+PG14.Locked=true
+PG14.Signal=I2S6_SDO
+PG15.GPIOParameters=GPIO_Label
+PG15.GPIO_Label=SDNCAS
+PG15.Locked=true
+PG15.Signal=FMC_SDNCAS
+PG2.GPIOParameters=GPIO_Label
+PG2.GPIO_Label=USER_LED2
+PG2.Locked=true
+PG2.Signal=GPIO_Output
+PG3.GPIOParameters=PinState,GPIO_Label
+PG3.GPIO_Label=AUDIO_NRST
+PG3.Locked=true
+PG3.PinState=GPIO_PIN_SET
+PG3.Signal=GPIO_Output
+PG4.GPIOParameters=GPIO_Label
+PG4.GPIO_Label=A14
+PG4.Locked=true
+PG4.Signal=FMC_A14_BA0
+PG5.GPIOParameters=GPIO_Label
+PG5.GPIO_Label=A15
+PG5.Locked=true
+PG5.Signal=FMC_A15_BA1
+PG6.GPIOParameters=GPIO_Label
+PG6.GPIO_Label=OCSPI1_NCS
+PG6.Locked=true
+PG6.Mode=OCTOSPI1_Port1_NCS
+PG6.Signal=OCTOSPIM_P1_NCS
+PG8.GPIOParameters=GPIO_Label
+PG8.GPIO_Label=SDCLK
+PG8.Locked=true
+PG8.Signal=FMC_SDCLK
+PG9.GPIOParameters=GPIO_Label
+PG9.GPIO_Label=OCSPI1_IO6
+PG9.Locked=true
+PG9.Mode=OCTOSPI1_IOL_Port1H
+PG9.Signal=OCTOSPIM_P1_IO6
+PH0-OSC_IN.Locked=true
+PH0-OSC_IN.Mode=HSE-External-Oscillator
+PH0-OSC_IN.Signal=RCC_OSC_IN
+PH1-OSC_OUT.Locked=true
+PH1-OSC_OUT.Mode=HSE-External-Oscillator
+PH1-OSC_OUT.Signal=RCC_OSC_OUT
+PH2.GPIOParameters=GPIO_Label
+PH2.GPIO_Label=LCD_INT
+PH2.Locked=true
+PH2.Signal=GPXTI2
+PH3.GPIOParameters=GPIO_Label
+PH3.GPIO_Label=OCSPI1_IO5
+PH3.Locked=true
+PH3.Mode=OCTOSPI1_IOL_Port1H
+PH3.Signal=OCTOSPIM_P1_IO5
+PH5.GPIOParameters=GPIO_Label
+PH5.GPIO_Label=SDNWE
+PH5.Locked=true
+PH5.Signal=FMC_SDNWE
+PH6.GPIOParameters=GPIO_Label
+PH6.GPIO_Label=SDNE1
+PH6.Locked=true
+PH6.Signal=FMC_SDNE1
+PH7.GPIOParameters=GPIO_Label
+PH7.GPIO_Label=SDCKE1
+PH7.Locked=true
+PH7.Signal=FMC_SDCKE1
+PI1.GPIOParameters=GPIO_Label
+PI1.GPIO_Label=WIFI_RST
+PI1.Locked=true
+PI1.Signal=GPIO_Output
+PI12.GPIOParameters=GPIO_Label
+PI12.GPIO_Label=LCD_HSYNC
+PI12.Locked=true
+PI12.Mode=RGB888
+PI12.Signal=LTDC_HSYNC
+PI13.GPIOParameters=GPIO_Label
+PI13.GPIO_Label=LCD_VSYNC
+PI13.Locked=true
+PI13.Mode=RGB888
+PI13.Signal=LTDC_VSYNC
+PI14.GPIOParameters=GPIO_Label
+PI14.GPIO_Label=LCD_CLK
+PI14.Locked=true
+PI14.Mode=RGB888
+PI14.Signal=LTDC_CLK
+PI15.GPIOParameters=GPIO_Label
+PI15.GPIO_Label=LCD_R0
+PI15.Locked=true
+PI15.Mode=RGB888
+PI15.Signal=LTDC_R0
+PI2.GPIOParameters=GPIO_Label
+PI2.GPIO_Label=WIFI_WKUP
+PI2.Locked=true
+PI2.Signal=GPIO_Output
+PI3.GPIOParameters=GPIO_Label
+PI3.GPIO_Label=WIFI_BOOT
+PI3.Locked=true
+PI3.Signal=GPIO_Output
+PI4.GPIOParameters=GPIO_Label
+PI4.GPIO_Label=WIFI_GPIO
+PI4.Locked=true
+PI4.Signal=GPXTI4
+PI5.GPIOParameters=GPIO_Label
+PI5.GPIO_Label=WIFI_DATRDY
+PI5.Locked=true
+PI5.Signal=GPXTI5
+PI8.GPIOParameters=GPIO_PuPd,GPIO_Label
+PI8.GPIO_Label=uSD_Detect
+PI8.GPIO_PuPd=GPIO_PULLUP
+PI8.Locked=true
+PI8.Signal=GPXTI8
+PJ0.GPIOParameters=GPIO_Label
+PJ0.GPIO_Label=LCD_R1
+PJ0.Locked=true
+PJ0.Mode=RGB888
+PJ0.Signal=LTDC_R1
+PJ1.GPIOParameters=GPIO_Label
+PJ1.GPIO_Label=LCD_R2
+PJ1.Locked=true
+PJ1.Mode=RGB888
+PJ1.Signal=LTDC_R2
+PJ10.GPIOParameters=GPIO_Label
+PJ10.GPIO_Label=LCD_G3
+PJ10.Locked=true
+PJ10.Mode=RGB888
+PJ10.Signal=LTDC_G3
+PJ11.GPIOParameters=GPIO_Label
+PJ11.GPIO_Label=LCD_G4
+PJ11.Locked=true
+PJ11.Mode=RGB888
+PJ11.Signal=LTDC_G4
+PJ12.GPIOParameters=GPIO_Label
+PJ12.GPIO_Label=LCD_B0
+PJ12.Locked=true
+PJ12.Mode=RGB888
+PJ12.Signal=LTDC_B0
+PJ13.GPIOParameters=GPIO_Label
+PJ13.GPIO_Label=LCD_B1
+PJ13.Locked=true
+PJ13.Mode=RGB888
+PJ13.Signal=LTDC_B1
+PJ14.GPIOParameters=GPIO_Label
+PJ14.GPIO_Label=LCD_B2
+PJ14.Locked=true
+PJ14.Mode=RGB888
+PJ14.Signal=LTDC_B2
+PJ15.GPIOParameters=GPIO_Label
+PJ15.GPIO_Label=LCD_B3
+PJ15.Locked=true
+PJ15.Mode=RGB888
+PJ15.Signal=LTDC_B3
+PJ2.GPIOParameters=GPIO_Label
+PJ2.GPIO_Label=LCD_R3
+PJ2.Locked=true
+PJ2.Mode=RGB888
+PJ2.Signal=LTDC_R3
+PJ3.GPIOParameters=GPIO_Label
+PJ3.GPIO_Label=LCD_R4
+PJ3.Locked=true
+PJ3.Mode=RGB888
+PJ3.Signal=LTDC_R4
+PJ4.GPIOParameters=GPIO_Label
+PJ4.GPIO_Label=LCD_R5
+PJ4.Locked=true
+PJ4.Mode=RGB888
+PJ4.Signal=LTDC_R5
+PJ5.GPIOParameters=GPIO_Label
+PJ5.GPIO_Label=LCD_R6
+PJ5.Locked=true
+PJ5.Mode=RGB888
+PJ5.Signal=LTDC_R6
+PJ6.GPIOParameters=GPIO_Label
+PJ6.GPIO_Label=LCD_R7
+PJ6.Locked=true
+PJ6.Mode=RGB888
+PJ6.Signal=LTDC_R7
+PJ7.GPIOParameters=GPIO_Label
+PJ7.GPIO_Label=LCD_G0
+PJ7.Locked=true
+PJ7.Mode=RGB888
+PJ7.Signal=LTDC_G0
+PJ8.GPIOParameters=GPIO_Label
+PJ8.GPIO_Label=LCD_G1
+PJ8.Locked=true
+PJ8.Mode=RGB888
+PJ8.Signal=LTDC_G1
+PJ9.GPIOParameters=GPIO_Label
+PJ9.GPIO_Label=LCD_G2
+PJ9.Locked=true
+PJ9.Mode=RGB888
+PJ9.Signal=LTDC_G2
+PK0.GPIOParameters=GPIO_Label
+PK0.GPIO_Label=LCD_G5
+PK0.Locked=true
+PK0.Mode=RGB888
+PK0.Signal=LTDC_G5
+PK1.GPIOParameters=GPIO_Label
+PK1.GPIO_Label=LCD_G6
+PK1.Locked=true
+PK1.Mode=RGB888
+PK1.Signal=LTDC_G6
+PK2.GPIOParameters=GPIO_Label
+PK2.GPIO_Label=LCD_G7
+PK2.Locked=true
+PK2.Mode=RGB888
+PK2.Signal=LTDC_G7
+PK3.GPIOParameters=GPIO_Label
+PK3.GPIO_Label=LCD_B4
+PK3.Locked=true
+PK3.Mode=RGB888
+PK3.Signal=LTDC_B4
+PK4.GPIOParameters=GPIO_Label
+PK4.GPIO_Label=LCD_B5
+PK4.Locked=true
+PK4.Mode=RGB888
+PK4.Signal=LTDC_B5
+PK5.GPIOParameters=GPIO_Label
+PK5.GPIO_Label=LCD_B6
+PK5.Locked=true
+PK5.Mode=RGB888
+PK5.Signal=LTDC_B6
+PK6.GPIOParameters=GPIO_Label
+PK6.GPIO_Label=LCD_B7
+PK6.Locked=true
+PK6.Mode=RGB888
+PK6.Signal=LTDC_B7
+PK7.GPIOParameters=GPIO_Label
+PK7.GPIO_Label=LCD_DE
+PK7.Locked=true
+PK7.Mode=RGB888
+PK7.Signal=LTDC_DE
+PinOutPanel.CurrentBGAView=Top
+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=STM32H7B3LIHxQ
+ProjectManager.FirmwarePackage=STM32Cube FW_H7 V1.10.0
+ProjectManager.FreePins=false
+ProjectManager.HalAssertFull=false
+ProjectManager.HeapSize=0x200
+ProjectManager.KeepUserCode=true
+ProjectManager.LastFirmware=true
+ProjectManager.LibraryCopy=1
+ProjectManager.MainLocation=Core/Src
+ProjectManager.NoMain=false
+ProjectManager.PreviousToolchain=
+ProjectManager.ProjectBuild=false
+ProjectManager.ProjectFileName=AZRTOS.ioc
+ProjectManager.ProjectName=AZRTOS
+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_FMC_Init-FMC-false-HAL-true,4-MX_I2C4_Init-I2C4-false-HAL-true,5-MX_I2S6_Init-I2S6-false-HAL-true,6-MX_LTDC_Init-LTDC-false-HAL-true,7-MX_OCTOSPI1_Init-OCTOSPI1-false-HAL-true,8-MX_USART1_UART_Init-USART1-false-HAL-true,9-MX_CRC_Init-CRC-false-HAL-true,10-MX_DMA2D_Init-DMA2D-false-HAL-true,12-MX_TouchGFX_Init-STMicroelectronics.X-CUBE-TOUCHGFX.4.19.0-false-HAL-false,13-MX_TouchGFX_Process-STMicroelectronics.X-CUBE-TOUCHGFX.4.19.0-false-HAL-false,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true
+RCC.ADCFreq_Value=200000000
+RCC.AHB12Freq_Value=140000000
+RCC.AHB4Freq_Value=140000000
+RCC.APB1Freq_Value=70000000
+RCC.APB2Freq_Value=70000000
+RCC.APB3Freq_Value=70000000
+RCC.APB4Freq_Value=70000000
+RCC.AXIClockFreq_Value=140000000
+RCC.CDCPREFreq_Value=280000000
+RCC.CDPPRE=RCC_APB3_DIV2
+RCC.CDPPRE1=RCC_APB1_DIV2
+RCC.CDPPRE2=RCC_APB2_DIV2
+RCC.CECFreq_Value=32000
+RCC.CKPERFreq_Value=24000000
+RCC.CKPERSourceSelection=RCC_CLKPSOURCE_HSE
+RCC.CortexFreq_Value=280000000
+RCC.CpuClockFreq_Value=280000000
+RCC.DFSDM2ACLkFreq_Value=70000000
+RCC.DFSDM2Freq_Value=70000000
+RCC.DFSDMACLkFreq_Value=186666666.66666666
+RCC.DFSDMFreq_Value=70000000
+RCC.DIVM1=12
+RCC.DIVM2=12
+RCC.DIVM3=2
+RCC.DIVN1=280
+RCC.DIVN2=200
+RCC.DIVN3=11
+RCC.DIVP1Freq_Value=280000000
+RCC.DIVP2Freq_Value=200000000
+RCC.DIVP3=17
+RCC.DIVP3Freq_Value=8235351.5625
+RCC.DIVQ1=3
+RCC.DIVQ1Freq_Value=186666666.66666666
+RCC.DIVQ2Freq_Value=200000000
+RCC.DIVQ3Freq_Value=70000488.28125
+RCC.DIVR1=4
+RCC.DIVR1Freq_Value=140000000
+RCC.DIVR2=4
+RCC.DIVR2Freq_Value=100000000
+RCC.DIVR3=21
+RCC.DIVR3Freq_Value=6666713.169642857
+RCC.FDCANFreq_Value=186666666.66666666
+RCC.FMCFreq_Value=140000000
+RCC.FamilyName=M
+RCC.HCLK3ClockFreq_Value=140000000
+RCC.HCLKFreq_Value=140000000
+RCC.HPRE=RCC_HCLK_DIV2
+RCC.I2C123Freq_Value=70000000
+RCC.I2C4Freq_Value=70000000
+RCC.IPParameters=ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CDCPREFreq_Value,CDPPRE,CDPPRE1,CDPPRE2,CECFreq_Value,CKPERFreq_Value,CKPERSourceSelection,CortexFreq_Value,CpuClockFreq_Value,DFSDM2ACLkFreq_Value,DFSDM2Freq_Value,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVM2,DIVM3,DIVN1,DIVN2,DIVN3,DIVP1Freq_Value,DIVP2Freq_Value,DIVP3,DIVP3Freq_Value,DIVQ1,DIVQ1Freq_Value,DIVQ2Freq_Value,DIVQ3Freq_Value,DIVR1,DIVR1Freq_Value,DIVR2,DIVR2Freq_Value,DIVR3,DIVR3Freq_Value,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HPRE,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLL2FRACN,PLL3FRACN,PLLFRACN,PLLSourceVirtual,PWR_Regulator_Voltage_Scale,QSPICLockSelection,QSPIFreq_Value,RNGFreq_Value,RTCFreq_Value,SAI1Freq_Value,SAI2AFreq_Value,SAI2BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123CLockSelection,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SRDPPRE,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,SupplySource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value
+RCC.LPTIM1Freq_Value=70000000
+RCC.LPTIM2Freq_Value=70000000
+RCC.LPTIM345Freq_Value=70000000
+RCC.LPUART1Freq_Value=70000000
+RCC.LTDCFreq_Value=6666713.169642857
+RCC.MCO1PinFreq_Value=64000000
+RCC.MCO2PinFreq_Value=280000000
+RCC.PLL2FRACN=0
+RCC.PLL3FRACN=5462
+RCC.PLLFRACN=0
+RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
+RCC.PWR_Regulator_Voltage_Scale=PWR_REGULATOR_VOLTAGE_SCALE0
+RCC.QSPICLockSelection=RCC_OSPICLKSOURCE_PLL2
+RCC.QSPIFreq_Value=100000000
+RCC.RNGFreq_Value=48000000
+RCC.RTCFreq_Value=32000
+RCC.SAI1Freq_Value=186666666.66666666
+RCC.SAI2AFreq_Value=186666666.66666666
+RCC.SAI2BFreq_Value=186666666.66666666
+RCC.SDMMCFreq_Value=186666666.66666666
+RCC.SPDIFRXFreq_Value=186666666.66666666
+RCC.SPI123CLockSelection=RCC_SPI123CLKSOURCE_CLKP
+RCC.SPI123Freq_Value=24000000
+RCC.SPI45Freq_Value=70000000
+RCC.SPI6Freq_Value=70000000
+RCC.SRDPPRE=RCC_APB4_DIV2
+RCC.SWPMI1Freq_Value=70000000
+RCC.SYSCLKFreq_VALUE=280000000
+RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
+RCC.SupplySource=PWR_DIRECT_SMPS_SUPPLY
+RCC.Tim1OutputFreq_Value=140000000
+RCC.Tim2OutputFreq_Value=140000000
+RCC.TraceFreq_Value=64000000
+RCC.USART16Freq_Value=70000000
+RCC.USART234578Freq_Value=70000000
+RCC.USBFreq_Value=186666666.66666666
+RCC.VCO1OutputFreq_Value=560000000
+RCC.VCO2OutputFreq_Value=400000000
+RCC.VCO3OutputFreq_Value=140000976.5625
+RCC.VCOInput1Freq_Value=2000000
+RCC.VCOInput2Freq_Value=2000000
+RCC.VCOInput3Freq_Value=12000000
+SH.FMC_A0.0=FMC_A0
+SH.FMC_A0.ConfNb=1
+SH.FMC_A1.0=FMC_A1
+SH.FMC_A1.ConfNb=1
+SH.FMC_A10.0=FMC_A10
+SH.FMC_A10.ConfNb=1
+SH.FMC_A11.0=FMC_A11
+SH.FMC_A11.ConfNb=1
+SH.FMC_A14_BA0.0=FMC_BA0
+SH.FMC_A14_BA0.ConfNb=1
+SH.FMC_A15_BA1.0=FMC_BA1
+SH.FMC_A15_BA1.ConfNb=1
+SH.FMC_A2.0=FMC_A2
+SH.FMC_A2.ConfNb=1
+SH.FMC_A3.0=FMC_A3
+SH.FMC_A3.ConfNb=1
+SH.FMC_A4.0=FMC_A4
+SH.FMC_A4.ConfNb=1
+SH.FMC_A5.0=FMC_A5
+SH.FMC_A5.ConfNb=1
+SH.FMC_A6.0=FMC_A6
+SH.FMC_A6.ConfNb=1
+SH.FMC_A7.0=FMC_A7
+SH.FMC_A7.ConfNb=1
+SH.FMC_A8.0=FMC_A8
+SH.FMC_A8.ConfNb=1
+SH.FMC_A9.0=FMC_A9
+SH.FMC_A9.ConfNb=1
+SH.FMC_D0_DA0.0=FMC_D0
+SH.FMC_D0_DA0.ConfNb=1
+SH.FMC_D10_DA10.0=FMC_D10
+SH.FMC_D10_DA10.ConfNb=1
+SH.FMC_D11_DA11.0=FMC_D11
+SH.FMC_D11_DA11.ConfNb=1
+SH.FMC_D12_DA12.0=FMC_D12
+SH.FMC_D12_DA12.ConfNb=1
+SH.FMC_D13_DA13.0=FMC_D13
+SH.FMC_D13_DA13.ConfNb=1
+SH.FMC_D14_DA14.0=FMC_D14
+SH.FMC_D14_DA14.ConfNb=1
+SH.FMC_D15_DA15.0=FMC_D15
+SH.FMC_D15_DA15.ConfNb=1
+SH.FMC_D1_DA1.0=FMC_D1
+SH.FMC_D1_DA1.ConfNb=1
+SH.FMC_D2_DA2.0=FMC_D2
+SH.FMC_D2_DA2.ConfNb=1
+SH.FMC_D3_DA3.0=FMC_D3
+SH.FMC_D3_DA3.ConfNb=1
+SH.FMC_D4_DA4.0=FMC_D4
+SH.FMC_D4_DA4.ConfNb=1
+SH.FMC_D5_DA5.0=FMC_D5
+SH.FMC_D5_DA5.ConfNb=1
+SH.FMC_D6_DA6.0=FMC_D6
+SH.FMC_D6_DA6.ConfNb=1
+SH.FMC_D7_DA7.0=FMC_D7
+SH.FMC_D7_DA7.ConfNb=1
+SH.FMC_D8_DA8.0=FMC_D8
+SH.FMC_D8_DA8.ConfNb=1
+SH.FMC_D9_DA9.0=FMC_D9
+SH.FMC_D9_DA9.ConfNb=1
+SH.FMC_NBL0.0=FMC_NBL0
+SH.FMC_NBL0.ConfNb=1
+SH.FMC_NBL1.0=FMC_NBL1
+SH.FMC_NBL1.ConfNb=1
+SH.FMC_SDCLK.0=FMC_SDCLK
+SH.FMC_SDCLK.ConfNb=1
+SH.FMC_SDNCAS.0=FMC_SDNCAS
+SH.FMC_SDNCAS.ConfNb=1
+SH.FMC_SDNRAS.0=FMC_SDNRAS
+SH.FMC_SDNRAS.ConfNb=1
+SH.FMC_SDNWE.0=FMC_SDNWE
+SH.FMC_SDNWE.ConfNb=1
+SH.GPXTI13.0=GPIO_EXTI13
+SH.GPXTI13.ConfNb=1
+SH.GPXTI2.0=GPIO_EXTI2
+SH.GPXTI2.ConfNb=1
+SH.GPXTI4.0=GPIO_EXTI4
+SH.GPXTI4.ConfNb=1
+SH.GPXTI5.0=GPIO_EXTI5
+SH.GPXTI5.ConfNb=1
+SH.GPXTI8.0=GPIO_EXTI8
+SH.GPXTI8.ConfNb=1
+STMicroelectronics.X-CUBE-AZRTOS-H7.2.1.0.IPParameters=TX_APP_MEM_POOL_SIZE,ThreadXCcRTOSJjThreadXJjCore,ThreadXCcRTOSJjThreadXJjTraceXOosupport
+STMicroelectronics.X-CUBE-AZRTOS-H7.2.1.0.RTOSJjThreadX_Checked=true
+STMicroelectronics.X-CUBE-AZRTOS-H7.2.1.0.TX_APP_MEM_POOL_SIZE=4096
+STMicroelectronics.X-CUBE-AZRTOS-H7.2.1.0.ThreadXCcRTOSJjThreadXJjCore=true
+STMicroelectronics.X-CUBE-AZRTOS-H7.2.1.0.ThreadXCcRTOSJjThreadXJjTraceXOosupport=true
+STMicroelectronics.X-CUBE-AZRTOS-H7.2.1.0_IsAnAzureRtosMw=true
+STMicroelectronics.X-CUBE-AZRTOS-H7.2.1.0_SwParameter=ThreadXCcRTOSJjThreadXJjTraceXOosupport\:true;ThreadXCcRTOSJjThreadXJjCore\:true;
+STMicroelectronics.X-CUBE-TOUCHGFX.4.19.0.ApplicationCcGraphicsJjApplication=TouchGFXOoGenerator
+STMicroelectronics.X-CUBE-TOUCHGFX.4.19.0.GraphicsJjApplication_Checked=true
+STMicroelectronics.X-CUBE-TOUCHGFX.4.19.0.IPParameters=tgfx_display_interface,tgfx_buffering_strategy,tgfx_vsync,tgfx_hardware_accelerator,ApplicationCcGraphicsJjApplication
+STMicroelectronics.X-CUBE-TOUCHGFX.4.19.0.tgfx_buffering_strategy=Double
+STMicroelectronics.X-CUBE-TOUCHGFX.4.19.0.tgfx_display_interface=disp_ltdc
+STMicroelectronics.X-CUBE-TOUCHGFX.4.19.0.tgfx_hardware_accelerator=dma_2d
+STMicroelectronics.X-CUBE-TOUCHGFX.4.19.0.tgfx_vsync=vsync_ltdc
+STMicroelectronics.X-CUBE-TOUCHGFX.4.19.0_IsPackSelfContextualization=true
+STMicroelectronics.X-CUBE-TOUCHGFX.4.19.0_SwParameter=ApplicationCcGraphicsJjApplication\:TouchGFXOoGenerator;
+VP_CRC_VS_CRC.Mode=CRC_Activate
+VP_CRC_VS_CRC.Signal=CRC_VS_CRC
+VP_DMA2D_VS_DMA2D.Mode=DMA2D_Activate
+VP_DMA2D_VS_DMA2D.Signal=DMA2D_VS_DMA2D
+VP_OCTOSPI1_VS_octo.Mode=octo_mode
+VP_OCTOSPI1_VS_octo.Signal=OCTOSPI1_VS_octo
+VP_STMicroelectronics.X-CUBE-AZRTOS-H7_VS_RTOSJjThreadX_6.1.10_2.1.0.Mode=RTOSJjThreadX
+VP_STMicroelectronics.X-CUBE-AZRTOS-H7_VS_RTOSJjThreadX_6.1.10_2.1.0.Signal=STMicroelectronics.X-CUBE-AZRTOS-H7_VS_RTOSJjThreadX_6.1.10_2.1.0
+VP_STMicroelectronics.X-CUBE-TOUCHGFX_VS_GraphicsJjApplication_4.19.0.Mode=GraphicsJjApplication
+VP_STMicroelectronics.X-CUBE-TOUCHGFX_VS_GraphicsJjApplication_4.19.0.Signal=STMicroelectronics.X-CUBE-TOUCHGFX_VS_GraphicsJjApplication_4.19.0
+VP_SYS_VS_tim6.Mode=TIM6
+VP_SYS_VS_tim6.Signal=SYS_VS_tim6
+board=STM32H7B3I-DK
+boardIOC=true
+isbadioc=false
diff --git a/AZURE_RTOS/App/app_azure_rtos.c b/AZURE_RTOS/App/app_azure_rtos.c
new file mode 100644
index 0000000..4a98e48
--- /dev/null
+++ b/AZURE_RTOS/App/app_azure_rtos.c
@@ -0,0 +1,145 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_azure_rtos.c
+ * @author MCD Application Team
+ * @brief azure_rtos application implementation file
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2020-2021 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "app_azure_rtos.h"
+#include "stm32h7xx.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+#if (USE_STATIC_ALLOCATION == 1)
+/* USER CODE BEGIN TX_Pool_Buffer */
+/* USER CODE END TX_Pool_Buffer */
+#if defined ( __ICCARM__ )
+#pragma data_alignment=4
+#endif
+__ALIGN_BEGIN static UCHAR tx_byte_pool_buffer[TX_APP_MEM_POOL_SIZE] __ALIGN_END;
+static TX_BYTE_POOL tx_app_byte_pool;
+
+#endif
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/**
+ * @brief Define the initial system.
+ * @param first_unused_memory : Pointer to the first unused memory
+ * @retval None
+ */
+VOID tx_application_define(VOID *first_unused_memory)
+{
+ /* USER CODE BEGIN tx_application_define_1*/
+
+ /* USER CODE END tx_application_define_1 */
+#if (USE_STATIC_ALLOCATION == 1)
+ UINT status = TX_SUCCESS;
+ VOID *memory_ptr;
+
+ if (tx_byte_pool_create(&tx_app_byte_pool, "Tx App memory pool", tx_byte_pool_buffer, TX_APP_MEM_POOL_SIZE) != TX_SUCCESS)
+ {
+ /* USER CODE BEGIN TX_Byte_Pool_Error */
+
+ /* USER CODE END TX_Byte_Pool_Error */
+ }
+ else
+ {
+ /* USER CODE BEGIN TX_Byte_Pool_Success */
+
+ /* USER CODE END TX_Byte_Pool_Success */
+
+ memory_ptr = (VOID *)&tx_app_byte_pool;
+ status = App_ThreadX_Init(memory_ptr);
+ if (status != TX_SUCCESS)
+ {
+ /* USER CODE BEGIN App_ThreadX_Init_Error */
+ while(1)
+ {
+ }
+ /* USER CODE END App_ThreadX_Init_Error */
+ }
+
+ /* USER CODE BEGIN App_ThreadX_Init_Success */
+
+ /* USER CODE END App_ThreadX_Init_Success */
+
+ }
+
+#else
+ /*
+ * Using dynamic memory allocation requires to apply some changes to the linker file.
+ * ThreadX needs to pass a pointer to the first free memory location in RAM to the tx_application_define() function,
+ * using the "first_unused_memory" argument.
+ * This require changes in the linker files to expose this memory location.
+ * For EWARM add the following section into the .icf file:
+ place in RAM_region { last section FREE_MEM };
+ * For MDK-ARM
+ - either define the RW_IRAM1 region in the ".sct" file
+ - or modify the line below in "tx_low_level_initilize.s to match the memory region being used
+ LDR r1, =|Image$$RW_IRAM1$$ZI$$Limit|
+
+ * For STM32CubeIDE add the following section into the .ld file:
+ ._threadx_heap :
+ {
+ . = ALIGN(8);
+ __RAM_segment_used_end__ = .;
+ . = . + 64K;
+ . = ALIGN(8);
+ } >RAM_D1 AT> RAM_D1
+ * The simplest way to provide memory for ThreadX is to define a new section, see ._threadx_heap above.
+ * In the example above the ThreadX heap size is set to 64KBytes.
+ * The ._threadx_heap must be located between the .bss and the ._user_heap_stack sections in the linker script.
+ * Caution: Make sure that ThreadX does not need more than the provided heap memory (64KBytes in this example).
+ * Read more in STM32CubeIDE User Guide, chapter: "Linker script".
+
+ * The "tx_initialize_low_level.s" should be also modified to enable the "USE_DYNAMIC_MEMORY_ALLOCATION" flag.
+ */
+
+ /* USER CODE BEGIN DYNAMIC_MEM_ALLOC */
+ (void)first_unused_memory;
+ /* USER CODE END DYNAMIC_MEM_ALLOC */
+#endif
+
+}
diff --git a/AZURE_RTOS/App/app_azure_rtos.h b/AZURE_RTOS/App/app_azure_rtos.h
new file mode 100644
index 0000000..1458f9d
--- /dev/null
+++ b/AZURE_RTOS/App/app_azure_rtos.h
@@ -0,0 +1,66 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_azure_rtos.h
+ * @author MCD Application Team
+ * @brief azure_rtos application header file
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2020-2021 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_AZURE_RTOS_H
+#define APP_AZURE_RTOS_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_azure_rtos_config.h"
+
+#include "app_threadx.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 ---------------------------------------------*/
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APP_AZURE_RTOS_H */
diff --git a/AZURE_RTOS/App/app_azure_rtos_config.h b/AZURE_RTOS/App/app_azure_rtos_config.h
new file mode 100644
index 0000000..16e95ff
--- /dev/null
+++ b/AZURE_RTOS/App/app_azure_rtos_config.h
@@ -0,0 +1,70 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_azure_rtos_config.h
+ * @author MCD Application Team
+ * @brief azure_rtos config header file
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2020-2021 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef APP_AZURE_RTOS_CONFIG_H
+#define APP_AZURE_RTOS_CONFIG_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* Using static memory allocation via threadX Byte memory pools */
+
+#define USE_STATIC_ALLOCATION 1
+
+#define TX_APP_MEM_POOL_SIZE 4096
+
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* APP_AZURE_RTOS_CONFIG_H */
diff --git a/Core/Inc/RTE_Components.h b/Core/Inc/RTE_Components.h
new file mode 100644
index 0000000..e19df49
--- /dev/null
+++ b/Core/Inc/RTE_Components.h
@@ -0,0 +1,30 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file
+ * @author MCD Application Team
+ * @version V2.0.0
+ ******************************************************************************
+ * @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.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+ /* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __RTE_COMPONENTS_H__
+#define __RTE_COMPONENTS_H__
+
+/* Defines ------------------------------------------------------------------*/
+/* STMicroelectronics.X-CUBE-AZRTOS-H7.2.1.0 */
+#define THREADX_ENABLED
+/* STMicroelectronics.X-CUBE-TOUCHGFX.4.19.0 */
+#define TOUCHGFX_APP
+
+#endif /* __RTE_COMPONENTS_H__ */
diff --git a/Core/Inc/app_threadx.h b/Core/Inc/app_threadx.h
new file mode 100644
index 0000000..e58ba4d
--- /dev/null
+++ b/Core/Inc/app_threadx.h
@@ -0,0 +1,70 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_threadx.h
+ * @author MCD Application Team
+ * @brief ThreadX applicative header file
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2020-2021 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __APP_THREADX_H__
+#define __APP_THREADX_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "tx_api.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 ---------------------------------------------*/
+UINT App_ThreadX_Init(VOID *memory_ptr);
+void MX_ThreadX_Init(void);
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __APP_THREADX_H__ */
diff --git a/Core/Inc/main.h b/Core/Inc/main.h
new file mode 100644
index 0000000..2cbb85f
--- /dev/null
+++ b/Core/Inc/main.h
@@ -0,0 +1,289 @@
+/* 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) 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.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_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 WIFI_GPIO_Pin GPIO_PIN_4
+#define WIFI_GPIO_GPIO_Port GPIOI
+#define SDNCAS_Pin GPIO_PIN_15
+#define SDNCAS_GPIO_Port GPIOG
+#define LCD_B6_Pin GPIO_PIN_5
+#define LCD_B6_GPIO_Port GPIOK
+#define I2S6_SDO_Pin GPIO_PIN_14
+#define I2S6_SDO_GPIO_Port GPIOG
+#define OCSPI1_IO6_Pin GPIO_PIN_9
+#define OCSPI1_IO6_GPIO_Port GPIOG
+#define OCSPI1_IO7_Pin GPIO_PIN_7
+#define OCSPI1_IO7_GPIO_Port GPIOD
+#define D3_Pin GPIO_PIN_1
+#define D3_GPIO_Port GPIOD
+#define SDIO1_D2_Pin GPIO_PIN_10
+#define SDIO1_D2_GPIO_Port GPIOC
+#define WIFI_BOOT_Pin GPIO_PIN_3
+#define WIFI_BOOT_GPIO_Port GPIOI
+#define WIFI_DATRDY_Pin GPIO_PIN_5
+#define WIFI_DATRDY_GPIO_Port GPIOI
+#define FMC_NBL0_Pin GPIO_PIN_0
+#define FMC_NBL0_GPIO_Port GPIOE
+#define LCD_B7_Pin GPIO_PIN_6
+#define LCD_B7_GPIO_Port GPIOK
+#define LCD_B4_Pin GPIO_PIN_3
+#define LCD_B4_GPIO_Port GPIOK
+#define USER_LED1_Pin GPIO_PIN_11
+#define USER_LED1_GPIO_Port GPIOG
+#define LCD_B3_Pin GPIO_PIN_15
+#define LCD_B3_GPIO_Port GPIOJ
+#define SDIO1_CMD_Pin GPIO_PIN_2
+#define SDIO1_CMD_GPIO_Port GPIOD
+#define SDIO1_CK_Pin GPIO_PIN_12
+#define SDIO1_CK_GPIO_Port GPIOC
+#define JTCK_Pin GPIO_PIN_14
+#define JTCK_GPIO_Port GPIOA
+#define uSD_Detect_Pin GPIO_PIN_8
+#define uSD_Detect_GPIO_Port GPIOI
+#define FMC_NBL1_Pin GPIO_PIN_1
+#define FMC_NBL1_GPIO_Port GPIOE
+#define JTDO_TRACESWO_Pin GPIO_PIN_3
+#define JTDO_TRACESWO_GPIO_Port GPIOB
+#define LCD_B5_Pin GPIO_PIN_4
+#define LCD_B5_GPIO_Port GPIOK
+#define I2S6_SDI_Pin GPIO_PIN_12
+#define I2S6_SDI_GPIO_Port GPIOG
+#define LCD_B2_Pin GPIO_PIN_14
+#define LCD_B2_GPIO_Port GPIOJ
+#define D2_Pin GPIO_PIN_0
+#define D2_GPIO_Port GPIOD
+#define JTDI_Pin GPIO_PIN_15
+#define JTDI_GPIO_Port GPIOA
+#define SPI2_SCK_Pin GPIO_PIN_12
+#define SPI2_SCK_GPIO_Port GPIOA
+#define SPI2_NSS_Pin GPIO_PIN_11
+#define SPI2_NSS_GPIO_Port GPIOA
+#define LCD_DE_Pin GPIO_PIN_7
+#define LCD_DE_GPIO_Port GPIOK
+#define I2S6_CK_Pin GPIO_PIN_13
+#define I2S6_CK_GPIO_Port GPIOG
+#define LCD_B1_Pin GPIO_PIN_13
+#define LCD_B1_GPIO_Port GPIOJ
+#define SDIO1_D3_Pin GPIO_PIN_11
+#define SDIO1_D3_GPIO_Port GPIOC
+#define WIFI_WKUP_Pin GPIO_PIN_2
+#define WIFI_WKUP_GPIO_Port GPIOI
+#define LCD_B0_Pin GPIO_PIN_12
+#define LCD_B0_GPIO_Port GPIOJ
+#define WIFI_RST_Pin GPIO_PIN_1
+#define WIFI_RST_GPIO_Port GPIOI
+#define JTMS_Pin GPIO_PIN_13
+#define JTMS_GPIO_Port GPIOA
+#define VCP_RX_Pin GPIO_PIN_10
+#define VCP_RX_GPIO_Port GPIOA
+#define SDIO1_D1_Pin GPIO_PIN_9
+#define SDIO1_D1_GPIO_Port GPIOC
+#define WAKEUP_Pin GPIO_PIN_13
+#define WAKEUP_GPIO_Port GPIOC
+#define VCP_TX_Pin GPIO_PIN_9
+#define VCP_TX_GPIO_Port GPIOA
+#define SDIO1_D0_Pin GPIO_PIN_8
+#define SDIO1_D0_GPIO_Port GPIOC
+#define SDCLK_Pin GPIO_PIN_8
+#define SDCLK_GPIO_Port GPIOG
+#define A1_Pin GPIO_PIN_1
+#define A1_GPIO_Port GPIOF
+#define A0_Pin GPIO_PIN_0
+#define A0_GPIO_Port GPIOF
+#define MCO_Pin GPIO_PIN_8
+#define MCO_GPIO_Port GPIOA
+#define OCSPI1_NCS_Pin GPIO_PIN_6
+#define OCSPI1_NCS_GPIO_Port GPIOG
+#define A15_Pin GPIO_PIN_5
+#define A15_GPIO_Port GPIOG
+#define AUDIO_NRST_Pin GPIO_PIN_3
+#define AUDIO_NRST_GPIO_Port GPIOG
+#define A2_Pin GPIO_PIN_2
+#define A2_GPIO_Port GPIOF
+#define LCD_HSYNC_Pin GPIO_PIN_12
+#define LCD_HSYNC_GPIO_Port GPIOI
+#define A4_Pin GPIO_PIN_4
+#define A4_GPIO_Port GPIOF
+#define LCD_CLK_Pin GPIO_PIN_14
+#define LCD_CLK_GPIO_Port GPIOI
+#define LCD_VSYNC_Pin GPIO_PIN_13
+#define LCD_VSYNC_GPIO_Port GPIOI
+#define A14_Pin GPIO_PIN_4
+#define A14_GPIO_Port GPIOG
+#define USER_LED2_Pin GPIO_PIN_2
+#define USER_LED2_GPIO_Port GPIOG
+#define LCD_G7_Pin GPIO_PIN_2
+#define LCD_G7_GPIO_Port GPIOK
+#define LCD_G6_Pin GPIO_PIN_1
+#define LCD_G6_GPIO_Port GPIOK
+#define A3_Pin GPIO_PIN_3
+#define A3_GPIO_Port GPIOF
+#define A5_Pin GPIO_PIN_5
+#define A5_GPIO_Port GPIOF
+#define SPI2_MISO_Pin GPIO_PIN_2
+#define SPI2_MISO_GPIO_Port GPIOC
+#define LCD_G4_Pin GPIO_PIN_11
+#define LCD_G4_GPIO_Port GPIOJ
+#define LCD_G5_Pin GPIO_PIN_0
+#define LCD_G5_GPIO_Port GPIOK
+#define LCD_G3_Pin GPIO_PIN_10
+#define LCD_G3_GPIO_Port GPIOJ
+#define LCD_G2_Pin GPIO_PIN_9
+#define LCD_G2_GPIO_Port GPIOJ
+#define LCD_G1_Pin GPIO_PIN_8
+#define LCD_G1_GPIO_Port GPIOJ
+#define I2C4_SDA_Pin GPIO_PIN_13
+#define I2C4_SDA_GPIO_Port GPIOD
+#define D0_Pin GPIO_PIN_14
+#define D0_GPIO_Port GPIOD
+#define D1_Pin GPIO_PIN_15
+#define D1_GPIO_Port GPIOD
+#define LCD_R7_Pin GPIO_PIN_6
+#define LCD_R7_GPIO_Port GPIOJ
+#define LCD_G0_Pin GPIO_PIN_7
+#define LCD_G0_GPIO_Port GPIOJ
+#define D9_Pin GPIO_PIN_12
+#define D9_GPIO_Port GPIOE
+#define D13_Pin GPIO_PIN_8
+#define D13_GPIO_Port GPIOD
+#define D15_Pin GPIO_PIN_10
+#define D15_GPIO_Port GPIOD
+#define I2C4_SCL_Pin GPIO_PIN_12
+#define I2C4_SCL_GPIO_Port GPIOD
+#define OCSPI1_IO4_Pin GPIO_PIN_1
+#define OCSPI1_IO4_GPIO_Port GPIOC
+#define LCD_INT_Pin GPIO_PIN_2
+#define LCD_INT_GPIO_Port GPIOH
+#define LCD_INT_EXTI_IRQn EXTI2_IRQn
+#define LCD_R0_Pin GPIO_PIN_15
+#define LCD_R0_GPIO_Port GPIOI
+#define A7_Pin GPIO_PIN_13
+#define A7_GPIO_Port GPIOF
+#define D4_Pin GPIO_PIN_7
+#define D4_GPIO_Port GPIOE
+#define D10_Pin GPIO_PIN_13
+#define D10_GPIO_Port GPIOE
+#define SDNE1_Pin GPIO_PIN_6
+#define SDNE1_GPIO_Port GPIOH
+#define SPI2_MOSI_Pin GPIO_PIN_3
+#define SPI2_MOSI_GPIO_Port GPIOC
+#define OCSPI1_IO5_Pin GPIO_PIN_3
+#define OCSPI1_IO5_GPIO_Port GPIOH
+#define OCSPI1_DQS_Pin GPIO_PIN_5
+#define OCSPI1_DQS_GPIO_Port GPIOC
+#define LCD_R1_Pin GPIO_PIN_0
+#define LCD_R1_GPIO_Port GPIOJ
+#define SDNRAS_Pin GPIO_PIN_11
+#define SDNRAS_GPIO_Port GPIOF
+#define A9_Pin GPIO_PIN_15
+#define A9_GPIO_Port GPIOF
+#define D11_Pin GPIO_PIN_14
+#define D11_GPIO_Port GPIOE
+#define D7_Pin GPIO_PIN_10
+#define D7_GPIO_Port GPIOE
+#define LCD_R6_Pin GPIO_PIN_5
+#define LCD_R6_GPIO_Port GPIOJ
+#define D14_Pin GPIO_PIN_9
+#define D14_GPIO_Port GPIOD
+#define I2S6_WS_Pin GPIO_PIN_0
+#define I2S6_WS_GPIO_Port GPIOA
+#define LCD_BL_CTRL_Pin GPIO_PIN_1
+#define LCD_BL_CTRL_GPIO_Port GPIOA
+#define SDNWE_Pin GPIO_PIN_5
+#define SDNWE_GPIO_Port GPIOH
+#define LCD_R2_Pin GPIO_PIN_1
+#define LCD_R2_GPIO_Port GPIOJ
+#define LCD_R5_Pin GPIO_PIN_4
+#define LCD_R5_GPIO_Port GPIOJ
+#define A8_Pin GPIO_PIN_14
+#define A8_GPIO_Port GPIOF
+#define A11_Pin GPIO_PIN_1
+#define A11_GPIO_Port GPIOG
+#define D6_Pin GPIO_PIN_9
+#define D6_GPIO_Port GPIOE
+#define D12_Pin GPIO_PIN_15
+#define D12_GPIO_Port GPIOE
+#define LCD_ON_OFF_Pin GPIO_PIN_2
+#define LCD_ON_OFF_GPIO_Port GPIOA
+#define I2S6_MCK_Pin GPIO_PIN_3
+#define I2S6_MCK_GPIO_Port GPIOA
+#define OCSPI1_CLK_Pin GPIO_PIN_2
+#define OCSPI1_CLK_GPIO_Port GPIOB
+#define LCD_R3_Pin GPIO_PIN_2
+#define LCD_R3_GPIO_Port GPIOJ
+#define LCD_R4_Pin GPIO_PIN_3
+#define LCD_R4_GPIO_Port GPIOJ
+#define A6_Pin GPIO_PIN_12
+#define A6_GPIO_Port GPIOF
+#define A10_Pin GPIO_PIN_0
+#define A10_GPIO_Port GPIOG
+#define D5_Pin GPIO_PIN_8
+#define D5_GPIO_Port GPIOE
+#define D8_Pin GPIO_PIN_11
+#define D8_GPIO_Port GPIOE
+#define SDCKE1_Pin GPIO_PIN_7
+#define SDCKE1_GPIO_Port GPIOH
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
diff --git a/Core/Inc/stm32h7xx_hal_conf.h b/Core/Inc/stm32h7xx_hal_conf.h
new file mode 100644
index 0000000..fd977ce
--- /dev/null
+++ b/Core/Inc/stm32h7xx_hal_conf.h
@@ -0,0 +1,510 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32h7xx_hal_conf.h
+ * @author MCD Application Team
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2017 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef STM32H7xx_HAL_CONF_H
+#define STM32H7xx_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_FDCAN_MODULE_ENABLED */
+/* #define HAL_FMAC_MODULE_ENABLED */
+/* #define HAL_CEC_MODULE_ENABLED */
+/* #define HAL_COMP_MODULE_ENABLED */
+/* #define HAL_CORDIC_MODULE_ENABLED */
+#define HAL_CRC_MODULE_ENABLED
+/* #define HAL_CRYP_MODULE_ENABLED */
+/* #define HAL_DAC_MODULE_ENABLED */
+/* #define HAL_DCMI_MODULE_ENABLED */
+#define HAL_DMA2D_MODULE_ENABLED
+/* #define HAL_ETH_MODULE_ENABLED */
+/* #define HAL_NAND_MODULE_ENABLED */
+/* #define HAL_NOR_MODULE_ENABLED */
+/* #define HAL_OTFDEC_MODULE_ENABLED */
+/* #define HAL_SRAM_MODULE_ENABLED */
+/* #define HAL_SDRAM_MODULE_ENABLED */
+/* #define HAL_HASH_MODULE_ENABLED */
+/* #define HAL_HRTIM_MODULE_ENABLED */
+/* #define HAL_HSEM_MODULE_ENABLED */
+/* #define HAL_GFXMMU_MODULE_ENABLED */
+/* #define HAL_JPEG_MODULE_ENABLED */
+/* #define HAL_OPAMP_MODULE_ENABLED */
+/* #define HAL_OSPI_MODULE_ENABLED */
+#define HAL_OSPI_MODULE_ENABLED
+/* #define HAL_I2S_MODULE_ENABLED */
+/* #define HAL_SMBUS_MODULE_ENABLED */
+/* #define HAL_IWDG_MODULE_ENABLED */
+/* #define HAL_LPTIM_MODULE_ENABLED */
+#define HAL_LTDC_MODULE_ENABLED
+/* #define HAL_QSPI_MODULE_ENABLED */
+/* #define HAL_RAMECC_MODULE_ENABLED */
+/* #define HAL_RNG_MODULE_ENABLED */
+/* #define HAL_RTC_MODULE_ENABLED */
+/* #define HAL_SAI_MODULE_ENABLED */
+/* #define HAL_SD_MODULE_ENABLED */
+/* #define HAL_MMC_MODULE_ENABLED */
+/* #define HAL_SPDIFRX_MODULE_ENABLED */
+/* #define HAL_SPI_MODULE_ENABLED */
+/* #define HAL_SWPMI_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_WWDG_MODULE_ENABLED */
+/* #define HAL_PCD_MODULE_ENABLED */
+/* #define HAL_HCD_MODULE_ENABLED */
+/* #define HAL_DFSDM_MODULE_ENABLED */
+/* #define HAL_DSI_MODULE_ENABLED */
+/* #define HAL_JPEG_MODULE_ENABLED */
+/* #define HAL_MDIOS_MODULE_ENABLED */
+/* #define HAL_PSSI_MODULE_ENABLED */
+/* #define HAL_DTS_MODULE_ENABLED */
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_MDMA_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_I2C_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+#define HAL_HSEM_MODULE_ENABLED
+
+/* ########################## Oscillator Values adaptation ####################*/
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+#define HSE_VALUE (24000000UL) /*!< Value of the External oscillator in Hz : FPGA case fixed to 60MHZ */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal oscillator (CSI) default value.
+ * This value is the default CSI value after Reset.
+ */
+#if !defined (CSI_VALUE)
+ #define CSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* CSI_VALUE */
+
+/**
+ * @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 (64000000UL) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ * This value is used by the UART, RTC HAL module to compute the system frequency
+ */
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE (32768UL) /*!< Value of the External oscillator in Hz*/
+#endif /* LSE_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+ #define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */
+#endif /* LSE_STARTUP_TIMEOUT */
+
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/
+#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+
+/**
+ * @brief External clock source for I2S peripheral
+ * This value is used by the I2S HAL module to compute the I2S clock source
+ * frequency, this source is inserted directly through I2S_CKIN pad.
+ */
+#if !defined (EXTERNAL_CLOCK_VALUE)
+ #define EXTERNAL_CLOCK_VALUE 12288000UL /*!< Value of the External clock 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 (3300UL) /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority */
+#define USE_RTOS 0
+#define USE_SD_TRANSCEIVER 0U /*!< use uSD Transceiver */
+#define USE_SPI_CRC 0U /*!< use CRC in SPI */
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */
+#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0U /* COMP register callback disabled */
+#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U /* CORDIC register callback disabled */
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */
+#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */
+#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */
+#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */
+#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */
+#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */
+#define USE_HAL_DTS_REGISTER_CALLBACKS 0U /* DTS register callback disabled */
+#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */
+#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U /* FDCAN register callback disabled */
+#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U /* FMAC 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_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */
+#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */
+#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */
+#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */
+#define USE_HAL_GFXMMU_REGISTER_CALLBACKS 0U /* GFXMMU 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_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */
+#define USE_HAL_JPEG_REGISTER_CALLBACKS 0U /* JPEG register callback disabled */
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */
+#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */
+#define USE_HAL_MDIOS_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */
+#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */
+#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */
+#define USE_HAL_OSPI_REGISTER_CALLBACKS 0U /* OSPI register callback disabled */
+#define USE_HAL_OTFDEC_REGISTER_CALLBACKS 0U /* OTFDEC register callback disabled */
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */
+#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */
+#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */
+#define USE_HAL_SWPMI_REGISTER_CALLBACKS 0U /* SWPMI register callback disabled */
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */
+#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */
+#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */
+
+/* ########################### Ethernet Configuration ######################### */
+#define ETH_TX_DESC_CNT 4 /* number of Ethernet Tx DMA descriptors */
+#define ETH_RX_DESC_CNT 4 /* number of Ethernet Rx DMA descriptors */
+
+#define ETH_MAC_ADDR0 (0x02UL)
+#define ETH_MAC_ADDR1 (0x00UL)
+#define ETH_MAC_ADDR2 (0x00UL)
+#define ETH_MAC_ADDR3 (0x00UL)
+#define ETH_MAC_ADDR4 (0x00UL)
+#define ETH_MAC_ADDR5 (0x00UL)
+
+/* ########################## 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 "stm32h7xx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32h7xx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32h7xx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_MDMA_MODULE_ENABLED
+ #include "stm32h7xx_hal_mdma.h"
+#endif /* HAL_MDMA_MODULE_ENABLED */
+
+#ifdef HAL_HASH_MODULE_ENABLED
+ #include "stm32h7xx_hal_hash.h"
+#endif /* HAL_HASH_MODULE_ENABLED */
+
+#ifdef HAL_DCMI_MODULE_ENABLED
+ #include "stm32h7xx_hal_dcmi.h"
+#endif /* HAL_DCMI_MODULE_ENABLED */
+
+#ifdef HAL_DMA2D_MODULE_ENABLED
+ #include "stm32h7xx_hal_dma2d.h"
+#endif /* HAL_DMA2D_MODULE_ENABLED */
+
+#ifdef HAL_DSI_MODULE_ENABLED
+ #include "stm32h7xx_hal_dsi.h"
+#endif /* HAL_DSI_MODULE_ENABLED */
+
+#ifdef HAL_DFSDM_MODULE_ENABLED
+ #include "stm32h7xx_hal_dfsdm.h"
+#endif /* HAL_DFSDM_MODULE_ENABLED */
+
+#ifdef HAL_DTS_MODULE_ENABLED
+ #include "stm32h7xx_hal_dts.h"
+#endif /* HAL_DTS_MODULE_ENABLED */
+
+#ifdef HAL_ETH_MODULE_ENABLED
+ #include "stm32h7xx_hal_eth.h"
+#endif /* HAL_ETH_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32h7xx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32h7xx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32h7xx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_FDCAN_MODULE_ENABLED
+ #include "stm32h7xx_hal_fdcan.h"
+#endif /* HAL_FDCAN_MODULE_ENABLED */
+
+#ifdef HAL_CEC_MODULE_ENABLED
+ #include "stm32h7xx_hal_cec.h"
+#endif /* HAL_CEC_MODULE_ENABLED */
+
+#ifdef HAL_COMP_MODULE_ENABLED
+ #include "stm32h7xx_hal_comp.h"
+#endif /* HAL_COMP_MODULE_ENABLED */
+
+#ifdef HAL_CORDIC_MODULE_ENABLED
+ #include "stm32h7xx_hal_cordic.h"
+#endif /* HAL_CORDIC_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32h7xx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32h7xx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_DAC_MODULE_ENABLED
+ #include "stm32h7xx_hal_dac.h"
+#endif /* HAL_DAC_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32h7xx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_GFXMMU_MODULE_ENABLED
+ #include "stm32h7xx_hal_gfxmmu.h"
+#endif /* HAL_GFXMMU_MODULE_ENABLED */
+
+#ifdef HAL_FMAC_MODULE_ENABLED
+ #include "stm32h7xx_hal_fmac.h"
+#endif /* HAL_FMAC_MODULE_ENABLED */
+
+#ifdef HAL_HRTIM_MODULE_ENABLED
+ #include "stm32h7xx_hal_hrtim.h"
+#endif /* HAL_HRTIM_MODULE_ENABLED */
+
+#ifdef HAL_HSEM_MODULE_ENABLED
+ #include "stm32h7xx_hal_hsem.h"
+#endif /* HAL_HSEM_MODULE_ENABLED */
+
+#ifdef HAL_SRAM_MODULE_ENABLED
+ #include "stm32h7xx_hal_sram.h"
+#endif /* HAL_SRAM_MODULE_ENABLED */
+
+#ifdef HAL_NOR_MODULE_ENABLED
+ #include "stm32h7xx_hal_nor.h"
+#endif /* HAL_NOR_MODULE_ENABLED */
+
+#ifdef HAL_NAND_MODULE_ENABLED
+ #include "stm32h7xx_hal_nand.h"
+#endif /* HAL_NAND_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32h7xx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_I2S_MODULE_ENABLED
+ #include "stm32h7xx_hal_i2s.h"
+#endif /* HAL_I2S_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32h7xx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_JPEG_MODULE_ENABLED
+ #include "stm32h7xx_hal_jpeg.h"
+#endif /* HAL_JPEG_MODULE_ENABLED */
+
+#ifdef HAL_MDIOS_MODULE_ENABLED
+ #include "stm32h7xx_hal_mdios.h"
+#endif /* HAL_MDIOS_MODULE_ENABLED */
+
+#ifdef HAL_MMC_MODULE_ENABLED
+ #include "stm32h7xx_hal_mmc.h"
+#endif /* HAL_MMC_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+#include "stm32h7xx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_LTDC_MODULE_ENABLED
+#include "stm32h7xx_hal_ltdc.h"
+#endif /* HAL_LTDC_MODULE_ENABLED */
+
+#ifdef HAL_OPAMP_MODULE_ENABLED
+#include "stm32h7xx_hal_opamp.h"
+#endif /* HAL_OPAMP_MODULE_ENABLED */
+
+#ifdef HAL_OSPI_MODULE_ENABLED
+ #include "stm32h7xx_hal_ospi.h"
+#endif /* HAL_OSPI_MODULE_ENABLED */
+
+#ifdef HAL_OTFDEC_MODULE_ENABLED
+#include "stm32h7xx_hal_otfdec.h"
+#endif /* HAL_OTFDEC_MODULE_ENABLED */
+
+#ifdef HAL_PSSI_MODULE_ENABLED
+ #include "stm32h7xx_hal_pssi.h"
+#endif /* HAL_PSSI_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32h7xx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32h7xx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_RAMECC_MODULE_ENABLED
+ #include "stm32h7xx_hal_ramecc.h"
+#endif /* HAL_RAMECC_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32h7xx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32h7xx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32h7xx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SD_MODULE_ENABLED
+ #include "stm32h7xx_hal_sd.h"
+#endif /* HAL_SD_MODULE_ENABLED */
+
+#ifdef HAL_SDRAM_MODULE_ENABLED
+ #include "stm32h7xx_hal_sdram.h"
+#endif /* HAL_SDRAM_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32h7xx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_SPDIFRX_MODULE_ENABLED
+ #include "stm32h7xx_hal_spdifrx.h"
+#endif /* HAL_SPDIFRX_MODULE_ENABLED */
+
+#ifdef HAL_SWPMI_MODULE_ENABLED
+ #include "stm32h7xx_hal_swpmi.h"
+#endif /* HAL_SWPMI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32h7xx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32h7xx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32h7xx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32h7xx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32h7xx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32h7xx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32h7xx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32h7xx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_HCD_MODULE_ENABLED
+ #include "stm32h7xx_hal_hcd.h"
+#endif /* HAL_HCD_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 /* STM32H7xx_HAL_CONF_H */
diff --git a/Core/Inc/stm32h7xx_it.h b/Core/Inc/stm32h7xx_it.h
new file mode 100644
index 0000000..9ec986a
--- /dev/null
+++ b/Core/Inc/stm32h7xx_it.h
@@ -0,0 +1,67 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32h7xx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ ******************************************************************************
+ * @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.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32H7xx_IT_H
+#define __STM32H7xx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void DebugMon_Handler(void);
+void EXTI2_IRQHandler(void);
+void TIM6_DAC_IRQHandler(void);
+void LTDC_IRQHandler(void);
+void DMA2D_IRQHandler(void);
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32H7xx_IT_H */
diff --git a/Core/Inc/tx_user.h b/Core/Inc/tx_user.h
new file mode 100644
index 0000000..982ad02
--- /dev/null
+++ b/Core/Inc/tx_user.h
@@ -0,0 +1,272 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) Microsoft Corporation. All rights reserved. */
+/* */
+/* This software is licensed under the Microsoft Software License */
+/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+/* and in the root directory of this software. */
+/* */
+/**************************************************************************/
+
+/**************************************************************************/
+/**************************************************************************/
+/** */
+/** ThreadX Component */
+/** */
+/** User Specific */
+/** */
+/**************************************************************************/
+/**************************************************************************/
+
+/**************************************************************************/
+/* */
+/* PORT SPECIFIC C INFORMATION RELEASE */
+/* */
+/* tx_user.h PORTABLE C */
+/* 6.1.9 */
+/* */
+/* AUTHOR */
+/* */
+/* William E. Lamie, Microsoft Corporation */
+/* */
+/* DESCRIPTION */
+/* */
+/* This file contains user defines for configuring ThreadX in specific */
+/* ways. This file will have an effect only if the application and */
+/* ThreadX library are built with TX_INCLUDE_USER_DEFINE_FILE defined. */
+/* Note that all the defines in this file may also be made on the */
+/* command line when building ThreadX library and application objects. */
+/* */
+/* RELEASE HISTORY */
+/* */
+/* DATE NAME DESCRIPTION */
+/* */
+/* 05-19-2020 William E. Lamie Initial Version 6.0 */
+/* 09-30-2020 Yuxin Zhou Modified comment(s), */
+/* resulting in version 6.1 */
+/* 03-02-2021 Scott Larson Modified comment(s), */
+/* added option to remove */
+/* FileX pointer, */
+/* resulting in version 6.1.5 */
+/* 06-02-2021 Scott Larson Added options for multiple */
+/* block pool search & delay, */
+/* resulting in version 6.1.7 */
+/* 10-15-2021 Yuxin Zhou Modified comment(s), added */
+/* user-configurable symbol */
+/* TX_TIMER_TICKS_PER_SECOND */
+/* resulting in version 6.1.9 */
+/* */
+/**************************************************************************/
+
+#ifndef TX_USER_H
+#define TX_USER_H
+
+/* Define various build options for the ThreadX port. The application should either make changes
+ here by commenting or un-commenting the conditional compilation defined OR supply the defines
+ though the compiler's equivalent of the -D option.
+
+ For maximum speed, the following should be defined:
+
+ TX_MAX_PRIORITIES 32
+ TX_DISABLE_PREEMPTION_THRESHOLD
+ TX_DISABLE_REDUNDANT_CLEARING
+ TX_DISABLE_NOTIFY_CALLBACKS
+ TX_NOT_INTERRUPTABLE
+ TX_TIMER_PROCESS_IN_ISR
+ TX_REACTIVATE_INLINE
+ TX_DISABLE_STACK_FILLING
+ TX_INLINE_THREAD_RESUME_SUSPEND
+
+ For minimum size, the following should be defined:
+
+ TX_MAX_PRIORITIES 32
+ TX_DISABLE_PREEMPTION_THRESHOLD
+ TX_DISABLE_REDUNDANT_CLEARING
+ TX_DISABLE_NOTIFY_CALLBACKS
+ TX_NO_FILEX_POINTER
+ TX_NOT_INTERRUPTABLE
+ TX_TIMER_PROCESS_IN_ISR
+
+ Of course, many of these defines reduce functionality and/or change the behavior of the
+ system in ways that may not be worth the trade-off. For example, the TX_TIMER_PROCESS_IN_ISR
+ results in faster and smaller code, however, it increases the amount of processing in the ISR.
+ In addition, some services that are available in timers are not available from ISRs and will
+ therefore return an error if this option is used. This may or may not be desirable for a
+ given application. */
+
+/* Override various options with default values already assigned in tx_port.h. Please also refer
+ to tx_port.h for descriptions on each of these options. */
+
+/*#define TX_MAX_PRIORITIES 32*/
+/*#define TX_THREAD_USER_EXTENSION ????*/
+/*#define TX_TIMER_THREAD_STACK_SIZE 1024*/
+/*#define TX_TIMER_THREAD_PRIORITY 0*/
+
+/*#define TX_MINIMUM_STACK 200*/
+
+/* Determine if timer expirations (application timers, timeouts, and tx_thread_sleep calls
+ should be processed within the a system timer thread or directly in the timer ISR.
+ By default, the timer thread is used. When the following is defined, the timer expiration
+ processing is done directly from the timer ISR, thereby eliminating the timer thread control
+ block, stack, and context switching to activate it. */
+
+/*#define TX_TIMER_PROCESS_IN_ISR*/
+
+/* Determine if in-line timer reactivation should be used within the timer expiration processing.
+ By default, this is disabled and a function call is used. When the following is defined,
+ reactivating is performed in-line resulting in faster timer processing but slightly larger
+ code size. */
+
+/*#define TX_REACTIVATE_INLINE*/
+
+/* Determine is stack filling is enabled. By default, ThreadX stack filling is enabled,
+ which places an 0xEF pattern in each byte of each thread's stack. This is used by
+ debuggers with ThreadX-awareness and by the ThreadX run-time stack checking feature. */
+
+/*#define TX_DISABLE_STACK_FILLING*/
+
+/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is
+ disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack
+ checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING
+ define is negated, thereby forcing the stack fill which is necessary for the stack checking
+ logic. */
+
+/*#define TX_ENABLE_STACK_CHECKING*/
+
+/* Determine if preemption-threshold should be disabled. By default, preemption-threshold is
+ enabled. If the application does not use preemption-threshold, it may be disabled to reduce
+ code size and improve performance. */
+
+#define TX_DISABLE_PREEMPTION_THRESHOLD
+
+/* Determine if global ThreadX variables should be cleared. If the compiler startup code clears
+ the .bss section prior to ThreadX running, the define can be used to eliminate unnecessary
+ clearing of ThreadX global variables. */
+
+/*#define TX_DISABLE_REDUNDANT_CLEARING*/
+
+/* Determine if no timer processing is required. This option will help eliminate the timer
+ processing when not needed. The user will also have to comment out the call to
+ tx_timer_interrupt, which is typically made from assembly language in
+ tx_initialize_low_level. Note: if TX_NO_TIMER is used, the define TX_TIMER_PROCESS_IN_ISR
+ must also be used. */
+
+/*
+#define TX_NO_TIMER
+#ifndef TX_TIMER_PROCESS_IN_ISR
+#define TX_TIMER_PROCESS_IN_ISR
+#endif
+*/
+
+/* Determine if the notify callback option should be disabled. By default, notify callbacks are
+ enabled. If the application does not use notify callbacks, they may be disabled to reduce
+ code size and improve performance. */
+
+#define TX_DISABLE_NOTIFY_CALLBACKS
+
+/* Determine if the tx_thread_resume and tx_thread_suspend services should have their internal
+ code in-line. This results in a larger image, but improves the performance of the thread
+ resume and suspend services. */
+
+/*#define TX_INLINE_THREAD_RESUME_SUSPEND*/
+
+/* Determine if the internal ThreadX code is non-interruptable. This results in smaller code
+ size and less processing overhead, but increases the interrupt lockout time. */
+
+/*#define TX_NOT_INTERRUPTABLE*/
+
+/* Determine if the trace event logging code should be enabled. This causes slight increases in
+ code size and overhead, but provides the ability to generate system trace information which
+ is available for viewing in TraceX. */
+
+/*#define TX_ENABLE_EVENT_TRACE*/
+
+/* Determine if block pool performance gathering is required by the application. When the following is
+ defined, ThreadX gathers various block pool performance information. */
+
+/*#define TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO*/
+
+/* Determine if byte pool performance gathering is required by the application. When the following is
+ defined, ThreadX gathers various byte pool performance information. */
+
+/*#define TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO*/
+
+/* Determine if event flags performance gathering is required by the application. When the following is
+ defined, ThreadX gathers various event flags performance information. */
+
+/*#define TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO*/
+
+/* Determine if mutex performance gathering is required by the application. When the following is
+ defined, ThreadX gathers various mutex performance information. */
+
+/*#define TX_MUTEX_ENABLE_PERFORMANCE_INFO*/
+
+/* Determine if queue performance gathering is required by the application. When the following is
+ defined, ThreadX gathers various queue performance information. */
+
+/*#define TX_QUEUE_ENABLE_PERFORMANCE_INFO*/
+
+/* Determine if semaphore performance gathering is required by the application. When the following is
+ defined, ThreadX gathers various semaphore performance information. */
+
+/*#define TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO*/
+
+/* Determine if thread performance gathering is required by the application. When the following is
+ defined, ThreadX gathers various thread performance information. */
+
+/*#define TX_THREAD_ENABLE_PERFORMANCE_INFO*/
+
+/* Determine if timer performance gathering is required by the application. When the following is
+ defined, ThreadX gathers various timer performance information. */
+
+/*#define TX_TIMER_ENABLE_PERFORMANCE_INFO*/
+
+/* Define if the execution change notify is enabled. */
+
+/*#define TX_ENABLE_EXECUTION_CHANGE_NOTIFY*/
+
+/* Define the get system state macro. */
+
+/*#define TX_THREAD_GET_SYSTEM_STATE() _tx_thread_system_state */
+
+/* Define the check for whether or not to call the
+ _tx_thread_system_return function (TX_THREAD_SYSTEM_RETURN_CHECK(c)). */
+
+/*#define TX_THREAD_SYSTEM_RETURN_CHECK (c) ((ULONG) _tx_thread_preempt_disable)*/
+
+/* Define the common timer tick reference for use by other middleware components. */
+
+/*#define TX_TIMER_TICKS_PER_SECOND 100*/
+
+/* Determine if there is a FileX pointer in the thread control block.
+ By default, the pointer is there for legacy/backwards compatibility.
+ The pointer must also be there for applications using FileX.
+ Define this to save space in the thread control block.
+*/
+
+/*#define TX_NO_FILEX_POINTER*/
+
+/* Determinate if the basic alignment type is defined. */
+
+/*#define ALIGN_TYPE_DEFINED*/
+
+/* Define basic alignment type used in block and byte pool operations. */
+
+/*#define ALIGN_TYPE ULONG*/
+
+/* Define the TX_MEMSET macro to the standard library function. */
+
+/*#define TX_MEMSET memset((a),(b),(c))*/
+
+#ifdef __ICCARM__
+/* Define if the IAR library is supported. */
+/*#define TX_ENABLE_IAR_LIBRARY_SUPPORT*/
+#endif
+
+/* Define if the safety critical configuration is enabled. */
+
+/*#define TX_SAFETY_CRITICAL*/
+
+#endif
+
diff --git a/Core/Src/app_threadx.c b/Core/Src/app_threadx.c
new file mode 100644
index 0000000..b60f433
--- /dev/null
+++ b/Core/Src/app_threadx.c
@@ -0,0 +1,95 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file app_threadx.c
+ * @author MCD Application Team
+ * @brief ThreadX applicative file
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2020-2021 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_threadx.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+#include "app_touchgfx.h"
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/**
+ * @brief Application ThreadX Initialization.
+ * @param memory_ptr: memory pointer
+ * @retval int
+ */
+UINT App_ThreadX_Init(VOID *memory_ptr)
+{
+ UINT ret = TX_SUCCESS;
+ TX_BYTE_POOL *byte_pool = (TX_BYTE_POOL*)memory_ptr;
+
+ /* USER CODE BEGIN App_ThreadX_MEM_POOL */
+ (void)byte_pool;
+ /* USER CODE END App_ThreadX_MEM_POOL */
+
+ /* USER CODE BEGIN App_ThreadX_Init */
+ MX_TouchGFX_Init(memory_ptr);
+ /* USER CODE END App_ThreadX_Init */
+
+ return ret;
+}
+
+ /**
+ * @brief MX_ThreadX_Init
+ * @param None
+ * @retval None
+ */
+void MX_ThreadX_Init(void)
+{
+ /* USER CODE BEGIN Before_Kernel_Start */
+
+ /* USER CODE END Before_Kernel_Start */
+
+ tx_kernel_enter();
+
+ /* USER CODE BEGIN Kernel_Start_Error */
+
+ /* USER CODE END Kernel_Start_Error */
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
diff --git a/Core/Src/main.c b/Core/Src/main.c
new file mode 100644
index 0000000..7caf96b
--- /dev/null
+++ b/Core/Src/main.c
@@ -0,0 +1,691 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ ******************************************************************************
+ * @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.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "app_threadx.h"
+#include "app_touchgfx.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+
+CRC_HandleTypeDef hcrc;
+
+DMA2D_HandleTypeDef hdma2d;
+
+I2C_HandleTypeDef hi2c4;
+
+LTDC_HandleTypeDef hltdc;
+
+OSPI_HandleTypeDef hospi1;
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_I2C4_Init(void);
+static void MX_LTDC_Init(void);
+static void MX_OCTOSPI1_Init(void);
+static void MX_CRC_Init(void);
+static void MX_DMA2D_Init(void);
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* USER CODE BEGIN 1 */
+
+ /* USER CODE END 1 */
+
+ /* MCU Configuration--------------------------------------------------------*/
+
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ /* USER CODE BEGIN Init */
+
+ /* USER CODE END Init */
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ /* USER CODE BEGIN SysInit */
+
+ /* USER CODE END SysInit */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_I2C4_Init();
+ MX_LTDC_Init();
+ MX_OCTOSPI1_Init();
+ MX_CRC_Init();
+ MX_DMA2D_Init();
+ /* Call PreOsInit function */
+ MX_TouchGFX_PreOSInit();
+ /* USER CODE BEGIN 2 */
+
+ /* USER CODE END 2 */
+
+ MX_ThreadX_Init();
+
+ /* We should never get here as control is now taken by the scheduler */
+ /* Infinite loop */
+ /* USER CODE BEGIN WHILE */
+ while (1)
+ {
+ /* USER CODE END WHILE */
+
+ /* USER CODE BEGIN 3 */
+ }
+ /* USER CODE END 3 */
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+
+ /*AXI clock gating */
+ RCC->CKGAENR = 0xFFFFFFFF;
+
+ /** Supply configuration update enable
+ */
+ HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);
+
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
+
+ while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
+
+ /** Macro to configure the PLL clock source
+ */
+ __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);
+
+ /** 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_DIV1;
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ RCC_OscInitStruct.PLL.PLLM = 12;
+ RCC_OscInitStruct.PLL.PLLN = 280;
+ RCC_OscInitStruct.PLL.PLLP = 2;
+ RCC_OscInitStruct.PLL.PLLQ = 3;
+ RCC_OscInitStruct.PLL.PLLR = 4;
+ RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_1;
+ RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
+ RCC_OscInitStruct.PLL.PLLFRACN = 0;
+ 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_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
+ RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
+ RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1);
+}
+
+/**
+ * @brief CRC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_CRC_Init(void)
+{
+
+ /* USER CODE BEGIN CRC_Init 0 */
+
+ /* USER CODE END CRC_Init 0 */
+
+ /* USER CODE BEGIN CRC_Init 1 */
+
+ /* USER CODE END CRC_Init 1 */
+ hcrc.Instance = CRC;
+ hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;
+ hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
+ hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
+ hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
+ hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
+ if (HAL_CRC_Init(&hcrc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN CRC_Init 2 */
+
+ /* USER CODE END CRC_Init 2 */
+
+}
+
+/**
+ * @brief DMA2D Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_DMA2D_Init(void)
+{
+
+ /* USER CODE BEGIN DMA2D_Init 0 */
+
+ /* USER CODE END DMA2D_Init 0 */
+
+ /* USER CODE BEGIN DMA2D_Init 1 */
+
+ /* USER CODE END DMA2D_Init 1 */
+ hdma2d.Instance = DMA2D;
+ hdma2d.Init.Mode = DMA2D_M2M;
+ hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565;
+ hdma2d.Init.OutputOffset = 0;
+ hdma2d.LayerCfg[1].InputOffset = 0;
+ hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB565;
+ hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
+ hdma2d.LayerCfg[1].InputAlpha = 0;
+ hdma2d.LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA;
+ hdma2d.LayerCfg[1].RedBlueSwap = DMA2D_RB_REGULAR;
+ hdma2d.LayerCfg[1].ChromaSubSampling = DMA2D_NO_CSS;
+ if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN DMA2D_Init 2 */
+
+ /* USER CODE END DMA2D_Init 2 */
+
+}
+
+/**
+ * @brief I2C4 Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_I2C4_Init(void)
+{
+
+ /* USER CODE BEGIN I2C4_Init 0 */
+
+ /* USER CODE END I2C4_Init 0 */
+
+ /* USER CODE BEGIN I2C4_Init 1 */
+
+ /* USER CODE END I2C4_Init 1 */
+ hi2c4.Instance = I2C4;
+ hi2c4.Init.Timing = 0xC010151E;
+ hi2c4.Init.OwnAddress1 = 0;
+ hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
+ hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
+ hi2c4.Init.OwnAddress2 = 0;
+ hi2c4.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
+ hi2c4.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
+ hi2c4.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
+ if (HAL_I2C_Init(&hi2c4) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /** Configure Analogue filter
+ */
+ if (HAL_I2CEx_ConfigAnalogFilter(&hi2c4, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /** Configure Digital filter
+ */
+ if (HAL_I2CEx_ConfigDigitalFilter(&hi2c4, 0) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN I2C4_Init 2 */
+
+ /* USER CODE END I2C4_Init 2 */
+
+}
+
+/**
+ * @brief LTDC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_LTDC_Init(void)
+{
+
+ /* USER CODE BEGIN LTDC_Init 0 */
+
+ /* USER CODE END LTDC_Init 0 */
+
+ LTDC_LayerCfgTypeDef pLayerCfg = {0};
+
+ /* USER CODE BEGIN LTDC_Init 1 */
+
+ /* USER CODE END LTDC_Init 1 */
+ hltdc.Instance = LTDC;
+ hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
+ hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
+ hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
+ hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
+ hltdc.Init.HorizontalSync = 40;
+ hltdc.Init.VerticalSync = 9;
+ hltdc.Init.AccumulatedHBP = 42;
+ hltdc.Init.AccumulatedVBP = 11;
+ hltdc.Init.AccumulatedActiveW = 522;
+ hltdc.Init.AccumulatedActiveH = 283;
+ hltdc.Init.TotalWidth = 554;
+ hltdc.Init.TotalHeigh = 285;
+ hltdc.Init.Backcolor.Blue = 0;
+ hltdc.Init.Backcolor.Green = 0;
+ hltdc.Init.Backcolor.Red = 0;
+ if (HAL_LTDC_Init(&hltdc) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ pLayerCfg.WindowX0 = 0;
+ pLayerCfg.WindowX1 = 480;
+ pLayerCfg.WindowY0 = 0;
+ pLayerCfg.WindowY1 = 272;
+ pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB888;
+ pLayerCfg.Alpha = 255;
+ pLayerCfg.Alpha0 = 0;
+ pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
+ pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
+ pLayerCfg.FBStartAdress = 0;
+ pLayerCfg.ImageWidth = 480;
+ pLayerCfg.ImageHeight = 272;
+ pLayerCfg.Backcolor.Blue = 255;
+ pLayerCfg.Backcolor.Green = 0;
+ pLayerCfg.Backcolor.Red = 0;
+ if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN LTDC_Init 2 */
+
+ /* USER CODE END LTDC_Init 2 */
+
+}
+
+/**
+ * @brief OCTOSPI1 Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_OCTOSPI1_Init(void)
+{
+
+ /* USER CODE BEGIN OCTOSPI1_Init 0 */
+
+ /* USER CODE END OCTOSPI1_Init 0 */
+
+ OSPIM_CfgTypeDef sOspiManagerCfg = {0};
+
+ /* USER CODE BEGIN OCTOSPI1_Init 1 */
+
+ /* USER CODE END OCTOSPI1_Init 1 */
+ /* OCTOSPI1 parameter configuration*/
+ hospi1.Instance = OCTOSPI1;
+ hospi1.Init.FifoThreshold = 1;
+ hospi1.Init.DualQuad = HAL_OSPI_DUALQUAD_DISABLE;
+ hospi1.Init.MemoryType = HAL_OSPI_MEMTYPE_MACRONIX;
+ hospi1.Init.DeviceSize = 32;
+ hospi1.Init.ChipSelectHighTime = 1;
+ hospi1.Init.FreeRunningClock = HAL_OSPI_FREERUNCLK_DISABLE;
+ hospi1.Init.ClockMode = HAL_OSPI_CLOCK_MODE_0;
+ hospi1.Init.WrapSize = HAL_OSPI_WRAP_NOT_SUPPORTED;
+ hospi1.Init.ClockPrescaler = 1;
+ hospi1.Init.SampleShifting = HAL_OSPI_SAMPLE_SHIFTING_NONE;
+ hospi1.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_DISABLE;
+ hospi1.Init.ChipSelectBoundary = 0;
+ hospi1.Init.DelayBlockBypass = HAL_OSPI_DELAY_BLOCK_BYPASSED;
+ hospi1.Init.MaxTran = 0;
+ hospi1.Init.Refresh = 0;
+ if (HAL_OSPI_Init(&hospi1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ sOspiManagerCfg.ClkPort = 1;
+ sOspiManagerCfg.DQSPort = 1;
+ sOspiManagerCfg.NCSPort = 1;
+ sOspiManagerCfg.IOLowPort = HAL_OSPIM_IOPORT_1_HIGH;
+ if (HAL_OSPIM_Config(&hospi1, &sOspiManagerCfg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN OCTOSPI1_Init 2 */
+
+ /* USER CODE END OCTOSPI1_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_GPIOI_CLK_ENABLE();
+ __HAL_RCC_GPIOG_CLK_ENABLE();
+ __HAL_RCC_GPIOK_CLK_ENABLE();
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOE_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ __HAL_RCC_GPIOJ_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ __HAL_RCC_GPIOF_CLK_ENABLE();
+ __HAL_RCC_GPIOH_CLK_ENABLE();
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOI, WIFI_BOOT_Pin|WIFI_WKUP_Pin|WIFI_RST_Pin, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOG, USER_LED1_Pin|USER_LED2_Pin, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(SPI2_NSS_GPIO_Port, SPI2_NSS_Pin, GPIO_PIN_RESET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(AUDIO_NRST_GPIO_Port, AUDIO_NRST_Pin, GPIO_PIN_SET);
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOA, LCD_BL_CTRL_Pin|LCD_ON_OFF_Pin, GPIO_PIN_SET);
+
+ /*Configure GPIO pins : WIFI_GPIO_Pin WIFI_DATRDY_Pin */
+ GPIO_InitStruct.Pin = WIFI_GPIO_Pin|WIFI_DATRDY_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : SDNCAS_Pin SDCLK_Pin A15_Pin A14_Pin
+ A11_Pin A10_Pin */
+ GPIO_InitStruct.Pin = SDNCAS_Pin|SDCLK_Pin|A15_Pin|A14_Pin
+ |A11_Pin|A10_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : I2S6_SDO_Pin I2S6_SDI_Pin I2S6_CK_Pin */
+ GPIO_InitStruct.Pin = I2S6_SDO_Pin|I2S6_SDI_Pin|I2S6_CK_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF5_SPI6;
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : D3_Pin D2_Pin D0_Pin D1_Pin
+ D13_Pin D15_Pin D14_Pin */
+ GPIO_InitStruct.Pin = D3_Pin|D2_Pin|D0_Pin|D1_Pin
+ |D13_Pin|D15_Pin|D14_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : SDIO1_D2_Pin SDIO1_CK_Pin SDIO1_D3_Pin SDIO1_D1_Pin
+ SDIO1_D0_Pin */
+ GPIO_InitStruct.Pin = SDIO1_D2_Pin|SDIO1_CK_Pin|SDIO1_D3_Pin|SDIO1_D1_Pin
+ |SDIO1_D0_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : WIFI_BOOT_Pin WIFI_WKUP_Pin WIFI_RST_Pin */
+ GPIO_InitStruct.Pin = WIFI_BOOT_Pin|WIFI_WKUP_Pin|WIFI_RST_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : FMC_NBL0_Pin FMC_NBL1_Pin D9_Pin D4_Pin
+ D10_Pin D11_Pin D7_Pin D6_Pin
+ D12_Pin D5_Pin D8_Pin */
+ GPIO_InitStruct.Pin = FMC_NBL0_Pin|FMC_NBL1_Pin|D9_Pin|D4_Pin
+ |D10_Pin|D11_Pin|D7_Pin|D6_Pin
+ |D12_Pin|D5_Pin|D8_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+ HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : USER_LED1_Pin AUDIO_NRST_Pin USER_LED2_Pin */
+ GPIO_InitStruct.Pin = USER_LED1_Pin|AUDIO_NRST_Pin|USER_LED2_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : SDIO1_CMD_Pin */
+ GPIO_InitStruct.Pin = SDIO1_CMD_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
+ HAL_GPIO_Init(SDIO1_CMD_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : uSD_Detect_Pin */
+ GPIO_InitStruct.Pin = uSD_Detect_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ HAL_GPIO_Init(uSD_Detect_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : SPI2_SCK_Pin */
+ GPIO_InitStruct.Pin = SPI2_SCK_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
+ HAL_GPIO_Init(SPI2_SCK_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : SPI2_NSS_Pin LCD_BL_CTRL_Pin LCD_ON_OFF_Pin */
+ GPIO_InitStruct.Pin = SPI2_NSS_Pin|LCD_BL_CTRL_Pin|LCD_ON_OFF_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 : VCP_RX_Pin VCP_TX_Pin */
+ GPIO_InitStruct.Pin = VCP_RX_Pin|VCP_TX_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : WAKEUP_Pin */
+ GPIO_InitStruct.Pin = WAKEUP_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(WAKEUP_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : A1_Pin A0_Pin A2_Pin A4_Pin
+ A3_Pin A5_Pin A7_Pin SDNRAS_Pin
+ A9_Pin A8_Pin A6_Pin */
+ GPIO_InitStruct.Pin = A1_Pin|A0_Pin|A2_Pin|A4_Pin
+ |A3_Pin|A5_Pin|A7_Pin|SDNRAS_Pin
+ |A9_Pin|A8_Pin|A6_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+ HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : MCO_Pin */
+ GPIO_InitStruct.Pin = MCO_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
+ HAL_GPIO_Init(MCO_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : SPI2_MISO_Pin SPI2_MOSI_Pin */
+ GPIO_InitStruct.Pin = SPI2_MISO_Pin|SPI2_MOSI_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ /*Configure GPIO pin : LCD_INT_Pin */
+ GPIO_InitStruct.Pin = LCD_INT_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ HAL_GPIO_Init(LCD_INT_GPIO_Port, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : SDNE1_Pin SDNWE_Pin SDCKE1_Pin */
+ GPIO_InitStruct.Pin = SDNE1_Pin|SDNWE_Pin|SDCKE1_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+ HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
+
+ /*Configure GPIO pins : I2S6_WS_Pin I2S6_MCK_Pin */
+ GPIO_InitStruct.Pin = I2S6_WS_Pin|I2S6_MCK_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF5_SPI6;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* EXTI interrupt init*/
+ HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(EXTI2_IRQn);
+
+}
+
+/* USER CODE BEGIN 4 */
+
+/* USER CODE END 4 */
+
+/**
+ * @brief Period elapsed callback in non blocking mode
+ * @note This function is called when TIM6 interrupt took place, inside
+ * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
+ * a global variable "uwTick" used as application time base.
+ * @param htim : TIM handle
+ * @retval None
+ */
+void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
+{
+ /* USER CODE BEGIN Callback 0 */
+
+ /* USER CODE END Callback 0 */
+ if (htim->Instance == TIM6) {
+ HAL_IncTick();
+ }
+ /* USER CODE BEGIN Callback 1 */
+
+ /* USER CODE END Callback 1 */
+}
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ /* USER CODE BEGIN Error_Handler_Debug */
+ /* User can add his own implementation to report the HAL error return state */
+ __disable_irq();
+ while (1)
+ {
+ }
+ /* USER CODE END Error_Handler_Debug */
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
diff --git a/Core/Src/stm32h7xx_hal_msp.c b/Core/Src/stm32h7xx_hal_msp.c
new file mode 100644
index 0000000..734053c
--- /dev/null
+++ b/Core/Src/stm32h7xx_hal_msp.c
@@ -0,0 +1,562 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32h7xx_hal_msp.c
+ * @brief This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @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.
+ *
+ ******************************************************************************
+ */
+/* 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();
+
+ /* System interrupt init*/
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief CRC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hcrc: CRC handle pointer
+* @retval None
+*/
+void HAL_CRC_MspInit(CRC_HandleTypeDef* hcrc)
+{
+ if(hcrc->Instance==CRC)
+ {
+ /* USER CODE BEGIN CRC_MspInit 0 */
+
+ /* USER CODE END CRC_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_CRC_CLK_ENABLE();
+ /* USER CODE BEGIN CRC_MspInit 1 */
+
+ /* USER CODE END CRC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief CRC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hcrc: CRC handle pointer
+* @retval None
+*/
+void HAL_CRC_MspDeInit(CRC_HandleTypeDef* hcrc)
+{
+ if(hcrc->Instance==CRC)
+ {
+ /* USER CODE BEGIN CRC_MspDeInit 0 */
+
+ /* USER CODE END CRC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_CRC_CLK_DISABLE();
+ /* USER CODE BEGIN CRC_MspDeInit 1 */
+
+ /* USER CODE END CRC_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief DMA2D MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hdma2d: DMA2D handle pointer
+* @retval None
+*/
+void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef* hdma2d)
+{
+ if(hdma2d->Instance==DMA2D)
+ {
+ /* USER CODE BEGIN DMA2D_MspInit 0 */
+
+ /* USER CODE END DMA2D_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_DMA2D_CLK_ENABLE();
+ /* DMA2D interrupt Init */
+ HAL_NVIC_SetPriority(DMA2D_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(DMA2D_IRQn);
+ /* USER CODE BEGIN DMA2D_MspInit 1 */
+
+ /* USER CODE END DMA2D_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief DMA2D MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hdma2d: DMA2D handle pointer
+* @retval None
+*/
+void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef* hdma2d)
+{
+ if(hdma2d->Instance==DMA2D)
+ {
+ /* USER CODE BEGIN DMA2D_MspDeInit 0 */
+
+ /* USER CODE END DMA2D_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_DMA2D_CLK_DISABLE();
+
+ /* DMA2D interrupt DeInit */
+ HAL_NVIC_DisableIRQ(DMA2D_IRQn);
+ /* USER CODE BEGIN DMA2D_MspDeInit 1 */
+
+ /* USER CODE END DMA2D_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};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+ if(hi2c->Instance==I2C4)
+ {
+ /* USER CODE BEGIN I2C4_MspInit 0 */
+
+ /* USER CODE END I2C4_MspInit 0 */
+
+ /** Initializes the peripherals clock
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2C4;
+ PeriphClkInitStruct.I2c4ClockSelection = RCC_I2C4CLKSOURCE_D3PCLK1;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+ /**I2C4 GPIO Configuration
+ PD13 ------> I2C4_SDA
+ PD12 ------> I2C4_SCL
+ */
+ GPIO_InitStruct.Pin = I2C4_SDA_Pin|I2C4_SCL_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
+ GPIO_InitStruct.Pull = GPIO_PULLUP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF4_I2C4;
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
+ /* Peripheral clock enable */
+ __HAL_RCC_I2C4_CLK_ENABLE();
+ /* USER CODE BEGIN I2C4_MspInit 1 */
+
+ /* USER CODE END I2C4_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==I2C4)
+ {
+ /* USER CODE BEGIN I2C4_MspDeInit 0 */
+
+ /* USER CODE END I2C4_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_I2C4_CLK_DISABLE();
+
+ /**I2C4 GPIO Configuration
+ PD13 ------> I2C4_SDA
+ PD12 ------> I2C4_SCL
+ */
+ HAL_GPIO_DeInit(I2C4_SDA_GPIO_Port, I2C4_SDA_Pin);
+
+ HAL_GPIO_DeInit(I2C4_SCL_GPIO_Port, I2C4_SCL_Pin);
+
+ /* USER CODE BEGIN I2C4_MspDeInit 1 */
+
+ /* USER CODE END I2C4_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief LTDC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hltdc: LTDC handle pointer
+* @retval None
+*/
+void HAL_LTDC_MspInit(LTDC_HandleTypeDef* hltdc)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+ if(hltdc->Instance==LTDC)
+ {
+ /* USER CODE BEGIN LTDC_MspInit 0 */
+
+ /* USER CODE END LTDC_MspInit 0 */
+
+ /** Initializes the peripherals clock
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
+ PeriphClkInitStruct.PLL3.PLL3M = 2;
+ PeriphClkInitStruct.PLL3.PLL3N = 11;
+ PeriphClkInitStruct.PLL3.PLL3P = 17;
+ PeriphClkInitStruct.PLL3.PLL3Q = 2;
+ PeriphClkInitStruct.PLL3.PLL3R = 21;
+ PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_3;
+ PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
+ PeriphClkInitStruct.PLL3.PLL3FRACN = 5462.0;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /* Peripheral clock enable */
+ __HAL_RCC_LTDC_CLK_ENABLE();
+
+ __HAL_RCC_GPIOK_CLK_ENABLE();
+ __HAL_RCC_GPIOJ_CLK_ENABLE();
+ __HAL_RCC_GPIOI_CLK_ENABLE();
+ /**LTDC GPIO Configuration
+ PK5 ------> LTDC_B6
+ PK6 ------> LTDC_B7
+ PK3 ------> LTDC_B4
+ PJ15 ------> LTDC_B3
+ PK4 ------> LTDC_B5
+ PJ14 ------> LTDC_B2
+ PK7 ------> LTDC_DE
+ PJ13 ------> LTDC_B1
+ PJ12 ------> LTDC_B0
+ PI12 ------> LTDC_HSYNC
+ PI14 ------> LTDC_CLK
+ PI13 ------> LTDC_VSYNC
+ PK2 ------> LTDC_G7
+ PK1 ------> LTDC_G6
+ PJ11 ------> LTDC_G4
+ PK0 ------> LTDC_G5
+ PJ10 ------> LTDC_G3
+ PJ9 ------> LTDC_G2
+ PJ8 ------> LTDC_G1
+ PJ6 ------> LTDC_R7
+ PJ7 ------> LTDC_G0
+ PI15 ------> LTDC_R0
+ PJ0 ------> LTDC_R1
+ PJ5 ------> LTDC_R6
+ PJ1 ------> LTDC_R2
+ PJ4 ------> LTDC_R5
+ PJ2 ------> LTDC_R3
+ PJ3 ------> LTDC_R4
+ */
+ GPIO_InitStruct.Pin = LCD_B6_Pin|LCD_B7_Pin|LCD_B4_Pin|LCD_B5_Pin
+ |LCD_DE_Pin|LCD_G7_Pin|LCD_G6_Pin|LCD_G5_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+ HAL_GPIO_Init(GPIOK, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = LCD_B3_Pin|LCD_B2_Pin|LCD_B1_Pin|LCD_B0_Pin
+ |LCD_G4_Pin|LCD_G3_Pin|LCD_G2_Pin|LCD_G1_Pin
+ |LCD_R7_Pin|LCD_G0_Pin|LCD_R1_Pin|LCD_R6_Pin
+ |LCD_R2_Pin|LCD_R5_Pin|LCD_R3_Pin|LCD_R4_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+ HAL_GPIO_Init(GPIOJ, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = LCD_HSYNC_Pin|LCD_CLK_Pin|LCD_VSYNC_Pin|LCD_R0_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
+ HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
+
+ /* LTDC interrupt Init */
+ HAL_NVIC_SetPriority(LTDC_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(LTDC_IRQn);
+ /* USER CODE BEGIN LTDC_MspInit 1 */
+
+ /* USER CODE END LTDC_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief LTDC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hltdc: LTDC handle pointer
+* @retval None
+*/
+void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* hltdc)
+{
+ if(hltdc->Instance==LTDC)
+ {
+ /* USER CODE BEGIN LTDC_MspDeInit 0 */
+
+ /* USER CODE END LTDC_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_LTDC_CLK_DISABLE();
+
+ /**LTDC GPIO Configuration
+ PK5 ------> LTDC_B6
+ PK6 ------> LTDC_B7
+ PK3 ------> LTDC_B4
+ PJ15 ------> LTDC_B3
+ PK4 ------> LTDC_B5
+ PJ14 ------> LTDC_B2
+ PK7 ------> LTDC_DE
+ PJ13 ------> LTDC_B1
+ PJ12 ------> LTDC_B0
+ PI12 ------> LTDC_HSYNC
+ PI14 ------> LTDC_CLK
+ PI13 ------> LTDC_VSYNC
+ PK2 ------> LTDC_G7
+ PK1 ------> LTDC_G6
+ PJ11 ------> LTDC_G4
+ PK0 ------> LTDC_G5
+ PJ10 ------> LTDC_G3
+ PJ9 ------> LTDC_G2
+ PJ8 ------> LTDC_G1
+ PJ6 ------> LTDC_R7
+ PJ7 ------> LTDC_G0
+ PI15 ------> LTDC_R0
+ PJ0 ------> LTDC_R1
+ PJ5 ------> LTDC_R6
+ PJ1 ------> LTDC_R2
+ PJ4 ------> LTDC_R5
+ PJ2 ------> LTDC_R3
+ PJ3 ------> LTDC_R4
+ */
+ HAL_GPIO_DeInit(GPIOK, LCD_B6_Pin|LCD_B7_Pin|LCD_B4_Pin|LCD_B5_Pin
+ |LCD_DE_Pin|LCD_G7_Pin|LCD_G6_Pin|LCD_G5_Pin);
+
+ HAL_GPIO_DeInit(GPIOJ, LCD_B3_Pin|LCD_B2_Pin|LCD_B1_Pin|LCD_B0_Pin
+ |LCD_G4_Pin|LCD_G3_Pin|LCD_G2_Pin|LCD_G1_Pin
+ |LCD_R7_Pin|LCD_G0_Pin|LCD_R1_Pin|LCD_R6_Pin
+ |LCD_R2_Pin|LCD_R5_Pin|LCD_R3_Pin|LCD_R4_Pin);
+
+ HAL_GPIO_DeInit(GPIOI, LCD_HSYNC_Pin|LCD_CLK_Pin|LCD_VSYNC_Pin|LCD_R0_Pin);
+
+ /* LTDC interrupt DeInit */
+ HAL_NVIC_DisableIRQ(LTDC_IRQn);
+ /* USER CODE BEGIN LTDC_MspDeInit 1 */
+
+ /* USER CODE END LTDC_MspDeInit 1 */
+ }
+
+}
+
+/**
+* @brief OSPI MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hospi: OSPI handle pointer
+* @retval None
+*/
+void HAL_OSPI_MspInit(OSPI_HandleTypeDef* hospi)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+ if(hospi->Instance==OCTOSPI1)
+ {
+ /* USER CODE BEGIN OCTOSPI1_MspInit 0 */
+
+ /* USER CODE END OCTOSPI1_MspInit 0 */
+
+ /** Initializes the peripherals clock
+ */
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_OSPI;
+ PeriphClkInitStruct.PLL2.PLL2M = 12;
+ PeriphClkInitStruct.PLL2.PLL2N = 200;
+ PeriphClkInitStruct.PLL2.PLL2P = 2;
+ PeriphClkInitStruct.PLL2.PLL2Q = 2;
+ PeriphClkInitStruct.PLL2.PLL2R = 4;
+ PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
+ PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
+ PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
+ PeriphClkInitStruct.OspiClockSelection = RCC_OSPICLKSOURCE_PLL2;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /* Peripheral clock enable */
+ __HAL_RCC_OCTOSPIM_CLK_ENABLE();
+ __HAL_RCC_OSPI1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOG_CLK_ENABLE();
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOH_CLK_ENABLE();
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ /**OCTOSPI1 GPIO Configuration
+ PG9 ------> OCTOSPIM_P1_IO6
+ PD7 ------> OCTOSPIM_P1_IO7
+ PG6 ------> OCTOSPIM_P1_NCS
+ PC1 ------> OCTOSPIM_P1_IO4
+ PH3 ------> OCTOSPIM_P1_IO5
+ PC5 ------> OCTOSPIM_P1_DQS
+ PB2 ------> OCTOSPIM_P1_CLK
+ */
+ GPIO_InitStruct.Pin = OCSPI1_IO6_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF9_OCTOSPIM_P1;
+ HAL_GPIO_Init(OCSPI1_IO6_GPIO_Port, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = OCSPI1_IO7_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF10_OCTOSPIM_P1;
+ HAL_GPIO_Init(OCSPI1_IO7_GPIO_Port, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = OCSPI1_NCS_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF10_OCTOSPIM_P1;
+ HAL_GPIO_Init(OCSPI1_NCS_GPIO_Port, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = OCSPI1_IO4_Pin|OCSPI1_DQS_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF10_OCTOSPIM_P1;
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = OCSPI1_IO5_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF9_OCTOSPIM_P1;
+ HAL_GPIO_Init(OCSPI1_IO5_GPIO_Port, &GPIO_InitStruct);
+
+ GPIO_InitStruct.Pin = OCSPI1_CLK_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF9_OCTOSPIM_P1;
+ HAL_GPIO_Init(OCSPI1_CLK_GPIO_Port, &GPIO_InitStruct);
+
+ /* USER CODE BEGIN OCTOSPI1_MspInit 1 */
+
+ /* USER CODE END OCTOSPI1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief OSPI MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hospi: OSPI handle pointer
+* @retval None
+*/
+void HAL_OSPI_MspDeInit(OSPI_HandleTypeDef* hospi)
+{
+ if(hospi->Instance==OCTOSPI1)
+ {
+ /* USER CODE BEGIN OCTOSPI1_MspDeInit 0 */
+
+ /* USER CODE END OCTOSPI1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_OCTOSPIM_CLK_DISABLE();
+ __HAL_RCC_OSPI1_CLK_DISABLE();
+
+ /**OCTOSPI1 GPIO Configuration
+ PG9 ------> OCTOSPIM_P1_IO6
+ PD7 ------> OCTOSPIM_P1_IO7
+ PG6 ------> OCTOSPIM_P1_NCS
+ PC1 ------> OCTOSPIM_P1_IO4
+ PH3 ------> OCTOSPIM_P1_IO5
+ PC5 ------> OCTOSPIM_P1_DQS
+ PB2 ------> OCTOSPIM_P1_CLK
+ */
+ HAL_GPIO_DeInit(GPIOG, OCSPI1_IO6_Pin|OCSPI1_NCS_Pin);
+
+ HAL_GPIO_DeInit(OCSPI1_IO7_GPIO_Port, OCSPI1_IO7_Pin);
+
+ HAL_GPIO_DeInit(GPIOC, OCSPI1_IO4_Pin|OCSPI1_DQS_Pin);
+
+ HAL_GPIO_DeInit(OCSPI1_IO5_GPIO_Port, OCSPI1_IO5_Pin);
+
+ HAL_GPIO_DeInit(OCSPI1_CLK_GPIO_Port, OCSPI1_CLK_Pin);
+
+ /* USER CODE BEGIN OCTOSPI1_MspDeInit 1 */
+
+ /* USER CODE END OCTOSPI1_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
diff --git a/Core/Src/stm32h7xx_hal_timebase_tim.c b/Core/Src/stm32h7xx_hal_timebase_tim.c
new file mode 100644
index 0000000..e669c09
--- /dev/null
+++ b/Core/Src/stm32h7xx_hal_timebase_tim.c
@@ -0,0 +1,130 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32h7xx_hal_timebase_TIM.c
+ * @brief HAL time base based on the hardware TIM.
+ ******************************************************************************
+ * @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.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal.h"
+#include "stm32h7xx_hal_tim.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+TIM_HandleTypeDef htim6;
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/**
+ * @brief This function configures the TIM6 as a time base source.
+ * 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 configured, by HAL_RCC_ClockConfig().
+ * @param TickPriority: Tick interrupt priority.
+ * @retval HAL status
+ */
+HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
+{
+ RCC_ClkInitTypeDef clkconfig;
+ uint32_t uwTimclock, uwAPB1Prescaler;
+
+ uint32_t uwPrescalerValue;
+ uint32_t pFLatency;
+/*Configure the TIM6 IRQ priority */
+ if (TickPriority < (1UL << __NVIC_PRIO_BITS))
+ {
+ HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority ,0U);
+
+ /* Enable the TIM6 global Interrupt */
+ HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
+ uwTickPrio = TickPriority;
+ }
+ else
+ {
+ return HAL_ERROR;
+ }
+
+ /* Enable TIM6 clock */
+ __HAL_RCC_TIM6_CLK_ENABLE();
+
+ /* Get clock configuration */
+ HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
+
+ /* Get APB1 prescaler */
+ uwAPB1Prescaler = clkconfig.APB1CLKDivider;
+ /* Compute TIM6 clock */
+ if (uwAPB1Prescaler == RCC_HCLK_DIV1)
+ {
+ uwTimclock = HAL_RCC_GetPCLK1Freq();
+ }
+ else
+ {
+ uwTimclock = 2UL * HAL_RCC_GetPCLK1Freq();
+ }
+
+ /* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */
+ uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);
+
+ /* Initialize TIM6 */
+ htim6.Instance = TIM6;
+
+ /* Initialize TIMx peripheral as follow:
+ + Period = [(TIM6CLK/1000) - 1]. to have a (1/1000) s time base.
+ + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
+ + ClockDivision = 0
+ + Counter direction = Up
+ */
+ htim6.Init.Period = (1000000U / 1000U) - 1U;
+ htim6.Init.Prescaler = uwPrescalerValue;
+ htim6.Init.ClockDivision = 0;
+ htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
+
+ if(HAL_TIM_Base_Init(&htim6) == HAL_OK)
+ {
+ /* Start the TIM time Base generation in interrupt mode */
+ return HAL_TIM_Base_Start_IT(&htim6);
+ }
+
+ /* Return function status */
+ return HAL_ERROR;
+}
+
+/**
+ * @brief Suspend Tick increment.
+ * @note Disable the tick increment by disabling TIM6 update interrupt.
+ * @param None
+ * @retval None
+ */
+void HAL_SuspendTick(void)
+{
+ /* Disable TIM6 update Interrupt */
+ __HAL_TIM_DISABLE_IT(&htim6, TIM_IT_UPDATE);
+}
+
+/**
+ * @brief Resume Tick increment.
+ * @note Enable the tick increment by Enabling TIM6 update interrupt.
+ * @param None
+ * @retval None
+ */
+void HAL_ResumeTick(void)
+{
+ /* Enable TIM6 Update interrupt */
+ __HAL_TIM_ENABLE_IT(&htim6, TIM_IT_UPDATE);
+}
+
diff --git a/Core/Src/stm32h7xx_it.c b/Core/Src/stm32h7xx_it.c
new file mode 100644
index 0000000..f62171f
--- /dev/null
+++ b/Core/Src/stm32h7xx_it.c
@@ -0,0 +1,222 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32h7xx_it.c
+ * @brief Interrupt Service Routines.
+ ******************************************************************************
+ * @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.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32h7xx_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 DMA2D_HandleTypeDef hdma2d;
+extern LTDC_HandleTypeDef hltdc;
+extern TIM_HandleTypeDef htim6;
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+ while (1)
+ {
+ }
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Pre-fetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32H7xx 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_stm32h7xx.s). */
+/******************************************************************************/
+
+/**
+ * @brief This function handles EXTI line2 interrupt.
+ */
+void EXTI2_IRQHandler(void)
+{
+ /* USER CODE BEGIN EXTI2_IRQn 0 */
+
+ /* USER CODE END EXTI2_IRQn 0 */
+ HAL_GPIO_EXTI_IRQHandler(LCD_INT_Pin);
+ /* USER CODE BEGIN EXTI2_IRQn 1 */
+
+ /* USER CODE END EXTI2_IRQn 1 */
+}
+
+/**
+ * @brief This function handles TIM6 global interrupt, DAC1_CH1 and DAC1_CH2 underrun error interrupts.
+ */
+void TIM6_DAC_IRQHandler(void)
+{
+ /* USER CODE BEGIN TIM6_DAC_IRQn 0 */
+
+ /* USER CODE END TIM6_DAC_IRQn 0 */
+ HAL_TIM_IRQHandler(&htim6);
+ /* USER CODE BEGIN TIM6_DAC_IRQn 1 */
+
+ /* USER CODE END TIM6_DAC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles LTDC global interrupt.
+ */
+void LTDC_IRQHandler(void)
+{
+ /* USER CODE BEGIN LTDC_IRQn 0 */
+
+ /* USER CODE END LTDC_IRQn 0 */
+ HAL_LTDC_IRQHandler(&hltdc);
+ /* USER CODE BEGIN LTDC_IRQn 1 */
+
+ /* USER CODE END LTDC_IRQn 1 */
+}
+
+/**
+ * @brief This function handles DMA2D global interrupt.
+ */
+void DMA2D_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA2D_IRQn 0 */
+
+ /* USER CODE END DMA2D_IRQn 0 */
+ HAL_DMA2D_IRQHandler(&hdma2d);
+ /* USER CODE BEGIN DMA2D_IRQn 1 */
+
+ /* USER CODE END DMA2D_IRQn 1 */
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
diff --git a/Core/Src/syscalls.c b/Core/Src/syscalls.c
new file mode 100644
index 0000000..fadb992
--- /dev/null
+++ b/Core/Src/syscalls.c
@@ -0,0 +1,155 @@
+/**
+ ******************************************************************************
+ * @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) 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)
+{
+ 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)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ *ptr++ = __io_getchar();
+ }
+
+return len;
+}
+
+__attribute__((weak)) int _write(int file, char *ptr, int len)
+{
+ int DataIdx;
+
+ for (DataIdx = 0; DataIdx < len; DataIdx++)
+ {
+ __io_putchar(*ptr++);
+ }
+ return len;
+}
+
+int _close(int file)
+{
+ return -1;
+}
+
+
+int _fstat(int file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _isatty(int file)
+{
+ return 1;
+}
+
+int _lseek(int file, int ptr, int dir)
+{
+ return 0;
+}
+
+int _open(char *path, int flags, ...)
+{
+ /* Pretend like we always fail */
+ return -1;
+}
+
+int _wait(int *status)
+{
+ errno = ECHILD;
+ return -1;
+}
+
+int _unlink(char *name)
+{
+ errno = ENOENT;
+ return -1;
+}
+
+int _times(struct tms *buf)
+{
+ return -1;
+}
+
+int _stat(char *file, struct stat *st)
+{
+ st->st_mode = S_IFCHR;
+ return 0;
+}
+
+int _link(char *old, char *new)
+{
+ errno = EMLINK;
+ return -1;
+}
+
+int _fork(void)
+{
+ errno = EAGAIN;
+ return -1;
+}
+
+int _execve(char *name, char **argv, char **env)
+{
+ errno = ENOMEM;
+ return -1;
+}
diff --git a/Core/Src/sysmem.c b/Core/Src/sysmem.c
new file mode 100644
index 0000000..54081ac
--- /dev/null
+++ b/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/Core/Src/system_stm32h7xx.c b/Core/Src/system_stm32h7xx.c
new file mode 100644
index 0000000..c99a7b1
--- /dev/null
+++ b/Core/Src/system_stm32h7xx.c
@@ -0,0 +1,450 @@
+/**
+ ******************************************************************************
+ * @file system_stm32h7xx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex-Mx Device Peripheral Access Layer System Source File.
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32h7xx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock, it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2017 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32h7xx_system
+ * @{
+ */
+
+/** @addtogroup STM32H7xx_System_Private_Includes
+ * @{
+ */
+
+#include "stm32h7xx.h"
+#include
+
+#if !defined (HSE_VALUE)
+#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (CSI_VALUE)
+ #define CSI_VALUE ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* CSI_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE ((uint32_t)64000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32H7xx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32H7xx_System_Private_Defines
+ * @{
+ */
+
+/************************* Miscellaneous Configuration ************************/
+/*!< Uncomment the following line if you need to use initialized data in D2 domain SRAM (AHB SRAM) */
+/* #define DATA_IN_D2_SRAM */
+
+/* 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 BANK1 or AXI 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)
+#if defined(DUAL_CORE) && defined(CORE_CM4)
+/*!< Uncomment the following line if you need to relocate your vector Table
+ in D2 AXI SRAM else user remap will be done in FLASH BANK2. */
+/* #define VECT_TAB_SRAM */
+#if defined(VECT_TAB_SRAM)
+#define VECT_TAB_BASE_ADDRESS D2_AXISRAM_BASE /*!< Vector Table base address field.
+ This value must be a multiple of 0x300. */
+#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x300. */
+#else
+#define VECT_TAB_BASE_ADDRESS FLASH_BANK2_BASE /*!< Vector Table base address field.
+ This value must be a multiple of 0x300. */
+#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x300. */
+#endif /* VECT_TAB_SRAM */
+#else
+/*!< Uncomment the following line if you need to relocate your vector Table
+ in D1 AXI SRAM else user remap will be done in FLASH BANK1. */
+/* #define VECT_TAB_SRAM */
+#if defined(VECT_TAB_SRAM)
+#define VECT_TAB_BASE_ADDRESS D1_AXISRAM_BASE /*!< Vector Table base address field.
+ This value must be a multiple of 0x300. */
+#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x300. */
+#else
+#define VECT_TAB_BASE_ADDRESS FLASH_BANK1_BASE /*!< Vector Table base address field.
+ This value must be a multiple of 0x300. */
+#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x300. */
+#endif /* VECT_TAB_SRAM */
+#endif /* DUAL_CORE && CORE_CM4 */
+#endif /* USER_VECT_TAB_ADDRESS */
+/******************************************************************************/
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32H7xx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32H7xx_System_Private_Variables
+ * @{
+ */
+ /* This variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+ uint32_t SystemCoreClock = 64000000;
+ uint32_t SystemD2Clock = 64000000;
+ const uint8_t D1CorePrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32H7xx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32H7xx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system
+ * Initialize the FPU setting and vector table location
+ * configuration.
+ * @param None
+ * @retval None
+ */
+void SystemInit (void)
+{
+#if defined (DATA_IN_D2_SRAM)
+ __IO uint32_t tmpreg;
+#endif /* DATA_IN_D2_SRAM */
+
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2))); /* set CP10 and CP11 Full Access */
+ #endif
+ /* Reset the RCC clock configuration to the default reset state ------------*/
+
+ /* Increasing the CPU frequency */
+ if(FLASH_LATENCY_DEFAULT > (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)))
+ {
+ /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
+ MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_DEFAULT));
+ }
+
+ /* Set HSION bit */
+ RCC->CR |= RCC_CR_HSION;
+
+ /* Reset CFGR register */
+ RCC->CFGR = 0x00000000;
+
+ /* Reset HSEON, HSECSSON, CSION, HSI48ON, CSIKERON, PLL1ON, PLL2ON and PLL3ON bits */
+ RCC->CR &= 0xEAF6ED7FU;
+
+ /* Decreasing the number of wait states because of lower CPU frequency */
+ if(FLASH_LATENCY_DEFAULT < (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)))
+ {
+ /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */
+ MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (uint32_t)(FLASH_LATENCY_DEFAULT));
+ }
+
+#if defined(D3_SRAM_BASE)
+ /* Reset D1CFGR register */
+ RCC->D1CFGR = 0x00000000;
+
+ /* Reset D2CFGR register */
+ RCC->D2CFGR = 0x00000000;
+
+ /* Reset D3CFGR register */
+ RCC->D3CFGR = 0x00000000;
+#else
+ /* Reset CDCFGR1 register */
+ RCC->CDCFGR1 = 0x00000000;
+
+ /* Reset CDCFGR2 register */
+ RCC->CDCFGR2 = 0x00000000;
+
+ /* Reset SRDCFGR register */
+ RCC->SRDCFGR = 0x00000000;
+#endif
+ /* Reset PLLCKSELR register */
+ RCC->PLLCKSELR = 0x02020200;
+
+ /* Reset PLLCFGR register */
+ RCC->PLLCFGR = 0x01FF0000;
+ /* Reset PLL1DIVR register */
+ RCC->PLL1DIVR = 0x01010280;
+ /* Reset PLL1FRACR register */
+ RCC->PLL1FRACR = 0x00000000;
+
+ /* Reset PLL2DIVR register */
+ RCC->PLL2DIVR = 0x01010280;
+
+ /* Reset PLL2FRACR register */
+
+ RCC->PLL2FRACR = 0x00000000;
+ /* Reset PLL3DIVR register */
+ RCC->PLL3DIVR = 0x01010280;
+
+ /* Reset PLL3FRACR register */
+ RCC->PLL3FRACR = 0x00000000;
+
+ /* Reset HSEBYP bit */
+ RCC->CR &= 0xFFFBFFFFU;
+
+ /* Disable all interrupts */
+ RCC->CIER = 0x00000000;
+
+#if (STM32H7_DEV_ID == 0x450UL)
+ /* dual core CM7 or single core line */
+ if((DBGMCU->IDCODE & 0xFFFF0000U) < 0x20000000U)
+ {
+ /* if stm32h7 revY*/
+ /* Change the switch matrix read issuing capability to 1 for the AXI SRAM target (Target 7) */
+ *((__IO uint32_t*)0x51008108) = 0x000000001U;
+ }
+#endif /* STM32H7_DEV_ID */
+
+#if defined(DATA_IN_D2_SRAM)
+ /* in case of initialized data in D2 SRAM (AHB SRAM), enable the D2 SRAM clock (AHB SRAM clock) */
+#if defined(RCC_AHB2ENR_D2SRAM3EN)
+ RCC->AHB2ENR |= (RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN | RCC_AHB2ENR_D2SRAM3EN);
+#elif defined(RCC_AHB2ENR_D2SRAM2EN)
+ RCC->AHB2ENR |= (RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN);
+#else
+ RCC->AHB2ENR |= (RCC_AHB2ENR_AHBSRAM1EN | RCC_AHB2ENR_AHBSRAM2EN);
+#endif /* RCC_AHB2ENR_D2SRAM3EN */
+
+ tmpreg = RCC->AHB2ENR;
+ (void) tmpreg;
+#endif /* DATA_IN_D2_SRAM */
+
+#if defined(DUAL_CORE) && defined(CORE_CM4)
+ /* Configure the Vector Table location add offset address for cortex-M4 ------------------*/
+#if defined(USER_VECT_TAB_ADDRESS)
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal D2 AXI-RAM or in Internal FLASH */
+#endif /* USER_VECT_TAB_ADDRESS */
+
+#else
+ /*
+ * Disable the FMC bank1 (enabled after reset).
+ * This, prevents CPU speculation access on this bank which blocks the use of FMC during
+ * 24us. During this time the others FMC master (such as LTDC) cannot use it!
+ */
+ FMC_Bank1_R->BTCR[0] = 0x000030D2;
+
+ /* 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 D1 AXI-RAM or in Internal FLASH */
+#endif /* USER_VECT_TAB_ADDRESS */
+
+#endif /*DUAL_CORE && CORE_CM4*/
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock , it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock 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 CSI, SystemCoreClock will contain the CSI_VALUE(*)
+ * - 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 CSI_VALUE(*),
+ * HSI_VALUE(**) or HSE_VALUE(***) multiplied/divided by the PLL factors.
+ *
+ * (*) CSI_VALUE is a constant defined in stm32h7xx_hal.h file (default value
+ * 4 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ * (**) HSI_VALUE is a constant defined in stm32h7xx_hal.h file (default value
+ * 64 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (***)HSE_VALUE is a constant defined in stm32h7xx_hal.h file (default value
+ * 25 MHz), user has to ensure that HSE_VALUE is same as the real
+ * frequency of the crystal used. Otherwise, this function may
+ * have wrong result.
+ *
+ * - 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 pllp, pllsource, pllm, pllfracen, hsivalue, tmp;
+ uint32_t common_system_clock;
+ float_t fracn1, pllvco;
+
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+
+ switch (RCC->CFGR & RCC_CFGR_SWS)
+ {
+ case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */
+ common_system_clock = (uint32_t) (HSI_VALUE >> ((RCC->CR & RCC_CR_HSIDIV)>> 3));
+ break;
+
+ case RCC_CFGR_SWS_CSI: /* CSI used as system clock source */
+ common_system_clock = CSI_VALUE;
+ break;
+
+ case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */
+ common_system_clock = HSE_VALUE;
+ break;
+
+ case RCC_CFGR_SWS_PLL1: /* PLL1 used as system clock source */
+
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE or CSI_VALUE/ PLLM) * PLLN
+ SYSCLK = PLL_VCO / PLLR
+ */
+ pllsource = (RCC->PLLCKSELR & RCC_PLLCKSELR_PLLSRC);
+ pllm = ((RCC->PLLCKSELR & RCC_PLLCKSELR_DIVM1)>> 4) ;
+ pllfracen = ((RCC->PLLCFGR & RCC_PLLCFGR_PLL1FRACEN)>>RCC_PLLCFGR_PLL1FRACEN_Pos);
+ fracn1 = (float_t)(uint32_t)(pllfracen* ((RCC->PLL1FRACR & RCC_PLL1FRACR_FRACN1)>> 3));
+
+ if (pllm != 0U)
+ {
+ switch (pllsource)
+ {
+ case RCC_PLLCKSELR_PLLSRC_HSI: /* HSI used as PLL clock source */
+
+ hsivalue = (HSI_VALUE >> ((RCC->CR & RCC_CR_HSIDIV)>> 3)) ;
+ pllvco = ( (float_t)hsivalue / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1/(float_t)0x2000) +(float_t)1 );
+
+ break;
+
+ case RCC_PLLCKSELR_PLLSRC_CSI: /* CSI used as PLL clock source */
+ pllvco = ((float_t)CSI_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1/(float_t)0x2000) +(float_t)1 );
+ break;
+
+ case RCC_PLLCKSELR_PLLSRC_HSE: /* HSE used as PLL clock source */
+ pllvco = ((float_t)HSE_VALUE / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1/(float_t)0x2000) +(float_t)1 );
+ break;
+
+ default:
+ hsivalue = (HSI_VALUE >> ((RCC->CR & RCC_CR_HSIDIV)>> 3)) ;
+ pllvco = ((float_t)hsivalue / (float_t)pllm) * ((float_t)(uint32_t)(RCC->PLL1DIVR & RCC_PLL1DIVR_N1) + (fracn1/(float_t)0x2000) +(float_t)1 );
+ break;
+ }
+ pllp = (((RCC->PLL1DIVR & RCC_PLL1DIVR_P1) >>9) + 1U ) ;
+ common_system_clock = (uint32_t)(float_t)(pllvco/(float_t)pllp);
+ }
+ else
+ {
+ common_system_clock = 0U;
+ }
+ break;
+
+ default:
+ common_system_clock = (uint32_t) (HSI_VALUE >> ((RCC->CR & RCC_CR_HSIDIV)>> 3));
+ break;
+ }
+
+ /* Compute SystemClock frequency --------------------------------------------------*/
+#if defined (RCC_D1CFGR_D1CPRE)
+ tmp = D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_D1CPRE)>> RCC_D1CFGR_D1CPRE_Pos];
+
+ /* common_system_clock frequency : CM7 CPU frequency */
+ common_system_clock >>= tmp;
+
+ /* SystemD2Clock frequency : CM4 CPU, AXI and AHBs Clock frequency */
+ SystemD2Clock = (common_system_clock >> ((D1CorePrescTable[(RCC->D1CFGR & RCC_D1CFGR_HPRE)>> RCC_D1CFGR_HPRE_Pos]) & 0x1FU));
+
+#else
+ tmp = D1CorePrescTable[(RCC->CDCFGR1 & RCC_CDCFGR1_CDCPRE)>> RCC_CDCFGR1_CDCPRE_Pos];
+
+ /* common_system_clock frequency : CM7 CPU frequency */
+ common_system_clock >>= tmp;
+
+ /* SystemD2Clock frequency : AXI and AHBs Clock frequency */
+ SystemD2Clock = (common_system_clock >> ((D1CorePrescTable[(RCC->CDCFGR1 & RCC_CDCFGR1_HPRE)>> RCC_CDCFGR1_HPRE_Pos]) & 0x1FU));
+
+#endif
+
+#if defined(DUAL_CORE) && defined(CORE_CM4)
+ SystemCoreClock = SystemD2Clock;
+#else
+ SystemCoreClock = common_system_clock;
+#endif /* DUAL_CORE && CORE_CM4 */
+}
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
diff --git a/Core/Src/tx_initialize_low_level.S b/Core/Src/tx_initialize_low_level.S
new file mode 100644
index 0000000..4879528
--- /dev/null
+++ b/Core/Src/tx_initialize_low_level.S
@@ -0,0 +1,665 @@
+
+// by default AzureRTOS is configured to use static byte pool for
+// allocation, in case dynamic allocation is to be used, uncomment
+// the define below and update the linker files to define the following symbols
+// EWARM toolchain:
+// place in RAM_region { last section FREE_MEM};
+// MDK-ARM toolchain;
+// either define the RW_IRAM1 region in the ".sct" file or modify this file by referring to the correct memory region.
+// LDR r1, =|Image$$RW_IRAM1$$ZI$$Limit|
+// STM32CubeIDE toolchain:
+// ._threadx_heap :
+// {
+// . = ALIGN(8);
+// __RAM_segment_used_end__ = .;
+// . = . + 64K;
+// . = ALIGN(8);
+// } >RAM_D1 AT> RAM_D1
+// The simplest way to provide memory for ThreadX is to define a new section, see ._threadx_heap above.
+// In the example above the ThreadX heap size is set to 64KBytes.
+// The ._threadx_heap must be located between the .bss and the ._user_heap_stack sections in the linker script.
+// Caution: Make sure that ThreadX does not need more than the provided heap memory (64KBytes in this example).
+// Read more in STM32CubeIDE User Guide, chapter: "Linker script".
+
+//#define USE_DYNAMIC_MEMORY_ALLOCATION
+
+#if defined(__clang__)
+@/**************************************************************************/
+@/* */
+@/* Copyright (c) Microsoft Corporation. All rights reserved. */
+@/* */
+@/* This software is licensed under the Microsoft Software License */
+@/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+@/* and in the root directory of this software. */
+@/* */
+@/**************************************************************************/
+@
+@
+@/**************************************************************************/
+@/**************************************************************************/
+@/** */
+@/** ThreadX Component */
+@/** */
+@/** Initialize */
+@/** */
+@/**************************************************************************/
+@/**************************************************************************/
+@
+@
+ .global _tx_thread_system_stack_ptr
+ .global _tx_initialize_unused_memory
+ .global _tx_timer_interrupt
+ .global __main
+ .global __tx_SVCallHandler
+ .global __tx_PendSVHandler
+ .global __tx_NMIHandler @ NMI
+ .global __tx_BadHandler @ HardFault
+ .global __tx_SVCallHandler @ SVCall
+ .global __tx_DBGHandler @ Monitor
+ .global __tx_PendSVHandler @ PendSV
+ .global __tx_SysTickHandler @ SysTick
+ .global __tx_IntHandler @ Int 0
+#ifdef USE_DYNAMIC_MEMORY_ALLOCATION
+ .global Image$$RW_IRAM1$$ZI$$Limit
+#endif
+ .global __Vectors
+@
+@
+SYSTEM_CLOCK = 280000000
+SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1)
+
+ .text 32
+ .align 4
+ .syntax unified
+@/**************************************************************************/
+@/* */
+@/* FUNCTION RELEASE */
+@/* */
+@/* _tx_initialize_low_level Cortex-M7/AC6 */
+@/* 6.1 */
+@/* AUTHOR */
+@/* */
+@/* William E. Lamie, Microsoft Corporation */
+@/* */
+@/* DESCRIPTION */
+@/* */
+@/* This function is responsible for any low-level processor */
+@/* initialization, including setting up interrupt vectors, setting */
+@/* up a periodic timer interrupt source, saving the system stack */
+@/* pointer for use in ISR processing later, and finding the first */
+@/* available RAM memory address for tx_application_define. */
+@/* */
+@/* INPUT */
+@/* */
+@/* None */
+@/* */
+@/* OUTPUT */
+@/* */
+@/* None */
+@/* */
+@/* CALLS */
+@/* */
+@/* None */
+@/* */
+@/* CALLED BY */
+@/* */
+@/* _tx_initialize_kernel_enter ThreadX entry function */
+@/* */
+@/* RELEASE HISTORY */
+@/* */
+@/* DATE NAME DESCRIPTION */
+@/* */
+@/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+@/* */
+@/**************************************************************************/
+@VOID _tx_initialize_low_level(VOID)
+@{
+ .global _tx_initialize_low_level
+ .thumb_func
+_tx_initialize_low_level:
+@
+@ /* Disable interrupts during ThreadX initialization. */
+@
+ CPSID i
+@
+@ /* Set base of available memory to end of non-initialised RAM area. */
+@
+#ifdef USE_DYNAMIC_MEMORY_ALLOCATION
+ LDR r0, =_tx_initialize_unused_memory @ Build address of unused memory pointer
+ LDR r1, = Image$$RW_IRAM1$$ZI$$Limit @ Build first free address
+ ADD r1, r1, #4 @
+ STR r1, [r0] @ Setup first unused memory pointer
+#endif
+@
+@ /* Setup Vector Table Offset Register. */
+@
+ MOV r0, #0xE000E000 @ Build address of NVIC registers
+ LDR r1, =__Vectors @ Pickup address of vector table
+ STR r1, [r0, #0xD08] @ Set vector table address
+@
+@ /* Set system stack pointer from vector value. */
+@
+ LDR r0, =_tx_thread_system_stack_ptr @ Build address of system stack pointer
+ LDR r1, =__Vectors @ Pickup address of vector table
+ LDR r1, [r1] @ Pickup reset stack pointer
+ STR r1, [r0] @ Save system stack pointer
+@
+@ /* Enable the cycle count register. */
+@
+ LDR r0, =0xE0001000 @ Build address of DWT register
+ LDR r1, [r0] @ Pickup the current value
+ ORR r1, r1, #1 @ Set the CYCCNTENA bit
+ STR r1, [r0] @ Enable the cycle count register
+@
+@ /* Configure SysTick for 100Hz clock, or 16384 cycles if no reference. */
+@
+ MOV r0, #0xE000E000 @ Build address of NVIC registers
+ LDR r1, =SYSTICK_CYCLES
+ STR r1, [r0, #0x14] @ Setup SysTick Reload Value
+ MOV r1, #0x7 @ Build SysTick Control Enable Value
+ STR r1, [r0, #0x10] @ Setup SysTick Control
+@
+@ /* Configure handler priorities. */
+@
+ LDR r1, =0x00000000 @ Rsrv, UsgF, BusF, MemM
+ STR r1, [r0, #0xD18] @ Setup System Handlers 4-7 Priority Registers
+
+ LDR r1, =0xFF000000 @ SVCl, Rsrv, Rsrv, Rsrv
+ STR r1, [r0, #0xD1C] @ Setup System Handlers 8-11 Priority Registers
+ @ Note: SVC must be lowest priority, which is 0xFF
+
+ LDR r1, =0x40FF0000 @ SysT, PnSV, Rsrv, DbgM
+ STR r1, [r0, #0xD20] @ Setup System Handlers 12-15 Priority Registers
+ @ Note: PnSV must be lowest priority, which is 0xFF
+@
+@ /* Return to caller. */
+@
+ BX lr
+@}
+@
+
+@/* Define shells for each of the unused vectors. */
+@
+ .global __tx_BadHandler
+ .thumb_func
+__tx_BadHandler:
+ B __tx_BadHandler
+
+@ /* added to catch the hardfault */
+
+ .global __tx_HardfaultHandler
+ .thumb_func
+__tx_HardfaultHandler:
+ B __tx_HardfaultHandler
+
+@ /* added to catch the SVC */
+
+ .global __tx_SVCallHandler
+ .thumb_func
+__tx_SVCallHandler:
+ B __tx_SVCallHandler
+
+@ /* Generic interrupt handler template */
+ .global __tx_IntHandler
+ .thumb_func
+__tx_IntHandler:
+@ VOID InterruptHandler (VOID)
+@ {
+ PUSH {r0, lr}
+#ifdef TX_EXECUTION_PROFILE_ENABLE
+ BL _tx_execution_isr_enter @ Call the ISR enter function
+#endif
+
+@ /* Do interrupt handler work here */
+@ /* BL .... */
+
+#ifdef TX_EXECUTION_PROFILE_ENABLE
+ BL _tx_execution_isr_exit @ Call the ISR exit function
+#endif
+ POP {r0, lr}
+ BX LR
+@ }
+
+@ /* System Tick timer interrupt handler */
+ .global __tx_SysTickHandler
+ .global SysTick_Handler
+ .thumb_func
+__tx_SysTickHandler:
+ .thumb_func
+SysTick_Handler:
+@ VOID TimerInterruptHandler (VOID)
+@ {
+@
+ PUSH {r0, lr}
+#ifdef TX_EXECUTION_PROFILE_ENABLE
+ BL _tx_execution_isr_enter @ Call the ISR enter function
+#endif
+ BL _tx_timer_interrupt
+#ifdef TX_EXECUTION_PROFILE_ENABLE
+ BL _tx_execution_isr_exit @ Call the ISR exit function
+#endif
+ POP {r0, lr}
+ BX LR
+@ }
+
+@ /* NMI, DBG handlers */
+ .global __tx_NMIHandler
+ .thumb_func
+__tx_NMIHandler:
+ B __tx_NMIHandler
+
+ .global __tx_DBGHandler
+ .thumb_func
+__tx_DBGHandler:
+ B __tx_DBGHandler
+.end
+#endif
+
+#ifdef __IAR_SYSTEMS_ASM__
+;/**************************************************************************/
+;/* */
+;/* Copyright (c) Microsoft Corporation. All rights reserved. */
+;/* */
+;/* This software is licensed under the Microsoft Software License */
+;/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+;/* and in the root directory of this software. */
+;/* */
+;/**************************************************************************/
+;
+;
+;/**************************************************************************/
+;/**************************************************************************/
+;/** */
+;/** ThreadX Component */
+;/** */
+;/** Initialize */
+;/** */
+;/**************************************************************************/
+;/**************************************************************************/
+;
+ EXTERN _tx_thread_system_stack_ptr
+ EXTERN _tx_initialize_unused_memory
+ EXTERN _tx_timer_interrupt
+ EXTERN __vector_table
+ EXTERN _tx_execution_isr_enter
+ EXTERN _tx_execution_isr_exit
+;
+;
+SYSTEM_CLOCK EQU 280000000
+SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1)
+#ifdef USE_DYNAMIC_MEMORY_ALLOCATION
+ RSEG FREE_MEM:DATA
+ PUBLIC __tx_free_memory_start
+__tx_free_memory_start
+ DS32 4
+#endif
+;
+;
+ SECTION `.text`:CODE:NOROOT(2)
+ THUMB
+;/**************************************************************************/
+;/* */
+;/* FUNCTION RELEASE */
+;/* */
+;/* _tx_initialize_low_level Cortex-M7/IAR */
+;/* 6.1 */
+;/* AUTHOR */
+;/* */
+;/* William E. Lamie, Microsoft Corporation */
+;/* */
+;/* DESCRIPTION */
+;/* */
+;/* This function is responsible for any low-level processor */
+;/* initialization, including setting up interrupt vectors, setting */
+;/* up a periodic timer interrupt source, saving the system stack */
+;/* pointer for use in ISR processing later, and finding the first */
+;/* available RAM memory address for tx_application_define. */
+;/* */
+;/* INPUT */
+;/* */
+;/* None */
+;/* */
+;/* OUTPUT */
+;/* */
+;/* None */
+;/* */
+;/* CALLS */
+;/* */
+;/* None */
+;/* */
+;/* CALLED BY */
+;/* */
+;/* _tx_initialize_kernel_enter ThreadX entry function */
+;/* */
+;/* RELEASE HISTORY */
+;/* */
+;/* DATE NAME DESCRIPTION */
+;/* */
+;/* 09-30-2020 William E. Lamie Initial Version 6.1 */
+;/* */
+;/**************************************************************************/
+;VOID _tx_initialize_low_level(VOID)
+;{
+ PUBLIC _tx_initialize_low_level
+_tx_initialize_low_level:
+;
+; /* Ensure that interrupts are disabled. */
+;
+ CPSID i ; Disable interrupts
+;
+;
+; /* Set base of available memory to end of non-initialised RAM area. */
+;
+#ifdef USE_DYNAMIC_MEMORY_ALLOCATION
+
+ LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area
+ LDR r2, =_tx_initialize_unused_memory ; Build address of unused memory pointer
+ STR r0, [r2, #0] ; Save first free memory address
+#endif
+;
+; /* Enable the cycle count register. */
+;
+ LDR r0, =0xE0001000 ; Build address of DWT register
+ LDR r1, [r0] ; Pickup the current value
+ ORR r1, r1, #1 ; Set the CYCCNTENA bit
+ STR r1, [r0] ; Enable the cycle count register
+;
+; /* Setup Vector Table Offset Register. */
+;
+ MOV r0, #0xE000E000 ; Build address of NVIC registers
+ LDR r1, =__vector_table ; Pickup address of vector table
+ STR r1, [r0, #0xD08] ; Set vector table address
+;
+; /* Set system stack pointer from vector value. */
+;
+ LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer
+ LDR r1, =__vector_table ; Pickup address of vector table
+ LDR r1, [r1] ; Pickup reset stack pointer
+ STR r1, [r0] ; Save system stack pointer
+;
+; /* Configure SysTick. */
+;
+ MOV r0, #0xE000E000 ; Build address of NVIC registers
+ LDR r1, =SYSTICK_CYCLES
+ STR r1, [r0, #0x14] ; Setup SysTick Reload Value
+ MOV r1, #0x7 ; Build SysTick Control Enable Value
+ STR r1, [r0, #0x10] ; Setup SysTick Control
+;
+; /* Configure handler priorities. */
+;
+ LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM
+ STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers
+
+ LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv
+ STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers
+ ; Note: SVC must be lowest priority, which is 0xFF
+
+ LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM
+ STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers
+ ; Note: PnSV must be lowest priority, which is 0xFF
+;
+; /* Return to caller. */
+;
+ BX lr
+;}
+;
+;
+ PUBLIC SysTick_Handler
+ PUBLIC __tx_SysTickHandler
+__tx_SysTickHandler:
+SysTick_Handler:
+;
+; VOID SysTick_Handler (VOID)
+; {
+;
+ PUSH {r0, lr}
+#ifdef TX_EXECUTION_PROFILE_ENABLE
+ BL _tx_execution_isr_enter ; Call the ISR enter function
+#endif
+ BL _tx_timer_interrupt
+#ifdef TX_EXECUTION_PROFILE_ENABLE
+ BL _tx_execution_isr_exit ; Call the ISR exit function
+#endif
+ POP {r0, lr}
+ BX LR
+; }
+ END
+#endif
+
+#if defined (__GNUC__) && !defined(__clang__)
+@/**************************************************************************/
+@/* */
+@/* Copyright (c) Microsoft Corporation. All rights reserved. */
+@/* */
+@/* This software is licensed under the Microsoft Software License */
+@/* Terms for Microsoft Azure RTOS. Full text of the license can be */
+@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
+@/* and in the root directory of this software. */
+@/* */
+@/**************************************************************************/
+@
+@
+@/**************************************************************************/
+@/**************************************************************************/
+@/** */
+@/** ThreadX Component */
+@/** */
+@/** Initialize */
+@/** */
+@/**************************************************************************/
+@/**************************************************************************/
+@
+@
+ .global _tx_thread_system_stack_ptr
+ .global _tx_initialize_unused_memory
+ .global __RAM_segment_used_end__
+ .global _tx_timer_interrupt
+ .global __main
+ .global __tx_SVCallHandler
+ .global __tx_PendSVHandler
+ .global _vectors
+ .global __tx_NMIHandler @ NMI
+ .global __tx_BadHandler @ HardFault
+ .global __tx_SVCallHandler @ SVCall
+ .global __tx_DBGHandler @ Monitor
+ .global __tx_PendSVHandler @ PendSV
+ .global __tx_SysTickHandler @ SysTick
+ .global __tx_IntHandler @ Int 0
+@
+@
+
+SYSTEM_CLOCK = 280000000
+SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1)
+
+ .text 32
+ .align 4
+ .syntax unified
+@/**************************************************************************/
+@/* */
+@/* FUNCTION RELEASE */
+@/* */
+@/* _tx_initialize_low_level Cortex-M7/GNU */
+@/* 6.1 */
+@/* AUTHOR */
+@/* */
+@/* William E. Lamie, Microsoft Corporation */
+@/* */
+@/* DESCRIPTION */
+@/* */
+@/* This function is responsible for any low-level processor */
+@/* initialization, including setting up interrupt vectors, setting */
+@/* up a periodic timer interrupt source, saving the system stack */
+@/* pointer for use in ISR processing later, and finding the first */
+@/* available RAM memory address for tx_application_define. */
+@/* */
+@/* INPUT */
+@/* */
+@/* None */
+@/* */
+@/* OUTPUT */
+@/* */
+@/* None */
+@/* */
+@/* CALLS */
+@/* */
+@/* None */
+@/* */
+@/* CALLED BY */
+@/* */
+@/* _tx_initialize_kernel_enter ThreadX entry function */
+@/* */
+@/* RELEASE HISTORY */
+@/* */
+@/* DATE NAME DESCRIPTION */
+@/* */
+@/* 05-19-2020 William E. Lamie Initial Version 6.0 */
+@/* 09-30-2020 William E. Lamie Modified Comment(s), fixed */
+@/* GNU assembly comment, clean */
+@/* up whitespace, resulting */
+@/* in version 6.1 */
+@/* */
+@/**************************************************************************/
+@VOID _tx_initialize_low_level(VOID)
+@{
+ .global _tx_initialize_low_level
+ .thumb_func
+_tx_initialize_low_level:
+@
+@ /* Disable interrupts during ThreadX initialization. */
+@
+ CPSID i
+@
+@ /* Set base of available memory to end of non-initialised RAM area. */
+@
+#ifdef USE_DYNAMIC_MEMORY_ALLOCATION
+ LDR r0, =_tx_initialize_unused_memory @ Build address of unused memory pointer
+ LDR r1, =__RAM_segment_used_end__ @ Build first free address
+ ADD r1, r1, #4 @
+ STR r1, [r0] @ Setup first unused memory pointer
+#endif
+@
+@ /* Setup Vector Table Offset Register. */
+@
+ MOV r0, #0xE000E000 @ Build address of NVIC registers
+ LDR r1, =g_pfnVectors @ Pickup address of vector table
+ STR r1, [r0, #0xD08] @ Set vector table address
+@
+@ /* Set system stack pointer from vector value. */
+@
+ LDR r0, =_tx_thread_system_stack_ptr @ Build address of system stack pointer
+ LDR r1, =g_pfnVectors @ Pickup address of vector table
+ LDR r1, [r1] @ Pickup reset stack pointer
+ STR r1, [r0] @ Save system stack pointer
+@
+@ /* Enable the cycle count register. */
+@
+ LDR r0, =0xE0001000 @ Build address of DWT register
+ LDR r1, [r0] @ Pickup the current value
+ ORR r1, r1, #1 @ Set the CYCCNTENA bit
+ STR r1, [r0] @ Enable the cycle count register
+@
+@ /* Configure SysTick for 100Hz clock, or 16384 cycles if no reference. */
+@
+ MOV r0, #0xE000E000 @ Build address of NVIC registers
+ LDR r1, =SYSTICK_CYCLES
+ STR r1, [r0, #0x14] @ Setup SysTick Reload Value
+ MOV r1, #0x7 @ Build SysTick Control Enable Value
+ STR r1, [r0, #0x10] @ Setup SysTick Control
+@
+@ /* Configure handler priorities. */
+@
+ LDR r1, =0x00000000 @ Rsrv, UsgF, BusF, MemM
+ STR r1, [r0, #0xD18] @ Setup System Handlers 4-7 Priority Registers
+
+ LDR r1, =0xFF000000 @ SVCl, Rsrv, Rsrv, Rsrv
+ STR r1, [r0, #0xD1C] @ Setup System Handlers 8-11 Priority Registers
+ @ Note: SVC must be lowest priority, which is 0xFF
+
+ LDR r1, =0x40FF0000 @ SysT, PnSV, Rsrv, DbgM
+ STR r1, [r0, #0xD20] @ Setup System Handlers 12-15 Priority Registers
+ @ Note: PnSV must be lowest priority, which is 0xFF
+@
+@ /* Return to caller. */
+@
+ BX lr
+@}
+@
+
+@/* Define shells for each of the unused vectors. */
+@
+ .global __tx_BadHandler
+ .thumb_func
+__tx_BadHandler:
+ B __tx_BadHandler
+
+@ /* added to catch the hardfault */
+
+ .global __tx_HardfaultHandler
+ .thumb_func
+__tx_HardfaultHandler:
+ B __tx_HardfaultHandler
+
+@ /* added to catch the SVC */
+
+ .global __tx_SVCallHandler
+ .thumb_func
+__tx_SVCallHandler:
+ B __tx_SVCallHandler
+
+@ /* Generic interrupt handler template */
+ .global __tx_IntHandler
+ .thumb_func
+__tx_IntHandler:
+@ VOID InterruptHandler (VOID)
+@ {
+ PUSH {r0, lr}
+#ifdef TX_EXECUTION_PROFILE_ENABLE
+ BL _tx_execution_isr_enter @ Call the ISR enter function
+#endif
+
+@ /* Do interrupt handler work here */
+@ /* BL .... */
+
+#ifdef TX_EXECUTION_PROFILE_ENABLE
+ BL _tx_execution_isr_exit @ Call the ISR exit function
+#endif
+ POP {r0, lr}
+ BX LR
+@ }
+
+@ /* System Tick timer interrupt handler */
+ .global __tx_SysTickHandler
+ .global SysTick_Handler
+ .thumb_func
+__tx_SysTickHandler:
+ .thumb_func
+SysTick_Handler:
+@ VOID TimerInterruptHandler (VOID)
+@ {
+@
+ PUSH {r0, lr}
+#ifdef TX_EXECUTION_PROFILE_ENABLE
+ BL _tx_execution_isr_enter @ Call the ISR enter function
+#endif
+ BL _tx_timer_interrupt
+#ifdef TX_EXECUTION_PROFILE_ENABLE
+ BL _tx_execution_isr_exit @ Call the ISR exit function
+#endif
+ POP {r0, lr}
+ BX LR
+@ }
+
+@ /* NMI, DBG handlers */
+ .global __tx_NMIHandler
+ .thumb_func
+__tx_NMIHandler:
+ B __tx_NMIHandler
+
+ .global __tx_DBGHandler
+ .thumb_func
+__tx_DBGHandler:
+ B __tx_DBGHandler
+
+#endif
diff --git a/Core/Startup/startup_stm32h7b3lihxq.s b/Core/Startup/startup_stm32h7b3lihxq.s
new file mode 100644
index 0000000..2dea99b
--- /dev/null
+++ b/Core/Startup/startup_stm32h7b3lihxq.s
@@ -0,0 +1,751 @@
+/**
+ ******************************************************************************
+ * @file startup_stm32h7b3xxq.s
+ * @author MCD Application Team
+ * @brief STM32H7B3xx Devices vector table for GCC based toolchain.
+ * This module performs:
+ * - Set the initial SP
+ * - Set the initial PC == Reset_Handler,
+ * - Set the vector table entries with the exceptions ISR address
+ * - Branches to main in the C library (which eventually
+ * calls main()).
+ * After Reset the Cortex-M processor is in Thread mode,
+ * priority is Privileged, and the Stack is set to Main.
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+
+ .syntax unified
+ .cpu cortex-m7
+ .fpu softvfp
+ .thumb
+
+.global g_pfnVectors
+.global Default_Handler
+
+/* start address for the initialization values of the .data section.
+defined in linker script */
+.word _sidata
+/* start address for the .data section. defined in linker script */
+.word _sdata
+/* end address for the .data section. defined in linker script */
+.word _edata
+/* start address for the .bss section. defined in linker script */
+.word _sbss
+/* end address for the .bss section. defined in linker script */
+.word _ebss
+/* stack used for SystemInit_ExtMemCtl; always internal RAM used */
+
+/**
+ * @brief This is the code that gets called when the processor first
+ * starts execution following a reset event. Only the absolutely
+ * necessary set is performed, after which the application
+ * supplied main() routine is called.
+ * @param None
+ * @retval : None
+*/
+
+ .section .text.Reset_Handler
+ .weak Reset_Handler
+ .type Reset_Handler, %function
+Reset_Handler:
+ ldr sp, =_estack /* set stack pointer */
+
+/* Call the clock system initialization function.*/
+ bl SystemInit
+
+/* Copy the data segment initializers from flash to SRAM */
+ ldr r0, =_sdata
+ ldr r1, =_edata
+ ldr r2, =_sidata
+ movs r3, #0
+ b LoopCopyDataInit
+
+CopyDataInit:
+ ldr r4, [r2, r3]
+ str r4, [r0, r3]
+ adds r3, r3, #4
+
+LoopCopyDataInit:
+ adds r4, r0, r3
+ cmp r4, r1
+ bcc CopyDataInit
+/* Zero fill the bss segment. */
+ ldr r2, =_sbss
+ ldr r4, =_ebss
+ movs r3, #0
+ b LoopFillZerobss
+
+FillZerobss:
+ str r3, [r2]
+ adds r2, r2, #4
+
+LoopFillZerobss:
+ cmp r2, r4
+ bcc FillZerobss
+
+/* Call static constructors */
+ bl __libc_init_array
+/* Call the application's entry point.*/
+ bl main
+ bx lr
+.size Reset_Handler, .-Reset_Handler
+
+/**
+ * @brief This is the code that gets called when the processor receives an
+ * unexpected interrupt. This simply enters an infinite loop, preserving
+ * the system state for examination by a debugger.
+ * @param None
+ * @retval None
+*/
+ .section .text.Default_Handler,"ax",%progbits
+Default_Handler:
+Infinite_Loop:
+ b Infinite_Loop
+ .size Default_Handler, .-Default_Handler
+/******************************************************************************
+*
+* The minimal vector table for a Cortex M. Note that the proper constructs
+* must be placed on this to ensure that it ends up at physical address
+* 0x0000.0000.
+*
+*******************************************************************************/
+ .section .isr_vector,"a",%progbits
+ .type g_pfnVectors, %object
+ .size g_pfnVectors, .-g_pfnVectors
+
+
+g_pfnVectors:
+ .word _estack
+ .word Reset_Handler
+
+ .word NMI_Handler
+ .word HardFault_Handler
+ .word MemManage_Handler
+ .word BusFault_Handler
+ .word UsageFault_Handler
+ .word 0
+ .word 0
+ .word 0
+ .word 0
+ .word SVC_Handler
+ .word DebugMon_Handler
+ .word 0
+ .word PendSV_Handler
+ .word SysTick_Handler
+
+ /* External Interrupts */
+ .word WWDG_IRQHandler /* Window WatchDog */
+ .word PVD_PVM_IRQHandler /* PVD/PVM through EXTI Line detection */
+ .word RTC_TAMP_STAMP_CSS_LSE_IRQHandler /* Tamper and TimeStamps through the EXTI line */
+ .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */
+ .word FLASH_IRQHandler /* FLASH */
+ .word RCC_IRQHandler /* RCC */
+ .word EXTI0_IRQHandler /* EXTI Line0 */
+ .word EXTI1_IRQHandler /* EXTI Line1 */
+ .word EXTI2_IRQHandler /* EXTI Line2 */
+ .word EXTI3_IRQHandler /* EXTI Line3 */
+ .word EXTI4_IRQHandler /* EXTI Line4 */
+ .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */
+ .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */
+ .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */
+ .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */
+ .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */
+ .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */
+ .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */
+ .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */
+ .word FDCAN1_IT0_IRQHandler /* FDCAN1 interrupt line 0 */
+ .word FDCAN2_IT0_IRQHandler /* FDCAN2 interrupt line 0 */
+ .word FDCAN1_IT1_IRQHandler /* FDCAN1 interrupt line 1 */
+ .word FDCAN2_IT1_IRQHandler /* FDCAN2 interrupt line 1 */
+ .word EXTI9_5_IRQHandler /* External Line[9:5]s */
+ .word TIM1_BRK_IRQHandler /* TIM1 Break interrupt */
+ .word TIM1_UP_IRQHandler /* TIM1 Update interrupt */
+ .word TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation interrupt */
+ .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */
+ .word TIM2_IRQHandler /* TIM2 */
+ .word TIM3_IRQHandler /* TIM3 */
+ .word TIM4_IRQHandler /* TIM4 */
+ .word I2C1_EV_IRQHandler /* I2C1 Event */
+ .word I2C1_ER_IRQHandler /* I2C1 Error */
+ .word I2C2_EV_IRQHandler /* I2C2 Event */
+ .word I2C2_ER_IRQHandler /* I2C2 Error */
+ .word SPI1_IRQHandler /* SPI1 */
+ .word SPI2_IRQHandler /* SPI2 */
+ .word USART1_IRQHandler /* USART1 */
+ .word USART2_IRQHandler /* USART2 */
+ .word USART3_IRQHandler /* USART3 */
+ .word EXTI15_10_IRQHandler /* External Line[15:10]s */
+ .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */
+ .word DFSDM2_IRQHandler /* DFSDM2 Interrupt */
+ .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */
+ .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */
+ .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */
+ .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */
+ .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */
+ .word FMC_IRQHandler /* FMC */
+ .word SDMMC1_IRQHandler /* SDMMC1 */
+ .word TIM5_IRQHandler /* TIM5 */
+ .word SPI3_IRQHandler /* SPI3 */
+ .word UART4_IRQHandler /* UART4 */
+ .word UART5_IRQHandler /* UART5 */
+ .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */
+ .word TIM7_IRQHandler /* TIM7 */
+ .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */
+ .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */
+ .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */
+ .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */
+ .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word FDCAN_CAL_IRQHandler /* FDCAN calibration unit interrupt*/
+ .word DFSDM1_FLT4_IRQHandler /* DFSDM Filter4 Interrupt */
+ .word DFSDM1_FLT5_IRQHandler /* DFSDM Filter5 Interrupt */
+ .word DFSDM1_FLT6_IRQHandler /* DFSDM Filter6 Interrupt */
+ .word DFSDM1_FLT7_IRQHandler /* DFSDM Filter7 Interrupt */
+ .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */
+ .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */
+ .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */
+ .word USART6_IRQHandler /* USART6 */
+ .word I2C3_EV_IRQHandler /* I2C3 event */
+ .word I2C3_ER_IRQHandler /* I2C3 error */
+ .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */
+ .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */
+ .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */
+ .word OTG_HS_IRQHandler /* USB OTG HS */
+ .word DCMI_PSSI_IRQHandler /* DCMI, PSSI */
+ .word CRYP_IRQHandler /* CRYP crypto global interrupt */
+ .word HASH_RNG_IRQHandler /* RNG, HASH */
+ .word FPU_IRQHandler /* FPU */
+ .word UART7_IRQHandler /* UART7 */
+ .word UART8_IRQHandler /* UART8 */
+ .word SPI4_IRQHandler /* SPI4 */
+ .word SPI5_IRQHandler /* SPI5 */
+ .word SPI6_IRQHandler /* SPI6 */
+ .word SAI1_IRQHandler /* SAI1 */
+ .word LTDC_IRQHandler /* LTDC */
+ .word LTDC_ER_IRQHandler /* LTDC error */
+ .word DMA2D_IRQHandler /* DMA2D */
+ .word SAI2_IRQHandler /* SAI2 */
+ .word OCTOSPI1_IRQHandler /* OCTOSPI1 */
+ .word LPTIM1_IRQHandler /* LPTIM1 */
+ .word CEC_IRQHandler /* HDMI_CEC */
+ .word I2C4_EV_IRQHandler /* I2C4 Event */
+ .word I2C4_ER_IRQHandler /* I2C4 Error */
+ .word SPDIF_RX_IRQHandler /* SPDIF_RX */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word DMAMUX1_OVR_IRQHandler /* DMAMUX1 Overrun interrupt */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word 0 /* Reserved */
+ .word DFSDM1_FLT0_IRQHandler /* DFSDM Filter0 Interrupt */
+ .word DFSDM1_FLT1_IRQHandler /* DFSDM Filter1 Interrupt */
+ .word DFSDM1_FLT2_IRQHandler /* DFSDM Filter2 Interrupt */
+ .word DFSDM1_FLT3_IRQHandler /* DFSDM Filter3 Interrupt */
+ .word 0 /* Reserved */
+ .word SWPMI1_IRQHandler /* Serial Wire Interface 1 global interrupt */
+ .word TIM15_IRQHandler /* TIM15 global Interrupt */
+ .word TIM16_IRQHandler /* TIM16 global Interrupt */
+ .word TIM17_IRQHandler /* TIM17 global Interrupt */
+ .word MDIOS_WKUP_IRQHandler /* MDIOS Wakeup Interrupt */
+ .word MDIOS_IRQHandler /* MDIOS global Interrupt */
+ .word JPEG_IRQHandler /* JPEG global Interrupt */
+ .word MDMA_IRQHandler /* MDMA global Interrupt */
+ .word 0 /* Reserved */
+ .word SDMMC2_IRQHandler /* SDMMC2 global Interrupt */
+ .word HSEM1_IRQHandler /* HSEM1 global Interrupt */
+ .word 0 /* Reserved */
+ .word DAC2_IRQHandler /* DAC2 global Interrupt */
+ .word DMAMUX2_OVR_IRQHandler /* DMAMUX Overrun interrupt */
+ .word BDMA2_Channel0_IRQHandler /* BDMA2 Channel 0 global Interrupt */
+ .word BDMA2_Channel1_IRQHandler /* BDMA2 Channel 1 global Interrupt */
+ .word BDMA2_Channel2_IRQHandler /* BDMA2 Channel 2 global Interrupt */
+ .word BDMA2_Channel3_IRQHandler /* BDMA2 Channel 3 global Interrupt */
+ .word BDMA2_Channel4_IRQHandler /* BDMA2 Channel 4 global Interrupt */
+ .word BDMA2_Channel5_IRQHandler /* BDMA2 Channel 5 global Interrupt */
+ .word BDMA2_Channel6_IRQHandler /* BDMA2 Channel 6 global Interrupt */
+ .word BDMA2_Channel7_IRQHandler /* BDMA2 Channel 7 global Interrupt */
+ .word COMP_IRQHandler /* COMP global Interrupt */
+ .word LPTIM2_IRQHandler /* LP TIM2 global interrupt */
+ .word LPTIM3_IRQHandler /* LP TIM3 global interrupt */
+ .word UART9_IRQHandler /* UART9 global interrupt */
+ .word USART10_IRQHandler /* USART10 global interrupt */
+ .word LPUART1_IRQHandler /* LP UART1 interrupt */
+ .word 0 /* Reserved */
+ .word CRS_IRQHandler /* Clock Recovery Global Interrupt */
+ .word ECC_IRQHandler /* ECC diagnostic Global Interrupt */
+ .word 0 /* Reserved */
+ .word DTS_IRQHandler /* DTS */
+ .word 0 /* Reserved */
+ .word WAKEUP_PIN_IRQHandler /* Interrupt for all 6 wake-up pins */
+ .word OCTOSPI2_IRQHandler /* OCTOSPI2 */
+ .word OTFDEC1_IRQHandler /* OTFDEC1 */
+ .word OTFDEC2_IRQHandler /* OTFDEC2 */
+ .word GFXMMU_IRQHandler /* GFXMMU */
+ .word BDMA1_IRQHandler /* BDMA1 */
+
+/*******************************************************************************
+*
+* 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_PVM_IRQHandler
+ .thumb_set PVD_PVM_IRQHandler,Default_Handler
+
+ .weak RTC_TAMP_STAMP_CSS_LSE_IRQHandler
+ .thumb_set RTC_TAMP_STAMP_CSS_LSE_IRQHandler,Default_Handler
+
+ .weak RTC_WKUP_IRQHandler
+ .thumb_set RTC_WKUP_IRQHandler,Default_Handler
+
+ .weak FLASH_IRQHandler
+ .thumb_set FLASH_IRQHandler,Default_Handler
+
+ .weak RCC_IRQHandler
+ .thumb_set RCC_IRQHandler,Default_Handler
+
+ .weak EXTI0_IRQHandler
+ .thumb_set EXTI0_IRQHandler,Default_Handler
+
+ .weak EXTI1_IRQHandler
+ .thumb_set EXTI1_IRQHandler,Default_Handler
+
+ .weak EXTI2_IRQHandler
+ .thumb_set EXTI2_IRQHandler,Default_Handler
+
+ .weak EXTI3_IRQHandler
+ .thumb_set EXTI3_IRQHandler,Default_Handler
+
+ .weak EXTI4_IRQHandler
+ .thumb_set EXTI4_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream0_IRQHandler
+ .thumb_set DMA1_Stream0_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream1_IRQHandler
+ .thumb_set DMA1_Stream1_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream2_IRQHandler
+ .thumb_set DMA1_Stream2_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream3_IRQHandler
+ .thumb_set DMA1_Stream3_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream4_IRQHandler
+ .thumb_set DMA1_Stream4_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream5_IRQHandler
+ .thumb_set DMA1_Stream5_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream6_IRQHandler
+ .thumb_set DMA1_Stream6_IRQHandler,Default_Handler
+
+ .weak ADC_IRQHandler
+ .thumb_set ADC_IRQHandler,Default_Handler
+
+ .weak FDCAN1_IT0_IRQHandler
+ .thumb_set FDCAN1_IT0_IRQHandler,Default_Handler
+
+ .weak FDCAN2_IT0_IRQHandler
+ .thumb_set FDCAN2_IT0_IRQHandler,Default_Handler
+
+ .weak FDCAN1_IT1_IRQHandler
+ .thumb_set FDCAN1_IT1_IRQHandler,Default_Handler
+
+ .weak FDCAN2_IT1_IRQHandler
+ .thumb_set FDCAN2_IT1_IRQHandler,Default_Handler
+
+ .weak EXTI9_5_IRQHandler
+ .thumb_set EXTI9_5_IRQHandler,Default_Handler
+
+ .weak TIM1_BRK_IRQHandler
+ .thumb_set TIM1_BRK_IRQHandler,Default_Handler
+
+ .weak TIM1_UP_IRQHandler
+ .thumb_set TIM1_UP_IRQHandler,Default_Handler
+
+ .weak TIM1_TRG_COM_IRQHandler
+ .thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler
+
+ .weak TIM1_CC_IRQHandler
+ .thumb_set TIM1_CC_IRQHandler,Default_Handler
+
+ .weak TIM2_IRQHandler
+ .thumb_set TIM2_IRQHandler,Default_Handler
+
+ .weak TIM3_IRQHandler
+ .thumb_set TIM3_IRQHandler,Default_Handler
+
+ .weak TIM4_IRQHandler
+ .thumb_set TIM4_IRQHandler,Default_Handler
+
+ .weak I2C1_EV_IRQHandler
+ .thumb_set I2C1_EV_IRQHandler,Default_Handler
+
+ .weak I2C1_ER_IRQHandler
+ .thumb_set I2C1_ER_IRQHandler,Default_Handler
+
+ .weak I2C2_EV_IRQHandler
+ .thumb_set I2C2_EV_IRQHandler,Default_Handler
+
+ .weak I2C2_ER_IRQHandler
+ .thumb_set I2C2_ER_IRQHandler,Default_Handler
+
+ .weak SPI1_IRQHandler
+ .thumb_set SPI1_IRQHandler,Default_Handler
+
+ .weak SPI2_IRQHandler
+ .thumb_set SPI2_IRQHandler,Default_Handler
+
+ .weak USART1_IRQHandler
+ .thumb_set USART1_IRQHandler,Default_Handler
+
+ .weak USART2_IRQHandler
+ .thumb_set USART2_IRQHandler,Default_Handler
+
+ .weak USART3_IRQHandler
+ .thumb_set USART3_IRQHandler,Default_Handler
+
+ .weak EXTI15_10_IRQHandler
+ .thumb_set EXTI15_10_IRQHandler,Default_Handler
+
+ .weak RTC_Alarm_IRQHandler
+ .thumb_set RTC_Alarm_IRQHandler,Default_Handler
+
+ .weak DFSDM2_IRQHandler
+ .thumb_set DFSDM2_IRQHandler,Default_Handler
+
+ .weak TIM8_BRK_TIM12_IRQHandler
+ .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler
+
+ .weak TIM8_UP_TIM13_IRQHandler
+ .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler
+
+ .weak TIM8_TRG_COM_TIM14_IRQHandler
+ .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler
+
+ .weak TIM8_CC_IRQHandler
+ .thumb_set TIM8_CC_IRQHandler,Default_Handler
+
+ .weak DMA1_Stream7_IRQHandler
+ .thumb_set DMA1_Stream7_IRQHandler,Default_Handler
+
+ .weak FMC_IRQHandler
+ .thumb_set FMC_IRQHandler,Default_Handler
+
+ .weak SDMMC1_IRQHandler
+ .thumb_set SDMMC1_IRQHandler,Default_Handler
+
+ .weak TIM5_IRQHandler
+ .thumb_set TIM5_IRQHandler,Default_Handler
+
+ .weak SPI3_IRQHandler
+ .thumb_set SPI3_IRQHandler,Default_Handler
+
+ .weak UART4_IRQHandler
+ .thumb_set UART4_IRQHandler,Default_Handler
+
+ .weak UART5_IRQHandler
+ .thumb_set UART5_IRQHandler,Default_Handler
+
+ .weak TIM6_DAC_IRQHandler
+ .thumb_set TIM6_DAC_IRQHandler,Default_Handler
+
+ .weak TIM7_IRQHandler
+ .thumb_set TIM7_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream0_IRQHandler
+ .thumb_set DMA2_Stream0_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream1_IRQHandler
+ .thumb_set DMA2_Stream1_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream2_IRQHandler
+ .thumb_set DMA2_Stream2_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream3_IRQHandler
+ .thumb_set DMA2_Stream3_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream4_IRQHandler
+ .thumb_set DMA2_Stream4_IRQHandler,Default_Handler
+
+ .weak FDCAN_CAL_IRQHandler
+ .thumb_set FDCAN_CAL_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT4_IRQHandler
+ .thumb_set DFSDM1_FLT4_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT5_IRQHandler
+ .thumb_set DFSDM1_FLT5_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT6_IRQHandler
+ .thumb_set DFSDM1_FLT6_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT7_IRQHandler
+ .thumb_set DFSDM1_FLT7_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream5_IRQHandler
+ .thumb_set DMA2_Stream5_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream6_IRQHandler
+ .thumb_set DMA2_Stream6_IRQHandler,Default_Handler
+
+ .weak DMA2_Stream7_IRQHandler
+ .thumb_set DMA2_Stream7_IRQHandler,Default_Handler
+
+ .weak USART6_IRQHandler
+ .thumb_set USART6_IRQHandler,Default_Handler
+
+ .weak I2C3_EV_IRQHandler
+ .thumb_set I2C3_EV_IRQHandler,Default_Handler
+
+ .weak I2C3_ER_IRQHandler
+ .thumb_set I2C3_ER_IRQHandler,Default_Handler
+
+ .weak OTG_HS_EP1_OUT_IRQHandler
+ .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler
+
+ .weak OTG_HS_EP1_IN_IRQHandler
+ .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler
+
+ .weak OTG_HS_WKUP_IRQHandler
+ .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler
+
+ .weak OTG_HS_IRQHandler
+ .thumb_set OTG_HS_IRQHandler,Default_Handler
+
+ .weak DCMI_PSSI_IRQHandler
+ .thumb_set DCMI_PSSI_IRQHandler,Default_Handler
+
+ .weak CRYP_IRQHandler
+ .thumb_set CRYP_IRQHandler,Default_Handler
+
+ .weak HASH_RNG_IRQHandler
+ .thumb_set HASH_RNG_IRQHandler,Default_Handler
+
+ .weak FPU_IRQHandler
+ .thumb_set FPU_IRQHandler,Default_Handler
+
+ .weak UART7_IRQHandler
+ .thumb_set UART7_IRQHandler,Default_Handler
+
+ .weak UART8_IRQHandler
+ .thumb_set UART8_IRQHandler,Default_Handler
+
+ .weak SPI4_IRQHandler
+ .thumb_set SPI4_IRQHandler,Default_Handler
+
+ .weak SPI5_IRQHandler
+ .thumb_set SPI5_IRQHandler,Default_Handler
+
+ .weak SPI6_IRQHandler
+ .thumb_set SPI6_IRQHandler,Default_Handler
+
+ .weak SAI1_IRQHandler
+ .thumb_set SAI1_IRQHandler,Default_Handler
+
+ .weak LTDC_IRQHandler
+ .thumb_set LTDC_IRQHandler,Default_Handler
+
+ .weak LTDC_ER_IRQHandler
+ .thumb_set LTDC_ER_IRQHandler,Default_Handler
+
+ .weak DMA2D_IRQHandler
+ .thumb_set DMA2D_IRQHandler,Default_Handler
+
+ .weak SAI2_IRQHandler
+ .thumb_set SAI2_IRQHandler,Default_Handler
+
+ .weak OCTOSPI1_IRQHandler
+ .thumb_set OCTOSPI1_IRQHandler,Default_Handler
+
+ .weak LPTIM1_IRQHandler
+ .thumb_set LPTIM1_IRQHandler,Default_Handler
+
+ .weak CEC_IRQHandler
+ .thumb_set CEC_IRQHandler,Default_Handler
+
+ .weak I2C4_EV_IRQHandler
+ .thumb_set I2C4_EV_IRQHandler,Default_Handler
+
+ .weak I2C4_ER_IRQHandler
+ .thumb_set I2C4_ER_IRQHandler,Default_Handler
+
+ .weak SPDIF_RX_IRQHandler
+ .thumb_set SPDIF_RX_IRQHandler,Default_Handler
+
+ .weak DMAMUX1_OVR_IRQHandler
+ .thumb_set DMAMUX1_OVR_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT0_IRQHandler
+ .thumb_set DFSDM1_FLT0_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT1_IRQHandler
+ .thumb_set DFSDM1_FLT1_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT2_IRQHandler
+ .thumb_set DFSDM1_FLT2_IRQHandler,Default_Handler
+
+ .weak DFSDM1_FLT3_IRQHandler
+ .thumb_set DFSDM1_FLT3_IRQHandler,Default_Handler
+
+ .weak SWPMI1_IRQHandler
+ .thumb_set SWPMI1_IRQHandler,Default_Handler
+
+ .weak TIM15_IRQHandler
+ .thumb_set TIM15_IRQHandler,Default_Handler
+
+ .weak TIM16_IRQHandler
+ .thumb_set TIM16_IRQHandler,Default_Handler
+
+ .weak TIM17_IRQHandler
+ .thumb_set TIM17_IRQHandler,Default_Handler
+
+ .weak MDIOS_WKUP_IRQHandler
+ .thumb_set MDIOS_WKUP_IRQHandler,Default_Handler
+
+ .weak MDIOS_IRQHandler
+ .thumb_set MDIOS_IRQHandler,Default_Handler
+
+ .weak JPEG_IRQHandler
+ .thumb_set JPEG_IRQHandler,Default_Handler
+
+ .weak MDMA_IRQHandler
+ .thumb_set MDMA_IRQHandler,Default_Handler
+
+ .weak SDMMC2_IRQHandler
+ .thumb_set SDMMC2_IRQHandler,Default_Handler
+
+ .weak HSEM1_IRQHandler
+ .thumb_set HSEM1_IRQHandler,Default_Handler
+
+ .weak DAC2_IRQHandler
+ .thumb_set DAC2_IRQHandler,Default_Handler
+
+ .weak DMAMUX2_OVR_IRQHandler
+ .thumb_set DMAMUX2_OVR_IRQHandler,Default_Handler
+
+ .weak BDMA2_Channel0_IRQHandler
+ .thumb_set BDMA2_Channel0_IRQHandler,Default_Handler
+
+ .weak BDMA2_Channel1_IRQHandler
+ .thumb_set BDMA2_Channel1_IRQHandler,Default_Handler
+
+ .weak BDMA2_Channel2_IRQHandler
+ .thumb_set BDMA2_Channel2_IRQHandler,Default_Handler
+
+ .weak BDMA2_Channel3_IRQHandler
+ .thumb_set BDMA2_Channel3_IRQHandler,Default_Handler
+
+ .weak BDMA2_Channel4_IRQHandler
+ .thumb_set BDMA2_Channel4_IRQHandler,Default_Handler
+
+ .weak BDMA2_Channel5_IRQHandler
+ .thumb_set BDMA2_Channel5_IRQHandler,Default_Handler
+
+ .weak BDMA2_Channel6_IRQHandler
+ .thumb_set BDMA2_Channel6_IRQHandler,Default_Handler
+
+ .weak BDMA2_Channel7_IRQHandler
+ .thumb_set BDMA2_Channel7_IRQHandler,Default_Handler
+
+ .weak COMP_IRQHandler
+ .thumb_set COMP_IRQHandler,Default_Handler
+
+ .weak LPTIM2_IRQHandler
+ .thumb_set LPTIM2_IRQHandler,Default_Handler
+
+ .weak LPTIM3_IRQHandler
+ .thumb_set LPTIM3_IRQHandler,Default_Handler
+
+ .weak LPTIM4_IRQHandler
+ .thumb_set LPTIM4_IRQHandler,Default_Handler
+
+ .weak LPTIM5_IRQHandler
+ .thumb_set LPTIM5_IRQHandler,Default_Handler
+
+ .weak UART9_IRQHandler
+ .thumb_set UART9_IRQHandler,Default_Handler
+
+ .weak USART10_IRQHandler
+ .thumb_set USART10_IRQHandler,Default_Handler
+
+ .weak LPUART1_IRQHandler
+ .thumb_set LPUART1_IRQHandler,Default_Handler
+
+ .weak CRS_IRQHandler
+ .thumb_set CRS_IRQHandler,Default_Handler
+
+ .weak ECC_IRQHandler
+ .thumb_set ECC_IRQHandler,Default_Handler
+
+ .weak DTS_IRQHandler
+ .thumb_set DTS_IRQHandler,Default_Handler
+
+ .weak WAKEUP_PIN_IRQHandler
+ .thumb_set WAKEUP_PIN_IRQHandler,Default_Handler
+
+ .weak OCTOSPI2_IRQHandler
+ .thumb_set OCTOSPI2_IRQHandler,Default_Handler
+
+ .weak OTFDEC1_IRQHandler
+ .thumb_set OTFDEC1_IRQHandler,Default_Handler
+
+ .weak OTFDEC2_IRQHandler
+ .thumb_set OTFDEC2_IRQHandler,Default_Handler
+
+ .weak GFXMMU_IRQHandler
+ .thumb_set GFXMMU_IRQHandler,Default_Handler
+
+ .weak BDMA1_IRQHandler
+ .thumb_set BDMA1_IRQHandler,Default_Handler
+
+
diff --git a/Debug/AZRTOS.elf b/Debug/AZRTOS.elf
new file mode 100644
index 0000000..f9180a8
Binary files /dev/null and b/Debug/AZRTOS.elf differ
diff --git a/Debug/AZRTOS.list b/Debug/AZRTOS.list
new file mode 100644
index 0000000..2f3d9d2
--- /dev/null
+++ b/Debug/AZRTOS.list
@@ -0,0 +1,63633 @@
+
+AZRTOS.elf: file format elf32-littlearm
+
+Sections:
+Idx Name Size VMA LMA File off Algn
+ 0 .isr_vector 000002ac 08000000 08000000 00010000 2**0
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 1 .text 0001dc08 080002b0 080002b0 000102b0 2**4
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 2 .rodata 00003f74 0801deb8 0801deb8 0002deb8 2**2
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 3 FontFlashSection 000001a6 08021e2c 08021e2c 00031e2c 2**2
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 4 FontSearchFlashSection 00000018 08021fd4 08021fd4 00031fd4 2**2
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 5 TextFlashSection 0000000c 08021fec 08021fec 00031fec 2**2
+ CONTENTS, ALLOC, LOAD, READONLY, DATA
+ 6 .init_array 00000014 08021ff8 08021ff8 00031ff8 2**2
+ CONTENTS, ALLOC, LOAD, DATA
+ 7 .fini_array 00000008 0802200c 0802200c 0003200c 2**2
+ CONTENTS, ALLOC, LOAD, DATA
+ 8 .data 000000e0 24000000 08022014 00040000 2**2
+ CONTENTS, ALLOC, LOAD, DATA
+ 9 TouchGFX_Framebuffer 000bf400 240000e0 080220f4 000400e0 2**2
+ CONTENTS, ALLOC, LOAD, DATA
+ 10 .bss 00004b08 240bf4e0 080e14f4 000ff4e0 2**2
+ ALLOC
+ 11 ._user_heap_stack 00000600 240c3fe8 080e14f4 00103fe8 2**0
+ ALLOC
+ 12 .ARM.attributes 0000002e 00000000 00000000 000ff4e0 2**0
+ CONTENTS, READONLY
+ 13 .debug_info 0008d234 00000000 00000000 000ff50e 2**0
+ CONTENTS, READONLY, DEBUGGING, OCTETS
+ 14 .debug_abbrev 0001110f 00000000 00000000 0018c742 2**0
+ CONTENTS, READONLY, DEBUGGING, OCTETS
+ 15 .debug_aranges 00002f20 00000000 00000000 0019d858 2**3
+ CONTENTS, READONLY, DEBUGGING, OCTETS
+ 16 .debug_ranges 00002908 00000000 00000000 001a0778 2**3
+ CONTENTS, READONLY, DEBUGGING, OCTETS
+ 17 .debug_macro 0003ef9d 00000000 00000000 001a3080 2**0
+ CONTENTS, READONLY, DEBUGGING, OCTETS
+ 18 .debug_line 0003fc4b 00000000 00000000 001e201d 2**0
+ CONTENTS, READONLY, DEBUGGING, OCTETS
+ 19 .debug_str 00166265 00000000 00000000 00221c68 2**0
+ CONTENTS, READONLY, DEBUGGING, OCTETS
+ 20 .comment 000000cf 00000000 00000000 00387ecd 2**0
+ CONTENTS, READONLY
+ 21 .debug_frame 0000c2d0 00000000 00000000 00387f9c 2**2
+ CONTENTS, READONLY, DEBUGGING, OCTETS
+
+Disassembly of section .text:
+
+080002b0 <__do_global_dtors_aux>:
+ 80002b0: b510 push {r4, lr}
+ 80002b2: 4c05 ldr r4, [pc, #20] ; (80002c8 <__do_global_dtors_aux+0x18>)
+ 80002b4: 7823 ldrb r3, [r4, #0]
+ 80002b6: b933 cbnz r3, 80002c6 <__do_global_dtors_aux+0x16>
+ 80002b8: 4b04 ldr r3, [pc, #16] ; (80002cc <__do_global_dtors_aux+0x1c>)
+ 80002ba: b113 cbz r3, 80002c2 <__do_global_dtors_aux+0x12>
+ 80002bc: 4804 ldr r0, [pc, #16] ; (80002d0 <__do_global_dtors_aux+0x20>)
+ 80002be: f3af 8000 nop.w
+ 80002c2: 2301 movs r3, #1
+ 80002c4: 7023 strb r3, [r4, #0]
+ 80002c6: bd10 pop {r4, pc}
+ 80002c8: 240bf4e0 .word 0x240bf4e0
+ 80002cc: 00000000 .word 0x00000000
+ 80002d0: 0801dea0 .word 0x0801dea0
+
+080002d4 :
+ 80002d4: b508 push {r3, lr}
+ 80002d6: 4b03 ldr r3, [pc, #12] ; (80002e4 )
+ 80002d8: b11b cbz r3, 80002e2
+ 80002da: 4903 ldr r1, [pc, #12] ; (80002e8 )
+ 80002dc: 4803 ldr r0, [pc, #12] ; (80002ec )
+ 80002de: f3af 8000 nop.w
+ 80002e2: bd08 pop {r3, pc}
+ 80002e4: 00000000 .word 0x00000000
+ 80002e8: 240bf4e4 .word 0x240bf4e4
+ 80002ec: 0801dea0 .word 0x0801dea0
+
+080002f0 <_tx_initialize_low_level>:
+ .thumb_func
+_tx_initialize_low_level:
+@
+@ /* Disable interrupts during ThreadX initialization. */
+@
+ CPSID i
+ 80002f0: b672 cpsid i
+ STR r1, [r0] @ Setup first unused memory pointer
+#endif
+@
+@ /* Setup Vector Table Offset Register. */
+@
+ MOV r0, #0xE000E000 @ Build address of NVIC registers
+ 80002f2: f04f 20e0 mov.w r0, #3758153728 ; 0xe000e000
+ LDR r1, =g_pfnVectors @ Pickup address of vector table
+ 80002f6: 4919 ldr r1, [pc, #100] ; (800035c <__tx_DBGHandler+0x4>)
+ STR r1, [r0, #0xD08] @ Set vector table address
+ 80002f8: f8c0 1d08 str.w r1, [r0, #3336] ; 0xd08
+@
+@ /* Set system stack pointer from vector value. */
+@
+ LDR r0, =_tx_thread_system_stack_ptr @ Build address of system stack pointer
+ 80002fc: 4818 ldr r0, [pc, #96] ; (8000360 <__tx_DBGHandler+0x8>)
+ LDR r1, =g_pfnVectors @ Pickup address of vector table
+ 80002fe: 4917 ldr r1, [pc, #92] ; (800035c <__tx_DBGHandler+0x4>)
+ LDR r1, [r1] @ Pickup reset stack pointer
+ 8000300: 6809 ldr r1, [r1, #0]
+ STR r1, [r0] @ Save system stack pointer
+ 8000302: 6001 str r1, [r0, #0]
+@
+@ /* Enable the cycle count register. */
+@
+ LDR r0, =0xE0001000 @ Build address of DWT register
+ 8000304: 4817 ldr r0, [pc, #92] ; (8000364 <__tx_DBGHandler+0xc>)
+ LDR r1, [r0] @ Pickup the current value
+ 8000306: 6801 ldr r1, [r0, #0]
+ ORR r1, r1, #1 @ Set the CYCCNTENA bit
+ 8000308: f041 0101 orr.w r1, r1, #1
+ STR r1, [r0] @ Enable the cycle count register
+ 800030c: 6001 str r1, [r0, #0]
+@
+@ /* Configure SysTick for 100Hz clock, or 16384 cycles if no reference. */
+@
+ MOV r0, #0xE000E000 @ Build address of NVIC registers
+ 800030e: f04f 20e0 mov.w r0, #3758153728 ; 0xe000e000
+ LDR r1, =SYSTICK_CYCLES
+ 8000312: 4915 ldr r1, [pc, #84] ; (8000368 <__tx_DBGHandler+0x10>)
+ STR r1, [r0, #0x14] @ Setup SysTick Reload Value
+ 8000314: 6141 str r1, [r0, #20]
+ MOV r1, #0x7 @ Build SysTick Control Enable Value
+ 8000316: f04f 0107 mov.w r1, #7
+ STR r1, [r0, #0x10] @ Setup SysTick Control
+ 800031a: 6101 str r1, [r0, #16]
+@
+@ /* Configure handler priorities. */
+@
+ LDR r1, =0x00000000 @ Rsrv, UsgF, BusF, MemM
+ 800031c: f04f 0100 mov.w r1, #0
+ STR r1, [r0, #0xD18] @ Setup System Handlers 4-7 Priority Registers
+ 8000320: f8c0 1d18 str.w r1, [r0, #3352] ; 0xd18
+
+ LDR r1, =0xFF000000 @ SVCl, Rsrv, Rsrv, Rsrv
+ 8000324: f04f 417f mov.w r1, #4278190080 ; 0xff000000
+ STR r1, [r0, #0xD1C] @ Setup System Handlers 8-11 Priority Registers
+ 8000328: f8c0 1d1c str.w r1, [r0, #3356] ; 0xd1c
+ @ Note: SVC must be lowest priority, which is 0xFF
+
+ LDR r1, =0x40FF0000 @ SysT, PnSV, Rsrv, DbgM
+ 800032c: 490f ldr r1, [pc, #60] ; (800036c <__tx_DBGHandler+0x14>)
+ STR r1, [r0, #0xD20] @ Setup System Handlers 12-15 Priority Registers
+ 800032e: f8c0 1d20 str.w r1, [r0, #3360] ; 0xd20
+ @ Note: PnSV must be lowest priority, which is 0xFF
+@
+@ /* Return to caller. */
+@
+ BX lr
+ 8000332: 4770 bx lr
+
+08000334 <__tx_BadHandler>:
+@/* Define shells for each of the unused vectors. */
+@
+ .global __tx_BadHandler
+ .thumb_func
+__tx_BadHandler:
+ B __tx_BadHandler
+ 8000334: f7ff bffe b.w 8000334 <__tx_BadHandler>
+
+08000338 <__tx_HardfaultHandler>:
+@ /* added to catch the hardfault */
+
+ .global __tx_HardfaultHandler
+ .thumb_func
+__tx_HardfaultHandler:
+ B __tx_HardfaultHandler
+ 8000338: f7ff bffe b.w 8000338 <__tx_HardfaultHandler>
+
+0800033c <__tx_SVCallHandler>:
+@ /* added to catch the SVC */
+
+ .global __tx_SVCallHandler
+ .thumb_func
+__tx_SVCallHandler:
+ B __tx_SVCallHandler
+ 800033c: f7ff bffe b.w 800033c <__tx_SVCallHandler>
+
+08000340 <__tx_IntHandler>:
+ .global __tx_IntHandler
+ .thumb_func
+__tx_IntHandler:
+@ VOID InterruptHandler (VOID)
+@ {
+ PUSH {r0, lr}
+ 8000340: b501 push {r0, lr}
+@ /* BL .... */
+
+#ifdef TX_EXECUTION_PROFILE_ENABLE
+ BL _tx_execution_isr_exit @ Call the ISR exit function
+#endif
+ POP {r0, lr}
+ 8000342: e8bd 4001 ldmia.w sp!, {r0, lr}
+ BX LR
+ 8000346: 4770 bx lr
+
+08000348 :
+ .thumb_func
+SysTick_Handler:
+@ VOID TimerInterruptHandler (VOID)
+@ {
+@
+ PUSH {r0, lr}
+ 8000348: b501 push {r0, lr}
+#ifdef TX_EXECUTION_PROFILE_ENABLE
+ BL _tx_execution_isr_enter @ Call the ISR enter function
+#endif
+ BL _tx_timer_interrupt
+ 800034a: f000 f891 bl 8000470 <_tx_timer_interrupt>
+#ifdef TX_EXECUTION_PROFILE_ENABLE
+ BL _tx_execution_isr_exit @ Call the ISR exit function
+#endif
+ POP {r0, lr}
+ 800034e: e8bd 4001 ldmia.w sp!, {r0, lr}
+ BX LR
+ 8000352: 4770 bx lr
+
+08000354 <__tx_NMIHandler>:
+
+@ /* NMI, DBG handlers */
+ .global __tx_NMIHandler
+ .thumb_func
+__tx_NMIHandler:
+ B __tx_NMIHandler
+ 8000354: f7ff bffe b.w 8000354 <__tx_NMIHandler>
+
+08000358 <__tx_DBGHandler>:
+
+ .global __tx_DBGHandler
+ .thumb_func
+__tx_DBGHandler:
+ B __tx_DBGHandler
+ 8000358: f7ff bffe b.w 8000358 <__tx_DBGHandler>
+ LDR r1, =g_pfnVectors @ Pickup address of vector table
+ 800035c: 08000000 .word 0x08000000
+ LDR r0, =_tx_thread_system_stack_ptr @ Build address of system stack pointer
+ 8000360: 240c0794 .word 0x240c0794
+ LDR r0, =0xE0001000 @ Build address of DWT register
+ 8000364: e0001000 .word 0xe0001000
+ LDR r1, =SYSTICK_CYCLES
+ 8000368: 002ab97f .word 0x002ab97f
+ LDR r1, =0x40FF0000 @ SysT, PnSV, Rsrv, DbgM
+ 800036c: 40ff0000 .word 0x40ff0000
+
+08000370 <_tx_thread_schedule>:
+ from the first schedule request. Subsequent scheduling occurs
+ from the PendSV handling routine below. */
+
+ /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */
+
+ MOV r0, #0 // Build value for TX_FALSE
+ 8000370: f04f 0000 mov.w r0, #0
+ LDR r2, =_tx_thread_preempt_disable // Build address of preempt disable flag
+ 8000374: 4a2a ldr r2, [pc, #168] ; (8000420 )
+ STR r0, [r2, #0] // Clear preempt disable flag
+ 8000376: 6010 str r0, [r2, #0]
+
+ /* Clear CONTROL.FPCA bit so VFP registers aren't unnecessarily stacked. */
+
+#ifdef __ARM_FP
+ MRS r0, CONTROL // Pickup current CONTROL register
+ 8000378: f3ef 8014 mrs r0, CONTROL
+ BIC r0, r0, #4 // Clear the FPCA bit
+ 800037c: f020 0004 bic.w r0, r0, #4
+ MSR CONTROL, r0 // Setup new CONTROL register
+ 8000380: f380 8814 msr CONTROL, r0
+#endif
+
+ /* Enable interrupts */
+ CPSIE i
+ 8000384: b662 cpsie i
+
+ /* Enter the scheduler for the first time. */
+
+ MOV r0, #0x10000000 // Load PENDSVSET bit
+ 8000386: f04f 5080 mov.w r0, #268435456 ; 0x10000000
+ MOV r1, #0xE000E000 // Load NVIC base
+ 800038a: f04f 21e0 mov.w r1, #3758153728 ; 0xe000e000
+ STR r0, [r1, #0xD04] // Set PENDSVBIT in ICSR
+ 800038e: f8c1 0d04 str.w r0, [r1, #3332] ; 0xd04
+ DSB // Complete all memory accesses
+ 8000392: f3bf 8f4f dsb sy
+ ISB // Flush pipeline
+ 8000396: f3bf 8f6f isb sy
+
+0800039a <__tx_wait_here>:
+
+ /* Wait here for the PendSV to take place. */
+
+__tx_wait_here:
+ B __tx_wait_here // Wait for the PendSV to happen
+ 800039a: e7fe b.n 800039a <__tx_wait_here>
+
+0800039c :
+ BL _tx_execution_thread_exit // Call the thread exit function
+ POP {r0, lr} // Recover LR
+ CPSIE i // Enable interrupts
+#endif
+
+ LDR r0, =_tx_thread_current_ptr // Build current thread pointer address
+ 800039c: 4821 ldr r0, [pc, #132] ; (8000424 )
+ LDR r2, =_tx_thread_execute_ptr // Build execute thread pointer address
+ 800039e: 4a22 ldr r2, [pc, #136] ; (8000428 )
+ MOV r3, #0 // Build NULL value
+ 80003a0: f04f 0300 mov.w r3, #0
+ LDR r1, [r0] // Pickup current thread pointer
+ 80003a4: 6801 ldr r1, [r0, #0]
+
+ /* Determine if there is a current thread to finish preserving. */
+
+ CBZ r1, __tx_ts_new // If NULL, skip preservation
+ 80003a6: b191 cbz r1, 80003ce <__tx_ts_new>
+
+ /* Recover PSP and preserve current thread context. */
+
+ STR r3, [r0] // Set _tx_thread_current_ptr to NULL
+ 80003a8: 6003 str r3, [r0, #0]
+ MRS r12, PSP // Pickup PSP pointer (thread's stack pointer)
+ 80003aa: f3ef 8c09 mrs ip, PSP
+ STMDB r12!, {r4-r11} // Save its remaining registers
+ 80003ae: e92c 0ff0 stmdb ip!, {r4, r5, r6, r7, r8, r9, sl, fp}
+#ifdef __ARM_FP
+ TST LR, #0x10 // Determine if the VFP extended frame is present
+ 80003b2: f01e 0f10 tst.w lr, #16
+ BNE _skip_vfp_save
+ 80003b6: d101 bne.n 80003bc <_skip_vfp_save>
+ VSTMDB r12!,{s16-s31} // Yes, save additional VFP registers
+ 80003b8: ed2c 8a10 vstmdb ip!, {s16-s31}
+
+080003bc <_skip_vfp_save>:
+_skip_vfp_save:
+#endif
+ LDR r4, =_tx_timer_time_slice // Build address of time-slice variable
+ 80003bc: 4c1b ldr r4, [pc, #108] ; (800042c )
+ STMDB r12!, {LR} // Save LR on the stack
+ 80003be: f84c ed04 str.w lr, [ip, #-4]!
+
+ /* Determine if time-slice is active. If it isn't, skip time handling processing. */
+
+ LDR r5, [r4] // Pickup current time-slice
+ 80003c2: 6825 ldr r5, [r4, #0]
+ STR r12, [r1, #8] // Save the thread stack pointer
+ 80003c4: f8c1 c008 str.w ip, [r1, #8]
+ CBZ r5, __tx_ts_new // If not active, skip processing
+ 80003c8: b10d cbz r5, 80003ce <__tx_ts_new>
+
+ /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */
+
+ STR r5, [r1, #24] // Save current time-slice
+ 80003ca: 618d str r5, [r1, #24]
+
+ /* Clear the global time-slice. */
+
+ STR r3, [r4] // Clear time-slice
+ 80003cc: 6023 str r3, [r4, #0]
+
+080003ce <__tx_ts_new>:
+
+__tx_ts_new:
+
+ /* Now we are looking for a new thread to execute! */
+
+ CPSID i // Disable interrupts
+ 80003ce: b672 cpsid i
+ LDR r1, [r2] // Is there another thread ready to execute?
+ 80003d0: 6811 ldr r1, [r2, #0]
+ CBZ r1, __tx_ts_wait // No, skip to the wait processing
+ 80003d2: b1b1 cbz r1, 8000402 <__tx_ts_wait>
+
+ /* Yes, another thread is ready for else, make the current thread the new thread. */
+
+ STR r1, [r0] // Setup the current thread pointer to the new thread
+ 80003d4: 6001 str r1, [r0, #0]
+ CPSIE i // Enable interrupts
+ 80003d6: b662 cpsie i
+
+080003d8 <__tx_ts_restore>:
+
+ /* Increment the thread run count. */
+
+__tx_ts_restore:
+ LDR r7, [r1, #4] // Pickup the current thread run count
+ 80003d8: 684f ldr r7, [r1, #4]
+ LDR r4, =_tx_timer_time_slice // Build address of time-slice variable
+ 80003da: 4c14 ldr r4, [pc, #80] ; (800042c )
+ LDR r5, [r1, #24] // Pickup thread's current time-slice
+ 80003dc: 698d ldr r5, [r1, #24]
+ ADD r7, r7, #1 // Increment the thread run count
+ 80003de: f107 0701 add.w r7, r7, #1
+ STR r7, [r1, #4] // Store the new run count
+ 80003e2: 604f str r7, [r1, #4]
+
+ /* Setup global time-slice with thread's current time-slice. */
+
+ STR r5, [r4] // Setup global time-slice
+ 80003e4: 6025 str r5, [r4, #0]
+ POP {r0, r1} // Recover r0 and r1
+#endif
+
+ /* Restore the thread context and PSP. */
+
+ LDR r12, [r1, #8] // Pickup thread's stack pointer
+ 80003e6: f8d1 c008 ldr.w ip, [r1, #8]
+ LDMIA r12!, {LR} // Pickup LR
+ 80003ea: f85c eb04 ldr.w lr, [ip], #4
+#ifdef __ARM_FP
+ TST LR, #0x10 // Determine if the VFP extended frame is present
+ 80003ee: f01e 0f10 tst.w lr, #16
+ BNE _skip_vfp_restore // If not, skip VFP restore
+ 80003f2: d101 bne.n 80003f8 <_skip_vfp_restore>
+ VLDMIA r12!, {s16-s31} // Yes, restore additional VFP registers
+ 80003f4: ecbc 8a10 vldmia ip!, {s16-s31}
+
+080003f8 <_skip_vfp_restore>:
+_skip_vfp_restore:
+#endif
+ LDMIA r12!, {r4-r11} // Recover thread's registers
+ 80003f8: e8bc 0ff0 ldmia.w ip!, {r4, r5, r6, r7, r8, r9, sl, fp}
+ MSR PSP, r12 // Setup the thread's stack pointer
+ 80003fc: f38c 8809 msr PSP, ip
+
+ /* Return to thread. */
+
+ BX lr // Return to thread!
+ 8000400: 4770 bx lr
+
+08000402 <__tx_ts_wait>:
+ /* The following is the idle wait processing... in this case, no threads are ready for execution and the
+ system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts
+ are disabled to allow use of WFI for waiting for a thread to arrive. */
+
+__tx_ts_wait:
+ CPSID i // Disable interrupts
+ 8000402: b672 cpsid i
+ LDR r1, [r2] // Pickup the next thread to execute pointer
+ 8000404: 6811 ldr r1, [r2, #0]
+ STR r1, [r0] // Store it in the current pointer
+ 8000406: 6001 str r1, [r0, #0]
+ CBNZ r1, __tx_ts_ready // If non-NULL, a new thread is ready!
+ 8000408: b909 cbnz r1, 800040e <__tx_ts_ready>
+ PUSH {r0-r3}
+ BL tx_low_power_exit // Exit low power mode
+ POP {r0-r3}
+#endif
+
+ CPSIE i // Enable interrupts
+ 800040a: b662 cpsie i
+ B __tx_ts_wait // Loop to continue waiting
+ 800040c: e7f9 b.n 8000402 <__tx_ts_wait>
+
+0800040e <__tx_ts_ready>:
+
+ /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are
+ already in the handler! */
+
+__tx_ts_ready:
+ MOV r7, #0x08000000 // Build clear PendSV value
+ 800040e: f04f 6700 mov.w r7, #134217728 ; 0x8000000
+ MOV r8, #0xE000E000 // Build base NVIC address
+ 8000412: f04f 28e0 mov.w r8, #3758153728 ; 0xe000e000
+ STR r7, [r8, #0xD04] // Clear any PendSV
+ 8000416: f8c8 7d04 str.w r7, [r8, #3332] ; 0xd04
+
+ /* Re-enable interrupts and restore new thread. */
+
+ CPSIE i // Enable interrupts
+ 800041a: b662 cpsie i
+ B __tx_ts_restore // Restore the thread
+ 800041c: e7dc b.n 80003d8 <__tx_ts_restore>
+
+0800041e :
+tx_thread_fpu_disable:
+
+ /* Automatic VPF logic is supported, this function is present only for
+ backward compatibility purposes and therefore simply returns. */
+
+ BX LR // Return to caller
+ 800041e: 4770 bx lr
+ LDR r2, =_tx_thread_preempt_disable // Build address of preempt disable flag
+ 8000420: 240c0830 .word 0x240c0830
+ LDR r0, =_tx_thread_current_ptr // Build current thread pointer address
+ 8000424: 240c0798 .word 0x240c0798
+ LDR r2, =_tx_thread_execute_ptr // Build execute thread pointer address
+ 8000428: 240c079c .word 0x240c079c
+ LDR r4, =_tx_timer_time_slice // Build address of time-slice variable
+ 800042c: 240c0d9c .word 0x240c0d9c
+
+08000430 <_tx_thread_stack_build>:
+ pc Initial value for pc
+ xPSR Initial value for xPSR
+
+ Stack Bottom: (higher memory address) */
+
+ LDR r2, [r0, #16] // Pickup end of stack area
+ 8000430: 6902 ldr r2, [r0, #16]
+ BIC r2, r2, #0x7 // Align frame for 8-byte alignment
+ 8000432: f022 0207 bic.w r2, r2, #7
+ SUB r2, r2, #68 // Subtract frame size
+ 8000436: f1a2 0244 sub.w r2, r2, #68 ; 0x44
+ LDR r3, =0xFFFFFFFD // Build initial LR value
+ 800043a: f06f 0302 mvn.w r3, #2
+ STR r3, [r2, #0] // Save on the stack
+ 800043e: 6013 str r3, [r2, #0]
+
+ /* Actually build the stack frame. */
+
+ MOV r3, #0 // Build initial register value
+ 8000440: f04f 0300 mov.w r3, #0
+ STR r3, [r2, #4] // Store initial r4
+ 8000444: 6053 str r3, [r2, #4]
+ STR r3, [r2, #8] // Store initial r5
+ 8000446: 6093 str r3, [r2, #8]
+ STR r3, [r2, #12] // Store initial r6
+ 8000448: 60d3 str r3, [r2, #12]
+ STR r3, [r2, #16] // Store initial r7
+ 800044a: 6113 str r3, [r2, #16]
+ STR r3, [r2, #20] // Store initial r8
+ 800044c: 6153 str r3, [r2, #20]
+ STR r3, [r2, #24] // Store initial r9
+ 800044e: 6193 str r3, [r2, #24]
+ STR r3, [r2, #28] // Store initial r10
+ 8000450: 61d3 str r3, [r2, #28]
+ STR r3, [r2, #32] // Store initial r11
+ 8000452: 6213 str r3, [r2, #32]
+
+ /* Hardware stack follows. */
+
+ STR r3, [r2, #36] // Store initial r0
+ 8000454: 6253 str r3, [r2, #36] ; 0x24
+ STR r3, [r2, #40] // Store initial r1
+ 8000456: 6293 str r3, [r2, #40] ; 0x28
+ STR r3, [r2, #44] // Store initial r2
+ 8000458: 62d3 str r3, [r2, #44] ; 0x2c
+ STR r3, [r2, #48] // Store initial r3
+ 800045a: 6313 str r3, [r2, #48] ; 0x30
+ STR r3, [r2, #52] // Store initial r12
+ 800045c: 6353 str r3, [r2, #52] ; 0x34
+ MOV r3, #0xFFFFFFFF // Poison EXC_RETURN value
+ 800045e: f04f 33ff mov.w r3, #4294967295
+ STR r3, [r2, #56] // Store initial lr
+ 8000462: 6393 str r3, [r2, #56] ; 0x38
+ STR r1, [r2, #60] // Store initial pc
+ 8000464: 63d1 str r1, [r2, #60] ; 0x3c
+ MOV r3, #0x01000000 // Only T-bit need be set
+ 8000466: f04f 7380 mov.w r3, #16777216 ; 0x1000000
+ STR r3, [r2, #64] // Store initial xPSR
+ 800046a: 6413 str r3, [r2, #64] ; 0x40
+
+ /* Setup stack pointer. */
+ // thread_ptr -> tx_thread_stack_ptr = r2;
+
+ STR r2, [r0, #8] // Save stack pointer in thread's
+ 800046c: 6082 str r2, [r0, #8]
+ // control block
+ BX lr // Return to caller
+ 800046e: 4770 bx lr
+
+08000470 <_tx_timer_interrupt>:
+ for use. */
+
+ /* Increment the system clock. */
+ // _tx_timer_system_clock++;
+
+ LDR r1, =_tx_timer_system_clock // Pickup address of system clock
+ 8000470: 4922 ldr r1, [pc, #136] ; (80004fc <__tx_timer_nothing_expired+0x6>)
+ LDR r0, [r1, #0] // Pickup system clock
+ 8000472: 6808 ldr r0, [r1, #0]
+ ADD r0, r0, #1 // Increment system clock
+ 8000474: f100 0001 add.w r0, r0, #1
+ STR r0, [r1, #0] // Store new system clock
+ 8000478: 6008 str r0, [r1, #0]
+
+ /* Test for time-slice expiration. */
+ // if (_tx_timer_time_slice)
+ // {
+
+ LDR r3, =_tx_timer_time_slice // Pickup address of time-slice
+ 800047a: 4b21 ldr r3, [pc, #132] ; (8000500 <__tx_timer_nothing_expired+0xa>)
+ LDR r2, [r3, #0] // Pickup time-slice
+ 800047c: 681a ldr r2, [r3, #0]
+ CBZ r2, __tx_timer_no_time_slice // Is it non-active?
+ 800047e: b13a cbz r2, 8000490 <__tx_timer_no_time_slice>
+ // Yes, skip time-slice processing
+
+ /* Decrement the time_slice. */
+ // _tx_timer_time_slice--;
+
+ SUB r2, r2, #1 // Decrement the time-slice
+ 8000480: f1a2 0201 sub.w r2, r2, #1
+ STR r2, [r3, #0] // Store new time-slice value
+ 8000484: 601a str r2, [r3, #0]
+
+ /* Check for expiration. */
+ // if (__tx_timer_time_slice == 0)
+
+ CBNZ r2, __tx_timer_no_time_slice // Has it expired?
+ 8000486: b91a cbnz r2, 8000490 <__tx_timer_no_time_slice>
+ // No, skip expiration processing
+
+ /* Set the time-slice expired flag. */
+ // _tx_timer_expired_time_slice = TX_TRUE;
+
+ LDR r3, =_tx_timer_expired_time_slice // Pickup address of expired flag
+ 8000488: 4b1e ldr r3, [pc, #120] ; (8000504 <__tx_timer_nothing_expired+0xe>)
+ MOV r0, #1 // Build expired value
+ 800048a: f04f 0001 mov.w r0, #1
+ STR r0, [r3, #0] // Set time-slice expiration flag
+ 800048e: 6018 str r0, [r3, #0]
+
+08000490 <__tx_timer_no_time_slice>:
+
+ /* Test for timer expiration. */
+ // if (*_tx_timer_current_ptr)
+ // {
+
+ LDR r1, =_tx_timer_current_ptr // Pickup current timer pointer address
+ 8000490: 491d ldr r1, [pc, #116] ; (8000508 <__tx_timer_nothing_expired+0x12>)
+ LDR r0, [r1, #0] // Pickup current timer
+ 8000492: 6808 ldr r0, [r1, #0]
+ LDR r2, [r0, #0] // Pickup timer list entry
+ 8000494: 6802 ldr r2, [r0, #0]
+ CBZ r2, __tx_timer_no_timer // Is there anything in the list?
+ 8000496: b122 cbz r2, 80004a2 <__tx_timer_no_timer>
+ // No, just increment the timer
+
+ /* Set expiration flag. */
+ // _tx_timer_expired = TX_TRUE;
+
+ LDR r3, =_tx_timer_expired // Pickup expiration flag address
+ 8000498: 4b1c ldr r3, [pc, #112] ; (800050c <__tx_timer_nothing_expired+0x16>)
+ MOV r2, #1 // Build expired value
+ 800049a: f04f 0201 mov.w r2, #1
+ STR r2, [r3, #0] // Set expired flag
+ 800049e: 601a str r2, [r3, #0]
+ B __tx_timer_done // Finished timer processing
+ 80004a0: e008 b.n 80004b4 <__tx_timer_done>
+
+080004a2 <__tx_timer_no_timer>:
+__tx_timer_no_timer:
+
+ /* No timer expired, increment the timer pointer. */
+ // _tx_timer_current_ptr++;
+
+ ADD r0, r0, #4 // Move to next timer
+ 80004a2: f100 0004 add.w r0, r0, #4
+
+ /* Check for wrap-around. */
+ // if (_tx_timer_current_ptr == _tx_timer_list_end)
+
+ LDR r3, =_tx_timer_list_end // Pickup addr of timer list end
+ 80004a6: 4b1a ldr r3, [pc, #104] ; (8000510 <__tx_timer_nothing_expired+0x1a>)
+ LDR r2, [r3, #0] // Pickup list end
+ 80004a8: 681a ldr r2, [r3, #0]
+ CMP r0, r2 // Are we at list end?
+ 80004aa: 4290 cmp r0, r2
+ BNE __tx_timer_skip_wrap // No, skip wrap-around logic
+ 80004ac: d101 bne.n 80004b2 <__tx_timer_skip_wrap>
+
+ /* Wrap to beginning of list. */
+ // _tx_timer_current_ptr = _tx_timer_list_start;
+
+ LDR r3, =_tx_timer_list_start // Pickup addr of timer list start
+ 80004ae: 4b19 ldr r3, [pc, #100] ; (8000514 <__tx_timer_nothing_expired+0x1e>)
+ LDR r0, [r3, #0] // Set current pointer to list start
+ 80004b0: 6818 ldr r0, [r3, #0]
+
+080004b2 <__tx_timer_skip_wrap>:
+
+__tx_timer_skip_wrap:
+
+ STR r0, [r1, #0] // Store new current timer pointer
+ 80004b2: 6008 str r0, [r1, #0]
+
+080004b4 <__tx_timer_done>:
+
+ /* See if anything has expired. */
+ // if ((_tx_timer_expired_time_slice) || (_tx_timer_expired))
+ // {
+
+ LDR r3, =_tx_timer_expired_time_slice // Pickup addr of expired flag
+ 80004b4: 4b13 ldr r3, [pc, #76] ; (8000504 <__tx_timer_nothing_expired+0xe>)
+ LDR r2, [r3, #0] // Pickup time-slice expired flag
+ 80004b6: 681a ldr r2, [r3, #0]
+ CBNZ r2, __tx_something_expired // Did a time-slice expire?
+ 80004b8: b912 cbnz r2, 80004c0 <__tx_something_expired>
+ // If non-zero, time-slice expired
+ LDR r1, =_tx_timer_expired // Pickup addr of other expired flag
+ 80004ba: 4914 ldr r1, [pc, #80] ; (800050c <__tx_timer_nothing_expired+0x16>)
+ LDR r0, [r1, #0] // Pickup timer expired flag
+ 80004bc: 6808 ldr r0, [r1, #0]
+ CBZ r0, __tx_timer_nothing_expired // Did a timer expire?
+ 80004be: b1d0 cbz r0, 80004f6 <__tx_timer_nothing_expired>
+
+080004c0 <__tx_something_expired>:
+ // No, nothing expired
+
+__tx_something_expired:
+
+ STMDB sp!, {r0, lr} // Save the lr register on the stack
+ 80004c0: e92d 4001 stmdb sp!, {r0, lr}
+
+ /* Did a timer expire? */
+ // if (_tx_timer_expired)
+ // {
+
+ LDR r1, =_tx_timer_expired // Pickup addr of expired flag
+ 80004c4: 4911 ldr r1, [pc, #68] ; (800050c <__tx_timer_nothing_expired+0x16>)
+ LDR r0, [r1, #0] // Pickup timer expired flag
+ 80004c6: 6808 ldr r0, [r1, #0]
+ CBZ r0, __tx_timer_dont_activate // Check for timer expiration
+ 80004c8: b108 cbz r0, 80004ce <__tx_timer_dont_activate>
+ // If not set, skip timer activation
+
+ /* Process timer expiration. */
+ // _tx_timer_expiration_process();
+
+ BL _tx_timer_expiration_process // Call the timer expiration handling routine
+ 80004ca: f007 fcb3 bl 8007e34 <_tx_timer_expiration_process>
+
+080004ce <__tx_timer_dont_activate>:
+
+ /* Did time slice expire? */
+ // if (_tx_timer_expired_time_slice)
+ // {
+
+ LDR r3, =_tx_timer_expired_time_slice // Pickup addr of time-slice expired
+ 80004ce: 4b0d ldr r3, [pc, #52] ; (8000504 <__tx_timer_nothing_expired+0xe>)
+ LDR r2, [r3, #0] // Pickup the actual flag
+ 80004d0: 681a ldr r2, [r3, #0]
+ CBZ r2, __tx_timer_not_ts_expiration // See if the flag is set
+ 80004d2: b172 cbz r2, 80004f2 <__tx_timer_not_ts_expiration>
+ // No, skip time-slice processing
+
+ /* Time slice interrupted thread. */
+ // _tx_thread_time_slice();
+
+ BL _tx_thread_time_slice // Call time-slice processing
+ 80004d4: f007 fc20 bl 8007d18 <_tx_thread_time_slice>
+ LDR r0, =_tx_thread_preempt_disable // Build address of preempt disable flag
+ 80004d8: 480f ldr r0, [pc, #60] ; (8000518 <__tx_timer_nothing_expired+0x22>)
+ LDR r1, [r0] // Is the preempt disable flag set?
+ 80004da: 6801 ldr r1, [r0, #0]
+ CBNZ r1, __tx_timer_skip_time_slice // Yes, skip the PendSV logic
+ 80004dc: b949 cbnz r1, 80004f2 <__tx_timer_not_ts_expiration>
+ LDR r0, =_tx_thread_current_ptr // Build current thread pointer address
+ 80004de: 480f ldr r0, [pc, #60] ; (800051c <__tx_timer_nothing_expired+0x26>)
+ LDR r1, [r0] // Pickup the current thread pointer
+ 80004e0: 6801 ldr r1, [r0, #0]
+ LDR r2, =_tx_thread_execute_ptr // Build execute thread pointer address
+ 80004e2: 4a0f ldr r2, [pc, #60] ; (8000520 <__tx_timer_nothing_expired+0x2a>)
+ LDR r3, [r2] // Pickup the execute thread pointer
+ 80004e4: 6813 ldr r3, [r2, #0]
+ LDR r0, =0xE000ED04 // Build address of control register
+ 80004e6: 480f ldr r0, [pc, #60] ; (8000524 <__tx_timer_nothing_expired+0x2e>)
+ LDR r2, =0x10000000 // Build value for PendSV bit
+ 80004e8: f04f 5280 mov.w r2, #268435456 ; 0x10000000
+ CMP r1, r3 // Are they the same?
+ 80004ec: 4299 cmp r1, r3
+ BEQ __tx_timer_skip_time_slice // If the same, there was no time-slice performed
+ 80004ee: d000 beq.n 80004f2 <__tx_timer_not_ts_expiration>
+ STR r2, [r0] // Not the same, issue the PendSV for preemption
+ 80004f0: 6002 str r2, [r0, #0]
+
+080004f2 <__tx_timer_not_ts_expiration>:
+
+ // }
+
+__tx_timer_not_ts_expiration:
+
+ LDMIA sp!, {r0, lr} // Recover lr register (r0 is just there for
+ 80004f2: e8bd 4001 ldmia.w sp!, {r0, lr}
+
+080004f6 <__tx_timer_nothing_expired>:
+
+ // }
+
+__tx_timer_nothing_expired:
+
+ DSB // Complete all memory access
+ 80004f6: f3bf 8f4f dsb sy
+ BX lr // Return to caller
+ 80004fa: 4770 bx lr
+ LDR r1, =_tx_timer_system_clock // Pickup address of system clock
+ 80004fc: 240c083c .word 0x240c083c
+ LDR r3, =_tx_timer_time_slice // Pickup address of time-slice
+ 8000500: 240c0d9c .word 0x240c0d9c
+ LDR r3, =_tx_timer_expired_time_slice // Pickup address of expired flag
+ 8000504: 240c0840 .word 0x240c0840
+ LDR r1, =_tx_timer_current_ptr // Pickup current timer pointer address
+ 8000508: 240c08cc .word 0x240c08cc
+ LDR r3, =_tx_timer_expired // Pickup expiration flag address
+ 800050c: 240c08d0 .word 0x240c08d0
+ LDR r3, =_tx_timer_list_end // Pickup addr of timer list end
+ 8000510: 240c08c8 .word 0x240c08c8
+ LDR r3, =_tx_timer_list_start // Pickup addr of timer list start
+ 8000514: 240c08c4 .word 0x240c08c4
+ LDR r0, =_tx_thread_preempt_disable // Build address of preempt disable flag
+ 8000518: 240c0830 .word 0x240c0830
+ LDR r0, =_tx_thread_current_ptr // Build current thread pointer address
+ 800051c: 240c0798 .word 0x240c0798
+ LDR r2, =_tx_thread_execute_ptr // Build execute thread pointer address
+ 8000520: 240c079c .word 0x240c079c
+ LDR r0, =0xE000ED04 // Build address of control register
+ 8000524: e000ed04 .word 0xe000ed04
+ ...
+
+08000530 :
+ 8000530: f001 01ff and.w r1, r1, #255 ; 0xff
+ 8000534: 2a10 cmp r2, #16
+ 8000536: db2b blt.n 8000590
+ 8000538: f010 0f07 tst.w r0, #7
+ 800053c: d008 beq.n 8000550
+ 800053e: f810 3b01 ldrb.w r3, [r0], #1
+ 8000542: 3a01 subs r2, #1
+ 8000544: 428b cmp r3, r1
+ 8000546: d02d beq.n 80005a4
+ 8000548: f010 0f07 tst.w r0, #7
+ 800054c: b342 cbz r2, 80005a0
+ 800054e: d1f6 bne.n 800053e
+ 8000550: b4f0 push {r4, r5, r6, r7}
+ 8000552: ea41 2101 orr.w r1, r1, r1, lsl #8
+ 8000556: ea41 4101 orr.w r1, r1, r1, lsl #16
+ 800055a: f022 0407 bic.w r4, r2, #7
+ 800055e: f07f 0700 mvns.w r7, #0
+ 8000562: 2300 movs r3, #0
+ 8000564: e8f0 5602 ldrd r5, r6, [r0], #8
+ 8000568: 3c08 subs r4, #8
+ 800056a: ea85 0501 eor.w r5, r5, r1
+ 800056e: ea86 0601 eor.w r6, r6, r1
+ 8000572: fa85 f547 uadd8 r5, r5, r7
+ 8000576: faa3 f587 sel r5, r3, r7
+ 800057a: fa86 f647 uadd8 r6, r6, r7
+ 800057e: faa5 f687 sel r6, r5, r7
+ 8000582: b98e cbnz r6, 80005a8
+ 8000584: d1ee bne.n 8000564
+ 8000586: bcf0 pop {r4, r5, r6, r7}
+ 8000588: f001 01ff and.w r1, r1, #255 ; 0xff
+ 800058c: f002 0207 and.w r2, r2, #7
+ 8000590: b132 cbz r2, 80005a0
+ 8000592: f810 3b01 ldrb.w r3, [r0], #1
+ 8000596: 3a01 subs r2, #1
+ 8000598: ea83 0301 eor.w r3, r3, r1
+ 800059c: b113 cbz r3, 80005a4
+ 800059e: d1f8 bne.n 8000592
+ 80005a0: 2000 movs r0, #0
+ 80005a2: 4770 bx lr
+ 80005a4: 3801 subs r0, #1
+ 80005a6: 4770 bx lr
+ 80005a8: 2d00 cmp r5, #0
+ 80005aa: bf06 itte eq
+ 80005ac: 4635 moveq r5, r6
+ 80005ae: 3803 subeq r0, #3
+ 80005b0: 3807 subne r0, #7
+ 80005b2: f015 0f01 tst.w r5, #1
+ 80005b6: d107 bne.n 80005c8
+ 80005b8: 3001 adds r0, #1
+ 80005ba: f415 7f80 tst.w r5, #256 ; 0x100
+ 80005be: bf02 ittt eq
+ 80005c0: 3001 addeq r0, #1
+ 80005c2: f415 3fc0 tsteq.w r5, #98304 ; 0x18000
+ 80005c6: 3001 addeq r0, #1
+ 80005c8: bcf0 pop {r4, r5, r6, r7}
+ 80005ca: 3801 subs r0, #1
+ 80005cc: 4770 bx lr
+ 80005ce: bf00 nop
+
+080005d0 :
+ * @brief Define the initial system.
+ * @param first_unused_memory : Pointer to the first unused memory
+ * @retval None
+ */
+VOID tx_application_define(VOID *first_unused_memory)
+{
+ 80005d0: b580 push {r7, lr}
+ 80005d2: b086 sub sp, #24
+ 80005d4: af02 add r7, sp, #8
+ 80005d6: 6078 str r0, [r7, #4]
+ /* USER CODE BEGIN tx_application_define_1*/
+
+ /* USER CODE END tx_application_define_1 */
+#if (USE_STATIC_ALLOCATION == 1)
+ UINT status = TX_SUCCESS;
+ 80005d8: 2300 movs r3, #0
+ 80005da: 60fb str r3, [r7, #12]
+ VOID *memory_ptr;
+
+ if (tx_byte_pool_create(&tx_app_byte_pool, "Tx App memory pool", tx_byte_pool_buffer, TX_APP_MEM_POOL_SIZE) != TX_SUCCESS)
+ 80005dc: 2334 movs r3, #52 ; 0x34
+ 80005de: 9300 str r3, [sp, #0]
+ 80005e0: f44f 5380 mov.w r3, #4096 ; 0x1000
+ 80005e4: 4a0a ldr r2, [pc, #40] ; (8000610 )
+ 80005e6: 490b ldr r1, [pc, #44] ; (8000614 )
+ 80005e8: 480b ldr r0, [pc, #44] ; (8000618 )
+ 80005ea: f007 fecd bl 8008388 <_txe_byte_pool_create>
+ 80005ee: 4603 mov r3, r0
+ 80005f0: 2b00 cmp r3, #0
+ 80005f2: d109 bne.n 8000608
+ {
+ /* USER CODE BEGIN TX_Byte_Pool_Success */
+
+ /* USER CODE END TX_Byte_Pool_Success */
+
+ memory_ptr = (VOID *)&tx_app_byte_pool;
+ 80005f4: 4b08 ldr r3, [pc, #32] ; (8000618 )
+ 80005f6: 60bb str r3, [r7, #8]
+ status = App_ThreadX_Init(memory_ptr);
+ 80005f8: 68b8 ldr r0, [r7, #8]
+ 80005fa: f000 f80f bl 800061c
+ 80005fe: 60f8 str r0, [r7, #12]
+ if (status != TX_SUCCESS)
+ 8000600: 68fb ldr r3, [r7, #12]
+ 8000602: 2b00 cmp r3, #0
+ 8000604: d000 beq.n 8000608
+ {
+ /* USER CODE BEGIN App_ThreadX_Init_Error */
+ while(1)
+ 8000606: e7fe b.n 8000606
+ /* USER CODE BEGIN DYNAMIC_MEM_ALLOC */
+ (void)first_unused_memory;
+ /* USER CODE END DYNAMIC_MEM_ALLOC */
+#endif
+
+}
+ 8000608: bf00 nop
+ 800060a: 3710 adds r7, #16
+ 800060c: 46bd mov sp, r7
+ 800060e: bd80 pop {r7, pc}
+ 8000610: 240bf4fc .word 0x240bf4fc
+ 8000614: 0801deb8 .word 0x0801deb8
+ 8000618: 240c04fc .word 0x240c04fc
+
+0800061c :
+ * @brief Application ThreadX Initialization.
+ * @param memory_ptr: memory pointer
+ * @retval int
+ */
+UINT App_ThreadX_Init(VOID *memory_ptr)
+{
+ 800061c: b580 push {r7, lr}
+ 800061e: b084 sub sp, #16
+ 8000620: af00 add r7, sp, #0
+ 8000622: 6078 str r0, [r7, #4]
+ UINT ret = TX_SUCCESS;
+ 8000624: 2300 movs r3, #0
+ 8000626: 60fb str r3, [r7, #12]
+ TX_BYTE_POOL *byte_pool = (TX_BYTE_POOL*)memory_ptr;
+ 8000628: 687b ldr r3, [r7, #4]
+ 800062a: 60bb str r3, [r7, #8]
+ /* USER CODE BEGIN App_ThreadX_MEM_POOL */
+ (void)byte_pool;
+ /* USER CODE END App_ThreadX_MEM_POOL */
+
+ /* USER CODE BEGIN App_ThreadX_Init */
+ MX_TouchGFX_Init(memory_ptr);
+ 800062c: 6878 ldr r0, [r7, #4]
+ 800062e: f008 fa7f bl 8008b30
+ /* USER CODE END App_ThreadX_Init */
+
+ return ret;
+ 8000632: 68fb ldr r3, [r7, #12]
+}
+ 8000634: 4618 mov r0, r3
+ 8000636: 3710 adds r7, #16
+ 8000638: 46bd mov sp, r7
+ 800063a: bd80 pop {r7, pc}
+
+0800063c :
+ * @brief MX_ThreadX_Init
+ * @param None
+ * @retval None
+ */
+void MX_ThreadX_Init(void)
+{
+ 800063c: b580 push {r7, lr}
+ 800063e: af00 add r7, sp, #0
+ /* USER CODE BEGIN Before_Kernel_Start */
+
+ /* USER CODE END Before_Kernel_Start */
+
+ tx_kernel_enter();
+ 8000640: f006 f9cc bl 80069dc <_tx_initialize_kernel_enter>
+
+ /* USER CODE BEGIN Kernel_Start_Error */
+
+ /* USER CODE END Kernel_Start_Error */
+}
+ 8000644: bf00 nop
+ 8000646: bd80 pop {r7, pc}
+
+08000648 :
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ 8000648: b580 push {r7, lr}
+ 800064a: af00 add r7, sp, #0
+ /* USER CODE END 1 */
+
+ /* MCU Configuration--------------------------------------------------------*/
+
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+ 800064c: f001 f936 bl 80018bc
+ /* USER CODE BEGIN Init */
+
+ /* USER CODE END Init */
+
+ /* Configure the system clock */
+ SystemClock_Config();
+ 8000650: f000 f812 bl 8000678
+ /* USER CODE BEGIN SysInit */
+
+ /* USER CODE END SysInit */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ 8000654: f000 fa18 bl 8000a88
+ MX_I2C4_Init();
+ 8000658: f000 f8f2 bl 8000840
+ MX_LTDC_Init();
+ 800065c: f000 f930 bl 80008c0
+ MX_OCTOSPI1_Init();
+ 8000660: f000 f9b0 bl 80009c4
+ MX_CRC_Init();
+ 8000664: f000 f890 bl 8000788
+ MX_DMA2D_Init();
+ 8000668: f000 f8b0 bl 80007cc
+ /* Call PreOsInit function */
+ MX_TouchGFX_PreOSInit();
+ 800066c: f008 fa58 bl 8008b20
+ /* USER CODE BEGIN 2 */
+
+ /* USER CODE END 2 */
+
+ MX_ThreadX_Init();
+ 8000670: f7ff ffe4 bl 800063c
+
+ /* We should never get here as control is now taken by the scheduler */
+ /* Infinite loop */
+ /* USER CODE BEGIN WHILE */
+ while (1)
+ 8000674: e7fe b.n 8000674
+ ...
+
+08000678 :
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ 8000678: b580 push {r7, lr}
+ 800067a: b09c sub sp, #112 ; 0x70
+ 800067c: af00 add r7, sp, #0
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ 800067e: f107 0324 add.w r3, r7, #36 ; 0x24
+ 8000682: 224c movs r2, #76 ; 0x4c
+ 8000684: 2100 movs r1, #0
+ 8000686: 4618 mov r0, r3
+ 8000688: f01c fbe6 bl 801ce58
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ 800068c: 1d3b adds r3, r7, #4
+ 800068e: 2220 movs r2, #32
+ 8000690: 2100 movs r1, #0
+ 8000692: 4618 mov r0, r3
+ 8000694: f01c fbe0 bl 801ce58
+
+ /*AXI clock gating */
+ RCC->CKGAENR = 0xFFFFFFFF;
+ 8000698: 4b39 ldr r3, [pc, #228] ; (8000780 )
+ 800069a: f04f 32ff mov.w r2, #4294967295
+ 800069e: f8c3 20b0 str.w r2, [r3, #176] ; 0xb0
+
+ /** Supply configuration update enable
+ */
+ HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);
+ 80006a2: 2004 movs r0, #4
+ 80006a4: f003 faa6 bl 8003bf4
+
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
+ 80006a8: 2300 movs r3, #0
+ 80006aa: 603b str r3, [r7, #0]
+ 80006ac: 4b35 ldr r3, [pc, #212] ; (8000784 )
+ 80006ae: 699b ldr r3, [r3, #24]
+ 80006b0: 4a34 ldr r2, [pc, #208] ; (8000784 )
+ 80006b2: f443 4340 orr.w r3, r3, #49152 ; 0xc000
+ 80006b6: 6193 str r3, [r2, #24]
+ 80006b8: 4b32 ldr r3, [pc, #200] ; (8000784 )
+ 80006ba: 699b ldr r3, [r3, #24]
+ 80006bc: f403 4340 and.w r3, r3, #49152 ; 0xc000
+ 80006c0: 603b str r3, [r7, #0]
+ 80006c2: 683b ldr r3, [r7, #0]
+
+ while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
+ 80006c4: bf00 nop
+ 80006c6: 4b2f ldr r3, [pc, #188] ; (8000784 )
+ 80006c8: 699b ldr r3, [r3, #24]
+ 80006ca: f403 5300 and.w r3, r3, #8192 ; 0x2000
+ 80006ce: f5b3 5f00 cmp.w r3, #8192 ; 0x2000
+ 80006d2: d1f8 bne.n 80006c6
+
+ /** Macro to configure the PLL clock source
+ */
+ __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);
+ 80006d4: 4b2a ldr r3, [pc, #168] ; (8000780 )
+ 80006d6: 6a9b ldr r3, [r3, #40] ; 0x28
+ 80006d8: f023 0303 bic.w r3, r3, #3
+ 80006dc: 4a28 ldr r2, [pc, #160] ; (8000780 )
+ 80006de: f043 0302 orr.w r3, r3, #2
+ 80006e2: 6293 str r3, [r2, #40] ; 0x28
+
+ /** Initializes the RCC Oscillators according to the specified parameters
+ * in the RCC_OscInitTypeDef structure.
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;
+ 80006e4: 2303 movs r3, #3
+ 80006e6: 627b str r3, [r7, #36] ; 0x24
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ 80006e8: f44f 3380 mov.w r3, #65536 ; 0x10000
+ 80006ec: 62bb str r3, [r7, #40] ; 0x28
+ RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
+ 80006ee: 2301 movs r3, #1
+ 80006f0: 633b str r3, [r7, #48] ; 0x30
+ RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+ 80006f2: 2340 movs r3, #64 ; 0x40
+ 80006f4: 637b str r3, [r7, #52] ; 0x34
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ 80006f6: 2302 movs r3, #2
+ 80006f8: 64bb str r3, [r7, #72] ; 0x48
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ 80006fa: 2302 movs r3, #2
+ 80006fc: 64fb str r3, [r7, #76] ; 0x4c
+ RCC_OscInitStruct.PLL.PLLM = 12;
+ 80006fe: 230c movs r3, #12
+ 8000700: 653b str r3, [r7, #80] ; 0x50
+ RCC_OscInitStruct.PLL.PLLN = 280;
+ 8000702: f44f 738c mov.w r3, #280 ; 0x118
+ 8000706: 657b str r3, [r7, #84] ; 0x54
+ RCC_OscInitStruct.PLL.PLLP = 2;
+ 8000708: 2302 movs r3, #2
+ 800070a: 65bb str r3, [r7, #88] ; 0x58
+ RCC_OscInitStruct.PLL.PLLQ = 3;
+ 800070c: 2303 movs r3, #3
+ 800070e: 65fb str r3, [r7, #92] ; 0x5c
+ RCC_OscInitStruct.PLL.PLLR = 4;
+ 8000710: 2304 movs r3, #4
+ 8000712: 663b str r3, [r7, #96] ; 0x60
+ RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_1;
+ 8000714: 2304 movs r3, #4
+ 8000716: 667b str r3, [r7, #100] ; 0x64
+ RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
+ 8000718: 2300 movs r3, #0
+ 800071a: 66bb str r3, [r7, #104] ; 0x68
+ RCC_OscInitStruct.PLL.PLLFRACN = 0;
+ 800071c: 2300 movs r3, #0
+ 800071e: 66fb str r3, [r7, #108] ; 0x6c
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ 8000720: f107 0324 add.w r3, r7, #36 ; 0x24
+ 8000724: 4618 mov r0, r3
+ 8000726: f003 fabf bl 8003ca8
+ 800072a: 4603 mov r3, r0
+ 800072c: 2b00 cmp r3, #0
+ 800072e: d001 beq.n 8000734
+ {
+ Error_Handler();
+ 8000730: f000 fbe6 bl 8000f00
+ }
+
+ /** Initializes the CPU, AHB and APB buses clocks
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ 8000734: 233f movs r3, #63 ; 0x3f
+ 8000736: 607b str r3, [r7, #4]
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
+ |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ 8000738: 2303 movs r3, #3
+ 800073a: 60bb str r3, [r7, #8]
+ RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
+ 800073c: 2300 movs r3, #0
+ 800073e: 60fb str r3, [r7, #12]
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
+ 8000740: 2308 movs r3, #8
+ 8000742: 613b str r3, [r7, #16]
+ RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
+ 8000744: 2340 movs r3, #64 ; 0x40
+ 8000746: 617b str r3, [r7, #20]
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
+ 8000748: 2340 movs r3, #64 ; 0x40
+ 800074a: 61bb str r3, [r7, #24]
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
+ 800074c: f44f 6380 mov.w r3, #1024 ; 0x400
+ 8000750: 61fb str r3, [r7, #28]
+ RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
+ 8000752: 2340 movs r3, #64 ; 0x40
+ 8000754: 623b str r3, [r7, #32]
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
+ 8000756: 1d3b adds r3, r7, #4
+ 8000758: 2103 movs r1, #3
+ 800075a: 4618 mov r0, r3
+ 800075c: f003 fea8 bl 80044b0
+ 8000760: 4603 mov r3, r0
+ 8000762: 2b00 cmp r3, #0
+ 8000764: d001 beq.n 800076a
+ {
+ Error_Handler();
+ 8000766: f000 fbcb bl 8000f00
+ }
+ HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1);
+ 800076a: f44f 2280 mov.w r2, #262144 ; 0x40000
+ 800076e: 2100 movs r1, #0
+ 8000770: 2000 movs r0, #0
+ 8000772: f004 f853 bl 800481c
+}
+ 8000776: bf00 nop
+ 8000778: 3770 adds r7, #112 ; 0x70
+ 800077a: 46bd mov sp, r7
+ 800077c: bd80 pop {r7, pc}
+ 800077e: bf00 nop
+ 8000780: 58024400 .word 0x58024400
+ 8000784: 58024800 .word 0x58024800
+
+08000788 :
+ * @brief CRC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_CRC_Init(void)
+{
+ 8000788: b580 push {r7, lr}
+ 800078a: af00 add r7, sp, #0
+ /* USER CODE END CRC_Init 0 */
+
+ /* USER CODE BEGIN CRC_Init 1 */
+
+ /* USER CODE END CRC_Init 1 */
+ hcrc.Instance = CRC;
+ 800078c: 4b0d ldr r3, [pc, #52] ; (80007c4 )
+ 800078e: 4a0e ldr r2, [pc, #56] ; (80007c8 )
+ 8000790: 601a str r2, [r3, #0]
+ hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;
+ 8000792: 4b0c ldr r3, [pc, #48] ; (80007c4 )
+ 8000794: 2200 movs r2, #0
+ 8000796: 711a strb r2, [r3, #4]
+ hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
+ 8000798: 4b0a ldr r3, [pc, #40] ; (80007c4 )
+ 800079a: 2200 movs r2, #0
+ 800079c: 715a strb r2, [r3, #5]
+ hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
+ 800079e: 4b09 ldr r3, [pc, #36] ; (80007c4 )
+ 80007a0: 2200 movs r2, #0
+ 80007a2: 615a str r2, [r3, #20]
+ hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
+ 80007a4: 4b07 ldr r3, [pc, #28] ; (80007c4 )
+ 80007a6: 2200 movs r2, #0
+ 80007a8: 619a str r2, [r3, #24]
+ hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
+ 80007aa: 4b06 ldr r3, [pc, #24] ; (80007c4 )
+ 80007ac: 2201 movs r2, #1
+ 80007ae: 621a str r2, [r3, #32]
+ if (HAL_CRC_Init(&hcrc) != HAL_OK)
+ 80007b0: 4804 ldr r0, [pc, #16] ; (80007c4 )
+ 80007b2: f001 f9bf bl 8001b34
+ 80007b6: 4603 mov r3, r0
+ 80007b8: 2b00 cmp r3, #0
+ 80007ba: d001 beq.n 80007c0
+ {
+ Error_Handler();
+ 80007bc: f000 fba0 bl 8000f00
+ }
+ /* USER CODE BEGIN CRC_Init 2 */
+
+ /* USER CODE END CRC_Init 2 */
+
+}
+ 80007c0: bf00 nop
+ 80007c2: bd80 pop {r7, pc}
+ 80007c4: 240c0530 .word 0x240c0530
+ 80007c8: 40023000 .word 0x40023000
+
+080007cc :
+ * @brief DMA2D Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_DMA2D_Init(void)
+{
+ 80007cc: b580 push {r7, lr}
+ 80007ce: af00 add r7, sp, #0
+ /* USER CODE END DMA2D_Init 0 */
+
+ /* USER CODE BEGIN DMA2D_Init 1 */
+
+ /* USER CODE END DMA2D_Init 1 */
+ hdma2d.Instance = DMA2D;
+ 80007d0: 4b19 ldr r3, [pc, #100] ; (8000838 )
+ 80007d2: 4a1a ldr r2, [pc, #104] ; (800083c )
+ 80007d4: 601a str r2, [r3, #0]
+ hdma2d.Init.Mode = DMA2D_M2M;
+ 80007d6: 4b18 ldr r3, [pc, #96] ; (8000838 )
+ 80007d8: 2200 movs r2, #0
+ 80007da: 605a str r2, [r3, #4]
+ hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565;
+ 80007dc: 4b16 ldr r3, [pc, #88] ; (8000838 )
+ 80007de: 2202 movs r2, #2
+ 80007e0: 609a str r2, [r3, #8]
+ hdma2d.Init.OutputOffset = 0;
+ 80007e2: 4b15 ldr r3, [pc, #84] ; (8000838 )
+ 80007e4: 2200 movs r2, #0
+ 80007e6: 60da str r2, [r3, #12]
+ hdma2d.LayerCfg[1].InputOffset = 0;
+ 80007e8: 4b13 ldr r3, [pc, #76] ; (8000838 )
+ 80007ea: 2200 movs r2, #0
+ 80007ec: 645a str r2, [r3, #68] ; 0x44
+ hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB565;
+ 80007ee: 4b12 ldr r3, [pc, #72] ; (8000838 )
+ 80007f0: 2202 movs r2, #2
+ 80007f2: 649a str r2, [r3, #72] ; 0x48
+ hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
+ 80007f4: 4b10 ldr r3, [pc, #64] ; (8000838 )
+ 80007f6: 2200 movs r2, #0
+ 80007f8: 64da str r2, [r3, #76] ; 0x4c
+ hdma2d.LayerCfg[1].InputAlpha = 0;
+ 80007fa: 4b0f ldr r3, [pc, #60] ; (8000838 )
+ 80007fc: 2200 movs r2, #0
+ 80007fe: 651a str r2, [r3, #80] ; 0x50
+ hdma2d.LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA;
+ 8000800: 4b0d ldr r3, [pc, #52] ; (8000838 )
+ 8000802: 2200 movs r2, #0
+ 8000804: 655a str r2, [r3, #84] ; 0x54
+ hdma2d.LayerCfg[1].RedBlueSwap = DMA2D_RB_REGULAR;
+ 8000806: 4b0c ldr r3, [pc, #48] ; (8000838 )
+ 8000808: 2200 movs r2, #0
+ 800080a: 659a str r2, [r3, #88] ; 0x58
+ hdma2d.LayerCfg[1].ChromaSubSampling = DMA2D_NO_CSS;
+ 800080c: 4b0a ldr r3, [pc, #40] ; (8000838 )
+ 800080e: 2200 movs r2, #0
+ 8000810: 65da str r2, [r3, #92] ; 0x5c
+ if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
+ 8000812: 4809 ldr r0, [pc, #36] ; (8000838 )
+ 8000814: f001 fa78 bl 8001d08
+ 8000818: 4603 mov r3, r0
+ 800081a: 2b00 cmp r3, #0
+ 800081c: d001 beq.n 8000822
+ {
+ Error_Handler();
+ 800081e: f000 fb6f bl 8000f00
+ }
+ if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)
+ 8000822: 2101 movs r1, #1
+ 8000824: 4804 ldr r0, [pc, #16] ; (8000838 )
+ 8000826: f001 fbe3 bl 8001ff0
+ 800082a: 4603 mov r3, r0
+ 800082c: 2b00 cmp r3, #0
+ 800082e: d001 beq.n 8000834
+ {
+ Error_Handler();
+ 8000830: f000 fb66 bl 8000f00
+ }
+ /* USER CODE BEGIN DMA2D_Init 2 */
+
+ /* USER CODE END DMA2D_Init 2 */
+
+}
+ 8000834: bf00 nop
+ 8000836: bd80 pop {r7, pc}
+ 8000838: 240c0554 .word 0x240c0554
+ 800083c: 52001000 .word 0x52001000
+
+08000840 :
+ * @brief I2C4 Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_I2C4_Init(void)
+{
+ 8000840: b580 push {r7, lr}
+ 8000842: af00 add r7, sp, #0
+ /* USER CODE END I2C4_Init 0 */
+
+ /* USER CODE BEGIN I2C4_Init 1 */
+
+ /* USER CODE END I2C4_Init 1 */
+ hi2c4.Instance = I2C4;
+ 8000844: 4b1b ldr r3, [pc, #108] ; (80008b4 )
+ 8000846: 4a1c ldr r2, [pc, #112] ; (80008b8 )
+ 8000848: 601a str r2, [r3, #0]
+ hi2c4.Init.Timing = 0xC010151E;
+ 800084a: 4b1a ldr r3, [pc, #104] ; (80008b4 )
+ 800084c: 4a1b ldr r2, [pc, #108] ; (80008bc )
+ 800084e: 605a str r2, [r3, #4]
+ hi2c4.Init.OwnAddress1 = 0;
+ 8000850: 4b18 ldr r3, [pc, #96] ; (80008b4 )
+ 8000852: 2200 movs r2, #0
+ 8000854: 609a str r2, [r3, #8]
+ hi2c4.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
+ 8000856: 4b17 ldr r3, [pc, #92] ; (80008b4 )
+ 8000858: 2201 movs r2, #1
+ 800085a: 60da str r2, [r3, #12]
+ hi2c4.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
+ 800085c: 4b15 ldr r3, [pc, #84] ; (80008b4 )
+ 800085e: 2200 movs r2, #0
+ 8000860: 611a str r2, [r3, #16]
+ hi2c4.Init.OwnAddress2 = 0;
+ 8000862: 4b14 ldr r3, [pc, #80] ; (80008b4 )
+ 8000864: 2200 movs r2, #0
+ 8000866: 615a str r2, [r3, #20]
+ hi2c4.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
+ 8000868: 4b12 ldr r3, [pc, #72] ; (80008b4 )
+ 800086a: 2200 movs r2, #0
+ 800086c: 619a str r2, [r3, #24]
+ hi2c4.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
+ 800086e: 4b11 ldr r3, [pc, #68] ; (80008b4 )
+ 8000870: 2200 movs r2, #0
+ 8000872: 61da str r2, [r3, #28]
+ hi2c4.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
+ 8000874: 4b0f ldr r3, [pc, #60] ; (80008b4 )
+ 8000876: 2200 movs r2, #0
+ 8000878: 621a str r2, [r3, #32]
+ if (HAL_I2C_Init(&hi2c4) != HAL_OK)
+ 800087a: 480e ldr r0, [pc, #56] ; (80008b4 )
+ 800087c: f001 fe54 bl 8002528
+ 8000880: 4603 mov r3, r0
+ 8000882: 2b00 cmp r3, #0
+ 8000884: d001 beq.n 800088a
+ {
+ Error_Handler();
+ 8000886: f000 fb3b bl 8000f00
+ }
+
+ /** Configure Analogue filter
+ */
+ if (HAL_I2CEx_ConfigAnalogFilter(&hi2c4, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
+ 800088a: 2100 movs r1, #0
+ 800088c: 4809 ldr r0, [pc, #36] ; (80008b4 )
+ 800088e: f001 fedb bl 8002648
+ 8000892: 4603 mov r3, r0
+ 8000894: 2b00 cmp r3, #0
+ 8000896: d001 beq.n 800089c
+ {
+ Error_Handler();
+ 8000898: f000 fb32 bl 8000f00
+ }
+
+ /** Configure Digital filter
+ */
+ if (HAL_I2CEx_ConfigDigitalFilter(&hi2c4, 0) != HAL_OK)
+ 800089c: 2100 movs r1, #0
+ 800089e: 4805 ldr r0, [pc, #20] ; (80008b4 )
+ 80008a0: f001 ff1d bl 80026de
+ 80008a4: 4603 mov r3, r0
+ 80008a6: 2b00 cmp r3, #0
+ 80008a8: d001 beq.n 80008ae
+ {
+ Error_Handler();
+ 80008aa: f000 fb29 bl 8000f00
+ }
+ /* USER CODE BEGIN I2C4_Init 2 */
+
+ /* USER CODE END I2C4_Init 2 */
+
+}
+ 80008ae: bf00 nop
+ 80008b0: bd80 pop {r7, pc}
+ 80008b2: bf00 nop
+ 80008b4: 240c05bc .word 0x240c05bc
+ 80008b8: 58001c00 .word 0x58001c00
+ 80008bc: c010151e .word 0xc010151e
+
+080008c0 :
+ * @brief LTDC Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_LTDC_Init(void)
+{
+ 80008c0: b580 push {r7, lr}
+ 80008c2: b08e sub sp, #56 ; 0x38
+ 80008c4: af00 add r7, sp, #0
+
+ /* USER CODE BEGIN LTDC_Init 0 */
+
+ /* USER CODE END LTDC_Init 0 */
+
+ LTDC_LayerCfgTypeDef pLayerCfg = {0};
+ 80008c6: 1d3b adds r3, r7, #4
+ 80008c8: 2234 movs r2, #52 ; 0x34
+ 80008ca: 2100 movs r1, #0
+ 80008cc: 4618 mov r0, r3
+ 80008ce: f01c fac3 bl 801ce58
+
+ /* USER CODE BEGIN LTDC_Init 1 */
+
+ /* USER CODE END LTDC_Init 1 */
+ hltdc.Instance = LTDC;
+ 80008d2: 4b3a ldr r3, [pc, #232] ; (80009bc )
+ 80008d4: 4a3a ldr r2, [pc, #232] ; (80009c0 )
+ 80008d6: 601a str r2, [r3, #0]
+ hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
+ 80008d8: 4b38 ldr r3, [pc, #224] ; (80009bc )
+ 80008da: 2200 movs r2, #0
+ 80008dc: 605a str r2, [r3, #4]
+ hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
+ 80008de: 4b37 ldr r3, [pc, #220] ; (80009bc )
+ 80008e0: 2200 movs r2, #0
+ 80008e2: 609a str r2, [r3, #8]
+ hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
+ 80008e4: 4b35 ldr r3, [pc, #212] ; (80009bc )
+ 80008e6: 2200 movs r2, #0
+ 80008e8: 60da str r2, [r3, #12]
+ hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
+ 80008ea: 4b34 ldr r3, [pc, #208] ; (80009bc )
+ 80008ec: 2200 movs r2, #0
+ 80008ee: 611a str r2, [r3, #16]
+ hltdc.Init.HorizontalSync = 40;
+ 80008f0: 4b32 ldr r3, [pc, #200] ; (80009bc )
+ 80008f2: 2228 movs r2, #40 ; 0x28
+ 80008f4: 615a str r2, [r3, #20]
+ hltdc.Init.VerticalSync = 9;
+ 80008f6: 4b31 ldr r3, [pc, #196] ; (80009bc )
+ 80008f8: 2209 movs r2, #9
+ 80008fa: 619a str r2, [r3, #24]
+ hltdc.Init.AccumulatedHBP = 42;
+ 80008fc: 4b2f ldr r3, [pc, #188] ; (80009bc )
+ 80008fe: 222a movs r2, #42 ; 0x2a
+ 8000900: 61da str r2, [r3, #28]
+ hltdc.Init.AccumulatedVBP = 11;
+ 8000902: 4b2e ldr r3, [pc, #184] ; (80009bc )
+ 8000904: 220b movs r2, #11
+ 8000906: 621a str r2, [r3, #32]
+ hltdc.Init.AccumulatedActiveW = 522;
+ 8000908: 4b2c ldr r3, [pc, #176] ; (80009bc )
+ 800090a: f240 220a movw r2, #522 ; 0x20a
+ 800090e: 625a str r2, [r3, #36] ; 0x24
+ hltdc.Init.AccumulatedActiveH = 283;
+ 8000910: 4b2a ldr r3, [pc, #168] ; (80009bc )
+ 8000912: f240 121b movw r2, #283 ; 0x11b
+ 8000916: 629a str r2, [r3, #40] ; 0x28
+ hltdc.Init.TotalWidth = 554;
+ 8000918: 4b28 ldr r3, [pc, #160] ; (80009bc )
+ 800091a: f240 222a movw r2, #554 ; 0x22a
+ 800091e: 62da str r2, [r3, #44] ; 0x2c
+ hltdc.Init.TotalHeigh = 285;
+ 8000920: 4b26 ldr r3, [pc, #152] ; (80009bc )
+ 8000922: f240 121d movw r2, #285 ; 0x11d
+ 8000926: 631a str r2, [r3, #48] ; 0x30
+ hltdc.Init.Backcolor.Blue = 0;
+ 8000928: 4b24 ldr r3, [pc, #144] ; (80009bc )
+ 800092a: 2200 movs r2, #0
+ 800092c: f883 2034 strb.w r2, [r3, #52] ; 0x34
+ hltdc.Init.Backcolor.Green = 0;
+ 8000930: 4b22 ldr r3, [pc, #136] ; (80009bc )
+ 8000932: 2200 movs r2, #0
+ 8000934: f883 2035 strb.w r2, [r3, #53] ; 0x35
+ hltdc.Init.Backcolor.Red = 0;
+ 8000938: 4b20 ldr r3, [pc, #128] ; (80009bc )
+ 800093a: 2200 movs r2, #0
+ 800093c: f883 2036 strb.w r2, [r3, #54] ; 0x36
+ if (HAL_LTDC_Init(&hltdc) != HAL_OK)
+ 8000940: 481e ldr r0, [pc, #120] ; (80009bc )
+ 8000942: f001 ff19 bl 8002778
+ 8000946: 4603 mov r3, r0
+ 8000948: 2b00 cmp r3, #0
+ 800094a: d001 beq.n 8000950
+ {
+ Error_Handler();
+ 800094c: f000 fad8 bl 8000f00
+ }
+ pLayerCfg.WindowX0 = 0;
+ 8000950: 2300 movs r3, #0
+ 8000952: 607b str r3, [r7, #4]
+ pLayerCfg.WindowX1 = 480;
+ 8000954: f44f 73f0 mov.w r3, #480 ; 0x1e0
+ 8000958: 60bb str r3, [r7, #8]
+ pLayerCfg.WindowY0 = 0;
+ 800095a: 2300 movs r3, #0
+ 800095c: 60fb str r3, [r7, #12]
+ pLayerCfg.WindowY1 = 272;
+ 800095e: f44f 7388 mov.w r3, #272 ; 0x110
+ 8000962: 613b str r3, [r7, #16]
+ pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB888;
+ 8000964: 2301 movs r3, #1
+ 8000966: 617b str r3, [r7, #20]
+ pLayerCfg.Alpha = 255;
+ 8000968: 23ff movs r3, #255 ; 0xff
+ 800096a: 61bb str r3, [r7, #24]
+ pLayerCfg.Alpha0 = 0;
+ 800096c: 2300 movs r3, #0
+ 800096e: 61fb str r3, [r7, #28]
+ pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
+ 8000970: f44f 6380 mov.w r3, #1024 ; 0x400
+ 8000974: 623b str r3, [r7, #32]
+ pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
+ 8000976: 2305 movs r3, #5
+ 8000978: 627b str r3, [r7, #36] ; 0x24
+ pLayerCfg.FBStartAdress = 0;
+ 800097a: 2300 movs r3, #0
+ 800097c: 62bb str r3, [r7, #40] ; 0x28
+ pLayerCfg.ImageWidth = 480;
+ 800097e: f44f 73f0 mov.w r3, #480 ; 0x1e0
+ 8000982: 62fb str r3, [r7, #44] ; 0x2c
+ pLayerCfg.ImageHeight = 272;
+ 8000984: f44f 7388 mov.w r3, #272 ; 0x110
+ 8000988: 633b str r3, [r7, #48] ; 0x30
+ pLayerCfg.Backcolor.Blue = 255;
+ 800098a: 23ff movs r3, #255 ; 0xff
+ 800098c: f887 3034 strb.w r3, [r7, #52] ; 0x34
+ pLayerCfg.Backcolor.Green = 0;
+ 8000990: 2300 movs r3, #0
+ 8000992: f887 3035 strb.w r3, [r7, #53] ; 0x35
+ pLayerCfg.Backcolor.Red = 0;
+ 8000996: 2300 movs r3, #0
+ 8000998: f887 3036 strb.w r3, [r7, #54] ; 0x36
+ if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
+ 800099c: 1d3b adds r3, r7, #4
+ 800099e: 2200 movs r2, #0
+ 80009a0: 4619 mov r1, r3
+ 80009a2: 4806 ldr r0, [pc, #24] ; (80009bc )
+ 80009a4: f002 f870 bl 8002a88
+ 80009a8: 4603 mov r3, r0
+ 80009aa: 2b00 cmp r3, #0
+ 80009ac: d001 beq.n 80009b2
+ {
+ Error_Handler();
+ 80009ae: f000 faa7 bl 8000f00
+ }
+ /* USER CODE BEGIN LTDC_Init 2 */
+
+ /* USER CODE END LTDC_Init 2 */
+
+}
+ 80009b2: bf00 nop
+ 80009b4: 3738 adds r7, #56 ; 0x38
+ 80009b6: 46bd mov sp, r7
+ 80009b8: bd80 pop {r7, pc}
+ 80009ba: bf00 nop
+ 80009bc: 240c0608 .word 0x240c0608
+ 80009c0: 50001000 .word 0x50001000
+
+080009c4 :
+ * @brief OCTOSPI1 Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_OCTOSPI1_Init(void)
+{
+ 80009c4: b580 push {r7, lr}
+ 80009c6: b086 sub sp, #24
+ 80009c8: af00 add r7, sp, #0
+
+ /* USER CODE BEGIN OCTOSPI1_Init 0 */
+
+ /* USER CODE END OCTOSPI1_Init 0 */
+
+ OSPIM_CfgTypeDef sOspiManagerCfg = {0};
+ 80009ca: 463b mov r3, r7
+ 80009cc: 2200 movs r2, #0
+ 80009ce: 601a str r2, [r3, #0]
+ 80009d0: 605a str r2, [r3, #4]
+ 80009d2: 609a str r2, [r3, #8]
+ 80009d4: 60da str r2, [r3, #12]
+ 80009d6: 611a str r2, [r3, #16]
+ 80009d8: 615a str r2, [r3, #20]
+
+ /* USER CODE BEGIN OCTOSPI1_Init 1 */
+
+ /* USER CODE END OCTOSPI1_Init 1 */
+ /* OCTOSPI1 parameter configuration*/
+ hospi1.Instance = OCTOSPI1;
+ 80009da: 4b28 ldr r3, [pc, #160] ; (8000a7c )
+ 80009dc: 4a28 ldr r2, [pc, #160] ; (8000a80 )
+ 80009de: 601a str r2, [r3, #0]
+ hospi1.Init.FifoThreshold = 1;
+ 80009e0: 4b26 ldr r3, [pc, #152] ; (8000a7c )
+ 80009e2: 2201 movs r2, #1
+ 80009e4: 605a str r2, [r3, #4]
+ hospi1.Init.DualQuad = HAL_OSPI_DUALQUAD_DISABLE;
+ 80009e6: 4b25 ldr r3, [pc, #148] ; (8000a7c )
+ 80009e8: 2200 movs r2, #0
+ 80009ea: 609a str r2, [r3, #8]
+ hospi1.Init.MemoryType = HAL_OSPI_MEMTYPE_MACRONIX;
+ 80009ec: 4b23 ldr r3, [pc, #140] ; (8000a7c )
+ 80009ee: f04f 7280 mov.w r2, #16777216 ; 0x1000000
+ 80009f2: 60da str r2, [r3, #12]
+ hospi1.Init.DeviceSize = 32;
+ 80009f4: 4b21 ldr r3, [pc, #132] ; (8000a7c )
+ 80009f6: 2220 movs r2, #32
+ 80009f8: 611a str r2, [r3, #16]
+ hospi1.Init.ChipSelectHighTime = 1;
+ 80009fa: 4b20 ldr r3, [pc, #128] ; (8000a7c )
+ 80009fc: 2201 movs r2, #1
+ 80009fe: 615a str r2, [r3, #20]
+ hospi1.Init.FreeRunningClock = HAL_OSPI_FREERUNCLK_DISABLE;
+ 8000a00: 4b1e ldr r3, [pc, #120] ; (8000a7c )
+ 8000a02: 2200 movs r2, #0
+ 8000a04: 619a str r2, [r3, #24]
+ hospi1.Init.ClockMode = HAL_OSPI_CLOCK_MODE_0;
+ 8000a06: 4b1d ldr r3, [pc, #116] ; (8000a7c )
+ 8000a08: 2200 movs r2, #0
+ 8000a0a: 61da str r2, [r3, #28]
+ hospi1.Init.WrapSize = HAL_OSPI_WRAP_NOT_SUPPORTED;
+ 8000a0c: 4b1b ldr r3, [pc, #108] ; (8000a7c )
+ 8000a0e: 2200 movs r2, #0
+ 8000a10: 621a str r2, [r3, #32]
+ hospi1.Init.ClockPrescaler = 1;
+ 8000a12: 4b1a ldr r3, [pc, #104] ; (8000a7c )
+ 8000a14: 2201 movs r2, #1
+ 8000a16: 625a str r2, [r3, #36] ; 0x24
+ hospi1.Init.SampleShifting = HAL_OSPI_SAMPLE_SHIFTING_NONE;
+ 8000a18: 4b18 ldr r3, [pc, #96] ; (8000a7c )
+ 8000a1a: 2200 movs r2, #0
+ 8000a1c: 629a str r2, [r3, #40] ; 0x28
+ hospi1.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_DISABLE;
+ 8000a1e: 4b17 ldr r3, [pc, #92] ; (8000a7c )
+ 8000a20: 2200 movs r2, #0
+ 8000a22: 62da str r2, [r3, #44] ; 0x2c
+ hospi1.Init.ChipSelectBoundary = 0;
+ 8000a24: 4b15 ldr r3, [pc, #84] ; (8000a7c )
+ 8000a26: 2200 movs r2, #0
+ 8000a28: 631a str r2, [r3, #48] ; 0x30
+ hospi1.Init.DelayBlockBypass = HAL_OSPI_DELAY_BLOCK_BYPASSED;
+ 8000a2a: 4b14 ldr r3, [pc, #80] ; (8000a7c )
+ 8000a2c: 2208 movs r2, #8
+ 8000a2e: 635a str r2, [r3, #52] ; 0x34
+ hospi1.Init.MaxTran = 0;
+ 8000a30: 4b12 ldr r3, [pc, #72] ; (8000a7c )
+ 8000a32: 2200 movs r2, #0
+ 8000a34: 639a str r2, [r3, #56] ; 0x38
+ hospi1.Init.Refresh = 0;
+ 8000a36: 4b11 ldr r3, [pc, #68] ; (8000a7c )
+ 8000a38: 2200 movs r2, #0
+ 8000a3a: 63da str r2, [r3, #60] ; 0x3c
+ if (HAL_OSPI_Init(&hospi1) != HAL_OK)
+ 8000a3c: 480f ldr r0, [pc, #60] ; (8000a7c )
+ 8000a3e: f002 fa33 bl 8002ea8
+ 8000a42: 4603 mov r3, r0
+ 8000a44: 2b00 cmp r3, #0
+ 8000a46: d001 beq.n 8000a4c
+ {
+ Error_Handler();
+ 8000a48: f000 fa5a bl 8000f00
+ }
+ sOspiManagerCfg.ClkPort = 1;
+ 8000a4c: 2301 movs r3, #1
+ 8000a4e: 603b str r3, [r7, #0]
+ sOspiManagerCfg.DQSPort = 1;
+ 8000a50: 2301 movs r3, #1
+ 8000a52: 607b str r3, [r7, #4]
+ sOspiManagerCfg.NCSPort = 1;
+ 8000a54: 2301 movs r3, #1
+ 8000a56: 60bb str r3, [r7, #8]
+ sOspiManagerCfg.IOLowPort = HAL_OSPIM_IOPORT_1_HIGH;
+ 8000a58: 4b0a ldr r3, [pc, #40] ; (8000a84 )
+ 8000a5a: 60fb str r3, [r7, #12]
+ if (HAL_OSPIM_Config(&hospi1, &sOspiManagerCfg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
+ 8000a5c: 463b mov r3, r7
+ 8000a5e: f241 3288 movw r2, #5000 ; 0x1388
+ 8000a62: 4619 mov r1, r3
+ 8000a64: 4805 ldr r0, [pc, #20] ; (8000a7c )
+ 8000a66: f002 faeb bl 8003040
+ 8000a6a: 4603 mov r3, r0
+ 8000a6c: 2b00 cmp r3, #0
+ 8000a6e: d001 beq.n 8000a74
+ {
+ Error_Handler();
+ 8000a70: f000 fa46 bl 8000f00
+ }
+ /* USER CODE BEGIN OCTOSPI1_Init 2 */
+
+ /* USER CODE END OCTOSPI1_Init 2 */
+
+}
+ 8000a74: bf00 nop
+ 8000a76: 3718 adds r7, #24
+ 8000a78: 46bd mov sp, r7
+ 8000a7a: bd80 pop {r7, pc}
+ 8000a7c: 240c06b0 .word 0x240c06b0
+ 8000a80: 52005000 .word 0x52005000
+ 8000a84: 01000001 .word 0x01000001
+
+08000a88 :
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+ 8000a88: b580 push {r7, lr}
+ 8000a8a: b090 sub sp, #64 ; 0x40
+ 8000a8c: af00 add r7, sp, #0
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ 8000a8e: f107 032c add.w r3, r7, #44 ; 0x2c
+ 8000a92: 2200 movs r2, #0
+ 8000a94: 601a str r2, [r3, #0]
+ 8000a96: 605a str r2, [r3, #4]
+ 8000a98: 609a str r2, [r3, #8]
+ 8000a9a: 60da str r2, [r3, #12]
+ 8000a9c: 611a str r2, [r3, #16]
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOI_CLK_ENABLE();
+ 8000a9e: 4bc0 ldr r3, [pc, #768] ; (8000da0 )
+ 8000aa0: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000aa4: 4abe ldr r2, [pc, #760] ; (8000da0 )
+ 8000aa6: f443 7380 orr.w r3, r3, #256 ; 0x100
+ 8000aaa: f8c2 3140 str.w r3, [r2, #320] ; 0x140
+ 8000aae: 4bbc ldr r3, [pc, #752] ; (8000da0 )
+ 8000ab0: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000ab4: f403 7380 and.w r3, r3, #256 ; 0x100
+ 8000ab8: 62bb str r3, [r7, #40] ; 0x28
+ 8000aba: 6abb ldr r3, [r7, #40] ; 0x28
+ __HAL_RCC_GPIOG_CLK_ENABLE();
+ 8000abc: 4bb8 ldr r3, [pc, #736] ; (8000da0 )
+ 8000abe: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000ac2: 4ab7 ldr r2, [pc, #732] ; (8000da0 )
+ 8000ac4: f043 0340 orr.w r3, r3, #64 ; 0x40
+ 8000ac8: f8c2 3140 str.w r3, [r2, #320] ; 0x140
+ 8000acc: 4bb4 ldr r3, [pc, #720] ; (8000da0 )
+ 8000ace: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000ad2: f003 0340 and.w r3, r3, #64 ; 0x40
+ 8000ad6: 627b str r3, [r7, #36] ; 0x24
+ 8000ad8: 6a7b ldr r3, [r7, #36] ; 0x24
+ __HAL_RCC_GPIOK_CLK_ENABLE();
+ 8000ada: 4bb1 ldr r3, [pc, #708] ; (8000da0 )
+ 8000adc: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000ae0: 4aaf ldr r2, [pc, #700] ; (8000da0 )
+ 8000ae2: f443 6380 orr.w r3, r3, #1024 ; 0x400
+ 8000ae6: f8c2 3140 str.w r3, [r2, #320] ; 0x140
+ 8000aea: 4bad ldr r3, [pc, #692] ; (8000da0 )
+ 8000aec: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000af0: f403 6380 and.w r3, r3, #1024 ; 0x400
+ 8000af4: 623b str r3, [r7, #32]
+ 8000af6: 6a3b ldr r3, [r7, #32]
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+ 8000af8: 4ba9 ldr r3, [pc, #676] ; (8000da0 )
+ 8000afa: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000afe: 4aa8 ldr r2, [pc, #672] ; (8000da0 )
+ 8000b00: f043 0308 orr.w r3, r3, #8
+ 8000b04: f8c2 3140 str.w r3, [r2, #320] ; 0x140
+ 8000b08: 4ba5 ldr r3, [pc, #660] ; (8000da0 )
+ 8000b0a: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000b0e: f003 0308 and.w r3, r3, #8
+ 8000b12: 61fb str r3, [r7, #28]
+ 8000b14: 69fb ldr r3, [r7, #28]
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ 8000b16: 4ba2 ldr r3, [pc, #648] ; (8000da0 )
+ 8000b18: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000b1c: 4aa0 ldr r2, [pc, #640] ; (8000da0 )
+ 8000b1e: f043 0304 orr.w r3, r3, #4
+ 8000b22: f8c2 3140 str.w r3, [r2, #320] ; 0x140
+ 8000b26: 4b9e ldr r3, [pc, #632] ; (8000da0 )
+ 8000b28: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000b2c: f003 0304 and.w r3, r3, #4
+ 8000b30: 61bb str r3, [r7, #24]
+ 8000b32: 69bb ldr r3, [r7, #24]
+ __HAL_RCC_GPIOE_CLK_ENABLE();
+ 8000b34: 4b9a ldr r3, [pc, #616] ; (8000da0 )
+ 8000b36: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000b3a: 4a99 ldr r2, [pc, #612] ; (8000da0 )
+ 8000b3c: f043 0310 orr.w r3, r3, #16
+ 8000b40: f8c2 3140 str.w r3, [r2, #320] ; 0x140
+ 8000b44: 4b96 ldr r3, [pc, #600] ; (8000da0 )
+ 8000b46: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000b4a: f003 0310 and.w r3, r3, #16
+ 8000b4e: 617b str r3, [r7, #20]
+ 8000b50: 697b ldr r3, [r7, #20]
+ __HAL_RCC_GPIOB_CLK_ENABLE();
+ 8000b52: 4b93 ldr r3, [pc, #588] ; (8000da0 )
+ 8000b54: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000b58: 4a91 ldr r2, [pc, #580] ; (8000da0 )
+ 8000b5a: f043 0302 orr.w r3, r3, #2
+ 8000b5e: f8c2 3140 str.w r3, [r2, #320] ; 0x140
+ 8000b62: 4b8f ldr r3, [pc, #572] ; (8000da0 )
+ 8000b64: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000b68: f003 0302 and.w r3, r3, #2
+ 8000b6c: 613b str r3, [r7, #16]
+ 8000b6e: 693b ldr r3, [r7, #16]
+ __HAL_RCC_GPIOJ_CLK_ENABLE();
+ 8000b70: 4b8b ldr r3, [pc, #556] ; (8000da0 )
+ 8000b72: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000b76: 4a8a ldr r2, [pc, #552] ; (8000da0 )
+ 8000b78: f443 7300 orr.w r3, r3, #512 ; 0x200
+ 8000b7c: f8c2 3140 str.w r3, [r2, #320] ; 0x140
+ 8000b80: 4b87 ldr r3, [pc, #540] ; (8000da0 )
+ 8000b82: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000b86: f403 7300 and.w r3, r3, #512 ; 0x200
+ 8000b8a: 60fb str r3, [r7, #12]
+ 8000b8c: 68fb ldr r3, [r7, #12]
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ 8000b8e: 4b84 ldr r3, [pc, #528] ; (8000da0 )
+ 8000b90: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000b94: 4a82 ldr r2, [pc, #520] ; (8000da0 )
+ 8000b96: f043 0301 orr.w r3, r3, #1
+ 8000b9a: f8c2 3140 str.w r3, [r2, #320] ; 0x140
+ 8000b9e: 4b80 ldr r3, [pc, #512] ; (8000da0 )
+ 8000ba0: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000ba4: f003 0301 and.w r3, r3, #1
+ 8000ba8: 60bb str r3, [r7, #8]
+ 8000baa: 68bb ldr r3, [r7, #8]
+ __HAL_RCC_GPIOF_CLK_ENABLE();
+ 8000bac: 4b7c ldr r3, [pc, #496] ; (8000da0 )
+ 8000bae: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000bb2: 4a7b ldr r2, [pc, #492] ; (8000da0 )
+ 8000bb4: f043 0320 orr.w r3, r3, #32
+ 8000bb8: f8c2 3140 str.w r3, [r2, #320] ; 0x140
+ 8000bbc: 4b78 ldr r3, [pc, #480] ; (8000da0 )
+ 8000bbe: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000bc2: f003 0320 and.w r3, r3, #32
+ 8000bc6: 607b str r3, [r7, #4]
+ 8000bc8: 687b ldr r3, [r7, #4]
+ __HAL_RCC_GPIOH_CLK_ENABLE();
+ 8000bca: 4b75 ldr r3, [pc, #468] ; (8000da0 )
+ 8000bcc: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000bd0: 4a73 ldr r2, [pc, #460] ; (8000da0 )
+ 8000bd2: f043 0380 orr.w r3, r3, #128 ; 0x80
+ 8000bd6: f8c2 3140 str.w r3, [r2, #320] ; 0x140
+ 8000bda: 4b71 ldr r3, [pc, #452] ; (8000da0 )
+ 8000bdc: f8d3 3140 ldr.w r3, [r3, #320] ; 0x140
+ 8000be0: f003 0380 and.w r3, r3, #128 ; 0x80
+ 8000be4: 603b str r3, [r7, #0]
+ 8000be6: 683b ldr r3, [r7, #0]
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOI, WIFI_BOOT_Pin|WIFI_WKUP_Pin|WIFI_RST_Pin, GPIO_PIN_RESET);
+ 8000be8: 2200 movs r2, #0
+ 8000bea: 210e movs r1, #14
+ 8000bec: 486d ldr r0, [pc, #436] ; (8000da4 )
+ 8000bee: f001 fc5d bl 80024ac
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOG, USER_LED1_Pin|USER_LED2_Pin, GPIO_PIN_RESET);
+ 8000bf2: 2200 movs r2, #0
+ 8000bf4: f640 0104 movw r1, #2052 ; 0x804
+ 8000bf8: 486b ldr r0, [pc, #428] ; (8000da8 )
+ 8000bfa: f001 fc57 bl 80024ac
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(SPI2_NSS_GPIO_Port, SPI2_NSS_Pin, GPIO_PIN_RESET);
+ 8000bfe: 2200 movs r2, #0
+ 8000c00: f44f 6100 mov.w r1, #2048 ; 0x800
+ 8000c04: 4869 ldr r0, [pc, #420] ; (8000dac )
+ 8000c06: f001 fc51 bl 80024ac
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(AUDIO_NRST_GPIO_Port, AUDIO_NRST_Pin, GPIO_PIN_SET);
+ 8000c0a: 2201 movs r2, #1
+ 8000c0c: 2108 movs r1, #8
+ 8000c0e: 4866 ldr r0, [pc, #408] ; (8000da8 )
+ 8000c10: f001 fc4c bl 80024ac
+
+ /*Configure GPIO pin Output Level */
+ HAL_GPIO_WritePin(GPIOA, LCD_BL_CTRL_Pin|LCD_ON_OFF_Pin, GPIO_PIN_SET);
+ 8000c14: 2201 movs r2, #1
+ 8000c16: 2106 movs r1, #6
+ 8000c18: 4864 ldr r0, [pc, #400] ; (8000dac )
+ 8000c1a: f001 fc47 bl 80024ac
+
+ /*Configure GPIO pins : WIFI_GPIO_Pin WIFI_DATRDY_Pin */
+ GPIO_InitStruct.Pin = WIFI_GPIO_Pin|WIFI_DATRDY_Pin;
+ 8000c1e: 2330 movs r3, #48 ; 0x30
+ 8000c20: 62fb str r3, [r7, #44] ; 0x2c
+ GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
+ 8000c22: f44f 1388 mov.w r3, #1114112 ; 0x110000
+ 8000c26: 633b str r3, [r7, #48] ; 0x30
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ 8000c28: 2300 movs r3, #0
+ 8000c2a: 637b str r3, [r7, #52] ; 0x34
+ HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
+ 8000c2c: f107 032c add.w r3, r7, #44 ; 0x2c
+ 8000c30: 4619 mov r1, r3
+ 8000c32: 485c ldr r0, [pc, #368] ; (8000da4 )
+ 8000c34: f001 fa8a bl 800214c
+
+ /*Configure GPIO pins : SDNCAS_Pin SDCLK_Pin A15_Pin A14_Pin
+ A11_Pin A10_Pin */
+ GPIO_InitStruct.Pin = SDNCAS_Pin|SDCLK_Pin|A15_Pin|A14_Pin
+ 8000c38: f248 1333 movw r3, #33075 ; 0x8133
+ 8000c3c: 62fb str r3, [r7, #44] ; 0x2c
+ |A11_Pin|A10_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ 8000c3e: 2302 movs r3, #2
+ 8000c40: 633b str r3, [r7, #48] ; 0x30
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ 8000c42: 2300 movs r3, #0
+ 8000c44: 637b str r3, [r7, #52] ; 0x34
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ 8000c46: 2303 movs r3, #3
+ 8000c48: 63bb str r3, [r7, #56] ; 0x38
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+ 8000c4a: 230c movs r3, #12
+ 8000c4c: 63fb str r3, [r7, #60] ; 0x3c
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+ 8000c4e: f107 032c add.w r3, r7, #44 ; 0x2c
+ 8000c52: 4619 mov r1, r3
+ 8000c54: 4854 ldr r0, [pc, #336] ; (8000da8 )
+ 8000c56: f001 fa79 bl 800214c
+
+ /*Configure GPIO pins : I2S6_SDO_Pin I2S6_SDI_Pin I2S6_CK_Pin */
+ GPIO_InitStruct.Pin = I2S6_SDO_Pin|I2S6_SDI_Pin|I2S6_CK_Pin;
+ 8000c5a: f44f 43e0 mov.w r3, #28672 ; 0x7000
+ 8000c5e: 62fb str r3, [r7, #44] ; 0x2c
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ 8000c60: 2302 movs r3, #2
+ 8000c62: 633b str r3, [r7, #48] ; 0x30
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ 8000c64: 2300 movs r3, #0
+ 8000c66: 637b str r3, [r7, #52] ; 0x34
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ 8000c68: 2300 movs r3, #0
+ 8000c6a: 63bb str r3, [r7, #56] ; 0x38
+ GPIO_InitStruct.Alternate = GPIO_AF5_SPI6;
+ 8000c6c: 2305 movs r3, #5
+ 8000c6e: 63fb str r3, [r7, #60] ; 0x3c
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+ 8000c70: f107 032c add.w r3, r7, #44 ; 0x2c
+ 8000c74: 4619 mov r1, r3
+ 8000c76: 484c ldr r0, [pc, #304] ; (8000da8 )
+ 8000c78: f001 fa68 bl 800214c
+
+ /*Configure GPIO pins : D3_Pin D2_Pin D0_Pin D1_Pin
+ D13_Pin D15_Pin D14_Pin */
+ GPIO_InitStruct.Pin = D3_Pin|D2_Pin|D0_Pin|D1_Pin
+ 8000c7c: f24c 7303 movw r3, #50947 ; 0xc703
+ 8000c80: 62fb str r3, [r7, #44] ; 0x2c
+ |D13_Pin|D15_Pin|D14_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ 8000c82: 2302 movs r3, #2
+ 8000c84: 633b str r3, [r7, #48] ; 0x30
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ 8000c86: 2300 movs r3, #0
+ 8000c88: 637b str r3, [r7, #52] ; 0x34
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ 8000c8a: 2303 movs r3, #3
+ 8000c8c: 63bb str r3, [r7, #56] ; 0x38
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+ 8000c8e: 230c movs r3, #12
+ 8000c90: 63fb str r3, [r7, #60] ; 0x3c
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+ 8000c92: f107 032c add.w r3, r7, #44 ; 0x2c
+ 8000c96: 4619 mov r1, r3
+ 8000c98: 4845 ldr r0, [pc, #276] ; (8000db0 )
+ 8000c9a: f001 fa57 bl 800214c
+
+ /*Configure GPIO pins : SDIO1_D2_Pin SDIO1_CK_Pin SDIO1_D3_Pin SDIO1_D1_Pin
+ SDIO1_D0_Pin */
+ GPIO_InitStruct.Pin = SDIO1_D2_Pin|SDIO1_CK_Pin|SDIO1_D3_Pin|SDIO1_D1_Pin
+ 8000c9e: f44f 53f8 mov.w r3, #7936 ; 0x1f00
+ 8000ca2: 62fb str r3, [r7, #44] ; 0x2c
+ |SDIO1_D0_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ 8000ca4: 2302 movs r3, #2
+ 8000ca6: 633b str r3, [r7, #48] ; 0x30
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ 8000ca8: 2300 movs r3, #0
+ 8000caa: 637b str r3, [r7, #52] ; 0x34
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ 8000cac: 2303 movs r3, #3
+ 8000cae: 63bb str r3, [r7, #56] ; 0x38
+ GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
+ 8000cb0: 230c movs r3, #12
+ 8000cb2: 63fb str r3, [r7, #60] ; 0x3c
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+ 8000cb4: f107 032c add.w r3, r7, #44 ; 0x2c
+ 8000cb8: 4619 mov r1, r3
+ 8000cba: 483e ldr r0, [pc, #248] ; (8000db4 )
+ 8000cbc: f001 fa46 bl 800214c
+
+ /*Configure GPIO pins : WIFI_BOOT_Pin WIFI_WKUP_Pin WIFI_RST_Pin */
+ GPIO_InitStruct.Pin = WIFI_BOOT_Pin|WIFI_WKUP_Pin|WIFI_RST_Pin;
+ 8000cc0: 230e movs r3, #14
+ 8000cc2: 62fb str r3, [r7, #44] ; 0x2c
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ 8000cc4: 2301 movs r3, #1
+ 8000cc6: 633b str r3, [r7, #48] ; 0x30
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ 8000cc8: 2300 movs r3, #0
+ 8000cca: 637b str r3, [r7, #52] ; 0x34
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ 8000ccc: 2300 movs r3, #0
+ 8000cce: 63bb str r3, [r7, #56] ; 0x38
+ HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
+ 8000cd0: f107 032c add.w r3, r7, #44 ; 0x2c
+ 8000cd4: 4619 mov r1, r3
+ 8000cd6: 4833 ldr r0, [pc, #204] ; (8000da4 )
+ 8000cd8: f001 fa38 bl 800214c
+
+ /*Configure GPIO pins : FMC_NBL0_Pin FMC_NBL1_Pin D9_Pin D4_Pin
+ D10_Pin D11_Pin D7_Pin D6_Pin
+ D12_Pin D5_Pin D8_Pin */
+ GPIO_InitStruct.Pin = FMC_NBL0_Pin|FMC_NBL1_Pin|D9_Pin|D4_Pin
+ 8000cdc: f64f 7383 movw r3, #65411 ; 0xff83
+ 8000ce0: 62fb str r3, [r7, #44] ; 0x2c
+ |D10_Pin|D11_Pin|D7_Pin|D6_Pin
+ |D12_Pin|D5_Pin|D8_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ 8000ce2: 2302 movs r3, #2
+ 8000ce4: 633b str r3, [r7, #48] ; 0x30
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ 8000ce6: 2300 movs r3, #0
+ 8000ce8: 637b str r3, [r7, #52] ; 0x34
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ 8000cea: 2303 movs r3, #3
+ 8000cec: 63bb str r3, [r7, #56] ; 0x38
+ GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
+ 8000cee: 230c movs r3, #12
+ 8000cf0: 63fb str r3, [r7, #60] ; 0x3c
+ HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
+ 8000cf2: f107 032c add.w r3, r7, #44 ; 0x2c
+ 8000cf6: 4619 mov r1, r3
+ 8000cf8: 482f ldr r0, [pc, #188] ; (8000db8 )
+ 8000cfa: f001 fa27 bl 800214c
+
+ /*Configure GPIO pins : USER_LED1_Pin AUDIO_NRST_Pin USER_LED2_Pin */
+ GPIO_InitStruct.Pin = USER_LED1_Pin|AUDIO_NRST_Pin|USER_LED2_Pin;
+ 8000cfe: f640 030c movw r3, #2060 ; 0x80c
+ 8000d02: 62fb str r3, [r7, #44] ; 0x2c
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ 8000d04: 2301 movs r3, #1
+ 8000d06: 633b str r3, [r7, #48] ; 0x30
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ 8000d08: 2300 movs r3, #0
+ 8000d0a: 637b str r3, [r7, #52] ; 0x34
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ 8000d0c: 2300 movs r3, #0
+ 8000d0e: 63bb str r3, [r7, #56] ; 0x38
+ HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
+ 8000d10: f107 032c add.w r3, r7, #44 ; 0x2c
+ 8000d14: 4619 mov r1, r3
+ 8000d16: 4824 ldr r0, [pc, #144] ; (8000da8 )
+ 8000d18: f001 fa18 bl 800214c
+
+ /*Configure GPIO pin : SDIO1_CMD_Pin */
+ GPIO_InitStruct.Pin = SDIO1_CMD_Pin;
+ 8000d1c: 2304 movs r3, #4
+ 8000d1e: 62fb str r3, [r7, #44] ; 0x2c
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ 8000d20: 2302 movs r3, #2
+ 8000d22: 633b str r3, [r7, #48] ; 0x30
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ 8000d24: 2300 movs r3, #0
+ 8000d26: 637b str r3, [r7, #52] ; 0x34
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ 8000d28: 2303 movs r3, #3
+ 8000d2a: 63bb str r3, [r7, #56] ; 0x38
+ GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
+ 8000d2c: 230c movs r3, #12
+ 8000d2e: 63fb str r3, [r7, #60] ; 0x3c
+ HAL_GPIO_Init(SDIO1_CMD_GPIO_Port, &GPIO_InitStruct);
+ 8000d30: f107 032c add.w r3, r7, #44 ; 0x2c
+ 8000d34: 4619 mov r1, r3
+ 8000d36: 481e ldr r0, [pc, #120] ; (8000db0 )
+ 8000d38: f001 fa08 bl 800214c