From 8a6c5379e0dea24639a9af26b9337d37c5936cc0 Mon Sep 17 00:00:00 2001 From: ynorthwest <11157436+ynorthwest@user.noreply.gitee.com> Date: Fri, 27 Dec 2024 10:56:09 +0800 Subject: [PATCH 1/3] 1. add acm32h5xx-nucleo bsp package; 2. modify acm32f0x0-nucleo and acm32f4xx-nucleo bsp package --- bsp/acm32/acm32f0x0-nucleo/README.md | 2 +- bsp/acm32/acm32f0x0-nucleo/project.uvoptx | 990 +- bsp/acm32/acm32f0x0-nucleo/project.uvprojx | 1311 +- bsp/acm32/acm32f4xx-nucleo/README.md | 2 +- .../libraries/Device/System_Accelerate.c | 344 + .../libraries/Device/System_Accelerate.h | 26 +- .../libraries/HAL_Driver/Src/HAL_EFlash_Ex.c | 201 + bsp/acm32/acm32f4xx-nucleo/project.uvoptx | 820 + bsp/acm32/acm32f4xx-nucleo/project.uvprojx | 1206 +- bsp/acm32/acm32h5xx-nucleo/.config | 1103 ++ bsp/acm32/acm32h5xx-nucleo/.ignore_format.yml | 6 + bsp/acm32/acm32h5xx-nucleo/Debug_XIPFLASH.ini | 23 + .../acm32h5xx-nucleo/EventRecorderStub.scvd | 9 + bsp/acm32/acm32h5xx-nucleo/Kconfig | 22 + .../acm32h5xx-nucleo/Project_user_xflash.sct | 33 + bsp/acm32/acm32h5xx-nucleo/README.md | 58 + bsp/acm32/acm32h5xx-nucleo/SConscript | 14 + bsp/acm32/acm32h5xx-nucleo/SConstruct | 34 + .../acm32h5xx-nucleo/applications/SConscript | 15 + .../applications/acm32h5xx_it.c | 184 + .../applications/lvgl/demo/SConscript | 17 + .../applications/lvgl/demo/lv_demo.c | 27 + .../applications/lvgl/lv_conf.h | 76 + .../applications/lvgl/lv_port_disp.c | 164 + .../applications/lvgl/lv_port_indev.c | 75 + .../acm32h5xx-nucleo/applications/main.c | 36 + .../acm32h5xx-nucleo/applications/mount.c | 47 + bsp/acm32/acm32h5xx-nucleo/board/board.c | 142 + bsp/acm32/acm32h5xx-nucleo/board/board.h | 160 + .../acm32h5xx-nucleo/drivers/Inc/drv_dma.h | 18 + .../acm32h5xx-nucleo/drivers/Inc/drv_gpio.h | 30 + .../acm32h5xx-nucleo/drivers/Inc/drv_log.h | 27 + .../acm32h5xx-nucleo/drivers/Inc/drv_uart.h | 78 + .../drivers/config/acm32h5xx_hal_conf.h | 306 + .../drivers/config/uart_config.h | 213 + bsp/acm32/acm32h5xx-nucleo/drivers/drv_dma.c | 290 + bsp/acm32/acm32h5xx-nucleo/drivers/drv_gpio.c | 577 + bsp/acm32/acm32h5xx-nucleo/drivers/drv_uart.c | 631 + .../libraries/CMSIS/cmsis_armclang.h | 1444 ++ .../libraries/CMSIS/cmsis_compiler.h | 283 + .../libraries/CMSIS/cmsis_gcc.h | 2168 +++ .../libraries/CMSIS/cmsis_iccarm.h | 964 + .../libraries/CMSIS/cmsis_version.h | 39 + .../libraries/CMSIS/core_cm33.h | 2930 +++ .../libraries/CMSIS/mpu_armv8.h | 346 + .../Device/Templates/ARM/startup_acm32h5xx.s | 598 + .../libraries/Device/acm32h5xx.h | 16092 ++++++++++++++++ .../libraries/Device/system_accelerate.c | 407 + .../libraries/Device/system_accelerate.h | 56 + .../libraries/Device/system_acm32h5xx.c | 753 + .../libraries/Device/system_acm32h5xx.h | 415 + .../libraries/HAL_Driver/Inc/HAL_HCD.h | 316 + .../libraries/HAL_Driver/Inc/HAL_PCD.h | 409 + .../libraries/HAL_Driver/Inc/HAL_PCD_EX.h | 82 + .../libraries/HAL_Driver/Inc/HAL_USB_Def.h | 1471 ++ .../libraries/HAL_Driver/Inc/LL_USB.h | 540 + .../libraries/HAL_Driver/Inc/hal.h | 64 + .../libraries/HAL_Driver/Inc/hal_adc.h | 904 + .../libraries/HAL_Driver/Inc/hal_aes.h | 90 + .../libraries/HAL_Driver/Inc/hal_aes_spi1.h | 139 + .../libraries/HAL_Driver/Inc/hal_cde.h | 430 + .../libraries/HAL_Driver/Inc/hal_comp.h | 163 + .../libraries/HAL_Driver/Inc/hal_cordic.h | 626 + .../libraries/HAL_Driver/Inc/hal_cortex.h | 255 + .../libraries/HAL_Driver/Inc/hal_crc.h | 159 + .../libraries/HAL_Driver/Inc/hal_dac.h | 397 + .../libraries/HAL_Driver/Inc/hal_dcmi.h | 735 + .../libraries/HAL_Driver/Inc/hal_def.h | 167 + .../libraries/HAL_Driver/Inc/hal_dlyb.h | 37 + .../libraries/HAL_Driver/Inc/hal_dma.h | 910 + .../libraries/HAL_Driver/Inc/hal_dma2d.h | 858 + .../libraries/HAL_Driver/Inc/hal_dwt.h | 36 + .../libraries/HAL_Driver/Inc/hal_efuse.h | 84 + .../libraries/HAL_Driver/Inc/hal_eth.h | 1593 ++ .../libraries/HAL_Driver/Inc/hal_exti.h | 174 + .../libraries/HAL_Driver/Inc/hal_fdcan.h | 930 + .../libraries/HAL_Driver/Inc/hal_fmc.h | 755 + .../libraries/HAL_Driver/Inc/hal_gpio.h | 289 + .../libraries/HAL_Driver/Inc/hal_hrng.h | 54 + .../libraries/HAL_Driver/Inc/hal_i2c.h | 208 + .../libraries/HAL_Driver/Inc/hal_i2s.h | 487 + .../libraries/HAL_Driver/Inc/hal_iwdt.h | 180 + .../libraries/HAL_Driver/Inc/hal_lptim.h | 755 + .../libraries/HAL_Driver/Inc/hal_lpuart.h | 412 + .../libraries/HAL_Driver/Inc/hal_ltdc.h | 925 + .../libraries/HAL_Driver/Inc/hal_mdac.h | 126 + .../libraries/HAL_Driver/Inc/hal_nand.h | 630 + .../libraries/HAL_Driver/Inc/hal_nfm.h | 602 + .../libraries/HAL_Driver/Inc/hal_norflash.h | 199 + .../libraries/HAL_Driver/Inc/hal_ospi.h | 902 + .../libraries/HAL_Driver/Inc/hal_pmu.h | 325 + .../libraries/HAL_Driver/Inc/hal_rcc.h | 1986 ++ .../libraries/HAL_Driver/Inc/hal_rtc.h | 484 + .../libraries/HAL_Driver/Inc/hal_sdmmc.h | 400 + .../libraries/HAL_Driver/Inc/hal_sha1.h | 73 + .../libraries/HAL_Driver/Inc/hal_sha256.h | 71 + .../libraries/HAL_Driver/Inc/hal_spi.h | 350 + .../libraries/HAL_Driver/Inc/hal_timer.h | 694 + .../libraries/HAL_Driver/Inc/hal_timer_ex.h | 280 + .../libraries/HAL_Driver/Inc/hal_tkey.h | 776 + .../libraries/HAL_Driver/Inc/hal_uart.h | 693 + .../libraries/HAL_Driver/Inc/hal_uart_7816m.h | 17 + .../libraries/HAL_Driver/Inc/hal_uart_ex.h | 22 + .../libraries/HAL_Driver/Inc/hal_usart.h | 353 + .../libraries/HAL_Driver/Inc/hal_wdt.h | 140 + .../libraries/HAL_Driver/Src/HAL_HCD.c | 1736 ++ .../libraries/HAL_Driver/Src/HAL_PCD.c | 1870 ++ .../libraries/HAL_Driver/Src/HAL_PCD_EX.c | 203 + .../libraries/HAL_Driver/Src/LL_USB.c | 2776 +++ .../libraries/HAL_Driver/Src/hal.c | 421 + .../libraries/HAL_Driver/Src/hal_adc.c | 1305 ++ .../libraries/HAL_Driver/Src/hal_aes_spi1.c | 1617 ++ .../libraries/HAL_Driver/Src/hal_cde.c | 38 + .../libraries/HAL_Driver/Src/hal_comp.c | 269 + .../libraries/HAL_Driver/Src/hal_cortex.c | 478 + .../libraries/HAL_Driver/Src/hal_crc.c | 83 + .../libraries/HAL_Driver/Src/hal_dac.c | 944 + .../libraries/HAL_Driver/Src/hal_dcmi.c | 863 + .../libraries/HAL_Driver/Src/hal_dlyb.c | 92 + .../libraries/HAL_Driver/Src/hal_dma.c | 746 + .../libraries/HAL_Driver/Src/hal_dma2d.c | 1632 ++ .../libraries/HAL_Driver/Src/hal_dwt.c | 69 + .../libraries/HAL_Driver/Src/hal_efuse.c | 441 + .../libraries/HAL_Driver/Src/hal_eth.c | 4663 +++++ .../libraries/HAL_Driver/Src/hal_exti.c | 431 + .../libraries/HAL_Driver/Src/hal_fdcan.c | 1250 ++ .../libraries/HAL_Driver/Src/hal_fmc.c | 623 + .../libraries/HAL_Driver/Src/hal_gpio.c | 328 + .../libraries/HAL_Driver/Src/hal_i2c.c | 1405 ++ .../libraries/HAL_Driver/Src/hal_i2s.c | 1552 ++ .../libraries/HAL_Driver/Src/hal_iwdt.c | 245 + .../libraries/HAL_Driver/Src/hal_lptim.c | 1244 ++ .../libraries/HAL_Driver/Src/hal_lpuart.c | 1402 ++ .../libraries/HAL_Driver/Src/hal_ltdc.c | 1812 ++ .../libraries/HAL_Driver/Src/hal_mdac.c | 323 + .../libraries/HAL_Driver/Src/hal_nand.c | 467 + .../libraries/HAL_Driver/Src/hal_norflash.c | 728 + .../libraries/HAL_Driver/Src/hal_ospi.c | 1996 ++ .../libraries/HAL_Driver/Src/hal_pmu.c | 533 + .../libraries/HAL_Driver/Src/hal_rcc.c | 3087 +++ .../libraries/HAL_Driver/Src/hal_rtc.c | 549 + .../libraries/HAL_Driver/Src/hal_sdmmc.c | 1316 ++ .../libraries/HAL_Driver/Src/hal_spi.c | 1663 ++ .../libraries/HAL_Driver/Src/hal_timer.c | 2055 ++ .../libraries/HAL_Driver/Src/hal_timer_ex.c | 282 + .../libraries/HAL_Driver/Src/hal_tkey .c | 720 + .../libraries/HAL_Driver/Src/hal_uart.c | 1255 ++ .../libraries/HAL_Driver/Src/hal_uart_7816m.c | 281 + .../libraries/HAL_Driver/Src/hal_uart_ex.c | 239 + .../libraries/HAL_Driver/Src/hal_usart.c | 1141 ++ .../libraries/HAL_Driver/Src/hal_wdt.c | 118 + .../acm32h5xx-nucleo/libraries/SConscript | 35 + bsp/acm32/acm32h5xx-nucleo/project.ewp | 2324 +++ bsp/acm32/acm32h5xx-nucleo/project.eww | 10 + bsp/acm32/acm32h5xx-nucleo/project.uvoptx | 1296 ++ bsp/acm32/acm32h5xx-nucleo/project.uvprojx | 791 + bsp/acm32/acm32h5xx-nucleo/project_flash.BAT | 152 + bsp/acm32/acm32h5xx-nucleo/rtconfig.h | 346 + bsp/acm32/acm32h5xx-nucleo/rtconfig.py | 144 + bsp/acm32/acm32h5xx-nucleo/template.ewp | 2074 ++ bsp/acm32/acm32h5xx-nucleo/template.eww | 10 + bsp/acm32/acm32h5xx-nucleo/template.uvoptx | 321 + bsp/acm32/acm32h5xx-nucleo/template.uvprojx | 401 + 163 files changed, 115295 insertions(+), 469 deletions(-) create mode 100644 bsp/acm32/acm32f4xx-nucleo/libraries/Device/System_Accelerate.c create mode 100644 bsp/acm32/acm32f4xx-nucleo/libraries/HAL_Driver/Src/HAL_EFlash_Ex.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/.config create mode 100644 bsp/acm32/acm32h5xx-nucleo/.ignore_format.yml create mode 100644 bsp/acm32/acm32h5xx-nucleo/Debug_XIPFLASH.ini create mode 100644 bsp/acm32/acm32h5xx-nucleo/EventRecorderStub.scvd create mode 100644 bsp/acm32/acm32h5xx-nucleo/Kconfig create mode 100644 bsp/acm32/acm32h5xx-nucleo/Project_user_xflash.sct create mode 100644 bsp/acm32/acm32h5xx-nucleo/README.md create mode 100644 bsp/acm32/acm32h5xx-nucleo/SConscript create mode 100644 bsp/acm32/acm32h5xx-nucleo/SConstruct create mode 100644 bsp/acm32/acm32h5xx-nucleo/applications/SConscript create mode 100644 bsp/acm32/acm32h5xx-nucleo/applications/acm32h5xx_it.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/applications/lvgl/demo/SConscript create mode 100644 bsp/acm32/acm32h5xx-nucleo/applications/lvgl/demo/lv_demo.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_conf.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_port_disp.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_port_indev.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/applications/main.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/applications/mount.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/board/board.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/board/board.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_dma.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_gpio.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_log.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_uart.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/drivers/config/acm32h5xx_hal_conf.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/drivers/config/uart_config.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/drivers/drv_dma.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/drivers/drv_gpio.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/drivers/drv_uart.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_armclang.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_compiler.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_gcc.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_iccarm.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_version.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/core_cm33.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/mpu_armv8.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/Device/Templates/ARM/startup_acm32h5xx.s create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/Device/acm32h5xx.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_accelerate.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_accelerate.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_acm32h5xx.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_acm32h5xx.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_HCD.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_PCD.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_PCD_EX.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_USB_Def.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/LL_USB.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_adc.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_aes.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_aes_spi1.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_cde.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_comp.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_cordic.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_cortex.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_crc.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dac.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dcmi.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_def.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dlyb.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dma.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dma2d.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dwt.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_efuse.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_eth.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_exti.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_fdcan.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_fmc.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_gpio.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_hrng.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_i2c.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_i2s.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_iwdt.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_lptim.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_lpuart.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_ltdc.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_mdac.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_nand.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_nfm.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_norflash.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_ospi.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_pmu.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_rcc.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_rtc.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_sdmmc.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_sha1.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_sha256.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_spi.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_timer.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_timer_ex.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_tkey.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_uart.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_uart_7816m.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_uart_ex.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_usart.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_wdt.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/HAL_HCD.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/HAL_PCD.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/HAL_PCD_EX.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/LL_USB.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_adc.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_aes_spi1.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_cde.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_comp.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_cortex.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_crc.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dac.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dcmi.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dlyb.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dma.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dma2d.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dwt.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_efuse.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_eth.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_exti.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_fdcan.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_fmc.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_gpio.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_i2c.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_i2s.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_iwdt.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_lptim.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_lpuart.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_ltdc.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_mdac.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_nand.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_norflash.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_ospi.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_pmu.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_rcc.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_rtc.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sdmmc.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_spi.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_timer.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_timer_ex.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_tkey .c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_uart.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_uart_7816m.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_uart_ex.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_usart.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_wdt.c create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/SConscript create mode 100644 bsp/acm32/acm32h5xx-nucleo/project.ewp create mode 100644 bsp/acm32/acm32h5xx-nucleo/project.eww create mode 100644 bsp/acm32/acm32h5xx-nucleo/project.uvoptx create mode 100644 bsp/acm32/acm32h5xx-nucleo/project.uvprojx create mode 100644 bsp/acm32/acm32h5xx-nucleo/project_flash.BAT create mode 100644 bsp/acm32/acm32h5xx-nucleo/rtconfig.h create mode 100644 bsp/acm32/acm32h5xx-nucleo/rtconfig.py create mode 100644 bsp/acm32/acm32h5xx-nucleo/template.ewp create mode 100644 bsp/acm32/acm32h5xx-nucleo/template.eww create mode 100644 bsp/acm32/acm32h5xx-nucleo/template.uvoptx create mode 100644 bsp/acm32/acm32h5xx-nucleo/template.uvprojx diff --git a/bsp/acm32/acm32f0x0-nucleo/README.md b/bsp/acm32/acm32f0x0-nucleo/README.md index ea7fcfd283..4cd9c13dda 100644 --- a/bsp/acm32/acm32f0x0-nucleo/README.md +++ b/bsp/acm32/acm32f0x0-nucleo/README.md @@ -2,7 +2,7 @@ ## 1. 简介 -ACM32F0x0芯片是上海爱信诺航芯电子科技有限公司(后续简称上海航芯)一系列支持多种低功耗模式的通用MCU。包括如下硬件特性: +ACM32F0x0芯片是上海航芯电子科技股份有限公司(后续简称上海航芯)一系列支持多种低功耗模式的通用MCU。包括如下硬件特性: |--------------------------|--------------------| | 硬件 | 描述 | diff --git a/bsp/acm32/acm32f0x0-nucleo/project.uvoptx b/bsp/acm32/acm32f0x0-nucleo/project.uvoptx index 71abd8fd0d..75fbc3c919 100644 --- a/bsp/acm32/acm32f0x0-nucleo/project.uvoptx +++ b/bsp/acm32/acm32f0x0-nucleo/project.uvoptx @@ -73,7 +73,7 @@ 0 - 0 + 1 0 1 @@ -179,4 +179,992 @@ + + ACM32_HAL + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_IWDT.c + HAL_IWDT.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_UART.c + HAL_UART.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_RTC.c + HAL_RTC.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_EXTI.c + HAL_EXTI.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_DMA.c + HAL_DMA.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_TIMER.c + HAL_TIMER.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_ADC.c + HAL_ADC.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_I2C.c + HAL_I2C.c + 0 + 0 + + + 1 + 9 + 2 + 0 + 0 + 0 + libraries\Device\Startup_ACM32F0x0.s + Startup_ACM32F0x0.s + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_CRC.c + HAL_CRC.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_WDT.c + HAL_WDT.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_SPI.c + HAL_SPI.c + 0 + 0 + + + 1 + 13 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_GPIO.c + HAL_GPIO.c + 0 + 0 + + + 1 + 14 + 1 + 0 + 0 + 0 + libraries\Device\System_ACM32F0x0.c + System_ACM32F0x0.c + 0 + 0 + + + + + Applications + 0 + 0 + 0 + 0 + + 2 + 15 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Compiler + 0 + 0 + 0 + 0 + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + DeviceDrivers + 1 + 0 + 0 + 0 + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\hwtimer\hwtimer.c + hwtimer.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 4 + 27 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 4 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 4 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 4 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 4 + 34 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 4 + 35 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\adc.c + adc.c + 0 + 0 + + + 4 + 36 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 4 + 37 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + 4 + 38 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\watchdog\dev_watchdog.c + dev_watchdog.c + 0 + 0 + + + + + Drivers + 1 + 0 + 0 + 0 + + 5 + 39 + 1 + 0 + 0 + 0 + drivers\drv_soft_i2c.c + drv_soft_i2c.c + 0 + 0 + + + 5 + 40 + 1 + 0 + 0 + 0 + drivers\drv_rtc.c + drv_rtc.c + 0 + 0 + + + 5 + 41 + 1 + 0 + 0 + 0 + drivers\drv_uart.c + drv_uart.c + 0 + 0 + + + 5 + 42 + 1 + 0 + 0 + 0 + drivers\drv_hwtimer.c + drv_hwtimer.c + 0 + 0 + + + 5 + 43 + 1 + 0 + 0 + 0 + drivers\drv_wdt.c + drv_wdt.c + 0 + 0 + + + 5 + 44 + 1 + 0 + 0 + 0 + drivers\drv_pm.c + drv_pm.c + 0 + 0 + + + 5 + 45 + 1 + 0 + 0 + 0 + drivers\drv_i2c.c + drv_i2c.c + 0 + 0 + + + 5 + 46 + 1 + 0 + 0 + 0 + drivers\board.c + board.c + 0 + 0 + + + 5 + 47 + 1 + 0 + 0 + 0 + drivers\drv_spi.c + drv_spi.c + 0 + 0 + + + 5 + 48 + 1 + 0 + 0 + 0 + drivers\drv_adc.c + drv_adc.c + 0 + 0 + + + 5 + 49 + 1 + 0 + 0 + 0 + drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 6 + 50 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 1 + 0 + 0 + 0 + + 7 + 54 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 7 + 57 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 7 + 58 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 7 + 59 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 60 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 61 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + 7 + 69 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 71 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 72 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + 7 + 73 + 1 + 0 + 0 + 0 + ..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + + + libcpu + 0 + 0 + 0 + 0 + + 8 + 74 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 8 + 75 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 8 + 76 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m0\context_rvds.S + context_rvds.S + 0 + 0 + + + 8 + 77 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m0\cpuport.c + cpuport.c + 0 + 0 + + + diff --git a/bsp/acm32/acm32f0x0-nucleo/project.uvprojx b/bsp/acm32/acm32f0x0-nucleo/project.uvprojx index e0f6df6bd2..af94e4bbc0 100644 --- a/bsp/acm32/acm32f0x0-nucleo/project.uvprojx +++ b/bsp/acm32/acm32f0x0-nucleo/project.uvprojx @@ -1,7 +1,10 @@ + 2.1 +
### uVision Project, (C) Keil Software
+ ACM32F0x0 @@ -13,31 +16,31 @@ ARMCM0 ARM - ARM.CMSIS.5.7.0 + ARM.CMSIS.5.8.0 http://www.keil.com/pack/ IRAM(0x20000000,0x00020000) IROM(0x00000000,0x00040000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE - - + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000) 0 $$Device:ARMCM0$Device\ARM\ARMCM0\Include\ARMCM0.h - - - - - - - - - - + + + + + + + + + + 0 0 - - - - - + + + + + 0 0 @@ -59,8 +62,8 @@ 0 0 - - + + 0 0 0 @@ -69,8 +72,8 @@ 0 0 - - + + 0 0 0 @@ -80,14 +83,14 @@ 1 0 fromelf.exe --bin --output rtthread.bin ./build/keil/Obj/acm32f030.axf - + 0 0 0 0 0 - + 0 @@ -101,8 +104,8 @@ 0 0 3 - - + + 1 @@ -135,11 +138,11 @@ 1 BIN\UL2CM3.DLL - - - - - + + + + + 0 @@ -172,7 +175,7 @@ 0 0 "Cortex-M0" - + 0 0 0 @@ -306,7 +309,7 @@ 0x0 - + 1 @@ -333,9 +336,9 @@ 0 0 - + RT_USING_LIBC, RT_USING_ARMLIBC, __STDC_LIMIT_MACROS, __RTTHREAD__, __CLK_TCK=RT_TICK_PER_SECOND - + ..\..\..\components\drivers\include;applications;..\..\..\libcpu\arm\cortex-m0;libraries\Device;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\components\libc\compilers\common\include;libraries\CMSIS;drivers;.;..\..\..\components\finsh;..\..\..\components\libc\posix\io\epoll;..\..\..\libcpu\arm\common;libraries\HAL_Driver\Inc;..\..\..\components\drivers\include;..\..\..\include;..\..\..\components\libc\posix\io\eventfd;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\poll;..\..\..\components\drivers\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\include @@ -351,10 +354,10 @@ 0 4 - - - - + + + + @@ -366,13 +369,13 @@ 0 0x00000000 0x20000000 - + .\drivers\linker_scripts\link.sct - - - - - + + + + + @@ -385,92 +388,66 @@ 1 libraries\HAL_Driver\Src\HAL_IWDT.c - - HAL_UART.c 1 libraries\HAL_Driver\Src\HAL_UART.c - - HAL_RTC.c 1 libraries\HAL_Driver\Src\HAL_RTC.c - - HAL_EXTI.c 1 libraries\HAL_Driver\Src\HAL_EXTI.c - - HAL_DMA.c 1 libraries\HAL_Driver\Src\HAL_DMA.c - - HAL_TIMER.c 1 libraries\HAL_Driver\Src\HAL_TIMER.c - - HAL_ADC.c 1 libraries\HAL_Driver\Src\HAL_ADC.c - - HAL_I2C.c 1 libraries\HAL_Driver\Src\HAL_I2C.c - - Startup_ACM32F0x0.s 2 libraries\Device\Startup_ACM32F0x0.s - - HAL_CRC.c 1 libraries\HAL_Driver\Src\HAL_CRC.c - - HAL_WDT.c 1 libraries\HAL_Driver\Src\HAL_WDT.c - - HAL_SPI.c 1 libraries\HAL_Driver\Src\HAL_SPI.c - - HAL_GPIO.c 1 libraries\HAL_Driver\Src\HAL_GPIO.c - - System_ACM32F0x0.c 1 @@ -496,50 +473,36 @@ 1 ..\..\..\components\libc\compilers\armlibc\syscall_mem.c - - syscalls.c 1 ..\..\..\components\libc\compilers\armlibc\syscalls.c - - cctype.c 1 ..\..\..\components\libc\compilers\common\cctype.c - - cstdlib.c 1 ..\..\..\components\libc\compilers\common\cstdlib.c - - cstring.c 1 ..\..\..\components\libc\compilers\common\cstring.c - - ctime.c 1 ..\..\..\components\libc\compilers\common\ctime.c - - cunistd.c 1 ..\..\..\components\libc\compilers\common\cunistd.c - - cwchar.c 1 @@ -555,245 +518,534 @@ 1 ..\..\..\components\drivers\core\device.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - hwtimer.c 1 ..\..\..\components\drivers\hwtimer\hwtimer.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - - completion.c + completion_up.c 1 - ..\..\..\components\drivers\ipc\completion.c - - - - - - __RT_IPC_SOURCE__ - - - - - - + ..\..\..\components\drivers\ipc\completion_up.c + + + completion_comm.c + 1 + ..\..\..\components\drivers\ipc\completion_comm.c + + + condvar.c + 1 + ..\..\..\components\drivers\ipc\condvar.c - - dataqueue.c 1 ..\..\..\components\drivers\ipc\dataqueue.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - pipe.c 1 ..\..\..\components\drivers\ipc\pipe.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - ringblk_buf.c 1 ..\..\..\components\drivers\ipc\ringblk_buf.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - ringbuffer.c 1 ..\..\..\components\drivers\ipc\ringbuffer.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - waitqueue.c 1 ..\..\..\components\drivers\ipc\waitqueue.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - workqueue.c 1 ..\..\..\components\drivers\ipc\workqueue.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - adc.c 1 ..\..\..\components\drivers\misc\adc.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - - pin.c + dev_pin.c 1 - ..\..\..\components\drivers\pin\pin.c - - - - - - __RT_IPC_SOURCE__ - - - - - - + ..\..\..\components\drivers\pin\dev_pin.c - - - serial.c + dev_serial.c 1 - ..\..\..\components\drivers\serial\serial.c - - - - - - __RT_IPC_SOURCE__ - - - - - - + ..\..\..\components\drivers\serial\dev_serial.c - - - watchdog.c + dev_watchdog.c 1 - ..\..\..\components\drivers\watchdog\watchdog.c - - - - - - __RT_IPC_SOURCE__ - - - - - - + ..\..\..\components\drivers\watchdog\dev_watchdog.c @@ -805,71 +1057,51 @@ 1 drivers\drv_soft_i2c.c - - drv_rtc.c 1 drivers\drv_rtc.c - - drv_uart.c 1 drivers\drv_uart.c - - drv_hwtimer.c 1 drivers\drv_hwtimer.c - - drv_wdt.c 1 drivers\drv_wdt.c - - drv_pm.c 1 drivers\drv_pm.c - - drv_i2c.c 1 drivers\drv_i2c.c - - board.c 1 drivers\board.c - - drv_spi.c 1 drivers\drv_spi.c - - drv_adc.c 1 drivers\drv_adc.c - - drv_gpio.c 1 @@ -885,22 +1117,16 @@ 1 ..\..\..\components\finsh\shell.c - - msh.c 1 ..\..\..\components\finsh\msh.c - - msh_parse.c 1 ..\..\..\components\finsh\msh_parse.c - - cmd.c 1 @@ -916,284 +1142,866 @@ 1 ..\..\..\src\clock.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - components.c 1 ..\..\..\src\components.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - idle.c 1 ..\..\..\src\idle.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - ipc.c 1 ..\..\..\src\ipc.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - irq.c 1 ..\..\..\src\irq.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - kstdio.c 1 ..\..\..\src\klibc\kstdio.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - kstring.c 1 ..\..\..\src\klibc\kstring.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - kservice.c 1 ..\..\..\src\kservice.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - mem.c 1 ..\..\..\src\mem.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - mempool.c 1 ..\..\..\src\mempool.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - object.c 1 ..\..\..\src\object.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - scheduler_comm.c 1 ..\..\..\src\scheduler_comm.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - scheduler_up.c 1 ..\..\..\src\scheduler_up.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - thread.c 1 ..\..\..\src\thread.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - timer.c 1 ..\..\..\src\timer.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + + + cpu_up.c + 1 + ..\..\..\src\cpu_up.c + + + kerrno.c + 1 + ..\..\..\src\klibc\kerrno.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + rt_vsscanf.c + 1 + ..\..\..\src\klibc\rt_vsscanf.c + + + defunct.c + 1 + ..\..\..\src\defunct.c + @@ -1204,22 +2012,16 @@ 1 ..\..\..\libcpu\arm\common\div0.c - - showmem.c 1 ..\..\..\libcpu\arm\common\showmem.c - - context_rvds.S 2 ..\..\..\libcpu\arm\cortex-m0\context_rvds.S - - cpuport.c 1 @@ -1230,18 +2032,21 @@ + - - - + + + + - <Project Info> + project 0 1 +
diff --git a/bsp/acm32/acm32f4xx-nucleo/README.md b/bsp/acm32/acm32f4xx-nucleo/README.md index 0a7404aa5c..1ce32facb1 100644 --- a/bsp/acm32/acm32f4xx-nucleo/README.md +++ b/bsp/acm32/acm32f4xx-nucleo/README.md @@ -2,7 +2,7 @@ ## 1. 简介 -ACM32F4xx芯片是上海爱信诺航芯电子科技有限公司(后续简称上海航芯)一系列支持多种低功耗模式的通用MCU。包括如下硬件特性: +ACM32F4xx芯片是上海航芯电子科技股份有限公司(后续简称上海航芯)一系列支持多种低功耗模式的通用MCU。包括如下硬件特性: |--------------------------|--------------------| | 硬件 | 描述 | diff --git a/bsp/acm32/acm32f4xx-nucleo/libraries/Device/System_Accelerate.c b/bsp/acm32/acm32f4xx-nucleo/libraries/Device/System_Accelerate.c new file mode 100644 index 0000000000..33908ee3be --- /dev/null +++ b/bsp/acm32/acm32f4xx-nucleo/libraries/Device/System_Accelerate.c @@ -0,0 +1,344 @@ +/* + ****************************************************************************** + * @file System_Accelerate.c + * @author AisinoChip Firmware Team + * @version V1.0.0 + * @date 2020 + * @brief MCU Cache Peripheral Access Layer System Source File. + ****************************************************************************** + * @attention + * + * Copyright (c) 2020 AisinoChip. + * All rights reserved. + ****************************************************************************** +*/ +#include "ACM32F4.h" + +#include "System_Accelerate.h" + +/* Cache Size ID Register Macros */ +#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) +#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) + +/********************************************************************************* +* Function : System_EnableIAccelerate +* Description : Enable I-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_EnableIAccelerate(void) +{ + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_DisableIAccelerate +* Description : Disable I-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_DisableIAccelerate(void) +{ + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_InvalidateIAccelerate +* Description : Invalidate I-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_InvalidateIAccelerate(void) +{ + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_EnableDAccelerate +* Description : Enable D-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_EnableDAccelerate(void) +{ + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do + { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do + { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk)); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + }while (ways-- != 0U); + }while(sets-- != 0U); + __DSB(); + + SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ + + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_DisableDAccelerate +* Description : Disable D-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_DisableDAccelerate(void) +{ + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do + { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do + { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk)); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + }while(ways-- != 0U); + }while(sets-- != 0U); + + __DSB(); + __ISB(); + + SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ + __DSB(); + __ISB(); + +} + +/********************************************************************************* +* Function : System_InvalidateDAccelerate +* Description : Invalidate D-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_InvalidateDAccelerate(void) +{ + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do + { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do + { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk)); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + }while(ways-- != 0U); + }while(sets-- != 0U); + + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_CleanDAccelerate +* Description : Clean D-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_CleanDAccelerate(void) +{ + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do + { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do + { + SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | + ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk)); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_CleanInvalidateDAccelerate +* Description : Cleans and Invalidates D-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_CleanInvalidateDAccelerate(void) +{ + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_InvalidateDAccelerate +* Description : Invalidate D-Cache by addr +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_InvalidateDAccelerate_by_Addr (uint32_t *addr, int32_t dsize) +{ + int32_t op_size = dsize + ((uint32_t)addr & 0x1F); + uint32_t op_addr = ((uint32_t)addr & (~0x1F)); + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) + { + SCB->DCIMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_CleanDAccelerate_by_Addr +* Description : Cleans D-Cache for the given address +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_CleanDAccelerate_by_Addr (uint32_t *addr, int32_t dsize) +{ + int32_t op_size = dsize + ((uint32_t)addr & 0x1F); + uint32_t op_addr = ((uint32_t)addr & (~0x1F)); + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCCMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_CleanInvalidateDAccelerate_by_Addr +* Description : Cleans and invalidates D_Cache for the given address +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_CleanInvalidateDAccelerate_by_Addr (uint32_t *addr, int32_t dsize) +{ + int32_t op_size = dsize + ((uint32_t)addr & 0x1F); + uint32_t op_addr = ((uint32_t)addr & (~0x1F)); + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCCIMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); +} + + + diff --git a/bsp/acm32/acm32f4xx-nucleo/libraries/Device/System_Accelerate.h b/bsp/acm32/acm32f4xx-nucleo/libraries/Device/System_Accelerate.h index 4e0c2a6fa7..a669f82827 100644 --- a/bsp/acm32/acm32f4xx-nucleo/libraries/Device/System_Accelerate.h +++ b/bsp/acm32/acm32f4xx-nucleo/libraries/Device/System_Accelerate.h @@ -1,15 +1,22 @@ /* ****************************************************************************** * @file System_Accelerate.h + * @author AisinoChip Firmware Team * @version V1.0.0 * @date 2020 * @brief MCU Accelerate Peripheral Access Layer System header File. ****************************************************************************** + * @attention + * + * Copyright (c) 2020 AisinoChip. + * All rights reserved. + ****************************************************************************** */ #ifndef __SYSTEM_ACCELERATE_H__ #define __SYSTEM_ACCELERATE_H__ - +//#include "cmsis_armclang.h" +#include "stdint.h" /* System_EnableIAccelerate */ void System_EnableIAccelerate(void); @@ -17,12 +24,29 @@ void System_EnableIAccelerate(void); /* System_DisableIAccelerate */ void System_DisableIAccelerate(void); +/* System_InvalidateIAccelerate */ +void System_InvalidateIAccelerate(void); + /* System_EnableDAccelerate */ void System_EnableDAccelerate(void); /* System_DisableDAccelerate */ void System_DisableDAccelerate(void); +/* System_InvalidateDAccelerate */ +void System_InvalidateDAccelerate(void); + +/* System_CleanDAccelerate */ +void System_CleanDAccelerate(void); + +/* System_CleanInvalidateDAccelerate */ +void System_CleanInvalidateDAccelerate(void); + +/* System_InvalidateDAccelerate_by_Addr */ +void System_InvalidateDAccelerate_by_Addr (uint32_t *addr, int32_t dsize); + +/* System_CleanInvalidateDAccelerate_by_Addr */ +void System_CleanInvalidateDAccelerate_by_Addr (uint32_t *addr, int32_t dsize); #endif diff --git a/bsp/acm32/acm32f4xx-nucleo/libraries/HAL_Driver/Src/HAL_EFlash_Ex.c b/bsp/acm32/acm32f4xx-nucleo/libraries/HAL_Driver/Src/HAL_EFlash_Ex.c new file mode 100644 index 0000000000..3985a0e90a --- /dev/null +++ b/bsp/acm32/acm32f4xx-nucleo/libraries/HAL_Driver/Src/HAL_EFlash_Ex.c @@ -0,0 +1,201 @@ +/* + ****************************************************************************** + * @file HAL_EFlash.c + * @author AisinoChip Firmware Team + * @version V1.0.1 + * @date 2021 + * @brief EFlash HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the internal FLASH memory: + * @ Program operations functions + * @ Erase operations functions + ****************************************************************************** + * @attention + * + * Copyright (c) 2021 AisinoChip. + * All rights reserved. + ****************************************************************************** +*/ +#include "ACM32Fxx_HAL.h" + +#define REG(x) (*(volatile UINT32 *)(x)) +#define PAGE_SIZE 512U + +void HAL_EFlash_ReWrite_Word(UINT32 addr, UINT32 value) +{ + UINT32 buff[128]; + UINT32 i; + UINT32 *dst; + UINT32 dst_addr; + UINT32 page_addr; + + if(REG(addr)==value) + { + return; + } + + page_addr = addr&0xFFFFFE00; + + dst = (UINT32 *)(page_addr); + for(i=0;i<(PAGE_SIZE/4); i++) + { + buff[i]=*dst++; + } + buff[(addr-page_addr)/4] = value; + + HAL_EFlash_ErasePage(page_addr); + + dst_addr = page_addr; + for(i=0;i<(PAGE_SIZE/4); i++) + { + HAL_EFlash_Program_Word(dst_addr,buff[i]); + dst_addr +=4; + } +} + +void HAL_EFlash_Return_to_Boot(void) +{ + HAL_EFlash_ReWrite_Word(0x00080400, 0xFFFFFFFFU); +} + +void HAL_EFlash_Remap_Enable(void) +{ + HAL_EFlash_ReWrite_Word(0x00080400, 0x89BC3F51U); +} + +void HAL_EFlash_JTAG_Enable(void) +{ + HAL_EFlash_ReWrite_Word(0x0008041C, 0xFFFFFFFFU); +} + +void HAL_EFlash_JTAG_Diable(void) +{ + HAL_EFlash_ReWrite_Word(0x0008041C, 0x89BC3F51U); +} + +void HAL_EFlash_Option_LOCK(void) +{ + HAL_EFlash_ReWrite_Word(0x000805FC, 0x55AA77EEU); +} + + +void HAL_EFlash_Init_Para(uint32_t fu32_freq) +{ + uint32_t lu32_RDWait; + uint32_t lu32_TERASE; + uint32_t lu32_TPROG; + uint32_t lu32_TNVS; + + /* Eflash Config */ + + lu32_TERASE = 35 * (fu32_freq/10000U) + 1; // 3.5 ms + lu32_TPROG = 9 * (fu32_freq/1000000U) + 1; // 9us + lu32_TNVS = (51 * (fu32_freq/1000000U))/10 + 5; // 5.1us + + if (fu32_freq >= 175000000) + { + lu32_RDWait = 8; + } + else if (fu32_freq > 156000000) + { + lu32_RDWait = 7; + } + else if(fu32_freq > 136000000) + { + lu32_RDWait = 6; + } + else if(fu32_freq > 116000000) + { + lu32_RDWait = 5; + } + else if(fu32_freq > 92000000) + { + lu32_RDWait = 4; + } + else if(fu32_freq > 74000000) + { + lu32_RDWait = 3; + } + else if(fu32_freq > 52000000) + { + lu32_RDWait = 2; + } + else if(fu32_freq > 32000000) + { + lu32_RDWait = 1; + } + else + { + lu32_RDWait = 0; + } + + EFC->TNVS = lu32_TNVS; + EFC->CTRL = (EFC->CTRL & ~(0x1F << 7)) | (lu32_RDWait << 7); + EFC->TERASE = lu32_TERASE; + EFC->TPROG = lu32_TPROG; + +} + +/********************************************************************************* +* Function : HAL_EFlash_ErasePage_Ex +* Description : Erase a Page, TERASE has been configured in System_Clock_Init() +* Input : +* Output : false: FAIL + true: SUCCESS +* Author : Chris_Kyle +**********************************************************************************/ +void HAL_EFlash_ErasePage_EX(uint32_t fu32_Addr) +{ + __set_PRIMASK(1); + + EFC->CTRL |= EFC_CTRL_PAGE_ERASE_MODE; + + EFC->SEC = 0x55AAAA55; + + *((volatile uint32_t *)fu32_Addr) = 0; + + System_InvalidateDAccelerate_by_Addr((uint32_t *)0x00100014, 32); // 32 bytes = 1 cache line , cache line one time + + while (!(EFC->STATUS & EFC_STATUS_EFLASH_RDY)) + { + System_InvalidateDAccelerate_by_Addr((uint32_t *)0x00100014, 32); + } + + EFC->CTRL &= ~EFC_CTRL_PAGE_ERASE_MODE; + System_InvalidateDAccelerate_by_Addr((uint32_t *)fu32_Addr, PAGE_SIZE); + + __set_PRIMASK(0); +} + +/********************************************************************************* +* Function : HAL_EFlash_Program_Word_Ex +* Description : Program a word, TPROG has been configured in System_Clock_Init() +* Input : +* Output : false: FAIL + true: SUCCESS +* Author : Chris_Kyle +**********************************************************************************/ +void HAL_EFlash_Program_Word_EX(uint32_t fu32_Addr, uint32_t fu32_Data) +{ + __set_PRIMASK(1); + + EFC->CTRL |= EFC_CTRL_PROGRAM_MODE; + + EFC->SEC = 0x55AAAA55; + + *((volatile uint32_t *)fu32_Addr) = fu32_Data; + System_InvalidateDAccelerate_by_Addr((uint32_t *)0x00100014, 32); + + while (!(EFC->STATUS & EFC_STATUS_EFLASH_RDY)) + { + System_InvalidateDAccelerate_by_Addr((uint32_t *)0x00100014, 32); + } + + EFC->CTRL &= ~EFC_CTRL_PROGRAM_MODE; + + __set_PRIMASK(0); +} + + + + diff --git a/bsp/acm32/acm32f4xx-nucleo/project.uvoptx b/bsp/acm32/acm32f4xx-nucleo/project.uvoptx index 6668d384aa..3faceb5c15 100644 --- a/bsp/acm32/acm32f4xx-nucleo/project.uvoptx +++ b/bsp/acm32/acm32f4xx-nucleo/project.uvoptx @@ -318,4 +318,824 @@ + + ACM32_HAL + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_UART.c + HAL_UART.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_EXTI.c + HAL_EXTI.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_DMA.c + HAL_DMA.c + 0 + 0 + + + 1 + 4 + 2 + 0 + 0 + 0 + libraries\Device\Startup_ACM32F4.s + Startup_ACM32F4.s + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + libraries\Device\System_ACM32F4.c + System_ACM32F4.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + .\libraries\Device\System_Accelerate.c + System_Accelerate.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_GPIO.c + HAL_GPIO.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_EFlash.c + HAL_EFlash.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + .\libraries\HAL_Driver\Src\HAL_EFlash_Ex.c + HAL_EFlash_Ex.c + 0 + 0 + + + + + Applications + 1 + 0 + 0 + 0 + + 2 + 10 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Compiler + 0 + 0 + 0 + 0 + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + DeviceDrivers + 1 + 0 + 0 + 0 + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 4 + 27 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 4 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 4 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + 4 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 5 + 31 + 1 + 0 + 0 + 0 + drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + drivers\board.c + board.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + drivers\drv_uart.c + drv_uart.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 6 + 34 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 35 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 36 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 1 + 0 + 0 + 0 + + 7 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 7 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 7 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 7 + 42 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 7 + 43 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + 7 + 57 + 1 + 0 + 0 + 0 + ..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + + + libcpu + 1 + 0 + 0 + 0 + + 8 + 58 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 8 + 59 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 8 + 60 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m33\context_rvds.S + context_rvds.S + 0 + 0 + + + 8 + 61 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m33\cpuport.c + cpuport.c + 0 + 0 + + + 8 + 62 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m33\syscall_rvds.S + syscall_rvds.S + 0 + 0 + + + 8 + 63 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m33\trustzone.c + trustzone.c + 0 + 0 + + + diff --git a/bsp/acm32/acm32f4xx-nucleo/project.uvprojx b/bsp/acm32/acm32f4xx-nucleo/project.uvprojx index f3290dcac0..017b833936 100644 --- a/bsp/acm32/acm32f4xx-nucleo/project.uvprojx +++ b/bsp/acm32/acm32f4xx-nucleo/project.uvprojx @@ -1,43 +1,47 @@ + 2.1 +
### uVision Project, (C) Keil Software
+ ACM32F4XX 0x4 ARM-ADS - 6140000::V6.14::ARMCLANG + 6160000::V6.16::ARMCLANG + 6160000::V6.16::ARMCLANG 1 ARMCM33_DSP_FP ARM - ARM.CMSIS.5.7.0 + ARM.CMSIS.5.8.0 http://www.keil.com/pack/ IRAM(0x20000000,0x00020000) IRAM2(0x20200000,0x00020000) IROM(0x00000000,0x00200000) IROM2(0x00200000,0x00200000) CPUTYPE("Cortex-M33") FPU3(SFPU) DSP CLOCK(12000000) ESEL ELITTLE - - + + UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000) 0 $$Device:ARMCM33_DSP_FP$Device\ARM\ARMCM33\Include\ARMCM33_DSP_FP.h - - - - - - - - - - + + + + + + + + + + 0 0 - - - - - + + + + + 0 0 @@ -59,8 +63,8 @@ 0 0 - - + + 0 0 0 @@ -69,8 +73,8 @@ 0 0 - - + + 0 0 0 @@ -80,14 +84,14 @@ 1 0 fromelf.exe --bin --output ./build/ACM32F4.bin ./build/ACM32F4.axf - + 0 0 0 0 0 - + 0 @@ -101,15 +105,15 @@ 0 0 3 - - + + 1 - - - - + + + + SARMV8M.DLL -MPU TCM.DLL @@ -136,10 +140,10 @@ 1 BIN\UL2V8M.DLL "" () - - - - + + + + 0 @@ -172,7 +176,7 @@ 0 0 "Cortex-M33" - + 0 0 0 @@ -306,7 +310,7 @@ 0x20000 - + 1 @@ -325,7 +329,7 @@ 0 0 0 - 3 + 5 3 1 1 @@ -333,9 +337,9 @@ 0 0 - + RT_USING_LIBC, RT_USING_ARMLIBC, __STDC_LIMIT_MACROS, __RTTHREAD__, __CLK_TCK=RT_TICK_PER_SECOND - + libraries\CMSIS;..\..\..\components\libc\posix\ipc;..\..\..\components\libc\compilers\common\include;drivers;..\..\..\libcpu\arm\common;..\..\..\components\libc\compilers\common\extension;..\..\..\components\drivers\include;..\..\..\components\drivers\include;applications;..\..\..\components\drivers\include;..\..\..\components\libc\posix\io\eventfd;..\..\..\components\libc\posix\io\epoll;libraries\Device;.;..\..\..\components\libc\posix\io\poll;..\..\..\components\drivers\include;..\..\..\include;..\..\..\components\finsh;..\..\..\libcpu\arm\cortex-m33;libraries\HAL_Driver\Inc;..\..\..\components\libc\compilers\common\extension\fcntl\octal @@ -349,12 +353,12 @@ 0 0 0 - 4 + 1 - - - - + + + + @@ -366,13 +370,13 @@ 0 0x00000000 0x20000000 - - - - - - - + + + + + + + @@ -385,48 +389,46 @@ 1 libraries\HAL_Driver\Src\HAL_UART.c - - HAL_EXTI.c 1 libraries\HAL_Driver\Src\HAL_EXTI.c - - HAL_DMA.c 1 libraries\HAL_Driver\Src\HAL_DMA.c - - Startup_ACM32F4.s 2 libraries\Device\Startup_ACM32F4.s - - System_ACM32F4.c 1 libraries\Device\System_ACM32F4.c - - + + System_Accelerate.c + 1 + .\libraries\Device\System_Accelerate.c + HAL_GPIO.c 1 libraries\HAL_Driver\Src\HAL_GPIO.c - - HAL_EFlash.c 1 libraries\HAL_Driver\Src\HAL_EFlash.c + + HAL_EFlash_Ex.c + 1 + .\libraries\HAL_Driver\Src\HAL_EFlash_Ex.c + @@ -447,50 +449,36 @@ 1 ..\..\..\components\libc\compilers\armlibc\syscall_mem.c - - syscalls.c 1 ..\..\..\components\libc\compilers\armlibc\syscalls.c - - cctype.c 1 ..\..\..\components\libc\compilers\common\cctype.c - - cstdlib.c 1 ..\..\..\components\libc\compilers\common\cstdlib.c - - cstring.c 1 ..\..\..\components\libc\compilers\common\cstring.c - - ctime.c 1 ..\..\..\components\libc\compilers\common\ctime.c - - cunistd.c 1 ..\..\..\components\libc\compilers\common\cunistd.c - - cwchar.c 1 @@ -506,188 +494,417 @@ 1 ..\..\..\components\drivers\core\device.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - - completion.c + completion_up.c 1 - ..\..\..\components\drivers\ipc\completion.c - - - - - - __RT_IPC_SOURCE__ - - - - - - + ..\..\..\components\drivers\ipc\completion_up.c + + + completion_comm.c + 1 + ..\..\..\components\drivers\ipc\completion_comm.c - - dataqueue.c 1 ..\..\..\components\drivers\ipc\dataqueue.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - pipe.c 1 ..\..\..\components\drivers\ipc\pipe.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - ringblk_buf.c 1 ..\..\..\components\drivers\ipc\ringblk_buf.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - ringbuffer.c 1 ..\..\..\components\drivers\ipc\ringbuffer.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - waitqueue.c 1 ..\..\..\components\drivers\ipc\waitqueue.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - workqueue.c 1 ..\..\..\components\drivers\ipc\workqueue.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_IPC_SOURCE__ - + - - - pin.c + dev_pin.c 1 - ..\..\..\components\drivers\pin\pin.c - - - - - - __RT_IPC_SOURCE__ - - - - - - + ..\..\..\components\drivers\pin\dev_pin.c - - - serial.c + dev_serial.c 1 - ..\..\..\components\drivers\serial\serial.c - - - - - - __RT_IPC_SOURCE__ - - - - - - + ..\..\..\components\drivers\serial\dev_serial.c + + + condvar.c + 1 + ..\..\..\components\drivers\ipc\condvar.c @@ -699,15 +916,11 @@ 1 drivers\drv_gpio.c - - board.c 1 drivers\board.c - - drv_uart.c 1 @@ -723,22 +936,16 @@ 1 ..\..\..\components\finsh\shell.c - - msh.c 1 ..\..\..\components\finsh\msh.c - - msh_parse.c 1 ..\..\..\components\finsh\msh_parse.c - - cmd.c 1 @@ -754,284 +961,866 @@ 1 ..\..\..\src\clock.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - components.c 1 ..\..\..\src\components.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - idle.c 1 ..\..\..\src\idle.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - ipc.c 1 ..\..\..\src\ipc.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - irq.c 1 ..\..\..\src\irq.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - kstdio.c 1 ..\..\..\src\klibc\kstdio.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - kstring.c 1 ..\..\..\src\klibc\kstring.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - kservice.c 1 ..\..\..\src\kservice.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - mem.c 1 ..\..\..\src\mem.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - mempool.c 1 ..\..\..\src\mempool.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - object.c 1 ..\..\..\src\object.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - scheduler_comm.c 1 ..\..\..\src\scheduler_comm.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - scheduler_up.c 1 ..\..\..\src\scheduler_up.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - thread.c 1 ..\..\..\src\thread.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + - - timer.c 1 ..\..\..\src\timer.c + + 2 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 __RT_KERNEL_SOURCE__ - + + + kerrno.c + 1 + ..\..\..\src\klibc\kerrno.c + + + cpu_up.c + 1 + ..\..\..\src\cpu_up.c + + + rt_vsscanf.c + 1 + ..\..\..\src\klibc\rt_vsscanf.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + defunct.c + 1 + ..\..\..\src\defunct.c + @@ -1042,36 +1831,26 @@ 1 ..\..\..\libcpu\arm\common\div0.c - - showmem.c 1 ..\..\..\libcpu\arm\common\showmem.c - - context_rvds.S 2 ..\..\..\libcpu\arm\cortex-m33\context_rvds.S - - cpuport.c 1 ..\..\..\libcpu\arm\cortex-m33\cpuport.c - - syscall_rvds.S 2 ..\..\..\libcpu\arm\cortex-m33\syscall_rvds.S - - trustzone.c 1 @@ -1082,18 +1861,21 @@ + - - - + + + + - <Project Info> + project 0 1 +
diff --git a/bsp/acm32/acm32h5xx-nucleo/.config b/bsp/acm32/acm32h5xx-nucleo/.config new file mode 100644 index 0000000000..a827a67a5f --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/.config @@ -0,0 +1,1103 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Project Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_AMP is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=8 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=100 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 + +# +# kservice optimization +# +# CONFIG_RT_KSERVICE_USING_STDLIB is not set +# CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set +# CONFIG_RT_USING_TINY_FFS is not set +# CONFIG_RT_KPRINTF_USING_LONGLONG is not set +CONFIG_RT_USING_DEBUG=y +CONFIG_RT_DEBUGING_COLOR=y +CONFIG_RT_DEBUGING_CONTEXT=y +# CONFIG_RT_DEBUGING_INIT is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMHEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +CONFIG_RT_USING_DEVICE_OPS=y +# CONFIG_RT_USING_DM is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x50002 +# CONFIG_RT_USING_STDC_ATOMIC is not set +# CONFIG_RT_USING_CACHE is not set +# CONFIG_RT_USING_HW_ATOMIC is not set +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set +# CONFIG_RT_USING_CPU_FFS is not set + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +# CONFIG_RT_USING_LEGACY is not set +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +CONFIG_FINSH_USING_OPTION_COMPLETION=y + +# +# DFS: device virtual file system +# +# CONFIG_RT_USING_DFS is not set +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_USING_SERIAL_V1=y +# CONFIG_RT_USING_SERIAL_V2 is not set +CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +# CONFIG_RT_USING_PHY is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_FDT is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_DEV_BUS is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set +# CONFIG_RT_USING_KTIME is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB is not set +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# C/C++ and POSIX layer +# + +# +# ISO-ANSI C layer +# + +# +# Timezone and Daylight Saving Time +# +# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set +CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y +CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 +CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 +CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RESOURCE_ID is not set +# CONFIG_RT_USING_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# CONFIG_RT_USING_VBUS is not set + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LWIP is not set +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_EZ_IOT_OS is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set +# CONFIG_PKG_USING_RYANW5500 is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set +# CONFIG_PKG_USING_ZEPHYR_POLLING is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_3GPP_AMRNB is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_CHERRYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set +# CONFIG_PKG_USING_FLASH_BLOB is not set +# CONFIG_PKG_USING_MLIBC is not set + +# +# peripheral libraries and drivers +# + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_CST816X is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ESP_IDF is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_ILI9341 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_AIP650 is not set +# CONFIG_PKG_USING_FINGERPRINT is not set +# CONFIG_PKG_USING_BT_ECB02C is not set +# CONFIG_PKG_USING_UAT is not set +# CONFIG_PKG_USING_SPI_TOOLS is not set + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_QPID is not set +# CONFIG_PKG_USING_UKAL is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_KISSFFT is not set + +# +# miscellaneous packages +# + +# +# project laboratory +# + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects and Demos +# +# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set +# CONFIG_PKG_USING_ARDUINO_TICKER is not set +# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# + +# +# Hardware Drivers Config +# +# CONFIG_SOC_ACM32F403KCU7 is not set +# CONFIG_SOC_ACM32F403KEU7 is not set +# CONFIG_SOC_ACM32F403CCT7 is not set +# CONFIG_SOC_ACM32F403CET7 is not set +# CONFIG_SOC_ACM32F403RCT7 is not set +CONFIG_SOC_ACM32F403RET7=y +# CONFIG_SOC_ACM32F403VCT7 is not set +# CONFIG_SOC_ACM32F403VET7 is not set + +# +# ACM32F403RET7 +# +CONFIG_SOC_SRAM_START_ADDR=0x20000000 +CONFIG_SOC_SRAM_SIZE=0xC0 +CONFIG_SOC_FLASH_START_ADDR=0x00000000 +CONFIG_SOC_FLASH_SIZE=0x8000 + +# +# Onboard Peripheral Drivers +# + +# +# On-chip Peripheral Drivers +# + +# +# Hardware GPIO +# +CONFIG_BSP_USING_GPIO1=y +CONFIG_BSP_USING_GPIO2=y +CONFIG_BSP_USING_GPIO3=y +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_DAC is not set + +# +# Hardware UART +# +CONFIG_BSP_USING_UART1=y +CONFIG_BSP_USING_UART2=y +CONFIG_BSP_UART2_RX_USING_DMA=y +CONFIG_BSP_UART2_TX_USING_DMA=y +CONFIG_BSP_USING_UART3=y +CONFIG_BSP_UART3_RX_USING_DMA=y +CONFIG_BSP_UART3_TX_USING_DMA=y +CONFIG_BSP_USING_UART4=y +CONFIG_BSP_UART4_RX_USING_DMA=y +CONFIG_BSP_UART4_TX_USING_DMA=y +# CONFIG_BSP_USING_RTC is not set +# CONFIG_BSP_USING_LPUART is not set + +# +# Hardware I2C +# +# CONFIG_BSP_USING_I2C1 is not set +# CONFIG_BSP_USING_I2C2 is not set + +# +# Hardware I2S +# +# CONFIG_BSP_USING_I2S1 is not set + +# +# Hardware CAN +# +# CONFIG_BSP_USING_CAN1 is not set +# CONFIG_BSP_USING_CAN2 is not set + +# +# Hardware TIMER +# +# CONFIG_BSP_USING_TIM1 is not set +# CONFIG_BSP_USING_TIM2 is not set +# CONFIG_BSP_USING_TIM3 is not set +# CONFIG_BSP_USING_TIM4 is not set +# CONFIG_BSP_USING_TIM6 is not set +# CONFIG_BSP_USING_TIM7 is not set +# CONFIG_BSP_USING_TIM14 is not set +# CONFIG_BSP_USING_TIM15 is not set +# CONFIG_BSP_USING_TIM16 is not set +# CONFIG_BSP_USING_TIM17 is not set + +# +# Hardware WDT +# +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_IWDT is not set +# CONFIG_BSP_USING_LCD is not set + +# +# Hardware SPI +# +# CONFIG_BSP_USING_SPI1 is not set +# CONFIG_BSP_USING_SPI2 is not set +# CONFIG_BSP_USING_SPI3 is not set +# CONFIG_BSP_USING_SPI4 is not set + +# +# Hardware CRYPTO +# +# CONFIG_BSP_USING_CRC is not set +# CONFIG_BSP_USING_AES is not set +# CONFIG_BSP_USING_HRNG is not set +# CONFIG_BSP_USING_CMP is not set +# CONFIG_BSP_USING_OPA is not set +# CONFIG_BSP_USING_TKEY is not set +# CONFIG_BSP_USING_RPMU is not set +# CONFIG_BSP_USING_USBD is not set + +# +# Board extended module Drivers +# diff --git a/bsp/acm32/acm32h5xx-nucleo/.ignore_format.yml b/bsp/acm32/acm32h5xx-nucleo/.ignore_format.yml new file mode 100644 index 0000000000..29b7c31648 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/.ignore_format.yml @@ -0,0 +1,6 @@ +# files format check exclude path, please follow the instructions below to modify; +# If you need to exclude an entire folder, add the folder path in dir_path; +# If you need to exclude a file, add the path to the file in file_path. + +dir_path: +- libraries diff --git a/bsp/acm32/acm32h5xx-nucleo/Debug_XIPFLASH.ini b/bsp/acm32/acm32h5xx-nucleo/Debug_XIPFLASH.ini new file mode 100644 index 0000000000..75fd5fdc31 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/Debug_XIPFLASH.ini @@ -0,0 +1,23 @@ +/******************************************************************************/ +/* Debug_RAM.ini: Initialization File for Debugging from Internal RAM */ +/******************************************************************************/ +/* This file is part of the uVision/ARM development tools. */ +/* Copyright (c) 2005-2014 Keil Software. All rights reserved. */ +/* This software may only be used under the terms of a valid, current, */ +/* end user licence from KEIL for a compatible version of KEIL software */ +/* development tools. Nothing else gives you the right to use this software. */ +/******************************************************************************/ + +FUNC void Setup (void) { + SP = _RDWORD(0x1FF00000); // ջָSP0x00000000ַеݸֵSP + PC = _RDWORD(0x1FF00004); // óָPC0x00000004ַеݸֵPC + _WDWORD(0xE000ED08, 0x00000000); // Setup Vector Table Offset Register +} + +//LOAD CLEAR NOCODE ..\..\..\BOOT\Spi_Boot\boot.axf +//LOAD CLEAR NOCODE .\boot.axf +LOAD .\boot.axf +LOAD %L INCREMENTAL // axfļRAM +//Setup(); //涨setupл + +//g, main //תmainʾʱҪmainִУע͵ˣ뿪ʼִ diff --git a/bsp/acm32/acm32h5xx-nucleo/EventRecorderStub.scvd b/bsp/acm32/acm32h5xx-nucleo/EventRecorderStub.scvd new file mode 100644 index 0000000000..2956b29683 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/EventRecorderStub.scvd @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/Kconfig b/bsp/acm32/acm32h5xx-nucleo/Kconfig new file mode 100644 index 0000000000..f02e680ad7 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/Kconfig @@ -0,0 +1,22 @@ +mainmenu "RT-Thread Project Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" + +source "$BSP_DIR/drivers/Kconfig" + diff --git a/bsp/acm32/acm32h5xx-nucleo/Project_user_xflash.sct b/bsp/acm32/acm32h5xx-nucleo/Project_user_xflash.sct new file mode 100644 index 0000000000..5bed4f4fe0 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/Project_user_xflash.sct @@ -0,0 +1,33 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +;LR_IROM1 0x08002000 0x00020000 { ; load region size_region +; ER_IROM1 0x08002000 0x00020000 { ; load address = execution address +LR_IROM1 0x08002000 0x001FE000 { ; load region size_region + ER_IROM1 0x08002000 0x001FE000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM1 0x20008000 0x00050000 { ; RW data + .ANY (+RW +ZI) + } +; RW_IRAM2 0x20030000 0x00030000 { ;for LTDC test only +; RW_IRAM2 0x20030000 0x00050000 { ;for LTDC test only (192+128)KB +; .ANY (IRAM2) +; } +; RW_IRAM3 0xC0000000 0x00800000 { +; .ANY (SDRAM1) +; } +;total SDRAM SIZE: 8MBytes + +; RW_IRAM8 0x88000000 0x00800000 { +; .ANY (OSPI2PSRAM) +; } +; RW_IRAM9 0x80000000 0x00800000 { +; .ANY (OSPI1PSRAM) +; } +} + diff --git a/bsp/acm32/acm32h5xx-nucleo/README.md b/bsp/acm32/acm32h5xx-nucleo/README.md new file mode 100644 index 0000000000..7a30e0dc4f --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/README.md @@ -0,0 +1,58 @@ +# ACM32H5xx板级支持包 + +## 1. 简介 + +ACM32H5xx芯片是上海航芯电子科技股份有限公司(后续简称上海航芯)一系列支持多种低功耗模式的通用MCU。包括如下硬件特性: + +|--------------------------|--------------------| +| 硬件 | 描述 | +| -------------------------|--------------------| +|芯片型号 | ACM32H5XX系列 | +|CPU | ARM Cortex-M33 | +|主频 | 220MHz | +|片内SRAM | 420K | +|叠封SDRAM | 最大64MB | +|叠封PSRAM | 最大8MB | +|叠封Flash | 最大8MB | +|--------------------------|--------------------| + +具体型号及资源请参考上海航芯官方网站[ACM32F4](https://www.aisinochip.com/index.php/product/child1.html?id=280)。 + +## 2. 编译说明 + +推荐使用[env工具][1],可以在console下进入到`bsp/acm32H5xx-nucleo`目录中,运行以下命令: + +`scons` + +来编译这个板级支持包。如果编译正确无误,会产生rtthread.elf、rtthread.bin文件。其中rtthread.bin需要烧写到设备中进行运行。 + +也可以通过`scons --target=mdk5`生成keil工程,再使用keil进行编译。 + +## 3. 烧写及执行 + +开发板的使用请参考上海航芯官方网站相应型号的[开发工具](www.aisinochip.com/index.php/product/detail/id/25.html)。 + +### 3.1 运行结果 + +如果编译 & 烧写无误,当复位设备后,会在串口上看到RT-Thread的启动logo信息: + +## 4. 驱动支持情况及计划 + +| **片上外设** | **支持情况** | **备注** | +| ------------- | ------------ | ------------------------------------- | +| GPIO | 支持 | PA0, PA1... PF4 ---> PIN: 0, 1...83 | +| UART | 支持 | UART1/UART2 | +| LED | 支持 | LED1 | + +## 5. 联系人信息 + +维护人:AisinoChip < peter.yang@aisinochip.com > + +## 6. 参考 + +* 板子[数据手册][2] +* 芯片[数据手册][3] + + [1]: https://www.rt-thread.org/download.html#download-rt-thread-env-tool + [2]: www.aisinochip.com/index.php/product/detail/id/50.html + [3]: www.aisinochip.com/index.php/product/detail/id/50.html diff --git a/bsp/acm32/acm32h5xx-nucleo/SConscript b/bsp/acm32/acm32h5xx-nucleo/SConscript new file mode 100644 index 0000000000..744d8d7821 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/SConscript @@ -0,0 +1,14 @@ +# for module compiling +import os +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/acm32/acm32h5xx-nucleo/SConstruct b/bsp/acm32/acm32h5xx-nucleo/SConstruct new file mode 100644 index 0000000000..160697d0f2 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/SConstruct @@ -0,0 +1,34 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +from building import * + +TARGET = 'rtthread_acm32f4xx.' + rtconfig.TARGET_EXT + +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM in ['iccarm']: + env.Replace(CCCOM = ['$CC $CFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map project.map']) + +Export('RTT_ROOT') +Export('rtconfig') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/acm32/acm32h5xx-nucleo/applications/SConscript b/bsp/acm32/acm32h5xx-nucleo/applications/SConscript new file mode 100644 index 0000000000..9bb9abae89 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/applications/SConscript @@ -0,0 +1,15 @@ +from building import * +import os + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') diff --git a/bsp/acm32/acm32h5xx-nucleo/applications/acm32h5xx_it.c b/bsp/acm32/acm32h5xx-nucleo/applications/acm32h5xx_it.c new file mode 100644 index 0000000000..32c33ea34b --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/applications/acm32h5xx_it.c @@ -0,0 +1,184 @@ +/** + ****************************************************************************** + * @file USB_Device/HID_Standalone/Src/stm32f7xx_it.c + * @author MCD Application Team + * @brief Main Interrupt Service Routines. + * This file provides template for all exceptions handler and + * peripherals interrupt service routine. + ****************************************************************************** + * @attention + * + *

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

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +//#include "ACM32Hxx_HAL.h" +//#include "usbd_def.h" +//#include "usbh_def.h" +#include +#include +#include "board.h" + + +/** @addtogroup STM32F7xx_HAL_Applications + * @{ + */ + +/** @addtogroup USB_Device_HID_Standalone + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +//extern USBH_HandleTypeDef USBH_Host; +//extern USBD_HandleTypeDef USBD_Device; + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************/ +/* Cortex-M7 Processor Exceptions Handlers */ +/******************************************************************************/ + +/** + * @brief This function handles NMI exception. + * @param None + * @retval None + */ +void NMI_Handler(void) +{ +} + + + +/** + * @brief This function handles Memory Manage exception. + * @param None + * @retval None + */ +void MemManage_Handler(void) +{ + /* Go to infinite loop when Memory Manage exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Bus Fault exception. + * @param None + * @retval None + */ +void BusFault_Handler(void) +{ + /* Go to infinite loop when Bus Fault exception occurs */ + while (1) + { + } +} + +/** + * @brief This function handles Usage Fault exception. + * @param None + * @retval None + */ +void UsageFault_Handler(void) +{ + /* Go to infinite loop when Usage Fault exception occurs */ + while (1) + { + } +} + + +/** + * @brief This function handles Debug Monitor exception. + * @param None + * @retval None + */ +void DebugMon_Handler(void) +{ +} + + +/** + * @brief This function handles SysTick Handler. + * @param None + * @retval None + */ +//void SysTick_Handler(void) +//{ +// HAL_IncTick(); +//} + +/******************************************************************************/ +/* STM32F7xx Peripherals Interrupt Handlers */ +/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ +/* available peripheral interrupt handler's name please refer to the startup */ +/* file (startup_stm32f7xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles USB-On-The-Go HS global interrupt request. + * @param None + * @retval None + */ + +void USBOTG1_IRQHandler(void) +{ + extern void USBH_IRQHandler(uint8_t busid); + +// HAL_HCD_IRQHandler(USBH_Host.pData); +} + +void USBOTG2_IRQHandler(void) +{ + extern void USBH_IRQHandler(uint8_t busid); + +// HAL_HCD_IRQHandler(USBH_Host.pData); +} + +/** + * @brief This function handles USB OTG FS/HS Wakeup IRQ Handler. + * @param None + * @retval None + */ +#ifdef USE_USB_FS +void OTG_FS_WKUP_IRQHandler(void) +#else +void OTG_HS_WKUP_IRQHandler(void) +#endif +{ + +} + + +/** + * @brief This function handles External line 0 interrupt request. + * @param None + * @retval None + */ +void EXTI0_IRQHandler(void) +{ +// HAL_GPIO_EXTI_IRQHandler(WAKEUP_BUTTON_PIN); +} + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/demo/SConscript b/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/demo/SConscript new file mode 100644 index 0000000000..9c1b6d1ebd --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/demo/SConscript @@ -0,0 +1,17 @@ +from building import * +import os + +cwd = GetCurrentDir() +group = [] +src = Glob('*.c') +CPPPATH = [cwd] + +list = os.listdir(cwd) +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + group = group + SConscript(os.path.join(d, 'SConscript')) + +group = group + DefineGroup('LVGL-demo', src, depend = ['BSP_USING_LVGL', 'BSP_USING_LVGL_DEMO'], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/demo/lv_demo.c b/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/demo/lv_demo.c new file mode 100644 index 0000000000..2825ed05c4 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/demo/lv_demo.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-17 Meco Man first version + * 2022-05-10 Meco Man improve rt-thread initialization process + */ + +#include + + #ifdef PKG_USING_LVGL + +//#include "lv_demo_benchmark.h" + +void lv_user_gui_init(void) +{ + /* display demo; you may replace with your LVGL application at here */ + +// lv_demo_benchmark(LV_DEMO_BENCHMARK_MODE_RENDER_AND_DRIVER); +} + + +#endif /* PKG_USING_LVGL */ + diff --git a/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_conf.h b/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_conf.h new file mode 100644 index 0000000000..fce3765a62 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_conf.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-18 Meco Man First version + */ + +#ifndef LV_CONF_H +#define LV_CONF_H + + +/*1: Show CPU usage and FPS count*/ +#define LV_USE_PERF_MONITOR 1 +#if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#endif + +/*1: Show the used memory and the memory fragmentation + * Requires LV_MEM_CUSTOM = 0*/ +#define LV_USE_MEM_MONITOR 1 +#if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT +#endif + + +//#define LV_USE_PERF_MONITOR 1 +#define LV_COLOR_DEPTH 16 +#define LV_HOR_RES_MAX 800 +#define LV_VER_RES_MAX 480 + +#ifdef PKG_USING_LV_MUSIC_DEMO +/* music player demo */ +#define LV_USE_DEMO_RTT_MUSIC 1 +#define LV_DEMO_RTT_MUSIC_AUTO_PLAY 1 +#define LV_FONT_MONTSERRAT_12 1 +#define LV_FONT_MONTSERRAT_16 1 +#define LV_COLOR_SCREEN_TRANSP 1 +#endif /* PKG_USING_LV_MUSIC_DEMO */ + +#define LV_USE_BUILTIN_MALLOC 0 +#define LV_USE_BUILTIN_MEMCPY 0 +#define LV_USE_BUILTIN_SNPRINTF 0 + +#define LV_MALLOC rt_malloc +#define LV_REALLOC rt_realloc +#define LV_FREE rt_free +#define LV_MEMSET rt_memset +#define LV_MEMCPY rt_memcpy +#define LV_SNPRINTF rt_snprintf +#define LV_VSNPRINTF rt_vsnprintf +#define LV_STRLEN rt_strlen +#define LV_STRNCPY rt_strncpy + +#define LV_USE_LOG 1 +#define LV_LOG_PRINTF rt_kprintf +#define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + + +//#define LV_USE_LARGE_COORD 1 + + + +/*use hardware DMA2D */ +#define LV_USE_GPU_ACM32_DMA2D 1 + + + +#define LV_USE_DEMO_BENCHMARK 0 + + +#endif + + diff --git a/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_port_disp.c b/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_port_disp.c new file mode 100644 index 0000000000..c747e33f4c --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_port_disp.c @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-18 Meco Man The first version + * 2021-12-24 Rb Refresh using dma2d + */ + +#include +#include + +//#define DRV_DEBUG +#define LOG_TAG "LVGL.port.disp" +#include +#include "drv_lcd.h" + +/*A static or global variable to store the buffers*/ +static lv_disp_draw_buf_t disp_buf; + +static rt_device_t lcd_device = RT_NULL; +static struct rt_device_graphic_info info; + +static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ + + +#define LVGL_BUF_PIX_SIZE ((LV_HOR_RES_MAX * LV_VER_RES_MAX) / 4) //1/8 full screen + +//static lv_disp_drv_t g_disp_drv; + +//rt_int8_t g_aisinochip_logo_img_buf[LV_HOR_RES_MAX * LV_VER_RES_MAX * (LV_COLOR_DEPTH/8)] SDRAM1_BANK0; + + +static void lcd_fb_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) +{ + extern void lcd_fill_array(rt_uint16_t x_start, rt_uint16_t y_start, rt_uint16_t x_end, rt_uint16_t y_end, void *pcolor); + /* color_p is a buffer pointer; the buffer is provided by LVGL */ + lcd_fill_array(area->x1, area->y1, area->x2, area->y2, color_p); + + /*IMPORTANT!!! + *Inform the graphics library that you are ready with the flushing*/ + lv_disp_flush_ready(disp_drv); +} + + +#if 0 +void load_disp_img(void) +{ + static rt_device_t spi_flash_device = RT_NULL; + rt_err_t result; + rt_uint32_t len, addr, offset, rd_pct_size=256; + + spi_flash_device = rt_device_find("spi11"); + if (spi_flash_device == 0) + { + LOG_E("spi_flash_device error!"); + return; + } + + result = rt_device_open(spi_flash_device, 0); + if (result != RT_EOK) + { + LOG_E("error!"); + return; + } + + len = (320*240)*2; + addr = 0; + offset = 0; + + len = (320*240)*2; + addr = (320*240)*2; + offset = 0; + +#if 0 + while(len) + { + result = rt_device_read(spi_flash_device, addr, (dma2d_front_layer_buf+offset), rd_pct_size); + if (result != rd_pct_size) + { + LOG_E("error!"); + return; + } + + offset += rd_pct_size; + addr += rd_pct_size; + len -= rd_pct_size; + } +#endif +} +#endif + + +#ifdef rt_align +rt_align(RT_ALIGN_SIZE) +#else +ALIGN(RT_ALIGN_SIZE) +#endif +lv_color_t lv_disp_buf1[LVGL_BUF_PIX_SIZE]; // SDRAM1_BANK2; + + +void lv_port_disp_init(void) +{ + rt_err_t result; +// static lv_color_t lv_disp_buf1[DISP_BUF_SIZE]; + +// load_disp_img(); + + lcd_device = rt_device_find("lcd"); + if (lcd_device == 0) + { + LOG_E("lcd_device error!"); + return; + } + + result = rt_device_open(lcd_device, 0); + if (result != RT_EOK) + { + LOG_E("error!"); + return; + } + + /* get framebuffer address */ + result = rt_device_control(lcd_device, RTGRAPHIC_CTRL_GET_INFO, &info); + if (result != RT_EOK) + { + LOG_E("error!"); + /* get device information failed */ + return; + } + + RT_ASSERT (info.bits_per_pixel == 8 || info.bits_per_pixel == 16 || + info.bits_per_pixel == 24 || info.bits_per_pixel == 32); + + /*Initialize `disp_buf` with the buffer(s).*/ + lv_disp_draw_buf_init(&disp_buf, lv_disp_buf1, RT_NULL, LVGL_BUF_PIX_SIZE); + + lv_disp_drv_init(&disp_drv); /*Basic initialization*/ + + /*Set the resolution of the display*/ + disp_drv.hor_res = info.width; + disp_drv.ver_res = info.height; + + /*Set a display buffer*/ + disp_drv.draw_buf = &disp_buf; + + /*Used to copy the buffer's content to the display*/ + disp_drv.flush_cb = lcd_fb_flush; + + /*Finally register the driver*/ + lv_disp_drv_register(&disp_drv); + +// g_disp_drv = disp_drv; +} + + +bool lv_check_last_flush(void) +{ + return lv_disp_flush_is_last(&disp_drv); +} + + diff --git a/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_port_indev.c b/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_port_indev.c new file mode 100644 index 0000000000..e573723491 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_port_indev.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-07-07 liYony The first version (FT6336) + * 2022-07-08 liYony Add FT6206 + */ +#include +#include +#include + +#define DBG_TAG "LVGL.port.indev" +#define DBG_LVL DBG_INFO +#include + +/* RT-Thread touch device name */ +#define TOUCH_DEV_NAME "xpt0" + +lv_indev_t * touch_indev; +rt_device_t touch_dev; +struct rt_touch_data *read_data; + +static void input_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) +{ + rt_memset(read_data, 0, sizeof(struct rt_touch_data)); + if(1 == rt_device_read(touch_dev, 0, read_data, 1)) + { + if (read_data->event == RT_TOUCH_EVENT_NONE) + return; + rt_kprintf("=2=%d %d %d %d %d\n", + read_data->event, + read_data->x_coordinate, + read_data->y_coordinate, + read_data->timestamp, + read_data->width); + if (read_data->event == RT_TOUCH_EVENT_DOWN) + data->state = LV_INDEV_STATE_PR; + if (read_data->event == RT_TOUCH_EVENT_MOVE) + data->state = LV_INDEV_STATE_PR; + if (read_data->event == RT_TOUCH_EVENT_UP) + data->state = LV_INDEV_STATE_REL; + data->point.x = read_data->x_coordinate; + data->point.y = read_data->y_coordinate; + } +} + +void lv_port_indev_init(void) +{ + static lv_indev_drv_t indev_drv; + + lv_indev_drv_init(&indev_drv); /*Basic initialization*/ + indev_drv.type = LV_INDEV_TYPE_POINTER; + indev_drv.read_cb = input_read; + + /*Register the driver in LVGL and save the created input device object*/ + touch_indev = lv_indev_drv_register(&indev_drv); +} + +static int lv_hw_touch_init(void) +{ + touch_dev = rt_device_find(TOUCH_DEV_NAME); + if (rt_device_open(touch_dev, RT_DEVICE_FLAG_RDONLY) != RT_EOK) + { + LOG_E("Can't open touch device:%s", TOUCH_DEV_NAME); + return -RT_ERROR; + } + + read_data = (struct rt_touch_data *)rt_calloc(1, sizeof(struct rt_touch_data)); + + return RT_EOK; +} +INIT_COMPONENT_EXPORT(lv_hw_touch_init); diff --git a/bsp/acm32/acm32h5xx-nucleo/applications/main.c b/bsp/acm32/acm32h5xx-nucleo/applications/main.c new file mode 100644 index 0000000000..150b54eb57 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/applications/main.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-09-17 AisinoChip the first version + */ + +#include +#include +#include "board.h" +#include +#include "drv_gpio.h" + +#define LED_PIN_NUM GET_PIN(A, 5) + + +int main(void) +{ + int i; + + rt_pin_mode(LED_PIN_NUM, PIN_MODE_OUTPUT); + + while (1) + { + rt_thread_delay(10); + rt_pin_write(LED_PIN_NUM, PIN_LOW); + rt_thread_delay(RT_TICK_PER_SECOND / 2); + rt_pin_write(LED_PIN_NUM, PIN_HIGH); + rt_thread_delay(RT_TICK_PER_SECOND / 2); + } +} + + diff --git a/bsp/acm32/acm32h5xx-nucleo/applications/mount.c b/bsp/acm32/acm32h5xx-nucleo/applications/mount.c new file mode 100644 index 0000000000..59c1e4928e --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/applications/mount.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-09-17 AisinoChip the first version + */ + +#include +#include +#include "board.h" +#include +#include "drv_gpio.h" +#include "drv_usb.h" + + +#define USB1_ROOT "/" + + + +int mnt_init(struct usbh_msc *msc_class) +{ + udisk_reg(OTG1_IDX, msc_class); + /* mount sd card fat partition 1 as root directory */ + if (dfs_mount("udisk1", USB1_ROOT, "elm", 0, 0) == 0) + rt_kprintf("File System initialized!\n"); + else + rt_kprintf("File System init failed!\n"); + + return 0; +} +//INIT_ENV_EXPORT(mnt_init); + + +int udisk_mount(struct usbh_msc *msc_class) +{ + return mnt_init(msc_class); +} + + + + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/board/board.c b/bsp/acm32/acm32h5xx-nucleo/board/board.c new file mode 100644 index 0000000000..2becec8ee9 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/board/board.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-25 AisinoChip first implementation + */ + +#include +#include +#include "board.h" +#include + +#define SOC_SRAM_END_ADDR (SOC_SRAM_START_ADDR+SOC_SRAM_SIZE*1024) + +extern int rt_application_init(void); + +#if defined(__ARMCC_VERSION) + extern int Image$$RW_IRAM1$$ZI$$Limit; +#elif __ICCARM__ + #pragma section="HEAP" +#else + extern int __bss_end; +#endif + +extern void rt_hw_uart_init(void); + +/** + * This is the timer interrupt service routine. + * + */ +void SysTick_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +/** + * This function will initial EVB board. + */ +void rt_hw_board_init(void) +{ +#if 1 + /* init hal library */ +#if (INS_ACCELERATE_ENABLE == 1) + System_EnableIAccelerate(); +#endif + +#if (DATA_ACCELERATE_ENABLE == 1) + System_EnableDAccelerate(); +#endif + +#endif + + HAL_Init(); + SystemClock_Config(SYSCLK_220M_SRC_XTH_12M, PCLK1_DIV_SELECT, PCLK2_DIV_SELECT, PCLK3_DIV_SELECT, PCLK4_DIV_SELECT); + + rt_hw_uart_init(); + + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); + +#ifdef RT_USING_HEAP +#if defined(__ARMCC_VERSION) + rt_system_heap_init((void *)&Image$$RW_IRAM1$$ZI$$Limit, (void *)SOC_SRAM_END_ADDR); +#elif __ICCARM__ + rt_system_heap_init(__segment_end("HEAP"), (void *)SOC_SRAM_END_ADDR); +#else + /* init memory system */ + rt_system_heap_init((void *)&__bss_end, (void *)SOC_SRAM_END_ADDR); +#endif +#endif /* RT_USING_HEAP */ + +#ifdef RT_USING_COMPONENTS_INIT + rt_components_board_init(); +#endif + +#if 1 + rt_kprintf("************************************************************\r\n"); + rt_kprintf("HCK: %u\r\n", HAL_RCC_GetHCLKFreq()); + rt_kprintf("PCLK1: %u\r\n", HAL_RCC_GetPCLK1Freq()); + rt_kprintf("PCLK2: %u\r\n", HAL_RCC_GetPCLK2Freq()); + rt_kprintf("PCLK3: %u\r\n", HAL_RCC_GetPCLK3Freq()); + rt_kprintf("PCLK4: %u\r\n", HAL_RCC_GetPCLK4Freq()); + rt_kprintf("\r\n"); + rt_kprintf("************************************************************\r\n"); +#endif + + +#if 1 +{ + GPIO_InitTypeDef GPIO_InitStruct ={0}; + + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + //SD card power control pin + GPIO_InitStruct.Pin = (GPIO_PIN_4|GPIO_PIN_5); + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Alternate = GPIO_FUNCTION_0; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, 0); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 0); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 0); + +#if 0 + while(1) + { + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, 0); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 0); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 0); + + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, 1); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 1); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 1); + } + #endif +} +#endif + +} + + +#ifdef USE_FULL_ASSERT +void assert_failed(uint8_t* file, uint32_t line) +{ + printfS("failed: file:%s, line:%u\r\n", file, line); + while (1); +} +#endif + diff --git a/bsp/acm32/acm32h5xx-nucleo/board/board.h b/bsp/acm32/acm32h5xx-nucleo/board/board.h new file mode 100644 index 0000000000..c6f4a6fc05 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/board/board.h @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-09-22 AisinoCip add board.h to this bsp + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include "hal.h" + + +/*-------------------------- UART CONFIG BEGIN --------------------------*/ + +/** After configuring corresponding UART or UART DMA, you can use it. + * + * STEP 1, define macro define related to the serial port opening based on the serial port number + * such as #define BSP_USING_UATR1 + * + * STEP 2, according to the corresponding pin of serial port, modify the related serial port information + * such as #define UART1_TX_PORT GPIOX -> GPIOA + * #define UART1_RX_PORT GPIOX -> GPIOA + * #define UART1_TX_PIN GPIO_PIN_X -> GPIO_PIN_9 + * #define UART1_RX_PIN GPIO_PIN_X -> GPIO_PIN_10 + * + * STEP 3, if you want using SERIAL DMA, you must open it in the RT-Thread Settings. + * RT-Thread Setting -> Components -> Device Drivers -> Serial Device Drivers -> Enable Serial DMA Mode + * + * STEP 4, according to serial port number to define serial port tx/rx DMA function in the board.h file + * such as #define BSP_UART1_RX_USING_DMA + * + */ + +#if defined(BSP_USING_UART1) + #define UART1_TX_PORT GPIOA + #define UART1_RX_PORT GPIOA + #define UART1_TX_PIN GPIO_PIN_9 + #define UART1_RX_PIN GPIO_PIN_10 + #define UART1_TX_ALTERNATE GPIO_FUNCTION_1 + #define UART1_RX_ALTERNATE GPIO_FUNCTION_1 + + #if defined(BSP_UART1_RX_USING_DMA) + #define UART1_RX_DMA_INSTANCE DMA_Channel0 + #define UART1_RX_DMA_RCC BIT12 + #define UART1_RX_DMA_IRQ DMA_IRQn + #define UART1_RX_DMA_CHANNEL 0 + #define UART1_RX_DMA_REQUEST REQ6_UART1_RECV + #endif /* BSP_UART1_RX_USING_DMA */ + + #if defined(BSP_UART1_TX_USING_DMA) + #define UART1_TX_DMA_INSTANCE DMA_Channel1 + #define UART1_TX_DMA_RCC BIT12 + #define UART1_TX_DMA_IRQ DMA_IRQn + #define UART1_TX_DMA_CHANNEL 1 + #define UART1_TX_DMA_REQUEST REQ5_UART1_SEND + #endif /* BSP_UART1_TX_USING_DMA */ + +#endif /* BSP_USING_UART1 */ + +#if defined(BSP_USING_UART2) + #define UART2_TX_PORT GPIOA + #define UART2_RX_PORT GPIOA + #define UART2_TX_PIN GPIO_PIN_2 + #define UART2_RX_PIN GPIO_PIN_3 + #define UART2_TX_ALTERNATE GPIO_FUNCTION_1 + #define UART2_RX_ALTERNATE GPIO_FUNCTION_1 + + #if defined(BSP_UART2_RX_USING_DMA) + #define UART2_RX_DMA_INSTANCE DMA_Channel0 + #define UART2_RX_DMA_RCC BIT12 + #define UART2_RX_DMA_IRQ DMA_IRQn + #define UART2_RX_DMA_CHANNEL 0 + #define UART2_RX_DMA_REQUEST REQ8_UART2_RECV + #endif /* BSP_UART2_RX_USING_DMA */ + + #if defined(BSP_UART2_TX_USING_DMA) + #define UART2_TX_DMA_INSTANCE DMA_Channel1 + #define UART2_TX_DMA_RCC BIT12 + #define UART2_TX_DMA_IRQ DMA_IRQn + #define UART2_TX_DMA_CHANNEL 1 + #define UART2_TX_DMA_REQUEST REQ7_UART2_SEND + #endif /* BSP_UART2_TX_USING_DMA */ +#endif /* BSP_USING_UART2 */ + +#if defined(BSP_USING_UART3) + #define UART3_TX_PORT GPIOC + #define UART3_RX_PORT GPIOC + #define UART3_TX_PIN GPIO_PIN_4 + #define UART3_RX_PIN GPIO_PIN_5 + + #if defined(BSP_UART3_RX_USING_DMA) + #define UART3_RX_DMA_INSTANCE DMA_Channel2 + #define UART3_RX_DMA_RCC BIT12 + #define UART3_RX_DMA_IRQ DMA_IRQn + #define UART3_RX_DMA_CHANNEL 2 + #define UART3_RX_DMA_REQUEST REQ29_UART3_RECV + #endif /* BSP_UART3_RX_USING_DMA */ + + #if defined(BSP_UART3_TX_USING_DMA) + #define UART3_TX_DMA_INSTANCE DMA_Channel3 + #define UART3_TX_DMA_RCC BIT12 + #define UART3_TX_DMA_IRQ DMA_IRQn + #define UART3_TX_DMA_CHANNEL 3 + #define UART3_TX_DMA_REQUEST REQ27_UART3_SEND + #endif /* BSP_UART3_TX_USING_DMA */ +#endif /* BSP_USING_UART3 */ + +#if defined(BSP_USING_UART4) + #define UART4_TX_PORT GPIOA + #define UART4_RX_PORT GPIOA + #define UART4_TX_PIN GPIO_PIN_0 + #define UART4_RX_PIN GPIO_PIN_1 + + #if defined(BSP_UART4_RX_USING_DMA) + #define UART4_RX_DMA_INSTANCE DMA_Channel4 + #define UART4_RX_DMA_RCC BIT12 + #define UART4_RX_DMA_IRQ DMA_IRQn + #define UART4_RX_DMA_CHANNEL 4 + #define UART4_RX_DMA_REQUEST REQ46_UART4_RECV + #endif /* BSP_UART4_RX_USING_DMA */ + + #if defined(BSP_UART4_TX_USING_DMA) + #define UART4_TX_DMA_INSTANCE DMA_Channel5 + #define UART4_TX_DMA_RCC BIT12 + #define UART4_TX_DMA_IRQ DMA_IRQn + #define UART4_TX_DMA_CHANNEL 5 + #define UART4_TX_DMA_REQUEST REQ45_UART4_SEND + #endif /* BSP_UART4_TX_USING_DMA */ +#endif /* BSP_USING_UART4 */ +/*-------------------------- UART CONFIG END --------------------------*/ + + +/*------------ memory operation using DMA, include memcpy() and memset() CONFIG BEGIN --------------------*/ +#if defined(RT_USING_HW_MEM_OPERATION) + #define MEM_OP_DMA_BASEADDR DMA1 + #define MEMSET_DMA_INSTANCE DMA1_Channel2 + #define MEMCPY_DMA_INSTANCE DMA1_Channel3 + #define MEMSET_DMA_CH 2 + #define MEMCPY_DMA_CH 3 + + +#endif /* BSP_USING_SDRAM1 */ + + +/*------------ memcpy and memset DMA CONFIG END --------------------*/ + + + + +/* board configuration */ + +void rt_hw_board_init(void); + +#endif /* __BOARD_H__ */ + diff --git a/bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_dma.h b/bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_dma.h new file mode 100644 index 0000000000..2b1581631b --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_dma.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-10-27 AisinoChip The first version + */ +#ifndef __DRV_DMA_H__ +#define __DRV_DMA_H__ + +#include +#include "rtdevice.h" + +extern int drv_dma_hw_init(void); + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_gpio.h b/bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_gpio.h new file mode 100644 index 0000000000..cd56dcf729 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_gpio.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-09-18 AisinoChip first version + */ + +#ifndef __DRV_GPIO_H__ +#define __DRV_GPIO_H__ +#include "board.h" + +#ifdef RT_USING_PIN + + +#define GET_PIN(PORTx,PIN) ((rt_base_t)((16 * GPIO_PORT##PORTx) + PIN)) + +rt_bool_t drv_gpio_init(GPIO_TypeDef *gpiox, rt_uint32_t pin, rt_uint32_t mode, + rt_uint32_t pull, rt_uint32_t alternate); +GPIO_TypeDef* drv_gpio_get_port(rt_uint32_t index); +rt_uint32_t drv_gpio_get_pin(rt_uint32_t index); +rt_base_t drv_gpio_get_index(const char* name); +rt_bool_t drv_gpio_init_by_name(const char* name, rt_uint32_t mode, + rt_uint32_t pull, rt_uint32_t alternate); + +#endif /* #ifdef RT_USING_PIN */ + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_log.h b/bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_log.h new file mode 100644 index 0000000000..7e0bfee5b4 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_log.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-15 SummerGift first version + */ + +/* + * NOTE: DO NOT include this file on the header file. + */ + +#ifndef LOG_TAG +#define DBG_TAG "drv" +#else +#define DBG_TAG LOG_TAG +#endif /* LOG_TAG */ + +#ifdef DRV_DEBUG +#define DBG_LVL DBG_LOG +#else +#define DBG_LVL DBG_INFO +#endif /* DRV_DEBUG */ + +#include diff --git a/bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_uart.h b/bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_uart.h new file mode 100644 index 0000000000..f60e7ea7a5 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/drivers/Inc/drv_uart.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-10-27 AisinoChip The first version + */ +#ifndef __DRV_UART_H__ +#define __DRV_UART_H__ + +#include +#include "rtdevice.h" + + +#ifdef RT_SERIAL_USING_DMA +struct dma_config +{ + DMA_Channel_TypeDef *Instance; + rt_uint32_t dma_rcc; + IRQn_Type dma_irq; + + rt_uint32_t channel; + rt_uint32_t request; +}; +#endif + + +struct acm32_uart_config +{ + const char *name; + UART_TypeDef *Instance; + IRQn_Type irq_type; + enum_Enable_ID_t enable_id; + +#ifdef RT_SERIAL_USING_DMA + struct dma_config *dma_rx; + struct dma_config *dma_tx; +#endif + + GPIO_TypeDef *tx_port; + rt_uint16_t tx_pin; + rt_uint16_t tx_alternate; + + GPIO_TypeDef *rx_port; + rt_uint16_t rx_pin; + rt_uint16_t rx_alternate; +}; + +struct acm32_uart +{ + UART_HandleTypeDef handle; + struct acm32_uart_config *config; +#ifdef RT_SERIAL_USING_DMA + struct + { + DMA_HandleTypeDef handle; + rt_size_t last_index; + } dma_rx; + + struct + { + DMA_HandleTypeDef handle; + } dma_tx; +#endif + + rt_uint16_t uart_dma_flag; + struct rt_serial_device serial; +}; + + + + + + +#endif /* __DRV_UART_H__ */ + diff --git a/bsp/acm32/acm32h5xx-nucleo/drivers/config/acm32h5xx_hal_conf.h b/bsp/acm32/acm32h5xx-nucleo/drivers/config/acm32h5xx_hal_conf.h new file mode 100644 index 0000000000..44819aef38 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/drivers/config/acm32h5xx_hal_conf.h @@ -0,0 +1,306 @@ +/****************************************************************************** +*@file : acm32h5xx_hal_conf.h +*@brief : HAL configuration file +******************************************************************************/ + +#ifndef __ACM32H5XX_HAL_CONF_H__ +#define __ACM32H5XX_HAL_CONF_H__ + +#include "hal_def.h" +#include "acm32h5xx.h" +#include "hal.h" + +/******* enable printf in debug stage ****************************************/ +#define DEBUG + +#ifdef DEBUG + #define printfS(fmt, ...) printf(fmt, ##__VA_ARGS__) +#else + #define printfS(fmt, ...) +#endif + +/******* enable assert in debug stage ****************************************/ +#define USE_FULL_ASSERT + +#ifdef USE_FULL_ASSERT + void assert_failed(uint8_t* file, uint32_t line); + #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) +#else + #define assert_param(expr) ((void)0U) +#endif + +/******* config data if or not in extern sram *******************************/ +//#define DATA_IN_ExtSRAM + +/* Configure the Vector Table location add offset address ------------------*/ + +//#define VECT_TAB_IROM +//#define VECT_TAB_SRAM +//#define VECT_TAB_SPI_FLASH + +#define VECT_TAB_OFFSET ( 0 ) + +#ifdef VECT_TAB_IROM + #define VECT_TAB_ADDR ( 0 + VECT_TAB_OFFSET ) +#elif defined ( VECT_TAB_SRAM ) + #define VECT_TAB_ADDR ( SRAM1_BASE_ADDR + VECT_TAB_OFFSET ) +#elif defined ( VECT_TAB_SPI_FLASH ) + #define VECT_TAB_ADDR ( SPI7_MEM_BASE_ADDR + 0x00002000 + VECT_TAB_OFFSET ) +#else + #warning vector table definition error. +#endif + +/******* config extern high speed osc freq and low osc freq in Hz ************/ +#define XTH_VALUE ( 12000000U ) +#define XTL_VALUE ( 32768U ) + + +/******* SysTick interrupt priority *****************************************/ +#define TICK_INT_PRIORITY ((1<<__NVIC_PRIO_BITS)-1) + +/******* SysTick ms period set ,1ms or 10ms **********************************/ +#define TICK_PERIOD_1MS (1U) +#define TICK_PERIOD_10MS (10U) +#define TICK_PERIOD_MS (TICK_PERIOD_1MS) + + +/******* instruction and data accelerate enable ******************************/ +#define INS_ACCELERATE_ENABLE (1U) //instruction accelerate enable +#define DATA_ACCELERATE_ENABLE (0U) //data accelerate enable + +/********************* EXTERNAL RAM AREA DEFINE ******************************/ +#define MEM_USE_SDRAM 0 +#define MEM_USE_OSPI1PSRAM 1 +#define MEM_USE_OSPI2PSRAM 2 + + +#define DISP_MEM_LOCATION MEM_USE_SDRAM + + +#define SDRAM1 __attribute__((section("SDRAM1"))) +#define OSPI1PSRAM __attribute__((section("OSPI1PSRAM"))) +#define OSPI2PSRAM __attribute__((section("OSPI2PSRAM"))) +#define IRAM2 __attribute__((section("IRAM2"))) + +#define SDRAM1_BANK0 __attribute__((section("SDRAM1_BANK0"))) +#define SDRAM1_BANK1 __attribute__((section("SDRAM1_BANK1"))) +#define SDRAM1_BANK2 __attribute__((section("SDRAM1_BANK2"))) +#define SDRAM1_BANK3 __attribute__((section("SDRAM1_BANK3"))) + + +/******* module selection ****************************************************/ + +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_EFUSE_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_DWT_MODULE_ENABLED +#define HAL_WDT_MODULE_ENABLED +#define HAL_IWDT_MODULE_ENABLED +#define HAL_PMU_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +#define HAL_FMC_MODULE_ENABLED +//#define HAL_SPI_MODULE_ENABLED +//#define HAL_TIMER_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_FSUSB_MODULE_ENABLED +//#define HAL_PUF_MODULE_ENABLED +//#define HAL_CDE_MODULE_ENABLED +//#define HAL_NORFLASH_MODULE_ENABLED +//#define HAL_CRC_MODULE_ENABLED +//#define HAL_DIVIDER_MODULE_ENABLED +//#define HAL_AES_MODULE_ENABLED +//#define HAL_HRNG_MODULE_ENABLED +//#define HAL_ECC_MODULE_ENABLED +//#define HAL_RSA_MODULE_ENABLED +//#define HAL_DRBG_MODULE_ENABLED +//#define HAL_ECDSA_MODULE_ENABLED +//#define HAL_HASH_SHA1_MODULE_ENABLED +//#define HAL_HASH_SHA256_MODULE_ENABLED +//#define HAL_HASH_SHA384_MODULE_ENABLED +//#define HAL_HMAC_MODULE_ENABLED +//#define HAL_SDMMC_ENABLED +//#define HAL_OSPI_MODULE_ENABLED +//#define HAL_LTDC_MODULE_ENABLED +#ifdef HAL_LTDC_MODULE_ENABLED + #define HAL_DMA2D_MODULE_ENABLED +#endif +//#define HAL_I2C_MODULE_ENABLED +//#define HAL_DCMI_MODULE_ENABLED + +//#define HAL_PCD_MODULE_ENABLED + +/******* include modules header file *****************************************/ + + +#if ((INS_ACCELERATE_ENABLE==1) || (DATA_ACCELERATE_ENABLE==1)) + #include "system_accelerate.h" +#endif + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "hal_cortex.h" +#endif + +#ifdef HAL_RCC_MODULE_ENABLED + #include "hal_rcc.h" +#endif + +#ifdef HAL_EFUSE_MODULE_ENABLED + #include "hal_efuse.h" +#endif + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "hal_gpio.h" +#endif + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "hal_exti.h" +#endif + +#ifdef HAL_DMA_MODULE_ENABLED + #include "hal_dma.h" +#endif + +#ifdef HAL_DWT_MODULE_ENABLED + #include "hal_dwt.h" +#endif + +#ifdef HAL_WDT_MODULE_ENABLED + #include "hal_wdt.h" +#endif + +#ifdef HAL_IWDT_MODULE_ENABLED + #include "hal_iwdt.h" +#endif + +#ifdef HAL_PMU_MODULE_ENABLED + #include "hal_pmu.h" +#endif + +#ifdef HAL_UART_MODULE_ENABLED + #include "hal_usart.h" + #include "hal_uart.h" + #include "hal_uart_ex.h" +#endif + +#ifdef HAL_FMC_MODULE_ENABLED + #include "hal_fmc.h" +#endif + +#ifdef HAL_SPI_MODULE_ENABLED + #include "hal_spi.h" +#endif + +#ifdef HAL_TIMER_MODULE_ENABLED + #include "hal_timer.h" + #include "hal_timer_ex.h" +#endif + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "hal_lptim.h" +#endif + +#ifdef HAL_FSUSB_MODULE_ENABLED + #include "hal_fsusb.h" +#endif + +#ifdef HAL_PUF_MODULE_ENABLED + #include "hal_puf.h" +#endif + +#ifdef HAL_CDE_MODULE_ENABLED + #include "hal_cde.h" +#endif + +#ifdef HAL_NORFLASH_MODULE_ENABLED + #include "hal_norflash.h" +#endif + +#ifdef HAL_CRC_MODULE_ENABLED + #include "hal_crc.h" +#endif + +#ifdef HAL_DIVIDER_MODULE_ENABLED + #include "hal_divider.h" +#endif + +#ifdef HAL_AES_MODULE_ENABLED + #include "hal_aes.h" +#endif + +#ifdef HAL_HRNG_MODULE_ENABLED + #include "hal_hrng.h" +#endif + +#ifdef HAL_ECC_MODULE_ENABLED + #include "hal_ecc.h" + #include "hal_binary_ecc.h" +#endif + +#ifdef HAL_RSA_MODULE_ENABLED + #include "hal_rsa_keygen.h" +#endif + +#ifdef HAL_DRBG_MODULE_ENABLED + #include "hal_ctr_drbg.h" +#endif + +#ifdef HAL_ECDSA_MODULE_ENABLED + #include "hal_ecdsa.h" +#endif + +#ifdef HAL_HASH_SHA1_MODULE_ENABLED + #include "hal_sha1.h" +#endif + +#ifdef HAL_HASH_SHA256_MODULE_ENABLED + #include "hal_sha224_256.h" +#endif + +#ifdef HAL_HASH_SHA384_MODULE_ENABLED + #include "hal_sha384_512.h" +#endif + +#ifdef HAL_HMAC_MODULE_ENABLED + #include "hal_hmac.h" +#endif + +#ifdef HAL_SDMMC_ENABLED + #include "hal_sdmmc.h" + #include "hal_dlyb.h" +#endif + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "hal_ltdc.h" +#endif + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "hal_dma2d.h" +#endif + +#ifdef HAL_OSPI_MODULE_ENABLED + #include "hal_ospi.h" +#endif + +#ifdef HAL_PCD_MODULE_ENABLED +// #include "usbd_def.h" + #include "usbd_config.h" + #include "hal_pcd.h" + #include "hal_pcd_ex.h" + #include "ll_usb.h" +#endif + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "hal_dcmi.h" +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +#include "hal_i2c.h" +#endif + + +#endif /* __ACM32H5XX_HAL_CONF_H__ */ + + \ No newline at end of file diff --git a/bsp/acm32/acm32h5xx-nucleo/drivers/config/uart_config.h b/bsp/acm32/acm32h5xx-nucleo/drivers/config/uart_config.h new file mode 100644 index 0000000000..7c7241ab7f --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/drivers/config/uart_config.h @@ -0,0 +1,213 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-23 AisinoChip the first version + */ + +#ifndef __UART_CONFIG_H__ +#define __UART_CONFIG_H__ + +#include +#include "board.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(RT_USING_SERIAL) + +#if defined(BSP_USING_UART1) + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_UART1_RX_USING_DMA) +#ifndef UART1_DMA_RX_CONFIG +#define UART1_DMA_RX_CONFIG \ + { \ + .Instance = UART1_RX_DMA_INSTANCE, \ + .dma_rcc = UART1_RX_DMA_RCC, \ + .dma_irq = UART1_RX_DMA_IRQ, \ + .channel = UART1_RX_DMA_CHANNEL, \ + .request = UART1_RX_DMA_REQUEST, \ + } +#endif /* UART1_DMA_RX_CONFIG */ +#endif /* BSP_UART1_RX_USING_DMA */ + +#if defined(BSP_UART1_TX_USING_DMA) +#ifndef UART1_DMA_TX_CONFIG +#define UART1_DMA_TX_CONFIG \ + { \ + .Instance = UART1_TX_DMA_INSTANCE, \ + .dma_rcc = UART1_TX_DMA_RCC, \ + .dma_irq = UART1_TX_DMA_IRQ, \ + .channel = UART1_RX_DMA_CHANNEL, \ + .request = UART1_RX_DMA_REQUEST, \ + } +#endif /* UART1_DMA_TX_CONFIG */ +#endif /* BSP_UART1_TX_USING_DMA */ +#endif /* RT_SERIAL_USING_DMA */ + +#ifndef UART1_CONFIG +#define UART1_CONFIG \ + { \ + .name = "uart1", \ + .Instance = USART1, \ + .irq_type = USART1_IRQn, \ + .enable_id = EN_UART1, \ + .tx_port = UART1_TX_PORT, \ + .tx_pin = UART1_TX_PIN, \ + .tx_alternate = UART1_TX_ALTERNATE, \ + .rx_port = UART1_RX_PORT, \ + .rx_pin = UART1_RX_PIN, \ + .rx_alternate = UART1_RX_ALTERNATE, \ + } +#endif /* UART1_CONFIG */ +#endif /* BSP_USING_UART1 */ + +#if defined(BSP_USING_UART2) + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_UART2_RX_USING_DMA) +#ifndef UART2_DMA_RX_CONFIG +#define UART2_DMA_RX_CONFIG \ + { \ + .Instance = UART2_RX_DMA_INSTANCE, \ + .dma_rcc = UART2_RX_DMA_RCC, \ + .dma_irq = UART2_RX_DMA_IRQ, \ + .channel = UART2_RX_DMA_CHANNEL, \ + .request = UART2_RX_DMA_REQUEST, \ + } +#endif /* UART2_DMA_RX_CONFIG */ +#endif /* BSP_UART2_RX_USING_DMA */ + +#if defined(BSP_UART2_TX_USING_DMA) +#ifndef UART2_DMA_TX_CONFIG +#define UART2_DMA_TX_CONFIG \ + { \ + .Instance = UART2_TX_DMA_INSTANCE, \ + .dma_rcc = UART2_TX_DMA_RCC, \ + .dma_irq = UART2_TX_DMA_IRQ, \ + .channel = UART2_TX_DMA_CHANNEL, \ + .request = UART2_TX_DMA_REQUEST, \ + } +#endif /* UART2_DMA_TX_CONFIG */ +#endif /* BSP_UART2_TX_USING_DMA */ +#endif /* RT_SERIAL_USING_DMA */ + +#ifndef UART2_CONFIG +#define UART2_CONFIG \ + { \ + .name = "uart2", \ + .Instance = USART2, \ + .irq_type = USART2_IRQn, \ + .enable_id = EN_UART2, \ + .tx_port = UART2_TX_PORT, \ + .rx_port = UART2_RX_PORT, \ + .tx_pin = UART2_TX_PIN, \ + .rx_pin = UART2_RX_PIN, \ + } +#endif /* UART2_CONFIG */ +#endif /* BSP_USING_UART2 */ + +#if defined(BSP_USING_UART3) + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_UART3_RX_USING_DMA) +#ifndef UART3_DMA_RX_CONFIG +#define UART3_DMA_RX_CONFIG \ + { \ + .Instance = UART3_RX_DMA_INSTANCE, \ + .dma_rcc = UART3_RX_DMA_RCC, \ + .dma_irq = UART3_RX_DMA_IRQ, \ + .channel = UART3_RX_DMA_CHANNEL, \ + .request = UART3_RX_DMA_REQUEST, \ + } +#endif /* UART3_DMA_RX_CONFIG */ +#endif /* BSP_UART3_RX_USING_DMA */ + +#if defined(BSP_UART3_TX_USING_DMA) +#ifndef UART3_DMA_TX_CONFIG +#define UART3_DMA_TX_CONFIG \ + { \ + .Instance = UART3_TX_DMA_INSTANCE, \ + .dma_rcc = UART3_TX_DMA_RCC, \ + .dma_irq = UART3_TX_DMA_IRQ, \ + .channel = UART3_TX_DMA_CHANNEL, \ + .request = UART3_TX_DMA_REQUEST, \ + } +#endif /* UART3_DMA_TX_CONFIG */ +#endif /* BSP_UART3_TX_USING_DMA */ +#endif /* RT_SERIAL_USING_DMA */ + +#ifndef UART3_CONFIG +#define UART3_CONFIG \ + { \ + .name = "uart3", \ + .Instance = USART3, \ + .irq_type = USART3_IRQn, \ + .enable_id = EN_UART3, \ + .tx_port = UART3_TX_PORT, \ + .rx_port = UART3_RX_PORT, \ + .tx_pin = UART3_TX_PIN, \ + .rx_pin = UART3_RX_PIN, \ + } +#endif /* UART3_CONFIG */ +#endif /* BSP_USING_UART3 */ + +#if defined(BSP_USING_UART4) + +#if defined(RT_SERIAL_USING_DMA) +#if defined(BSP_UART4_RX_USING_DMA) +#ifndef UART4_DMA_RX_CONFIG +#define UART4_DMA_RX_CONFIG \ + { \ + .Instance = UART4_RX_DMA_INSTANCE, \ + .dma_rcc = UART4_RX_DMA_RCC, \ + .dma_irq = UART4_RX_DMA_IRQ, \ + .channel = UART4_RX_DMA_CHANNEL, \ + .request = UART4_RX_DMA_REQUEST, \ + } +#endif /* UART4_DMA_RX_CONFIG */ +#endif /* BSP_UART4_RX_USING_DMA */ + +#if defined(BSP_UART4_TX_USING_DMA) +#ifndef UART4_DMA_TX_CONFIG +#define UART4_DMA_TX_CONFIG \ + { \ + .Instance = UART4_TX_DMA_INSTANCE, \ + .dma_rcc = UART4_TX_DMA_RCC, \ + .dma_irq = UART4_TX_DMA_IRQ, \ + .channel = UART4_TX_DMA_CHANNEL, \ + .request = UART4_TX_DMA_REQUEST, \ + } +#endif /* UART4_DMA_TX_CONFIG */ +#endif /* BSP_UART4_TX_USING_DMA */ +#endif /* RT_SERIAL_USING_DMA */ + +#ifndef UART4_CONFIG +#define UART4_CONFIG \ + { \ + .name = "uart4", \ + .Instance = USART4, \ + .irq_type = USART4_IRQn, \ + .enable_id = EN_UART4, \ + .tx_port = UART4_TX_PORT, \ + .rx_port = UART4_RX_PORT, \ + .tx_pin = UART4_TX_PIN, \ + .rx_pin = UART4_RX_PIN, \ + } +#endif /* UART4_CONFIG */ +#endif /* BSP_USING_UART4 */ + +#ifdef __cplusplus +} +#endif + +#endif /* RT_USING_SERIAL */ + +#endif /* __UART_CONFIG_H__ */ + diff --git a/bsp/acm32/acm32h5xx-nucleo/drivers/drv_dma.c b/bsp/acm32/acm32h5xx-nucleo/drivers/drv_dma.c new file mode 100644 index 0000000000..c5f9b49e2e --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/drivers/drv_dma.c @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-10-27 AisinoChip The first version + */ + +#include +#include +#include +#include "hal_dma.h" +#include "drv_dma.h" + +#include + + + +#ifdef RT_USING_HW_MEM_OPERATION + +static DMA_TypeDef *DMAAddr=MEM_OP_DMA_BASEADDR; + + +void rt_dma_mem_op_init(void) +{ + int ret; + uint32_t dest, src; + + __HAL_RCC_DMA1_CLK_ENABLE(); + + DMAAddr->INTTCCLR = (((1<INTERRCLR = ((1<CONFIG = ((DMA_MASTER1_ENDIAN_LITTLE<CXLLI = 0; + MEMCPY_DMA_INSTANCE->CXLLI = 0; + + //start a DMA transmit + MEMCPY_DMA_INSTANCE->CXSRCADDR = (uint32_t)&src; + MEMCPY_DMA_INSTANCE->CXDESTADDR = (uint32_t)&dest; + MEMCPY_DMA_INSTANCE->CXCTRL = (DMA_CXCTRL_RITEN + | (1<CXCONFIG = 1; + + //start a DMA transmit + MEMSET_DMA_INSTANCE->CXSRCADDR = (uint32_t)&src; + MEMSET_DMA_INSTANCE->CXDESTADDR = (uint32_t)&dest; + MEMSET_DMA_INSTANCE->CXCTRL = (DMA_CXCTRL_RITEN + | (1<CXCONFIG = 1; +} + + +void *dma_memcpy(void *dst, const void *src, rt_ubase_t count) +{ +// while(0==(DMAAddr->RAWINTTCSTATUS&(1<INTTCCLR = ((1<INTERRCLR = ((1<CXSRCADDR = (uint32_t)src; + MEMCPY_DMA_INSTANCE->CXDESTADDR = (uint32_t)dst; + if((((uint32_t)dst)&((uint32_t)src)&0x03) || (count<16)) //8bit + { + MEMCPY_DMA_INSTANCE->CXCTRL = (DMA_CXCTRL_RITEN + | (1<CXCONFIG = 1; + } + else //32bit + { + int i; + MEMCPY_DMA_INSTANCE->CXCTRL = (DMA_CXCTRL_RITEN + | (1<>2)); + MEMCPY_DMA_INSTANCE->CXCONFIG = ((1<<0)|(1<<11)); + + i=(count&0x03); + if(i) + { + while(i--) + { + *(((uint8_t *)dst+count-1)-i) = *(((uint8_t *)src+count-1)-i); + } + } + } + + while(0==(DMAAddr->RAWINTTCSTATUS&(1<RAWINTTCSTATUS&(1<INTTCCLR = ((1<INTERRCLR = ((1<CXSRCADDR = &c; + MEMSET_DMA_INSTANCE->CXDESTADDR = s; + MEMSET_DMA_INSTANCE->CXCTRL = (DMA_CXCTRL_RITEN + | (1<CXCONFIG = ((1<<0)|(1<<11)); +// MEMSET_DMA_INSTANCE->CXCONFIG = 1; + + while(0==(DMAAddr->RAWINTTCSTATUS&(1<=4) + { + ((uint8_t *)&Val)[0] = (uint8_t)c; + ((uint8_t *)&Val)[1] = (uint8_t)c; + ((uint8_t *)&Val)[2] = (uint8_t)c; + ((uint8_t *)&Val)[3] = (uint8_t)c; + + DMAAddr->INTTCCLR = ((1<INTERRCLR = ((1<CXSRCADDR = (uint32_t)&Val; + MEMSET_DMA_INSTANCE->CXDESTADDR = Addr; + MEMSET_DMA_INSTANCE->CXCTRL = (DMA_CXCTRL_RITEN + | (1<>2)); + MEMSET_DMA_INSTANCE->CXCONFIG = ((1<<0)|(1<<11)); +// MEMSET_DMA_INSTANCE->CXCONFIG = 1; + + Addr += (cnt&(~3)); + cnt &= 3; + + + while(0==(DMAAddr->RAWINTTCSTATUS&(1<RAWINTTCSTATUS&(1<INTTCCLR = ((1<INTERRCLR = ((1<=4) + { + MEMSET_DMA_INSTANCE->CXSRCADDR = &Val; + MEMSET_DMA_INSTANCE->CXDESTADDR = Addr; + MEMSET_DMA_INSTANCE->CXCTRL = (DMA_CXCTRL_RITEN + | (1<>2)); +// MEMSET_DMA_INSTANCE->CXCONFIG = ((1<<0)|(1<<11)); + MEMSET_DMA_INSTANCE->CXCONFIG = 1; + } + + if(((uint32_t)s)&3) //head align + { + ((uint8_t *)s)[0] = (uint8_t)c; + ((uint8_t *)s)[1] = (uint8_t)c; + ((uint8_t *)s)[2] = (uint8_t)c; + } + + if(cnt&3) //tail align + { + *((uint8_t *)(Addr+cnt-1)) = (uint8_t)c; + *((uint8_t *)(Addr+cnt-2)) = (uint8_t)c; + *((uint8_t *)(Addr+cnt-3)) = (uint8_t)c; + } + + while(0==(DMAAddr->RAWINTTCSTATUS&(1< +#include +#include "board.h" + + +#ifdef RT_USING_PIN + +#include "./Inc/drv_gpio.h" + + +#define __ACM32_PIN(index, gpio, gpio_index) \ + { \ + index, GPIO##gpio, GPIO_PIN_##gpio_index \ + } + +#define __ACM32_PIN_RESERVE \ + { \ + -1, 0, 0 \ + } + + +/* ACM32 GPIO driver */ +struct pin_index +{ + int index; + GPIO_TypeDef *gpio; + uint32_t pin; +}; + +struct pin_irq_map +{ + rt_uint16_t line; + EXTI_HandleTypeDef handle; +}; + +static const struct pin_index pins[] = +{ +#if defined(BSP_USING_GPIOA) + __ACM32_PIN(0, A, 0), + __ACM32_PIN(1, A, 1), + __ACM32_PIN(2, A, 2), + __ACM32_PIN(3, A, 3), + __ACM32_PIN(4, A, 4), + __ACM32_PIN(5, A, 5), + __ACM32_PIN(6, A, 6), + __ACM32_PIN(7, A, 7), + __ACM32_PIN(8, A, 8), + __ACM32_PIN(9, A, 9), + __ACM32_PIN(10, A, 10), + __ACM32_PIN(11, A, 11), + __ACM32_PIN(12, A, 12), + __ACM32_PIN(13, A, 13), + __ACM32_PIN(14, A, 14), + __ACM32_PIN(15, A, 15), +#endif /* defined(BSP_USING_GPIOA) */ +#if defined(BSP_USING_GPIOB) + __ACM32_PIN((16*1)+0, B, 0), + __ACM32_PIN((16*1)+1, B, 1), + __ACM32_PIN((16*1)+2, B, 2), + __ACM32_PIN((16*1)+3, B, 3), + __ACM32_PIN((16*1)+4, B, 4), + __ACM32_PIN((16*1)+5, B, 5), + __ACM32_PIN((16*1)+6, B, 6), + __ACM32_PIN((16*1)+7, B, 7), + __ACM32_PIN((16*1)+8, B, 8), + __ACM32_PIN((16*1)+9, B, 9), + __ACM32_PIN((16*1)+10, B, 10), + __ACM32_PIN((16*1)+11, B, 11), + __ACM32_PIN((16*1)+12, B, 12), + __ACM32_PIN((16*1)+13, B, 13), + __ACM32_PIN((16*1)+14, B, 14), + __ACM32_PIN((16*1)+15, B, 15), +#endif /* defined(BSP_USING_GPIOB) */ +#if defined(BSP_USING_GPIOC) + __ACM32_PIN((16*1)+0, C, 0), + __ACM32_PIN((16*1)+1, C, 1), + __ACM32_PIN((16*1)+2, C, 2), + __ACM32_PIN((16*1)+3, C, 3), + __ACM32_PIN((16*1)+4, C, 4), + __ACM32_PIN((16*1)+5, C, 5), + __ACM32_PIN((16*1)+6, C, 6), + __ACM32_PIN((16*1)+7, C, 7), + __ACM32_PIN((16*1)+8, C, 8), + __ACM32_PIN((16*1)+9, C, 9), + __ACM32_PIN((16*1)+10, C, 10), + __ACM32_PIN((16*1)+11, C, 11), + __ACM32_PIN((16*1)+12, C, 12), + __ACM32_PIN((16*1)+13, C, 13), + __ACM32_PIN((16*1)+14, C, 14), + __ACM32_PIN((16*1)+15, C, 15), +#endif /* defined(BSP_USING_GPIOC) */ +#if defined(BSP_USING_GPIOD) + __ACM32_PIN((16*1)+0, D, 0), + __ACM32_PIN((16*1)+1, D, 1), + __ACM32_PIN((16*1)+2, D, 2), + __ACM32_PIN((16*1)+3, D, 3), + __ACM32_PIN((16*1)+4, D, 4), + __ACM32_PIN((16*1)+5, D, 5), + __ACM32_PIN((16*1)+6, D, 6), + __ACM32_PIN((16*1)+7, D, 7), + __ACM32_PIN((16*1)+8, D, 8), + __ACM32_PIN((16*1)+9, D, 9), + __ACM32_PIN((16*1)+10, D, 10), + __ACM32_PIN((16*1)+11, D, 11), + __ACM32_PIN((16*1)+12, D, 12), + __ACM32_PIN((16*1)+13, D, 13), + __ACM32_PIN((16*1)+14, D, 14), + __ACM32_PIN((16*1)+15, D, 15), +#endif /* defined(BSP_USING_GPIOD) */ +#if defined(BSP_USING_GPIOE) + __ACM32_PIN((16*1)+0, E, 0), + __ACM32_PIN((16*1)+1, E, 1), + __ACM32_PIN((16*1)+2, E, 2), + __ACM32_PIN((16*1)+3, E, 3), + __ACM32_PIN((16*1)+4, E, 4), + __ACM32_PIN((16*1)+5, E, 5), + __ACM32_PIN((16*1)+6, E, 6), + __ACM32_PIN((16*1)+7, E, 7), + __ACM32_PIN((16*1)+8, E, 8), + __ACM32_PIN((16*1)+9, E, 9), + __ACM32_PIN((16*1)+10, E, 10), + __ACM32_PIN((16*1)+11, E, 11), + __ACM32_PIN((16*1)+12, E, 12), + __ACM32_PIN((16*1)+13, E, 13), + __ACM32_PIN((16*1)+14, E, 14), + __ACM32_PIN((16*1)+15, E, 15), +#endif /* defined(BSP_USING_GPIOE) */ +#if defined(BSP_USING_GPIOF) + __ACM32_PIN((16*1)+0, F, 0), + __ACM32_PIN((16*1)+1, F, 1), + __ACM32_PIN((16*1)+2, F, 2), + __ACM32_PIN((16*1)+3, F, 3), + __ACM32_PIN((16*1)+4, F, 4), + __ACM32_PIN((16*1)+5, F, 5), + __ACM32_PIN((16*1)+6, F, 6), + __ACM32_PIN((16*1)+7, F, 7), + __ACM32_PIN((16*1)+8, F, 8), + __ACM32_PIN((16*1)+9, F, 9), + __ACM32_PIN((16*1)+10, F, 10), + __ACM32_PIN((16*1)+11, F, 11), + __ACM32_PIN((16*1)+12, F, 12), + __ACM32_PIN((16*1)+13, F, 13), + __ACM32_PIN((16*1)+14, F, 14), + __ACM32_PIN((16*1)+15, F, 15), +#endif /* defined(BSP_USING_GPIOF) */ +#if defined(BSP_USING_GPIOG) + __ACM32_PIN((16*1)+0, G, 0), + __ACM32_PIN((16*1)+1, G, 1), + __ACM32_PIN((16*1)+2, G, 2), + __ACM32_PIN((16*1)+3, G, 3), + __ACM32_PIN((16*1)+4, G, 4), + __ACM32_PIN((16*1)+5, G, 5), + __ACM32_PIN((16*1)+6, G, 6), + __ACM32_PIN((16*1)+7, G, 7), + __ACM32_PIN((16*1)+8, G, 8), + __ACM32_PIN((16*1)+9, G, 9), + __ACM32_PIN((16*1)+10, G, 10), + __ACM32_PIN((16*1)+11, G, 11), + __ACM32_PIN((16*1)+12, G, 12), + __ACM32_PIN((16*1)+13, G, 13), + __ACM32_PIN((16*1)+14, G, 14), + __ACM32_PIN((16*1)+15, G, 15), +#endif /* defined(BSP_USING_GPIOG) */ +#if defined(BSP_USING_GPIOH) + __ACM32_PIN((16*1)+0, H, 0), + __ACM32_PIN((16*1)+1, H, 1), + __ACM32_PIN((16*1)+2, H, 2), + __ACM32_PIN((16*1)+3, H, 3), + __ACM32_PIN((16*1)+4, H, 4), + __ACM32_PIN((16*1)+5, H, 5), + __ACM32_PIN((16*1)+6, H, 6), + __ACM32_PIN((16*1)+7, H, 7), + __ACM32_PIN((16*1)+8, H, 8), + __ACM32_PIN((16*1)+9, H, 9), + __ACM32_PIN((16*1)+10, H, 10), + __ACM32_PIN((16*1)+11, H, 11), + __ACM32_PIN((16*1)+12, H, 12), + __ACM32_PIN((16*1)+13, H, 13), + __ACM32_PIN((16*1)+14, H, 14), + __ACM32_PIN((16*1)+15, H, 15), +#endif /* defined(BSP_USING_GPIOH) */ +}; + +static struct pin_irq_map pin_irq_map[] = +{ + {EXTI_LINE_0, {0}}, + {EXTI_LINE_1, {0}}, + {EXTI_LINE_2, {0}}, + {EXTI_LINE_3, {0}}, + {EXTI_LINE_4, {0}}, + {EXTI_LINE_5, {0}}, + {EXTI_LINE_6, {0}}, + {EXTI_LINE_7, {0}}, + {EXTI_LINE_8, {0}}, + {EXTI_LINE_9, {0}}, + {EXTI_LINE_10, {0}}, + {EXTI_LINE_11, {0}}, + {EXTI_LINE_12, {0}}, + {EXTI_LINE_13, {0}}, + {EXTI_LINE_14, {0}}, + {EXTI_LINE_15, {0}}, +}; + +static struct rt_pin_irq_hdr pin_irq_hdr_tab[] = +{ + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, + {-1, 0, RT_NULL, RT_NULL}, +}; +static uint32_t pin_irq_enable_mask = 0; + + +rt_bool_t drv_gpio_init(GPIO_TypeDef *gpiox, rt_uint32_t pin, rt_uint32_t mode, + rt_uint32_t pull, rt_uint32_t alternate) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + RT_ASSERT(IS_GPIO_ALL_INSTANCE(gpiox)); + RT_ASSERT(IS_GPIO_ALL_PIN(pin)); + RT_ASSERT(IS_GPIO_MODE(0, mode)); + RT_ASSERT(IS_GPIO_PULL(pull)); + RT_ASSERT(IS_GPIO_FUNCTION(alternate)); + + GPIO_InitStruct.Pin = pin; + GPIO_InitStruct.Mode = mode; + GPIO_InitStruct.Pull = pull; + GPIO_InitStruct.Alternate = alternate; + GPIO_InitStruct.Drive = GPIO_DRIVE_LEVEL3; + HAL_GPIO_Init(gpiox, &GPIO_InitStruct); + + return RT_TRUE; +} + + +#define ITEM_NUM(items) sizeof(items) / sizeof(items[0]) +static const struct pin_index *get_pin(uint8_t pin) +{ + const struct pin_index *index; + + if (pin < ITEM_NUM(pins)) + { + index = &pins[pin]; + if (index->index == -1) + index = RT_NULL; + } + else + { + index = RT_NULL; + } + + return index; +}; + +static void _pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value) +{ + const struct pin_index *index; + + index = get_pin(pin); + if (index == RT_NULL) + { + return; + } + + HAL_GPIO_WritePin(index->gpio, index->pin, (GPIO_PinState)value); +} + +static rt_int8_t _pin_read(rt_device_t dev, rt_base_t pin) +{ + int value; + const struct pin_index *index; + + value = PIN_LOW; + + index = get_pin(pin); + if (index == RT_NULL) + { + return value; + } + + value = HAL_GPIO_ReadPin(index->gpio, index->pin); + + return value; +} + +static void _pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) +{ + const struct pin_index *index; + GPIO_InitTypeDef GPIO_InitStruct; + + index = get_pin(pin); + if (index == RT_NULL) + { + return; + } + + /* Configure GPIO_InitStructure */ + GPIO_InitStruct.Pin = index->pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Alternate = GPIO_FUNCTION_0; + GPIO_InitStruct.Drive = GPIO_DRIVE_LEVEL3; + + if (mode == PIN_MODE_OUTPUT) + { + /* output setting */ + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + } + else if (mode == PIN_MODE_INPUT) + { + /* input setting: not pull. */ + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + } + else if (mode == PIN_MODE_INPUT_PULLUP) + { + /* input setting: pull up. */ + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + } + else if (mode == PIN_MODE_INPUT_PULLDOWN) + { + /* input setting: pull down. */ + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + } + else if (mode == PIN_MODE_OUTPUT_OD) + { + /* output setting: od. */ + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + } + + System_Module_Enable(EN_GPIOA+(((uint32_t)(index->gpio)-(uint32_t)GPIOA)>>10)); + HAL_GPIO_Init(index->gpio, &GPIO_InitStruct); + +} + +#define PIN2INDEX(pin) ((pin) % 16) + +static rt_err_t _pin_attach_irq(struct rt_device *device, rt_base_t pin, + rt_uint8_t mode, void (*hdr)(void *args), void *args) +{ + const struct pin_index *index; + rt_base_t level; + rt_int32_t irqindex = -1; + + index = get_pin(pin); + if (index == RT_NULL) + { + return -RT_ENOSYS; + } + + irqindex = PIN2INDEX(pin); + + level = rt_hw_interrupt_disable(); + if (pin_irq_hdr_tab[irqindex].pin == pin && + pin_irq_hdr_tab[irqindex].hdr == hdr && + pin_irq_hdr_tab[irqindex].mode == mode && + pin_irq_hdr_tab[irqindex].args == args) + { + rt_hw_interrupt_enable(level); + return RT_EOK; + } + + if (pin_irq_hdr_tab[irqindex].pin != -1) + { + rt_hw_interrupt_enable(level); + return -RT_EBUSY; + } + + pin_irq_hdr_tab[irqindex].pin = pin; + pin_irq_hdr_tab[irqindex].hdr = hdr; + pin_irq_hdr_tab[irqindex].mode = mode; + pin_irq_hdr_tab[irqindex].args = args; + rt_hw_interrupt_enable(level); + + return RT_EOK; +} + +static rt_err_t _pin_dettach_irq(struct rt_device *device, rt_base_t pin) +{ + const struct pin_index *index; + rt_base_t level; + rt_int32_t irqindex = -1; + + index = get_pin(pin); + if (index == RT_NULL) + { + return -RT_ENOSYS; + } + + irqindex = PIN2INDEX(pin); + + level = rt_hw_interrupt_disable(); + if (pin_irq_hdr_tab[irqindex].pin == -1) + { + rt_hw_interrupt_enable(level); + return RT_EOK; + } + pin_irq_hdr_tab[irqindex].pin = -1; + pin_irq_hdr_tab[irqindex].hdr = RT_NULL; + pin_irq_hdr_tab[irqindex].mode = 0; + pin_irq_hdr_tab[irqindex].args = RT_NULL; + rt_hw_interrupt_enable(level); + + return RT_EOK; +} + +static rt_err_t _pin_irq_enable(struct rt_device *device, rt_base_t pin, + rt_uint8_t enabled) +{ +#if 1 + const struct pin_index *index; + struct pin_irq_map *irqmap; + rt_base_t level; + rt_int32_t irqindex = -1; + GPIO_InitTypeDef GPIO_InitStruct; + + index = get_pin(pin); + if (index == RT_NULL) + { + return -RT_ENOSYS; + } + + irqindex = PIN2INDEX(pin); + irqmap = &pin_irq_map[irqindex]; + + if (enabled == PIN_IRQ_ENABLE) + { + level = rt_hw_interrupt_disable(); + + if (pin_irq_hdr_tab[irqindex].pin == -1) + { + rt_hw_interrupt_enable(level); + return -RT_ENOSYS; + } + + /* Configure GPIO_InitStructure */ + GPIO_InitStruct.Pin = index->pin; + GPIO_InitStruct.Alternate = GPIO_FUNCTION_0; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + + irqmap->handle.u32_Line = irqmap->line; + + switch (pin_irq_hdr_tab[irqindex].mode) + { + case PIN_IRQ_MODE_RISING: + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + irqmap->handle.u32_Mode = EXTI_MODE_IT_RISING; + break; + case PIN_IRQ_MODE_FALLING: + GPIO_InitStruct.Pull = GPIO_PULLUP; + irqmap->handle.u32_Mode = EXTI_MODE_IT_FALLING; + break; + case PIN_IRQ_MODE_RISING_FALLING: + GPIO_InitStruct.Pull = GPIO_NOPULL; + irqmap->handle.u32_Mode = EXTI_MODE_IT_RISING_FALLING; + break; + } + HAL_GPIO_Init(index->gpio, &GPIO_InitStruct); + + irqmap->handle.u32_GPIOSel = pin / 16; + + HAL_EXTI_SetConfigLine(index->gpio, irqmap->handle.u32_Line, irqmap->handle.u32_Mode); + + pin_irq_enable_mask |= 1 << irqindex; + + rt_hw_interrupt_enable(level); + } + else if (enabled == PIN_IRQ_DISABLE) + { + if ((pin_irq_enable_mask & (1 << irqindex)) == 0) + { + return -RT_ENOSYS; + } + + level = rt_hw_interrupt_disable(); + + EXTI->IENR1 &= ~irqmap->line; + EXTI->EENR1 &= ~irqmap->line; + + rt_hw_interrupt_enable(level); + } + else + { + return -RT_ENOSYS; + } +#endif + + return RT_EOK; +} + +const static struct rt_pin_ops _acm32_pin_ops = +{ + _pin_mode, + _pin_write, + _pin_read, + _pin_attach_irq, + _pin_dettach_irq, + _pin_irq_enable, +}; + +rt_inline void pin_irq_hdr(int irqno) +{ + if (pin_irq_hdr_tab[irqno].hdr) + { + pin_irq_hdr_tab[irqno].hdr(pin_irq_hdr_tab[irqno].args); + } +} + +int rt_hw_pin_init(void) +{ + return rt_device_pin_register("pin", &_acm32_pin_ops, RT_NULL); +} +INIT_BOARD_EXPORT(rt_hw_pin_init); + +void EXTI_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + for (int i = 0; i < 16; i++) + { + if (EXTI->PDR1 & pin_irq_map[i].line) + { + EXTI->PDR1 = pin_irq_map[i].line; + pin_irq_hdr(i); + break; + } + } + + /* leave interrupt */ + rt_interrupt_leave(); +} + + +struct pin_index pin_tbl[5][10]; + +static void test() +{ + struct pin_index **test_pin; + + test_pin = (struct pin_index **)pin_tbl; + + test_pin[0][1].index = 0; +} + + + + + +#endif /* RT_USING_PIN */ + diff --git a/bsp/acm32/acm32h5xx-nucleo/drivers/drv_uart.c b/bsp/acm32/acm32h5xx-nucleo/drivers/drv_uart.c new file mode 100644 index 0000000000..05c5bb5bd2 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/drivers/drv_uart.c @@ -0,0 +1,631 @@ +/* + * Copyright (c) 2006-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-23 AisinoChip the first version + */ + +#include +#include +#include +#include "board.h" + + +#ifdef RT_USING_SERIAL + +#include "./Inc/drv_uart.h" +#include "./config/uart_config.h" + + +#ifdef RT_SERIAL_USING_DMA +struct dma_config +{ + DMA_Channel_TypeDef *Instance; + rt_uint32_t dma_rcc; + IRQn_Type dma_irq; + + rt_uint32_t channel; + rt_uint32_t request; +}; +#endif + +#ifdef RT_SERIAL_USING_DMA + static void DMA_Configuration(struct rt_serial_device *serial, rt_uint32_t flag); +#endif /* RT_SERIAL_USING_DMA */ + +static rt_err_t uart_rx_indicate_cb(rt_device_t dev, rt_size_t size) +{ + return RT_EOK; +} + +static rt_err_t _uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) +{ + struct acm32_uart *uart; + + RT_ASSERT(serial != RT_NULL); + RT_ASSERT(cfg != RT_NULL); + + uart = rt_container_of(serial, struct acm32_uart, serial); + + uart->handle.Instance = uart->config->Instance; + + uart->handle.Init.BaudRate = cfg->baud_rate; + if (cfg->data_bits == DATA_BITS_8) + { + uart->handle.Init.WordLength = UART_WORDLENGTH_8B; + } + else /* not support */ + { + return -RT_EINVAL; + } + + if (cfg->stop_bits == STOP_BITS_1) + { + uart->handle.Init.StopBits = UART_STOPBITS_1; + } + else if (cfg->stop_bits == STOP_BITS_2) + { + uart->handle.Init.StopBits = UART_STOPBITS_2; + } + else /* not support */ + { + return -RT_EINVAL; + } + + if (cfg->parity == PARITY_NONE) + { + uart->handle.Init.Parity = UART_PARITY_NONE; + } + else if (cfg->parity == PARITY_ODD) + { + uart->handle.Init.Parity = UART_PARITY_ODD; + } + else if (cfg->parity == PARITY_EVEN) + { + uart->handle.Init.Parity = UART_PARITY_EVEN; + } + else /* not support */ + { + return -RT_EINVAL; + } + + uart->handle.Init.Mode = UART_MODE_TX_RX; + uart->handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; + + HAL_UART_Init(&uart->handle); + + return RT_EOK; +} + +static rt_err_t _uart_control(struct rt_serial_device *serial, int cmd, void *arg) +{ + struct acm32_uart *uart; +#ifdef RT_SERIAL_USING_DMA + rt_ubase_t ctrl_arg = (rt_ubase_t)arg; +#endif + + RT_ASSERT(serial != RT_NULL); + + uart = rt_container_of(serial, struct acm32_uart, serial); + + switch (cmd) + { + /* disable interrupt */ + case RT_DEVICE_CTRL_CLR_INT: + NVIC_DisableIRQ(uart->config->irq_type); + /* Disable RX interrupt */ + uart->handle.Instance->IE &= ~UART_IE_RXI; + break; + /* enable interrupt */ + case RT_DEVICE_CTRL_SET_INT: + NVIC_EnableIRQ(uart->config->irq_type); + /* Enable RX interrupt */ + uart->handle.Instance->IE |= UART_IE_RXI; + break; +#ifdef RT_SERIAL_USING_DMA + /* UART config */ + case RT_DEVICE_CTRL_CONFIG : + DMA_Configuration(serial, (rt_uint32_t)ctrl_arg); + rt_device_set_rx_indicate((rt_device_t)serial, uart_rx_indicate_cb); + break; +#endif /* RT_SERIAL_USING_DMA */ + } + return RT_EOK; +} + +static int _uart_putc(struct rt_serial_device *serial, char c) +{ + struct acm32_uart *uart; + + RT_ASSERT(serial != RT_NULL); + + uart = rt_container_of(serial, struct acm32_uart, serial); + + while (uart->handle.Instance->FR & UART_FR_TXFF); /* wait Tx FIFO not full */ + uart->handle.Instance->DR = c; + while ((uart->handle.Instance->FR & UART_FR_BUSY)); /* wait TX Complete */ + + return 1; +} + +static int _uart_getc(struct rt_serial_device *serial) +{ + struct acm32_uart *uart; + + int ch; + + RT_ASSERT(serial != RT_NULL); + + uart = rt_container_of(serial, struct acm32_uart, serial); + + ch = -1; + if (!(uart->handle.Instance->FR & UART_FR_RXFE)) /* Rx FIFO not empty */ + { + ch = uart->handle.Instance->DR & 0xff; + } + + return ch; +} + +#ifdef RT_SERIAL_USING_DMA +/** + * Serial port receive idle process. This need add to uart idle ISR. + * + * @param serial serial device + */ +static void dma_uart_rx_idle_isr(struct rt_serial_device *serial) +{ + struct acm32_uart *uart; + + RT_ASSERT(serial != RT_NULL); + + uart = rt_container_of(serial, struct acm32_uart, serial); + + rt_size_t recv_total_index, recv_len; + rt_base_t level; + + /* disable interrupt */ + level = rt_hw_interrupt_disable(); + + recv_total_index = uart->handle.lu32_RxSize - (uart->handle.HDMA_Rx->Instance->CTRL & 0xFFF); + recv_len = recv_total_index - uart->handle.lu32_RxCount; + uart->handle.lu32_RxCount = recv_total_index; + /* enable interrupt */ + rt_hw_interrupt_enable(level); + + if (recv_len) + { + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8)); + } +} + +/* + DMA receive done process. This need add to DMA receive done ISR. + + @param serial serial device +*/ +static void dma_rx_done_isr(struct rt_serial_device *serial) +{ + struct acm32_uart *uart; + struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; + + RT_ASSERT(serial != RT_NULL); + + uart = rt_container_of(serial, struct acm32_uart, serial); + + rt_size_t recv_len; + rt_base_t level; + + /* disable interrupt */ + level = rt_hw_interrupt_disable(); + + recv_len = serial->config.bufsz - (uart->handle.HDMA_Rx->Instance->CTRL & 0xFFF); + uart->dma_rx.last_index = 0; + + DMA->INT_TC_CLR |= 1 << (uart->config->dma_rx->channel); /* clear channel0 TC flag */ + + /* enable interrupt */ + rt_hw_interrupt_enable(level); + + if (recv_len) + { + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8)); + } + + HAL_UART_Receive_DMA(&(uart->handle), &rx_fifo->buffer[rx_fifo->put_index], serial->config.bufsz); +} + +static rt_ssize_t _uart_dma_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction) +{ + struct acm32_uart *uart; + RT_ASSERT(serial != RT_NULL); + uart = rt_container_of(serial, struct acm32_uart, serial); + + if (size == 0) + { + return 0; + } + + if (RT_SERIAL_DMA_TX == direction) + { + if (HAL_UART_Transmit_DMA(&uart->handle, buf, size) == HAL_OK) + { + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DMADONE); + return size; + } + else + { + return 0; + } + } + return 0; +} + +#endif /* RT_SERIAL_USING_DMA */ + +static const struct rt_uart_ops acm32_uart_ops = +{ + _uart_configure, + _uart_control, + _uart_putc, + _uart_getc, +#ifdef RT_SERIAL_USING_DMA + _uart_dma_transmit, +#endif +}; + +#ifdef RT_SERIAL_USING_DMA +static void DMA_Configuration(struct rt_serial_device *serial, rt_uint32_t flag) +{ + struct rt_serial_rx_fifo *rx_fifo; + DMA_HandleTypeDef *DMA_Handle; + struct dma_config *dma_config; + struct acm32_uart *uart; + + RT_ASSERT(serial != RT_NULL); + + uart = rt_container_of(serial, struct acm32_uart, serial); + + if (RT_DEVICE_FLAG_DMA_RX == flag) + { + DMA_Handle = &uart->dma_rx.handle; + dma_config = uart->config->dma_rx; + } + else if (RT_DEVICE_FLAG_DMA_TX == flag) + { + DMA_Handle = &uart->dma_tx.handle; + dma_config = uart->config->dma_tx; + } + else + { + return; + } + + DMA_Handle->Instance = dma_config->Instance; + + if (RT_DEVICE_FLAG_DMA_RX == flag) + { + DMA_Handle->Init.Data_Flow = DMA_DATA_FLOW_P2M; + DMA_Handle->Init.Mode = DMA_MODE_NORMAL; + DMA_Handle->Init.Source_Inc = DMA_SOURCE_ADDR_INCREASE_DISABLE; + DMA_Handle->Init.Desination_Inc = DMA_DST_ADDR_INCREASE_ENABLE; + + } + else if (RT_DEVICE_FLAG_DMA_TX == flag) + { + DMA_Handle->Init.Data_Flow = DMA_DATA_FLOW_M2P; + DMA_Handle->Init.Mode = DMA_MODE_NORMAL; + DMA_Handle->Init.Source_Inc = DMA_SOURCE_ADDR_INCREASE_ENABLE; + DMA_Handle->Init.Desination_Inc = DMA_DST_ADDR_INCREASE_DISABLE; + } + + DMA_Handle->Init.Request_ID = dma_config->request; + DMA_Handle->Init.Source_Width = DMA_SRC_WIDTH_BYTE; + DMA_Handle->Init.Desination_Width = DMA_DST_WIDTH_BYTE; + + if (HAL_DMA_Init(DMA_Handle) != HAL_OK) + { + RT_ASSERT(0); + } + + if (RT_DEVICE_FLAG_DMA_RX == flag) + { + __HAL_LINK_DMA(uart->handle, HDMA_Rx, uart->dma_rx.handle); + } + else if (RT_DEVICE_FLAG_DMA_TX == flag) + { + __HAL_LINK_DMA(uart->handle, HDMA_Tx, uart->dma_tx.handle); + } + /* enable interrupt */ + if (flag == RT_DEVICE_FLAG_DMA_RX) + { + rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; + /* Start DMA transfer */ + if (HAL_UART_Receive_DMA(&(uart->handle), rx_fifo->buffer, serial->config.bufsz) != HAL_OK) + { + /* Transfer error in reception process */ + RT_ASSERT(0); + } + + } +} +#endif /* RT_SERIAL_USING_DMA */ + +enum +{ +#ifdef BSP_USING_UART1 + UART1_INDEX, +#endif +#ifdef BSP_USING_UART2 + UART2_INDEX, +#endif +#ifdef BSP_USING_UART3 + UART3_INDEX, +#endif +#ifdef BSP_USING_UART4 + UART4_INDEX, +#endif + UART_MAX_INDEX, +}; + +static struct acm32_uart_config uart_config[] = +{ +#ifdef BSP_USING_UART1 + UART1_CONFIG, +#endif +#ifdef BSP_USING_UART2 + UART2_CONFIG, +#endif +#ifdef BSP_USING_UART3 + UART3_CONFIG, +#endif +#ifdef BSP_USING_UART4 + UART4_CONFIG, +#endif +}; + +static struct acm32_uart uart_obj[sizeof(uart_config) / sizeof(uart_config[0])] = {0}; +#ifdef RT_SERIAL_USING_DMA +static void uart_get_dma_config(void) +{ +#if defined(BSP_USING_UART1) +#if defined(BSP_UART1_RX_USING_DMA) + static struct dma_config uart1_rx_dma_conf = UART1_DMA_RX_CONFIG; + uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + uart_config[UART1_INDEX].dma_rx = &uart1_rx_dma_conf; +#endif /* BSP_UART1_RX_USING_DMA */ +#if defined(BSP_UART1_TX_USING_DMA) + static struct dma_config uart1_tx_dma_conf = UART1_DMA_TX_CONFIG; + uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + uart_config[UART1_INDEX].dma_tx = &uart1_tx_dma_conf; +#endif /* BSP_UART1_TX_USING_DMA */ +#endif /* BSP_USING_UART1 */ + +#if defined(BSP_USING_UART2) +#if defined(BSP_UART2_RX_USING_DMA) + static struct dma_config uart2_rx_dma_conf = UART2_DMA_RX_CONFIG; + uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + uart_config[UART2_INDEX].dma_rx = &uart2_rx_dma_conf; +#endif /* BSP_UART2_RX_USING_DMA */ +#if defined(BSP_UART2_TX_USING_DMA) + static struct dma_config uart2_tx_dma_conf = UART2_DMA_TX_CONFIG; + uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + uart_config[UART2_INDEX].dma_tx = &uart2_tx_dma_conf; +#endif /* BSP_UART2_TX_USING_DMA */ +#endif /* BSP_USING_UART2 */ + +#if defined(BSP_USING_UART3) +#if defined(BSP_UART3_RX_USING_DMA) + static struct dma_config uart3_rx_dma_conf = UART3_DMA_RX_CONFIG; + uart_obj[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + uart_config[UART3_INDEX].dma_rx = &uart3_rx_dma_conf; +#endif /* BSP_UART3_RX_USING_DMA */ +#if defined(BSP_UART3_TX_USING_DMA) + static struct dma_config uart3_tx_dma_conf = UART3_DMA_TX_CONFIG; + uart_obj[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + uart_config[UART3_INDEX].dma_tx = &uart3_tx_dma_conf; +#endif /* BSP_UART3_TX_USING_DMA */ +#endif /* BSP_USING_UART3 */ + +#if defined(BSP_USING_UART4) +#if defined(BSP_UART4_RX_USING_DMA) + static struct dma_config uart4_rx_dma_conf = UART4_DMA_RX_CONFIG; + uart_obj[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX; + uart_config[UART4_INDEX].dma_rx = &uart4_rx_dma_conf; +#endif /* BSP_UART4_RX_USING_DMA */ +#if defined(BSP_UART3_TX_USING_DMA) + static struct dma_config uart4_tx_dma_conf = UART4_DMA_TX_CONFIG; + uart_obj[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX; + uart_config[UART4_INDEX].dma_tx = &uart4_tx_dma_conf; +#endif /* BSP_UART4_TX_USING_DMA */ +#endif /* BSP_USING_UART4 */ +} +#endif + +rt_err_t rt_hw_uart_init(void) +{ + rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct acm32_uart); + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + rt_err_t rc = RT_EOK; + +#ifdef RT_SERIAL_USING_DMA + uart_get_dma_config(); +#endif + + for (int i = 0; i < obj_num; i++) + { + uart_obj[i].config = &uart_config[i]; + + uart_obj[i].serial.ops = &acm32_uart_ops; + uart_obj[i].serial.config = config; + + /* register UART device */ + rc = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name, + RT_DEVICE_FLAG_RDWR + | RT_DEVICE_FLAG_INT_RX + | RT_DEVICE_FLAG_INT_TX + | uart_obj[i].uart_dma_flag + , NULL); + RT_ASSERT(rc == RT_EOK); + } + + return rc; +} + + +static void uart_isr(struct rt_serial_device *serial) +{ + struct acm32_uart *uart = rt_container_of(serial, struct acm32_uart, serial); + + RT_ASSERT(serial != RT_NULL); + + /* receive interrupt enabled */ + if (uart->handle.Instance->IE & UART_IE_RXI) + { + if (uart->handle.Instance->ISR & UART_ISR_RXI) + { + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); + } + } + +#ifdef RT_SERIAL_USING_DMA + if (uart->handle.Instance->IE & UART_IE_RTI) /* Receive TimeOut Interrupt */ + { + dma_uart_rx_idle_isr(serial); + /* Clear RTI Status */ + uart->handle.Instance->ICR = UART_ICR_RTI; + } +#endif /* RT_SERIAL_USING_DMA */ + + if (uart->handle.Instance->IE & UART_IE_TXI && \ + uart->handle.Instance->ISR & UART_ISR_TXI) + { + /* Clear TXI Status */ + uart->handle.Instance->ISR = UART_ISR_TXI; + if (serial->parent.open_flag & RT_DEVICE_FLAG_INT_TX) + { + rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DONE); + } + /* Disable TX interrupt */ + uart->handle.Instance->IE &= ~UART_IE_TXI; + } +} + +#if defined(BSP_USING_UART1) +void USART1_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&uart_obj[UART1_INDEX].serial); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* BSP_USING_UART1 */ + +#if defined(BSP_USING_UART2) +void USART2_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&uart_obj[UART2_INDEX].serial); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* BSP_USING_UART2 */ + +#if defined(BSP_USING_UART3) +void USART3_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&uart_obj[UART3_INDEX].serial); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* BSP_USING_UART3 */ + +#if defined(BSP_USING_UART4) +void USART4_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&uart_obj[UART4_INDEX].serial); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* BSP_USING_UART4 */ + +#ifdef RT_SERIAL_USING_DMA +void DMA_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + for (int i = 0; i < UART_MAX_INDEX; i++) + { + if (DMA->RAW_INT_TC_STATUS & (1 << uart_obj[i].config->dma_rx->channel)) + { + dma_rx_done_isr(&uart_obj[i].serial); + break; + } + + if (DMA->RAW_INT_TC_STATUS & (1 << uart_obj[i].config->dma_tx->channel)) + { + DMA->INT_TC_CLR |= 1 << (uart_obj[i].config->dma_tx->channel); /* clear channel0 TC flag */ + break; + } + } + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* RT_SERIAL_USING_DMA */ + +void HAL_UART_MspInit(UART_HandleTypeDef *huart) +{ + struct acm32_uart *uart; + GPIO_InitTypeDef GPIO_Uart; + + RT_ASSERT(huart != RT_NULL); + + /* get uart object */ + uart = rt_container_of(huart, struct acm32_uart, handle); + + /* Enable Clock */ + System_Module_Enable(uart->config->enable_id); + System_Module_Enable(EN_GPIOA+(((uint32_t)(uart->config->tx_port)-(uint32_t)GPIOA)>>10)); + System_Module_Enable(EN_GPIOA+(((uint32_t)(uart->config->rx_port)-(uint32_t)GPIOA)>>10)); + + /* Initialization GPIO */ + GPIO_Uart.Pin = uart->config->tx_pin; + GPIO_Uart.Mode = GPIO_MODE_AF_PP; + GPIO_Uart.Pull = GPIO_PULLUP; + GPIO_Uart.Alternate = uart->config->tx_alternate; + GPIO_Uart.Drive = GPIO_DRIVE_LEVEL3; + HAL_GPIO_Init(uart->config->tx_port, &GPIO_Uart); + + GPIO_Uart.Pin = uart->config->rx_pin; + GPIO_Uart.Mode = GPIO_MODE_AF_PP; + GPIO_Uart.Pull = GPIO_PULLUP; + GPIO_Uart.Alternate = uart->config->rx_alternate; + HAL_GPIO_Init(uart->config->rx_port, &GPIO_Uart); + + /* NVIC Config */ + NVIC_ClearPendingIRQ(uart->config->irq_type); + NVIC_SetPriority(uart->config->irq_type, 5); + NVIC_EnableIRQ(uart->config->irq_type); +} + +#endif /* RT_USING_SEARIAL */ + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_armclang.h b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_armclang.h new file mode 100644 index 0000000000..e917f357a3 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_armclang.h @@ -0,0 +1,1444 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V5.2.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START +#define __PROGRAM_START __main +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF) + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +#define __SADD8 __builtin_arm_sadd8 +#define __QADD8 __builtin_arm_qadd8 +#define __SHADD8 __builtin_arm_shadd8 +#define __UADD8 __builtin_arm_uadd8 +#define __UQADD8 __builtin_arm_uqadd8 +#define __UHADD8 __builtin_arm_uhadd8 +#define __SSUB8 __builtin_arm_ssub8 +#define __QSUB8 __builtin_arm_qsub8 +#define __SHSUB8 __builtin_arm_shsub8 +#define __USUB8 __builtin_arm_usub8 +#define __UQSUB8 __builtin_arm_uqsub8 +#define __UHSUB8 __builtin_arm_uhsub8 +#define __SADD16 __builtin_arm_sadd16 +#define __QADD16 __builtin_arm_qadd16 +#define __SHADD16 __builtin_arm_shadd16 +#define __UADD16 __builtin_arm_uadd16 +#define __UQADD16 __builtin_arm_uqadd16 +#define __UHADD16 __builtin_arm_uhadd16 +#define __SSUB16 __builtin_arm_ssub16 +#define __QSUB16 __builtin_arm_qsub16 +#define __SHSUB16 __builtin_arm_shsub16 +#define __USUB16 __builtin_arm_usub16 +#define __UQSUB16 __builtin_arm_uqsub16 +#define __UHSUB16 __builtin_arm_uhsub16 +#define __SASX __builtin_arm_sasx +#define __QASX __builtin_arm_qasx +#define __SHASX __builtin_arm_shasx +#define __UASX __builtin_arm_uasx +#define __UQASX __builtin_arm_uqasx +#define __UHASX __builtin_arm_uhasx +#define __SSAX __builtin_arm_ssax +#define __QSAX __builtin_arm_qsax +#define __SHSAX __builtin_arm_shsax +#define __USAX __builtin_arm_usax +#define __UQSAX __builtin_arm_uqsax +#define __UHSAX __builtin_arm_uhsax +#define __USAD8 __builtin_arm_usad8 +#define __USADA8 __builtin_arm_usada8 +#define __SSAT16 __builtin_arm_ssat16 +#define __USAT16 __builtin_arm_usat16 +#define __UXTB16 __builtin_arm_uxtb16 +#define __UXTAB16 __builtin_arm_uxtab16 +#define __SXTB16 __builtin_arm_sxtb16 +#define __SXTAB16 __builtin_arm_sxtab16 +#define __SMUAD __builtin_arm_smuad +#define __SMUADX __builtin_arm_smuadx +#define __SMLAD __builtin_arm_smlad +#define __SMLADX __builtin_arm_smladx +#define __SMLALD __builtin_arm_smlald +#define __SMLALDX __builtin_arm_smlaldx +#define __SMUSD __builtin_arm_smusd +#define __SMUSDX __builtin_arm_smusdx +#define __SMLSD __builtin_arm_smlsd +#define __SMLSDX __builtin_arm_smlsdx +#define __SMLSLD __builtin_arm_smlsld +#define __SMLSLDX __builtin_arm_smlsldx +#define __SEL __builtin_arm_sel +#define __QADD __builtin_arm_qadd +#define __QSUB __builtin_arm_qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_compiler.h b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_compiler.h new file mode 100644 index 0000000000..adbf296f15 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_compiler.h @@ -0,0 +1,283 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.1.0 + * @date 09. October 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * Arm Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * Arm Compiler 6.6 LTM (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) + #include "cmsis_armclang_ltm.h" + + /* + * Arm Compiler above 6.10.1 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include + + +/* + * TI Arm Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed)) + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed)) + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __RESTRICT + #define __RESTRICT __restrict + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __packed__ + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION @packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + #ifndef __COMPILER_BARRIER + #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. + #define __COMPILER_BARRIER() (void)0 + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_gcc.h b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_gcc.h new file mode 100644 index 0000000000..3ddcc58b69 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_gcc.h @@ -0,0 +1,2168 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.2.0 + * @date 08. May 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +/* ######################### Startup and Lowlevel Init ######################## */ + +#ifndef __PROGRAM_START + +/** + \brief Initializes data and bss sections + \details This default implementations initialized all data and additional bss + sections relying on .copy.table and .zero.table specified properly + in the used linker script. + + */ +__STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void) +{ + extern void _start(void) __NO_RETURN; + + typedef struct { + uint32_t const* src; + uint32_t* dest; + uint32_t wlen; + } __copy_table_t; + + typedef struct { + uint32_t* dest; + uint32_t wlen; + } __zero_table_t; + + extern const __copy_table_t __copy_table_start__; + extern const __copy_table_t __copy_table_end__; + extern const __zero_table_t __zero_table_start__; + extern const __zero_table_t __zero_table_end__; + + for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) { + for(uint32_t i=0u; iwlen; ++i) { + pTable->dest[i] = pTable->src[i]; + } + } + + for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) { + for(uint32_t i=0u; iwlen; ++i) { + pTable->dest[i] = 0u; + } + } + + _start(); +} + +#define __PROGRAM_START __cmsis_start +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP __StackTop +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT __StackLimit +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __Vectors +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section(".vectors"))) +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); +#else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#endif +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_set_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); +#else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); +#endif +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() __ASM volatile ("nop") + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI() __ASM volatile ("wfi") + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE() __ASM volatile ("wfe") + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV() __ASM volatile ("sev") + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) +{ + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM GCC 7.3 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ + __extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_iccarm.h b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_iccarm.h new file mode 100644 index 0000000000..12d68fd9a6 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_iccarm.h @@ -0,0 +1,964 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.1.0 + * @date 08. May 2019 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2019 IAR Systems +// Copyright (c) 2017-2019 Arm Limited. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License") +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//------------------------------------------------------------------------------ + + +#ifndef __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ +/* Macros already defined */ +#else + #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' + #if __ARM_ARCH == 6 + #define __ARM_ARCH_6M__ 1 + #elif __ARM_ARCH == 7 + #if __ARM_FEATURE_DSP + #define __ARM_ARCH_7EM__ 1 + #else + #define __ARM_ARCH_7M__ 1 + #endif + #endif /* __ARM_ARCH */ + #endif /* __ARM_ARCH_PROFILE == 'M' */ +#endif + +/* Alternativ core deduction for older ICCARM's */ +#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ + !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) + #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) + #define __ARM_ARCH_6M__ 1 + #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) + #define __ARM_ARCH_7M__ 1 + #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) + #define __ARM_ARCH_7EM__ 1 + #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #else + #error "Unknown target." + #endif +#endif + + + +#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 + #define __IAR_M0_FAMILY 1 +#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 + #define __IAR_M0_FAMILY 1 +#else + #define __IAR_M0_FAMILY 0 +#endif + + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __COMPILER_BARRIER + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #if __ICCARM_V8 + #define __RESTRICT __restrict + #else + /* Needs IAR language extensions */ + #define __RESTRICT restrict + #endif +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef __UNALIGNED_UINT16_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint16_t __iar_uint16_read(void const *ptr) +{ + return *(__packed uint16_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) +{ + *(__packed uint16_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint32_t __iar_uint32_read(void const *ptr) +{ + return *(__packed uint32_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) +{ + *(__packed uint32_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma language=save +#pragma language=extended +__packed struct __iar_u32 { uint32_t v; }; +#pragma language=restore +#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + +#ifndef __PROGRAM_START +#define __PROGRAM_START __iar_program_start +#endif + +#ifndef __INITIAL_SP +#define __INITIAL_SP CSTACK$$Limit +#endif + +#ifndef __STACK_LIMIT +#define __STACK_LIMIT CSTACK$$Base +#endif + +#ifndef __VECTOR_TABLE +#define __VECTOR_TABLE __vector_table +#endif + +#ifndef __VECTOR_TABLE_ATTRIBUTE +#define __VECTOR_TABLE_ATTRIBUTE @".intvec" +#endif + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __enable_irq __iar_builtin_enable_interrupt + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + + #define __get_APSR() (__arm_rsr("APSR")) + #define __get_BASEPRI() (__arm_rsr("BASEPRI")) + #define __get_CONTROL() (__arm_rsr("CONTROL")) + #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) + + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) + #else + #define __get_FPSCR() ( 0 ) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #define __get_IPSR() (__arm_rsr("IPSR")) + #define __get_MSP() (__arm_rsr("MSP")) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __get_MSPLIM() (0U) + #else + #define __get_MSPLIM() (__arm_rsr("MSPLIM")) + #endif + #define __get_PRIMASK() (__arm_rsr("PRIMASK")) + #define __get_PSP() (__arm_rsr("PSP")) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __get_PSPLIM() (0U) + #else + #define __get_PSPLIM() (__arm_rsr("PSPLIM")) + #endif + + #define __get_xPSR() (__arm_rsr("xPSR")) + + #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) + #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) + #define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE))) + #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) + #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __set_MSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) + #endif + #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) + #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __set_PSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) + #endif + + #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) + #define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE))) + #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) + #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) + #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) + #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) + #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) + #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) + #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) + #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) + #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) + #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) + #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) + #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __TZ_get_PSPLIM_NS() (0U) + #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) + #else + #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) + #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) + #endif + + #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) + #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #if !__IAR_M0_FAMILY + #define __SSAT __iar_builtin_SSAT + #endif + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #if !__IAR_M0_FAMILY + #define __USAT __iar_builtin_USAT + #endif + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #if __ARM_MEDIA__ + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + #endif + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #define __CLZ __cmsis_iar_clz_not_active + #define __SSAT __cmsis_iar_ssat_not_active + #define __USAT __cmsis_iar_usat_not_active + #define __RBIT __cmsis_iar_rbit_not_active + #define __get_APSR __cmsis_iar_get_APSR_not_active + #endif + + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #define __set_FPSCR __cmsis_iar_set_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #undef __CLZ + #undef __SSAT + #undef __USAT + #undef __RBIT + #undef __get_APSR + + __STATIC_INLINE uint8_t __CLZ(uint32_t data) + { + if (data == 0U) { return 32U; } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; + } + + __STATIC_INLINE uint32_t __RBIT(uint32_t v) + { + uint8_t sc = 31U; + uint32_t r = v; + for (v >>= 1U; v; v >>= 1U) + { + r <<= 1U; + r |= v & 1U; + sc--; + } + return (r << sc); + } + + __STATIC_INLINE uint32_t __get_APSR(void) + { + uint32_t res; + __asm("MRS %0,APSR" : "=r" (res)); + return res; + } + + #endif + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #undef __get_FPSCR + #undef __set_FPSCR + #define __get_FPSCR() (0) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + #endif + + + /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + #if (__CORTEX_M >= 0x03) + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); + return(result); + } + + __IAR_FT void __set_BASEPRI_MAX(uint32_t value) + { + __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); + } + + + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + + + #endif /* (__CORTEX_M >= 0x03) */ + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + __IAR_FT uint32_t __get_MSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,MSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_MSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR MSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __get_PSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_PSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) + { + __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PSP_NS(uint32_t value) + { + __asm volatile("MSR PSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSP_NS(uint32_t value) + { + __asm volatile("MSR MSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_SP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,SP_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_SP_NS(uint32_t value) + { + __asm volatile("MSR SP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) + { + __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) + { + __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) + { + __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) + { + __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); + } + + #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + +#if __IAR_M0_FAMILY + __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) + { + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; + } + + __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) + { + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; + } +#endif + +#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + + __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) + { + uint32_t res; + __ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) + { + uint32_t res; + __ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) + { + uint32_t res; + __ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return res; + } + + __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) + { + __ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) + { + __ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) + { + __ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); + } + +#endif /* (__CORTEX_M >= 0x03) */ + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + + __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) + { + __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) + { + __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) + { + __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#undef __IAR_FT +#undef __IAR_M0_FAMILY +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_version.h b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_version.h new file mode 100644 index 0000000000..f2e2746626 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.3 + * @date 24. June 2019 + ******************************************************************************/ +/* + * Copyright (c) 2009-2019 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_VERSION_H +#define __CMSIS_VERSION_H + +/* CMSIS Version definitions */ +#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ +#define __CM_CMSIS_VERSION_SUB ( 3U) /*!< [15:0] CMSIS Core(M) sub version */ +#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ + __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/core_cm33.h b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/core_cm33.h new file mode 100644 index 0000000000..420444ca58 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/core_cm33.h @@ -0,0 +1,2930 @@ +/**************************************************************************//** + * @file core_cm33.h + * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File + * @version V5.1.0 + * @date 12. November 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM33_H_GENERIC +#define __CORE_CM33_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M33 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM33 definitions */ +#define __CM33_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM33_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM33_CMSIS_VERSION ((__CM33_CMSIS_VERSION_MAIN << 16U) | \ + __CM33_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (33U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined (__TARGET_FPU_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined (__ARM_FP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined (__ARMVFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined (__TI_VFP_SUPPORT__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined (__FPU_VFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM33_H_DEPENDANT +#define __CORE_CM33_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM33_REV + #define __CM33_REV 0x0000U + #warning "__CM33_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M33 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[32U]; + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/******************************************************************************/ +/* Star QSPI registers structures */ +/******************************************************************************/ +typedef struct +{ + __IO uint32_t CR; /*!< QSPI control register, Address offset: 0x00 */ + __IO uint32_t SR; /*!< QSPI status register, Address offset: 0x04 */ + __IO uint32_t RMCR; /*!< QSPI Direct Read Access Mode Control register, Address offset: 0x08 */ + __IO uint32_t OMCR; /*!< QSPI Operation Mode Control register, Address offset: 0x0C */ + __IO uint32_t RABR; /*!< QSPI Direct Read Mode Alternate Bytes register, Address offset: 0x10 */ + __IO uint32_t OABR; /*!< QSPI direct program/indirect mode alternate bytes register, Address offset: 0x14 */ + __IO uint32_t IMAR; /*!< QSPI Indirect mode Address register, Address offset: 0x18 */ + __IO uint32_t FDR; /*!< QSPI FIFO DATA register, Address offset: 0x1C */ + __IO uint32_t DLR; /*!< QSPI Data Length register, Address offset: 0x20 */ + __IO uint32_t WCNT; /*!< QSPI Wait counter for response direct read access , Address offset: 0x24 */ +} STARQSPI_Type; + + #define STARQSPI_BASE (0xE0044000UL) + #define STARQSPI ((STARQSPI_Type *)STARQSPI_BASE) + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000004UL) /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + __COMPILER_BARRIER(); + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __COMPILER_BARRIER(); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; + __DSB(); +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/mpu_armv8.h b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/mpu_armv8.h new file mode 100644 index 0000000000..0041d4dc6f --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/CMSIS/mpu_armv8.h @@ -0,0 +1,346 @@ +/****************************************************************************** + * @file mpu_armv8.h + * @brief CMSIS MPU API for Armv8-M and Armv8.1-M MPU + * @version V5.1.0 + * @date 08. March 2019 + ******************************************************************************/ +/* + * Copyright (c) 2017-2019 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV8_H +#define ARM_MPU_ARMV8_H + +/** \brief Attribute for device memory (outer only) */ +#define ARM_MPU_ATTR_DEVICE ( 0U ) + +/** \brief Attribute for non-cacheable, normal memory */ +#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U ) + +/** \brief Attribute for normal memory (outer and inner) +* \param NT Non-Transient: Set to 1 for non-transient data. +* \param WB Write-Back: Set to 1 to use write-back update policy. +* \param RA Read Allocation: Set to 1 to use cache allocation on read miss. +* \param WA Write Allocation: Set to 1 to use cache allocation on write miss. +*/ +#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ + (((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U)) + +/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) + +/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRE (1U) + +/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGRE (2U) + +/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_GRE (3U) + +/** \brief Memory Attribute +* \param O Outer memory attributes +* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes +*/ +#define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U))) + +/** \brief Normal memory non-shareable */ +#define ARM_MPU_SH_NON (0U) + +/** \brief Normal memory outer shareable */ +#define ARM_MPU_SH_OUTER (2U) + +/** \brief Normal memory inner shareable */ +#define ARM_MPU_SH_INNER (3U) + +/** \brief Memory access permissions +* \param RO Read-Only: Set to 1 for read-only memory. +* \param NP Non-Privileged: Set to 1 for non-privileged memory. +*/ +#define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U)) + +/** \brief Region Base Address Register value +* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. +* \param SH Defines the Shareability domain for this memory region. +* \param RO Read-Only: Set to 1 for a read-only memory region. +* \param NP Non-Privileged: Set to 1 for a non-privileged memory region. +* \oaram XN eXecute Never: Set to 1 for a non-executable memory region. +*/ +#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ + ((BASE & MPU_RBAR_BASE_Msk) | \ + ((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ + ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ + ((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) + +/** \brief Region Limit Address Register value +* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. +* \param IDX The attribute index to be associated with this memory region. +*/ +#define ARM_MPU_RLAR(LIMIT, IDX) \ + ((LIMIT & MPU_RLAR_LIMIT_Msk) | \ + ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ + (MPU_RLAR_EN_Msk)) + +#if defined(MPU_RLAR_PXN_Pos) + +/** \brief Region Limit Address Register with PXN value +* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. +* \param PXN Privileged execute never. Defines whether code can be executed from this privileged region. +* \param IDX The attribute index to be associated with this memory region. +*/ +#define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX) \ + ((LIMIT & MPU_RLAR_LIMIT_Msk) | \ + ((PXN << MPU_RLAR_PXN_Pos) & MPU_RLAR_PXN_Msk) | \ + ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ + (MPU_RLAR_EN_Msk)) + +#endif + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; /*!< Region Base Address Register value */ + uint32_t RLAR; /*!< Region Limit Address Register value */ +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif + __DSB(); + __ISB(); +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DMB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +#ifdef MPU_NS +/** Enable the Non-secure MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) +{ + MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif + __DSB(); + __ISB(); +} + +/** Disable the Non-secure MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable_NS(void) +{ + __DMB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} +#endif + +/** Set the memory attribute encoding to the given MPU. +* \param mpu Pointer to the MPU to be configured. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) +{ + const uint8_t reg = idx / 4U; + const uint32_t pos = ((idx % 4U) * 8U); + const uint32_t mask = 0xFFU << pos; + + if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { + return; // invalid index + } + + mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); +} + +/** Set the memory attribute encoding. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU, idx, attr); +} + +#ifdef MPU_NS +/** Set the memory attribute encoding to the Non-secure MPU. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); +} +#endif + +/** Clear and disable the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) +{ + mpu->RNR = rnr; + mpu->RLAR = 0U; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU, rnr); +} + +#ifdef MPU_NS +/** Clear and disable the given Non-secure MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU_NS, rnr); +} +#endif + +/** Configure the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + mpu->RNR = rnr; + mpu->RBAR = rbar; + mpu->RLAR = rlar; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); +} + +#ifdef MPU_NS +/** Configure the given Non-secure MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar); +} +#endif + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table to the given MPU. +* \param mpu Pointer to the MPU registers to be used. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + if (cnt == 1U) { + mpu->RNR = rnr; + ARM_MPU_OrderedMemcpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); + } else { + uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U); + uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; + + mpu->RNR = rnrBase; + while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { + uint32_t c = MPU_TYPE_RALIASES - rnrOffset; + ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); + table += c; + cnt -= c; + rnrOffset = 0U; + rnrBase += MPU_TYPE_RALIASES; + mpu->RNR = rnrBase; + } + + ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); + } +} + +/** Load the given number of MPU regions from a table. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU, rnr, table, cnt); +} + +#ifdef MPU_NS +/** Load the given number of MPU regions from a table to the Non-secure MPU. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); +} +#endif + +#endif + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/Device/Templates/ARM/startup_acm32h5xx.s b/bsp/acm32/acm32h5xx-nucleo/libraries/Device/Templates/ARM/startup_acm32h5xx.s new file mode 100644 index 0000000000..919c938372 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/Device/Templates/ARM/startup_acm32h5xx.s @@ -0,0 +1,598 @@ +;/***************************************************************************** +; * @file: startup_CM0.s +; * @purpose: CMSIS Cortex-M0 Core Device Startup File +; * for the ARM 'Microcontroller Prototyping System' +; * @version: V1.0 +; * @date: +; * +; *****************************************************************************/ +Stack_Size EQU 0x00004000 +Heap_Size EQU 0x00010000 +;__initial_sp EQU 0x20003000 ;Define SP size + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + +__Vectors + DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler,SWI + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WDT_IRQHandler ; 0 + DCD LVD_IRQHandler ; 1 + DCD RTC_IRQHandler ; 2 + DCD RSV3_IRQHandler ; 3 + DCD RSV4_IRQHandler ; 4 + DCD RSV5_IRQHandler ; 5 + DCD CLKRDY_IRQHandler ; 6 + DCD EXTI0_IRQHandler ; 7 + DCD EXTI1_IRQHandler ; 8 + DCD EXTI2_IRQHandler ; 9 + DCD EXTI3_IRQHandler ; 10 + DCD EXTI4_IRQHandler ; 11 + DCD RSV12_IRQHandler ; 12 + DCD RSV13_IRQHandler ; 13 + DCD ADC12_IRQHandler ; 14 + DCD ADC3_IRQHandler ; 15 + DCD DAC1_IRQHandler ; 16 + DCD COMP1_IRQHandler ; 17 + DCD USBOTG1_IRQHandler ; 18 + DCD FDCAN1_IRQHandler ; 19 + DCD FDCAN2_IRQHandler ; 20 + DCD EXTI9_5_IRQHandler ; 21 + DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; 22 + DCD TIM1_CC_IRQHandler ; 23 + DCD TIM2_IRQHandler ; 24 + DCD TIM3_IRQHandler ; 25 + DCD TIM6_IRQHandler ; 26 + DCD TIM7_IRQHandler ; 27 + DCD TIM8_BRK_UP_TRG_COM_IRQHandler ; 28 + DCD TIM8_CC_IRQHandler ; 29 + DCD TIM15_IRQHandler ; 30 + DCD TIM16_IRQHandler ; 31 + DCD TIM17_IRQHandler ; 32 + DCD I2C1_IRQHandler ; 33 + DCD I2C2_IRQHandler ; 34 + DCD SPI1_IRQHandler ; 35 + DCD SPI2_IRQHandler ; 36: + DCD SPI3_IRQHandler ; 37 + DCD I2S1_IRQHandler ; 38 + DCD I2S2_IRQHandler ; 39 + DCD USART1_IRQHandler ; 40 + DCD USART2_IRQHandler ; 41 + DCD USART3_IRQHandler ; 42 + DCD USART4_IRQHandler ; 43 + DCD EXTI15_10_IRQHandler ; 44 + DCD USBOTG1_WKUP_IRQHandler ; 45 + DCD LPUART1_IRQHandler ; 46 + DCD LPTIM1_IRQHandler ; 47 + DCD USBOTG2_WKUP_IRQHandler ; 48 + DCD AES_IRQHandler ; 49 + DCD FPU_IRQHandler ; 50 + DCD USBOTG2_IRQHandler ; 51 + DCD DCMI_IRQHandler ; 52 + DCD TIM4_IRQHandler ; 53 + DCD RSV54_IRQHandler ; 54 + DCD IWDT_WKUP_IRQHandler ; 55 + DCD LTDC_IRQHandler ; 56 + DCD LTDC_ERR_IRQHandler ; 57 + DCD DMA2D_IRQHandler ; 58 + DCD LPTIM2_IRQHandler ; 59 + DCD LPTIM3_IRQHandler ; 60 + DCD LPTIM4_IRQHandler ; 61 + DCD LPTIM5_IRQHandler ; 62 + DCD LPTIM6_IRQHandler ; 63 + DCD AES_SPI1_IRQHandler ; 64 + DCD I2S3_IRQHandler ; 65 + DCD SPI4_IRQHandler ; 66 + DCD SPI5_IRQHandler ; 67 + DCD SPI6_IRQHandler ; 68 + DCD I2C3_IRQHandler ; 69 + DCD I2C4_IRQHandler ; 70 + DCD FDCAN3_IRQHandler ; 71 + DCD RSV72_IRQHandler ; 72 + DCD ETH_IRQHandler ; 73 + DCD ETH_WKUP_IRQHandler ; 74 + DCD SDMMC_IRQHandler ; 75 + DCD USART5_IRQHandler ; 76 + DCD USART6_IRQHandler ; 77 + DCD USART7_IRQHandler ; 78 + DCD USART8_IRQHandler ; 79 + DCD USART9_IRQHandler ; 80 + DCD USART10_IRQHandler ; 81 + DCD DAC2_IRQHandler ; 82 + DCD TIM5_IRQHandler ; 83 + DCD TIM9_IRQHandler ; 84 + DCD TIM10_IRQHandler ; 85 + DCD TIM11_IRQHandler ; 86 + DCD TIM12_IRQHandler ; 87 + DCD TIM13_IRQHandler ; 88 + DCD TIM14_IRQHandler ; 89 + DCD TIM18_IRQHandler ; 90 + DCD TIM19_IRQHandler ; 91 + DCD TIM20_BRK_UP_TRG_COM_IRQHandler ; 92 + DCD TIM20_CC_IRQHandler ; 93 + DCD TIM21_IRQHandler ; 94 + DCD TIM22_IRQHandler ; 95 + DCD TIM23_IRQHandler ; 96 + DCD TIM24_IRQHandler ; 97 + DCD TIM25_IRQHandler ; 98 + DCD TIM26_IRQHandler ; 99 + DCD SPI7_IRQHandler ; 100 + DCD SPI8_IRQHandler ; 101 + DCD OSPI1_IRQHandler ; 102 + DCD OSPI2_IRQHandler ; 103 + DCD RSV104_IRQHandler ; 104 + DCD TKEY_IRQHandler ; 105 + DCD LPT_IRQHandler ; 106 + DCD RSV107_IRQHandler ; 107 + DCD OTG1_HS_EP_OUT_IRQHandler ; 108 + DCD OTG1_HS_EP_IN_IRQHandler ; 109 + DCD OTG2_HS_EP_OUT_IRQHandler ; 110 + DCD OTG2_HS_EP_IN_IRQHandler ; 111 + DCD NDL_IRQHandler ; 112 + DCD THM_IRQHandler ; 113 + DCD STM1_PWM_IRQHandler ; 114 + DCD STM2_PWM_IRQHandler ; 115 + DCD DCM1_PWM_IRQHandler ; 116 + DCD DCM2_PWM_IRQHandler ; 117 + DCD DCM3_PWM_IRQHandler ; 118 + DCD DCM4_PWM_IRQHandler ; 119 + DCD STM3_PWM_IRQHandler ; 120 + DCD STM4_PWM_IRQHandler ; 121 + DCD STM5_PWM_IRQHandler ; 122 + DCD STM6_PWM_IRQHandler ; 123 + DCD DCM5_PWM_IRQHandler ; 124 + DCD DCM6_PWM_IRQHandler ; 125 + DCD NAND_IRQHandler ; 126 + DCD BCH_IRQHandler ; 127 + DCD SDRAM_IRQHandler ; 128 + DCD DMA1_CH0_IRQHandler ; 129 + DCD DMA1_CH1_IRQHandler ; 130 + DCD DMA1_CH2_IRQHandler ; 131 + DCD DMA1_CH3_IRQHandler ; 132 + DCD DMA1_CH4_IRQHandler ; 133 + DCD DMA1_CH5_IRQHandler ; 134 + DCD DMA1_CH6_IRQHandler ; 135 + DCD DMA1_CH7_IRQHandler ; 136 + DCD DMA2_CH0_IRQHandler ; 137 + DCD DMA2_CH1_IRQHandler ; 138 + DCD DMA2_CH2_IRQHandler ; 139 + DCD DMA2_CH3_IRQHandler ; 140 + DCD DMA2_CH4_IRQHandler ; 141 + DCD DMA2_CH5_IRQHandler ; 142 + DCD DMA2_CH6_IRQHandler ; 143 + DCD DMA2_CH7_IRQHandler ; 144 + DCD SRAM1_SEC_IRQHandler ; 145 + DCD SRAM1_DED_IRQHandler ; 146 + DCD RSV147_IRQHandler ; 147 + DCD RSV148_IRQHandler ; 148 + DCD BKPSRAM_SEC_IRQHandler ; 149 + DCD BKPSRAM_CH7_IRQHandler ; 150 + + + AREA |.text|, CODE, READONLY + +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT main + IMPORT SystemInit + + + + LDR R0, =SystemInit + BLX R0 + + + LDR R0, =__main + BX R0 ; + ENDP + + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT WDT_IRQHandler [WEAK] + EXPORT LVD_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT RSV3_IRQHandler [WEAK] + EXPORT RSV4_IRQHandler [WEAK] + EXPORT RSV5_IRQHandler [WEAK] + EXPORT CLKRDY_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT RSV12_IRQHandler [WEAK] + EXPORT RSV13_IRQHandler [WEAK] + EXPORT ADC12_IRQHandler [WEAK] + EXPORT ADC3_IRQHandler [WEAK] + EXPORT DAC1_IRQHandler [WEAK] + EXPORT COMP1_IRQHandler [WEAK] + EXPORT USBOTG1_IRQHandler [WEAK] + EXPORT FDCAN1_IRQHandler [WEAK] + EXPORT FDCAN2_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT TIM3_IRQHandler [WEAK] + EXPORT TIM6_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + EXPORT TIM8_BRK_UP_TRG_COM_IRQHandler [WEAK] + EXPORT TIM8_CC_IRQHandler [WEAK] + EXPORT TIM15_IRQHandler [WEAK] + EXPORT TIM16_IRQHandler [WEAK] + EXPORT TIM17_IRQHandler [WEAK] + EXPORT I2C1_IRQHandler [WEAK] + EXPORT I2C2_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT I2S1_IRQHandler [WEAK] + EXPORT I2S2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT USART4_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT USBOTG1_WKUP_IRQHandler [WEAK] + EXPORT LPUART1_IRQHandler [WEAK] + EXPORT LPTIM1_IRQHandler [WEAK] + EXPORT USBOTG2_WKUP_IRQHandler [WEAK] + EXPORT AES_IRQHandler [WEAK] + EXPORT FPU_IRQHandler [WEAK] + EXPORT USBOTG2_IRQHandler [WEAK] + EXPORT DCMI_IRQHandler [WEAK] + EXPORT TIM4_IRQHandler [WEAK] + EXPORT RSV54_IRQHandler [WEAK] + EXPORT IWDT_WKUP_IRQHandler [WEAK] + EXPORT LTDC_IRQHandler [WEAK] + EXPORT LTDC_ERR_IRQHandler [WEAK] + EXPORT DMA2D_IRQHandler [WEAK] + EXPORT LPTIM2_IRQHandler [WEAK] + EXPORT LPTIM3_IRQHandler [WEAK] + EXPORT LPTIM4_IRQHandler [WEAK] + EXPORT LPTIM5_IRQHandler [WEAK] + EXPORT LPTIM6_IRQHandler [WEAK] + EXPORT AES_SPI1_IRQHandler [WEAK] + EXPORT I2S3_IRQHandler [WEAK] + EXPORT SPI4_IRQHandler [WEAK] + EXPORT SPI5_IRQHandler [WEAK] + EXPORT SPI6_IRQHandler [WEAK] + EXPORT I2C3_IRQHandler [WEAK] + EXPORT I2C4_IRQHandler [WEAK] + EXPORT FDCAN3_IRQHandler [WEAK] + EXPORT RSV72_IRQHandler [WEAK] + EXPORT ETH_IRQHandler [WEAK] + EXPORT ETH_WKUP_IRQHandler [WEAK] + EXPORT SDMMC_IRQHandler [WEAK] + EXPORT USART5_IRQHandler [WEAK] + EXPORT USART6_IRQHandler [WEAK] + EXPORT USART7_IRQHandler [WEAK] + EXPORT USART8_IRQHandler [WEAK] + EXPORT USART9_IRQHandler [WEAK] + EXPORT USART10_IRQHandler [WEAK] + EXPORT DAC2_IRQHandler [WEAK] + EXPORT TIM5_IRQHandler [WEAK] + EXPORT TIM9_IRQHandler [WEAK] + EXPORT TIM10_IRQHandler [WEAK] + EXPORT TIM11_IRQHandler [WEAK] + EXPORT TIM12_IRQHandler [WEAK] + EXPORT TIM13_IRQHandler [WEAK] + EXPORT TIM14_IRQHandler [WEAK] + EXPORT TIM18_IRQHandler [WEAK] + EXPORT TIM19_IRQHandler [WEAK] + EXPORT TIM20_BRK_UP_TRG_COM_IRQHandler [WEAK] + EXPORT TIM20_CC_IRQHandler [WEAK] + EXPORT TIM21_IRQHandler [WEAK] + EXPORT TIM22_IRQHandler [WEAK] + EXPORT TIM23_IRQHandler [WEAK] + EXPORT TIM24_IRQHandler [WEAK] + EXPORT TIM25_IRQHandler [WEAK] + EXPORT TIM26_IRQHandler [WEAK] + EXPORT SPI7_IRQHandler [WEAK] + EXPORT SPI8_IRQHandler [WEAK] + EXPORT OSPI1_IRQHandler [WEAK] + EXPORT OSPI2_IRQHandler [WEAK] + EXPORT RSV104_IRQHandler [WEAK] + EXPORT TKEY_IRQHandler [WEAK] + EXPORT LPT_IRQHandler [WEAK] + EXPORT RSV107_IRQHandler [WEAK] + EXPORT OTG1_HS_EP_OUT_IRQHandler [WEAK] + EXPORT OTG1_HS_EP_IN_IRQHandler [WEAK] + EXPORT OTG2_HS_EP_OUT_IRQHandler [WEAK] + EXPORT OTG2_HS_EP_IN_IRQHandler [WEAK] + EXPORT NDL_IRQHandler [WEAK] + EXPORT THM_IRQHandler [WEAK] + EXPORT STM1_PWM_IRQHandler [WEAK] + EXPORT STM2_PWM_IRQHandler [WEAK] + EXPORT DCM1_PWM_IRQHandler [WEAK] + EXPORT DCM2_PWM_IRQHandler [WEAK] + EXPORT DCM3_PWM_IRQHandler [WEAK] + EXPORT DCM4_PWM_IRQHandler [WEAK] + EXPORT STM3_PWM_IRQHandler [WEAK] + EXPORT STM4_PWM_IRQHandler [WEAK] + EXPORT STM5_PWM_IRQHandler [WEAK] + EXPORT STM6_PWM_IRQHandler [WEAK] + EXPORT DCM5_PWM_IRQHandler [WEAK] + EXPORT DCM6_PWM_IRQHandler [WEAK] + EXPORT NAND_IRQHandler [WEAK] + EXPORT BCH_IRQHandler [WEAK] + EXPORT SDRAM_IRQHandler [WEAK] + EXPORT DMA1_CH0_IRQHandler [WEAK] + EXPORT DMA1_CH1_IRQHandler [WEAK] + EXPORT DMA1_CH2_IRQHandler [WEAK] + EXPORT DMA1_CH3_IRQHandler [WEAK] + EXPORT DMA1_CH4_IRQHandler [WEAK] + EXPORT DMA1_CH5_IRQHandler [WEAK] + EXPORT DMA1_CH6_IRQHandler [WEAK] + EXPORT DMA1_CH7_IRQHandler [WEAK] + EXPORT DMA2_CH0_IRQHandler [WEAK] + EXPORT DMA2_CH1_IRQHandler [WEAK] + EXPORT DMA2_CH2_IRQHandler [WEAK] + EXPORT DMA2_CH3_IRQHandler [WEAK] + EXPORT DMA2_CH4_IRQHandler [WEAK] + EXPORT DMA2_CH5_IRQHandler [WEAK] + EXPORT DMA2_CH6_IRQHandler [WEAK] + EXPORT DMA2_CH7_IRQHandler [WEAK] + EXPORT SRAM1_SEC_IRQHandler [WEAK] + EXPORT SRAM1_DED_IRQHandler [WEAK] + EXPORT RSV147_IRQHandler [WEAK] + EXPORT RSV148_IRQHandler [WEAK] + EXPORT BKPSRAM_SEC_IRQHandler [WEAK] + EXPORT BKPSRAM_CH7_IRQHandler [WEAK] + +WDT_IRQHandler +LVD_IRQHandler +RTC_IRQHandler +RSV3_IRQHandler +RSV4_IRQHandler +RSV5_IRQHandler +CLKRDY_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +RSV12_IRQHandler +RSV13_IRQHandler +ADC12_IRQHandler +ADC3_IRQHandler +DAC1_IRQHandler +COMP1_IRQHandler +USBOTG1_IRQHandler +FDCAN1_IRQHandler +FDCAN2_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_UP_TRG_COM_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +TIM3_IRQHandler +TIM6_IRQHandler +TIM7_IRQHandler +TIM8_BRK_UP_TRG_COM_IRQHandler +TIM8_CC_IRQHandler +TIM15_IRQHandler +TIM16_IRQHandler +TIM17_IRQHandler +I2C1_IRQHandler +I2C2_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +SPI3_IRQHandler +I2S1_IRQHandler +I2S2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +USART4_IRQHandler +EXTI15_10_IRQHandler +USBOTG1_WKUP_IRQHandler +LPUART1_IRQHandler +LPTIM1_IRQHandler +USBOTG2_WKUP_IRQHandler +AES_IRQHandler +FPU_IRQHandler +USBOTG2_IRQHandler +DCMI_IRQHandler +TIM4_IRQHandler +RSV54_IRQHandler +IWDT_WKUP_IRQHandler +LTDC_IRQHandler +LTDC_ERR_IRQHandler +DMA2D_IRQHandler +LPTIM2_IRQHandler +LPTIM3_IRQHandler +LPTIM4_IRQHandler +LPTIM5_IRQHandler +LPTIM6_IRQHandler +AES_SPI1_IRQHandler +I2S3_IRQHandler +SPI4_IRQHandler +SPI5_IRQHandler +SPI6_IRQHandler +I2C3_IRQHandler +I2C4_IRQHandler +FDCAN3_IRQHandler +RSV72_IRQHandler +ETH_IRQHandler +ETH_WKUP_IRQHandler +SDMMC_IRQHandler +USART5_IRQHandler +USART6_IRQHandler +USART7_IRQHandler +USART8_IRQHandler +USART9_IRQHandler +USART10_IRQHandler +DAC2_IRQHandler +TIM5_IRQHandler +TIM9_IRQHandler +TIM10_IRQHandler +TIM11_IRQHandler +TIM12_IRQHandler +TIM13_IRQHandler +TIM14_IRQHandler +TIM18_IRQHandler +TIM19_IRQHandler +TIM20_BRK_UP_TRG_COM_IRQHandler +TIM20_CC_IRQHandler +TIM21_IRQHandler +TIM22_IRQHandler +TIM23_IRQHandler +TIM24_IRQHandler +TIM25_IRQHandler +TIM26_IRQHandler +SPI7_IRQHandler +SPI8_IRQHandler +OSPI1_IRQHandler +OSPI2_IRQHandler +RSV104_IRQHandler +TKEY_IRQHandler +LPT_IRQHandler +RSV107_IRQHandler +OTG1_HS_EP_OUT_IRQHandler +OTG1_HS_EP_IN_IRQHandler +OTG2_HS_EP_OUT_IRQHandler +OTG2_HS_EP_IN_IRQHandler +NDL_IRQHandler +THM_IRQHandler +STM1_PWM_IRQHandler +STM2_PWM_IRQHandler +DCM1_PWM_IRQHandler +DCM2_PWM_IRQHandler +DCM3_PWM_IRQHandler +DCM4_PWM_IRQHandler +STM3_PWM_IRQHandler +STM4_PWM_IRQHandler +STM5_PWM_IRQHandler +STM6_PWM_IRQHandler +DCM5_PWM_IRQHandler +DCM6_PWM_IRQHandler +NAND_IRQHandler +BCH_IRQHandler +SDRAM_IRQHandler +DMA1_CH0_IRQHandler +DMA1_CH1_IRQHandler +DMA1_CH2_IRQHandler +DMA1_CH3_IRQHandler +DMA1_CH4_IRQHandler +DMA1_CH5_IRQHandler +DMA1_CH6_IRQHandler +DMA1_CH7_IRQHandler +DMA2_CH0_IRQHandler +DMA2_CH1_IRQHandler +DMA2_CH2_IRQHandler +DMA2_CH3_IRQHandler +DMA2_CH4_IRQHandler +DMA2_CH5_IRQHandler +DMA2_CH6_IRQHandler +DMA2_CH7_IRQHandler +SRAM1_SEC_IRQHandler +SRAM1_DED_IRQHandler +RSV147_IRQHandler +RSV148_IRQHandler +BKPSRAM_SEC_IRQHandler +BKPSRAM_CH7_IRQHandler + + + B . + ENDP + + ALIGN + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/Device/acm32h5xx.h b/bsp/acm32/acm32h5xx-nucleo/libraries/Device/acm32h5xx.h new file mode 100644 index 0000000000..93c4d8faab --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/Device/acm32h5xx.h @@ -0,0 +1,16092 @@ + +/****************************************************************************** +*@file : acm32h5xx.h +*@brief : Device Peripheral Access Layer Header File +* This file contains: +* - Data structures and the address mapping for all peripherals +* - peripherals registers declarations and bits definition +* - Macros to access peripherals registers hardware +******************************************************************************/ + +#ifndef __ACM32H5XX_H__ +#define __ACM32H5XX_H__ + + +/* ------- Interrupt Number Definition ---------------------------------- */ + +typedef enum IRQn +{ +/* ---------------------------------- Cortex-M33 Processor Exceptions Numbers ----------------------------------- */ + Reset_IRQn = -15, /* -15 Reset Vector, invoked on Power up and warm reset */ + NonMaskableInt_IRQn = -14, /* -14 Non Maskable Interrupt */ + HardFault_IRQn = -13, /* -13 HardFault Interrupt */ + MemoryManagement_IRQn = -12, /* -12 Memory Management, MPU mismatch, including Access Violation + and No Match */ + BusFault_IRQn = -11, /* -11 Bus Fault, Pre-Fetch-, Memory Access Fault, other address/memory + related Fault */ + UsageFault_IRQn = -10, /* -10 Usage Fault, i.e. Undef Instruction, Illegal State Transition */ + + SVCall_IRQn = -5, /* -5 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /* -4 Debug Monitor */ + PendSV_IRQn = -2, /* -2 Pend SV Interrupt */ + SysTick_IRQn = -1, /* -1 System Tick Interrupt */ + + /* ---------------------- Chip Specific Interrupt Numbers --------------------- */ + WDT_IRQn = 0, + LVD_IRQn = 1, + RTC_XTLSD_IRQn = 2, + RSV3_IRQn = 3, + RSV4_IRQn = 4, + RSV5_IRQn = 5, + CLKRDY_IRQn = 6, + EXTI0_IRQn = 7, + EXTI1_IRQn = 8, + EXTI2_IRQn = 9, + EXTI3_IRQn = 10, + EXTI4_IRQn = 11, + RSV12_IRQn = 12, + RSV13_IRQn = 13, + ADC12_IRQn = 14, + ADC3_IRQn = 15, + DAC1_IRQn = 16, + COMP1_IRQn = 17, + USBOTG1_IRQn = 18, + FDCAN1_IRQn = 19, + FDCAN2_IRQn = 20, + EXTI9_5_IRQn = 21, + TIM1_BRK_UP_TRG_COM_IRQn = 22, + TIM1_CC_IRQn = 23, + TIM2_IRQn = 24, + TIM3_IRQn = 25, + TIM6_IRQn = 26, + TIM7_IRQn = 27, + TIM8_BRK_UP_TRG_COM_IRQn = 28, + TIM8_CC_IRQn = 29, + TIM15_IRQn = 30, + TIM16_IRQn = 31, + TIM17_IRQn = 32, + I2C1_IRQn = 33, + I2C2_IRQn = 34, + SPI1_IRQn = 35, + SPI2_IRQn = 36, + SPI3_IRQn = 37, + I2S1_IRQn = 38, + I2S2_IRQn = 39, + USART1_IRQn = 40, + USART2_IRQn = 41, + USART3_IRQn = 42, + USART4_IRQn = 43, + EXTI15_10_IRQn = 44, + USBOTG1_WKUP_IRQn = 45, + LPUART1_IRQn = 46, + LPTIM1_IRQn = 47, + USBOTG2_WKUP_IRQn = 48, + AES_IRQn = 49, + FPU_IRQn = 50, + USBOTG2_IRQn = 51, + DCMI_IRQn = 52, + TIM4_IRQn = 53, + RSV54_IRQn = 54, + IWDT_WKUP_IRQn = 55, + LTDC_IRQn = 56, + LTDC_ERR_IRQn = 57, + DMA2D_IRQn = 58, + LPTIM2_IRQn = 59, + LPTIM3_IRQn = 60, + LPTIM4_IRQn = 61, + LPTIM5_IRQn = 62, + LPTIM6_IRQn = 63, + AES_SPI1_IRQn = 64, + I2S3_IRQn = 65, + SPI4_IRQn = 66, + SPI5_IRQn = 67, + SPI6_IRQn = 68, + I2C3_IRQn = 69, + I2C4_IRQn = 70, + FDCAN3_IRQn = 71, + RSV72_IRQn = 72, + ETH_IRQn = 73, + ETH_WKUP_IRQn = 74, + SDMMC_IRQn = 75, + USART5_IRQn = 76, + USART6_IRQn = 77, + USART7_IRQn = 78, + USART8_IRQn = 79, + USART9_IRQn = 80, + USART10_IRQn = 81, + DAC2_IRQn = 82, + TIM5_IRQn = 83, + TIM9_IRQn = 84, + TIM10_IRQn = 85, + TIM11_IRQn = 86, + TIM12_IRQn = 87, + TIM13_IRQn = 88, + TIM14_IRQn = 89, + TIM18_IRQn = 90, + TIM19_IRQn = 91, + TIM20_BRK_UP_TRG_COM_IRQn = 92, + TIM20_CC_IRQn = 93, + TIM21_IRQn = 94, + TIM22_IRQn = 95, + TIM23_IRQn = 96, + TIM24_IRQn = 97, + TIM25_IRQn = 98, + TIM26_IRQn = 99, + SPI7_IRQn = 100, + SPI8_IRQn = 101, + OSPI1_IRQn = 102, + OSPI2_IRQn = 103, + RSV104_IRQn = 104, + TKEY_IRQn = 105, + LPT_IRQn = 106, + RSV107_IRQn = 107, + OTG1_HS_EP_OUT_IRQn = 108, + OTG1_HS_EP_IN_IRQn = 109, + OTG2_HS_EP_OUT_IRQn = 110, + OTG2_HS_EP_IN_IRQn = 111, + NDL_IRQn = 112, + THM_IRQn = 113, + STM1_PWM_IRQn = 114, + STM2_PWM_IRQn = 115, + DCM1_PWM_IRQn = 116, + DCM2_PWM_IRQn = 117, + DCM3_PWM_IRQn = 118, + DCM4_PWM_IRQn = 119, + STM3_PWM_IRQn = 120, + STM4_PWM_IRQn = 121, + STM5_PWM_IRQn = 122, + STM6_PWM_IRQn = 123, + DCM5_PWM_IRQn = 124, + DCM6_PWM_IRQn = 125, + NAND_IRQn = 126, + BCH_IRQn = 127, + SDRAM_IRQn = 128, + DMA1_CH0_IRQn = 129, + DMA1_CH1_IRQn = 130, + DMA1_CH2_IRQn = 131, + DMA1_CH3_IRQn = 132, + DMA1_CH4_IRQn = 133, + DMA1_CH5_IRQn = 134, + DMA1_CH6_IRQn = 135, + DMA1_CH7_IRQn = 136, + DMA2_CH0_IRQn = 137, + DMA2_CH1_IRQn = 138, + DMA2_CH2_IRQn = 139, + DMA2_CH3_IRQn = 140, + DMA2_CH4_IRQn = 141, + DMA2_CH5_IRQn = 142, + DMA2_CH6_IRQn = 143, + DMA2_CH7_IRQn = 144, + SRAM1_SEC_IRQn = 145, + SRAM1_DED_IRQn = 146, + SRAM3_SEC_IRQn = 147, + SRAM3_DED_IRQn = 148, + BKPSRAM_SEC_IRQn = 149, + BKPSRAM_DED_IRQn = 150, +} IRQn_Type; + +/* ================================================================================ */ +/* ================ Processor and Core Peripheral Section ================ */ +/* ================================================================================ */ + +/* ------- Start of section using anonymous unions and disabling warnings ------- */ +#if defined (__CC_ARM) +#pragma push +#pragma anon_unions +#elif defined (__ICCARM__) +#pragma language=extended +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wc11-extensions" +#pragma clang diagnostic ignored "-Wreserved-id-macro" +#elif defined (__GNUC__) +/* anonymous unions are enabled by default */ +#elif defined (__TMS470__) +/* anonymous unions are enabled by default */ +#elif defined (__TASKING__) +#pragma warning 586 +#elif defined (__CSMC__) +/* anonymous unions are enabled by default */ +#else +#warning Not supported compiler type +#endif + + + +/* Configuration of the Cortex-M4 Processor and Core Peripherals */ +#define __MPU_PRESENT 1 /*!< cm4ikmcu does not provide a MPU present or not */ +#define __NVIC_PRIO_BITS 4 /*!< cm4ikmcu Supports 2 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ + +#define ARM_MATH_CM4 1 +#define __TARGET_FPU_VFP 1 +#define __FPU_PRESENT 1 +#define __DSP_PRESENT 1 +#define __ARM_COMPAT_H 1 + +#include "core_cm33.h" /* Processor and core peripherals */ +#include "system_acm32h5xx.h" +#include "stdio.h" +#include "stdint.h" +#include "stdbool.h" +#include "string.h" + +typedef __IO uint32_t vu32; +typedef __IO uint16_t vu16; +typedef __IO uint8_t vu8; + +/* -------- End of section using anonymous unions and disabling warnings -------- */ +#if defined (__CC_ARM) +#pragma pop +#elif defined (__ICCARM__) +/* leave anonymous unions enabled */ +#elif (__ARMCC_VERSION >= 6010050) +#pragma clang diagnostic pop +#elif defined (__GNUC__) +/* anonymous unions are enabled by default */ +#elif defined (__TMS470__) +/* anonymous unions are enabled by default */ +#elif defined (__TASKING__) +#pragma warning restore +#elif defined (__CSMC__) +/* anonymous unions are enabled by default */ +#else +#warning Not supported compiler type +#endif + +/*-------------------Bit Opertions------------------------*/ +#define BIT0 ( 1U << 0 ) +#define BIT1 ( 1U << 1 ) +#define BIT2 ( 1U << 2 ) +#define BIT3 ( 1U << 3 ) +#define BIT4 ( 1U << 4 ) +#define BIT5 ( 1U << 5 ) +#define BIT6 ( 1U << 6 ) +#define BIT7 ( 1U << 7 ) +#define BIT8 ( 1U << 8 ) +#define BIT9 ( 1U << 9 ) +#define BIT10 ( 1U << 10 ) +#define BIT11 ( 1U << 11 ) +#define BIT12 ( 1U << 12 ) +#define BIT13 ( 1U << 13 ) +#define BIT14 ( 1U << 14 ) +#define BIT15 ( 1U << 15 ) +#define BIT16 ( 1U << 16 ) +#define BIT17 ( 1U << 17 ) +#define BIT18 ( 1U << 18 ) +#define BIT19 ( 1U << 19 ) +#define BIT20 ( 1U << 20 ) +#define BIT21 ( 1U << 21 ) +#define BIT22 ( 1U << 22 ) +#define BIT23 ( 1U << 23 ) +#define BIT24 ( 1U << 24 ) +#define BIT25 ( 1U << 25 ) +#define BIT26 ( 1U << 26 ) +#define BIT27 ( 1U << 27 ) +#define BIT28 ( 1U << 28 ) +#define BIT29 ( 1U << 29 ) +#define BIT30 ( 1U << 30 ) +#define BIT31 ( 1U << 31 ) + + +/*-------------------------- ITCM memory map -------------------------*/ + +#define ITCM_CR (*(volatile uint32_t *)(0xE001E010) ) +#define ITCM_CR_SZ_Pos ( 3U ) +#define ITCM_CR_SZ_Msk ( 0x0FUL << ITCM_CR_SZ_Pos ) +#define ITCM_CR_SZ ( ITCM_CR_SZ_Msk ) +#define ITCM_CR_EN_Pos ( 0U ) +#define ITCM_CR_EN_Msk ( 0x1UL << ITCM_CR_EN_Pos ) +#define ITCM_CR_EN ( ITCM_CR_EN_Msk ) + +/*-------------------------- DTCM memory map -------------------------*/ + +#define DTCM_CR (*(volatile uint32_t *)(0xE001E014) ) +#define DTCM_CR_SZ_Pos ( 3U ) +#define DTCM_CR_SZ_Msk ( 0x0FUL << DTCM_CR_SZ_Pos ) +#define DTCM_CR_SZ ( DTCM_CR_SZ_Msk ) +#define DTCM_CR_EN_Pos ( 0U ) +#define DTCM_CR_EN_Msk ( 0x1UL << DTCM_CR_EN_Pos ) +#define DTCM_CR_EN ( DTCM_CR_EN_Msk ) + +/*-------------------------- Peripheral memory map -------------------------*/ + +#define SPI7_MEM_BASE_ADDR ( 0x08000000UL ) +#define SPI8_MEM_BASE_ADDR ( 0x10000000UL ) +#define IROM_BASE_ADDR ( 0x1FF00000UL ) + +#define SRAM_BASE_ADDR ( 0x20000000UL ) +#define DTCM_BASE_ADDR ( SRAM_BASE_ADDR + 0x00000000UL ) +#define SRAM1_BASE_ADDR ( SRAM_BASE_ADDR + 0x00008000UL ) +#define SRAM2_BASE_ADDR ( SRAM_BASE_ADDR + 0x00038000UL ) +#define SRAM3_BASE_ADDR ( SRAM_BASE_ADDR + 0x00058000UL ) + +#define PERIPH_BASE_ADDR ( 0x40000000UL) + +#define APB1PERIPH_BASE_ADDR ( PERIPH_BASE_ADDR + 0x00000000UL ) +#define APB2PERIPH_BASE_ADDR ( PERIPH_BASE_ADDR + 0x00010000UL ) +#define APB3PERIPH_BASE_ADDR ( PERIPH_BASE_ADDR + 0x11000000UL ) +#define APB4PERIPH_BASE_ADDR ( PERIPH_BASE_ADDR + 0x13000000UL ) +#define AHB1PERIPH_BASE_ADDR ( PERIPH_BASE_ADDR + 0x00020000UL ) +#define AHB2PERIPH_BASE_ADDR ( PERIPH_BASE_ADDR + 0x08000000UL ) +#define AHB3PERIPH_BASE_ADDR ( PERIPH_BASE_ADDR + 0x12000000UL ) + +/*---------------------------- APB1 peripherals ----------------------------*/ + +#define TIM2_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00000000UL ) +#define TIM3_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00000400UL ) +#define TIM4_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00000800UL ) +#define TIM5_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00000C00UL ) +#define TIM6_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00001000UL ) +#define TIM7_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00001400UL ) +#define TIM12_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00001800UL ) +#define TIM13_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00001C00UL ) +#define TIM14_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00002000UL ) +#define RTC_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00002800UL ) +#define WDT_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00002C00UL ) +#define IWDT_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00003000UL ) +#define I2S1_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00003400UL ) +#define I2S2_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00003800UL ) +#define I2S3_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00003C00UL ) +#define USART2_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00004400UL ) +#define USART3_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00004800UL ) +#define USART4_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00004C00UL ) +#define USART5_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00005000UL ) +#define I2C1_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00005400UL ) +#define I2C2_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00005800UL ) +#define I2C3_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00005C00UL ) +#define I2C4_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00006000UL ) +#define PMU_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00007000UL ) +#define LPTIM1_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00007C00UL ) +#define LPUART1_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00008000UL ) +#define LPTIM2_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00009400UL ) +#define USART7_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00009800UL ) +#define USART8_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x00009C00UL ) +#define TIM25_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x0000A000UL ) +#define TIM26_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x0000A400UL ) +#define EFUSE1_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x0000E000UL ) +#define EFUSE2_BASE_ADDR ( APB1PERIPH_BASE_ADDR + 0x0000E800UL ) + +/*---------------------------- APB2 peripherals ----------------------------*/ + +#define SYSCFG_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00000000UL ) +#define COMP1_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00000200UL ) +#define EXTI_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00000400UL ) +#define TIM1_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00002C00UL ) +#define TIM8_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00003400UL ) +#define USART1_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00003800UL ) +#define USART6_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00003C00UL ) +#define TIM15_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00004000UL ) +#define TIM16_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00004400UL ) +#define TIM17_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00004800UL ) +#define TIM20_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00005000UL ) +#define TKEY_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00006400UL ) +#define LTDC_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00006800UL ) +#define TIM9_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00008000UL ) +#define TIM10_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00008400UL ) +#define TIM11_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00008800UL ) +#define TIM18_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00009000UL ) +#define TIM19_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00009400UL ) +#define TIM21_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x00009C00UL ) +#define TIM22_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x0000A000UL ) +#define TIM23_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x0000A400UL ) +#define TIM24_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x0000A800UL ) +#define USART9_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x0000B000UL ) +#define USART10_BASE_ADDR ( APB2PERIPH_BASE_ADDR + 0x0000B400UL ) + +/*---------------------------- APB3 peripherals ----------------------------*/ + +#define LPTIM3_BASE_ADDR ( APB3PERIPH_BASE_ADDR + 0x00000000UL ) +#define LPTIM4_BASE_ADDR ( APB3PERIPH_BASE_ADDR + 0x00000400UL ) +#define LPTIM5_BASE_ADDR ( APB3PERIPH_BASE_ADDR + 0x00000800UL ) +#define LPTIM6_BASE_ADDR ( APB3PERIPH_BASE_ADDR + 0x00000C00UL ) + +/*---------------------------- APB4 peripherals ----------------------------*/ + +#define STM1_PWM_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00000000UL ) +#define STM2_PWM_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00000400UL ) +#define DCM1_PWM_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00000800UL ) +#define DCM2_PWM_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00000C00UL ) +#define DCM3_PWM_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00001000UL ) +#define DCM4_PWM_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00001400UL ) +#define NDL_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00001800UL ) +#define MDAC_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00001C00UL ) +#define STM3_PWM_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00002000UL ) +#define STM4_PWM_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00002400UL ) +#define STM5_PWM_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00002800UL ) +#define STM6_PWM_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00002C00UL ) +#define DCM5_PWM_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00003000UL ) +#define DCM6_PWM_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00003400UL ) +#define LPT_BASE_ADDR ( APB4PERIPH_BASE_ADDR + 0x00003800UL ) + +#define DCMPWM1_AREA1_ADDR (DCM1_PWM_BASE_ADDR+0x00) +#define DCMPWM2_AREA1_ADDR (DCM2_PWM_BASE_ADDR+0x00) +#define DCMPWM3_AREA1_ADDR (DCM3_PWM_BASE_ADDR+0x00) +#define DCMPWM4_AREA1_ADDR (DCM4_PWM_BASE_ADDR+0x00) +#define DCMPWM5_AREA1_ADDR (DCM5_PWM_BASE_ADDR+0x00) +#define DCMPWM6_AREA1_ADDR (DCM6_PWM_BASE_ADDR+0x00) + +#define DCMPWM1_AREA2_ADDR (DCM1_PWM_BASE_ADDR+0x0C) +#define DCMPWM2_AREA2_ADDR (DCM2_PWM_BASE_ADDR+0x0C) +#define DCMPWM3_AREA2_ADDR (DCM3_PWM_BASE_ADDR+0x0C) +#define DCMPWM4_AREA2_ADDR (DCM4_PWM_BASE_ADDR+0x0C) +// DCM5,DCM6Ϊ棬AREA2Ĵ + +#define DCMPWM1_AREA3_ADDR (DCM1_PWM_BASE_ADDR+0x38) +#define DCMPWM2_AREA3_ADDR (DCM2_PWM_BASE_ADDR+0x38) +#define DCMPWM3_AREA3_ADDR (DCM3_PWM_BASE_ADDR+0x38) +#define DCMPWM4_AREA3_ADDR (DCM4_PWM_BASE_ADDR+0x38) +#define DCMPWM5_AREA3_ADDR (DCM5_PWM_BASE_ADDR+0x0C) +#define DCMPWM6_AREA3_ADDR (DCM6_PWM_BASE_ADDR+0x0C) + +/*---------------------------- AHB1 peripherals ----------------------------*/ + +#define DMA1_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00000000UL ) +#define DMA1_CHANNEL0_BASE_ADDR ( DMA1_BASE_ADDR + 0x00000100UL ) +#define DMA1_CHANNEL1_BASE_ADDR ( DMA1_BASE_ADDR + 0x00000120UL ) +#define DMA1_CHANNEL2_BASE_ADDR ( DMA1_BASE_ADDR + 0x00000140UL ) +#define DMA1_CHANNEL3_BASE_ADDR ( DMA1_BASE_ADDR + 0x00000160UL ) +#define DMA1_CHANNEL4_BASE_ADDR ( DMA1_BASE_ADDR + 0x00000180UL ) +#define DMA1_CHANNEL5_BASE_ADDR ( DMA1_BASE_ADDR + 0x000001A0UL ) +#define DMA1_CHANNEL6_BASE_ADDR ( DMA1_BASE_ADDR + 0x000001C0UL ) +#define DMA1_CHANNEL7_BASE_ADDR ( DMA1_BASE_ADDR + 0x000001E0UL ) +#define DMA2_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00000400UL ) +#define DMA2_CHANNEL0_BASE_ADDR ( DMA2_BASE_ADDR + 0x00000100UL ) +#define DMA2_CHANNEL1_BASE_ADDR ( DMA2_BASE_ADDR + 0x00000120UL ) +#define DMA2_CHANNEL2_BASE_ADDR ( DMA2_BASE_ADDR + 0x00000140UL ) +#define DMA2_CHANNEL3_BASE_ADDR ( DMA2_BASE_ADDR + 0x00000160UL ) +#define DMA2_CHANNEL4_BASE_ADDR ( DMA2_BASE_ADDR + 0x00000180UL ) +#define DMA2_CHANNEL5_BASE_ADDR ( DMA2_BASE_ADDR + 0x000001A0UL ) +#define DMA2_CHANNEL6_BASE_ADDR ( DMA2_BASE_ADDR + 0x000001C0UL ) +#define DMA2_CHANNEL7_BASE_ADDR ( DMA2_BASE_ADDR + 0x000001E0UL ) +#define RCC_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00001000UL ) +#define FDCAN1_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00002000UL ) +#define FDCAN2_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00002400UL ) +#define CRC_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00003000UL ) +#define ETHMAC_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00008000UL ) +#define DMA2D_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x0000B000UL ) +#define SPI1_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00010000UL ) +#define SPI2_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00010400UL ) +#define SPI3_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00010800UL ) +#define SPI4_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00010C00UL ) +#define SPI5_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00011000UL ) +#define SPI6_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00011400UL ) +#define BKPSRAM_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00016400UL ) +#define USBOTG_HS1_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00020000UL ) +#define USBOTG_HS2_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x00060000UL ) +#define USBOTG1_PHYC_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x000A0000UL ) +#define USBOTG2_PHYC_BASE_ADDR ( AHB1PERIPH_BASE_ADDR + 0x000A0400UL ) + +/*---------------------------- AHB2 peripherals ----------------------------*/ + +#define GPIOA_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00000000UL ) +#define GPIOB_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00000400UL ) +#define GPIOC_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00000800UL ) +#define GPIOD_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00000C00UL ) +#define GPIOE_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00001000UL ) +#define GPIOF_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00001400UL ) +#define GPIOG_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00001800UL ) +#define GPIOH_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00001C00UL ) +#define GPIOI_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00002000UL ) +#define GPIOJ_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00002400UL ) +#define GPIOK_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00002800UL ) +#define GPIOL_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00002C00UL ) +#define GPIOM_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00003000UL ) +#define GPION_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00003400UL ) +#define GPIOO_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00003800UL ) +#define GPIOP_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00003C00UL ) +#define GPIOQ_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x00004000UL ) +#define ADC1_2_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08000000UL ) +#define ADC1_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08000000UL ) +#define ADC2_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08000100UL ) +#define ADC3_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08000400UL ) +#define DAC1_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08000800UL ) +#define DAC2_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08000C00UL ) +#define FDCAN3_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08001400UL ) +#define DCMI_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08050000UL ) +#define AES_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08060000UL ) +#define CORDIC_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08060400UL ) +#define HRNG_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08060800UL ) +#define HASH_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08060C00UL ) +#define AES_SPI1_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08061000UL ) + +#define THM_BASE_ADDR ( AHB2PERIPH_BASE_ADDR + 0x08080000UL ) +#define HEAD_BASE_ADDR (THM_BASE_ADDR + 0x00) +#define LUT_BASE_ADDR (THM_BASE_ADDR + 0x200) +#define DOT1_BASE_ADDR (THM_BASE_ADDR + 0x400) +#define DOT2_BASE_ADDR (THM_BASE_ADDR + 0x800) +#define DOT3_BASE_ADDR (THM_BASE_ADDR + 0xc00) +#define LCFG_BASE_ADDR (THM_BASE_ADDR + 0x2000) + +/*---------------------------- AHB3 peripherals ----------------------------*/ + +#define SPI7_BASE_ADDR ( AHB3PERIPH_BASE_ADDR + 0x00005000UL ) +#define SPI8_BASE_ADDR ( AHB3PERIPH_BASE_ADDR + 0x00005400UL ) +#define USB1_DLYB_REG_BASE_ADDR ( AHB3PERIPH_BASE_ADDR + 0x00006800UL ) +#define ETH_DLYB_REG_BASE_ADDR ( AHB3PERIPH_BASE_ADDR + 0x00006C00UL ) +#define SDIO_BASE_ADDR ( AHB3PERIPH_BASE_ADDR + 0x000C8000UL ) +#define SDIO_DLYBS_REG_BASE_ADDR ( AHB3PERIPH_BASE_ADDR + 0x000CA000UL ) +#define SDIO_DLYBD_REG_BASE_ADDR ( AHB3PERIPH_BASE_ADDR + 0x000CA800UL ) +#define OSPI1_BASE_ADDR ( AHB3PERIPH_BASE_ADDR + 0x000D1400UL ) +#define OSPI2_BASE_ADDR ( AHB3PERIPH_BASE_ADDR + 0x000D1800UL ) +#define OSPI1_DLYB_REG_BASE_ADDR ( AHB3PERIPH_BASE_ADDR + 0x000D2000UL ) +#define OSPI2_DLYB_REG_BASE_ADDR ( AHB3PERIPH_BASE_ADDR + 0x000D2400UL ) + +/*---------------------------- External Memory ----------------------------*/ + +#define FMC_NORSRAM_BASE_ADDR ( 0x60000000UL ) +#define SDRAM1_SDRAM2_BASE_ADDR ( 0x70000000UL ) +#define OSPI1_MEM_BASE_ADDR ( 0x80000000UL ) +#define OSPI2_MEM_BASE_ADDR ( 0x88000000UL ) +#define SPI4_MEM_BASE_ADDR ( 0x90000000UL ) + +/*-------------------------- External peripherals --------------------------*/ + +#define FMC_REG_BASE_ADDR ( 0xA0000000UL ) +#define SDRAM1_NORSRAM_BASE_ADDR ( 0xC0000000UL ) +#define SDRAM2_BASE_ADDR ( 0xD0000000UL ) + +/*--------------------- Peripheral_registers_structures --------------------*/ + +/*--------------------------------- SYSCFG ---------------------------------*/ + +typedef struct +{ + __IO uint32_t SYSCR; + __IO uint32_t WMR; + __IO uint32_t VER; + __IO uint32_t RSV0C[1]; + __IO uint32_t PHYCFG; + __IO uint32_t RSV14[1]; + __IO uint32_t RAMECCIR; + __IO uint32_t RAMECCSR; + __IO uint32_t RAMECCICR; + __IO uint32_t GPIO5VOCR1; + __IO uint32_t GPIO5VOCR2; + __IO uint32_t DFTCR; + __IO uint32_t JTAGCR; + __IO uint32_t IPDISR; + __IO uint32_t BUSLOCK; + +} SYSCFG_TypeDef; + +typedef struct +{ + __IO uint32_t RCR; + __IO uint32_t RSR; + __IO uint32_t AHB1RSTR; + __IO uint32_t AHB2RSTR; + __IO uint32_t AHB3RSTR; + __IO uint32_t APB1RSTR1; + __IO uint32_t APB1RSTR2; + __IO uint32_t APB2RSTR; + __IO uint32_t APB3RSTR; + __IO uint32_t APB4RSTR; + __IO uint32_t CCR1; + __IO uint32_t CCR2; + __IO uint32_t PERCFGR; + __IO uint32_t CIR; + __IO uint32_t AHB1CKENR; + __IO uint32_t AHB2CKENR; + __IO uint32_t AHB3CKENR; + __IO uint32_t APB1CKENR1; + __IO uint32_t APB1CKENR2; + __IO uint32_t APB2CKENR; + __IO uint32_t APB3CKENR; + __IO uint32_t APB4CKENR; + __IO uint32_t RCHCR; + __IO uint32_t XTHCR; + __IO uint32_t PLL1CR; + __IO uint32_t PLL1CFR; + __IO uint32_t PLL1SCR; + __IO uint32_t PLL2CR; + __IO uint32_t PLL2CFR; + __IO uint32_t PLL2SCR; + __IO uint32_t PLL3CR; + __IO uint32_t PLL3CFR; + __IO uint32_t RSV80; + __IO uint32_t CLKOCR; + __IO uint32_t DCKCFG; + __IO uint32_t STDBYCTRL; + +} RCC_TypeDef; + +typedef struct +{ + __IO uint32_t MD; + __IO uint32_t OTYP; + __IO uint32_t PUPD; + __IO uint32_t IDATA; + __IO uint32_t ODATA; + __IO uint32_t BSC; + __IO uint32_t AF0; + __IO uint32_t AF1; + __IO uint32_t DS0; + __IO uint32_t DS1; + __IO uint32_t SMIT; + __IO uint32_t LOCK; + __IO uint32_t AIEN; + +} GPIO_TypeDef; + +typedef struct +{ + __IO uint32_t IENR1; + __IO uint32_t IENR2; + __IO uint32_t EENR1; + __IO uint32_t EENR2; + __IO uint32_t RTENR1; + __IO uint32_t RTENR2; + __IO uint32_t FTENR1; + __IO uint32_t FTENR2; + __IO uint32_t SWIER1; + __IO uint32_t SWIER2; + __IO uint32_t PDR1; + __IO uint32_t PDR2; + __IO uint32_t CR1; + __IO uint32_t CR2; + __IO uint32_t CR3; + +} EXTI_TypeDef;; + +typedef struct +{ + __IO uint32_t INTSTATUS; + __IO uint32_t INTTCSTATUS; + __IO uint32_t INTTCCLR; + __IO uint32_t INTERRSTATUS; + __IO uint32_t INTERRCLR; + __IO uint32_t RAWINTTCSTATUS; + __IO uint32_t RAWINTERRSTATUS; + __IO uint32_t ENCHSTATUS; + __IO uint32_t RSV0[4]; + __IO uint32_t CONFIG; + __IO uint32_t SYNCLO; + __IO uint32_t SYNCHI; + +} DMA_TypeDef; + + +typedef struct +{ + __IO uint32_t CXSRCADDR; + __IO uint32_t CXDESTADDR; + __IO uint32_t CXLLI; + __IO uint32_t CXCTRL; + __IO uint32_t CXCONFIG; + +} DMA_Channel_TypeDef; + +typedef struct +{ + __IO uint32_t DR; + __IO uint32_t FR; + __IO uint32_t BRR; + __IO uint32_t IE; + __IO uint32_t ISR; + __IO uint32_t CR1; + __IO uint32_t CR2; + __IO uint32_t CR3; + __IO uint32_t GTPR; + __IO uint32_t BCNT; + +} USART_TypeDef; + +/*------------------- SPI ----------------------*/ +typedef struct _SPI_MEMO_ACC +{ +__IO uint32_t acc_en:1; + uint32_t cs_tout_en:1; + uint32_t rsv4:1; + uint32_t crm_en:1; + uint32_t instr_once:1; + uint32_t wr_ab_en:1; + uint32_t rd_ab_en:1; + uint32_t alter_byte_size:2; + uint32_t rsv3:1; + uint32_t wr_db_en:1; + uint32_t rd_db_en:1; + uint32_t dummy_cycle:3; + uint32_t rsv2:2; + uint32_t addr_size:2; + uint32_t instr_mode:2; + uint32_t addr_mode:2; + uint32_t alter_byte_mode:2; + uint32_t data_mode:2; + uint32_t instr_once_clr:1; + uint32_t rsv1:4; + +} SPI_MEMO_ACC_t; + +typedef struct _SPI_MEM_CMD +{ + __IO uint32_t rd_cmd:8; + __IO uint32_t wr_cmd:8; + __IO uint32_t rsv:16; +} SPI_MEM_CMD_t; + +typedef struct +{ + __IO uint32_t DAT; //0x00 + __IO uint32_t BAUD; //0x04 + __IO uint32_t CTL; //0x08 + __IO uint32_t TX_CTL; //0x0C + __IO uint32_t RX_CTL; //0x10 + __IO uint32_t IE; //0x14 + __IO uint32_t STATUS; //0x18 + __IO uint32_t TX_DELAY; //0x1C + __IO uint32_t BATCH; //0x20 + __IO uint32_t CS; //0x24 + __IO uint32_t OUT_EN; //0x28 + SPI_MEMO_ACC_t MEMO_ACC; //2C + SPI_MEM_CMD_t CMD; //30 + __IO uint32_t ALTER_BYTE; //34 + __IO uint32_t CS_TOUT_VAL;//38 +} SPI_TypeDef; + +/*------------------- I2C ----------------------*/ +typedef struct +{ + __IO uint32_t SLAVE_ADDR1; //0x00 + __IO uint32_t CLK_DIV; //0x04 + __IO uint32_t CR; //0x08 + __IO uint32_t SR; //0x0C + __IO uint32_t DR; //0x10 + __IO uint32_t SLAVE_ADDR2_3; //0x14 + __IO uint32_t DET; //0x18 + __IO uint32_t FILTER; //0x1C + __IO uint32_t RSV1; //0x20 + __IO uint32_t TIMEOUT; //0x24 +} I2C_TypeDef; + + +/////////////////////////////////////////////////////////////////////////////////// +/* FDCAN timming */ +typedef union +{ + struct{ + __IO uint32_t SEG1:8; + __IO uint32_t SEG2:8; + __IO uint32_t SJW:8; + __IO uint32_t PRESC:8; + }b; + __IO uint32_t w; +} fdcan_btr_u; + +/* FDCAN error cnt */ +typedef union +{ + struct{ + __IO uint32_t ALC:5; + __IO uint32_t KOER:3; + __IO uint32_t RSV:8; + __IO uint32_t RECNT:8; + __IO uint32_t TECNT:8; + }b; + __IO uint32_t w; +}fdcan_ecc_u; + +typedef union +{ + struct{ + __IO uint32_t ACFADR:4; + __IO uint32_t RSV:1; + __IO uint32_t SELMASK:1; + __IO uint32_t RSV1:10; + __IO uint32_t AE:16; + }b; + __IO uint32_t w; +} fdcan_acfctrl_u; + +typedef union +{ + struct{ + __IO uint32_t ACM:29; //Acceptance Code or Mask + __IO uint32_t AIDE:1; + __IO uint32_t AIDEE:1; + __IO uint32_t RSV:1; + }b; + __IO uint32_t w; +} fdcan_acodr_u; + + + +typedef union +{ + struct{ + uint32_t REF_ID:29; + uint32_t RSV:2; + uint32_t REF_IDE:1; + }b; + __IO uint32_t w; +} ttcan_refmsg_u; + +typedef union +{ + struct{ + __IO uint32_t TRIGCFG0:8; + __IO uint32_t TRIGCFG1:8; + __IO uint32_t TRIG0:8; + __IO uint32_t TRIG1:8; + }b; + __IO uint32_t w; +} ttcan_trig_ctrl_u; + + +typedef union +{ + struct{ + __IO uint32_t TTPTR:6; + __IO uint32_t RSV:2; + __IO uint32_t TTYPE:3; + __IO uint32_t RSV1:1; + __IO uint32_t TEW:4; + __IO uint32_t RSV2:16; + }b; + __IO uint32_t w; +}ttcan_trig_cfg_u; + +typedef union +{ + struct{ + __IO uint32_t WTRIG0:8; + __IO uint32_t WTRIG1:8; + __IO uint32_t RSV:16; + }b; + __IO uint32_t w; +} ttcan_wtrig_u; + + +typedef struct +{ + __IO uint32_t RBUF[20]; + __IO uint32_t TBUF[18]; //50 + __IO uint32_t TTSL; //98 + __IO uint32_t TTSH; //9C + __IO uint32_t CR; //A0 + __IO uint32_t IR; //A4 + __IO uint32_t LIMIT; //A8 + __IO fdcan_btr_u SBTR; //AC + __IO fdcan_btr_u FBTR; //B0 + __IO uint32_t TDC; //B4 + __IO fdcan_ecc_u ECC; //B8 + __IO fdcan_acfctrl_u ACFCR; //BC + __IO uint32_t ACFMODE; //C0 + __IO uint32_t ACODR; //C4 + __IO uint32_t TIMECFG; //C8 + __IO uint32_t TTCFG; //CC + __IO ttcan_refmsg_u TTREFMSG; //D0 + __IO ttcan_trig_cfg_u TTTRIGCFG; //D4 + __IO uint32_t TTTRIG; //D8 + __IO ttcan_wtrig_u TTWTRIGR; //DC + +} FDCAN_GlobalTypeDef; + +///*------------------- LPUART Registers ----------------------*/ +typedef struct +{ + __IO uint32_t RXDR; // 0x00 + __IO uint32_t TXDR; // 0x04 + __IO uint32_t LCR; // 0x08 + __IO uint32_t CR; // 0x0C + __IO uint32_t IBAUD; // 0x10 + __IO uint32_t FBAUD; // 0x14 + __IO uint32_t IE; // 0x18 + __IO uint32_t SR; // 0x1C + __IO uint32_t ADDR; // 0x20 +} LPUART_TypeDef; + +typedef struct +{ + __IO uint32_t TXDR; + __IO uint32_t RXDR; + __IO uint32_t CR; + __IO uint32_t PR; + __IO uint32_t DIER; + __IO uint32_t SR; + __IO uint32_t RSV18; + __IO uint32_t RSIZE; + +} I2S_TypeDef; + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CFGR; + +} DLYB_TypeDef; + +typedef struct +{ + __IO uint32_t MACCR; + __IO uint32_t MACFFR; + __IO uint32_t MACHTHR; + __IO uint32_t MACHTLR; + __IO uint32_t MACMIIAR; + __IO uint32_t MACMIIDR; + __IO uint32_t MACFCR; + __IO uint32_t MACVLANTR; + __IO uint32_t RSV0020[1]; + __IO uint32_t MACDBGR; + __IO uint32_t MACRWUFF; + __IO uint32_t MACPMTCSR; + __IO uint32_t MACLPICSR; + __IO uint32_t MACLPITCR; + __IO uint32_t MACISR; + __IO uint32_t MACIMR; + __IO uint32_t MACA0HR; + __IO uint32_t MACA0LR; + __IO uint32_t MACA1HR; + __IO uint32_t MACA1LR; + __IO uint32_t MACA2HR; + __IO uint32_t MACA2LR; + __IO uint32_t MACA3HR; + __IO uint32_t MACA3LR; + __IO uint32_t RSV0060[31]; + __IO uint32_t MACWTR; + __IO uint32_t RSV00E0[8]; + __IO uint32_t MMCCR; + __IO uint32_t MMCRIR; + __IO uint32_t MMCTIR; + __IO uint32_t MMCRIMR; + __IO uint32_t MMCTIMR; + __IO uint32_t RSV0114[14]; + __IO uint32_t MMCTGFSCCR; + __IO uint32_t MMCTGFMCCR; + __IO uint32_t RSV0154[5]; + __IO uint32_t MMCTGFCR; + __IO uint32_t RSV016C[10]; + __IO uint32_t MMCRFCECR; + __IO uint32_t MMCRFAECR; + __IO uint32_t RSV019C[10]; + __IO uint32_t MMCRGUFCR; + __IO uint32_t RSV01C8[142]; + __IO uint32_t MACL3L4C0R; + __IO uint32_t MACL4A0R; + __IO uint32_t RSV0408[2]; + __IO uint32_t MACL3A00R; + __IO uint32_t MACL3A10R; + __IO uint32_t MACL3A20R; + __IO uint32_t MACL3A30R; + __IO uint32_t RSV0420[4]; + __IO uint32_t MACL3L4C1R; + __IO uint32_t MACL4A1R; + __IO uint32_t RSV0438[2]; + __IO uint32_t MACL3A01R; + __IO uint32_t MACL3A11R; + __IO uint32_t MACL3A21R; + __IO uint32_t MACL3A31R; + __IO uint32_t RSV0450[77]; + __IO uint32_t MACVTIRR; + __IO uint32_t MACVHTR; + __IO uint32_t RSV058C[93]; + __IO uint32_t PTPTSCR; + __IO uint32_t PTPSSIR; + __IO uint32_t PTPTSHR; + __IO uint32_t PTPTSLR; + __IO uint32_t PTPTSHUR; + __IO uint32_t PTPTSLUR; + __IO uint32_t PTPTSAR; + __IO uint32_t PTPTTHR; + __IO uint32_t PTPTTLR; + __IO uint32_t RSV0724[1]; + __IO uint32_t PTPTSSR; + __IO uint32_t PTPPPSCR; + __IO uint32_t PTPATSNR; + __IO uint32_t PTPATSSR; + __IO uint32_t RSV0738[10]; + __IO uint32_t PTPPPSIR; + __IO uint32_t PTPPPSWR; + __IO uint32_t RSV0768[550]; + __IO uint32_t DMABMR; + __IO uint32_t DMATPDR; + __IO uint32_t DMARPDR; + __IO uint32_t DMARDLAR; + __IO uint32_t DMATDLAR; + __IO uint32_t DMASR; + __IO uint32_t DMAOMR; + __IO uint32_t DMAIER; + __IO uint32_t DMAMFBOCR; + __IO uint32_t DMARIWTR; + __IO uint32_t RSV1028[8]; + __IO uint32_t DMACHTDR; + __IO uint32_t DMACHRDR; + __IO uint32_t DMACHTBAR; + __IO uint32_t DMACHRBAR; + +} ETH_TypeDef; + +///*------------------- PMU ----------------------*/ +typedef struct +{ + __IO uint32_t CTRL0; + __IO uint32_t CTRL1; + __IO uint32_t CTRL2; + __IO uint32_t CTRL3; + __IO uint32_t SR; + __IO uint32_t STCLR; + __IO uint32_t IOSEL; + __IO uint32_t RSV0[41]; + __IO uint32_t TEST_ANATEST_SR; + __IO uint32_t TEST_LDOCAL; + __IO uint32_t TEST_LDOCR; + +} PMU_TypeDef; + +///*------------------- RTC ----------------------*/ +typedef struct +{ + __IO uint32_t WP; + __IO uint32_t IE; + __IO uint32_t SR; + __IO uint32_t SEC; + __IO uint32_t MIN; + __IO uint32_t HOUR; + __IO uint32_t DAY; + __IO uint32_t WEEK; + __IO uint32_t MONTH; + __IO uint32_t YEAR; + __IO uint32_t ALM; + __IO uint32_t CR; + __IO uint32_t ADJUST; + __IO uint32_t RSV0[2]; + __IO uint32_t MSECCNT; + __IO uint32_t RSV1[1]; + __IO uint32_t CLKSTAMP1; + __IO uint32_t CALSTAMP1; + __IO uint32_t CLKSTAMP2; + __IO uint32_t CALSTAMP2; + __IO uint32_t WUTR; + __IO uint32_t RSV2[6]; + __IO uint32_t BAKUP[16]; +} RTC_TypeDef; + +///*------------------- WDT ----------------------*/ +typedef struct +{ + __IO uint32_t LOAD; + __IO uint32_t COUNT; + __IO uint32_t CTRL; + __IO uint32_t FEED; + __IO uint32_t INTCLRTIME; + __IO uint32_t RIS; + +} WDT_TypeDef; + +///*------------------- IWDT ----------------------*/ +typedef struct +{ + __IO uint32_t CMDR; + __IO uint32_t PR; + __IO uint32_t RLR; + __IO uint32_t SR; + __IO uint32_t WINR; + __IO uint32_t WUTR; + +} IWDT_TypeDef; + +///*------------------- ADC ----------------------*/ +typedef struct +{ + __IO uint32_t SR; + __IO uint32_t IE; + __IO uint32_t CR1; + __IO uint32_t CR2; + __IO uint32_t SMPR1; + __IO uint32_t SMPR2; + __IO uint32_t SMPR3; + __IO uint32_t HTR; + __IO uint32_t LTR; + __IO uint32_t SQR1; + __IO uint32_t SQR2; + __IO uint32_t SQR3; + __IO uint32_t JSQR; + __IO uint32_t JDR[4]; + __IO uint32_t RSV0[1]; + __IO uint32_t DR; + __IO uint32_t DIFSEL; + __IO uint32_t RSV1[4]; + __IO uint32_t OFR[4]; + __IO uint32_t RSV2[5]; + __IO uint32_t CALFACT; + __IO uint32_t CHDR[9]; + __IO uint32_t TEST_DATA[10]; +} ADC_TypeDef; + +typedef struct +{ + __IO uint32_t CSR; + __IO uint32_t CCR; + __IO uint32_t CDR; + __IO uint32_t CVRB; +} ADC_Common_TypeDef; + +///*------------------- DAC ----------------------*/ +typedef struct +{ + __IO uint32_t CR; //0x00 + __IO uint32_t SWTRIGR; //0x04 + __IO uint32_t DHR12R1; //0x08 + __IO uint32_t DHR12L1; //0x0C + __IO uint32_t DHR8R1; //0x10 + __IO uint32_t DHR12R2; //0x14 + __IO uint32_t DHR12L2; //0x18 + __IO uint32_t DHR8R2; //0x1C + __IO uint32_t DHR12RD; //0x20 + __IO uint32_t DHR12LD; //0x24 + __IO uint32_t DHR8RD; //0x28 + __IO uint32_t DOR1; //0x2C + __IO uint32_t DOR2; //0x30 + __IO uint32_t SR; //0x34 + __IO uint32_t CCR; //0x38 + __IO uint32_t MCR; //0x3C + __IO uint32_t SHSR1; //0x40 + __IO uint32_t SHSR2; //0x44 + __IO uint32_t SHHR; //0x48 + __IO uint32_t SHRR; //0x4C + __IO uint32_t RSV[2]; //0x50~0x54 + __IO uint32_t STR1; //0x58 + __IO uint32_t STR2; //0x5C + __IO uint32_t STMODR; //0x60 +} DAC_TypeDef; + +///*------------------- MDAC ----------------------*/ +typedef struct{ + __IO uint32_t VDACx_CTRL[12]; //0x00~0x2c + __IO uint32_t IDACx_CTRL[4]; //0x30~0x3c + __IO uint32_t DACx_DOR[16]; //0x40~0x7c +} MDAC_TypeDef; + + +///*------------------- TKEY ----------------------*/ +typedef struct +{ + __IO uint32_t SR; + __IO uint32_t IER; + __IO uint32_t CR; + __IO uint32_t CFGR1; + __IO uint32_t CFGR2; + __IO uint32_t INTVLR; + __IO uint32_t DIVR; + __IO uint32_t SCCR; + __IO uint32_t TSETR; + __IO uint32_t CXENR; + __IO uint32_t DR; + __IO uint32_t TH[16]; + __IO uint32_t CH[16]; + __IO uint32_t CFLTR; + __IO uint32_t NSETR; + __IO uint32_t TWAITR; + __IO uint32_t MUTUALR; + __IO uint32_t TXENR[2]; + +} TKEY_TypeDef; + +///*------------------- OSPI ----------------------*/ +typedef struct +{ + __IO uint32_t DAT; + __IO uint32_t BAUD; + __IO uint32_t CTL; + __IO uint32_t TX_CTL; + __IO uint32_t RX_CTL; + __IO uint32_t IE; + __IO uint32_t STATUS; + __IO uint32_t TX_DELAY; + __IO uint32_t BATCH; + __IO uint32_t CS; + __IO uint32_t OUT_EN; + __IO uint32_t MEMO_ACC1; + __IO uint32_t CMD; + __IO uint32_t ALTER_BYTE; + __IO uint32_t CS_TIMEOUT_VAL; + __IO uint32_t MEMO_ACC2; +} OSPI_TypeDef; + +///*------------------- FMC ----------------------*/ +typedef struct +{ + __IO uint32_t SNCTLCFG[8]; + __IO uint32_t RSV0[57]; + __IO uint32_t SNWTCFG[7]; + +} FMC_NORSRAM_TypeDef; + +typedef struct +{ + __IO uint32_t SDRCR[2]; + __IO uint32_t SDRTR[2]; + __IO uint32_t SDRCMD; + __IO uint32_t SDRART; + __IO uint32_t SDRSR; + __IO uint32_t SDRSMA1; + __IO uint32_t SDRSMA2; + +} FMC_SDRAM_TypeDef; + + +typedef struct +{ + __IO uint32_t CR1; // 0x00 + __IO uint32_t CR2; // 0x04 + __IO uint32_t SMCR; // 0x08 + __IO uint32_t DIER; // 0x0C + __IO uint32_t SR; // 0x10 + __IO uint32_t EGR; // 0x14 + __IO uint32_t CCMR1; // 0x18 + __IO uint32_t CCMR2; // 0x1C + __IO uint32_t CCER; // 0x20 + __IO uint32_t CNT; // 0x24 + __IO uint32_t PSC; // 0x28 + __IO uint32_t ARR; // 0x2C + __IO uint32_t RCR; // 0x30 + __IO uint32_t CCR1; // 0x34 + __IO uint32_t CCR2; // 0x38 + __IO uint32_t CCR3; // 0x3C + __IO uint32_t CCR4; // 0x40 + __IO uint32_t BDTR; // 0x44 + __IO uint32_t DCR; // 0x48 + __IO uint32_t DMAR; // 0x4C + __IO uint32_t OR1; // 0x50 + __IO uint32_t CCMR3; // 0x54 + __IO uint32_t CCR5; // 0x58 + __IO uint32_t CCR6; // 0x5C + __IO uint32_t AF1; // 0x60 + __IO uint32_t AF2; // 0x64 + __IO uint32_t TISEL; // 0x68 + __IO uint32_t DBER; // 0x6C +} TIM_TypeDef; + +typedef struct +{ + __IO uint32_t CTRL; // 0x00 + __IO uint32_t SR; // 0x04 + __IO uint32_t ARR_LOW; // 0x08 + __IO uint32_t ARR_HIGH; // 0x0c + __IO uint32_t CNT_LOW; // 0x10 + __IO uint32_t CNT_HIGH; // 0x14 +} TIM_64BIT_TypeDef; + + +typedef struct +{ + __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h */ + __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h */ + __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h */ + __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch */ + __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h */ + __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h */ + __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h */ + __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch */ + __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h */ + __IO uint32_t GRXFSIZ; /*!< Receive FIFO Size Register 024h */ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h */ + __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch */ + uint32_t Reserved30[2]; /*!< Reserved 030h */ + __IO uint32_t GGPIO; /*!< General Purpose IO Register 038h */ + __IO uint32_t CID; /*!< User ID Register 03Ch */ + uint32_t Reserved5[3]; /*!< Reserved 040h-048h */ + __IO uint32_t GHWCFG3; /*!< User HW config3 04Ch */ + uint32_t Reserved6; /*!< Reserved 050h */ + __IO uint32_t GLPMCFG; /*!< LPM Register 054h */ + uint32_t Reserved7; /*!< Reserved 058h */ + __IO uint32_t GDFIFOCFG; /*!< DFIFO Software Config Register 05Ch */ + uint32_t Reserved43[40]; /*!< Reserved 60h-0FFh */ + + __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg 100h */ + __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO 104h-13Ch */ +} USB_OTG_GlobalTypeDef; + + +typedef struct +{ + __IO uint32_t TR0; //00 + __IO uint32_t TR1; //04 + __IO uint32_t TR2; //08 + __IO uint32_t TR3; //0C + __IO uint32_t TR4; //10 + __IO uint32_t TR5; //14 + __IO uint32_t TR6; //18 + __IO uint32_t TR7; //1C + __IO uint32_t RSV0[2]; //20 + __IO uint32_t TR8; //28 + __IO uint32_t TR9; //2C + __IO uint32_t RSV1[20]; //30 + __IO uint32_t CR; //80 +} USB_HS_PHYC_GlobalTypeDef; + +typedef struct +{ + __IO uint32_t DCFG; /*!< dev Configuration Register 800h */ + __IO uint32_t DCTL; /*!< dev Control Register 804h */ + __IO uint32_t DSTS; /*!< dev Status Register (RO) 808h */ + uint32_t Reserved0C; /*!< Reserved 80Ch */ + __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask 810h */ + __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask 814h */ + __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg 818h */ + __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask 81Ch */ + uint32_t Reserved20; /*!< Reserved 820h */ + uint32_t Reserved9; /*!< Reserved 824h */ + __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register 828h */ + __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register 82Ch */ + __IO uint32_t DTHRCTL; /*!< dev threshold 830h */ + __IO uint32_t DIEPEMPMSK; /*!< dev empty msk 834h */ + __IO uint32_t DEACHINT; /*!< dedicated EP interrupt 838h */ + __IO uint32_t DEACHMSK; /*!< dedicated EP msk 83Ch */ + __IO uint32_t DINEP0MSK; /*!< dedicated EP mask 840h */ + __IO uint32_t DINEP1MSK; /*!< dedicated EP mask 844h */ + uint32_t Reserved44[15]; /*!< Reserved 844-87Ch */ + __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk 884h */ +} USB_OTG_DeviceTypeDef; + +typedef struct +{ + __IO uint32_t DIEPCTL; /*!< dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved 900h + (ep_num * 20h) + 04h */ + __IO uint32_t DIEPINT; /*!< dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved 900h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DIEPTSIZ; /*!< IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ + __IO uint32_t DIEPDMA; /*!< IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ + __IO uint32_t DTXFSTS; /*!< IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ + uint32_t Reserved18; /*!< Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ +} USB_OTG_INEndpointTypeDef; + +typedef struct +{ + __IO uint32_t DOEPCTL; /*!< dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved B00h + (ep_num * 20h) + 04h */ + __IO uint32_t DOEPINT; /*!< dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved B00h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DOEPTSIZ; /*!< dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h */ + __IO uint32_t DOEPDMA; /*!< dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h */ + uint32_t Reserved18[2]; /*!< Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch */ +} USB_OTG_OUTEndpointTypeDef; + +typedef struct +{ + __IO uint32_t HCFG; /*!< Host Configuration Register 400h */ + __IO uint32_t HFIR; /*!< Host Frame Interval Register 404h */ + __IO uint32_t HFNUM; /*!< Host Frame Nbr/Frame Remaining 408h */ + uint32_t Reserved40C; /*!< Reserved 40Ch */ + __IO uint32_t HPTXSTS; /*!< Host Periodic Tx FIFO/ Queue Status 410h */ + __IO uint32_t HAINT; /*!< Host All Channels Interrupt Register 414h */ + __IO uint32_t HAINTMSK; /*!< Host All Channels Interrupt Mask 418h */ +} USB_OTG_HostTypeDef; + +typedef struct +{ + __IO uint32_t HCCHAR; /*!< Host Channel Characteristics Register 500h */ + __IO uint32_t HCSPLT; /*!< Host Channel Split Control Register 504h */ + __IO uint32_t HCINT; /*!< Host Channel Interrupt Register 508h */ + __IO uint32_t HCINTMSK; /*!< Host Channel Interrupt Mask Register 50Ch */ + __IO uint32_t HCTSIZ; /*!< Host Channel Transfer Size Register 510h */ + __IO uint32_t HCDMA; /*!< Host Channel DMA Address Register 514h */ + uint32_t Reserved[2]; /*!< Reserved */ +} USB_OTG_HostChannelTypeDef; + +typedef struct +{ + __IO uint32_t ISR; + __IO uint32_t ICR; + __IO uint32_t IER; + __IO uint32_t CFGR1; + __IO uint32_t CR; + __IO uint32_t CMP; + __IO uint32_t ARR; + __IO uint32_t CNT; + __IO uint32_t RSV0[1]; + __IO uint32_t CFGR2; + __IO uint32_t RCR; + +} LPTIM_TypeDef; + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t SR; + __IO uint32_t RIS; + __IO uint32_t IER; + __IO uint32_t MIS; + __IO uint32_t ICR; + __IO uint32_t ESCR; + __IO uint32_t ESUR; + __IO uint32_t CWSTRT; + __IO uint32_t CWSIZE; + __IO uint32_t DR; + +} DCMI_TypeDef; + +///*------------------- LTDC ----------------------*/ +typedef struct +{ + __IO uint32_t RSV1[2]; + __IO uint32_t SSCR; + __IO uint32_t BPCR; + __IO uint32_t AWCR; //0x10 + __IO uint32_t TWCR; + __IO uint32_t GCR; + __IO uint32_t RSV2[2]; + __IO uint32_t SRCR; + __IO uint32_t RSV3; + __IO uint32_t BCCR; + __IO uint32_t RSV4; //0x30 + __IO uint32_t IER; + __IO uint32_t ISR; + __IO uint32_t ICR; + __IO uint32_t LIPCR; //0x40 + __IO uint32_t CPSR; + __IO uint32_t CDSR; +} LTDC_TypeDef; + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t WHPCR; + __IO uint32_t WVPCR; + __IO uint32_t CKCR; //0x90 + __IO uint32_t PFCR; + __IO uint32_t CACR; + __IO uint32_t DCCR; + __IO uint32_t BFCR; //0xA0 + __IO uint32_t RSV1[2]; + __IO uint32_t CFBAR; + __IO uint32_t CFBLR; //0xB0 + __IO uint32_t CFBLNR; + __IO uint32_t RSV2[3]; + __IO uint32_t CLUTWR; +} LTDC_Layer_TypeDef; + +///*------------------- CRC ----------------------*/ +typedef struct +{ + __IO uint32_t DATA; + __IO uint32_t CTRL; + __IO uint32_t INIT; + __IO uint32_t RSV0; + __IO uint32_t OUTXOR; + __IO uint32_t POLY; + __IO uint32_t FDATA; +} CRC_TypeDef; + +///*------------------- FMC_NAND ----------------------*/ +typedef union +{ + uint8_t FMC_NAND_BCHCODE_CH8; + uint16_t FMC_NAND_BCHCODE_CH16; + uint32_t FMC_NAND_BCHCODE_CH32; +} FMC_NAND_BCH_CODE_t; + +typedef union +{ + uint8_t FMC_NAND_ECCDATA_CH8; + uint16_t FMC_NAND_ECCDATA_CH16; + uint32_t FMC_NAND_ECCDATA_CH32; +} FMC_NAND_ECCDATA_t; + +typedef union +{ + uint8_t FMC_NAND_NECCDATA_CH8; + uint16_t FMC_NAND_NECCDATA_CH16; + uint32_t FMC_NAND_NECCDATA_CH32; +} FMC_NAND_NECCDATA_t; + +typedef struct +{ + __IO uint32_t CTRL; //0x00 + __IO uint32_t WST; //0x04 + __IO uint32_t STATUS; //0x08 + __IO uint32_t RSV0; //0x0c + __IO uint32_t BCH_CFG; //0x10 + __IO uint32_t BCH_CTRL; //0x14 + __IO uint32_t BCH_STATUS; //0x18 + FMC_NAND_BCH_CODE_t BCH_CODE; //0x1c + __IO uint32_t BCH_ERRADR; //0x20 + __IO uint32_t BCH_ERRVEC; //0x24 + __IO uint32_t BCH_BASEADDR; //0x28 + __IO uint32_t BCH_CODEPTR; + __IO uint32_t BCH_ERRADDRPTR; + __IO uint32_t BCH_ERRVECPTR; + __IO uint32_t BCH_PAGENUM; + __IO uint32_t BCH_ADDRLATCH; + __IO uint32_t CMD; + __IO uint32_t ADDR; + FMC_NAND_ECCDATA_t FMC_NAND_ECCDATA; + FMC_NAND_NECCDATA_t FMC_NAND_NECCDATA; + +} FMC_NAND_TypeDef; + +///*------------------- DMA2D ----------------------*/ +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t ISR; + __IO uint32_t IFCR; + __IO uint32_t FGMAR; + __IO uint32_t FGOR; //0x10 + __IO uint32_t BGMAR; + __IO uint32_t BGOR; + __IO uint32_t FGPFCCR; + __IO uint32_t FGCOLR; //0x20 + __IO uint32_t BGPFCCR; + __IO uint32_t BGCOLR; + __IO uint32_t FGCMAR; + __IO uint32_t BGCMAR; //0x30 + __IO uint32_t OPFCCR; + __IO uint32_t OCOLR; + __IO uint32_t OMAR; + __IO uint32_t OOR; //0x40 + __IO uint32_t NLR; + __IO uint32_t LWR; + __IO uint32_t AMTCR; +} DMA2D_TypeDef; + +typedef struct +{ + __IO uint32_t CR; //0x0 + __IO uint32_t SR; //0x4 + +}COMP_TypeDef; + +typedef struct +{ + __IO uint32_t WP; //0x0 + __IO uint32_t CTRL; //0x4 + __IO uint32_t AR; //0x8 + __IO uint32_t DWR; //0xc + __IO uint32_t SR; //0x10 + __IO uint32_t CLR; //0x14 + __IO uint32_t DR; //0x18 + __IO uint32_t DSDP; //0x1c + __IO uint32_t BYTEWP; //0x20 + __IO uint32_t PGCFG; //0x24 + __IO uint32_t RSV0[246]; //0x28 + __IO uint32_t DSR[16]; //0x400 + +}EFUSE_TypeDef; + +typedef struct +{ + __IO uint32_t DATAIN; //0x00 + __IO uint32_t KEYIN; //0x04 + __IO uint32_t IVIN; //0x08 + __IO uint32_t CTRL; //0x0C + __IO uint32_t STATE; //0x10 + __IO uint32_t DATAOUT; //0x14 + __IO uint32_t STARTADDR; //0x18 + __IO uint32_t ENDADDR; //0x1C + __IO uint32_t INIDATA; //0x20 + __IO uint32_t ADDR; //0x24 + +}AES_TypeDef; + +typedef struct +{ + __IO uint32_t CTRL; //0x00 + __IO uint32_t STAUTS; //0x04 + __IO uint32_t X_DATAIN; //0x08 + __IO uint32_t Y_DATAIN; //0x0c + __IO uint32_t RESULT1; //0x10 + __IO uint32_t RESULT2; //0x14 +}CORDIC_TypeDef; + + +typedef struct +{ + __IO uint32_t DATAIN; //0x00 + __IO uint32_t KEYIN; //0x04 + __IO uint32_t OTFDEC_CTRL; //0x08 + __IO uint32_t CTRL; //0x0C + __IO uint32_t STATE; //0x10 + __IO uint32_t DATAOUT; //0x14 + __IO uint32_t STARTADDR; //0x18 + __IO uint32_t ENDADDR; //0x1C + __IO uint32_t INIDATA; //0x20 + __IO uint32_t ADDR; //0x24 + __IO uint32_t UID; //0x28 + __IO uint32_t RAND0; //0x2C + __IO uint32_t RAND1; //0x30 + __IO uint32_t RSV0; //0x34 + __IO uint32_t OTFDEC_SPI_CTRL; //0x38 + __IO uint32_t ENDADDR2; //0x3c + __IO uint32_t ENDADDR3; //0x40 + __IO uint32_t RAND2; //0x44 + __IO uint32_t RAND3; //0x48 + __IO uint32_t KEYIN1; //0x4c + __IO uint32_t KEYIN2; //0x50 + __IO uint32_t KEYIN3; //0x54 + __IO uint32_t ADDR1; //0x58 + __IO uint32_t DATAOUT1; //0x5C +}AES_SPI_TypeDef; + + +///*------------------- SDMMC Registers ----------------------*/ +typedef struct +{ + __IO uint32_t SDMMC_CTRL; //00H + __IO uint32_t SDMMC_PWREN; //04H + __IO uint32_t SDMMC_CLKDIV; //08H + __IO uint32_t SDMMC_CLKSRC; //0CH + __IO uint32_t SDMMC_CLKENA; //10H + __IO uint32_t SDMMC_TMOUT; //14H + __IO uint32_t SDMMC_CTYPE; //18H + __IO uint32_t SDMMC_BLKSIZ; //1CH + __IO uint32_t SDMMC_BYTCNT; //20H + __IO uint32_t SDMMC_INTMASK; //24H + __IO uint32_t SDMMC_CMDARG; //28H + __IO uint32_t SDMMC_CMD; //2CH + __IO uint32_t SDMMC_RESP0; //30H + __IO uint32_t SDMMC_RESP1; //34H + __IO uint32_t SDMMC_RESP2; //38H + __IO uint32_t SDMMC_RESP3; //3CH + __IO uint32_t SDMMC_MINTSTS; //40H + __IO uint32_t SDMMC_RINTSTS; //44H + __IO uint32_t SDMMC_STATUS; //48H + __IO uint32_t SDMMC_FIFOTH; //4CH + __IO uint32_t SDMMC_CDETECT; //50H + __IO uint32_t SDMMC_WRTPRT; //54H + __IO uint32_t SDMMC_GPIO; //58H + __IO uint32_t SDMMC_TCBCNT; //5CH + __IO uint32_t SDMMC_TBBCNT; //60H + __IO uint32_t SDMMC_DEBNCE; //64H + __IO uint32_t SDMMC_RSV0[3]; //68H + __IO uint32_t SDMMC_UHS_REG; //74H + __IO uint32_t SDMMC_RSTN; //78H + __IO uint32_t SDMMC_RSV1; //7CH + __IO uint32_t SDMMC_BMOD; //80H + __IO uint32_t SDMMC_PLDMND; //84H + __IO uint32_t SDMMC_DBADDR; //88H + __IO uint32_t SDMMC_IDSTS; //8CH + __IO uint32_t SDMMC_IDINTEN; //90H + __IO uint32_t SDMMC_DSCADDR; //94H + __IO uint32_t SDMMC_BUFADDR; //98H + __IO uint32_t SDMMC_RSV2[25]; //9CH + __IO uint32_t SDMMC_CTHCTL; //100H + __IO uint32_t SDMMC_BKDPWR; //104H + __IO uint32_t SDMMC_UHS_EXT; //108H + __IO uint32_t SDMMC_EMMC_DDR; //10CH + __IO uint32_t SDMMC_ENA_SHIFT; //110H + __IO uint32_t SDMMC_RSV3[59]; //114H + __IO uint32_t SDMMC_DATA; //200H +} SDMMC_TypeDef; + + +///*----------------------- HDL registers ------------------------*/ + +typedef struct +{ + __IO uint32_t NDL_CTR; //0x000 + __IO uint32_t NDL_EN; //0x004 + __IO uint32_t NDL_CLKDIV; //0x008 + __IO uint32_t INT_MASK; //0x00c + __IO uint32_t INT_MIS; //0x010 + __IO uint32_t INT_CLR; //0x014 + __IO uint32_t WG_CTR; //0x018 + __IO uint32_t WG_PRD; //0x01c + __IO uint32_t HPSA_FLT; //0x020 + __IO uint32_t RAS_CNT_CTREN; //0x024 + __IO uint32_t RAS_CNT_CTR; //0x028 + __IO uint32_t RAS_CNT_VAL; //0x02c + __IO uint32_t RAS_SPEED; //0x030 + __IO uint32_t RAS_HSYNC; //0x034 + __IO uint32_t CORR_CNT; //0x038 + __IO uint32_t HPSA_CNT; //0x03c + __IO uint32_t FINE_STEP_PREC; //0x040 + __IO uint32_t FINE_STEP_CNT; //0x044 + __IO uint32_t PRINT_DELAY; //0x048 + __IO uint32_t PRINT_CTR; //0x04c + __IO uint32_t PRINT_START_POS; //0x050 + __IO uint32_t PRINT_INIT_POS[24]; //0x054~0x0b0 + __IO uint32_t PRINT_REQ_NUM; //0x0b4 + __IO uint32_t PRINT_DPI_SET; //0x0b8 + __IO uint32_t PRINT_DATA; //0x0bc + __IO uint32_t DMA_BUF_CTR; //0x0c0 + __IO uint32_t SPEED_UP_CNT; //0x0c4 + __IO uint32_t ADO_MODE_CTR; //0x0c8 + __IO uint32_t WAVE_TFG[24]; //0x0cc~0x128 + __IO uint32_t WAVE_TGHIJ; //0x12C + __IO uint32_t SURGE_TGKL; //0x130 + __IO uint32_t RSV0; //0x133 + __IO uint32_t PROT_TFMN; //0x138 + __IO uint32_t PROT_EN; //0x13C + __IO uint32_t PIN_CFG[24]; //0x140~0x19c + __IO uint32_t RSV1[24]; //0x1a0~0x1fc + __IO uint32_t DOT_CNT_VAL[24]; //0x200~0x25c + __IO uint32_t MS_CTR; //0x260 + __IO uint32_t MS_TGHIJ; //0x264, MS_TGHIJ_CHJ + __IO uint32_t MS_TGN; //0x268 + __IO uint32_t MS_TGQR; //0x26c + __IO uint32_t MS_ON_OFF; //0x270 + __IO uint32_t MS_PROT_TFMN; //0x274 + __IO uint32_t MS_PROT_EN; //0x278 + __IO uint32_t INT_RIS; //0x27c + __IO uint32_t DMA_DATA_STA; //0x280 + __IO uint32_t SURGE_CFG[24]; //0x284~0x2e0 + __IO uint32_t CLK_TFG; //0x2e4 + __IO uint32_t FEED_CTL; //0x2e8 +}NDL_TypeDef; + + +///*----------------------- HEAD registers ------------------------*/ +typedef struct +{ + __IO uint32_t PRINT_DATA; //0x000 ӡݼĴ + __IO uint32_t PRINT_DIV; //0x004 ӡƵĴ + __IO uint32_t PRINT_CFG1; //0x008 ӡüĴ1 + __IO uint32_t PRINT_CFG2; //0x00c ӡüĴ2 + __IO uint32_t PRINT_CFG3; //0x010 ӡüĴ3 + __IO uint32_t PRINT_TRIGR; //0x014 ӡѡĴ + __IO uint32_t PRINT_CR; //0x018 ӡƼĴ + __IO uint32_t PRINT_ERR; //0x01c ӡĴ + __IO uint32_t PRINT_SR; //0x020 ӡ״̬Ĵ + __IO uint32_t PRINT_IE; //0x024 ӡжʹܼĴ + + __IO uint32_t PRINT_ERR_IE; //0x028 ӡ״̬Ĵ // 2023/12/12 + __IO uint32_t RSV0[1]; //0x2c + + __IO uint32_t DATA_BASE[16]; //0x030~0x6c nʼַĴ + __IO uint32_t PRINT_SUBDATA; //0x070 ӡĴ + + __IO uint32_t CYC1_CFG; //0x74 // 2023/2/14 YZR + __IO uint32_t TIMERCR; //0x78 // 2023/6/6 YZR + __IO uint32_t DELAY; //0x7c // 2023/6/6 YZR + + __IO uint32_t DROP; //0x080 DROP + __IO uint32_t DROP_MAX; //0x084 + __IO uint32_t DROP_B; //0x088 + + __IO uint32_t DROP_IGN; //0x08c // 2023/2/14 YZR + __IO uint32_t RSV2[4]; //0x090~0x9c + + __IO uint32_t S_COR; //0x0a0 + __IO uint32_t Z_COR; //0x0a4 + __IO uint32_t M_COR; //0x0a8 + __IO uint32_t Z_ADD; //0x0ac + __IO uint32_t N_ADD; //0x0b0 + __IO uint32_t Z_RAD; //0x0b4 + __IO uint32_t M_ADD; //0x0b8 + __IO uint32_t MAIN; //0x0bc + __IO uint32_t M_RAD; //0x0c0 + __IO uint32_t P_ADD; //0x0c4 + __IO uint32_t S_COR_MAX; //0x0c8 + __IO uint32_t Z_ADD1; //0x0cc + __IO uint32_t MAX_OT; //0x0d0 + __IO uint32_t M_ADD1; //0x0d4 + __IO uint32_t MAX_OT_ZEN; //0x0d8 + __IO uint32_t MAX_OT_MEM; //0x0dc + + __IO uint32_t PREHEAT_CFG1; //0x0e0 ԤüĴ1 + __IO uint32_t PREHEAT_CFG2; //0x0e4 + __IO uint32_t PREHEAT_CFG3; //0x0e8 + __IO uint32_t PREHEAT_CR; //0x0ec + __IO uint32_t RSV3[4]; //0x0f0~0xfc + __IO uint32_t DOT_CFG; //0x100 + __IO uint32_t IBF_DATA; //0x104 + __IO uint32_t RSV4[6]; //0x108~11c + __IO uint32_t DOT_RST[8]; //0x120~13c + + __IO uint32_t YMC_THRSLD; //0x140 + __IO uint32_t YMC_OT; //0x144 + __IO uint32_t YMC_ZEN; //0x148 + __IO uint32_t YMC_MEM; //0x14c + __IO uint32_t ZEN_RDATA; //0x150 + __IO uint32_t MEM_RDATA; //0x154 + __IO uint32_t LUTSUM_CUR; //0x158 + __IO uint32_t LUTSUM_LATCH; //0x15c + __IO uint32_t OTSUM_CUR; //0x160 + __IO uint32_t OTSUM_LATCH; //0x164 + + __IO uint32_t RSV5[6]; //0x168~0x17c + __IO uint32_t DATA_BASE2[16]; //0x180~0x1bc + __IO uint32_t DATA_BASE3[16]; //0x1c0~0x1fc +}HEAD_TypeDef; + +typedef struct +{ + __IO uint32_t LUT_n[128]; //0x200~3fc +}LUT_TypeDef; + +typedef struct +{ + __IO uint32_t FLT0; // Զn˼Ĵ0 + __IO uint32_t FLT1; + __IO uint32_t FLT2; + __IO uint32_t MASK0; // ԶnμĴ0 + __IO uint32_t MASK1; + __IO uint32_t MASK2; +}UDF_TypeDef; + +typedef struct +{ + __IO uint32_t DOT_DATA; //0x400 xݼĴ + __IO uint32_t WRITE_MODE; //0x404 + __IO uint32_t BUFF_RDATA; //0x408 ֻBUFFxжĴ + __IO uint32_t RSV0; //0x40c + __IO uint32_t FIXCMP_EN[14]; //0x410~444 ̶ȽʹܼĴ + __IO uint32_t RSV1[2]; //0x448~44c + __IO uint32_t FIX_RSTSEL[107]; //0x450~5f8 + __IO uint32_t RSV2[21]; //0x5fc~0x64c + __IO uint32_t UDFCMP_EN; //0x650 ԶȽʹܼĴ + __IO uint32_t UDF_RSTSEL0; //0x654 + __IO uint32_t UDF_RSTSEL1; //0x658 + __IO uint32_t RSV3; //0x65c + UDF_TypeDef UDF_P[8]; //0x660 +}DOT_TypeDef; + +typedef struct +{ + __IO uint32_t PRTH_CFG1; //0xa00 // PRTHn_CFG1 ӡnüĴ1 + __IO uint32_t PRTH_CFG2; //0xa04 + __IO uint32_t PRTH_CFG3; //0xa08 + __IO uint32_t PRTH_CFG4; //0xa0c + __IO uint32_t PRTH_CFG5; //0xa10 + __IO uint32_t PRTH_CFG6; //0xa14 + __IO uint32_t RSV0[2]; //0xa18 a1c +}HCFG_TypeDef; + +#define PRT_HCFG_LEN 256 +typedef struct +{ + HCFG_TypeDef PRT_HCFG[PRT_HCFG_LEN] ; // ӡνã256 +}LCFG_TypeDef; + + +///*----------------------- STM_PWM registers ------------------------*/ + +typedef struct +{ + // all registers are valid for stmpwm12 + // 0~0X24 registers are valid for stmpwm3456 + __IO uint32_t CTL; //0x00, PWM Control Register + __IO uint32_t CSR; //0x04, PWM Current Status Register + __IO uint32_t MSK_ISR; //0x08, PWM Masked Interrupt Status Register + __IO uint32_t ICLR; //0x0C, PWM Interrupt Clear Register + __IO uint32_t IENR; //0x10, PWM Interrupt Enable Register + __IO uint32_t CCR; //0x14, PWM Clock Control Register + __IO uint32_t LWR; //0x18, PWM Low Level Width Register + __IO uint32_t OPR; //0x1C, PWM Original Period Register + __IO uint32_t CNT; //0x20, PWM Counter Register + __IO uint32_t UMK_ISR; //0x24, PWM Unmasked Interrupt Status Register + + __IO uint32_t FINE_PH_CTL; //0x28, PWM FINE PH Control Register + __IO uint32_t FINEA_OPR; //0x2C, PWM FINEA Original Period Register + //---------------------------------------------------------------------------------- + __IO uint32_t CNTX_CTL; //0x30, PWM Counter X Control Register + __IO uint32_t CNT1_TH; //0x34, PWM Counter 1 Threshold Register + __IO uint32_t CNT1; //0x38, PWM Counter 1 Register + __IO uint32_t CNT2_TH; //0x3C, PWM Counter 2 Threshold Register + __IO uint32_t CNT2; //0x40, PWM Counter 2 Register + __IO uint32_t CNT3_TH; //0x44, PWM Counter 3Threshold Register + __IO uint32_t CNT3; //0x48, PWM Counter 3 Register + //---------------------------------------------------------------------------------- + __IO uint32_t CNTY_CTL; //0x4C, PWM Counter Y Control Register + __IO uint32_t CNTA_TH; //0x50, PWM Counter A Threshold Register + __IO uint32_t CNTA; //0x54, PWM Counter A Register + __IO uint32_t CNTB_TH; //0x58, PWM Counter B Threshold Register + __IO uint32_t CNTB; //0x5C, PWM Counter B Register + __IO uint32_t CNTC_TH; //0x60, PWM Counter C Threshold Register + __IO uint32_t CNTC; //0x64, PWM Counter C Register + //---------------------------------------------------------------------------------- + __IO uint32_t PWM1; //0x68, PWM PWMx Register + __IO uint32_t PWM2; //0x6C + __IO uint32_t PWM3; //0x70 + __IO uint32_t PWM4; //0x74 + __IO uint32_t PWM5; //0x78 + __IO uint32_t PWM6; //0x7C + __IO uint32_t PWM7; //0x80 + __IO uint32_t PWM8; //0x84 + __IO uint32_t PWM9; //0x88 + __IO uint32_t PWM10; //0x8C + __IO uint32_t PWM11; //0x90 + __IO uint32_t PWM12; //0x94 + __IO uint32_t PWM13; //0x98 + __IO uint32_t PWM14; //0x9C + __IO uint32_t PWM15; //0xA0 + __IO uint32_t PWM16; //0xA4 +}STMPWM_TypeDef; + +///*----------------------- DCM_PWM registers ------------------------*/ + +typedef struct +{ + //----------------------------------------------AREA1 + __IO uint32_t REG_DCM_PWM_CCR; //0x00 + __IO uint32_t REG_DCM_PWM_CFG; //0x04 + __IO uint32_t REG_DCM_PWM_SR; //0x08 + //----------------------------------------------AREA2 + __IO uint32_t REG_ENC_IN_CFG; //0x0C + __IO uint32_t REG_ENC_CNT; //0x10 + __IO uint32_t REG_ENC_CNT_CMP; //0x14 + __IO uint32_t REG_ENC_FLT_CFG; //0x18 + __IO uint32_t REG_SNS1_FLT_CFG; //0x1C + __IO uint32_t REG_SNS2_FLT_CFG; //0x20 + __IO uint32_t REG_SNS3_FLT_CFG; //0x24 + __IO uint32_t REG_TIMA_SET_VAL; //0x28 + __IO uint32_t REG_TIMA_LATCH; //0x2C + __IO uint32_t REG_TIMB_SET_VAL; //0x30 + __IO uint32_t REG_TIMB_LATCH; //0x34 + //----------------------------------------------AREA3 + __IO uint32_t REG_PWM_CYC_S1_S3;//0x38 + __IO uint32_t REG_PWM_CYC_TL_S2;//0x3C + __IO uint32_t REG_PWM_NUM_S1; //0x40 + __IO uint32_t REG_PWM_NUM_S2; //0x44 + __IO uint32_t REG_PWM_NUM_S3; //0x48 + __IO uint32_t REG_PWM_DIR; //0x4C + __IO uint32_t REG_DCM_PWM_IENR; //0x50 + __IO uint32_t REG_DCM_PWM_UMK_ISR;//0x54 + __IO uint32_t REG_DCM_PWM_MSK_ISR;//0x58 + __IO uint32_t REG_DCM_PWM_ICLR; //0x5C + __IO uint32_t REG_DCM_PWM_CNT; //0x60 +}DCM_PWM_TypeDef; // + + + +typedef struct +{ + //----------------------------------------------AREA1 + __IO uint32_t REG_DCM_PWM_CCR; //0x00 + __IO uint32_t REG_DCM_PWM_CFG; //0x04 + __IO uint32_t REG_DCM_PWM_SR; //0x08 +// //----------------------------------------------AREA2 +// __IO uint32_t REG_ENC_IN_CFG; +// __IO uint32_t REG_ENC_CNT; +// __IO uint32_t REG_ENC_CNT_CMP; +// __IO uint32_t REG_ENC_FLT_CFG; +// __IO uint32_t REG_SNS1_FLT_CFG; +// __IO uint32_t REG_SNS2_FLT_CFG; +// __IO uint32_t REG_SNS3_FLT_CFG; +// __IO uint32_t REG_TIMA_SET_VAL; +// __IO uint32_t REG_TIMA_LATCH; +// __IO uint32_t REG_TIMB_SET_VAL; +// __IO uint32_t REG_TIMB_LATCH; + //----------------------------------------------AREA3 + __IO uint32_t REG_PWM_CYC_S1_S3;//0x0C + __IO uint32_t REG_PWM_CYC_TL_S2;//0x10 + __IO uint32_t REG_PWM_NUM_S1; //0x14 + __IO uint32_t REG_PWM_NUM_S2; //0x18 + __IO uint32_t REG_PWM_NUM_S3; //0x1C + __IO uint32_t REG_PWM_DIR; //0x20 + __IO uint32_t REG_DCM_PWM_IENR; //0x24 + __IO uint32_t REG_DCM_PWM_UMK_ISR;//0x28 + __IO uint32_t REG_DCM_PWM_MSK_ISR;//0x2C + __IO uint32_t REG_DCM_PWM_ICLR; //0x30 + __IO uint32_t REG_DCM_PWM_CNT; //0x34 +}DCM_PWM_SE_TypeDef; // + + +// ԭĴṹ3ٴظ + +typedef struct +{ + __IO uint32_t REG_DCM_PWM_CCR; + __IO uint32_t REG_DCM_PWM_CFG; + __IO uint32_t REG_DCM_PWM_SR; +}DCM_PWM_AREA1_TypeDef; + + +typedef struct +{ + __IO uint32_t REG_ENC_IN_CFG; + __IO uint32_t REG_ENC_CNT; + __IO uint32_t REG_ENC_CNT_CMP; + __IO uint32_t REG_ENC_FLT_CFG; + __IO uint32_t REG_SNS1_FLT_CFG; + __IO uint32_t REG_SNS2_FLT_CFG; + __IO uint32_t REG_SNS3_FLT_CFG; + __IO uint32_t REG_TIMA_SET_VAL; + __IO uint32_t REG_TIMA_LATCH; + __IO uint32_t REG_TIMB_SET_VAL; + __IO uint32_t REG_TIMB_LATCH; +}DCM_PWM_AREA2_TypeDef; + + +typedef struct +{ + __IO uint32_t REG_PWM_CYC_S1_S3; + __IO uint32_t REG_PWM_CYC_TL_S2; + __IO uint32_t REG_PWM_NUM_S1; + __IO uint32_t REG_PWM_NUM_S2; + __IO uint32_t REG_PWM_NUM_S3; + __IO uint32_t REG_PWM_DIR; + __IO uint32_t REG_DCM_PWM_IENR; + __IO uint32_t REG_DCM_PWM_UMK_ISR; + __IO uint32_t REG_DCM_PWM_MSK_ISR; + __IO uint32_t REG_DCM_PWM_ICLR; + __IO uint32_t REG_DCM_PWM_CNT; +}DCM_PWM_AREA3_TypeDef; + + +///*----------------------- LPT registers ------------------------*/ + +typedef struct +{ + __IO uint32_t PARIF_MMR; //0x00 Parallel-Interface Master Mode Register + __IO uint32_t PARIF_DINR; //0x04 Parallel-Interface Data Input Register + __IO uint32_t PARIF_HMR; //0x08 Parallel-Interface Handshake Mode Register + __IO uint32_t RES; //0x0c + __IO uint32_t PARIF_TBAR; //0x10 Parallel-Interface Trigger Busy/Ack# Register + __IO uint32_t PARIF_CINR; //0x14 Parallel-Interface Control Input Register + __IO uint32_t PARIF_COUTR; //0x18 Parallel-Interface Control Output Register + __IO uint32_t PARIF_FCR; //0x1c Parallel-Interface Filter Configuration Register + __IO uint32_t PARIF_DATR; //0x20 Parallel-Interface Data Transparent Register + __IO uint32_t PARIF_NIBDR; //0x24 Parallel-Interface Nibble Data Register + __IO uint32_t PARIF_HMR2; //0x28 Parallel-Interface Handshake Mode Register2 + __IO uint32_t PARIF_ALR; //0x2c Parallel-Interface Ack# Load Register + __IO uint32_t PARIF_AWR; //0x30 Parallel-Interface Ack# Width Register + __IO uint32_t PARIF_BWR; //0x34 Parallel-Interface Busy Width Register + __IO uint32_t PARIF_ISR; //0x38 Parallel-Interface Interrupt Status Register + __IO uint32_t PARIF_IDBR; //0x3c Parallel-Interface ID Data Register + __IO uint32_t PARIF_RDBR; //0x40 Parallel-Interface Reverse Data Register + __IO uint32_t PARIF_NCR; //0x44 Parallel-Interface Nibble Mode Configure Register + __IO uint32_t PARIF_EXDBR; //0x48 Parallel-Interface Extra Data Register + __IO uint32_t PARIF_DTR; //0x4c Parallel-Interface Delay Timer1 Register + __IO uint32_t PARIF_DTR2; //0x50 Parallel-Interface Delay Timer2 Register + __IO uint32_t PARIF_RSTR; //0x54 Parallel-Interface Reset Register + __IO uint32_t PARIF_FRQR; //0x58 Parallel-Interface Data Request Enable Register + __IO uint32_t PARIF_FDR; //0x5c Parallel-Interface Data FIFO Deep Register + __IO uint32_t PARIF_TOR; //0x60 Parallel-Interface Data Request Timer Out Register + __IO uint32_t PARIF_DCNTR; //0x64 Parallel-Interface Data Counter Register + __IO uint32_t PARIF_NIBDR2; //0x68 Parallel-Interface Nibble Data Register2 + __IO uint32_t PARIF_EXR; //0x6c Parallel-Interface Extra Respond Register + __IO uint32_t PARIF_FCR2; //0x70 Parallel-Interface Filter Configuration Register2 + __IO uint32_t PARIF_PCKFR; //0x74 Parallel-Interface PCLK Frequency Register + __IO uint32_t PARIF_CK19DR; //0x78 Parallel-Interface CLK19 Divider Register + __IO uint32_t PARIF_FCR3; //0x7c Parallel-Interface Filter Configuration Register3 + __IO uint32_t PARIF_FCR4; //0x80 Parallel-Interface Filter Configuration Register4 + __IO uint32_t PARIF_DTR3; //0x84 Parallel-Interface Delay Timer3 Register +}LPT_TypeDef; + + +/*------------------------- USB OTG defined -------------------------*/ + +#define USB_OTG_GLOBAL_BASE 0x0000UL +#define USB_OTG_DEVICE_BASE 0x0800UL +#define USB_OTG_IN_ENDPOINT_BASE 0x0900UL +#define USB_OTG_OUT_ENDPOINT_BASE 0x0B00UL +#define USB_OTG_EP_REG_SIZE 0x0020UL +#define USB_OTG_HOST_BASE 0x0400UL +#define USB_OTG_HOST_PORT_BASE 0x0440UL +#define USB_OTG_HOST_CHANNEL_BASE 0x0500UL +#define USB_OTG_HOST_CHANNEL_SIZE 0x0020UL +#define USB_OTG_PCGCCTL_BASE 0x0E00UL +#define USB_OTG_FIFO_BASE 0x1000UL +#define USB_OTG_FIFO_SIZE 0x1000UL + +/*------------------------- Peripheral declatation -------------------------*/ + + +#define SYSCFG ( (SYSCFG_TypeDef *)SYSCFG_BASE_ADDR ) +#define RCC ( (RCC_TypeDef *)RCC_BASE_ADDR ) +#define GPIOA ( (GPIO_TypeDef *)GPIOA_BASE_ADDR ) +#define GPIOB ( (GPIO_TypeDef *)GPIOB_BASE_ADDR ) +#define GPIOC ( (GPIO_TypeDef *)GPIOC_BASE_ADDR ) +#define GPIOD ( (GPIO_TypeDef *)GPIOD_BASE_ADDR ) +#define GPIOE ( (GPIO_TypeDef *)GPIOE_BASE_ADDR ) +#define GPIOF ( (GPIO_TypeDef *)GPIOF_BASE_ADDR ) +#define GPIOG ( (GPIO_TypeDef *)GPIOG_BASE_ADDR ) +#define GPIOH ( (GPIO_TypeDef *)GPIOH_BASE_ADDR ) +#define GPIOI ( (GPIO_TypeDef *)GPIOI_BASE_ADDR ) +#define GPIOJ ( (GPIO_TypeDef *)GPIOJ_BASE_ADDR ) +#define GPIOK ( (GPIO_TypeDef *)GPIOK_BASE_ADDR ) +#define GPIOL ( (GPIO_TypeDef *)GPIOL_BASE_ADDR ) +#define GPIOM ( (GPIO_TypeDef *)GPIOM_BASE_ADDR ) +#define GPION ( (GPIO_TypeDef *)GPION_BASE_ADDR ) +#define GPIOO ( (GPIO_TypeDef *)GPIOO_BASE_ADDR ) +#define GPIOP ( (GPIO_TypeDef *)GPIOP_BASE_ADDR ) +#define GPIOQ ( (GPIO_TypeDef *)GPIOQ_BASE_ADDR ) +#define EXTI ( (EXTI_TypeDef *)EXTI_BASE_ADDR ) +#define DMA1 ( (DMA_TypeDef *)DMA1_BASE_ADDR ) +#define DMA1_Channel0 ( (DMA_Channel_TypeDef *)DMA1_CHANNEL0_BASE_ADDR ) +#define DMA1_Channel1 ( (DMA_Channel_TypeDef *)DMA1_CHANNEL1_BASE_ADDR ) +#define DMA1_Channel2 ( (DMA_Channel_TypeDef *)DMA1_CHANNEL2_BASE_ADDR ) +#define DMA1_Channel3 ( (DMA_Channel_TypeDef *)DMA1_CHANNEL3_BASE_ADDR ) +#define DMA1_Channel4 ( (DMA_Channel_TypeDef *)DMA1_CHANNEL4_BASE_ADDR ) +#define DMA1_Channel5 ( (DMA_Channel_TypeDef *)DMA1_CHANNEL5_BASE_ADDR ) +#define DMA1_Channel6 ( (DMA_Channel_TypeDef *)DMA1_CHANNEL6_BASE_ADDR ) +#define DMA1_Channel7 ( (DMA_Channel_TypeDef *)DMA1_CHANNEL7_BASE_ADDR ) +#define DMA2 ( (DMA_TypeDef *)DMA2_BASE_ADDR ) +#define DMA2_Channel0 ( (DMA_Channel_TypeDef *)DMA2_CHANNEL0_BASE_ADDR ) +#define DMA2_Channel1 ( (DMA_Channel_TypeDef *)DMA2_CHANNEL1_BASE_ADDR ) +#define DMA2_Channel2 ( (DMA_Channel_TypeDef *)DMA2_CHANNEL2_BASE_ADDR ) +#define DMA2_Channel3 ( (DMA_Channel_TypeDef *)DMA2_CHANNEL3_BASE_ADDR ) +#define DMA2_Channel4 ( (DMA_Channel_TypeDef *)DMA2_CHANNEL4_BASE_ADDR ) +#define DMA2_Channel5 ( (DMA_Channel_TypeDef *)DMA2_CHANNEL5_BASE_ADDR ) +#define DMA2_Channel6 ( (DMA_Channel_TypeDef *)DMA2_CHANNEL6_BASE_ADDR ) +#define DMA2_Channel7 ( (DMA_Channel_TypeDef *)DMA2_CHANNEL7_BASE_ADDR ) +#define TIM1 ( (TIM_TypeDef *)TIM1_BASE_ADDR ) +#define TIM2 ( (TIM_TypeDef *)TIM2_BASE_ADDR ) +#define TIM3 ( (TIM_TypeDef *)TIM3_BASE_ADDR ) +#define TIM4 ( (TIM_TypeDef *)TIM4_BASE_ADDR ) +#define TIM5 ( (TIM_TypeDef *)TIM5_BASE_ADDR ) +#define TIM6 ( (TIM_TypeDef *)TIM6_BASE_ADDR ) +#define TIM7 ( (TIM_TypeDef *)TIM7_BASE_ADDR ) +#define TIM8 ( (TIM_TypeDef *)TIM8_BASE_ADDR ) +#define TIM9 ( (TIM_TypeDef *)TIM9_BASE_ADDR ) +#define TIM10 ( (TIM_TypeDef *)TIM10_BASE_ADDR ) +#define TIM11 ( (TIM_TypeDef *)TIM11_BASE_ADDR ) +#define TIM12 ( (TIM_TypeDef *)TIM12_BASE_ADDR ) +#define TIM13 ( (TIM_TypeDef *)TIM13_BASE_ADDR ) +#define TIM14 ( (TIM_TypeDef *)TIM14_BASE_ADDR ) +#define TIM15 ( (TIM_TypeDef *)TIM15_BASE_ADDR ) +#define TIM16 ( (TIM_TypeDef *)TIM16_BASE_ADDR ) +#define TIM17 ( (TIM_TypeDef *)TIM17_BASE_ADDR ) +#define TIM18 ( (TIM_TypeDef *)TIM18_BASE_ADDR ) +#define TIM19 ( (TIM_TypeDef *)TIM19_BASE_ADDR ) +#define TIM20 ( (TIM_TypeDef *)TIM20_BASE_ADDR ) +#define TIM21 ( (TIM_TypeDef *)TIM21_BASE_ADDR ) +#define TIM22 ( (TIM_TypeDef *)TIM22_BASE_ADDR ) +#define TIM23 ( (TIM_TypeDef *)TIM23_BASE_ADDR ) +#define TIM24 ( (TIM_TypeDef *)TIM24_BASE_ADDR ) +#define TIM25 ( (TIM_TypeDef *)TIM25_BASE_ADDR ) +#define TIM26 ( (TIM_64BIT_TypeDef *)TIM26_BASE_ADDR ) +#define RTC ( (RTC_TypeDef *)RTC_BASE_ADDR ) +#define PMU ( (PMU_TypeDef *)PMU_BASE_ADDR ) +#define WDT ( (WDT_TypeDef *)WDT_BASE_ADDR ) +#define IWDT ( (IWDT_TypeDef *)IWDT_BASE_ADDR ) +#define I2S1 ( (I2S_TypeDef *)I2S1_BASE_ADDR ) +#define I2S2 ( (I2S_TypeDef *)I2S2_BASE_ADDR ) +#define I2S3 ( (I2S_TypeDef *)I2S3_BASE_ADDR ) +#define I2C1 ( (I2C_TypeDef *)I2C1_BASE_ADDR ) +#define I2C2 ( (I2C_TypeDef *)I2C2_BASE_ADDR ) +#define I2C3 ( (I2C_TypeDef *)I2C3_BASE_ADDR ) +#define I2C4 ( (I2C_TypeDef *)I2C4_BASE_ADDR ) +#define USART1 ( (USART_TypeDef *)USART1_BASE_ADDR ) +#define USART2 ( (USART_TypeDef *)USART2_BASE_ADDR ) +#define USART3 ( (USART_TypeDef *)USART3_BASE_ADDR ) +#define USART4 ( (USART_TypeDef *)USART4_BASE_ADDR ) +#define USART5 ( (USART_TypeDef *)USART5_BASE_ADDR ) +#define USART6 ( (USART_TypeDef *)USART6_BASE_ADDR ) +#define USART7 ( (USART_TypeDef *)USART7_BASE_ADDR ) +#define USART8 ( (USART_TypeDef *)USART8_BASE_ADDR ) +#define USART9 ( (USART_TypeDef *)USART9_BASE_ADDR ) +#define USART10 ( (USART_TypeDef *)USART10_BASE_ADDR ) +#define FDCAN1 ( (FDCAN_GlobalTypeDef *)FDCAN1_BASE_ADDR ) +#define FDCAN2 ( (FDCAN_GlobalTypeDef *)FDCAN2_BASE_ADDR ) +#define FDCAN3 ( (FDCAN_GlobalTypeDef *)FDCAN3_BASE_ADDR ) +#define LPTIM1 ( (LPTIM_TypeDef *)LPTIM1_BASE_ADDR ) +#define LPTIM2 ( (LPTIM_TypeDef *)LPTIM2_BASE_ADDR ) +#define LPTIM3 ( (LPTIM_TypeDef *)LPTIM3_BASE_ADDR ) +#define LPTIM4 ( (LPTIM_TypeDef *)LPTIM4_BASE_ADDR ) +#define LPTIM5 ( (LPTIM_TypeDef *)LPTIM5_BASE_ADDR ) +#define LPTIM6 ( (LPTIM_TypeDef *)LPTIM6_BASE_ADDR ) +#define LPUART1 ( (LPUART_TypeDef *)LPUART1_BASE_ADDR ) +#define EFUSE1 ( (EFUSE_TypeDef *)EFUSE1_BASE_ADDR ) +#define EFUSE2 ( (EFUSE_TypeDef *)EFUSE2_BASE_ADDR ) +#define COMP1 ( (COMP_TypeDef *)COMP1_BASE_ADDR ) +#define TKEY ( (TKEY_TypeDef *)TKEY_BASE_ADDR ) +#define LTDC ( (LTDC_TypeDef *)LTDC_BASE_ADDR ) +#define MDAC ( (MDAC_TypeDef *)MDAC_BASE_ADDR ) + + +#define CRC ( (CRC_TypeDef *)CRC_BASE_ADDR ) +#define ETH ( (ETH_TypeDef *)ETHMAC_BASE_ADDR ) +#define DMA2D ( (DMA2D_TypeDef *)DMA2D_BASE_ADDR ) +#define SPI1 ( (SPI_TypeDef *)SPI1_BASE_ADDR ) +#define SPI2 ( (SPI_TypeDef *)SPI2_BASE_ADDR ) +#define SPI3 ( (SPI_TypeDef *)SPI3_BASE_ADDR ) +#define SPI4 ( (SPI_TypeDef *)SPI4_BASE_ADDR ) +#define SPI5 ( (SPI_TypeDef *)SPI5_BASE_ADDR ) +#define SPI6 ( (SPI_TypeDef *)SPI6_BASE_ADDR ) +#define SPI7 ( (SPI_TypeDef *)SPI7_BASE_ADDR ) +#define SPI8 ( (SPI_TypeDef *)SPI8_BASE_ADDR ) +#define USB_OTG_HS1 ( (USB_OTG_GlobalTypeDef *) USBOTG_HS1_BASE_ADDR ) +#define USB_OTG_HS2 ( (USB_OTG_GlobalTypeDef *) USBOTG_HS2_BASE_ADDR ) +#define USBOTG_PHY1 ( (USBOTG_PHY_TypeDef *)USBOTG_PHY1_BASE_ADDR ) +#define USBOTG_PHY2 ( (USBOTG_PHY_TypeDef *)USBOTG_PHY2_BASE_ADDR ) +#define ADC1 ( (ADC_TypeDef *)ADC1_BASE_ADDR ) +#define ADC2 ( (ADC_TypeDef *)ADC2_BASE_ADDR ) +#define ADC12_COMMON ( (ADC_Common_TypeDef *)(ADC1_BASE_ADDR + 0x0300UL) ) +#define ADC3 ( (ADC_TypeDef *)ADC3_BASE_ADDR ) +#define ADC3_COMMON ( (ADC_Common_TypeDef *)(ADC3_BASE_ADDR + 0x0300UL) ) +#define DAC1 ( (DAC_TypeDef *)DAC1_BASE_ADDR ) +#define DAC2 ( (DAC_TypeDef *)DAC2_BASE_ADDR ) +#define DCMI ( (DCMI_TypeDef *)DCMI_BASE_ADDR ) +#define AES ( (AES_TypeDef *)AES_BASE_ADDR ) +#define CORDIC ( (CORDIC_TypeDef *)CORDIC_BASE_ADDR ) +#define HRNG ( (HRNG_TypeDef *)HRNG_BASE_ADDR ) +#define HASH ( (HASH_TypeDef *)HASH_BASE_ADDR ) + +#define FMC_NORSRAM ( (FMC_NORSRAM_TypeDef *)FMC_REG_BASE_ADDR ) +#define FMC_SDRAM ( (FMC_SDRAM_TypeDef *)(FMC_REG_BASE_ADDR + 0x0140UL) ) +#define FMC_NAND ( (FMC_NAND_TypeDef *)(FMC_REG_BASE_ADDR + 0x0200UL) ) +#define OSPI1 ( (OSPI_TypeDef *) OSPI1_BASE_ADDR ) +#define OSPI2 ( (OSPI_TypeDef *) OSPI2_BASE_ADDR ) + +#define USB1_DLYB ( (DLYB_TypeDef *) USB1_DLYB_REG_BASE_ADDR ) +#define ETH_DLYB ( (DLYB_TypeDef *) ETH_DLYB_REG_BASE_ADDR ) +#define SDMMC_DLYBS ( (DLYB_TypeDef *) SDIO_DLYBS_REG_BASE_ADDR ) +#define SDMMC_DLYBD ( (DLYB_TypeDef *) SDIO_DLYBD_REG_BASE_ADDR ) +#define OSPI1_DLYB ( (DLYB_TypeDef *) OSPI1_DLYB_REG_BASE_ADDR ) +#define OSPI2_DLYB ( (DLYB_TypeDef *) OSPI2_DLYB_REG_BASE_ADDR ) +#define SDMMC_SAMPLE_DLYB ( (DLYB_TypeDef *)SDIO_DLYBS_REG_BASE_ADDR ) +#define SDMMC_DRIVE_DLYB ( (DLYB_TypeDef *)SDIO_DLYBD_REG_BASE_ADDR ) +#define AES_SPI1 ( (AES_SPI_TypeDef *)AES_SPI1_BASE_ADDR ) +#define SDMMC ( (SDMMC_TypeDef *)SDIO_BASE_ADDR ) +#define USBOTG1_PHYC ( (USB_HS_PHYC_GlobalTypeDef *)USBOTG1_PHYC_BASE_ADDR ) +#define USBOTG2_PHYC ( (USB_HS_PHYC_GlobalTypeDef *)USBOTG2_PHYC_BASE_ADDR ) + +///*------------------------- printer Peripheral declatation -------------------------*/ +#define NDL ( (NDL_TypeDef *)NDL_BASE_ADDR ) + +#define HEAD ( (HEAD_TypeDef *)HEAD_BASE_ADDR) +#define LUT ( (LUT_TypeDef *)LUT_BASE_ADDR) +#define DOT1 ( (DOT_TypeDef *)DOT1_BASE_ADDR) +#define DOT2 ( (DOT_TypeDef *)DOT2_BASE_ADDR) +#define DOT3 ( (DOT_TypeDef *)DOT3_BASE_ADDR) +#define LCFG ( (LCFG_TypeDef *)LCFG_BASE_ADDR) + +#define STMPWM1 ( (STMPWM_TypeDef *)STM1_PWM_BASE_ADDR ) +#define STMPWM2 ( (STMPWM_TypeDef *)STM2_PWM_BASE_ADDR ) +#define STMPWM3 ( (STMPWM_TypeDef *)STM3_PWM_BASE_ADDR ) // 򻯰棬ֻ0x00~0x24Ĵ +#define STMPWM4 ( (STMPWM_TypeDef *)STM4_PWM_BASE_ADDR ) // 򻯰棬ֻ0x00~0x24Ĵ +#define STMPWM5 ( (STMPWM_TypeDef *)STM5_PWM_BASE_ADDR ) // 򻯰棬ֻ0x00~0x24Ĵ +#define STMPWM6 ( (STMPWM_TypeDef *)STM6_PWM_BASE_ADDR ) // 򻯰棬ֻ0x00~0x24Ĵ + +#define DCMPWM1 ( (DCM_PWM_TypeDef *)DCM1_PWM_BASE_ADDR ) +#define DCMPWM2 ( (DCM_PWM_TypeDef *)DCM2_PWM_BASE_ADDR ) +#define DCMPWM3 ( (DCM_PWM_TypeDef *)DCM3_PWM_BASE_ADDR ) +#define DCMPWM4 ( (DCM_PWM_TypeDef *)DCM4_PWM_BASE_ADDR ) +#define DCMPWM5 ( (DCM_PWM_SE_TypeDef *)DCM5_PWM_BASE_ADDR ) +#define DCMPWM6 ( (DCM_PWM_SE_TypeDef *)DCM6_PWM_BASE_ADDR ) + +#define DCMPWM1_AREA1 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM1_AREA1_ADDR) +#define DCMPWM2_AREA1 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM2_AREA1_ADDR) +#define DCMPWM3_AREA1 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM3_AREA1_ADDR) +#define DCMPWM4_AREA1 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM4_AREA1_ADDR) +#define DCMPWM5_AREA1 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM5_AREA1_ADDR) +#define DCMPWM6_AREA1 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM6_AREA1_ADDR) + +#define DCMPWM1_AREA2 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM1_AREA2_ADDR) +#define DCMPWM2_AREA2 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM2_AREA2_ADDR) +#define DCMPWM3_AREA2 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM3_AREA2_ADDR) +#define DCMPWM4_AREA2 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM4_AREA2_ADDR) + +#define DCMPWM1_AREA3 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM1_AREA3_ADDR) +#define DCMPWM2_AREA3 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM2_AREA3_ADDR) +#define DCMPWM3_AREA3 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM3_AREA3_ADDR) +#define DCMPWM4_AREA3 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM4_AREA3_ADDR) +#define DCMPWM5_AREA3 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM5_AREA3_ADDR) +#define DCMPWM6_AREA3 ( (DCM_PWM_AREA1_TypeDef *)DCMPWM6_AREA3_ADDR) +#define LPT ( (LPT_TypeDef *)LPT_BASE_ADDR ) + +/*------------------ Peripheral_Registers_Bits_Definition ------------------*/ + +/*************** Bits definition for SYSCFG_SYSCR **********************/ + +#define SYSCFG_SYSCR_ETHMAC_RX_DLYSEL_Pos ( 20U ) +#define SYSCFG_SYSCR_ETHMAC_RX_DLYSEL_Msk ( 0x1UL << SYSCFG_SYSCR_ETHMAC_RX_DLYSEL_Pos ) +#define SYSCFG_SYSCR_ETHMAC_RX_DLYSEL ( SYSCFG_SYSCR_ETHMAC_RX_DLYSEL_Msk ) + +#define SYSCFG_SYSCR_BOOT_PUN_Pos ( 19U ) +#define SYSCFG_SYSCR_BOOT_PUN_Msk ( 0x1UL << SYSCFG_SYSCR_BOOT_PUN_Pos ) +#define SYSCFG_SYSCR_BOOT_PUN ( SYSCFG_SYSCR_BOOT_PUN_Msk ) + +#define SYSCFG_SYSCR_IR_MODE_Pos ( 17U ) +#define SYSCFG_SYSCR_IR_MODE_Msk ( 0x3UL << SYSCFG_SYSCR_IR_MODE_Pos ) +#define SYSCFG_SYSCR_IR_MODE ( SYSCFG_SYSCR_IR_MODE_Msk ) +#define SYSCFG_SYSCR_IR_MODE_0 ( 0x1UL << SYSCFG_SYSCR_IR_MODE_Pos ) +#define SYSCFG_SYSCR_IR_MODE_1 ( 0x2UL << SYSCFG_SYSCR_IR_MODE_Pos ) + +#define SYSCFG_SYSCR_IR_POL_Pos ( 16U ) +#define SYSCFG_SYSCR_IR_POL_Msk ( 0x1UL << SYSCFG_SYSCR_IR_POL_Pos ) +#define SYSCFG_SYSCR_IR_POL ( SYSCFG_SYSCR_IR_POL_Msk ) + +#define SYSCFG_SYSCR_EPIS_Pos ( 13U ) +#define SYSCFG_SYSCR_EPIS_Msk ( 0x7UL << SYSCFG_SYSCR_EPIS_Pos ) +#define SYSCFG_SYSCR_EPIS ( SYSCFG_SYSCR_EPIS_Msk ) +#define SYSCFG_SYSCR_EPIS_0 ( 0x1UL << SYSCFG_SYSCR_EPIS_Pos ) +#define SYSCFG_SYSCR_EPIS_1 ( 0x2UL << SYSCFG_SYSCR_EPIS_Pos ) +#define SYSCFG_SYSCR_EPIS_2 ( 0x4UL << SYSCFG_SYSCR_EPIS_Pos ) + +#define SYSCFG_SYSCR_ETHMAC_TX_CLKGE_Pos ( 12U ) +#define SYSCFG_SYSCR_ETHMAC_TX_CLKGE_Msk ( 0x1UL << SYSCFG_SYSCR_ETHMAC_TX_CLKGE_Pos ) +#define SYSCFG_SYSCR_ETHMAC_TX_CLKGE ( SYSCFG_SYSCR_ETHMAC_TX_CLKGE_Msk ) + +#define SYSCFG_SYSCR_BKPSRAM_LOCK_Pos ( 11U ) +#define SYSCFG_SYSCR_BKPSRAM_LOCK_Msk ( 0x1UL << SYSCFG_SYSCR_BKPSRAM_LOCK_Pos ) +#define SYSCFG_SYSCR_BKPSRAM_LOCK ( SYSCFG_SYSCR_BKPSRAM_LOCK_Msk ) + +#define SYSCFG_SYSCR_SRAM3_LOCK_Pos ( 10U ) +#define SYSCFG_SYSCR_SRAM3_LOCK_Msk ( 0x1UL << SYSCFG_SYSCR_SRAM3_LOCK_Pos ) +#define SYSCFG_SYSCR_SRAM3_LOCK ( SYSCFG_SYSCR_SRAM3_LOCK_Msk ) + +#define SYSCFG_SYSCR_SRAM1_LOCK_Pos ( 9U ) +#define SYSCFG_SYSCR_SRAM1_LOCK_Msk ( 0x1UL << SYSCFG_SYSCR_SRAM1_LOCK_Pos ) +#define SYSCFG_SYSCR_SRAM1_LOCK ( SYSCFG_SYSCR_SRAM1_LOCK_Msk ) + +#define SYSCFG_SYSCR_SDRAM_IO_SWP_Pos ( 7U ) +#define SYSCFG_SYSCR_SDRAM_IO_SWP_Msk ( 0x1UL << SYSCFG_SYSCR_SDRAM_IO_SWP_Pos ) +#define SYSCFG_SYSCR_SDRAM_IO_SWP ( SYSCFG_SYSCR_SDRAM_IO_SWP_Msk ) + +#define SYSCFG_SYSCR_FMC_SWP_Pos ( 4U ) +#define SYSCFG_SYSCR_FMC_SWP_Msk ( 0x3UL << SYSCFG_SYSCR_FMC_SWP_Pos ) +#define SYSCFG_SYSCR_FMC_SWP ( SYSCFG_SYSCR_FMC_SWP_Msk ) +#define SYSCFG_SYSCR_FMC_SWP_0 ( 0x1UL << SYSCFG_SYSCR_FMC_SWP_Pos ) +#define SYSCFG_SYSCR_FMC_SWP_1 ( 0x2UL << SYSCFG_SYSCR_FMC_SWP_Pos ) + +#define SYSCFG_SYSCR_LVD_LOCK_Pos ( 2U ) +#define SYSCFG_SYSCR_LVD_LOCK_Msk ( 0x1UL << SYSCFG_SYSCR_LVD_LOCK_Pos ) +#define SYSCFG_SYSCR_LVD_LOCK ( SYSCFG_SYSCR_LVD_LOCK_Msk ) + +#define SYSCFG_SYSCR_LOCKUP_LOCK_Pos ( 0U ) +#define SYSCFG_SYSCR_LOCKUP_LOCK_Msk ( 0x1UL << SYSCFG_SYSCR_LOCKUP_LOCK_Pos ) +#define SYSCFG_SYSCR_LOCKUP_LOCK ( SYSCFG_SYSCR_LOCKUP_LOCK_Msk ) + + +/*************** Bits definition for SYSCFG_WMR **********************/ + +#define SYSCFG_WMR_BOOTDEVICE_Pos ( 8U ) +#define SYSCFG_WMR_BOOTDEVICE_Msk ( 0x3UL << SYSCFG_WMR_RTC_READY_Pos ) +#define SYSCFG_WMR_BOOTDEVICE ( SYSCFG_WMR_RTC_READY_Msk ) + +#define SYSCFG_WMR_RTCREADY_Pos ( 6U ) +#define SYSCFG_WMR_RTCREADY_Msk ( 0x1UL << SYSCFG_WMR_RTCREADY_Pos ) +#define SYSCFG_WMR_RTCREADY ( SYSCFG_WMR_RTCREADY_Msk ) + +#define SYSCFG_WMR_BOOTMODE_Pos ( 3U ) +#define SYSCFG_WMR_BOOTMODE_Msk ( 0x1UL << SYSCFG_WMR_BOOTMODE_Pos ) +#define SYSCFG_WMR_BOOTMODE ( SYSCFG_WMR_BOOTMODE_Msk ) + + +/*************** Bits definition for SYSCFG_VER **********************/ + +#define SYSCFG_VER_VERSION_Pos ( 0U ) +#define SYSCFG_VER_VERSION_Msk ( 0xffffffffUL << SYSCFG_VER_VERSION_Pos ) +#define SYSCFG_VER_VERSION ( SYSCFG_VER_VERSION_Msk ) + + +/*************** Bits definition for SYSCFG_PHYCFG **********************/ + +#define SYSCFG_PHYCFG_USB1_ULPI_DLYSEL_Pos ( 8U ) +#define SYSCFG_PHYCFG_USB1_ULPI_DLYSEL_Msk ( 0x1UL << SYSCFG_PHYCFG_USB1_ULPI_DLYSEL_Pos ) +#define SYSCFG_PHYCFG_USB1_ULPI_DLYSEL ( SYSCFG_PHYCFG_USB1_ULPI_DLYSEL_Msk ) + +#define SYSCFG_PHYCFG_USB2_PHY_RSTN_Pos ( 4U ) +#define SYSCFG_PHYCFG_USB2_PHY_RSTN_Msk ( 0x1UL << SYSCFG_PHYCFG_USB2_PHY_RSTN_Pos ) +#define SYSCFG_PHYCFG_USB2_PHY_RSTN ( SYSCFG_PHYCFG_USB2_PHY_RSTN_Msk ) + +#define SYSCFG_PHYCFG_USB1_PHY_RSTN_Pos ( 0U ) +#define SYSCFG_PHYCFG_USB1_PHY_RSTN_Msk ( 0x1UL << SYSCFG_PHYCFG_USB1_PHY_RSTN_Pos ) +#define SYSCFG_PHYCFG_USB1_PHY_RSTN ( SYSCFG_PHYCFG_USB1_PHY_RSTN_Msk ) + +/*************** Bits definition for SYSCFG_RAMECCIR **********************/ + +#define SYSCFG_RAMECCIR_BKPSRAM_DED_IE_Pos ( 9U ) +#define SYSCFG_RAMECCIR_BKPSRAM_DED_IE_Msk ( 0x1UL << SYSCFG_RAMECCIR_BKPSRAM_DED_IE_Pos ) +#define SYSCFG_RAMECCIR_BKPSRAM_DED_IE ( SYSCFG_RAMECCIR_BKPSRAM_DED_IE_Msk ) + +#define SYSCFG_RAMECCIR_BKPSRAM_SEC_IE_Pos ( 8U ) +#define SYSCFG_RAMECCIR_BKPSRAM_SEC_IE_Msk ( 0x1UL << SYSCFG_RAMECCIR_BKPSRAM_SEC_IE_Pos ) +#define SYSCFG_RAMECCIR_BKPSRAM_SEC_IE ( SYSCFG_RAMECCIR_BKPSRAM_SEC_IE_Msk ) + +#define SYSCFG_RAMECCIR_SRAM3_DED_IE_Pos ( 5U ) +#define SYSCFG_RAMECCIR_SRAM3_DED_IE_Msk ( 0x1UL << SYSCFG_RAMECCIR_SRAM3_DED_IE_Pos ) +#define SYSCFG_RAMECCIR_SRAM3_DED_IE ( SYSCFG_RAMECCIR_SRAM3_DED_IE_Msk ) + +#define SYSCFG_RAMECCIR_SRAM3_SEC_IE_Pos ( 4U ) +#define SYSCFG_RAMECCIR_SRAM3_SEC_IE_Msk ( 0x1UL << SYSCFG_RAMECCIR_SRAM3_SEC_IE_Pos ) +#define SYSCFG_RAMECCIR_SRAM3_SEC_IE ( SYSCFG_RAMECCIR_SRAM3_SEC_IE_Msk ) + +#define SYSCFG_RAMECCIR_SRAM1_DED_IE_Pos ( 1U ) +#define SYSCFG_RAMECCIR_SRAM1_DED_IE_Msk ( 0x1UL << SYSCFG_RAMECCIR_SRAM1_DED_IE_Pos ) +#define SYSCFG_RAMECCIR_SRAM1_DED_IE ( SYSCFG_RAMECCIR_SRAM1_DED_IE_Msk ) + +#define SYSCFG_RAMECCIR_SRAM1_SEC_IE_Pos ( 0U ) +#define SYSCFG_RAMECCIR_SRAM1_SEC_IE_Msk ( 0x1UL << SYSCFG_RAMECCIR_SRAM1_SEC_IE_Pos ) +#define SYSCFG_RAMECCIR_SRAM1_SEC_IE ( SYSCFG_RAMECCIR_SRAM1_SEC_IE_Msk ) + + +/*************** Bits definition for SYSCFG_RAMECCSR **********************/ + +#define SYSCFG_RAMECCSR_BKPSRAM_DED_IF_Pos ( 9U ) +#define SYSCFG_RAMECCSR_BKPSRAM_DED_IF_Msk ( 0x1UL << SYSCFG_RAMECCSR_BKPSRAM_DED_IF_Pos ) +#define SYSCFG_RAMECCSR_BKPSRAM_DED_IF ( SYSCFG_RAMECCSR_BKPSRAM_DED_IF_Msk ) + +#define SYSCFG_RAMECCSR_BKPSRAM_SEC_IF_Pos ( 8U ) +#define SYSCFG_RAMECCSR_BKPSRAM_SEC_IF_Msk ( 0x1UL << SYSCFG_RAMECCSR_BKPSRAM_SEC_IF_Pos ) +#define SYSCFG_RAMECCSR_BKPSRAM_SEC_IF ( SYSCFG_RAMECCSR_BKPSRAM_SEC_IF_Msk ) + +#define SYSCFG_RAMECCSR_SRAM3_DED_IF_Pos ( 5U ) +#define SYSCFG_RAMECCSR_SRAM3_DED_IF_Msk ( 0x1UL << SYSCFG_RAMECCSR_SRAM3_DED_IF_Pos ) +#define SYSCFG_RAMECCSR_SRAM3_DED_IF ( SYSCFG_RAMECCSR_SRAM3_DED_IF_Msk ) + +#define SYSCFG_RAMECCSR_SRAM3_SEC_IF_Pos ( 4U ) +#define SYSCFG_RAMECCSR_SRAM3_SEC_IF_Msk ( 0x1UL << SYSCFG_RAMECCSR_SRAM3_SEC_IF_Pos ) +#define SYSCFG_RAMECCSR_SRAM3_SEC_IF ( SYSCFG_RAMECCSR_SRAM3_SEC_IF_Msk ) + +#define SYSCFG_RAMECCSR_SRAM1_DED_IF_Pos ( 1U ) +#define SYSCFG_RAMECCSR_SRAM1_DED_IF_Msk ( 0x1UL << SYSCFG_RAMECCSR_SRAM1_DED_IF_Pos ) +#define SYSCFG_RAMECCSR_SRAM1_DED_IF ( SYSCFG_RAMECCSR_SRAM1_DED_IF_Msk ) + +#define SYSCFG_RAMECCSR_SRAM1_SEC_IF_Pos ( 0U ) +#define SYSCFG_RAMECCSR_SRAM1_SEC_IF_Msk ( 0x1UL << SYSCFG_RAMECCSR_SRAM1_SEC_IF_Pos ) +#define SYSCFG_RAMECCSR_SRAM1_SEC_IF ( SYSCFG_RAMECCSR_SRAM1_SEC_IF_Msk ) + + +/*************** Bits definition for SYSCFG_RAMECCICR **********************/ + +#define SYSCFG_RAMECCICR_BKPSRAM_DED_IC_Pos ( 9U ) +#define SYSCFG_RAMECCICR_BKPSRAM_DED_IC_Msk ( 0x1UL << SYSCFG_RAMECCICR_BKPSRAM_DED_IC_Pos ) +#define SYSCFG_RAMECCICR_BKPSRAM_DED_IC ( SYSCFG_RAMECCICR_BKPSRAM_DED_IC_Msk ) + +#define SYSCFG_RAMECCICR_BKPSRAM_SEC_IC_Pos ( 8U ) +#define SYSCFG_RAMECCICR_BKPSRAM_SEC_IC_Msk ( 0x1UL << SYSCFG_RAMECCICR_BKPSRAM_SEC_IC_Pos ) +#define SYSCFG_RAMECCICR_BKPSRAM_SEC_IC ( SYSCFG_RAMECCICR_BKPSRAM_SEC_IC_Msk ) + +#define SYSCFG_RAMECCICR_SRAM3_DED_IC_Pos ( 5U ) +#define SYSCFG_RAMECCICR_SRAM3_DED_IC_Msk ( 0x1UL << SYSCFG_RAMECCICR_SRAM3_DED_IC_Pos ) +#define SYSCFG_RAMECCICR_SRAM3_DED_IC ( SYSCFG_RAMECCICR_SRAM3_DED_IC_Msk ) + +#define SYSCFG_RAMECCICR_SRAM3_SEC_IC_Pos ( 4U ) +#define SYSCFG_RAMECCICR_SRAM3_SEC_IC_Msk ( 0x1UL << SYSCFG_RAMECCICR_SRAM3_SEC_IC_Pos ) +#define SYSCFG_RAMECCICR_SRAM3_SEC_IC ( SYSCFG_RAMECCICR_SRAM3_SEC_IC_Msk ) + +#define SYSCFG_RAMECCICR_SRAM1_DED_IC_Pos ( 1U ) +#define SYSCFG_RAMECCICR_SRAM1_DED_IC_Msk ( 0x1UL << SYSCFG_RAMECCICR_SRAM1_DED_IC_Pos ) +#define SYSCFG_RAMECCICR_SRAM1_DED_IC ( SYSCFG_RAMECCICR_SRAM1_DED_IC_Msk ) + +#define SYSCFG_RAMECCICR_SRAM1_SEC_IC_Pos ( 0U ) +#define SYSCFG_RAMECCICR_SRAM1_SEC_IC_Msk ( 0x1UL << SYSCFG_RAMECCICR_SRAM1_SEC_IC_Pos ) +#define SYSCFG_RAMECCICR_SRAM1_SEC_IC ( SYSCFG_RAMECCICR_SRAM1_SEC_IC_Msk ) + + +/*************** Bits definition for SYSCFG_GPIO5VOCR1 **********************/ + +#define SYSCFG_GPIO5VOCR1_PK13OE5V_Pos ( 31U ) +#define SYSCFG_GPIO5VOCR1_PK13OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK13OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK13OE5V ( SYSCFG_GPIO5VOCR1_PK13OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PK12OE5V_Pos ( 30U ) +#define SYSCFG_GPIO5VOCR1_PK12OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK12OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK12OE5V ( SYSCFG_GPIO5VOCR1_PK12OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PK11OE5V_Pos ( 29U ) +#define SYSCFG_GPIO5VOCR1_PK11OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK11OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK11OE5V ( SYSCFG_GPIO5VOCR1_PK11OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PK10OE5V_Pos ( 28U ) +#define SYSCFG_GPIO5VOCR1_PK10OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK10OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK10OE5V ( SYSCFG_GPIO5VOCR1_PK10OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PK9OE5V_Pos ( 27U ) +#define SYSCFG_GPIO5VOCR1_PK9OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK9OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK9OE5V ( SYSCFG_GPIO5VOCR1_PK9OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PK8OE5V_Pos ( 26U ) +#define SYSCFG_GPIO5VOCR1_PK8OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK8OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK8OE5V ( SYSCFG_GPIO5VOCR1_PK8OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PK7OE5V_Pos ( 25U ) +#define SYSCFG_GPIO5VOCR1_PK7OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK7OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK7OE5V ( SYSCFG_GPIO5VOCR1_PK7OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PK6OE5V_Pos ( 24U ) +#define SYSCFG_GPIO5VOCR1_PK6OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK6OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK6OE5V ( SYSCFG_GPIO5VOCR1_PK6OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PK5OE5V_Pos ( 23U ) +#define SYSCFG_GPIO5VOCR1_PK5OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK5OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK5OE5V ( SYSCFG_GPIO5VOCR1_PK5OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PK4OE5V_Pos ( 22U ) +#define SYSCFG_GPIO5VOCR1_PK4OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK4OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK4OE5V ( SYSCFG_GPIO5VOCR1_PK4OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PK3OE5V_Pos ( 21U ) +#define SYSCFG_GPIO5VOCR1_PK3OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK3OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK3OE5V ( SYSCFG_GPIO5VOCR1_PK3OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PK2OE5V_Pos ( 20U ) +#define SYSCFG_GPIO5VOCR1_PK2OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK2OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK2OE5V ( SYSCFG_GPIO5VOCR1_PK2OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PK1OE5V_Pos ( 19U ) +#define SYSCFG_GPIO5VOCR1_PK1OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK1OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK1OE5V ( SYSCFG_GPIO5VOCR1_PK1OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PK0OE5V_Pos ( 18U ) +#define SYSCFG_GPIO5VOCR1_PK0OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PK0OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PK0OE5V ( SYSCFG_GPIO5VOCR1_PK0OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PJ15OE5V_Pos ( 17U ) +#define SYSCFG_GPIO5VOCR1_PJ15OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PJ15OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PJ15OE5V ( SYSCFG_GPIO5VOCR1_PJ15OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PJ14OE5V_Pos ( 16U ) +#define SYSCFG_GPIO5VOCR1_PJ14OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PJ14OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PJ14OE5V ( SYSCFG_GPIO5VOCR1_PJ14OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PJ13OE5V_Pos ( 15U ) +#define SYSCFG_GPIO5VOCR1_PJ13OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PJ13OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PJ13OE5V ( SYSCFG_GPIO5VOCR1_PJ13OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PJ12OE5V_Pos ( 14U ) +#define SYSCFG_GPIO5VOCR1_PJ12OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PJ12OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PJ12OE5V ( SYSCFG_GPIO5VOCR1_PJ12OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PJ11OE5V_Pos ( 13U ) +#define SYSCFG_GPIO5VOCR1_PJ11OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PJ11OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PJ11OE5V ( SYSCFG_GPIO5VOCR1_PJ11OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PJ10OE5V_Pos ( 12U ) +#define SYSCFG_GPIO5VOCR1_PJ10OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PJ10OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PJ10OE5V ( SYSCFG_GPIO5VOCR1_PJ10OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PJ9OE5V_Pos ( 11U ) +#define SYSCFG_GPIO5VOCR1_PJ9OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PJ9OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PJ9OE5V ( SYSCFG_GPIO5VOCR1_PJ9OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PJ8OE5V_Pos ( 10U ) +#define SYSCFG_GPIO5VOCR1_PJ8OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PJ8OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PJ8OE5V ( SYSCFG_GPIO5VOCR1_PJ8OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PJ7OE5V_Pos ( 9U ) +#define SYSCFG_GPIO5VOCR1_PJ7OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PJ7OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PJ7OE5V ( SYSCFG_GPIO5VOCR1_PJ7OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PJ6OE5V_Pos ( 8U ) +#define SYSCFG_GPIO5VOCR1_PJ6OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PJ6OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PJ6OE5V ( SYSCFG_GPIO5VOCR1_PJ6OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PI14OE5V_Pos ( 7U ) +#define SYSCFG_GPIO5VOCR1_PI14OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PI14OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PI14OE5V ( SYSCFG_GPIO5VOCR1_PI14OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PH12OE5V_Pos ( 6U ) +#define SYSCFG_GPIO5VOCR1_PH12OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PH12OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PH12OE5V ( SYSCFG_GPIO5VOCR1_PH12OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PH11OE5V_Pos ( 5U ) +#define SYSCFG_GPIO5VOCR1_PH11OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PH11OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PH11OE5V ( SYSCFG_GPIO5VOCR1_PH11OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PH10OE5V_Pos ( 4U ) +#define SYSCFG_GPIO5VOCR1_PH10OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PH10OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PH10OE5V ( SYSCFG_GPIO5VOCR1_PH10OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PH9OE5V_Pos ( 3U ) +#define SYSCFG_GPIO5VOCR1_PH9OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PH9OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PH9OE5V ( SYSCFG_GPIO5VOCR1_PH9OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PH8OE5V_Pos ( 2U ) +#define SYSCFG_GPIO5VOCR1_PH8OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PH8OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PH8OE5V ( SYSCFG_GPIO5VOCR1_PH8OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PH7OE5V_Pos ( 1U ) +#define SYSCFG_GPIO5VOCR1_PH7OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PH7OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PH7OE5V ( SYSCFG_GPIO5VOCR1_PH7OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR1_PH6OE5V_Pos ( 0U ) +#define SYSCFG_GPIO5VOCR1_PH6OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR1_PH6OE5V_Pos ) +#define SYSCFG_GPIO5VOCR1_PH6OE5V ( SYSCFG_GPIO5VOCR1_PH6OE5V_Msk ) + + +/*************** Bits definition for SYSCFG_GPIO5VOCR2 **********************/ + +#define SYSCFG_GPIO5VOCR2_PP15OE5V_Pos ( 17U ) +#define SYSCFG_GPIO5VOCR2_PP15OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PP15OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PP15OE5V ( SYSCFG_GPIO5VOCR2_PP15OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PP14OE5V_Pos ( 16U ) +#define SYSCFG_GPIO5VOCR2_PP14OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PP14OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PP14OE5V ( SYSCFG_GPIO5VOCR2_PP14OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PP13OE5V_Pos ( 15U ) +#define SYSCFG_GPIO5VOCR2_PP13OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PP13OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PP13OE5V ( SYSCFG_GPIO5VOCR2_PP13OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PP12OE5V_Pos ( 14U ) +#define SYSCFG_GPIO5VOCR2_PP12OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PP12OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PP12OE5V ( SYSCFG_GPIO5VOCR2_PP12OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PP11OE5V_Pos ( 13U ) +#define SYSCFG_GPIO5VOCR2_PP11OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PP11OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PP11OE5V ( SYSCFG_GPIO5VOCR2_PP11OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PP10OE5V_Pos ( 12U ) +#define SYSCFG_GPIO5VOCR2_PP10OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PP10OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PP10OE5V ( SYSCFG_GPIO5VOCR2_PP10OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PO15OE5V_Pos ( 11U ) +#define SYSCFG_GPIO5VOCR2_PO15OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PO15OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PO15OE5V ( SYSCFG_GPIO5VOCR2_PO15OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PO14OE5V_Pos ( 10U ) +#define SYSCFG_GPIO5VOCR2_PO14OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PO14OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PO14OE5V ( SYSCFG_GPIO5VOCR2_PO14OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PO13OE5V_Pos ( 9U ) +#define SYSCFG_GPIO5VOCR2_PO13OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PO13OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PO13OE5V ( SYSCFG_GPIO5VOCR2_PO13OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PO12OE5V_Pos ( 8U ) +#define SYSCFG_GPIO5VOCR2_PO12OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PO12OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PO12OE5V ( SYSCFG_GPIO5VOCR2_PO12OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PO3OE5V_Pos ( 7U ) +#define SYSCFG_GPIO5VOCR2_PO3OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PO3OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PO3OE5V ( SYSCFG_GPIO5VOCR2_PO3OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PO2OE5V_Pos ( 6U ) +#define SYSCFG_GPIO5VOCR2_PO2OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PO2OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PO2OE5V ( SYSCFG_GPIO5VOCR2_PO2OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PO1OE5V_Pos ( 5U ) +#define SYSCFG_GPIO5VOCR2_PO1OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PO1OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PO1OE5V ( SYSCFG_GPIO5VOCR2_PO1OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PO0OE5V_Pos ( 4U ) +#define SYSCFG_GPIO5VOCR2_PO0OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PO0OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PO0OE5V ( SYSCFG_GPIO5VOCR2_PO0OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PM13OE5V_Pos ( 3U ) +#define SYSCFG_GPIO5VOCR2_PM13OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PM13OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PM13OE5V ( SYSCFG_GPIO5VOCR2_PM13OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PM12OE5V_Pos ( 2U ) +#define SYSCFG_GPIO5VOCR2_PM12OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PM12OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PM12OE5V ( SYSCFG_GPIO5VOCR2_PM12OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PM11OE5V_Pos ( 1U ) +#define SYSCFG_GPIO5VOCR2_PM11OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PM11OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PM11OE5V ( SYSCFG_GPIO5VOCR2_PM11OE5V_Msk ) + +#define SYSCFG_GPIO5VOCR2_PM10OE5V_Pos ( 0U ) +#define SYSCFG_GPIO5VOCR2_PM10OE5V_Msk ( 0x1UL << SYSCFG_GPIO5VOCR2_PM10OE5V_Pos ) +#define SYSCFG_GPIO5VOCR2_PM10OE5V ( SYSCFG_GPIO5VOCR2_PM10OE5V_Msk ) + + +/*************** Bits definition for RCC_RCR **********************/ + +#define RCC_RCR_SRST_MAP_Pos ( 31U ) +#define RCC_RCR_SRST_MAP_Msk ( 0x1UL << RCC_RCR_SRST_MAP_Pos ) +#define RCC_RCR_SRST_MAP ( RCC_RCR_SRST_MAP_Msk ) + +#define RCC_RCR_IWDTRST_DIS_Pos ( 8U ) +#define RCC_RCR_IWDTRST_DIS_Msk ( 0xFFUL << RCC_RCR_IWDTRST_DIS_Pos ) +#define RCC_RCR_IWDTRST_DIS ( RCC_RCR_IWDTRST_DIS_Msk ) + +#define RCC_RCR_LOCKRST_EN_Pos ( 3U ) +#define RCC_RCR_LOCKRST_EN_Msk ( 0x1UL << RCC_RCR_LOCKRST_EN_Pos ) +#define RCC_RCR_LOCKRST_EN ( RCC_RCR_LOCKRST_EN_Msk ) + +#define RCC_RCR_IWDTRST_EN_Pos ( 2U ) +#define RCC_RCR_IWDTRST_EN_Msk ( 0x1UL << RCC_RCR_IWDTRST_EN_Pos ) +#define RCC_RCR_IWDTRST_EN ( RCC_RCR_IWDTRST_EN_Msk ) + +#define RCC_RCR_WDTRST_EN_Pos ( 1U ) +#define RCC_RCR_WDTRST_EN_Msk ( 0x1UL << RCC_RCR_WDTRST_EN_Pos ) +#define RCC_RCR_WDTRST_EN ( RCC_RCR_WDTRST_EN_Msk ) + +#define RCC_RCR_LVDRST_EN_Pos ( 0U ) +#define RCC_RCR_LVDRST_EN_Msk ( 0x1UL << RCC_RCR_LVDRST_EN_Pos ) +#define RCC_RCR_LVDRST_EN ( RCC_RCR_LVDRST_EN_Msk ) + + +/*************** Bits definition for RCC_RSR **********************/ + +#define RCC_RSR_RSTFLAGCLR_Pos ( 16U ) +#define RCC_RSR_RSTFLAGCLR_Msk ( 0x1UL << RCC_RSR_RSTFLAGCLR_Pos ) +#define RCC_RSR_RSTFLAGCLR ( RCC_RSR_RSTFLAGCLR_Msk ) + +#define RCC_RSR_PWRRSTF_Pos ( 10U ) +#define RCC_RSR_PWRRSTF_Msk ( 0x1UL << RCC_RSR_PWRRSTF_Pos ) +#define RCC_RSR_PWRRSTF ( RCC_RSR_PWRRSTF_Msk ) + +#define RCC_RSR_POR12RSTF_Pos ( 9U ) +#define RCC_RSR_POR12RSTF_Msk ( 0x1UL << RCC_RSR_POR12RSTF_Pos ) +#define RCC_RSR_POR12RSTF ( RCC_RSR_POR12RSTF_Msk ) + +#define RCC_RSR_SRSTF_Pos ( 8U ) +#define RCC_RSR_SRSTF_Msk ( 0x1UL << RCC_RSR_SRSTF_Pos ) +#define RCC_RSR_SRSTF ( RCC_RSR_SRSTF_Msk ) + +#define RCC_RSR_RSTNF_Pos ( 5U ) +#define RCC_RSR_RSTNF_Msk ( 0x1UL << RCC_RSR_RSTNF_Pos ) +#define RCC_RSR_RSTNF ( RCC_RSR_RSTNF_Msk ) + +#define RCC_RSR_SYSREQRSTF_Pos ( 4U ) +#define RCC_RSR_SYSREQRSTF_Msk ( 0x1UL << RCC_RSR_SYSREQRSTF_Pos ) +#define RCC_RSR_SYSREQRSTF ( RCC_RSR_SYSREQRSTF_Msk ) + +#define RCC_RSR_LOCKUPRSTF_Pos ( 3U ) +#define RCC_RSR_LOCKUPRSTF_Msk ( 0x1UL << RCC_RSR_LOCKUPRSTF_Pos ) +#define RCC_RSR_LOCKUPRSTF ( RCC_RSR_LOCKUPRSTF_Msk ) + +#define RCC_RSR_IWDTRSTF_Pos ( 2U ) +#define RCC_RSR_IWDTRSTF_Msk ( 0x1UL << RCC_RSR_IWDTRSTF_Pos ) +#define RCC_RSR_IWDTRSTF ( RCC_RSR_IWDTRSTF_Msk ) + +#define RCC_RSR_WDTRSTF_Pos ( 1U ) +#define RCC_RSR_WDTRSTF_Msk ( 0x1UL << RCC_RSR_WDTRSTF_Pos ) +#define RCC_RSR_WDTRSTF ( RCC_RSR_WDTRSTF_Msk ) + +#define RCC_RSR_LVDRSTF_Pos ( 0U ) +#define RCC_RSR_LVDRSTF_Msk ( 0x1UL << RCC_RSR_LVDRSTF_Pos ) +#define RCC_RSR_LVDRSTF ( RCC_RSR_LVDRSTF_Msk ) + + +/*************** Bits definition for RCC_AHB1RSTR **********************/ + +#define RCC_AHB1RSTR_FDCAN2RST_Pos ( 23U ) +#define RCC_AHB1RSTR_FDCAN2RST_Msk ( 0x1UL << RCC_AHB1RSTR_FDCAN2RST_Pos ) +#define RCC_AHB1RSTR_FDCAN2RST ( RCC_AHB1RSTR_FDCAN2RST_Msk ) + +#define RCC_AHB1RSTR_FDCAN1RST_Pos ( 22U ) +#define RCC_AHB1RSTR_FDCAN1RST_Msk ( 0x1UL << RCC_AHB1RSTR_FDCAN1RST_Pos ) +#define RCC_AHB1RSTR_FDCAN1RST ( RCC_AHB1RSTR_FDCAN1RST_Msk ) + +#define RCC_AHB1RSTR_USB2CRST_Pos ( 21U ) +#define RCC_AHB1RSTR_USB2CRST_Msk ( 0x1UL << RCC_AHB1RSTR_USB2CRST_Pos ) +#define RCC_AHB1RSTR_USB2CRST ( RCC_AHB1RSTR_USB2CRST_Msk ) + +#define RCC_AHB1RSTR_USB1CRST_Pos ( 20U ) +#define RCC_AHB1RSTR_USB1CRST_Msk ( 0x1UL << RCC_AHB1RSTR_USB1CRST_Pos ) +#define RCC_AHB1RSTR_USB1CRST ( RCC_AHB1RSTR_USB1CRST_Msk ) + +#define RCC_AHB1RSTR_SPI6RST_Pos ( 15U ) +#define RCC_AHB1RSTR_SPI6RST_Msk ( 0x1UL << RCC_AHB1RSTR_SPI6RST_Pos ) +#define RCC_AHB1RSTR_SPI6RST ( RCC_AHB1RSTR_SPI6RST_Msk ) + +#define RCC_AHB1RSTR_SPI5RST_Pos ( 14U ) +#define RCC_AHB1RSTR_SPI5RST_Msk ( 0x1UL << RCC_AHB1RSTR_SPI5RST_Pos ) +#define RCC_AHB1RSTR_SPI5RST ( RCC_AHB1RSTR_SPI5RST_Msk ) + +#define RCC_AHB1RSTR_SPI4RST_Pos ( 13U ) +#define RCC_AHB1RSTR_SPI4RST_Msk ( 0x1UL << RCC_AHB1RSTR_SPI4RST_Pos ) +#define RCC_AHB1RSTR_SPI4RST ( RCC_AHB1RSTR_SPI4RST_Msk ) + +#define RCC_AHB1RSTR_SPI3RST_Pos ( 12U ) +#define RCC_AHB1RSTR_SPI3RST_Msk ( 0x1UL << RCC_AHB1RSTR_SPI3RST_Pos ) +#define RCC_AHB1RSTR_SPI3RST ( RCC_AHB1RSTR_SPI3RST_Msk ) + +#define RCC_AHB1RSTR_SPI2RST_Pos ( 11U ) +#define RCC_AHB1RSTR_SPI2RST_Msk ( 0x1UL << RCC_AHB1RSTR_SPI2RST_Pos ) +#define RCC_AHB1RSTR_SPI2RST ( RCC_AHB1RSTR_SPI2RST_Msk ) + +#define RCC_AHB1RSTR_SPI1RST_Pos ( 10U ) +#define RCC_AHB1RSTR_SPI1RST_Msk ( 0x1UL << RCC_AHB1RSTR_SPI1RST_Pos ) +#define RCC_AHB1RSTR_SPI1RST ( RCC_AHB1RSTR_SPI1RST_Msk ) + +#define RCC_AHB1RSTR_DMA2DRST_Pos ( 9U ) +#define RCC_AHB1RSTR_DMA2DRST_Msk ( 0x1UL << RCC_AHB1RSTR_DMA2DRST_Pos ) +#define RCC_AHB1RSTR_DMA2DRST ( RCC_AHB1RSTR_DMA2DRST_Msk ) + +#define RCC_AHB1RSTR_ETHRST_Pos ( 6U ) +#define RCC_AHB1RSTR_ETHRST_Msk ( 0x1UL << RCC_AHB1RSTR_ETHRST_Pos ) +#define RCC_AHB1RSTR_ETHRST ( RCC_AHB1RSTR_ETHRST_Msk ) + +#define RCC_AHB1RSTR_CRCRST_Pos ( 5U ) +#define RCC_AHB1RSTR_CRCRST_Msk ( 0x1UL << RCC_AHB1RSTR_CRCRST_Pos ) +#define RCC_AHB1RSTR_CRCRST ( RCC_AHB1RSTR_CRCRST_Msk ) + +#define RCC_AHB1RSTR_DMA2RST_Pos ( 1U ) +#define RCC_AHB1RSTR_DMA2RST_Msk ( 0x1UL << RCC_AHB1RSTR_DMA2RST_Pos ) +#define RCC_AHB1RSTR_DMA2RST ( RCC_AHB1RSTR_DMA2RST_Msk ) + +#define RCC_AHB1RSTR_DMA1RST_Pos ( 0U ) +#define RCC_AHB1RSTR_DMA1RST_Msk ( 0x1UL << RCC_AHB1RSTR_DMA1RST_Pos ) +#define RCC_AHB1RSTR_DMA1RST ( RCC_AHB1RSTR_DMA1RST_Msk ) + + +/*************** Bits definition for RCC_AHB2RSTR **********************/ + +#define RCC_AHB2RSTR_THMRST_Pos ( 31U ) +#define RCC_AHB2RSTR_THMRST_Msk ( 0x1UL << RCC_AHB2RSTR_THMRST_Pos ) +#define RCC_AHB2RSTR_THMRST ( RCC_AHB2RSTR_THMRST_Msk ) + +#define RCC_AHB2RSTR_FDCAN3RST_Pos ( 28U ) +#define RCC_AHB2RSTR_FDCAN3RST_Msk ( 0x1UL << RCC_AHB2RSTR_FDCAN3RST_Pos ) +#define RCC_AHB2RSTR_FDCAN3RST ( RCC_AHB2RSTR_FDCAN3RST_Msk ) + +#define RCC_AHB2RSTR_UACRST_Pos ( 27U ) +#define RCC_AHB2RSTR_UACRST_Msk ( 0x1UL << RCC_AHB2RSTR_UACRST_Pos ) +#define RCC_AHB2RSTR_UACRST ( RCC_AHB2RSTR_UACRST_Msk ) + +#define RCC_AHB2RSTR_DCMIRST_Pos ( 23U ) +#define RCC_AHB2RSTR_DCMIRST_Msk ( 0x1UL << RCC_AHB2RSTR_DCMIRST_Pos ) +#define RCC_AHB2RSTR_DCMIRST ( RCC_AHB2RSTR_DCMIRST_Msk ) + +#define RCC_AHB2RSTR_DAC2RST_Pos ( 20U ) +#define RCC_AHB2RSTR_DAC2RST_Msk ( 0x1UL << RCC_AHB2RSTR_DAC2RST_Pos ) +#define RCC_AHB2RSTR_DAC2RST ( RCC_AHB2RSTR_DAC2RST_Msk ) + +#define RCC_AHB2RSTR_DAC1RST_Pos ( 19U ) +#define RCC_AHB2RSTR_DAC1RST_Msk ( 0x1UL << RCC_AHB2RSTR_DAC1RST_Pos ) +#define RCC_AHB2RSTR_DAC1RST ( RCC_AHB2RSTR_DAC1RST_Msk ) + +#define RCC_AHB2RSTR_ADC3RST_Pos ( 18U ) +#define RCC_AHB2RSTR_ADC3RST_Msk ( 0x1UL << RCC_AHB2RSTR_ADC3RST_Pos ) +#define RCC_AHB2RSTR_ADC3RST ( RCC_AHB2RSTR_ADC3RST_Msk ) + +#define RCC_AHB2RSTR_ADC12RST_Pos ( 17U ) +#define RCC_AHB2RSTR_ADC12RST_Msk ( 0x1UL << RCC_AHB2RSTR_ADC12RST_Pos ) +#define RCC_AHB2RSTR_ADC12RST ( RCC_AHB2RSTR_ADC12RST_Msk ) + +#define RCC_AHB2RSTR_GPIOQRST_Pos ( 16U ) +#define RCC_AHB2RSTR_GPIOQRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOQRST_Pos ) +#define RCC_AHB2RSTR_GPIOQRST ( RCC_AHB2RSTR_GPIOQRST_Msk ) + +#define RCC_AHB2RSTR_GPIOPRST_Pos ( 15U ) +#define RCC_AHB2RSTR_GPIOPRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOPRST_Pos ) +#define RCC_AHB2RSTR_GPIOPRST ( RCC_AHB2RSTR_GPIOPRST_Msk ) + +#define RCC_AHB2RSTR_GPIOORST_Pos ( 14U ) +#define RCC_AHB2RSTR_GPIOORST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOORST_Pos ) +#define RCC_AHB2RSTR_GPIOORST ( RCC_AHB2RSTR_GPIOORST_Msk ) + +#define RCC_AHB2RSTR_GPIONRST_Pos ( 13U ) +#define RCC_AHB2RSTR_GPIONRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIONRST_Pos ) +#define RCC_AHB2RSTR_GPIONRST ( RCC_AHB2RSTR_GPIONRST_Msk ) + +#define RCC_AHB2RSTR_GPIOMRST_Pos ( 12U ) +#define RCC_AHB2RSTR_GPIOMRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOMRST_Pos ) +#define RCC_AHB2RSTR_GPIOMRST ( RCC_AHB2RSTR_GPIOMRST_Msk ) + +#define RCC_AHB2RSTR_GPIOLRST_Pos ( 11U ) +#define RCC_AHB2RSTR_GPIOLRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOLRST_Pos ) +#define RCC_AHB2RSTR_GPIOLRST ( RCC_AHB2RSTR_GPIOLRST_Msk ) + +#define RCC_AHB2RSTR_GPIOKRST_Pos ( 10U ) +#define RCC_AHB2RSTR_GPIOKRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOKRST_Pos ) +#define RCC_AHB2RSTR_GPIOKRST ( RCC_AHB2RSTR_GPIOKRST_Msk ) + +#define RCC_AHB2RSTR_GPIOJRST_Pos ( 9U ) +#define RCC_AHB2RSTR_GPIOJRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOJRST_Pos ) +#define RCC_AHB2RSTR_GPIOJRST ( RCC_AHB2RSTR_GPIOJRST_Msk ) + +#define RCC_AHB2RSTR_GPIOIRST_Pos ( 8U ) +#define RCC_AHB2RSTR_GPIOIRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOIRST_Pos ) +#define RCC_AHB2RSTR_GPIOIRST ( RCC_AHB2RSTR_GPIOIRST_Msk ) + +#define RCC_AHB2RSTR_GPIOHRST_Pos ( 7U ) +#define RCC_AHB2RSTR_GPIOHRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOHRST_Pos ) +#define RCC_AHB2RSTR_GPIOHRST ( RCC_AHB2RSTR_GPIOHRST_Msk ) + +#define RCC_AHB2RSTR_GPIOGRST_Pos ( 6U ) +#define RCC_AHB2RSTR_GPIOGRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOGRST_Pos ) +#define RCC_AHB2RSTR_GPIOGRST ( RCC_AHB2RSTR_GPIOGRST_Msk ) + +#define RCC_AHB2RSTR_GPIOFRST_Pos ( 5U ) +#define RCC_AHB2RSTR_GPIOFRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOFRST_Pos ) +#define RCC_AHB2RSTR_GPIOFRST ( RCC_AHB2RSTR_GPIOFRST_Msk ) + +#define RCC_AHB2RSTR_GPIOERST_Pos ( 4U ) +#define RCC_AHB2RSTR_GPIOERST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOERST_Pos ) +#define RCC_AHB2RSTR_GPIOERST ( RCC_AHB2RSTR_GPIOERST_Msk ) + +#define RCC_AHB2RSTR_GPIODRST_Pos ( 3U ) +#define RCC_AHB2RSTR_GPIODRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIODRST_Pos ) +#define RCC_AHB2RSTR_GPIODRST ( RCC_AHB2RSTR_GPIODRST_Msk ) + +#define RCC_AHB2RSTR_GPIOCRST_Pos ( 2U ) +#define RCC_AHB2RSTR_GPIOCRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOCRST_Pos ) +#define RCC_AHB2RSTR_GPIOCRST ( RCC_AHB2RSTR_GPIOCRST_Msk ) + +#define RCC_AHB2RSTR_GPIOBRST_Pos ( 1U ) +#define RCC_AHB2RSTR_GPIOBRST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOBRST_Pos ) +#define RCC_AHB2RSTR_GPIOBRST ( RCC_AHB2RSTR_GPIOBRST_Msk ) + +#define RCC_AHB2RSTR_GPIOARST_Pos ( 0U ) +#define RCC_AHB2RSTR_GPIOARST_Msk ( 0x1UL << RCC_AHB2RSTR_GPIOARST_Pos ) +#define RCC_AHB2RSTR_GPIOARST ( RCC_AHB2RSTR_GPIOARST_Msk ) + + +/*************** Bits definition for RCC_AHB3RSTR **********************/ + +#define RCC_AHB3RSTR_FMCRST_Pos ( 12U ) +#define RCC_AHB3RSTR_FMCRST_Msk ( 0x1UL << RCC_AHB3RSTR_FMCRST_Pos ) +#define RCC_AHB3RSTR_FMCRST ( RCC_AHB3RSTR_FMCRST_Msk ) + +#define RCC_AHB3RSTR_OSPI2RST_Pos ( 9U ) +#define RCC_AHB3RSTR_OSPI2RST_Msk ( 0x1UL << RCC_AHB3RSTR_OSPI2RST_Pos ) +#define RCC_AHB3RSTR_OSPI2RST ( RCC_AHB3RSTR_OSPI2RST_Msk ) + +#define RCC_AHB3RSTR_OSPI1RST_Pos ( 8U ) +#define RCC_AHB3RSTR_OSPI1RST_Msk ( 0x1UL << RCC_AHB3RSTR_OSPI1RST_Pos ) +#define RCC_AHB3RSTR_OSPI1RST ( RCC_AHB3RSTR_OSPI1RST_Msk ) + +#define RCC_AHB3RSTR_SDMMCRST_Pos ( 4U ) +#define RCC_AHB3RSTR_SDMMCRST_Msk ( 0x1UL << RCC_AHB3RSTR_SDMMCRST_Pos ) +#define RCC_AHB3RSTR_SDMMCRST ( RCC_AHB3RSTR_SDMMCRST_Msk ) + +#define RCC_AHB3RSTR_SPI8RST_Pos ( 1U ) +#define RCC_AHB3RSTR_SPI8RST_Msk ( 0x1UL << RCC_AHB3RSTR_SPI8RST_Pos ) +#define RCC_AHB3RSTR_SPI8RST ( RCC_AHB3RSTR_SPI8RST_Msk ) + +#define RCC_AHB3RSTR_SPI7RST_Pos ( 0U ) +#define RCC_AHB3RSTR_SPI7RST_Msk ( 0x1UL << RCC_AHB3RSTR_SPI7RST_Pos ) +#define RCC_AHB3RSTR_SPI7RST ( RCC_AHB3RSTR_SPI7RST_Msk ) + + +/*************** Bits definition for RCC_APB1RSTR1 **********************/ + +#define RCC_APB1RSTR1_LPUART1RST_Pos ( 31U ) +#define RCC_APB1RSTR1_LPUART1RST_Msk ( 0x1UL << RCC_APB1RSTR1_LPUART1RST_Pos ) +#define RCC_APB1RSTR1_LPUART1RST ( RCC_APB1RSTR1_LPUART1RST_Msk ) + +#define RCC_APB1RSTR1_LPTIM1RST_Pos ( 30U ) +#define RCC_APB1RSTR1_LPTIM1RST_Msk ( 0x1UL << RCC_APB1RSTR1_LPTIM1RST_Pos ) +#define RCC_APB1RSTR1_LPTIM1RST ( RCC_APB1RSTR1_LPTIM1RST_Msk ) + +#define RCC_APB1RSTR1_PMURST_Pos ( 27U ) +#define RCC_APB1RSTR1_PMURST_Msk ( 0x1UL << RCC_APB1RSTR1_PMURST_Pos ) +#define RCC_APB1RSTR1_PMURST ( RCC_APB1RSTR1_PMURST_Msk ) + +#define RCC_APB1RSTR1_I2C4RST_Pos ( 24U ) +#define RCC_APB1RSTR1_I2C4RST_Msk ( 0x1UL << RCC_APB1RSTR1_I2C4RST_Pos ) +#define RCC_APB1RSTR1_I2C4RST ( RCC_APB1RSTR1_I2C4RST_Msk ) + +#define RCC_APB1RSTR1_I2C3RST_Pos ( 23U ) +#define RCC_APB1RSTR1_I2C3RST_Msk ( 0x1UL << RCC_APB1RSTR1_I2C3RST_Pos ) +#define RCC_APB1RSTR1_I2C3RST ( RCC_APB1RSTR1_I2C3RST_Msk ) + +#define RCC_APB1RSTR1_I2C2RST_Pos ( 22U ) +#define RCC_APB1RSTR1_I2C2RST_Msk ( 0x1UL << RCC_APB1RSTR1_I2C2RST_Pos ) +#define RCC_APB1RSTR1_I2C2RST ( RCC_APB1RSTR1_I2C2RST_Msk ) + +#define RCC_APB1RSTR1_I2C1RST_Pos ( 21U ) +#define RCC_APB1RSTR1_I2C1RST_Msk ( 0x1UL << RCC_APB1RSTR1_I2C1RST_Pos ) +#define RCC_APB1RSTR1_I2C1RST ( RCC_APB1RSTR1_I2C1RST_Msk ) + +#define RCC_APB1RSTR1_USART5RST_Pos ( 20U ) +#define RCC_APB1RSTR1_USART5RST_Msk ( 0x1UL << RCC_APB1RSTR1_USART5RST_Pos ) +#define RCC_APB1RSTR1_USART5RST ( RCC_APB1RSTR1_USART5RST_Msk ) + +#define RCC_APB1RSTR1_USART4RST_Pos ( 19U ) +#define RCC_APB1RSTR1_USART4RST_Msk ( 0x1UL << RCC_APB1RSTR1_USART4RST_Pos ) +#define RCC_APB1RSTR1_USART4RST ( RCC_APB1RSTR1_USART4RST_Msk ) + +#define RCC_APB1RSTR1_USART3RST_Pos ( 18U ) +#define RCC_APB1RSTR1_USART3RST_Msk ( 0x1UL << RCC_APB1RSTR1_USART3RST_Pos ) +#define RCC_APB1RSTR1_USART3RST ( RCC_APB1RSTR1_USART3RST_Msk ) + +#define RCC_APB1RSTR1_USART2RST_Pos ( 17U ) +#define RCC_APB1RSTR1_USART2RST_Msk ( 0x1UL << RCC_APB1RSTR1_USART2RST_Pos ) +#define RCC_APB1RSTR1_USART2RST ( RCC_APB1RSTR1_USART2RST_Msk ) + +#define RCC_APB1RSTR1_I2S3RST_Pos ( 16U ) +#define RCC_APB1RSTR1_I2S3RST_Msk ( 0x1UL << RCC_APB1RSTR1_I2S3RST_Pos ) +#define RCC_APB1RSTR1_I2S3RST ( RCC_APB1RSTR1_I2S3RST_Msk ) + +#define RCC_APB1RSTR1_I2S2RST_Pos ( 15U ) +#define RCC_APB1RSTR1_I2S2RST_Msk ( 0x1UL << RCC_APB1RSTR1_I2S2RST_Pos ) +#define RCC_APB1RSTR1_I2S2RST ( RCC_APB1RSTR1_I2S2RST_Msk ) + +#define RCC_APB1RSTR1_I2S1RST_Pos ( 14U ) +#define RCC_APB1RSTR1_I2S1RST_Msk ( 0x1UL << RCC_APB1RSTR1_I2S1RST_Pos ) +#define RCC_APB1RSTR1_I2S1RST ( RCC_APB1RSTR1_I2S1RST_Msk ) + +#define RCC_APB1RSTR1_WDTRST_Pos ( 11U ) +#define RCC_APB1RSTR1_WDTRST_Msk ( 0x1UL << RCC_APB1RSTR1_WDTRST_Pos ) +#define RCC_APB1RSTR1_WDTRST ( RCC_APB1RSTR1_WDTRST_Msk ) + +#define RCC_APB1RSTR1_TIM14RST_Pos ( 8U ) +#define RCC_APB1RSTR1_TIM14RST_Msk ( 0x1UL << RCC_APB1RSTR1_TIM14RST_Pos ) +#define RCC_APB1RSTR1_TIM14RST ( RCC_APB1RSTR1_TIM14RST_Msk ) + +#define RCC_APB1RSTR1_TIM13RST_Pos ( 7U ) +#define RCC_APB1RSTR1_TIM13RST_Msk ( 0x1UL << RCC_APB1RSTR1_TIM13RST_Pos ) +#define RCC_APB1RSTR1_TIM13RST ( RCC_APB1RSTR1_TIM13RST_Msk ) + +#define RCC_APB1RSTR1_TIM12RST_Pos ( 6U ) +#define RCC_APB1RSTR1_TIM12RST_Msk ( 0x1UL << RCC_APB1RSTR1_TIM12RST_Pos ) +#define RCC_APB1RSTR1_TIM12RST ( RCC_APB1RSTR1_TIM12RST_Msk ) + +#define RCC_APB1RSTR1_TIM7RST_Pos ( 5U ) +#define RCC_APB1RSTR1_TIM7RST_Msk ( 0x1UL << RCC_APB1RSTR1_TIM7RST_Pos ) +#define RCC_APB1RSTR1_TIM7RST ( RCC_APB1RSTR1_TIM7RST_Msk ) + +#define RCC_APB1RSTR1_TIM6RST_Pos ( 4U ) +#define RCC_APB1RSTR1_TIM6RST_Msk ( 0x1UL << RCC_APB1RSTR1_TIM6RST_Pos ) +#define RCC_APB1RSTR1_TIM6RST ( RCC_APB1RSTR1_TIM6RST_Msk ) + +#define RCC_APB1RSTR1_TIM5RST_Pos ( 3U ) +#define RCC_APB1RSTR1_TIM5RST_Msk ( 0x1UL << RCC_APB1RSTR1_TIM5RST_Pos ) +#define RCC_APB1RSTR1_TIM5RST ( RCC_APB1RSTR1_TIM5RST_Msk ) + +#define RCC_APB1RSTR1_TIM4RST_Pos ( 2U ) +#define RCC_APB1RSTR1_TIM4RST_Msk ( 0x1UL << RCC_APB1RSTR1_TIM4RST_Pos ) +#define RCC_APB1RSTR1_TIM4RST ( RCC_APB1RSTR1_TIM4RST_Msk ) + +#define RCC_APB1RSTR1_TIM3RST_Pos ( 1U ) +#define RCC_APB1RSTR1_TIM3RST_Msk ( 0x1UL << RCC_APB1RSTR1_TIM3RST_Pos ) +#define RCC_APB1RSTR1_TIM3RST ( RCC_APB1RSTR1_TIM3RST_Msk ) + +#define RCC_APB1RSTR1_TIM2RST_Pos ( 0U ) +#define RCC_APB1RSTR1_TIM2RST_Msk ( 0x1UL << RCC_APB1RSTR1_TIM2RST_Pos ) +#define RCC_APB1RSTR1_TIM2RST ( RCC_APB1RSTR1_TIM2RST_Msk ) + + +/*************** Bits definition for RCC_APB1RSTR2 **********************/ + +#define RCC_APB1RSTR2_EFUSE2RST_Pos ( 7U ) +#define RCC_APB1RSTR2_EFUSE2RST_Msk ( 0x1UL << RCC_APB1RSTR2_EFUSE2RST_Pos ) +#define RCC_APB1RSTR2_EFUSE2RST ( RCC_APB1RSTR2_EFUSE2RST_Msk ) + +#define RCC_APB1RSTR2_EFUSE1RST_Pos ( 6U ) +#define RCC_APB1RSTR2_EFUSE1RST_Msk ( 0x1UL << RCC_APB1RSTR2_EFUSE1RST_Pos ) +#define RCC_APB1RSTR2_EFUSE1RST ( RCC_APB1RSTR2_EFUSE1RST_Msk ) + +#define RCC_APB1RSTR2_TIM26RST_Pos ( 5U ) +#define RCC_APB1RSTR2_TIM26RST_Msk ( 0x1UL << RCC_APB1RSTR2_TIM26RST_Pos ) +#define RCC_APB1RSTR2_TIM26RST ( RCC_APB1RSTR2_TIM26RST_Msk ) + +#define RCC_APB1RSTR2_TIM25RST_Pos ( 4U ) +#define RCC_APB1RSTR2_TIM25RST_Msk ( 0x1UL << RCC_APB1RSTR2_TIM25RST_Pos ) +#define RCC_APB1RSTR2_TIM25RST ( RCC_APB1RSTR2_TIM25RST_Msk ) + +#define RCC_APB1RSTR2_USART8RST_Pos ( 3U ) +#define RCC_APB1RSTR2_USART8RST_Msk ( 0x1UL << RCC_APB1RSTR2_USART8RST_Pos ) +#define RCC_APB1RSTR2_USART8RST ( RCC_APB1RSTR2_USART8RST_Msk ) + +#define RCC_APB1RSTR2_USART7RST_Pos ( 2U ) +#define RCC_APB1RSTR2_USART7RST_Msk ( 0x1UL << RCC_APB1RSTR2_USART7RST_Pos ) +#define RCC_APB1RSTR2_USART7RST ( RCC_APB1RSTR2_USART7RST_Msk ) + +#define RCC_APB1RSTR2_LPTIM2RST_Pos ( 1U ) +#define RCC_APB1RSTR2_LPTIM2RST_Msk ( 0x1UL << RCC_APB1RSTR2_LPTIM2RST_Pos ) +#define RCC_APB1RSTR2_LPTIM2RST ( RCC_APB1RSTR2_LPTIM2RST_Msk ) + + +/*************** Bits definition for RCC_APB2RSTR **********************/ + +#define RCC_APB2RSTR_USART10RST_Pos ( 31U ) +#define RCC_APB2RSTR_USART10RST_Msk ( 0x1UL << RCC_APB2RSTR_USART10RST_Pos ) +#define RCC_APB2RSTR_USART10RST ( RCC_APB2RSTR_USART10RST_Msk ) + +#define RCC_APB2RSTR_USART9RST_Pos ( 30U ) +#define RCC_APB2RSTR_USART9RST_Msk ( 0x1UL << RCC_APB2RSTR_USART9RST_Pos ) +#define RCC_APB2RSTR_USART9RST ( RCC_APB2RSTR_USART9RST_Msk ) + +#define RCC_APB2RSTR_TIM24RST_Pos ( 29U ) +#define RCC_APB2RSTR_TIM24RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM24RST_Pos ) +#define RCC_APB2RSTR_TIM24RST ( RCC_APB2RSTR_TIM24RST_Msk ) + +#define RCC_APB2RSTR_TIM23RST_Pos ( 28U ) +#define RCC_APB2RSTR_TIM23RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM23RST_Pos ) +#define RCC_APB2RSTR_TIM23RST ( RCC_APB2RSTR_TIM23RST_Msk ) + +#define RCC_APB2RSTR_TIM22RST_Pos ( 27U ) +#define RCC_APB2RSTR_TIM22RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM22RST_Pos ) +#define RCC_APB2RSTR_TIM22RST ( RCC_APB2RSTR_TIM22RST_Msk ) + +#define RCC_APB2RSTR_TIM21RST_Pos ( 26U ) +#define RCC_APB2RSTR_TIM21RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM21RST_Pos ) +#define RCC_APB2RSTR_TIM21RST ( RCC_APB2RSTR_TIM21RST_Msk ) + +#define RCC_APB2RSTR_TIM19RST_Pos ( 25U ) +#define RCC_APB2RSTR_TIM19RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM19RST_Pos ) +#define RCC_APB2RSTR_TIM19RST ( RCC_APB2RSTR_TIM19RST_Msk ) + +#define RCC_APB2RSTR_TIM18RST_Pos ( 24U ) +#define RCC_APB2RSTR_TIM18RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM18RST_Pos ) +#define RCC_APB2RSTR_TIM18RST ( RCC_APB2RSTR_TIM18RST_Msk ) + +#define RCC_APB2RSTR_TIM11RST_Pos ( 23U ) +#define RCC_APB2RSTR_TIM11RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM11RST_Pos ) +#define RCC_APB2RSTR_TIM11RST ( RCC_APB2RSTR_TIM11RST_Msk ) + +#define RCC_APB2RSTR_TIM10RST_Pos ( 22U ) +#define RCC_APB2RSTR_TIM10RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM10RST_Pos ) +#define RCC_APB2RSTR_TIM10RST ( RCC_APB2RSTR_TIM10RST_Msk ) + +#define RCC_APB2RSTR_TIM9RST_Pos ( 21U ) +#define RCC_APB2RSTR_TIM9RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM9RST_Pos ) +#define RCC_APB2RSTR_TIM9RST ( RCC_APB2RSTR_TIM9RST_Msk ) + +#define RCC_APB2RSTR_LTDCRST_Pos ( 19U ) +#define RCC_APB2RSTR_LTDCRST_Msk ( 0x1UL << RCC_APB2RSTR_LTDCRST_Pos ) +#define RCC_APB2RSTR_LTDCRST ( RCC_APB2RSTR_LTDCRST_Msk ) + +#define RCC_APB2RSTR_TKEYRST_Pos ( 18U ) +#define RCC_APB2RSTR_TKEYRST_Msk ( 0x1UL << RCC_APB2RSTR_TKEYRST_Pos ) +#define RCC_APB2RSTR_TKEYRST ( RCC_APB2RSTR_TKEYRST_Msk ) + +#define RCC_APB2RSTR_TIM20RST_Pos ( 15U ) +#define RCC_APB2RSTR_TIM20RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM20RST_Pos ) +#define RCC_APB2RSTR_TIM20RST ( RCC_APB2RSTR_TIM20RST_Msk ) + +#define RCC_APB2RSTR_TIM17RST_Pos ( 13U ) +#define RCC_APB2RSTR_TIM17RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM17RST_Pos ) +#define RCC_APB2RSTR_TIM17RST ( RCC_APB2RSTR_TIM17RST_Msk ) + +#define RCC_APB2RSTR_TIM16RST_Pos ( 12U ) +#define RCC_APB2RSTR_TIM16RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM16RST_Pos ) +#define RCC_APB2RSTR_TIM16RST ( RCC_APB2RSTR_TIM16RST_Msk ) + +#define RCC_APB2RSTR_TIM15RST_Pos ( 11U ) +#define RCC_APB2RSTR_TIM15RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM15RST_Pos ) +#define RCC_APB2RSTR_TIM15RST ( RCC_APB2RSTR_TIM15RST_Msk ) + +#define RCC_APB2RSTR_USART6RST_Pos ( 10U ) +#define RCC_APB2RSTR_USART6RST_Msk ( 0x1UL << RCC_APB2RSTR_USART6RST_Pos ) +#define RCC_APB2RSTR_USART6RST ( RCC_APB2RSTR_USART6RST_Msk ) + +#define RCC_APB2RSTR_USART1RST_Pos ( 9U ) +#define RCC_APB2RSTR_USART1RST_Msk ( 0x1UL << RCC_APB2RSTR_USART1RST_Pos ) +#define RCC_APB2RSTR_USART1RST ( RCC_APB2RSTR_USART1RST_Msk ) + +#define RCC_APB2RSTR_TIM8RST_Pos ( 8U ) +#define RCC_APB2RSTR_TIM8RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM8RST_Pos ) +#define RCC_APB2RSTR_TIM8RST ( RCC_APB2RSTR_TIM8RST_Msk ) + +#define RCC_APB2RSTR_TIM1RST_Pos ( 6U ) +#define RCC_APB2RSTR_TIM1RST_Msk ( 0x1UL << RCC_APB2RSTR_TIM1RST_Pos ) +#define RCC_APB2RSTR_TIM1RST ( RCC_APB2RSTR_TIM1RST_Msk ) + +#define RCC_APB2RSTR_EXTIRST_Pos ( 4U ) +#define RCC_APB2RSTR_EXTIRST_Msk ( 0x1UL << RCC_APB2RSTR_EXTIRST_Pos ) +#define RCC_APB2RSTR_EXTIRST ( RCC_APB2RSTR_EXTIRST_Msk ) + +#define RCC_APB2RSTR_CMP1RST_A_Pos ( 2U ) +#define RCC_APB2RSTR_CMP1RST_A_Msk ( 0x1UL << RCC_APB2RSTR_CMP1RST_A_Pos ) +#define RCC_APB2RSTR_CMP1RST_A ( RCC_APB2RSTR_CMP1RST_A_Msk ) + +#define RCC_APB2RSTR_SYSCFGRST_Pos ( 0U ) +#define RCC_APB2RSTR_SYSCFGRST_Msk ( 0x1UL << RCC_APB2RSTR_SYSCFGRST_Pos ) +#define RCC_APB2RSTR_SYSCFGRST ( RCC_APB2RSTR_SYSCFGRST_Msk ) + + +/*************** Bits definition for RCC_APB3RSTR **********************/ + +#define RCC_APB3RSTR_LPTIM6RST_Pos ( 3U ) +#define RCC_APB3RSTR_LPTIM6RST_Msk ( 0x1UL << RCC_APB3RSTR_LPTIM6RST_Pos ) +#define RCC_APB3RSTR_LPTIM6RST ( RCC_APB3RSTR_LPTIM6RST_Msk ) + +#define RCC_APB3RSTR_LPTIM5RST_Pos ( 2U ) +#define RCC_APB3RSTR_LPTIM5RST_Msk ( 0x1UL << RCC_APB3RSTR_LPTIM5RST_Pos ) +#define RCC_APB3RSTR_LPTIM5RST ( RCC_APB3RSTR_LPTIM5RST_Msk ) + +#define RCC_APB3RSTR_LPTIM4RST_Pos ( 1U ) +#define RCC_APB3RSTR_LPTIM4RST_Msk ( 0x1UL << RCC_APB3RSTR_LPTIM4RST_Pos ) +#define RCC_APB3RSTR_LPTIM4RST ( RCC_APB3RSTR_LPTIM4RST_Msk ) + +#define RCC_APB3RSTR_LPTIM3RST_Pos ( 0U ) +#define RCC_APB3RSTR_LPTIM3RST_Msk ( 0x1UL << RCC_APB3RSTR_LPTIM3RST_Pos ) +#define RCC_APB3RSTR_LPTIM3RST ( RCC_APB3RSTR_LPTIM3RST_Msk ) + + +/*************** Bits definition for RCC_APB4RSTR **********************/ + +#define RCC_APB4RSTR_DPWM6RST_Pos ( 17U ) +#define RCC_APB4RSTR_DPWM6RST_Msk ( 0x1UL << RCC_APB4RSTR_DPWM6RST_Pos ) +#define RCC_APB4RSTR_DPWM6RST ( RCC_APB4RSTR_DPWM6RST_Msk ) + +#define RCC_APB4RSTR_DPWM5RST_Pos ( 16U ) +#define RCC_APB4RSTR_DPWM5RST_Msk ( 0x1UL << RCC_APB4RSTR_DPWM5RST_Pos ) +#define RCC_APB4RSTR_DPWM5RST ( RCC_APB4RSTR_DPWM5RST_Msk ) + +#define RCC_APB4RSTR_SPWM6RST_Pos ( 15U ) +#define RCC_APB4RSTR_SPWM6RST_Msk ( 0x1UL << RCC_APB4RSTR_SPWM6RST_Pos ) +#define RCC_APB4RSTR_SPWM6RST ( RCC_APB4RSTR_SPWM6RST_Msk ) + +#define RCC_APB4RSTR_SPWM5RST_Pos ( 14U ) +#define RCC_APB4RSTR_SPWM5RST_Msk ( 0x1UL << RCC_APB4RSTR_SPWM5RST_Pos ) +#define RCC_APB4RSTR_SPWM5RST ( RCC_APB4RSTR_SPWM5RST_Msk ) + +#define RCC_APB4RSTR_SPWM4RST_Pos ( 13U ) +#define RCC_APB4RSTR_SPWM4RST_Msk ( 0x1UL << RCC_APB4RSTR_SPWM4RST_Pos ) +#define RCC_APB4RSTR_SPWM4RST ( RCC_APB4RSTR_SPWM4RST_Msk ) + +#define RCC_APB4RSTR_SPWM3RST_Pos ( 12U ) +#define RCC_APB4RSTR_SPWM3RST_Msk ( 0x1UL << RCC_APB4RSTR_SPWM3RST_Pos ) +#define RCC_APB4RSTR_SPWM3RST ( RCC_APB4RSTR_SPWM3RST_Msk ) + +#define RCC_APB4RSTR_MDACRST_Pos ( 8U ) +#define RCC_APB4RSTR_MDACRST_Msk ( 0x1UL << RCC_APB4RSTR_MDACRST_Pos ) +#define RCC_APB4RSTR_MDACRST ( RCC_APB4RSTR_MDACRST_Msk ) + +#define RCC_APB4RSTR_LPTRST_Pos ( 7U ) +#define RCC_APB4RSTR_LPTRST_Msk ( 0x1UL << RCC_APB4RSTR_LPTRST_Pos ) +#define RCC_APB4RSTR_LPTRST ( RCC_APB4RSTR_LPTRST_Msk ) + +#define RCC_APB4RSTR_PNDLRST_Pos ( 6U ) +#define RCC_APB4RSTR_PNDLRST_Msk ( 0x1UL << RCC_APB4RSTR_PNDLRST_Pos ) +#define RCC_APB4RSTR_PNDLRST ( RCC_APB4RSTR_PNDLRST_Msk ) + +#define RCC_APB4RSTR_DPWM4RST_Pos ( 5U ) +#define RCC_APB4RSTR_DPWM4RST_Msk ( 0x1UL << RCC_APB4RSTR_DPWM4RST_Pos ) +#define RCC_APB4RSTR_DPWM4RST ( RCC_APB4RSTR_DPWM4RST_Msk ) + +#define RCC_APB4RSTR_DPWM3RST_Pos ( 4U ) +#define RCC_APB4RSTR_DPWM3RST_Msk ( 0x1UL << RCC_APB4RSTR_DPWM3RST_Pos ) +#define RCC_APB4RSTR_DPWM3RST ( RCC_APB4RSTR_DPWM3RST_Msk ) + +#define RCC_APB4RSTR_DPWM2RST_Pos ( 3U ) +#define RCC_APB4RSTR_DPWM2RST_Msk ( 0x1UL << RCC_APB4RSTR_DPWM2RST_Pos ) +#define RCC_APB4RSTR_DPWM2RST ( RCC_APB4RSTR_DPWM2RST_Msk ) + +#define RCC_APB4RSTR_DPWM1RST_Pos ( 2U ) +#define RCC_APB4RSTR_DPWM1RST_Msk ( 0x1UL << RCC_APB4RSTR_DPWM1RST_Pos ) +#define RCC_APB4RSTR_DPWM1RST ( RCC_APB4RSTR_DPWM1RST_Msk ) + +#define RCC_APB4RSTR_SPWM2RST_Pos ( 1U ) +#define RCC_APB4RSTR_SPWM2RST_Msk ( 0x1UL << RCC_APB4RSTR_SPWM2RST_Pos ) +#define RCC_APB4RSTR_SPWM2RST ( RCC_APB4RSTR_SPWM2RST_Msk ) + +#define RCC_APB4RSTR_SPWM1RST_Pos ( 0U ) +#define RCC_APB4RSTR_SPWM1RST_Msk ( 0x1UL << RCC_APB4RSTR_SPWM1RST_Pos ) +#define RCC_APB4RSTR_SPWM1RST ( RCC_APB4RSTR_SPWM1RST_Msk ) + + +/*************** Bits definition for RCC_CCR1 **********************/ + +#define RCC_CCR1_SYSCLKSEL_Pos ( 0U ) +#define RCC_CCR1_SYSCLKSEL_Msk ( 0x3UL << RCC_CCR1_SYSCLKSEL_Pos ) +#define RCC_CCR1_SYSCLKSEL ( RCC_CCR1_SYSCLKSEL_Msk ) +#define RCC_CCR1_SYSCLKSEL_0 ( 0x1UL << RCC_CCR1_SYSCLKSEL_Pos ) +#define RCC_CCR1_SYSCLKSEL_1 ( 0x2UL << RCC_CCR1_SYSCLKSEL_Pos ) + + +/*************** Bits definition for RCC_CCR2 **********************/ + +#define RCC_CCR2_DIVDONE_Pos ( 31U ) +#define RCC_CCR2_DIVDONE_Msk ( 0x1UL << RCC_CCR2_DIVDONE_Pos ) +#define RCC_CCR2_DIVDONE ( RCC_CCR2_DIVDONE_Msk ) + +#define RCC_CCR2_HRNGSDIV_Pos ( 24U ) +#define RCC_CCR2_HRNGSDIV_Msk ( 0x7FUL << RCC_CCR2_HRNGSDIV_Pos ) +#define RCC_CCR2_HRNGSDIV ( RCC_CCR2_HRNGSDIV_Msk ) +#define RCC_CCR2_HRNGSDIV_0 ( 0x01UL << RCC_CCR2_HRNGSDIV_Pos ) +#define RCC_CCR2_HRNGSDIV_1 ( 0x02UL << RCC_CCR2_HRNGSDIV_Pos ) +#define RCC_CCR2_HRNGSDIV_2 ( 0x04UL << RCC_CCR2_HRNGSDIV_Pos ) +#define RCC_CCR2_HRNGSDIV_3 ( 0x08UL << RCC_CCR2_HRNGSDIV_Pos ) +#define RCC_CCR2_HRNGSDIV_4 ( 0x10UL << RCC_CCR2_HRNGSDIV_Pos ) +#define RCC_CCR2_HRNGSDIV_5 ( 0x20UL << RCC_CCR2_HRNGSDIV_Pos ) +#define RCC_CCR2_HRNGSDIV_6 ( 0x40UL << RCC_CCR2_HRNGSDIV_Pos ) + +#define RCC_CCR2_FLTCLKSEL_Pos ( 20U ) +#define RCC_CCR2_FLTCLKSEL_Msk ( 0x1UL << RCC_CCR2_FLTCLKSEL_Pos ) +#define RCC_CCR2_FLTCLKSEL ( RCC_CCR2_FLTCLKSEL_Msk ) + +#define RCC_CCR2_PCLK4DIV_Pos ( 17U ) +#define RCC_CCR2_PCLK4DIV_Msk ( 0x7UL << RCC_CCR2_PCLK4DIV_Pos ) +#define RCC_CCR2_PCLK4DIV ( RCC_CCR2_PCLK4DIV_Msk ) +#define RCC_CCR2_PCLK4DIV_0 ( 0x1UL << RCC_CCR2_PCLK4DIV_Pos ) +#define RCC_CCR2_PCLK4DIV_1 ( 0x2UL << RCC_CCR2_PCLK4DIV_Pos ) +#define RCC_CCR2_PCLK4DIV_2 ( 0x4UL << RCC_CCR2_PCLK4DIV_Pos ) + +#define RCC_CCR2_PCLK3DIV_Pos ( 14U ) +#define RCC_CCR2_PCLK3DIV_Msk ( 0x7UL << RCC_CCR2_PCLK3DIV_Pos ) +#define RCC_CCR2_PCLK3DIV ( RCC_CCR2_PCLK3DIV_Msk ) +#define RCC_CCR2_PCLK3DIV_0 ( 0x1UL << RCC_CCR2_PCLK3DIV_Pos ) +#define RCC_CCR2_PCLK3DIV_1 ( 0x2UL << RCC_CCR2_PCLK3DIV_Pos ) +#define RCC_CCR2_PCLK3DIV_2 ( 0x4UL << RCC_CCR2_PCLK3DIV_Pos ) + +#define RCC_CCR2_PCLK2DIV_Pos ( 11U ) +#define RCC_CCR2_PCLK2DIV_Msk ( 0x7UL << RCC_CCR2_PCLK2DIV_Pos ) +#define RCC_CCR2_PCLK2DIV ( RCC_CCR2_PCLK2DIV_Msk ) +#define RCC_CCR2_PCLK2DIV_0 ( 0x1UL << RCC_CCR2_PCLK2DIV_Pos ) +#define RCC_CCR2_PCLK2DIV_1 ( 0x2UL << RCC_CCR2_PCLK2DIV_Pos ) +#define RCC_CCR2_PCLK2DIV_2 ( 0x4UL << RCC_CCR2_PCLK2DIV_Pos ) + +#define RCC_CCR2_PCLK1DIV_Pos ( 8U ) +#define RCC_CCR2_PCLK1DIV_Msk ( 0x7UL << RCC_CCR2_PCLK1DIV_Pos ) +#define RCC_CCR2_PCLK1DIV ( RCC_CCR2_PCLK1DIV_Msk ) +#define RCC_CCR2_PCLK1DIV_0 ( 0x1UL << RCC_CCR2_PCLK1DIV_Pos ) +#define RCC_CCR2_PCLK1DIV_1 ( 0x2UL << RCC_CCR2_PCLK1DIV_Pos ) +#define RCC_CCR2_PCLK1DIV_2 ( 0x4UL << RCC_CCR2_PCLK1DIV_Pos ) + +#define RCC_CCR2_SYSDIV1_Pos ( 4U ) +#define RCC_CCR2_SYSDIV1_Msk ( 0xFUL << RCC_CCR2_SYSDIV1_Pos ) +#define RCC_CCR2_SYSDIV1 ( RCC_CCR2_SYSDIV1_Msk ) +#define RCC_CCR2_SYSDIV1_0 ( 0x1UL << RCC_CCR2_SYSDIV1_Pos ) +#define RCC_CCR2_SYSDIV1_1 ( 0x2UL << RCC_CCR2_SYSDIV1_Pos ) +#define RCC_CCR2_SYSDIV1_2 ( 0x4UL << RCC_CCR2_SYSDIV1_Pos ) +#define RCC_CCR2_SYSDIV1_3 ( 0x8UL << RCC_CCR2_SYSDIV1_Pos ) + +#define RCC_CCR2_SYSDIV0_Pos ( 0U ) +#define RCC_CCR2_SYSDIV0_Msk ( 0xFUL << RCC_CCR2_SYSDIV0_Pos ) +#define RCC_CCR2_SYSDIV0 ( RCC_CCR2_SYSDIV0_Msk ) +#define RCC_CCR2_SYSDIV0_0 ( 0x1UL << RCC_CCR2_SYSDIV0_Pos ) +#define RCC_CCR2_SYSDIV0_1 ( 0x2UL << RCC_CCR2_SYSDIV0_Pos ) +#define RCC_CCR2_SYSDIV0_2 ( 0x4UL << RCC_CCR2_SYSDIV0_Pos ) +#define RCC_CCR2_SYSDIV0_3 ( 0x8UL << RCC_CCR2_SYSDIV0_Pos ) + + +/*************** Bits definition for RCC_PERCFGR **********************/ + +#define RCC_PERCFGR_LPUART1CKS_Pos ( 26U ) +#define RCC_PERCFGR_LPUART1CKS_Msk ( 0x3UL << RCC_PERCFGR_LPUART1CKS_Pos ) +#define RCC_PERCFGR_LPUART1CKS ( RCC_PERCFGR_LPUART1CKS_Msk ) +#define RCC_PERCFGR_LPUART1CKS_0 ( 0x1UL << RCC_PERCFGR_LPUART1CKS_Pos ) +#define RCC_PERCFGR_LPUART1CKS_1 ( 0x2UL << RCC_PERCFGR_LPUART1CKS_Pos ) + +#define RCC_PERCFGR_LPUART1DIV_Pos ( 24U ) +#define RCC_PERCFGR_LPUART1DIV_Msk ( 0x3UL << RCC_PERCFGR_LPUART1DIV_Pos ) +#define RCC_PERCFGR_LPUART1DIV ( RCC_PERCFGR_LPUART1DIV_Msk ) +#define RCC_PERCFGR_LPUART1DIV_0 ( 0x1UL << RCC_PERCFGR_LPUART1DIV_Pos ) +#define RCC_PERCFGR_LPUART1DIV_1 ( 0x2UL << RCC_PERCFGR_LPUART1DIV_Pos ) + +#define RCC_PERCFGR_LPTIM6CKS_Pos ( 22U ) +#define RCC_PERCFGR_LPTIM6CKS_Msk ( 0x3UL << RCC_PERCFGR_LPTIM6CKS_Pos ) +#define RCC_PERCFGR_LPTIM6CKS ( RCC_PERCFGR_LPTIM6CKS_Msk ) +#define RCC_PERCFGR_LPTIM6CKS_0 ( 0x1UL << RCC_PERCFGR_LPTIM6CKS_Pos ) +#define RCC_PERCFGR_LPTIM6CKS_1 ( 0x2UL << RCC_PERCFGR_LPTIM6CKS_Pos ) + +#define RCC_PERCFGR_LPTIM345CKS_Pos ( 20U ) +#define RCC_PERCFGR_LPTIM345CKS_Msk ( 0x3UL << RCC_PERCFGR_LPTIM345CKS_Pos ) +#define RCC_PERCFGR_LPTIM345CKS ( RCC_PERCFGR_LPTIM345CKS_Msk ) +#define RCC_PERCFGR_LPTIM345CKS_0 ( 0x1UL << RCC_PERCFGR_LPTIM345CKS_Pos ) +#define RCC_PERCFGR_LPTIM345CKS_1 ( 0x2UL << RCC_PERCFGR_LPTIM345CKS_Pos ) + +#define RCC_PERCFGR_LPTIM2CKS_Pos ( 18U ) +#define RCC_PERCFGR_LPTIM2CKS_Msk ( 0x3UL << RCC_PERCFGR_LPTIM2CKS_Pos ) +#define RCC_PERCFGR_LPTIM2CKS ( RCC_PERCFGR_LPTIM2CKS_Msk ) +#define RCC_PERCFGR_LPTIM2CKS_0 ( 0x1UL << RCC_PERCFGR_LPTIM2CKS_Pos ) +#define RCC_PERCFGR_LPTIM2CKS_1 ( 0x2UL << RCC_PERCFGR_LPTIM2CKS_Pos ) + +#define RCC_PERCFGR_LPTIM1CKS_Pos ( 16U ) +#define RCC_PERCFGR_LPTIM1CKS_Msk ( 0x3UL << RCC_PERCFGR_LPTIM1CKS_Pos ) +#define RCC_PERCFGR_LPTIM1CKS ( RCC_PERCFGR_LPTIM1CKS_Msk ) +#define RCC_PERCFGR_LPTIM1CKS_0 ( 0x1UL << RCC_PERCFGR_LPTIM1CKS_Pos ) +#define RCC_PERCFGR_LPTIM1CKS_1 ( 0x2UL << RCC_PERCFGR_LPTIM1CKS_Pos ) + +#define RCC_PERCFGR_SDMMCCKS_Pos ( 11U ) +#define RCC_PERCFGR_SDMMCCKS_Msk ( 0x1UL << RCC_PERCFGR_SDMMCCKS_Pos ) +#define RCC_PERCFGR_SDMMCCKS ( RCC_PERCFGR_SDMMCCKS_Msk ) + +#define RCC_PERCFGR_SDMMCSCKS_Pos ( 8U ) +#define RCC_PERCFGR_SDMMCSCKS_Msk ( 0x3UL << RCC_PERCFGR_SDMMCSCKS_Pos ) +#define RCC_PERCFGR_SDMMCSCKS ( RCC_PERCFGR_SDMMCSCKS_Msk ) +#define RCC_PERCFGR_SDMMCSCKS_0 ( 0x1UL << RCC_PERCFGR_SDMMCSCKS_Pos ) +#define RCC_PERCFGR_SDMMCSCKS_1 ( 0x2UL << RCC_PERCFGR_SDMMCSCKS_Pos ) + +/*************** Bits definition for RCC_CIR **********************/ + +#define RCC_CIR_XTLSDF_Pos ( 31U ) +#define RCC_CIR_XTLSDF_Msk ( 0x1UL << RCC_CIR_XTLSDF_Pos ) +#define RCC_CIR_XTLSDF ( RCC_CIR_XTLSDF_Msk ) + +#define RCC_CIR_XTLSDIC_Pos ( 29U ) +#define RCC_CIR_XTLSDIC_Msk ( 0x1UL << RCC_CIR_XTLSDIC_Pos ) +#define RCC_CIR_XTLSDIC ( RCC_CIR_XTLSDIC_Msk ) + +#define RCC_CIR_XTLSDIE_Pos ( 28U ) +#define RCC_CIR_XTLSDIE_Msk ( 0x1UL << RCC_CIR_XTLSDIE_Pos ) +#define RCC_CIR_XTLSDIE ( RCC_CIR_XTLSDIE_Msk ) + +#define RCC_CIR_XTHSDF_Pos ( 27U ) +#define RCC_CIR_XTHSDF_Msk ( 0x1UL << RCC_CIR_XTHSDF_Pos ) +#define RCC_CIR_XTHSDF ( RCC_CIR_XTHSDF_Msk ) + +#define RCC_CIR_XTHSDIC_Pos ( 25U ) +#define RCC_CIR_XTHSDIC_Msk ( 0x1UL << RCC_CIR_XTHSDIC_Pos ) +#define RCC_CIR_XTHSDIC ( RCC_CIR_XTHSDIC_Msk ) + +#define RCC_CIR_XTHSDIE_Pos ( 24U ) +#define RCC_CIR_XTHSDIE_Msk ( 0x1UL << RCC_CIR_XTHSDIE_Pos ) +#define RCC_CIR_XTHSDIE ( RCC_CIR_XTHSDIE_Msk ) + +#define RCC_CIR_PLL3LOCKIC_Pos ( 22U ) +#define RCC_CIR_PLL3LOCKIC_Msk ( 0x1UL << RCC_CIR_PLL3LOCKIC_Pos ) +#define RCC_CIR_PLL3LOCKIC ( RCC_CIR_PLL3LOCKIC_Msk ) + +#define RCC_CIR_PLL2LOCKIC_Pos ( 21U ) +#define RCC_CIR_PLL2LOCKIC_Msk ( 0x1UL << RCC_CIR_PLL2LOCKIC_Pos ) +#define RCC_CIR_PLL2LOCKIC ( RCC_CIR_PLL2LOCKIC_Msk ) + +#define RCC_CIR_PLL1LOCKIC_Pos ( 20U ) +#define RCC_CIR_PLL1LOCKIC_Msk ( 0x1UL << RCC_CIR_PLL1LOCKIC_Pos ) +#define RCC_CIR_PLL1LOCKIC ( RCC_CIR_PLL1LOCKIC_Msk ) + +#define RCC_CIR_XTHRDYIC_Pos ( 19U ) +#define RCC_CIR_XTHRDYIC_Msk ( 0x1UL << RCC_CIR_XTHRDYIC_Pos ) +#define RCC_CIR_XTHRDYIC ( RCC_CIR_XTHRDYIC_Msk ) + +#define RCC_CIR_RCHRDYIC_Pos ( 18U ) +#define RCC_CIR_RCHRDYIC_Msk ( 0x1UL << RCC_CIR_RCHRDYIC_Pos ) +#define RCC_CIR_RCHRDYIC ( RCC_CIR_RCHRDYIC_Msk ) + +#define RCC_CIR_XTLRDYIC_Pos ( 17U ) +#define RCC_CIR_XTLRDYIC_Msk ( 0x1UL << RCC_CIR_XTLRDYIC_Pos ) +#define RCC_CIR_XTLRDYIC ( RCC_CIR_XTLRDYIC_Msk ) + +#define RCC_CIR_RCLRDYIC_Pos ( 16U ) +#define RCC_CIR_RCLRDYIC_Msk ( 0x1UL << RCC_CIR_RCLRDYIC_Pos ) +#define RCC_CIR_RCLRDYIC ( RCC_CIR_RCLRDYIC_Msk ) + +#define RCC_CIR_PLL3LOCKIE_Pos ( 14U ) +#define RCC_CIR_PLL3LOCKIE_Msk ( 0x1UL << RCC_CIR_PLL3LOCKIE_Pos ) +#define RCC_CIR_PLL3LOCKIE ( RCC_CIR_PLL3LOCKIE_Msk ) + +#define RCC_CIR_PLL2LOCKIE_Pos ( 13U ) +#define RCC_CIR_PLL2LOCKIE_Msk ( 0x1UL << RCC_CIR_PLL2LOCKIE_Pos ) +#define RCC_CIR_PLL2LOCKIE ( RCC_CIR_PLL2LOCKIE_Msk ) + +#define RCC_CIR_PLL1LOCKIE_Pos ( 12U ) +#define RCC_CIR_PLL1LOCKIE_Msk ( 0x1UL << RCC_CIR_PLL1LOCKIE_Pos ) +#define RCC_CIR_PLL1LOCKIE ( RCC_CIR_PLL1LOCKIE_Msk ) + +#define RCC_CIR_XTHRDYIE_Pos ( 11U ) +#define RCC_CIR_XTHRDYIE_Msk ( 0x1UL << RCC_CIR_XTHRDYIE_Pos ) +#define RCC_CIR_XTHRDYIE ( RCC_CIR_XTHRDYIE_Msk ) + +#define RCC_CIR_RCHRDYIE_Pos ( 10U ) +#define RCC_CIR_RCHRDYIE_Msk ( 0x1UL << RCC_CIR_RCHRDYIE_Pos ) +#define RCC_CIR_RCHRDYIE ( RCC_CIR_RCHRDYIE_Msk ) + +#define RCC_CIR_XTLRDYIE_Pos ( 9U ) +#define RCC_CIR_XTLRDYIE_Msk ( 0x1UL << RCC_CIR_XTLRDYIE_Pos ) +#define RCC_CIR_XTLRDYIE ( RCC_CIR_XTLRDYIE_Msk ) + +#define RCC_CIR_RCLRDYIE_Pos ( 8U ) +#define RCC_CIR_RCLRDYIE_Msk ( 0x1UL << RCC_CIR_RCLRDYIE_Pos ) +#define RCC_CIR_RCLRDYIE ( RCC_CIR_RCLRDYIE_Msk ) + +#define RCC_CIR_PLL3LOCKIF_Pos ( 6U ) +#define RCC_CIR_PLL3LOCKIF_Msk ( 0x1UL << RCC_CIR_PLL3LOCKIF_Pos ) +#define RCC_CIR_PLL3LOCKIF ( RCC_CIR_PLL3LOCKIF_Msk ) + +#define RCC_CIR_PLL2LOCKIF_Pos ( 5U ) +#define RCC_CIR_PLL2LOCKIF_Msk ( 0x1UL << RCC_CIR_PLL2LOCKIF_Pos ) +#define RCC_CIR_PLL2LOCKIF ( RCC_CIR_PLL2LOCKIF_Msk ) + +#define RCC_CIR_PLL1LOCKIF_Pos ( 4U ) +#define RCC_CIR_PLL1LOCKIF_Msk ( 0x1UL << RCC_CIR_PLL1LOCKIF_Pos ) +#define RCC_CIR_PLL1LOCKIF ( RCC_CIR_PLL1LOCKIF_Msk ) + +#define RCC_CIR_XTHRDYIF_Pos ( 3U ) +#define RCC_CIR_XTHRDYIF_Msk ( 0x1UL << RCC_CIR_XTHRDYIF_Pos ) +#define RCC_CIR_XTHRDYIF ( RCC_CIR_XTHRDYIF_Msk ) + +#define RCC_CIR_RCHRDYIF_Pos ( 2U ) +#define RCC_CIR_RCHRDYIF_Msk ( 0x1UL << RCC_CIR_RCHRDYIF_Pos ) +#define RCC_CIR_RCHRDYIF ( RCC_CIR_RCHRDYIF_Msk ) + +#define RCC_CIR_XTLRDYIF_Pos ( 1U ) +#define RCC_CIR_XTLRDYIF_Msk ( 0x1UL << RCC_CIR_XTLRDYIF_Pos ) +#define RCC_CIR_XTLRDYIF ( RCC_CIR_XTLRDYIF_Msk ) + +#define RCC_CIR_RCLRDYIF_Pos ( 0U ) +#define RCC_CIR_RCLRDYIF_Msk ( 0x1UL << RCC_CIR_RCLRDYIF_Pos ) +#define RCC_CIR_RCLRDYIF ( RCC_CIR_RCLRDYIF_Msk ) + + +/*************** Bits definition for RCC_AHB1CKENR **********************/ + +#define RCC_AHB1CKENR_SRAM3CKEN_Pos ( 31U ) +#define RCC_AHB1CKENR_SRAM3CKEN_Msk ( 0x1UL << RCC_AHB1CKENR_SRAM3CKEN_Pos ) +#define RCC_AHB1CKENR_SRAM3CKEN ( RCC_AHB1CKENR_SRAM3CKEN_Msk ) + +#define RCC_AHB1CKENR_SRAM2CKEN_Pos ( 30U ) +#define RCC_AHB1CKENR_SRAM2CKEN_Msk ( 0x1UL << RCC_AHB1CKENR_SRAM2CKEN_Pos ) +#define RCC_AHB1CKENR_SRAM2CKEN ( RCC_AHB1CKENR_SRAM2CKEN_Msk ) + +#define RCC_AHB1CKENR_SRAM1CKEN_Pos ( 29U ) +#define RCC_AHB1CKENR_SRAM1CKEN_Msk ( 0x1UL << RCC_AHB1CKENR_SRAM1CKEN_Pos ) +#define RCC_AHB1CKENR_SRAM1CKEN ( RCC_AHB1CKENR_SRAM1CKEN_Msk ) + +#define RCC_AHB1CKENR_ROMCKEN_Pos ( 28U ) +#define RCC_AHB1CKENR_ROMCKEN_Msk ( 0x1UL << RCC_AHB1CKENR_ROMCKEN_Pos ) +#define RCC_AHB1CKENR_ROMCKEN ( RCC_AHB1CKENR_ROMCKEN_Msk ) + +#define RCC_AHB1CKENR_BKPSRAMCKEN_Pos ( 27U ) +#define RCC_AHB1CKENR_BKPSRAMCKEN_Msk ( 0x1UL << RCC_AHB1CKENR_BKPSRAMCKEN_Pos ) +#define RCC_AHB1CKENR_BKPSRAMCKEN ( RCC_AHB1CKENR_BKPSRAMCKEN_Msk ) + +#define RCC_AHB1CKENR_FDCAN2CKEN_Pos ( 23U ) +#define RCC_AHB1CKENR_FDCAN2CKEN_Msk ( 0x1UL << RCC_AHB1CKENR_FDCAN2CKEN_Pos ) +#define RCC_AHB1CKENR_FDCAN2CKEN ( RCC_AHB1CKENR_FDCAN2CKEN_Msk ) + +#define RCC_AHB1CKENR_FDCAN1CKEN_Pos ( 22U ) +#define RCC_AHB1CKENR_FDCAN1CKEN_Msk ( 0x1UL << RCC_AHB1CKENR_FDCAN1CKEN_Pos ) +#define RCC_AHB1CKENR_FDCAN1CKEN ( RCC_AHB1CKENR_FDCAN1CKEN_Msk ) + +#define RCC_AHB1CKENR_USB2CCKEN_Pos ( 21U ) +#define RCC_AHB1CKENR_USB2CCKEN_Msk ( 0x1UL << RCC_AHB1CKENR_USB2CCKEN_Pos ) +#define RCC_AHB1CKENR_USB2CCKEN ( RCC_AHB1CKENR_USB2CCKEN_Msk ) + +#define RCC_AHB1CKENR_USB1CCKEN_Pos ( 20U ) +#define RCC_AHB1CKENR_USB1CCKEN_Msk ( 0x1UL << RCC_AHB1CKENR_USB1CCKEN_Pos ) +#define RCC_AHB1CKENR_USB1CCKEN ( RCC_AHB1CKENR_USB1CCKEN_Msk ) + +#define RCC_AHB1CKENR_SPI6CKEN_Pos ( 15U ) +#define RCC_AHB1CKENR_SPI6CKEN_Msk ( 0x1UL << RCC_AHB1CKENR_SPI6CKEN_Pos ) +#define RCC_AHB1CKENR_SPI6CKEN ( RCC_AHB1CKENR_SPI6CKEN_Msk ) + +#define RCC_AHB1CKENR_SPI5CKEN_Pos ( 14U ) +#define RCC_AHB1CKENR_SPI5CKEN_Msk ( 0x1UL << RCC_AHB1CKENR_SPI5CKEN_Pos ) +#define RCC_AHB1CKENR_SPI5CKEN ( RCC_AHB1CKENR_SPI5CKEN_Msk ) + +#define RCC_AHB1CKENR_SPI4CKEN_Pos ( 13U ) +#define RCC_AHB1CKENR_SPI4CKEN_Msk ( 0x1UL << RCC_AHB1CKENR_SPI4CKEN_Pos ) +#define RCC_AHB1CKENR_SPI4CKEN ( RCC_AHB1CKENR_SPI4CKEN_Msk ) + +#define RCC_AHB1CKENR_SPI3CKEN_Pos ( 12U ) +#define RCC_AHB1CKENR_SPI3CKEN_Msk ( 0x1UL << RCC_AHB1CKENR_SPI3CKEN_Pos ) +#define RCC_AHB1CKENR_SPI3CKEN ( RCC_AHB1CKENR_SPI3CKEN_Msk ) + +#define RCC_AHB1CKENR_SPI2CKEN_Pos ( 11U ) +#define RCC_AHB1CKENR_SPI2CKEN_Msk ( 0x1UL << RCC_AHB1CKENR_SPI2CKEN_Pos ) +#define RCC_AHB1CKENR_SPI2CKEN ( RCC_AHB1CKENR_SPI2CKEN_Msk ) + +#define RCC_AHB1CKENR_SPI1CKEN_Pos ( 10U ) +#define RCC_AHB1CKENR_SPI1CKEN_Msk ( 0x1UL << RCC_AHB1CKENR_SPI1CKEN_Pos ) +#define RCC_AHB1CKENR_SPI1CKEN ( RCC_AHB1CKENR_SPI1CKEN_Msk ) + +#define RCC_AHB1CKENR_DMA2DCKEN_Pos ( 9U ) +#define RCC_AHB1CKENR_DMA2DCKEN_Msk ( 0x1UL << RCC_AHB1CKENR_DMA2DCKEN_Pos ) +#define RCC_AHB1CKENR_DMA2DCKEN ( RCC_AHB1CKENR_DMA2DCKEN_Msk ) + +#define RCC_AHB1CKENR_ETHRXCKEN_Pos ( 8U ) +#define RCC_AHB1CKENR_ETHRXCKEN_Msk ( 0x1UL << RCC_AHB1CKENR_ETHRXCKEN_Pos ) +#define RCC_AHB1CKENR_ETHRXCKEN ( RCC_AHB1CKENR_ETHRXCKEN_Msk ) + +#define RCC_AHB1CKENR_ETHTXCKEN_Pos ( 7U ) +#define RCC_AHB1CKENR_ETHTXCKEN_Msk ( 0x1UL << RCC_AHB1CKENR_ETHTXCKEN_Pos ) +#define RCC_AHB1CKENR_ETHTXCKEN ( RCC_AHB1CKENR_ETHTXCKEN_Msk ) + +#define RCC_AHB1CKENR_ETHMACCKEN_Pos ( 6U ) +#define RCC_AHB1CKENR_ETHMACCKEN_Msk ( 0x1UL << RCC_AHB1CKENR_ETHMACCKEN_Pos ) +#define RCC_AHB1CKENR_ETHMACCKEN ( RCC_AHB1CKENR_ETHMACCKEN_Msk ) + +#define RCC_AHB1CKENR_CRCCKEN_Pos ( 5U ) +#define RCC_AHB1CKENR_CRCCKEN_Msk ( 0x1UL << RCC_AHB1CKENR_CRCCKEN_Pos ) +#define RCC_AHB1CKENR_CRCCKEN ( RCC_AHB1CKENR_CRCCKEN_Msk ) + +#define RCC_AHB1CKENR_DMA2CKEN_Pos ( 1U ) +#define RCC_AHB1CKENR_DMA2CKEN_Msk ( 0x1UL << RCC_AHB1CKENR_DMA2CKEN_Pos ) +#define RCC_AHB1CKENR_DMA2CKEN ( RCC_AHB1CKENR_DMA2CKEN_Msk ) + +#define RCC_AHB1CKENR_DMA1CKEN_Pos ( 0U ) +#define RCC_AHB1CKENR_DMA1CKEN_Msk ( 0x1UL << RCC_AHB1CKENR_DMA1CKEN_Pos ) +#define RCC_AHB1CKENR_DMA1CKEN ( RCC_AHB1CKENR_DMA1CKEN_Msk ) + + +/*************** Bits definition for RCC_AHB2CKENR **********************/ + +#define RCC_AHB2CKENR_THMCKEN_Pos ( 31U ) +#define RCC_AHB2CKENR_THMCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_THMCKEN_Pos ) +#define RCC_AHB2CKENR_THMCKEN ( RCC_AHB2CKENR_THMCKEN_Msk ) + +#define RCC_AHB2CKENR_FDCAN3CKEN_Pos ( 28U ) +#define RCC_AHB2CKENR_FDCAN3CKEN_Msk ( 0x1UL << RCC_AHB2CKENR_FDCAN3CKEN_Pos ) +#define RCC_AHB2CKENR_FDCAN3CKEN ( RCC_AHB2CKENR_FDCAN3CKEN_Msk ) + +#define RCC_AHB2CKENR_CORDICCKEN_Pos ( 27U ) +#define RCC_AHB2CKENR_CORDICCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_CORDICCKEN_Pos ) +#define RCC_AHB2CKENR_CORDICCKEN ( RCC_AHB2CKENR_CORDICCKEN_Msk ) + +#define RCC_AHB2CKENR_HRNGCKEN_Pos ( 26U ) +#define RCC_AHB2CKENR_HRNGCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_HRNGCKEN_Pos ) +#define RCC_AHB2CKENR_HRNGCKEN ( RCC_AHB2CKENR_HRNGCKEN_Msk ) + +#define RCC_AHB2CKENR_AESCKEN_Pos ( 25U ) +#define RCC_AHB2CKENR_AESCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_AESCKEN_Pos ) +#define RCC_AHB2CKENR_AESCKEN ( RCC_AHB2CKENR_AESCKEN_Msk ) + +#define RCC_AHB2CKENR_AESSPI1CKEN_Pos ( 24U ) +#define RCC_AHB2CKENR_AESSPI1CKEN_Msk ( 0x1UL << RCC_AHB2CKENR_AESSPI1CKEN_Pos ) +#define RCC_AHB2CKENR_AESSPI1CKEN ( RCC_AHB2CKENR_AESSPI1CKEN_Msk ) + +#define RCC_AHB2CKENR_DCMICKEN_Pos ( 23U ) +#define RCC_AHB2CKENR_DCMICKEN_Msk ( 0x1UL << RCC_AHB2CKENR_DCMICKEN_Pos ) +#define RCC_AHB2CKENR_DCMICKEN ( RCC_AHB2CKENR_DCMICKEN_Msk ) + +#define RCC_AHB2CKENR_DAC2CKEN_Pos ( 20U ) +#define RCC_AHB2CKENR_DAC2CKEN_Msk ( 0x1UL << RCC_AHB2CKENR_DAC2CKEN_Pos ) +#define RCC_AHB2CKENR_DAC2CKEN ( RCC_AHB2CKENR_DAC2CKEN_Msk ) + +#define RCC_AHB2CKENR_DAC1CKEN_Pos ( 19U ) +#define RCC_AHB2CKENR_DAC1CKEN_Msk ( 0x1UL << RCC_AHB2CKENR_DAC1CKEN_Pos ) +#define RCC_AHB2CKENR_DAC1CKEN ( RCC_AHB2CKENR_DAC1CKEN_Msk ) + +#define RCC_AHB2CKENR_ADC3CKEN_Pos ( 18U ) +#define RCC_AHB2CKENR_ADC3CKEN_Msk ( 0x1UL << RCC_AHB2CKENR_ADC3CKEN_Pos ) +#define RCC_AHB2CKENR_ADC3CKEN ( RCC_AHB2CKENR_ADC3CKEN_Msk ) + +#define RCC_AHB2CKENR_ADC12CKEN_Pos ( 17U ) +#define RCC_AHB2CKENR_ADC12CKEN_Msk ( 0x1UL << RCC_AHB2CKENR_ADC12CKEN_Pos ) +#define RCC_AHB2CKENR_ADC12CKEN ( RCC_AHB2CKENR_ADC12CKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOQCKEN_Pos ( 16U ) +#define RCC_AHB2CKENR_GPIOQCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOQCKEN_Pos ) +#define RCC_AHB2CKENR_GPIOQCKEN ( RCC_AHB2CKENR_GPIOQCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOPCKEN_Pos ( 15U ) +#define RCC_AHB2CKENR_GPIOPCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOPCKEN_Pos ) +#define RCC_AHB2CKENR_GPIOPCKEN ( RCC_AHB2CKENR_GPIOPCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOOCKEN_Pos ( 14U ) +#define RCC_AHB2CKENR_GPIOOCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOOCKEN_Pos ) +#define RCC_AHB2CKENR_GPIOOCKEN ( RCC_AHB2CKENR_GPIOOCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIONCKEN_Pos ( 13U ) +#define RCC_AHB2CKENR_GPIONCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIONCKEN_Pos ) +#define RCC_AHB2CKENR_GPIONCKEN ( RCC_AHB2CKENR_GPIONCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOMCKEN_Pos ( 12U ) +#define RCC_AHB2CKENR_GPIOMCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOMCKEN_Pos ) +#define RCC_AHB2CKENR_GPIOMCKEN ( RCC_AHB2CKENR_GPIOMCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOLCKEN_Pos ( 11U ) +#define RCC_AHB2CKENR_GPIOLCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOLCKEN_Pos ) +#define RCC_AHB2CKENR_GPIOLCKEN ( RCC_AHB2CKENR_GPIOLCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOKCKEN_Pos ( 10U ) +#define RCC_AHB2CKENR_GPIOKCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOKCKEN_Pos ) +#define RCC_AHB2CKENR_GPIOKCKEN ( RCC_AHB2CKENR_GPIOKCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOJCKEN_Pos ( 9U ) +#define RCC_AHB2CKENR_GPIOJCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOJCKEN_Pos ) +#define RCC_AHB2CKENR_GPIOJCKEN ( RCC_AHB2CKENR_GPIOJCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOICKEN_Pos ( 8U ) +#define RCC_AHB2CKENR_GPIOICKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOICKEN_Pos ) +#define RCC_AHB2CKENR_GPIOICKEN ( RCC_AHB2CKENR_GPIOICKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOHCKEN_Pos ( 7U ) +#define RCC_AHB2CKENR_GPIOHCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOHCKEN_Pos ) +#define RCC_AHB2CKENR_GPIOHCKEN ( RCC_AHB2CKENR_GPIOHCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOGCKEN_Pos ( 6U ) +#define RCC_AHB2CKENR_GPIOGCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOGCKEN_Pos ) +#define RCC_AHB2CKENR_GPIOGCKEN ( RCC_AHB2CKENR_GPIOGCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOFCKEN_Pos ( 5U ) +#define RCC_AHB2CKENR_GPIOFCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOFCKEN_Pos ) +#define RCC_AHB2CKENR_GPIOFCKEN ( RCC_AHB2CKENR_GPIOFCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOECKEN_Pos ( 4U ) +#define RCC_AHB2CKENR_GPIOECKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOECKEN_Pos ) +#define RCC_AHB2CKENR_GPIOECKEN ( RCC_AHB2CKENR_GPIOECKEN_Msk ) + +#define RCC_AHB2CKENR_GPIODCKEN_Pos ( 3U ) +#define RCC_AHB2CKENR_GPIODCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIODCKEN_Pos ) +#define RCC_AHB2CKENR_GPIODCKEN ( RCC_AHB2CKENR_GPIODCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOCCKEN_Pos ( 2U ) +#define RCC_AHB2CKENR_GPIOCCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOCCKEN_Pos ) +#define RCC_AHB2CKENR_GPIOCCKEN ( RCC_AHB2CKENR_GPIOCCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOBCKEN_Pos ( 1U ) +#define RCC_AHB2CKENR_GPIOBCKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOBCKEN_Pos ) +#define RCC_AHB2CKENR_GPIOBCKEN ( RCC_AHB2CKENR_GPIOBCKEN_Msk ) + +#define RCC_AHB2CKENR_GPIOACKEN_Pos ( 0U ) +#define RCC_AHB2CKENR_GPIOACKEN_Msk ( 0x1UL << RCC_AHB2CKENR_GPIOACKEN_Pos ) +#define RCC_AHB2CKENR_GPIOACKEN ( RCC_AHB2CKENR_GPIOACKEN_Msk ) + + +/*************** Bits definition for RCC_AHB3CKENR **********************/ + +#define RCC_AHB3CKENR_FMCCKEN_Pos ( 12U ) +#define RCC_AHB3CKENR_FMCCKEN_Msk ( 0x1UL << RCC_AHB3CKENR_FMCCKEN_Pos ) +#define RCC_AHB3CKENR_FMCCKEN ( RCC_AHB3CKENR_FMCCKEN_Msk ) + +#define RCC_AHB3CKENR_OSPI2CKEN_Pos ( 9U ) +#define RCC_AHB3CKENR_OSPI2CKEN_Msk ( 0x1UL << RCC_AHB3CKENR_OSPI2CKEN_Pos ) +#define RCC_AHB3CKENR_OSPI2CKEN ( RCC_AHB3CKENR_OSPI2CKEN_Msk ) + +#define RCC_AHB3CKENR_OSPI1CKEN_Pos ( 8U ) +#define RCC_AHB3CKENR_OSPI1CKEN_Msk ( 0x1UL << RCC_AHB3CKENR_OSPI1CKEN_Pos ) +#define RCC_AHB3CKENR_OSPI1CKEN ( RCC_AHB3CKENR_OSPI1CKEN_Msk ) + +#define RCC_AHB3CKENR_SDMMCCKEN_Pos ( 4U ) +#define RCC_AHB3CKENR_SDMMCCKEN_Msk ( 0x1UL << RCC_AHB3CKENR_SDMMCCKEN_Pos ) +#define RCC_AHB3CKENR_SDMMCCKEN ( RCC_AHB3CKENR_SDMMCCKEN_Msk ) + +#define RCC_AHB3CKENR_SPI8CKEN_Pos ( 1U ) +#define RCC_AHB3CKENR_SPI8CKEN_Msk ( 0x1UL << RCC_AHB3CKENR_SPI8CKEN_Pos ) +#define RCC_AHB3CKENR_SPI8CKEN ( RCC_AHB3CKENR_SPI8CKEN_Msk ) + +#define RCC_AHB3CKENR_SPI7CKEN_Pos ( 0U ) +#define RCC_AHB3CKENR_SPI7CKEN_Msk ( 0x1UL << RCC_AHB3CKENR_SPI7CKEN_Pos ) +#define RCC_AHB3CKENR_SPI7CKEN ( RCC_AHB3CKENR_SPI7CKEN_Msk ) + + +/*************** Bits definition for RCC_APB1CKENR1 **********************/ + +#define RCC_APB1CKENR1_LPUART1CKEN_Pos ( 31U ) +#define RCC_APB1CKENR1_LPUART1CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_LPUART1CKEN_Pos ) +#define RCC_APB1CKENR1_LPUART1CKEN ( RCC_APB1CKENR1_LPUART1CKEN_Msk ) + +#define RCC_APB1CKENR1_LPTIM1CKEN_Pos ( 30U ) +#define RCC_APB1CKENR1_LPTIM1CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_LPTIM1CKEN_Pos ) +#define RCC_APB1CKENR1_LPTIM1CKEN ( RCC_APB1CKENR1_LPTIM1CKEN_Msk ) + +#define RCC_APB1CKENR1_PMUCKEN_Pos ( 27U ) +#define RCC_APB1CKENR1_PMUCKEN_Msk ( 0x1UL << RCC_APB1CKENR1_PMUCKEN_Pos ) +#define RCC_APB1CKENR1_PMUCKEN ( RCC_APB1CKENR1_PMUCKEN_Msk ) + +#define RCC_APB1CKENR1_I2C4CKEN_Pos ( 24U ) +#define RCC_APB1CKENR1_I2C4CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_I2C4CKEN_Pos ) +#define RCC_APB1CKENR1_I2C4CKEN ( RCC_APB1CKENR1_I2C4CKEN_Msk ) + +#define RCC_APB1CKENR1_I2C3CKEN_Pos ( 23U ) +#define RCC_APB1CKENR1_I2C3CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_I2C3CKEN_Pos ) +#define RCC_APB1CKENR1_I2C3CKEN ( RCC_APB1CKENR1_I2C3CKEN_Msk ) + +#define RCC_APB1CKENR1_I2C2CKEN_Pos ( 22U ) +#define RCC_APB1CKENR1_I2C2CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_I2C2CKEN_Pos ) +#define RCC_APB1CKENR1_I2C2CKEN ( RCC_APB1CKENR1_I2C2CKEN_Msk ) + +#define RCC_APB1CKENR1_I2C1CKEN_Pos ( 21U ) +#define RCC_APB1CKENR1_I2C1CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_I2C1CKEN_Pos ) +#define RCC_APB1CKENR1_I2C1CKEN ( RCC_APB1CKENR1_I2C1CKEN_Msk ) + +#define RCC_APB1CKENR1_USART5CKEN_Pos ( 20U ) +#define RCC_APB1CKENR1_USART5CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_USART5CKEN_Pos ) +#define RCC_APB1CKENR1_USART5CKEN ( RCC_APB1CKENR1_USART5CKEN_Msk ) + +#define RCC_APB1CKENR1_USART4CKEN_Pos ( 19U ) +#define RCC_APB1CKENR1_USART4CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_USART4CKEN_Pos ) +#define RCC_APB1CKENR1_USART4CKEN ( RCC_APB1CKENR1_USART4CKEN_Msk ) + +#define RCC_APB1CKENR1_USART3CKEN_Pos ( 18U ) +#define RCC_APB1CKENR1_USART3CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_USART3CKEN_Pos ) +#define RCC_APB1CKENR1_USART3CKEN ( RCC_APB1CKENR1_USART3CKEN_Msk ) + +#define RCC_APB1CKENR1_USART2CKEN_Pos ( 17U ) +#define RCC_APB1CKENR1_USART2CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_USART2CKEN_Pos ) +#define RCC_APB1CKENR1_USART2CKEN ( RCC_APB1CKENR1_USART2CKEN_Msk ) + +#define RCC_APB1CKENR1_I2S3CKEN_Pos ( 16U ) +#define RCC_APB1CKENR1_I2S3CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_I2S3CKEN_Pos ) +#define RCC_APB1CKENR1_I2S3CKEN ( RCC_APB1CKENR1_I2S3CKEN_Msk ) + +#define RCC_APB1CKENR1_I2S2CKEN_Pos ( 15U ) +#define RCC_APB1CKENR1_I2S2CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_I2S2CKEN_Pos ) +#define RCC_APB1CKENR1_I2S2CKEN ( RCC_APB1CKENR1_I2S2CKEN_Msk ) + +#define RCC_APB1CKENR1_I2S1CKEN_Pos ( 14U ) +#define RCC_APB1CKENR1_I2S1CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_I2S1CKEN_Pos ) +#define RCC_APB1CKENR1_I2S1CKEN ( RCC_APB1CKENR1_I2S1CKEN_Msk ) + +#define RCC_APB1CKENR1_WDTCKEN_Pos ( 11U ) +#define RCC_APB1CKENR1_WDTCKEN_Msk ( 0x1UL << RCC_APB1CKENR1_WDTCKEN_Pos ) +#define RCC_APB1CKENR1_WDTCKEN ( RCC_APB1CKENR1_WDTCKEN_Msk ) + +#define RCC_APB1CKENR1_RTCCKEN_Pos ( 10U ) +#define RCC_APB1CKENR1_RTCCKEN_Msk ( 0x1UL << RCC_APB1CKENR1_RTCCKEN_Pos ) +#define RCC_APB1CKENR1_RTCCKEN ( RCC_APB1CKENR1_RTCCKEN_Msk ) + +#define RCC_APB1CKENR1_TIM14CKEN_Pos ( 8U ) +#define RCC_APB1CKENR1_TIM14CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_TIM14CKEN_Pos ) +#define RCC_APB1CKENR1_TIM14CKEN ( RCC_APB1CKENR1_TIM14CKEN_Msk ) + +#define RCC_APB1CKENR1_TIM13CKEN_Pos ( 7U ) +#define RCC_APB1CKENR1_TIM13CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_TIM13CKEN_Pos ) +#define RCC_APB1CKENR1_TIM13CKEN ( RCC_APB1CKENR1_TIM13CKEN_Msk ) + +#define RCC_APB1CKENR1_TIM12CKEN_Pos ( 6U ) +#define RCC_APB1CKENR1_TIM12CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_TIM12CKEN_Pos ) +#define RCC_APB1CKENR1_TIM12CKEN ( RCC_APB1CKENR1_TIM12CKEN_Msk ) + +#define RCC_APB1CKENR1_TIM7CKEN_Pos ( 5U ) +#define RCC_APB1CKENR1_TIM7CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_TIM7CKEN_Pos ) +#define RCC_APB1CKENR1_TIM7CKEN ( RCC_APB1CKENR1_TIM7CKEN_Msk ) + +#define RCC_APB1CKENR1_TIM6CKEN_Pos ( 4U ) +#define RCC_APB1CKENR1_TIM6CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_TIM6CKEN_Pos ) +#define RCC_APB1CKENR1_TIM6CKEN ( RCC_APB1CKENR1_TIM6CKEN_Msk ) + +#define RCC_APB1CKENR1_TIM5CKEN_Pos ( 3U ) +#define RCC_APB1CKENR1_TIM5CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_TIM5CKEN_Pos ) +#define RCC_APB1CKENR1_TIM5CKEN ( RCC_APB1CKENR1_TIM5CKEN_Msk ) + +#define RCC_APB1CKENR1_TIM4CKEN_Pos ( 2U ) +#define RCC_APB1CKENR1_TIM4CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_TIM4CKEN_Pos ) +#define RCC_APB1CKENR1_TIM4CKEN ( RCC_APB1CKENR1_TIM4CKEN_Msk ) + +#define RCC_APB1CKENR1_TIM3CKEN_Pos ( 1U ) +#define RCC_APB1CKENR1_TIM3CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_TIM3CKEN_Pos ) +#define RCC_APB1CKENR1_TIM3CKEN ( RCC_APB1CKENR1_TIM3CKEN_Msk ) + +#define RCC_APB1CKENR1_TIM2CKEN_Pos ( 0U ) +#define RCC_APB1CKENR1_TIM2CKEN_Msk ( 0x1UL << RCC_APB1CKENR1_TIM2CKEN_Pos ) +#define RCC_APB1CKENR1_TIM2CKEN ( RCC_APB1CKENR1_TIM2CKEN_Msk ) + + +/*************** Bits definition for RCC_APB1CKENR2 **********************/ + +#define RCC_APB1CKENR2_EFUSE2CKEN_Pos ( 7U ) +#define RCC_APB1CKENR2_EFUSE2CKEN_Msk ( 0x1UL << RCC_APB1CKENR2_EFUSE2CKEN_Pos ) +#define RCC_APB1CKENR2_EFUSE2CKEN ( RCC_APB1CKENR2_EFUSE2CKEN_Msk ) + +#define RCC_APB1CKENR2_EFUSE1CKEN_Pos ( 6U ) +#define RCC_APB1CKENR2_EFUSE1CKEN_Msk ( 0x1UL << RCC_APB1CKENR2_EFUSE1CKEN_Pos ) +#define RCC_APB1CKENR2_EFUSE1CKEN ( RCC_APB1CKENR2_EFUSE1CKEN_Msk ) + +#define RCC_APB1CKENR2_TIM26CKEN_Pos ( 5U ) +#define RCC_APB1CKENR2_TIM26CKEN_Msk ( 0x1UL << RCC_APB1CKENR2_TIM26CKEN_Pos ) +#define RCC_APB1CKENR2_TIM26CKEN ( RCC_APB1CKENR2_TIM26CKEN_Msk ) + +#define RCC_APB1CKENR2_TIM25CKEN_Pos ( 4U ) +#define RCC_APB1CKENR2_TIM25CKEN_Msk ( 0x1UL << RCC_APB1CKENR2_TIM25CKEN_Pos ) +#define RCC_APB1CKENR2_TIM25CKEN ( RCC_APB1CKENR2_TIM25CKEN_Msk ) + +#define RCC_APB1CKENR2_USART8CKEN_Pos ( 3U ) +#define RCC_APB1CKENR2_USART8CKEN_Msk ( 0x1UL << RCC_APB1CKENR2_USART8CKEN_Pos ) +#define RCC_APB1CKENR2_USART8CKEN ( RCC_APB1CKENR2_USART8CKEN_Msk ) + +#define RCC_APB1CKENR2_USART7CKEN_Pos ( 2U ) +#define RCC_APB1CKENR2_USART7CKEN_Msk ( 0x1UL << RCC_APB1CKENR2_USART7CKEN_Pos ) +#define RCC_APB1CKENR2_USART7CKEN ( RCC_APB1CKENR2_USART7CKEN_Msk ) + +#define RCC_APB1CKENR2_LPTIM2CKEN_Pos ( 1U ) +#define RCC_APB1CKENR2_LPTIM2CKEN_Msk ( 0x1UL << RCC_APB1CKENR2_LPTIM2CKEN_Pos ) +#define RCC_APB1CKENR2_LPTIM2CKEN ( RCC_APB1CKENR2_LPTIM2CKEN_Msk ) + + +/*************** Bits definition for RCC_APB2CKENR **********************/ + +#define RCC_APB2CKENR_USART10CKEN_Pos ( 31U ) +#define RCC_APB2CKENR_USART10CKEN_Msk ( 0x1UL << RCC_APB2CKENR_USART10CKEN_Pos ) +#define RCC_APB2CKENR_USART10CKEN ( RCC_APB2CKENR_USART10CKEN_Msk ) + +#define RCC_APB2CKENR_USART9CKEN_Pos ( 30U ) +#define RCC_APB2CKENR_USART9CKEN_Msk ( 0x1UL << RCC_APB2CKENR_USART9CKEN_Pos ) +#define RCC_APB2CKENR_USART9CKEN ( RCC_APB2CKENR_USART9CKEN_Msk ) + +#define RCC_APB2CKENR_TIM24CKEN_Pos ( 29U ) +#define RCC_APB2CKENR_TIM24CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM24CKEN_Pos ) +#define RCC_APB2CKENR_TIM24CKEN ( RCC_APB2CKENR_TIM24CKEN_Msk ) + +#define RCC_APB2CKENR_TIM23CKEN_Pos ( 28U ) +#define RCC_APB2CKENR_TIM23CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM23CKEN_Pos ) +#define RCC_APB2CKENR_TIM23CKEN ( RCC_APB2CKENR_TIM23CKEN_Msk ) + +#define RCC_APB2CKENR_TIM22CKEN_Pos ( 27U ) +#define RCC_APB2CKENR_TIM22CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM22CKEN_Pos ) +#define RCC_APB2CKENR_TIM22CKEN ( RCC_APB2CKENR_TIM22CKEN_Msk ) + +#define RCC_APB2CKENR_TIM21CKEN_Pos ( 26U ) +#define RCC_APB2CKENR_TIM21CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM21CKEN_Pos ) +#define RCC_APB2CKENR_TIM21CKEN ( RCC_APB2CKENR_TIM21CKEN_Msk ) + +#define RCC_APB2CKENR_TIM19CKEN_Pos ( 25U ) +#define RCC_APB2CKENR_TIM19CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM19CKEN_Pos ) +#define RCC_APB2CKENR_TIM19CKEN ( RCC_APB2CKENR_TIM19CKEN_Msk ) + +#define RCC_APB2CKENR_TIM18CKEN_Pos ( 24U ) +#define RCC_APB2CKENR_TIM18CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM18CKEN_Pos ) +#define RCC_APB2CKENR_TIM18CKEN ( RCC_APB2CKENR_TIM18CKEN_Msk ) + +#define RCC_APB2CKENR_TIM11CKEN_Pos ( 23U ) +#define RCC_APB2CKENR_TIM11CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM11CKEN_Pos ) +#define RCC_APB2CKENR_TIM11CKEN ( RCC_APB2CKENR_TIM11CKEN_Msk ) + +#define RCC_APB2CKENR_TIM10CKEN_Pos ( 22U ) +#define RCC_APB2CKENR_TIM10CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM10CKEN_Pos ) +#define RCC_APB2CKENR_TIM10CKEN ( RCC_APB2CKENR_TIM10CKEN_Msk ) + +#define RCC_APB2CKENR_TIM9CKEN_Pos ( 21U ) +#define RCC_APB2CKENR_TIM9CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM9CKEN_Pos ) +#define RCC_APB2CKENR_TIM9CKEN ( RCC_APB2CKENR_TIM9CKEN_Msk ) + +#define RCC_APB2CKENR_LTDCCKEN_Pos ( 19U ) +#define RCC_APB2CKENR_LTDCCKEN_Msk ( 0x1UL << RCC_APB2CKENR_LTDCCKEN_Pos ) +#define RCC_APB2CKENR_LTDCCKEN ( RCC_APB2CKENR_LTDCCKEN_Msk ) + +#define RCC_APB2CKENR_TKEYCKEN_Pos ( 18U ) +#define RCC_APB2CKENR_TKEYCKEN_Msk ( 0x1UL << RCC_APB2CKENR_TKEYCKEN_Pos ) +#define RCC_APB2CKENR_TKEYCKEN ( RCC_APB2CKENR_TKEYCKEN_Msk ) + +#define RCC_APB2CKENR_TIM20CKEN_Pos ( 15U ) +#define RCC_APB2CKENR_TIM20CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM20CKEN_Pos ) +#define RCC_APB2CKENR_TIM20CKEN ( RCC_APB2CKENR_TIM20CKEN_Msk ) + +#define RCC_APB2CKENR_TIM17CKEN_Pos ( 13U ) +#define RCC_APB2CKENR_TIM17CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM17CKEN_Pos ) +#define RCC_APB2CKENR_TIM17CKEN ( RCC_APB2CKENR_TIM17CKEN_Msk ) + +#define RCC_APB2CKENR_TIM16CKEN_Pos ( 12U ) +#define RCC_APB2CKENR_TIM16CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM16CKEN_Pos ) +#define RCC_APB2CKENR_TIM16CKEN ( RCC_APB2CKENR_TIM16CKEN_Msk ) + +#define RCC_APB2CKENR_TIM15CKEN_Pos ( 11U ) +#define RCC_APB2CKENR_TIM15CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM15CKEN_Pos ) +#define RCC_APB2CKENR_TIM15CKEN ( RCC_APB2CKENR_TIM15CKEN_Msk ) + +#define RCC_APB2CKENR_USART6CKEN_Pos ( 10U ) +#define RCC_APB2CKENR_USART6CKEN_Msk ( 0x1UL << RCC_APB2CKENR_USART6CKEN_Pos ) +#define RCC_APB2CKENR_USART6CKEN ( RCC_APB2CKENR_USART6CKEN_Msk ) + +#define RCC_APB2CKENR_USART1CKEN_Pos ( 9U ) +#define RCC_APB2CKENR_USART1CKEN_Msk ( 0x1UL << RCC_APB2CKENR_USART1CKEN_Pos ) +#define RCC_APB2CKENR_USART1CKEN ( RCC_APB2CKENR_USART1CKEN_Msk ) + +#define RCC_APB2CKENR_TIM8CKEN_Pos ( 8U ) +#define RCC_APB2CKENR_TIM8CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM8CKEN_Pos ) +#define RCC_APB2CKENR_TIM8CKEN ( RCC_APB2CKENR_TIM8CKEN_Msk ) + +#define RCC_APB2CKENR_TIM1CKEN_Pos ( 6U ) +#define RCC_APB2CKENR_TIM1CKEN_Msk ( 0x1UL << RCC_APB2CKENR_TIM1CKEN_Pos ) +#define RCC_APB2CKENR_TIM1CKEN ( RCC_APB2CKENR_TIM1CKEN_Msk ) + +#define RCC_APB2CKENR_EXTICKEN_Pos ( 4U ) +#define RCC_APB2CKENR_EXTICKEN_Msk ( 0x1UL << RCC_APB2CKENR_EXTICKEN_Pos ) +#define RCC_APB2CKENR_EXTICKEN ( RCC_APB2CKENR_EXTICKEN_Msk ) + +#define RCC_APB2CKENR_CMP1CKEN_A_Pos ( 2U ) +#define RCC_APB2CKENR_CMP1CKEN_A_Msk ( 0x1UL << RCC_APB2CKENR_CMP1CKEN_A_Pos ) +#define RCC_APB2CKENR_CMP1CKEN_A ( RCC_APB2CKENR_CMP1CKEN_A_Msk ) + +#define RCC_APB2CKENR_SYSCFGCKEN_Pos ( 0U ) +#define RCC_APB2CKENR_SYSCFGCKEN_Msk ( 0x1UL << RCC_APB2CKENR_SYSCFGCKEN_Pos ) +#define RCC_APB2CKENR_SYSCFGCKEN ( RCC_APB2CKENR_SYSCFGCKEN_Msk ) + + +/*************** Bits definition for RCC_APB3CKENR **********************/ + +#define RCC_APB3CKENR_LPTIM6CKEN_Pos ( 3U ) +#define RCC_APB3CKENR_LPTIM6CKEN_Msk ( 0x1UL << RCC_APB3CKENR_LPTIM6CKEN_Pos ) +#define RCC_APB3CKENR_LPTIM6CKEN ( RCC_APB3CKENR_LPTIM6CKEN_Msk ) + +#define RCC_APB3CKENR_LPTIM5CKEN_Pos ( 2U ) +#define RCC_APB3CKENR_LPTIM5CKEN_Msk ( 0x1UL << RCC_APB3CKENR_LPTIM5CKEN_Pos ) +#define RCC_APB3CKENR_LPTIM5CKEN ( RCC_APB3CKENR_LPTIM5CKEN_Msk ) + +#define RCC_APB3CKENR_LPTIM4CKEN_Pos ( 1U ) +#define RCC_APB3CKENR_LPTIM4CKEN_Msk ( 0x1UL << RCC_APB3CKENR_LPTIM4CKEN_Pos ) +#define RCC_APB3CKENR_LPTIM4CKEN ( RCC_APB3CKENR_LPTIM4CKEN_Msk ) + +#define RCC_APB3CKENR_LPTIM3CKEN_Pos ( 0U ) +#define RCC_APB3CKENR_LPTIM3CKEN_Msk ( 0x1UL << RCC_APB3CKENR_LPTIM3CKEN_Pos ) +#define RCC_APB3CKENR_LPTIM3CKEN ( RCC_APB3CKENR_LPTIM3CKEN_Msk ) + +/*************** Bits definition for RCC_APB4CKENR **********************/ + +#define RCC_APB4CKENR_DPWM6CKEN_Pos ( 17U ) +#define RCC_APB4CKENR_DPWM6CKEN_Msk ( 0x1UL << RCC_APB4CKENR_DPWM6CKEN_Pos ) +#define RCC_APB4CKENR_DPWM6CKEN ( RCC_APB4CKENR_DPWM6CKEN_Msk ) + +#define RCC_APB4CKENR_DPWM5CKEN_Pos ( 16U ) +#define RCC_APB4CKENR_DPWM5CKEN_Msk ( 0x1UL << RCC_APB4CKENR_DPWM5CKEN_Pos ) +#define RCC_APB4CKENR_DPWM5CKEN ( RCC_APB4CKENR_DPWM5CKEN_Msk ) + +#define RCC_APB4CKENR_SPWM6CKEN_Pos ( 15U ) +#define RCC_APB4CKENR_SPWM6CKEN_Msk ( 0x1UL << RCC_APB4CKENR_SPWM6CKEN_Pos ) +#define RCC_APB4CKENR_SPWM6CKEN ( RCC_APB4CKENR_SPWM6CKEN_Msk ) + +#define RCC_APB4CKENR_SPWM5CKEN_Pos ( 14U ) +#define RCC_APB4CKENR_SPWM5CKEN_Msk ( 0x1UL << RCC_APB4CKENR_SPWM5CKEN_Pos ) +#define RCC_APB4CKENR_SPWM5CKEN ( RCC_APB4CKENR_SPWM5CKEN_Msk ) + +#define RCC_APB4CKENR_SPWM4CKEN_Pos ( 13U ) +#define RCC_APB4CKENR_SPWM4CKEN_Msk ( 0x1UL << RCC_APB4CKENR_SPWM4CKEN_Pos ) +#define RCC_APB4CKENR_SPWM4CKEN ( RCC_APB4CKENR_SPWM4CKEN_Msk ) + +#define RCC_APB4CKENR_SPWM3CKEN_Pos ( 12U ) +#define RCC_APB4CKENR_SPWM3CKEN_Msk ( 0x1UL << RCC_APB4CKENR_SPWM3CKEN_Pos ) +#define RCC_APB4CKENR_SPWM3CKEN ( RCC_APB4CKENR_SPWM3CKEN_Msk ) + +#define RCC_APB4CKENR_MDACCKEN_Pos ( 8U ) +#define RCC_APB4CKENR_MDACCKEN_Msk ( 0x1UL << RCC_APB4CKENR_MDACCKEN_Pos ) +#define RCC_APB4CKENR_MDACCKEN ( RCC_APB4CKENR_MDACCKEN_Msk ) + +#define RCC_APB4CKENR_LPTCKEN_Pos ( 7U ) +#define RCC_APB4CKENR_LPTCKEN_Msk ( 0x1UL << RCC_APB4CKENR_LPTCKEN_Pos ) +#define RCC_APB4CKENR_LPTCKEN ( RCC_APB4CKENR_LPTCKEN_Msk ) + +#define RCC_APB4CKENR_PNDLCKEN_Pos ( 6U ) +#define RCC_APB4CKENR_PNDLCKEN_Msk ( 0x1UL << RCC_APB4CKENR_PNDLCKEN_Pos ) +#define RCC_APB4CKENR_PNDLCKEN ( RCC_APB4CKENR_PNDLCKEN_Msk ) + +#define RCC_APB4CKENR_DPWM4CKEN_Pos ( 5U ) +#define RCC_APB4CKENR_DPWM4CKEN_Msk ( 0x1UL << RCC_APB4CKENR_DPWM4CKEN_Pos ) +#define RCC_APB4CKENR_DPWM4CKEN ( RCC_APB4CKENR_DPWM4CKEN_Msk ) + +#define RCC_APB4CKENR_DPWM3CKEN_Pos ( 4U ) +#define RCC_APB4CKENR_DPWM3CKEN_Msk ( 0x1UL << RCC_APB4CKENR_DPWM3CKEN_Pos ) +#define RCC_APB4CKENR_DPWM3CKEN ( RCC_APB4CKENR_DPWM3CKEN_Msk ) + +#define RCC_APB4CKENR_DPWM2CKEN_Pos ( 3U ) +#define RCC_APB4CKENR_DPWM2CKEN_Msk ( 0x1UL << RCC_APB4CKENR_DPWM2CKEN_Pos ) +#define RCC_APB4CKENR_DPWM2CKEN ( RCC_APB4CKENR_DPWM2CKEN_Msk ) + +#define RCC_APB4CKENR_DPWM1CKEN_Pos ( 2U ) +#define RCC_APB4CKENR_DPWM1CKEN_Msk ( 0x1UL << RCC_APB4CKENR_DPWM1CKEN_Pos ) +#define RCC_APB4CKENR_DPWM1CKEN ( RCC_APB4CKENR_DPWM1CKEN_Msk ) + +#define RCC_APB4CKENR_SPWM2CKEN_Pos ( 1U ) +#define RCC_APB4CKENR_SPWM2CKEN_Msk ( 0x1UL << RCC_APB4CKENR_SPWM2CKEN_Pos ) +#define RCC_APB4CKENR_SPWM2CKEN ( RCC_APB4CKENR_SPWM2CKEN_Msk ) + +#define RCC_APB4CKENR_SPWM1CKEN_Pos ( 0U ) +#define RCC_APB4CKENR_SPWM1CKEN_Msk ( 0x1UL << RCC_APB4CKENR_SPWM1CKEN_Pos ) +#define RCC_APB4CKENR_SPWM1CKEN ( RCC_APB4CKENR_SPWM1CKEN_Msk ) + + +/*************** Bits definition for RCC_RCHCR **********************/ + +#define RCC_RCHCR_RCHPRDY_Pos ( 24U ) +#define RCC_RCHCR_RCHPRDY_Msk ( 0x1UL << RCC_RCHCR_RCHPRDY_Pos ) +#define RCC_RCHCR_RCHPRDY ( RCC_RCHCR_RCHPRDY_Msk ) + +#define RCC_RCHCR_RCHSEL_Pos ( 21U ) +#define RCC_RCHCR_RCHSEL_Msk ( 0x1UL << RCC_RCHCR_RCHSEL_Pos ) +#define RCC_RCHCR_RCHSEL ( RCC_RCHCR_RCHSEL_Msk ) + +#define RCC_RCHCR_RCHPEN_Pos ( 20U ) +#define RCC_RCHCR_RCHPEN_Msk ( 0x1UL << RCC_RCHCR_RCHPEN_Pos ) +#define RCC_RCHCR_RCHPEN ( RCC_RCHCR_RCHPEN_Msk ) + +#define RCC_RCHCR_RCHTRIMH_Pos ( 15U ) +#define RCC_RCHCR_RCHTRIMH_Msk ( 0x3UL << RCC_RCHCR_RCHTRIMH_Pos ) +#define RCC_RCHCR_RCHTRIMH ( RCC_RCHCR_RCHTRIMH_Msk ) + +#define RCC_RCHCR_RCHTRIML_Pos ( 8U ) +#define RCC_RCHCR_RCHTRIML_Msk ( 0x7FUL << RCC_RCHCR_RCHTRIML_Pos ) +#define RCC_RCHCR_RCHTRIML ( RCC_RCHCR_RCHTRIML_Msk ) + +#define RCC_RCHCR_RCHRDY_Pos ( 4U ) +#define RCC_RCHCR_RCHRDY_Msk ( 0x1UL << RCC_RCHCR_RCHRDY_Pos ) +#define RCC_RCHCR_RCHRDY ( RCC_RCHCR_RCHRDY_Msk ) + +#define RCC_RCHCR_RCHDIV_Pos ( 3U ) +#define RCC_RCHCR_RCHDIV_Msk ( 0x1UL << RCC_RCHCR_RCHDIV_Pos ) +#define RCC_RCHCR_RCHDIV ( RCC_RCHCR_RCHDIV_Msk ) + +#define RCC_RCHCR_RCHEN_Pos ( 0U ) +#define RCC_RCHCR_RCHEN_Msk ( 0x1UL << RCC_RCHCR_RCHEN_Pos ) +#define RCC_RCHCR_RCHEN ( RCC_RCHCR_RCHEN_Msk ) + + +/*************** Bits definition for RCC_XTHCR **********************/ + +#define RCC_XTHCR_XTHSDEN_Pos ( 8U ) +#define RCC_XTHCR_XTHSDEN_Msk ( 0x1UL << RCC_XTHCR_XTHSDEN_Pos ) +#define RCC_XTHCR_XTHSDEN ( RCC_XTHCR_XTHSDEN_Msk ) + +#define RCC_XTHCR_XTHRDY_Pos ( 4U ) +#define RCC_XTHCR_XTHRDY_Msk ( 0x1UL << RCC_XTHCR_XTHRDY_Pos ) +#define RCC_XTHCR_XTHRDY ( RCC_XTHCR_XTHRDY_Msk ) + +#define RCC_XTHCR_XTHRDYTIME_Pos ( 2U ) +#define RCC_XTHCR_XTHRDYTIME_Msk ( 0x3UL << RCC_XTHCR_XTHRDYTIME_Pos ) +#define RCC_XTHCR_XTHRDYTIME ( RCC_XTHCR_XTHRDYTIME_Msk ) +#define RCC_XTHCR_XTHRDYTIME_0 ( 0x1UL << RCC_XTHCR_XTHRDYTIME_Pos ) +#define RCC_XTHCR_XTHRDYTIME_1 ( 0x2UL << RCC_XTHCR_XTHRDYTIME_Pos ) + +#define RCC_XTHCR_XTHBYP_Pos ( 1U ) +#define RCC_XTHCR_XTHBYP_Msk ( 0x1UL << RCC_XTHCR_XTHBYP_Pos ) +#define RCC_XTHCR_XTHBYP ( RCC_XTHCR_XTHBYP_Msk ) + +#define RCC_XTHCR_XTHEN_Pos ( 0U ) +#define RCC_XTHCR_XTHEN_Msk ( 0x1UL << RCC_XTHCR_XTHEN_Pos ) +#define RCC_XTHCR_XTHEN ( RCC_XTHCR_XTHEN_Msk ) + + +/*************** Bits definition for RCC_PLL1CR **********************/ + +#define RCC_PLL1CR_PLL1LOCKSEL_Pos ( 31U ) +#define RCC_PLL1CR_PLL1LOCKSEL_Msk ( 0x1UL << RCC_PLL1CR_PLL1LOCKSEL_Pos ) +#define RCC_PLL1CR_PLL1LOCKSEL ( RCC_PLL1CR_PLL1LOCKSEL_Msk ) + +#define RCC_PLL1CR_PLL1FREERUN_Pos ( 30U ) +#define RCC_PLL1CR_PLL1FREERUN_Msk ( 0x1UL << RCC_PLL1CR_PLL1FREERUN_Pos ) +#define RCC_PLL1CR_PLL1FREERUN ( RCC_PLL1CR_PLL1FREERUN_Msk ) + +#define RCC_PLL1CR_PLL1LOCK_Pos ( 29U ) +#define RCC_PLL1CR_PLL1LOCK_Msk ( 0x1UL << RCC_PLL1CR_PLL1LOCK_Pos ) +#define RCC_PLL1CR_PLL1LOCK ( RCC_PLL1CR_PLL1LOCK_Msk ) + +#define RCC_PLL1CR_PLL1LOCKDLY_Pos ( 23U ) +#define RCC_PLL1CR_PLL1LOCKDLY_Msk ( 0x3FUL << RCC_PLL1CR_PLL1LOCKDLY_Pos ) +#define RCC_PLL1CR_PLL1LOCKDLY ( RCC_PLL1CR_PLL1LOCKDLY_Msk ) +#define RCC_PLL1CR_PLL1LOCKDLY_0 ( 0x1UL << RCC_PLL1CR_PLL1LOCKDLY_Pos ) +#define RCC_PLL1CR_PLL1LOCKDLY_1 ( 0x2UL << RCC_PLL1CR_PLL1LOCKDLY_Pos ) +#define RCC_PLL1CR_PLL1LOCKDLY_2 ( 0x4UL << RCC_PLL1CR_PLL1LOCKDLY_Pos ) +#define RCC_PLL1CR_PLL1LOCKDLY_3 ( 0x8UL << RCC_PLL1CR_PLL1LOCKDLY_Pos ) +#define RCC_PLL1CR_PLL1LOCKDLY_4 ( 0x10UL << RCC_PLL1CR_PLL1LOCKDLY_Pos ) +#define RCC_PLL1CR_PLL1LOCKDLY_5 ( 0x20UL << RCC_PLL1CR_PLL1LOCKDLY_Pos ) + +#define RCC_PLL1CR_PLL1UPDATEEN_Pos ( 22U ) +#define RCC_PLL1CR_PLL1UPDATEEN_Msk ( 0x1UL << RCC_PLL1CR_PLL1UPDATEEN_Pos ) +#define RCC_PLL1CR_PLL1UPDATEEN ( RCC_PLL1CR_PLL1UPDATEEN_Msk ) + +#define RCC_PLL1CR_PLL1SLEEP_Pos ( 21U ) +#define RCC_PLL1CR_PLL1SLEEP_Msk ( 0x1UL << RCC_PLL1CR_PLL1SLEEP_Pos ) +#define RCC_PLL1CR_PLL1SLEEP ( RCC_PLL1CR_PLL1SLEEP_Msk ) + +#define RCC_PLL1CR_PLL1QCLKEN_Pos ( 5U ) +#define RCC_PLL1CR_PLL1QCLKEN_Msk ( 0x1UL << RCC_PLL1CR_PLL1QCLKEN_Pos ) +#define RCC_PLL1CR_PLL1QCLKEN ( RCC_PLL1CR_PLL1QCLKEN_Msk ) + +#define RCC_PLL1CR_PLL1PCLKEN_Pos ( 4U ) +#define RCC_PLL1CR_PLL1PCLKEN_Msk ( 0x1UL << RCC_PLL1CR_PLL1PCLKEN_Pos ) +#define RCC_PLL1CR_PLL1PCLKEN ( RCC_PLL1CR_PLL1PCLKEN_Msk ) + +#define RCC_PLL1CR_PLL1SRCSEL_Pos ( 1U ) +#define RCC_PLL1CR_PLL1SRCSEL_Msk ( 0x1UL << RCC_PLL1CR_PLL1SRCSEL_Pos ) +#define RCC_PLL1CR_PLL1SRCSEL ( RCC_PLL1CR_PLL1SRCSEL_Msk ) + +#define RCC_PLL1CR_PLL1EN_Pos ( 0U ) +#define RCC_PLL1CR_PLL1EN_Msk ( 0x1UL << RCC_PLL1CR_PLL1EN_Pos ) +#define RCC_PLL1CR_PLL1EN ( RCC_PLL1CR_PLL1EN_Msk ) + + +/*************** Bits definition for RCC_PLL1CFR **********************/ + +#define RCC_PLL1CFR_PLL1Q_Pos ( 24U ) +#define RCC_PLL1CFR_PLL1Q_Msk ( 0xfUL << RCC_PLL1CFR_PLL1Q_Pos ) +#define RCC_PLL1CFR_PLL1Q ( RCC_PLL1CFR_PLL1Q_Msk ) +#define RCC_PLL1CFR_PLL1Q_0 ( 0x1UL << RCC_PLL1CFR_PLL1Q_Pos ) +#define RCC_PLL1CFR_PLL1Q_1 ( 0x2UL << RCC_PLL1CFR_PLL1Q_Pos ) +#define RCC_PLL1CFR_PLL1Q_2 ( 0x4UL << RCC_PLL1CFR_PLL1Q_Pos ) +#define RCC_PLL1CFR_PLL1Q_3 ( 0x8UL << RCC_PLL1CFR_PLL1Q_Pos ) + +#define RCC_PLL1CFR_PLL1P_Pos ( 20U ) +#define RCC_PLL1CFR_PLL1P_Msk ( 0x3UL << RCC_PLL1CFR_PLL1P_Pos ) +#define RCC_PLL1CFR_PLL1P ( RCC_PLL1CFR_PLL1P_Msk ) +#define RCC_PLL1CFR_PLL1P_0 ( 0x1UL << RCC_PLL1CFR_PLL1P_Pos ) +#define RCC_PLL1CFR_PLL1P_1 ( 0x2UL << RCC_PLL1CFR_PLL1P_Pos ) + +#define RCC_PLL1CFR_PLL1N_Pos ( 12U ) +#define RCC_PLL1CFR_PLL1N_Msk ( 0x3fUL << RCC_PLL1CFR_PLL1N_Pos ) +#define RCC_PLL1CFR_PLL1N ( RCC_PLL1CFR_PLL1N_Msk ) +#define RCC_PLL1CFR_PLL1N_0 ( 0x1UL << RCC_PLL1CFR_PLL1N_Pos ) +#define RCC_PLL1CFR_PLL1N_1 ( 0x2UL << RCC_PLL1CFR_PLL1N_Pos ) +#define RCC_PLL1CFR_PLL1N_2 ( 0x4UL << RCC_PLL1CFR_PLL1N_Pos ) +#define RCC_PLL1CFR_PLL1N_3 ( 0x8UL << RCC_PLL1CFR_PLL1N_Pos ) +#define RCC_PLL1CFR_PLL1N_4 ( 0x10UL << RCC_PLL1CFR_PLL1N_Pos ) +#define RCC_PLL1CFR_PLL1N_5 ( 0x20UL << RCC_PLL1CFR_PLL1N_Pos ) + +#define RCC_PLL1CFR_PLL1F_Pos ( 0U ) +#define RCC_PLL1CFR_PLL1F_Msk ( 0x1ffUL << RCC_PLL1CFR_PLL1F_Pos ) +#define RCC_PLL1CFR_PLL1F ( RCC_PLL1CFR_PLL1F_Msk ) + + +/*************** Bits definition for RCC_PLL1SCR **********************/ + +#define RCC_PLL1SCR_PLL1SSCSTP_Pos ( 17U ) +#define RCC_PLL1SCR_PLL1SSCSTP_Msk ( 0x7fffUL << RCC_PLL1SCR_PLL1SSCSTP_Pos ) +#define RCC_PLL1SCR_PLL1SSCSTP ( RCC_PLL1SCR_PLL1SSCSTP_Msk ) + +#define RCC_PLL1SCR_PLL1SSCPER_Pos ( 4U ) +#define RCC_PLL1SCR_PLL1SSCPER_Msk ( 0x1fffUL << RCC_PLL1SCR_PLL1SSCPER_Pos ) +#define RCC_PLL1SCR_PLL1SSCPER ( RCC_PLL1SCR_PLL1SSCPER_Msk ) + +#define RCC_PLL1SCR_PLL1SSCMD_Pos ( 1U ) +#define RCC_PLL1SCR_PLL1SSCMD_Msk ( 0x1UL << RCC_PLL1SCR_PLL1SSCMD_Pos ) +#define RCC_PLL1SCR_PLL1SSCMD ( RCC_PLL1SCR_PLL1SSCMD_Msk ) + +#define RCC_PLL1SCR_PLL1SSCEN_Pos ( 0U ) +#define RCC_PLL1SCR_PLL1SSCEN_Msk ( 0x1UL << RCC_PLL1SCR_PLL1SSCEN_Pos ) +#define RCC_PLL1SCR_PLL1SSCEN ( RCC_PLL1SCR_PLL1SSCEN_Msk ) + + +/*************** Bits definition for RCC_PLL2CR **********************/ + +#define RCC_PLL2CR_PLL2LOCKSEL_Pos ( 31U ) +#define RCC_PLL2CR_PLL2LOCKSEL_Msk ( 0x1UL << RCC_PLL2CR_PLL2LOCKSEL_Pos ) +#define RCC_PLL2CR_PLL2LOCKSEL ( RCC_PLL2CR_PLL2LOCKSEL_Msk ) + +#define RCC_PLL2CR_PLL2FREERUN_Pos ( 30U ) +#define RCC_PLL2CR_PLL2FREERUN_Msk ( 0x1UL << RCC_PLL2CR_PLL2FREERUN_Pos ) +#define RCC_PLL2CR_PLL2FREERUN ( RCC_PLL2CR_PLL2FREERUN_Msk ) + +#define RCC_PLL2CR_PLL2LOCK_Pos ( 29U ) +#define RCC_PLL2CR_PLL2LOCK_Msk ( 0x1UL << RCC_PLL2CR_PLL2LOCK_Pos ) +#define RCC_PLL2CR_PLL2LOCK ( RCC_PLL2CR_PLL2LOCK_Msk ) + +#define RCC_PLL2CR_PLL2LOCKDLY_Pos ( 23U ) +#define RCC_PLL2CR_PLL2LOCKDLY_Msk ( 0x3fUL << RCC_PLL2CR_PLL2LOCKDLY_Pos ) +#define RCC_PLL2CR_PLL2LOCKDLY ( RCC_PLL2CR_PLL2LOCKDLY_Msk ) +#define RCC_PLL2CR_PLL2LOCKDLY_0 ( 0x1UL << RCC_PLL2CR_PLL2LOCKDLY_Pos ) +#define RCC_PLL2CR_PLL2LOCKDLY_1 ( 0x2UL << RCC_PLL2CR_PLL2LOCKDLY_Pos ) +#define RCC_PLL2CR_PLL2LOCKDLY_2 ( 0x4UL << RCC_PLL2CR_PLL2LOCKDLY_Pos ) +#define RCC_PLL2CR_PLL2LOCKDLY_3 ( 0x8UL << RCC_PLL2CR_PLL2LOCKDLY_Pos ) +#define RCC_PLL2CR_PLL2LOCKDLY_4 ( 0x10UL << RCC_PLL2CR_PLL2LOCKDLY_Pos ) +#define RCC_PLL2CR_PLL2LOCKDLY_5 ( 0x20UL << RCC_PLL2CR_PLL2LOCKDLY_Pos ) + +#define RCC_PLL2CR_PLL2UPDATEEN_Pos ( 22U ) +#define RCC_PLL2CR_PLL2UPDATEEN_Msk ( 0x1UL << RCC_PLL2CR_PLL2UPDATEEN_Pos ) +#define RCC_PLL2CR_PLL2UPDATEEN ( RCC_PLL2CR_PLL2UPDATEEN_Msk ) + +#define RCC_PLL2CR_PLL2SLEEP_Pos ( 21U ) +#define RCC_PLL2CR_PLL2SLEEP_Msk ( 0x1UL << RCC_PLL2CR_PLL2SLEEP_Pos ) +#define RCC_PLL2CR_PLL2SLEEP ( RCC_PLL2CR_PLL2SLEEP_Msk ) + +#define RCC_PLL2CR_PLL2QCLKEN_Pos ( 5U ) +#define RCC_PLL2CR_PLL2QCLKEN_Msk ( 0x1UL << RCC_PLL2CR_PLL2QCLKEN_Pos ) +#define RCC_PLL2CR_PLL2QCLKEN ( RCC_PLL2CR_PLL2QCLKEN_Msk ) + +#define RCC_PLL2CR_PLL2PCLKEN_Pos ( 4U ) +#define RCC_PLL2CR_PLL2PCLKEN_Msk ( 0x1UL << RCC_PLL2CR_PLL2PCLKEN_Pos ) +#define RCC_PLL2CR_PLL2PCLKEN ( RCC_PLL2CR_PLL2PCLKEN_Msk ) + +#define RCC_PLL2CR_PLL2SRCSEL_Pos ( 1U ) +#define RCC_PLL2CR_PLL2SRCSEL_Msk ( 0x1UL << RCC_PLL2CR_PLL2SRCSEL_Pos ) +#define RCC_PLL2CR_PLL2SRCSEL ( RCC_PLL2CR_PLL2SRCSEL_Msk ) + +#define RCC_PLL2CR_PLL2EN_Pos ( 0U ) +#define RCC_PLL2CR_PLL2EN_Msk ( 0x1UL << RCC_PLL2CR_PLL2EN_Pos ) +#define RCC_PLL2CR_PLL2EN ( RCC_PLL2CR_PLL2EN_Msk ) + + +/*************** Bits definition for RCC_PLL2CFR **********************/ + +#define RCC_PLL2CFR_PLL2Q_Pos ( 24U ) +#define RCC_PLL2CFR_PLL2Q_Msk ( 0xfUL << RCC_PLL2CFR_PLL2Q_Pos ) +#define RCC_PLL2CFR_PLL2Q ( RCC_PLL2CFR_PLL2Q_Msk ) +#define RCC_PLL2CFR_PLL2Q_0 ( 0x1UL << RCC_PLL2CFR_PLL2Q_Pos ) +#define RCC_PLL2CFR_PLL2Q_1 ( 0x2UL << RCC_PLL2CFR_PLL2Q_Pos ) +#define RCC_PLL2CFR_PLL2Q_2 ( 0x4UL << RCC_PLL2CFR_PLL2Q_Pos ) +#define RCC_PLL2CFR_PLL2Q_3 ( 0x8UL << RCC_PLL2CFR_PLL2Q_Pos ) + +#define RCC_PLL2CFR_PLL2P_Pos ( 20U ) +#define RCC_PLL2CFR_PLL2P_Msk ( 0x3UL << RCC_PLL2CFR_PLL2P_Pos ) +#define RCC_PLL2CFR_PLL2P ( RCC_PLL2CFR_PLL2P_Msk ) +#define RCC_PLL2CFR_PLL2P_0 ( 0x1UL << RCC_PLL2CFR_PLL2P_Pos ) +#define RCC_PLL2CFR_PLL2P_1 ( 0x2UL << RCC_PLL2CFR_PLL2P_Pos ) + +#define RCC_PLL2CFR_PLL2N_Pos ( 12U ) +#define RCC_PLL2CFR_PLL2N_Msk ( 0x3fUL << RCC_PLL2CFR_PLL2N_Pos ) +#define RCC_PLL2CFR_PLL2N ( RCC_PLL2CFR_PLL2N_Msk ) +#define RCC_PLL2CFR_PLL2N_0 ( 0x1UL << RCC_PLL2CFR_PLL2N_Pos ) +#define RCC_PLL2CFR_PLL2N_1 ( 0x2UL << RCC_PLL2CFR_PLL2N_Pos ) +#define RCC_PLL2CFR_PLL2N_2 ( 0x4UL << RCC_PLL2CFR_PLL2N_Pos ) +#define RCC_PLL2CFR_PLL2N_3 ( 0x8UL << RCC_PLL2CFR_PLL2N_Pos ) +#define RCC_PLL2CFR_PLL2N_4 ( 0x10UL << RCC_PLL2CFR_PLL2N_Pos ) +#define RCC_PLL2CFR_PLL2N_5 ( 0x20UL << RCC_PLL2CFR_PLL2N_Pos ) + +#define RCC_PLL2CFR_PLL2F_Pos ( 0U ) +#define RCC_PLL2CFR_PLL2F_Msk ( 0x1ffUL << RCC_PLL2CFR_PLL2F_Pos ) +#define RCC_PLL2CFR_PLL2F ( RCC_PLL2CFR_PLL2F_Msk ) + + +/*************** Bits definition for RCC_PLL2SCR **********************/ + +#define RCC_PLL2SCR_PLL2SSCSTP_Pos ( 17U ) +#define RCC_PLL2SCR_PLL2SSCSTP_Msk ( 0x7fffUL << RCC_PLL2SCR_PLL2SSCSTP_Pos ) +#define RCC_PLL2SCR_PLL2SSCSTP ( RCC_PLL2SCR_PLL2SSCSTP_Msk ) + +#define RCC_PLL2SCR_PLL2SSCPER_Pos ( 4U ) +#define RCC_PLL2SCR_PLL2SSCPER_Msk ( 0x1fffUL << RCC_PLL2SCR_PLL2SSCPER_Pos ) +#define RCC_PLL2SCR_PLL2SSCPER ( RCC_PLL2SCR_PLL2SSCPER_Msk ) + +#define RCC_PLL2SCR_PLL2SSCMD_Pos ( 1U ) +#define RCC_PLL2SCR_PLL2SSCMD_Msk ( 0x1UL << RCC_PLL2SCR_PLL2SSCMD_Pos ) +#define RCC_PLL2SCR_PLL2SSCMD ( RCC_PLL2SCR_PLL2SSCMD_Msk ) + +#define RCC_PLL2SCR_PLL2SSCEN_Pos ( 0U ) +#define RCC_PLL2SCR_PLL2SSCEN_Msk ( 0x1UL << RCC_PLL2SCR_PLL2SSCEN_Pos ) +#define RCC_PLL2SCR_PLL2SSCEN ( RCC_PLL2SCR_PLL2SSCEN_Msk ) + + +/*************** Bits definition for RCC_PLL3CR **********************/ + +#define RCC_PLL3CR_PLL3LOCKSEL_Pos ( 31U ) +#define RCC_PLL3CR_PLL3LOCKSEL_Msk ( 0x1UL << RCC_PLL3CR_PLL3LOCKSEL_Pos ) +#define RCC_PLL3CR_PLL3LOCKSEL ( RCC_PLL3CR_PLL3LOCKSEL_Msk ) + +#define RCC_PLL3CR_PLL3FREERUN_Pos ( 30U ) +#define RCC_PLL3CR_PLL3FREERUN_Msk ( 0x1UL << RCC_PLL3CR_PLL3FREERUN_Pos ) +#define RCC_PLL3CR_PLL3FREERUN ( RCC_PLL3CR_PLL3FREERUN_Msk ) + +#define RCC_PLL3CR_PLL3LOCK_Pos ( 29U ) +#define RCC_PLL3CR_PLL3LOCK_Msk ( 0x1UL << RCC_PLL3CR_PLL3LOCK_Pos ) +#define RCC_PLL3CR_PLL3LOCK ( RCC_PLL3CR_PLL3LOCK_Msk ) + +#define RCC_PLL3CR_PLL3LOCKDLY_Pos ( 23U ) +#define RCC_PLL3CR_PLL3LOCKDLY_Msk ( 0x3fUL << RCC_PLL3CR_PLL3LOCKDLY_Pos ) +#define RCC_PLL3CR_PLL3LOCKDLY ( RCC_PLL3CR_PLL3LOCKDLY_Msk ) +#define RCC_PLL3CR_PLL3LOCKDLY_0 ( 0x1UL << RCC_PLL3CR_PLL3LOCKDLY_Pos ) +#define RCC_PLL3CR_PLL3LOCKDLY_1 ( 0x2UL << RCC_PLL3CR_PLL3LOCKDLY_Pos ) +#define RCC_PLL3CR_PLL3LOCKDLY_2 ( 0x4UL << RCC_PLL3CR_PLL3LOCKDLY_Pos ) +#define RCC_PLL3CR_PLL3LOCKDLY_3 ( 0x8UL << RCC_PLL3CR_PLL3LOCKDLY_Pos ) +#define RCC_PLL3CR_PLL3LOCKDLY_4 ( 0x10UL << RCC_PLL3CR_PLL3LOCKDLY_Pos ) +#define RCC_PLL3CR_PLL3LOCKDLY_5 ( 0x20UL << RCC_PLL3CR_PLL3LOCKDLY_Pos ) + +#define RCC_PLL3CR_PLL3UPDATEEN_Pos ( 22U ) +#define RCC_PLL3CR_PLL3UPDATEEN_Msk ( 0x1UL << RCC_PLL3CR_PLL3UPDATEEN_Pos ) +#define RCC_PLL3CR_PLL3UPDATEEN ( RCC_PLL3CR_PLL3UPDATEEN_Msk ) + +#define RCC_PLL3CR_PLL3SLEEP_Pos ( 21U ) +#define RCC_PLL3CR_PLL3SLEEP_Msk ( 0x1UL << RCC_PLL3CR_PLL3SLEEP_Pos ) +#define RCC_PLL3CR_PLL3SLEEP ( RCC_PLL3CR_PLL3SLEEP_Msk ) + +#define RCC_PLL3CR_PLL3QCLKEN_Pos ( 5U ) +#define RCC_PLL3CR_PLL3QCLKEN_Msk ( 0x1UL << RCC_PLL3CR_PLL3QCLKEN_Pos ) +#define RCC_PLL3CR_PLL3QCLKEN ( RCC_PLL3CR_PLL3QCLKEN_Msk ) + +#define RCC_PLL3CR_PLL3PCLKEN_Pos ( 4U ) +#define RCC_PLL3CR_PLL3PCLKEN_Msk ( 0x1UL << RCC_PLL3CR_PLL3PCLKEN_Pos ) +#define RCC_PLL3CR_PLL3PCLKEN ( RCC_PLL3CR_PLL3PCLKEN_Msk ) + +#define RCC_PLL3CR_PLL3SRCSEL_Pos ( 1U ) +#define RCC_PLL3CR_PLL3SRCSEL_Msk ( 0x1UL << RCC_PLL3CR_PLL3SRCSEL_Pos ) +#define RCC_PLL3CR_PLL3SRCSEL ( RCC_PLL3CR_PLL3SRCSEL_Msk ) + +#define RCC_PLL3CR_PLL3EN_Pos ( 0U ) +#define RCC_PLL3CR_PLL3EN_Msk ( 0x1UL << RCC_PLL3CR_PLL3EN_Pos ) +#define RCC_PLL3CR_PLL3EN ( RCC_PLL3CR_PLL3EN_Msk ) + + +/*************** Bits definition for RCC_PLL3CFR **********************/ + +#define RCC_PLL3CFR_PLL3Q_Pos ( 24U ) +#define RCC_PLL3CFR_PLL3Q_Msk ( 0x3UL << RCC_PLL3CFR_PLL3Q_Pos ) +#define RCC_PLL3CFR_PLL3Q ( RCC_PLL3CFR_PLL3Q_Msk ) +#define RCC_PLL3CFR_PLL3Q_0 ( 0x1UL << RCC_PLL3CFR_PLL3Q_Pos ) +#define RCC_PLL3CFR_PLL3Q_1 ( 0x2UL << RCC_PLL3CFR_PLL3Q_Pos ) + +#define RCC_PLL3CFR_PLL3P_Pos ( 20U ) +#define RCC_PLL3CFR_PLL3P_Msk ( 0x3UL << RCC_PLL3CFR_PLL3P_Pos ) +#define RCC_PLL3CFR_PLL3P ( RCC_PLL3CFR_PLL3P_Msk ) +#define RCC_PLL3CFR_PLL3P_0 ( 0x1UL << RCC_PLL3CFR_PLL3P_Pos ) +#define RCC_PLL3CFR_PLL3P_1 ( 0x2UL << RCC_PLL3CFR_PLL3P_Pos ) + +#define RCC_PLL3CFR_PLL3N_Pos ( 12U ) +#define RCC_PLL3CFR_PLL3N_Msk ( 0x3fUL << RCC_PLL3CFR_PLL3N_Pos ) +#define RCC_PLL3CFR_PLL3N ( RCC_PLL3CFR_PLL3N_Msk ) +#define RCC_PLL3CFR_PLL3N_0 ( 0x1UL << RCC_PLL3CFR_PLL3N_Pos ) +#define RCC_PLL3CFR_PLL3N_1 ( 0x2UL << RCC_PLL3CFR_PLL3N_Pos ) + +#define RCC_PLL3CFR_PLL3F_Pos ( 0U ) +#define RCC_PLL3CFR_PLL3F_Msk ( 0x7fUL << RCC_PLL3CFR_PLL3F_Pos ) +#define RCC_PLL3CFR_PLL3F ( RCC_PLL3CFR_PLL3F_Msk ) +#define RCC_PLL3CFR_PLL3F_0 ( 0x01UL << RCC_PLL3CFR_PLL3F_Pos ) +#define RCC_PLL3CFR_PLL3F_1 ( 0x02UL << RCC_PLL3CFR_PLL3F_Pos ) +#define RCC_PLL3CFR_PLL3F_2 ( 0x04UL << RCC_PLL3CFR_PLL3F_Pos ) +#define RCC_PLL3CFR_PLL3F_3 ( 0x08UL << RCC_PLL3CFR_PLL3F_Pos ) +#define RCC_PLL3CFR_PLL3F_4 ( 0x10UL << RCC_PLL3CFR_PLL3F_Pos ) +#define RCC_PLL3CFR_PLL3F_5 ( 0x20UL << RCC_PLL3CFR_PLL3F_Pos ) +#define RCC_PLL3CFR_PLL3F_6 ( 0x40UL << RCC_PLL3CFR_PLL3F_Pos ) + +/*************** Bits definition for RCC_CLKOCR **********************/ + +#define RCC_CLKOCR_MCO2EN_Pos ( 31U ) +#define RCC_CLKOCR_MCO2EN_Msk ( 0x1UL << RCC_CLKOCR_MCO2EN_Pos ) +#define RCC_CLKOCR_MCO2EN ( RCC_CLKOCR_MCO2EN_Msk ) + +#define RCC_CLKOCR_MCO2POL_Pos ( 30U ) +#define RCC_CLKOCR_MCO2POL_Msk ( 0x1UL << RCC_CLKOCR_MCO2POL_Pos ) +#define RCC_CLKOCR_MCO2POL ( RCC_CLKOCR_MCO2POL_Msk ) + +#define RCC_CLKOCR_MCO2DIV_Pos ( 24U ) +#define RCC_CLKOCR_MCO2DIV_Msk ( 0x3fUL << RCC_CLKOCR_MCO2DIV_Pos ) +#define RCC_CLKOCR_MCO2DIV ( RCC_CLKOCR_MCO2DIV_Msk ) +#define RCC_CLKOCR_MCO2DIV_0 ( 0x1UL << RCC_CLKOCR_MCO2DIV_Pos ) +#define RCC_CLKOCR_MCO2DIV_1 ( 0x2UL << RCC_CLKOCR_MCO2DIV_Pos ) +#define RCC_CLKOCR_MCO2DIV_2 ( 0x4UL << RCC_CLKOCR_MCO2DIV_Pos ) +#define RCC_CLKOCR_MCO2DIV_3 ( 0x8UL << RCC_CLKOCR_MCO2DIV_Pos ) +#define RCC_CLKOCR_MCO2DIV_4 ( 0x10UL << RCC_CLKOCR_MCO2DIV_Pos ) +#define RCC_CLKOCR_MCO2DIV_5 ( 0x20UL << RCC_CLKOCR_MCO2DIV_Pos ) + +#define RCC_CLKOCR_MCO1EN_Pos ( 23U ) +#define RCC_CLKOCR_MCO1EN_Msk ( 0x1UL << RCC_CLKOCR_MCO1EN_Pos ) +#define RCC_CLKOCR_MCO1EN ( RCC_CLKOCR_MCO1EN_Msk ) + +#define RCC_CLKOCR_MCO1POL_Pos ( 22U ) +#define RCC_CLKOCR_MCO1POL_Msk ( 0x1UL << RCC_CLKOCR_MCO1POL_Pos ) +#define RCC_CLKOCR_MCO1POL ( RCC_CLKOCR_MCO1POL_Msk ) + +#define RCC_CLKOCR_MCO1DIV_Pos ( 6U ) +#define RCC_CLKOCR_MCO1DIV_Msk ( 0xffffUL << RCC_CLKOCR_MCO1DIV_Pos ) +#define RCC_CLKOCR_MCO1DIV ( RCC_CLKOCR_MCO1DIV_Msk ) + +#define RCC_CLKOCR_MCO1SEL_Pos ( 5U ) +#define RCC_CLKOCR_MCO1SEL_Msk ( 0x1UL << RCC_CLKOCR_MCO1SEL_Pos ) +#define RCC_CLKOCR_MCO1SEL ( RCC_CLKOCR_MCO1SEL_Msk ) + +#define RCC_CLKOCR_MCOCLKS_Pos ( 0U ) +#define RCC_CLKOCR_MCOCLKS_Msk ( 0x1fUL << RCC_CLKOCR_MCOCLKS_Pos ) +#define RCC_CLKOCR_MCOCLKS ( RCC_CLKOCR_MCOCLKS_Msk ) +#define RCC_CLKOCR_MCOCLKS_0 ( 0x01UL << RCC_CLKOCR_MCOCLKS_Pos ) +#define RCC_CLKOCR_MCOCLKS_1 ( 0x02UL << RCC_CLKOCR_MCOCLKS_Pos ) +#define RCC_CLKOCR_MCOCLKS_2 ( 0x04UL << RCC_CLKOCR_MCOCLKS_Pos ) +#define RCC_CLKOCR_MCOCLKS_3 ( 0x08UL << RCC_CLKOCR_MCOCLKS_Pos ) +#define RCC_CLKOCR_MCOCLKS_4 ( 0x10UL << RCC_CLKOCR_MCOCLKS_Pos ) + + +/*************** Bits definition for RCC_DCKCFG **********************/ + +#define RCC_DCKCFG_LCDDIV_Pos ( 0U ) +#define RCC_DCKCFG_LCDDIV_Msk ( 0x3UL << RCC_DCKCFG_LCDDIV_Pos ) +#define RCC_DCKCFG_LCDDIV ( RCC_DCKCFG_LCDDIV_Msk ) +#define RCC_DCKCFG_LCDDIV_0 ( 0x1UL << RCC_DCKCFG_LCDDIV_Pos ) +#define RCC_DCKCFG_LCDDIV_1 ( 0x2UL << RCC_DCKCFG_LCDDIV_Pos ) + + +/*************** Bits definition for RCC_STDBYCTRL **********************/ + +#define RCC_STDBYCTRL_STDBYRST_Pos ( 23U ) +#define RCC_STDBYCTRL_STDBYRST_Msk ( 0x1UL << RCC_STDBYCTRL_STDBYRST_Pos ) +#define RCC_STDBYCTRL_STDBYRST ( RCC_STDBYCTRL_STDBYRST_Msk ) + +#define RCC_STDBYCTRL_RTCEN_Pos ( 22U ) +#define RCC_STDBYCTRL_RTCEN_Msk ( 0x1UL << RCC_STDBYCTRL_RTCEN_Pos ) +#define RCC_STDBYCTRL_RTCEN ( RCC_STDBYCTRL_RTCEN_Msk ) + +#define RCC_STDBYCTRL_RTCSEL_Pos ( 20U ) +#define RCC_STDBYCTRL_RTCSEL_Msk ( 0x3UL << RCC_STDBYCTRL_RTCSEL_Pos ) +#define RCC_STDBYCTRL_RTCSEL ( RCC_STDBYCTRL_RTCSEL_Msk ) +#define RCC_STDBYCTRL_RTCSEL_0 ( 0x1UL << RCC_STDBYCTRL_RTCSEL_Pos ) +#define RCC_STDBYCTRL_RTCSEL_1 ( 0x2UL << RCC_STDBYCTRL_RTCSEL_Pos ) + +#define RCC_STDBYCTRL_RCLDIS_Pos ( 16U ) +#define RCC_STDBYCTRL_RCLDIS_Msk ( 0xFUL << RCC_STDBYCTRL_RCLDIS_Pos ) +#define RCC_STDBYCTRL_RCLDIS ( RCC_STDBYCTRL_RCLDIS_Msk ) +#define RCC_STDBYCTRL_RCLDIS_0 ( 0x1UL << RCC_STDBYCTRL_RCLDIS_Pos ) +#define RCC_STDBYCTRL_RCLDIS_1 ( 0x2UL << RCC_STDBYCTRL_RCLDIS_Pos ) +#define RCC_STDBYCTRL_RCLDIS_2 ( 0x4UL << RCC_STDBYCTRL_RCLDIS_Pos ) +#define RCC_STDBYCTRL_RCLDIS_3 ( 0x8UL << RCC_STDBYCTRL_RCLDIS_Pos ) + +#define RCC_STDBYCTRL_RCLTRIM_Pos ( 10U ) +#define RCC_STDBYCTRL_RCLTRIM_Msk ( 0x3fUL << RCC_STDBYCTRL_RCLTRIM_Pos ) +#define RCC_STDBYCTRL_RCLTRIM ( RCC_STDBYCTRL_RCLTRIM_Msk ) +#define RCC_STDBYCTRL_RCLTRIM_0 ( 0x1UL << RCC_STDBYCTRL_RCLTRIM_Pos ) +#define RCC_STDBYCTRL_RCLTRIM_1 ( 0x2UL << RCC_STDBYCTRL_RCLTRIM_Pos ) +#define RCC_STDBYCTRL_RCLTRIM_2 ( 0x4UL << RCC_STDBYCTRL_RCLTRIM_Pos ) +#define RCC_STDBYCTRL_RCLTRIM_3 ( 0x8UL << RCC_STDBYCTRL_RCLTRIM_Pos ) +#define RCC_STDBYCTRL_RCLTRIM_4 ( 0x10UL << RCC_STDBYCTRL_RCLTRIM_Pos ) +#define RCC_STDBYCTRL_RCLTRIM_5 ( 0x20UL << RCC_STDBYCTRL_RCLTRIM_Pos ) + +#define RCC_STDBYCTRL_RCLRDY_Pos ( 9U ) +#define RCC_STDBYCTRL_RCLRDY_Msk ( 0x1UL << RCC_STDBYCTRL_RCLRDY_Pos ) +#define RCC_STDBYCTRL_RCLRDY ( RCC_STDBYCTRL_RCLRDY_Msk ) + +#define RCC_STDBYCTRL_RCLEN_Pos ( 8U ) +#define RCC_STDBYCTRL_RCLEN_Msk ( 0x1UL << RCC_STDBYCTRL_RCLEN_Pos ) +#define RCC_STDBYCTRL_RCLEN ( RCC_STDBYCTRL_RCLEN_Msk ) + +#define RCC_STDBYCTRL_XTLSDEN_Pos ( 6U ) +#define RCC_STDBYCTRL_XTLSDEN_Msk ( 0x1UL << RCC_STDBYCTRL_XTLSDEN_Pos ) +#define RCC_STDBYCTRL_XTLSDEN ( RCC_STDBYCTRL_XTLSDEN_Msk ) + +#define RCC_STDBYCTRL_XTLDRV_Pos ( 3U ) +#define RCC_STDBYCTRL_XTLDRV_Msk ( 0x7UL << RCC_STDBYCTRL_XTLDRV_Pos ) +#define RCC_STDBYCTRL_XTLDRV ( RCC_STDBYCTRL_XTLDRV_Msk ) +#define RCC_STDBYCTRL_XTLDRV_0 ( 0x1UL << RCC_STDBYCTRL_XTLDRV_Pos ) +#define RCC_STDBYCTRL_XTLDRV_1 ( 0x2UL << RCC_STDBYCTRL_XTLDRV_Pos ) +#define RCC_STDBYCTRL_XTLDRV_2 ( 0x4UL << RCC_STDBYCTRL_XTLDRV_Pos ) + +#define RCC_STDBYCTRL_XTLBYP_Pos ( 2U ) +#define RCC_STDBYCTRL_XTLBYP_Msk ( 0x1UL << RCC_STDBYCTRL_XTLBYP_Pos ) +#define RCC_STDBYCTRL_XTLBYP ( RCC_STDBYCTRL_XTLBYP_Msk ) + +#define RCC_STDBYCTRL_XTLRDY_Pos ( 1U ) +#define RCC_STDBYCTRL_XTLRDY_Msk ( 0x1UL << RCC_STDBYCTRL_XTLRDY_Pos ) +#define RCC_STDBYCTRL_XTLRDY ( RCC_STDBYCTRL_XTLRDY_Msk ) + +#define RCC_STDBYCTRL_XTLEN_Pos ( 0U ) +#define RCC_STDBYCTRL_XTLEN_Msk ( 0x1UL << RCC_STDBYCTRL_XTLEN_Pos ) +#define RCC_STDBYCTRL_XTLEN ( RCC_STDBYCTRL_XTLEN_Msk ) + + +/*************** Bits definition for GPIO_MD **********************/ + +#define GPIO_MD_MD_15_Pos ( 30U ) +#define GPIO_MD_MD_15_Msk ( 0x3UL << GPIO_MD_MD_15_Pos ) +#define GPIO_MD_MD_15 ( GPIO_MD_MD_15_Msk ) +#define GPIO_MD_MD_15_0 ( 0x1UL << GPIO_MD_MD_15_Pos ) +#define GPIO_MD_MD_15_1 ( 0x2UL << GPIO_MD_MD_15_Pos ) + +#define GPIO_MD_MD_14_Pos ( 28U ) +#define GPIO_MD_MD_14_Msk ( 0x3UL << GPIO_MD_MD_14_Pos ) +#define GPIO_MD_MD_14 ( GPIO_MD_MD_14_Msk ) +#define GPIO_MD_MD_14_0 ( 0x1UL << GPIO_MD_MD_14_Pos ) +#define GPIO_MD_MD_14_1 ( 0x2UL << GPIO_MD_MD_14_Pos ) + +#define GPIO_MD_MD_13_Pos ( 26U ) +#define GPIO_MD_MD_13_Msk ( 0x3UL << GPIO_MD_MD_13_Pos ) +#define GPIO_MD_MD_13 ( GPIO_MD_MD_13_Msk ) +#define GPIO_MD_MD_13_0 ( 0x1UL << GPIO_MD_MD_13_Pos ) +#define GPIO_MD_MD_13_1 ( 0x2UL << GPIO_MD_MD_13_Pos ) + +#define GPIO_MD_MD_12_Pos ( 24U ) +#define GPIO_MD_MD_12_Msk ( 0x3UL << GPIO_MD_MD_12_Pos ) +#define GPIO_MD_MD_12 ( GPIO_MD_MD_12_Msk ) +#define GPIO_MD_MD_12_0 ( 0x1UL << GPIO_MD_MD_12_Pos ) +#define GPIO_MD_MD_12_1 ( 0x2UL << GPIO_MD_MD_12_Pos ) + +#define GPIO_MD_MD_11_Pos ( 22U ) +#define GPIO_MD_MD_11_Msk ( 0x3UL << GPIO_MD_MD_11_Pos ) +#define GPIO_MD_MD_11 ( GPIO_MD_MD_11_Msk ) +#define GPIO_MD_MD_11_0 ( 0x1UL << GPIO_MD_MD_11_Pos ) +#define GPIO_MD_MD_11_1 ( 0x2UL << GPIO_MD_MD_11_Pos ) + +#define GPIO_MD_MD_10_Pos ( 20U ) +#define GPIO_MD_MD_10_Msk ( 0x3UL << GPIO_MD_MD_10_Pos ) +#define GPIO_MD_MD_10 ( GPIO_MD_MD_10_Msk ) +#define GPIO_MD_MD_10_0 ( 0x1UL << GPIO_MD_MD_10_Pos ) +#define GPIO_MD_MD_10_1 ( 0x2UL << GPIO_MD_MD_10_Pos ) + +#define GPIO_MD_MD_9_Pos ( 18U ) +#define GPIO_MD_MD_9_Msk ( 0x3UL << GPIO_MD_MD_9_Pos ) +#define GPIO_MD_MD_9 ( GPIO_MD_MD_9_Msk ) +#define GPIO_MD_MD_9_0 ( 0x1UL << GPIO_MD_MD_9_Pos ) +#define GPIO_MD_MD_9_1 ( 0x2UL << GPIO_MD_MD_9_Pos ) + +#define GPIO_MD_MD_8_Pos ( 16U ) +#define GPIO_MD_MD_8_Msk ( 0x3UL << GPIO_MD_MD_8_Pos ) +#define GPIO_MD_MD_8 ( GPIO_MD_MD_8_Msk ) +#define GPIO_MD_MD_8_0 ( 0x1UL << GPIO_MD_MD_8_Pos ) +#define GPIO_MD_MD_8_1 ( 0x2UL << GPIO_MD_MD_8_Pos ) + +#define GPIO_MD_MD_7_Pos ( 14U ) +#define GPIO_MD_MD_7_Msk ( 0x3UL << GPIO_MD_MD_7_Pos ) +#define GPIO_MD_MD_7 ( GPIO_MD_MD_7_Msk ) +#define GPIO_MD_MD_7_0 ( 0x1UL << GPIO_MD_MD_7_Pos ) +#define GPIO_MD_MD_7_1 ( 0x2UL << GPIO_MD_MD_7_Pos ) + +#define GPIO_MD_MD_6_Pos ( 12U ) +#define GPIO_MD_MD_6_Msk ( 0x3UL << GPIO_MD_MD_6_Pos ) +#define GPIO_MD_MD_6 ( GPIO_MD_MD_6_Msk ) +#define GPIO_MD_MD_6_0 ( 0x1UL << GPIO_MD_MD_6_Pos ) +#define GPIO_MD_MD_6_1 ( 0x2UL << GPIO_MD_MD_6_Pos ) + +#define GPIO_MD_MD_5_Pos ( 10U ) +#define GPIO_MD_MD_5_Msk ( 0x3UL << GPIO_MD_MD_5_Pos ) +#define GPIO_MD_MD_5 ( GPIO_MD_MD_5_Msk ) +#define GPIO_MD_MD_5_0 ( 0x1UL << GPIO_MD_MD_5_Pos ) +#define GPIO_MD_MD_5_1 ( 0x2UL << GPIO_MD_MD_5_Pos ) + +#define GPIO_MD_MD_4_Pos ( 8U ) +#define GPIO_MD_MD_4_Msk ( 0x3UL << GPIO_MD_MD_4_Pos ) +#define GPIO_MD_MD_4 ( GPIO_MD_MD_4_Msk ) +#define GPIO_MD_MD_4_0 ( 0x1UL << GPIO_MD_MD_4_Pos ) +#define GPIO_MD_MD_4_1 ( 0x2UL << GPIO_MD_MD_4_Pos ) + +#define GPIO_MD_MD_3_Pos ( 6U ) +#define GPIO_MD_MD_3_Msk ( 0x3UL << GPIO_MD_MD_3_Pos ) +#define GPIO_MD_MD_3 ( GPIO_MD_MD_3_Msk ) +#define GPIO_MD_MD_3_0 ( 0x1UL << GPIO_MD_MD_3_Pos ) +#define GPIO_MD_MD_3_1 ( 0x2UL << GPIO_MD_MD_3_Pos ) + +#define GPIO_MD_MD_2_Pos ( 4U ) +#define GPIO_MD_MD_2_Msk ( 0x3UL << GPIO_MD_MD_2_Pos ) +#define GPIO_MD_MD_2 ( GPIO_MD_MD_2_Msk ) +#define GPIO_MD_MD_2_0 ( 0x1UL << GPIO_MD_MD_2_Pos ) +#define GPIO_MD_MD_2_1 ( 0x2UL << GPIO_MD_MD_2_Pos ) + +#define GPIO_MD_MD_1_Pos ( 2U ) +#define GPIO_MD_MD_1_Msk ( 0x3UL << GPIO_MD_MD_1_Pos ) +#define GPIO_MD_MD_1 ( GPIO_MD_MD_1_Msk ) +#define GPIO_MD_MD_1_0 ( 0x1UL << GPIO_MD_MD_1_Pos ) +#define GPIO_MD_MD_1_1 ( 0x2UL << GPIO_MD_MD_1_Pos ) + +#define GPIO_MD_MD_0_Pos ( 0U ) +#define GPIO_MD_MD_0_Msk ( 0x3UL << GPIO_MD_MD_0_Pos ) +#define GPIO_MD_MD_0 ( GPIO_MD_MD_0_Msk ) +#define GPIO_MD_MD_0_0 ( 0x1UL << GPIO_MD_MD_0_Pos ) +#define GPIO_MD_MD_0_1 ( 0x2UL << GPIO_MD_MD_0_Pos ) + + +/*************** Bits definition for GPIO_OTYP **********************/ + +#define GPIO_OTYP_OTYP15_Pos ( 15U ) +#define GPIO_OTYP_OTYP15_Msk ( 0x1UL << GPIO_OTYP_OTYP15_Pos ) +#define GPIO_OTYP_OTYP15 ( GPIO_OTYP_OTYP15_Msk ) + + +#define GPIO_OTYP_OTYP14_Pos ( 14U ) +#define GPIO_OTYP_OTYP14_Msk ( 0x1UL << GPIO_OTYP_OTYP14_Pos ) +#define GPIO_OTYP_OTYP14 ( GPIO_OTYP_OTYP14_Msk ) + + +#define GPIO_OTYP_OTYP13_Pos ( 13U ) +#define GPIO_OTYP_OTYP13_Msk ( 0x1UL << GPIO_OTYP_OTYP13_Pos ) +#define GPIO_OTYP_OTYP13 ( GPIO_OTYP_OTYP13_Msk ) + + +#define GPIO_OTYP_OTYP12_Pos ( 12U ) +#define GPIO_OTYP_OTYP12_Msk ( 0x1UL << GPIO_OTYP_OTYP12_Pos ) +#define GPIO_OTYP_OTYP12 ( GPIO_OTYP_OTYP12_Msk ) + + +#define GPIO_OTYP_OTYP11_Pos ( 11U ) +#define GPIO_OTYP_OTYP11_Msk ( 0x1UL << GPIO_OTYP_OTYP11_Pos ) +#define GPIO_OTYP_OTYP11 ( GPIO_OTYP_OTYP11_Msk ) + + +#define GPIO_OTYP_OTYP10_Pos ( 10U ) +#define GPIO_OTYP_OTYP10_Msk ( 0x1UL << GPIO_OTYP_OTYP10_Pos ) +#define GPIO_OTYP_OTYP10 ( GPIO_OTYP_OTYP10_Msk ) + + +#define GPIO_OTYP_OTYP9_Pos ( 9U ) +#define GPIO_OTYP_OTYP9_Msk ( 0x1UL << GPIO_OTYP_OTYP9_Pos ) +#define GPIO_OTYP_OTYP9 ( GPIO_OTYP_OTYP9_Msk ) + + +#define GPIO_OTYP_OTYP8_Pos ( 8U ) +#define GPIO_OTYP_OTYP8_Msk ( 0x1UL << GPIO_OTYP_OTYP8_Pos ) +#define GPIO_OTYP_OTYP8 ( GPIO_OTYP_OTYP8_Msk ) + + +#define GPIO_OTYP_OTYP7_Pos ( 7U ) +#define GPIO_OTYP_OTYP7_Msk ( 0x1UL << GPIO_OTYP_OTYP7_Pos ) +#define GPIO_OTYP_OTYP7 ( GPIO_OTYP_OTYP7_Msk ) + + +#define GPIO_OTYP_OTYP6_Pos ( 6U ) +#define GPIO_OTYP_OTYP6_Msk ( 0x1UL << GPIO_OTYP_OTYP6_Pos ) +#define GPIO_OTYP_OTYP6 ( GPIO_OTYP_OTYP6_Msk ) + + +#define GPIO_OTYP_OTYP5_Pos ( 5U ) +#define GPIO_OTYP_OTYP5_Msk ( 0x1UL << GPIO_OTYP_OTYP5_Pos ) +#define GPIO_OTYP_OTYP5 ( GPIO_OTYP_OTYP5_Msk ) + + +#define GPIO_OTYP_OTYP4_Pos ( 4U ) +#define GPIO_OTYP_OTYP4_Msk ( 0x1UL << GPIO_OTYP_OTYP4_Pos ) +#define GPIO_OTYP_OTYP4 ( GPIO_OTYP_OTYP4_Msk ) + + +#define GPIO_OTYP_OTYP3_Pos ( 3U ) +#define GPIO_OTYP_OTYP3_Msk ( 0x1UL << GPIO_OTYP_OTYP3_Pos ) +#define GPIO_OTYP_OTYP3 ( GPIO_OTYP_OTYP3_Msk ) + + +#define GPIO_OTYP_OTYP2_Pos ( 2U ) +#define GPIO_OTYP_OTYP2_Msk ( 0x1UL << GPIO_OTYP_OTYP2_Pos ) +#define GPIO_OTYP_OTYP2 ( GPIO_OTYP_OTYP2_Msk ) + + +#define GPIO_OTYP_OTYP1_Pos ( 1U ) +#define GPIO_OTYP_OTYP1_Msk ( 0x1UL << GPIO_OTYP_OTYP1_Pos ) +#define GPIO_OTYP_OTYP1 ( GPIO_OTYP_OTYP1_Msk ) + + +#define GPIO_OTYP_OTYP0_Pos ( 0U ) +#define GPIO_OTYP_OTYP0_Msk ( 0x1UL << GPIO_OTYP_OTYP0_Pos ) +#define GPIO_OTYP_OTYP0 ( GPIO_OTYP_OTYP0_Msk ) + + + +/*************** Bits definition for GPIO_PUPD **********************/ + +#define GPIO_PUPD_PUPD_15_Pos ( 30U ) +#define GPIO_PUPD_PUPD_15_Msk ( 0x3UL << GPIO_PUPD_PUPD_15_Pos ) +#define GPIO_PUPD_PUPD_15 ( GPIO_PUPD_PUPD_15_Msk ) +#define GPIO_PUPD_PUPD_15_0 ( 0x1UL << GPIO_PUPD_PUPD_15_Pos ) +#define GPIO_PUPD_PUPD_15_1 ( 0x2UL << GPIO_PUPD_PUPD_15_Pos ) + +#define GPIO_PUPD_PUPD_14_Pos ( 28U ) +#define GPIO_PUPD_PUPD_14_Msk ( 0x3UL << GPIO_PUPD_PUPD_14_Pos ) +#define GPIO_PUPD_PUPD_14 ( GPIO_PUPD_PUPD_14_Msk ) +#define GPIO_PUPD_PUPD_14_0 ( 0x1UL << GPIO_PUPD_PUPD_14_Pos ) +#define GPIO_PUPD_PUPD_14_1 ( 0x2UL << GPIO_PUPD_PUPD_14_Pos ) + +#define GPIO_PUPD_PUPD_13_Pos ( 26U ) +#define GPIO_PUPD_PUPD_13_Msk ( 0x3UL << GPIO_PUPD_PUPD_13_Pos ) +#define GPIO_PUPD_PUPD_13 ( GPIO_PUPD_PUPD_13_Msk ) +#define GPIO_PUPD_PUPD_13_0 ( 0x1UL << GPIO_PUPD_PUPD_13_Pos ) +#define GPIO_PUPD_PUPD_13_1 ( 0x2UL << GPIO_PUPD_PUPD_13_Pos ) + +#define GPIO_PUPD_PUPD_12_Pos ( 24U ) +#define GPIO_PUPD_PUPD_12_Msk ( 0x3UL << GPIO_PUPD_PUPD_12_Pos ) +#define GPIO_PUPD_PUPD_12 ( GPIO_PUPD_PUPD_12_Msk ) +#define GPIO_PUPD_PUPD_12_0 ( 0x1UL << GPIO_PUPD_PUPD_12_Pos ) +#define GPIO_PUPD_PUPD_12_1 ( 0x2UL << GPIO_PUPD_PUPD_12_Pos ) + +#define GPIO_PUPD_PUPD_11_Pos ( 22U ) +#define GPIO_PUPD_PUPD_11_Msk ( 0x3UL << GPIO_PUPD_PUPD_11_Pos ) +#define GPIO_PUPD_PUPD_11 ( GPIO_PUPD_PUPD_11_Msk ) +#define GPIO_PUPD_PUPD_11_0 ( 0x1UL << GPIO_PUPD_PUPD_11_Pos ) +#define GPIO_PUPD_PUPD_11_1 ( 0x2UL << GPIO_PUPD_PUPD_11_Pos ) + +#define GPIO_PUPD_PUPD_10_Pos ( 20U ) +#define GPIO_PUPD_PUPD_10_Msk ( 0x3UL << GPIO_PUPD_PUPD_10_Pos ) +#define GPIO_PUPD_PUPD_10 ( GPIO_PUPD_PUPD_10_Msk ) +#define GPIO_PUPD_PUPD_10_0 ( 0x1UL << GPIO_PUPD_PUPD_10_Pos ) +#define GPIO_PUPD_PUPD_10_1 ( 0x2UL << GPIO_PUPD_PUPD_10_Pos ) + +#define GPIO_PUPD_PUPD_9_Pos ( 18U ) +#define GPIO_PUPD_PUPD_9_Msk ( 0x3UL << GPIO_PUPD_PUPD_9_Pos ) +#define GPIO_PUPD_PUPD_9 ( GPIO_PUPD_PUPD_9_Msk ) +#define GPIO_PUPD_PUPD_9_0 ( 0x1UL << GPIO_PUPD_PUPD_9_Pos ) +#define GPIO_PUPD_PUPD_9_1 ( 0x2UL << GPIO_PUPD_PUPD_9_Pos ) + +#define GPIO_PUPD_PUPD_8_Pos ( 16U ) +#define GPIO_PUPD_PUPD_8_Msk ( 0x3UL << GPIO_PUPD_PUPD_8_Pos ) +#define GPIO_PUPD_PUPD_8 ( GPIO_PUPD_PUPD_8_Msk ) +#define GPIO_PUPD_PUPD_8_0 ( 0x1UL << GPIO_PUPD_PUPD_8_Pos ) +#define GPIO_PUPD_PUPD_8_1 ( 0x2UL << GPIO_PUPD_PUPD_8_Pos ) + +#define GPIO_PUPD_PUPD_7_Pos ( 14U ) +#define GPIO_PUPD_PUPD_7_Msk ( 0x3UL << GPIO_PUPD_PUPD_7_Pos ) +#define GPIO_PUPD_PUPD_7 ( GPIO_PUPD_PUPD_7_Msk ) +#define GPIO_PUPD_PUPD_7_0 ( 0x1UL << GPIO_PUPD_PUPD_7_Pos ) +#define GPIO_PUPD_PUPD_7_1 ( 0x2UL << GPIO_PUPD_PUPD_7_Pos ) + +#define GPIO_PUPD_PUPD_6_Pos ( 12U ) +#define GPIO_PUPD_PUPD_6_Msk ( 0x3UL << GPIO_PUPD_PUPD_6_Pos ) +#define GPIO_PUPD_PUPD_6 ( GPIO_PUPD_PUPD_6_Msk ) +#define GPIO_PUPD_PUPD_6_0 ( 0x1UL << GPIO_PUPD_PUPD_6_Pos ) +#define GPIO_PUPD_PUPD_6_1 ( 0x2UL << GPIO_PUPD_PUPD_6_Pos ) + +#define GPIO_PUPD_PUPD_5_Pos ( 10U ) +#define GPIO_PUPD_PUPD_5_Msk ( 0x3UL << GPIO_PUPD_PUPD_5_Pos ) +#define GPIO_PUPD_PUPD_5 ( GPIO_PUPD_PUPD_5_Msk ) +#define GPIO_PUPD_PUPD_5_0 ( 0x1UL << GPIO_PUPD_PUPD_5_Pos ) +#define GPIO_PUPD_PUPD_5_1 ( 0x2UL << GPIO_PUPD_PUPD_5_Pos ) + +#define GPIO_PUPD_PUPD_4_Pos ( 8U ) +#define GPIO_PUPD_PUPD_4_Msk ( 0x3UL << GPIO_PUPD_PUPD_4_Pos ) +#define GPIO_PUPD_PUPD_4 ( GPIO_PUPD_PUPD_4_Msk ) +#define GPIO_PUPD_PUPD_4_0 ( 0x1UL << GPIO_PUPD_PUPD_4_Pos ) +#define GPIO_PUPD_PUPD_4_1 ( 0x2UL << GPIO_PUPD_PUPD_4_Pos ) + +#define GPIO_PUPD_PUPD_3_Pos ( 6U ) +#define GPIO_PUPD_PUPD_3_Msk ( 0x3UL << GPIO_PUPD_PUPD_3_Pos ) +#define GPIO_PUPD_PUPD_3 ( GPIO_PUPD_PUPD_3_Msk ) +#define GPIO_PUPD_PUPD_3_0 ( 0x1UL << GPIO_PUPD_PUPD_3_Pos ) +#define GPIO_PUPD_PUPD_3_1 ( 0x2UL << GPIO_PUPD_PUPD_3_Pos ) + +#define GPIO_PUPD_PUPD_2_Pos ( 4U ) +#define GPIO_PUPD_PUPD_2_Msk ( 0x3UL << GPIO_PUPD_PUPD_2_Pos ) +#define GPIO_PUPD_PUPD_2 ( GPIO_PUPD_PUPD_2_Msk ) +#define GPIO_PUPD_PUPD_2_0 ( 0x1UL << GPIO_PUPD_PUPD_2_Pos ) +#define GPIO_PUPD_PUPD_2_1 ( 0x2UL << GPIO_PUPD_PUPD_2_Pos ) + +#define GPIO_PUPD_PUPD_1_Pos ( 2U ) +#define GPIO_PUPD_PUPD_1_Msk ( 0x3UL << GPIO_PUPD_PUPD_1_Pos ) +#define GPIO_PUPD_PUPD_1 ( GPIO_PUPD_PUPD_1_Msk ) +#define GPIO_PUPD_PUPD_1_0 ( 0x1UL << GPIO_PUPD_PUPD_1_Pos ) +#define GPIO_PUPD_PUPD_1_1 ( 0x2UL << GPIO_PUPD_PUPD_1_Pos ) + +#define GPIO_PUPD_PUPD_0_Pos ( 0U ) +#define GPIO_PUPD_PUPD_0_Msk ( 0x3UL << GPIO_PUPD_PUPD_0_Pos ) +#define GPIO_PUPD_PUPD_0 ( GPIO_PUPD_PUPD_0_Msk ) +#define GPIO_PUPD_PUPD_0_0 ( 0x1UL << GPIO_PUPD_PUPD_0_Pos ) +#define GPIO_PUPD_PUPD_0_1 ( 0x2UL << GPIO_PUPD_PUPD_0_Pos ) + + +/*************** Bits definition for GPIO_IDATA **********************/ + +#define GPIO_IDATA_GPIO_IDATA15_Pos ( 15U ) +#define GPIO_IDATA_GPIO_IDATA15_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA15_Pos ) +#define GPIO_IDATA_GPIO_IDATA15 ( GPIO_IDATA_GPIO_IDATA15_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA14_Pos ( 14U ) +#define GPIO_IDATA_GPIO_IDATA14_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA14_Pos ) +#define GPIO_IDATA_GPIO_IDATA14 ( GPIO_IDATA_GPIO_IDATA14_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA13_Pos ( 13U ) +#define GPIO_IDATA_GPIO_IDATA13_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA13_Pos ) +#define GPIO_IDATA_GPIO_IDATA13 ( GPIO_IDATA_GPIO_IDATA13_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA12_Pos ( 12U ) +#define GPIO_IDATA_GPIO_IDATA12_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA12_Pos ) +#define GPIO_IDATA_GPIO_IDATA12 ( GPIO_IDATA_GPIO_IDATA12_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA11_Pos ( 11U ) +#define GPIO_IDATA_GPIO_IDATA11_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA11_Pos ) +#define GPIO_IDATA_GPIO_IDATA11 ( GPIO_IDATA_GPIO_IDATA11_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA10_Pos ( 10U ) +#define GPIO_IDATA_GPIO_IDATA10_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA10_Pos ) +#define GPIO_IDATA_GPIO_IDATA10 ( GPIO_IDATA_GPIO_IDATA10_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA9_Pos ( 9U ) +#define GPIO_IDATA_GPIO_IDATA9_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA9_Pos ) +#define GPIO_IDATA_GPIO_IDATA9 ( GPIO_IDATA_GPIO_IDATA9_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA8_Pos ( 8U ) +#define GPIO_IDATA_GPIO_IDATA8_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA8_Pos ) +#define GPIO_IDATA_GPIO_IDATA8 ( GPIO_IDATA_GPIO_IDATA8_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA7_Pos ( 7U ) +#define GPIO_IDATA_GPIO_IDATA7_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA7_Pos ) +#define GPIO_IDATA_GPIO_IDATA7 ( GPIO_IDATA_GPIO_IDATA7_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA6_Pos ( 6U ) +#define GPIO_IDATA_GPIO_IDATA6_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA6_Pos ) +#define GPIO_IDATA_GPIO_IDATA6 ( GPIO_IDATA_GPIO_IDATA6_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA5_Pos ( 5U ) +#define GPIO_IDATA_GPIO_IDATA5_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA5_Pos ) +#define GPIO_IDATA_GPIO_IDATA5 ( GPIO_IDATA_GPIO_IDATA5_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA4_Pos ( 4U ) +#define GPIO_IDATA_GPIO_IDATA4_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA4_Pos ) +#define GPIO_IDATA_GPIO_IDATA4 ( GPIO_IDATA_GPIO_IDATA4_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA3_Pos ( 3U ) +#define GPIO_IDATA_GPIO_IDATA3_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA3_Pos ) +#define GPIO_IDATA_GPIO_IDATA3 ( GPIO_IDATA_GPIO_IDATA3_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA2_Pos ( 2U ) +#define GPIO_IDATA_GPIO_IDATA2_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA2_Pos ) +#define GPIO_IDATA_GPIO_IDATA2 ( GPIO_IDATA_GPIO_IDATA2_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA1_Pos ( 1U ) +#define GPIO_IDATA_GPIO_IDATA1_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA1_Pos ) +#define GPIO_IDATA_GPIO_IDATA1 ( GPIO_IDATA_GPIO_IDATA1_Msk ) + + +#define GPIO_IDATA_GPIO_IDATA0_Pos ( 0U ) +#define GPIO_IDATA_GPIO_IDATA0_Msk ( 0x1UL << GPIO_IDATA_GPIO_IDATA0_Pos ) +#define GPIO_IDATA_GPIO_IDATA0 ( GPIO_IDATA_GPIO_IDATA0_Msk ) + + + +/*************** Bits definition for GPIO_ODATA **********************/ + +#define GPIO_ODATA_GPIO_ODATA15_Pos ( 15U ) +#define GPIO_ODATA_GPIO_ODATA15_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA15_Pos ) +#define GPIO_ODATA_GPIO_ODATA15 ( GPIO_ODATA_GPIO_ODATA15_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA14_Pos ( 14U ) +#define GPIO_ODATA_GPIO_ODATA14_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA14_Pos ) +#define GPIO_ODATA_GPIO_ODATA14 ( GPIO_ODATA_GPIO_ODATA14_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA13_Pos ( 13U ) +#define GPIO_ODATA_GPIO_ODATA13_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA13_Pos ) +#define GPIO_ODATA_GPIO_ODATA13 ( GPIO_ODATA_GPIO_ODATA13_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA12_Pos ( 12U ) +#define GPIO_ODATA_GPIO_ODATA12_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA12_Pos ) +#define GPIO_ODATA_GPIO_ODATA12 ( GPIO_ODATA_GPIO_ODATA12_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA11_Pos ( 11U ) +#define GPIO_ODATA_GPIO_ODATA11_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA11_Pos ) +#define GPIO_ODATA_GPIO_ODATA11 ( GPIO_ODATA_GPIO_ODATA11_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA10_Pos ( 10U ) +#define GPIO_ODATA_GPIO_ODATA10_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA10_Pos ) +#define GPIO_ODATA_GPIO_ODATA10 ( GPIO_ODATA_GPIO_ODATA10_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA9_Pos ( 9U ) +#define GPIO_ODATA_GPIO_ODATA9_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA9_Pos ) +#define GPIO_ODATA_GPIO_ODATA9 ( GPIO_ODATA_GPIO_ODATA9_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA8_Pos ( 8U ) +#define GPIO_ODATA_GPIO_ODATA8_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA8_Pos ) +#define GPIO_ODATA_GPIO_ODATA8 ( GPIO_ODATA_GPIO_ODATA8_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA7_Pos ( 7U ) +#define GPIO_ODATA_GPIO_ODATA7_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA7_Pos ) +#define GPIO_ODATA_GPIO_ODATA7 ( GPIO_ODATA_GPIO_ODATA7_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA6_Pos ( 6U ) +#define GPIO_ODATA_GPIO_ODATA6_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA6_Pos ) +#define GPIO_ODATA_GPIO_ODATA6 ( GPIO_ODATA_GPIO_ODATA6_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA5_Pos ( 5U ) +#define GPIO_ODATA_GPIO_ODATA5_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA5_Pos ) +#define GPIO_ODATA_GPIO_ODATA5 ( GPIO_ODATA_GPIO_ODATA5_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA4_Pos ( 4U ) +#define GPIO_ODATA_GPIO_ODATA4_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA4_Pos ) +#define GPIO_ODATA_GPIO_ODATA4 ( GPIO_ODATA_GPIO_ODATA4_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA3_Pos ( 3U ) +#define GPIO_ODATA_GPIO_ODATA3_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA3_Pos ) +#define GPIO_ODATA_GPIO_ODATA3 ( GPIO_ODATA_GPIO_ODATA3_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA2_Pos ( 2U ) +#define GPIO_ODATA_GPIO_ODATA2_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA2_Pos ) +#define GPIO_ODATA_GPIO_ODATA2 ( GPIO_ODATA_GPIO_ODATA2_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA1_Pos ( 1U ) +#define GPIO_ODATA_GPIO_ODATA1_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA1_Pos ) +#define GPIO_ODATA_GPIO_ODATA1 ( GPIO_ODATA_GPIO_ODATA1_Msk ) + + +#define GPIO_ODATA_GPIO_ODATA0_Pos ( 0U ) +#define GPIO_ODATA_GPIO_ODATA0_Msk ( 0x1UL << GPIO_ODATA_GPIO_ODATA0_Pos ) +#define GPIO_ODATA_GPIO_ODATA0 ( GPIO_ODATA_GPIO_ODATA0_Msk ) + + + +/*************** Bits definition for GPIO_BSC **********************/ + +#define GPIO_BSC_GPIO_CLR15_Pos ( 31U ) +#define GPIO_BSC_GPIO_CLR15_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR15_Pos ) +#define GPIO_BSC_GPIO_CLR15 ( GPIO_BSC_GPIO_CLR15_Msk ) + + +#define GPIO_BSC_GPIO_CLR14_Pos ( 30U ) +#define GPIO_BSC_GPIO_CLR14_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR14_Pos ) +#define GPIO_BSC_GPIO_CLR14 ( GPIO_BSC_GPIO_CLR14_Msk ) + + +#define GPIO_BSC_GPIO_CLR13_Pos ( 29U ) +#define GPIO_BSC_GPIO_CLR13_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR13_Pos ) +#define GPIO_BSC_GPIO_CLR13 ( GPIO_BSC_GPIO_CLR13_Msk ) + + +#define GPIO_BSC_GPIO_CLR12_Pos ( 28U ) +#define GPIO_BSC_GPIO_CLR12_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR12_Pos ) +#define GPIO_BSC_GPIO_CLR12 ( GPIO_BSC_GPIO_CLR12_Msk ) + + +#define GPIO_BSC_GPIO_CLR11_Pos ( 27U ) +#define GPIO_BSC_GPIO_CLR11_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR11_Pos ) +#define GPIO_BSC_GPIO_CLR11 ( GPIO_BSC_GPIO_CLR11_Msk ) + + +#define GPIO_BSC_GPIO_CLR10_Pos ( 26U ) +#define GPIO_BSC_GPIO_CLR10_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR10_Pos ) +#define GPIO_BSC_GPIO_CLR10 ( GPIO_BSC_GPIO_CLR10_Msk ) + + +#define GPIO_BSC_GPIO_CLR9_Pos ( 25U ) +#define GPIO_BSC_GPIO_CLR9_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR9_Pos ) +#define GPIO_BSC_GPIO_CLR9 ( GPIO_BSC_GPIO_CLR9_Msk ) + + +#define GPIO_BSC_GPIO_CLR8_Pos ( 24U ) +#define GPIO_BSC_GPIO_CLR8_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR8_Pos ) +#define GPIO_BSC_GPIO_CLR8 ( GPIO_BSC_GPIO_CLR8_Msk ) + + +#define GPIO_BSC_GPIO_CLR7_Pos ( 23U ) +#define GPIO_BSC_GPIO_CLR7_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR7_Pos ) +#define GPIO_BSC_GPIO_CLR7 ( GPIO_BSC_GPIO_CLR7_Msk ) + + +#define GPIO_BSC_GPIO_CLR6_Pos ( 22U ) +#define GPIO_BSC_GPIO_CLR6_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR6_Pos ) +#define GPIO_BSC_GPIO_CLR6 ( GPIO_BSC_GPIO_CLR6_Msk ) + + +#define GPIO_BSC_GPIO_CLR5_Pos ( 21U ) +#define GPIO_BSC_GPIO_CLR5_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR5_Pos ) +#define GPIO_BSC_GPIO_CLR5 ( GPIO_BSC_GPIO_CLR5_Msk ) + + +#define GPIO_BSC_GPIO_CLR4_Pos ( 20U ) +#define GPIO_BSC_GPIO_CLR4_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR4_Pos ) +#define GPIO_BSC_GPIO_CLR4 ( GPIO_BSC_GPIO_CLR4_Msk ) + + +#define GPIO_BSC_GPIO_CLR3_Pos ( 19U ) +#define GPIO_BSC_GPIO_CLR3_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR3_Pos ) +#define GPIO_BSC_GPIO_CLR3 ( GPIO_BSC_GPIO_CLR3_Msk ) + + +#define GPIO_BSC_GPIO_CLR2_Pos ( 18U ) +#define GPIO_BSC_GPIO_CLR2_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR2_Pos ) +#define GPIO_BSC_GPIO_CLR2 ( GPIO_BSC_GPIO_CLR2_Msk ) + + +#define GPIO_BSC_GPIO_CLR1_Pos ( 17U ) +#define GPIO_BSC_GPIO_CLR1_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR1_Pos ) +#define GPIO_BSC_GPIO_CLR1 ( GPIO_BSC_GPIO_CLR1_Msk ) + + +#define GPIO_BSC_GPIO_CLR0_Pos ( 16U ) +#define GPIO_BSC_GPIO_CLR0_Msk ( 0x1UL << GPIO_BSC_GPIO_CLR0_Pos ) +#define GPIO_BSC_GPIO_CLR0 ( GPIO_BSC_GPIO_CLR0_Msk ) + + +#define GPIO_BSC_GPIO_SET15_Pos ( 15U ) +#define GPIO_BSC_GPIO_SET15_Msk ( 0x1UL << GPIO_BSC_GPIO_SET15_Pos ) +#define GPIO_BSC_GPIO_SET15 ( GPIO_BSC_GPIO_SET15_Msk ) + + +#define GPIO_BSC_GPIO_SET14_Pos ( 14U ) +#define GPIO_BSC_GPIO_SET14_Msk ( 0x1UL << GPIO_BSC_GPIO_SET14_Pos ) +#define GPIO_BSC_GPIO_SET14 ( GPIO_BSC_GPIO_SET14_Msk ) + + +#define GPIO_BSC_GPIO_SET13_Pos ( 13U ) +#define GPIO_BSC_GPIO_SET13_Msk ( 0x1UL << GPIO_BSC_GPIO_SET13_Pos ) +#define GPIO_BSC_GPIO_SET13 ( GPIO_BSC_GPIO_SET13_Msk ) + + +#define GPIO_BSC_GPIO_SET12_Pos ( 12U ) +#define GPIO_BSC_GPIO_SET12_Msk ( 0x1UL << GPIO_BSC_GPIO_SET12_Pos ) +#define GPIO_BSC_GPIO_SET12 ( GPIO_BSC_GPIO_SET12_Msk ) + + +#define GPIO_BSC_GPIO_SET11_Pos ( 11U ) +#define GPIO_BSC_GPIO_SET11_Msk ( 0x1UL << GPIO_BSC_GPIO_SET11_Pos ) +#define GPIO_BSC_GPIO_SET11 ( GPIO_BSC_GPIO_SET11_Msk ) + + +#define GPIO_BSC_GPIO_SET10_Pos ( 10U ) +#define GPIO_BSC_GPIO_SET10_Msk ( 0x1UL << GPIO_BSC_GPIO_SET10_Pos ) +#define GPIO_BSC_GPIO_SET10 ( GPIO_BSC_GPIO_SET10_Msk ) + + +#define GPIO_BSC_GPIO_SET9_Pos ( 9U ) +#define GPIO_BSC_GPIO_SET9_Msk ( 0x1UL << GPIO_BSC_GPIO_SET9_Pos ) +#define GPIO_BSC_GPIO_SET9 ( GPIO_BSC_GPIO_SET9_Msk ) + + +#define GPIO_BSC_GPIO_SET8_Pos ( 8U ) +#define GPIO_BSC_GPIO_SET8_Msk ( 0x1UL << GPIO_BSC_GPIO_SET8_Pos ) +#define GPIO_BSC_GPIO_SET8 ( GPIO_BSC_GPIO_SET8_Msk ) + + +#define GPIO_BSC_GPIO_SET7_Pos ( 7U ) +#define GPIO_BSC_GPIO_SET7_Msk ( 0x1UL << GPIO_BSC_GPIO_SET7_Pos ) +#define GPIO_BSC_GPIO_SET7 ( GPIO_BSC_GPIO_SET7_Msk ) + + +#define GPIO_BSC_GPIO_SET6_Pos ( 6U ) +#define GPIO_BSC_GPIO_SET6_Msk ( 0x1UL << GPIO_BSC_GPIO_SET6_Pos ) +#define GPIO_BSC_GPIO_SET6 ( GPIO_BSC_GPIO_SET6_Msk ) + + +#define GPIO_BSC_GPIO_SET5_Pos ( 5U ) +#define GPIO_BSC_GPIO_SET5_Msk ( 0x1UL << GPIO_BSC_GPIO_SET5_Pos ) +#define GPIO_BSC_GPIO_SET5 ( GPIO_BSC_GPIO_SET5_Msk ) + + +#define GPIO_BSC_GPIO_SET4_Pos ( 4U ) +#define GPIO_BSC_GPIO_SET4_Msk ( 0x1UL << GPIO_BSC_GPIO_SET4_Pos ) +#define GPIO_BSC_GPIO_SET4 ( GPIO_BSC_GPIO_SET4_Msk ) + + +#define GPIO_BSC_GPIO_SET3_Pos ( 3U ) +#define GPIO_BSC_GPIO_SET3_Msk ( 0x1UL << GPIO_BSC_GPIO_SET3_Pos ) +#define GPIO_BSC_GPIO_SET3 ( GPIO_BSC_GPIO_SET3_Msk ) + + +#define GPIO_BSC_GPIO_SET2_Pos ( 2U ) +#define GPIO_BSC_GPIO_SET2_Msk ( 0x1UL << GPIO_BSC_GPIO_SET2_Pos ) +#define GPIO_BSC_GPIO_SET2 ( GPIO_BSC_GPIO_SET2_Msk ) + + +#define GPIO_BSC_GPIO_SET1_Pos ( 1U ) +#define GPIO_BSC_GPIO_SET1_Msk ( 0x1UL << GPIO_BSC_GPIO_SET1_Pos ) +#define GPIO_BSC_GPIO_SET1 ( GPIO_BSC_GPIO_SET1_Msk ) + + +#define GPIO_BSC_GPIO_SET0_Pos ( 0U ) +#define GPIO_BSC_GPIO_SET0_Msk ( 0x1UL << GPIO_BSC_GPIO_SET0_Pos ) +#define GPIO_BSC_GPIO_SET0 ( GPIO_BSC_GPIO_SET0_Msk ) + + + +/*************** Bits definition for GPIO_AF0 **********************/ + +#define GPIO_AF0_GPIO_AFSEL0_7_Pos ( 28U ) +#define GPIO_AF0_GPIO_AFSEL0_7_Msk ( 0xfUL << GPIO_AF0_GPIO_AFSEL0_7_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_7 ( GPIO_AF0_GPIO_AFSEL0_7_Msk ) +#define GPIO_AF0_GPIO_AFSEL0_7_0 ( 0x1UL << GPIO_AF0_GPIO_AFSEL0_7_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_7_1 ( 0x2UL << GPIO_AF0_GPIO_AFSEL0_7_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_7_2 ( 0x4UL << GPIO_AF0_GPIO_AFSEL0_7_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_7_3 ( 0x8UL << GPIO_AF0_GPIO_AFSEL0_7_Pos ) + +#define GPIO_AF0_GPIO_AFSEL0_6_Pos ( 24U ) +#define GPIO_AF0_GPIO_AFSEL0_6_Msk ( 0xfUL << GPIO_AF0_GPIO_AFSEL0_6_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_6 ( GPIO_AF0_GPIO_AFSEL0_6_Msk ) +#define GPIO_AF0_GPIO_AFSEL0_6_0 ( 0x1UL << GPIO_AF0_GPIO_AFSEL0_6_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_6_1 ( 0x2UL << GPIO_AF0_GPIO_AFSEL0_6_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_6_2 ( 0x4UL << GPIO_AF0_GPIO_AFSEL0_6_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_6_3 ( 0x8UL << GPIO_AF0_GPIO_AFSEL0_6_Pos ) + +#define GPIO_AF0_GPIO_AFSEL0_5_Pos ( 20U ) +#define GPIO_AF0_GPIO_AFSEL0_5_Msk ( 0xfUL << GPIO_AF0_GPIO_AFSEL0_5_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_5 ( GPIO_AF0_GPIO_AFSEL0_5_Msk ) +#define GPIO_AF0_GPIO_AFSEL0_5_0 ( 0x1UL << GPIO_AF0_GPIO_AFSEL0_5_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_5_1 ( 0x2UL << GPIO_AF0_GPIO_AFSEL0_5_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_5_2 ( 0x4UL << GPIO_AF0_GPIO_AFSEL0_5_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_5_3 ( 0x8UL << GPIO_AF0_GPIO_AFSEL0_5_Pos ) + +#define GPIO_AF0_GPIO_AFSEL0_4_Pos ( 16U ) +#define GPIO_AF0_GPIO_AFSEL0_4_Msk ( 0xfUL << GPIO_AF0_GPIO_AFSEL0_4_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_4 ( GPIO_AF0_GPIO_AFSEL0_4_Msk ) +#define GPIO_AF0_GPIO_AFSEL0_4_0 ( 0x1UL << GPIO_AF0_GPIO_AFSEL0_4_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_4_1 ( 0x2UL << GPIO_AF0_GPIO_AFSEL0_4_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_4_2 ( 0x4UL << GPIO_AF0_GPIO_AFSEL0_4_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_4_3 ( 0x8UL << GPIO_AF0_GPIO_AFSEL0_4_Pos ) + +#define GPIO_AF0_GPIO_AFSEL0_3_Pos ( 12U ) +#define GPIO_AF0_GPIO_AFSEL0_3_Msk ( 0xfUL << GPIO_AF0_GPIO_AFSEL0_3_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_3 ( GPIO_AF0_GPIO_AFSEL0_3_Msk ) +#define GPIO_AF0_GPIO_AFSEL0_3_0 ( 0x1UL << GPIO_AF0_GPIO_AFSEL0_3_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_3_1 ( 0x2UL << GPIO_AF0_GPIO_AFSEL0_3_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_3_2 ( 0x4UL << GPIO_AF0_GPIO_AFSEL0_3_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_3_3 ( 0x8UL << GPIO_AF0_GPIO_AFSEL0_3_Pos ) + +#define GPIO_AF0_GPIO_AFSEL0_2_Pos ( 8U ) +#define GPIO_AF0_GPIO_AFSEL0_2_Msk ( 0xfUL << GPIO_AF0_GPIO_AFSEL0_2_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_2 ( GPIO_AF0_GPIO_AFSEL0_2_Msk ) +#define GPIO_AF0_GPIO_AFSEL0_2_0 ( 0x1UL << GPIO_AF0_GPIO_AFSEL0_2_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_2_1 ( 0x2UL << GPIO_AF0_GPIO_AFSEL0_2_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_2_2 ( 0x4UL << GPIO_AF0_GPIO_AFSEL0_2_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_2_3 ( 0x8UL << GPIO_AF0_GPIO_AFSEL0_2_Pos ) + +#define GPIO_AF0_GPIO_AFSEL0_1_Pos ( 4U ) +#define GPIO_AF0_GPIO_AFSEL0_1_Msk ( 0xfUL << GPIO_AF0_GPIO_AFSEL0_1_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_1 ( GPIO_AF0_GPIO_AFSEL0_1_Msk ) +#define GPIO_AF0_GPIO_AFSEL0_1_0 ( 0x1UL << GPIO_AF0_GPIO_AFSEL0_1_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_1_1 ( 0x2UL << GPIO_AF0_GPIO_AFSEL0_1_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_1_2 ( 0x4UL << GPIO_AF0_GPIO_AFSEL0_1_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_1_3 ( 0x8UL << GPIO_AF0_GPIO_AFSEL0_1_Pos ) + +#define GPIO_AF0_GPIO_AFSEL0_0_Pos ( 0U ) +#define GPIO_AF0_GPIO_AFSEL0_0_Msk ( 0xfUL << GPIO_AF0_GPIO_AFSEL0_0_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_0 ( GPIO_AF0_GPIO_AFSEL0_0_Msk ) +#define GPIO_AF0_GPIO_AFSEL0_0_0 ( 0x1UL << GPIO_AF0_GPIO_AFSEL0_0_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_0_1 ( 0x2UL << GPIO_AF0_GPIO_AFSEL0_0_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_0_2 ( 0x4UL << GPIO_AF0_GPIO_AFSEL0_0_Pos ) +#define GPIO_AF0_GPIO_AFSEL0_0_3 ( 0x8UL << GPIO_AF0_GPIO_AFSEL0_0_Pos ) + + +/*************** Bits definition for GPIO_AF1 **********************/ + +#define GPIO_AF1_GPIO_AFSEL1_15_Pos ( 28U ) +#define GPIO_AF1_GPIO_AFSEL1_15_Msk ( 0xfUL << GPIO_AF1_GPIO_AFSEL1_15_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_15 ( GPIO_AF1_GPIO_AFSEL1_15_Msk ) +#define GPIO_AF1_GPIO_AFSEL1_15_0 ( 0x1UL << GPIO_AF1_GPIO_AFSEL1_15_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_15_1 ( 0x2UL << GPIO_AF1_GPIO_AFSEL1_15_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_15_2 ( 0x4UL << GPIO_AF1_GPIO_AFSEL1_15_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_15_3 ( 0x8UL << GPIO_AF1_GPIO_AFSEL1_15_Pos ) + +#define GPIO_AF1_GPIO_AFSEL1_14_Pos ( 24U ) +#define GPIO_AF1_GPIO_AFSEL1_14_Msk ( 0xfUL << GPIO_AF1_GPIO_AFSEL1_14_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_14 ( GPIO_AF1_GPIO_AFSEL1_14_Msk ) +#define GPIO_AF1_GPIO_AFSEL1_14_0 ( 0x1UL << GPIO_AF1_GPIO_AFSEL1_14_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_14_1 ( 0x2UL << GPIO_AF1_GPIO_AFSEL1_14_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_14_2 ( 0x4UL << GPIO_AF1_GPIO_AFSEL1_14_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_14_3 ( 0x8UL << GPIO_AF1_GPIO_AFSEL1_14_Pos ) + +#define GPIO_AF1_GPIO_AFSEL1_13_Pos ( 20U ) +#define GPIO_AF1_GPIO_AFSEL1_13_Msk ( 0xfUL << GPIO_AF1_GPIO_AFSEL1_13_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_13 ( GPIO_AF1_GPIO_AFSEL1_13_Msk ) +#define GPIO_AF1_GPIO_AFSEL1_13_0 ( 0x1UL << GPIO_AF1_GPIO_AFSEL1_13_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_13_1 ( 0x2UL << GPIO_AF1_GPIO_AFSEL1_13_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_13_2 ( 0x4UL << GPIO_AF1_GPIO_AFSEL1_13_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_13_3 ( 0x8UL << GPIO_AF1_GPIO_AFSEL1_13_Pos ) + +#define GPIO_AF1_GPIO_AFSEL1_12_Pos ( 16U ) +#define GPIO_AF1_GPIO_AFSEL1_12_Msk ( 0xfUL << GPIO_AF1_GPIO_AFSEL1_12_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_12 ( GPIO_AF1_GPIO_AFSEL1_12_Msk ) +#define GPIO_AF1_GPIO_AFSEL1_12_0 ( 0x1UL << GPIO_AF1_GPIO_AFSEL1_12_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_12_1 ( 0x2UL << GPIO_AF1_GPIO_AFSEL1_12_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_12_2 ( 0x4UL << GPIO_AF1_GPIO_AFSEL1_12_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_12_3 ( 0x8UL << GPIO_AF1_GPIO_AFSEL1_12_Pos ) + +#define GPIO_AF1_GPIO_AFSEL1_11_Pos ( 12U ) +#define GPIO_AF1_GPIO_AFSEL1_11_Msk ( 0xfUL << GPIO_AF1_GPIO_AFSEL1_11_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_11 ( GPIO_AF1_GPIO_AFSEL1_11_Msk ) +#define GPIO_AF1_GPIO_AFSEL1_11_0 ( 0x1UL << GPIO_AF1_GPIO_AFSEL1_11_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_11_1 ( 0x2UL << GPIO_AF1_GPIO_AFSEL1_11_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_11_2 ( 0x4UL << GPIO_AF1_GPIO_AFSEL1_11_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_11_3 ( 0x8UL << GPIO_AF1_GPIO_AFSEL1_11_Pos ) + +#define GPIO_AF1_GPIO_AFSEL1_10_Pos ( 8U ) +#define GPIO_AF1_GPIO_AFSEL1_10_Msk ( 0xfUL << GPIO_AF1_GPIO_AFSEL1_10_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_10 ( GPIO_AF1_GPIO_AFSEL1_10_Msk ) +#define GPIO_AF1_GPIO_AFSEL1_10_0 ( 0x1UL << GPIO_AF1_GPIO_AFSEL1_10_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_10_1 ( 0x2UL << GPIO_AF1_GPIO_AFSEL1_10_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_10_2 ( 0x4UL << GPIO_AF1_GPIO_AFSEL1_10_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_10_3 ( 0x8UL << GPIO_AF1_GPIO_AFSEL1_10_Pos ) + +#define GPIO_AF1_GPIO_AFSEL1_9_Pos ( 4U ) +#define GPIO_AF1_GPIO_AFSEL1_9_Msk ( 0xfUL << GPIO_AF1_GPIO_AFSEL1_9_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_9 ( GPIO_AF1_GPIO_AFSEL1_9_Msk ) +#define GPIO_AF1_GPIO_AFSEL1_9_0 ( 0x1UL << GPIO_AF1_GPIO_AFSEL1_9_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_9_1 ( 0x2UL << GPIO_AF1_GPIO_AFSEL1_9_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_9_2 ( 0x4UL << GPIO_AF1_GPIO_AFSEL1_9_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_9_3 ( 0x8UL << GPIO_AF1_GPIO_AFSEL1_9_Pos ) + +#define GPIO_AF1_GPIO_AFSEL1_8_Pos ( 0U ) +#define GPIO_AF1_GPIO_AFSEL1_8_Msk ( 0xfUL << GPIO_AF1_GPIO_AFSEL1_8_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_8 ( GPIO_AF1_GPIO_AFSEL1_8_Msk ) +#define GPIO_AF1_GPIO_AFSEL1_8_0 ( 0x1UL << GPIO_AF1_GPIO_AFSEL1_8_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_8_1 ( 0x2UL << GPIO_AF1_GPIO_AFSEL1_8_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_8_2 ( 0x4UL << GPIO_AF1_GPIO_AFSEL1_8_Pos ) +#define GPIO_AF1_GPIO_AFSEL1_8_3 ( 0x8UL << GPIO_AF1_GPIO_AFSEL1_8_Pos ) + + +/*************** Bits definition for GPIO_DS0 **********************/ + +#define GPIO_DS0_GPIO_DS0_7_Pos ( 28U ) +#define GPIO_DS0_GPIO_DS0_7_Msk ( 0xfUL << GPIO_DS0_GPIO_DS0_7_Pos ) +#define GPIO_DS0_GPIO_DS0_7 ( GPIO_DS0_GPIO_DS0_7_Msk ) +#define GPIO_DS0_GPIO_DS0_7_0 ( 0x1UL << GPIO_DS0_GPIO_DS0_7_Pos ) +#define GPIO_DS0_GPIO_DS0_7_1 ( 0x2UL << GPIO_DS0_GPIO_DS0_7_Pos ) +#define GPIO_DS0_GPIO_DS0_7_2 ( 0x4UL << GPIO_DS0_GPIO_DS0_7_Pos ) +#define GPIO_DS0_GPIO_DS0_7_3 ( 0x8UL << GPIO_DS0_GPIO_DS0_7_Pos ) + +#define GPIO_DS0_GPIO_DS0_6_Pos ( 24U ) +#define GPIO_DS0_GPIO_DS0_6_Msk ( 0xfUL << GPIO_DS0_GPIO_DS0_6_Pos ) +#define GPIO_DS0_GPIO_DS0_6 ( GPIO_DS0_GPIO_DS0_6_Msk ) +#define GPIO_DS0_GPIO_DS0_6_0 ( 0x1UL << GPIO_DS0_GPIO_DS0_6_Pos ) +#define GPIO_DS0_GPIO_DS0_6_1 ( 0x2UL << GPIO_DS0_GPIO_DS0_6_Pos ) +#define GPIO_DS0_GPIO_DS0_6_2 ( 0x4UL << GPIO_DS0_GPIO_DS0_6_Pos ) +#define GPIO_DS0_GPIO_DS0_6_3 ( 0x8UL << GPIO_DS0_GPIO_DS0_6_Pos ) + +#define GPIO_DS0_GPIO_DS0_5_Pos ( 20U ) +#define GPIO_DS0_GPIO_DS0_5_Msk ( 0xfUL << GPIO_DS0_GPIO_DS0_5_Pos ) +#define GPIO_DS0_GPIO_DS0_5 ( GPIO_DS0_GPIO_DS0_5_Msk ) +#define GPIO_DS0_GPIO_DS0_5_0 ( 0x1UL << GPIO_DS0_GPIO_DS0_5_Pos ) +#define GPIO_DS0_GPIO_DS0_5_1 ( 0x2UL << GPIO_DS0_GPIO_DS0_5_Pos ) +#define GPIO_DS0_GPIO_DS0_5_2 ( 0x4UL << GPIO_DS0_GPIO_DS0_5_Pos ) +#define GPIO_DS0_GPIO_DS0_5_3 ( 0x8UL << GPIO_DS0_GPIO_DS0_5_Pos ) + +#define GPIO_DS0_GPIO_DS0_4_Pos ( 16U ) +#define GPIO_DS0_GPIO_DS0_4_Msk ( 0xfUL << GPIO_DS0_GPIO_DS0_4_Pos ) +#define GPIO_DS0_GPIO_DS0_4 ( GPIO_DS0_GPIO_DS0_4_Msk ) +#define GPIO_DS0_GPIO_DS0_4_0 ( 0x1UL << GPIO_DS0_GPIO_DS0_4_Pos ) +#define GPIO_DS0_GPIO_DS0_4_1 ( 0x2UL << GPIO_DS0_GPIO_DS0_4_Pos ) +#define GPIO_DS0_GPIO_DS0_4_2 ( 0x4UL << GPIO_DS0_GPIO_DS0_4_Pos ) +#define GPIO_DS0_GPIO_DS0_4_3 ( 0x8UL << GPIO_DS0_GPIO_DS0_4_Pos ) + +#define GPIO_DS0_GPIO_DS0_3_Pos ( 12U ) +#define GPIO_DS0_GPIO_DS0_3_Msk ( 0xfUL << GPIO_DS0_GPIO_DS0_3_Pos ) +#define GPIO_DS0_GPIO_DS0_3 ( GPIO_DS0_GPIO_DS0_3_Msk ) +#define GPIO_DS0_GPIO_DS0_3_0 ( 0x1UL << GPIO_DS0_GPIO_DS0_3_Pos ) +#define GPIO_DS0_GPIO_DS0_3_1 ( 0x2UL << GPIO_DS0_GPIO_DS0_3_Pos ) +#define GPIO_DS0_GPIO_DS0_3_2 ( 0x4UL << GPIO_DS0_GPIO_DS0_3_Pos ) +#define GPIO_DS0_GPIO_DS0_3_3 ( 0x8UL << GPIO_DS0_GPIO_DS0_3_Pos ) + +#define GPIO_DS0_GPIO_DS0_2_Pos ( 8U ) +#define GPIO_DS0_GPIO_DS0_2_Msk ( 0xfUL << GPIO_DS0_GPIO_DS0_2_Pos ) +#define GPIO_DS0_GPIO_DS0_2 ( GPIO_DS0_GPIO_DS0_2_Msk ) +#define GPIO_DS0_GPIO_DS0_2_0 ( 0x1UL << GPIO_DS0_GPIO_DS0_2_Pos ) +#define GPIO_DS0_GPIO_DS0_2_1 ( 0x2UL << GPIO_DS0_GPIO_DS0_2_Pos ) +#define GPIO_DS0_GPIO_DS0_2_2 ( 0x4UL << GPIO_DS0_GPIO_DS0_2_Pos ) +#define GPIO_DS0_GPIO_DS0_2_3 ( 0x8UL << GPIO_DS0_GPIO_DS0_2_Pos ) + +#define GPIO_DS0_GPIO_DS0_1_Pos ( 4U ) +#define GPIO_DS0_GPIO_DS0_1_Msk ( 0xfUL << GPIO_DS0_GPIO_DS0_1_Pos ) +#define GPIO_DS0_GPIO_DS0_1 ( GPIO_DS0_GPIO_DS0_1_Msk ) +#define GPIO_DS0_GPIO_DS0_1_0 ( 0x1UL << GPIO_DS0_GPIO_DS0_1_Pos ) +#define GPIO_DS0_GPIO_DS0_1_1 ( 0x2UL << GPIO_DS0_GPIO_DS0_1_Pos ) +#define GPIO_DS0_GPIO_DS0_1_2 ( 0x4UL << GPIO_DS0_GPIO_DS0_1_Pos ) +#define GPIO_DS0_GPIO_DS0_1_3 ( 0x8UL << GPIO_DS0_GPIO_DS0_1_Pos ) + +#define GPIO_DS0_GPIO_DS0_0_Pos ( 0U ) +#define GPIO_DS0_GPIO_DS0_0_Msk ( 0xfUL << GPIO_DS0_GPIO_DS0_0_Pos ) +#define GPIO_DS0_GPIO_DS0_0 ( GPIO_DS0_GPIO_DS0_0_Msk ) +#define GPIO_DS0_GPIO_DS0_0_0 ( 0x1UL << GPIO_DS0_GPIO_DS0_0_Pos ) +#define GPIO_DS0_GPIO_DS0_0_1 ( 0x2UL << GPIO_DS0_GPIO_DS0_0_Pos ) +#define GPIO_DS0_GPIO_DS0_0_2 ( 0x4UL << GPIO_DS0_GPIO_DS0_0_Pos ) +#define GPIO_DS0_GPIO_DS0_0_3 ( 0x8UL << GPIO_DS0_GPIO_DS0_0_Pos ) + + +/*************** Bits definition for GPIO_DS1 **********************/ + +#define GPIO_DS1_GPIO_DS1_15_Pos ( 28U ) +#define GPIO_DS1_GPIO_DS1_15_Msk ( 0xfUL << GPIO_DS1_GPIO_DS1_15_Pos ) +#define GPIO_DS1_GPIO_DS1_15 ( GPIO_DS1_GPIO_DS1_15_Msk ) +#define GPIO_DS1_GPIO_DS1_15_0 ( 0x1UL << GPIO_DS1_GPIO_DS1_15_Pos ) +#define GPIO_DS1_GPIO_DS1_15_1 ( 0x2UL << GPIO_DS1_GPIO_DS1_15_Pos ) +#define GPIO_DS1_GPIO_DS1_15_2 ( 0x4UL << GPIO_DS1_GPIO_DS1_15_Pos ) +#define GPIO_DS1_GPIO_DS1_15_3 ( 0x8UL << GPIO_DS1_GPIO_DS1_15_Pos ) + +#define GPIO_DS1_GPIO_DS1_14_Pos ( 24U ) +#define GPIO_DS1_GPIO_DS1_14_Msk ( 0xfUL << GPIO_DS1_GPIO_DS1_14_Pos ) +#define GPIO_DS1_GPIO_DS1_14 ( GPIO_DS1_GPIO_DS1_14_Msk ) +#define GPIO_DS1_GPIO_DS1_14_0 ( 0x1UL << GPIO_DS1_GPIO_DS1_14_Pos ) +#define GPIO_DS1_GPIO_DS1_14_1 ( 0x2UL << GPIO_DS1_GPIO_DS1_14_Pos ) +#define GPIO_DS1_GPIO_DS1_14_2 ( 0x4UL << GPIO_DS1_GPIO_DS1_14_Pos ) +#define GPIO_DS1_GPIO_DS1_14_3 ( 0x8UL << GPIO_DS1_GPIO_DS1_14_Pos ) + +#define GPIO_DS1_GPIO_DS1_13_Pos ( 20U ) +#define GPIO_DS1_GPIO_DS1_13_Msk ( 0xfUL << GPIO_DS1_GPIO_DS1_13_Pos ) +#define GPIO_DS1_GPIO_DS1_13 ( GPIO_DS1_GPIO_DS1_13_Msk ) +#define GPIO_DS1_GPIO_DS1_13_0 ( 0x1UL << GPIO_DS1_GPIO_DS1_13_Pos ) +#define GPIO_DS1_GPIO_DS1_13_1 ( 0x2UL << GPIO_DS1_GPIO_DS1_13_Pos ) +#define GPIO_DS1_GPIO_DS1_13_2 ( 0x4UL << GPIO_DS1_GPIO_DS1_13_Pos ) +#define GPIO_DS1_GPIO_DS1_13_3 ( 0x8UL << GPIO_DS1_GPIO_DS1_13_Pos ) + +#define GPIO_DS1_GPIO_DS1_12_Pos ( 16U ) +#define GPIO_DS1_GPIO_DS1_12_Msk ( 0xfUL << GPIO_DS1_GPIO_DS1_12_Pos ) +#define GPIO_DS1_GPIO_DS1_12 ( GPIO_DS1_GPIO_DS1_12_Msk ) +#define GPIO_DS1_GPIO_DS1_12_0 ( 0x1UL << GPIO_DS1_GPIO_DS1_12_Pos ) +#define GPIO_DS1_GPIO_DS1_12_1 ( 0x2UL << GPIO_DS1_GPIO_DS1_12_Pos ) +#define GPIO_DS1_GPIO_DS1_12_2 ( 0x4UL << GPIO_DS1_GPIO_DS1_12_Pos ) +#define GPIO_DS1_GPIO_DS1_12_3 ( 0x8UL << GPIO_DS1_GPIO_DS1_12_Pos ) + +#define GPIO_DS1_GPIO_DS1_11_Pos ( 12U ) +#define GPIO_DS1_GPIO_DS1_11_Msk ( 0xfUL << GPIO_DS1_GPIO_DS1_11_Pos ) +#define GPIO_DS1_GPIO_DS1_11 ( GPIO_DS1_GPIO_DS1_11_Msk ) +#define GPIO_DS1_GPIO_DS1_11_0 ( 0x1UL << GPIO_DS1_GPIO_DS1_11_Pos ) +#define GPIO_DS1_GPIO_DS1_11_1 ( 0x2UL << GPIO_DS1_GPIO_DS1_11_Pos ) +#define GPIO_DS1_GPIO_DS1_11_2 ( 0x4UL << GPIO_DS1_GPIO_DS1_11_Pos ) +#define GPIO_DS1_GPIO_DS1_11_3 ( 0x8UL << GPIO_DS1_GPIO_DS1_11_Pos ) + +#define GPIO_DS1_GPIO_DS1_10_Pos ( 8U ) +#define GPIO_DS1_GPIO_DS1_10_Msk ( 0xfUL << GPIO_DS1_GPIO_DS1_10_Pos ) +#define GPIO_DS1_GPIO_DS1_10 ( GPIO_DS1_GPIO_DS1_10_Msk ) +#define GPIO_DS1_GPIO_DS1_10_0 ( 0x1UL << GPIO_DS1_GPIO_DS1_10_Pos ) +#define GPIO_DS1_GPIO_DS1_10_1 ( 0x2UL << GPIO_DS1_GPIO_DS1_10_Pos ) +#define GPIO_DS1_GPIO_DS1_10_2 ( 0x4UL << GPIO_DS1_GPIO_DS1_10_Pos ) +#define GPIO_DS1_GPIO_DS1_10_3 ( 0x8UL << GPIO_DS1_GPIO_DS1_10_Pos ) + +#define GPIO_DS1_GPIO_DS1_9_Pos ( 4U ) +#define GPIO_DS1_GPIO_DS1_9_Msk ( 0xfUL << GPIO_DS1_GPIO_DS1_9_Pos ) +#define GPIO_DS1_GPIO_DS1_9 ( GPIO_DS1_GPIO_DS1_9_Msk ) +#define GPIO_DS1_GPIO_DS1_9_0 ( 0x1UL << GPIO_DS1_GPIO_DS1_9_Pos ) +#define GPIO_DS1_GPIO_DS1_9_1 ( 0x2UL << GPIO_DS1_GPIO_DS1_9_Pos ) +#define GPIO_DS1_GPIO_DS1_9_2 ( 0x4UL << GPIO_DS1_GPIO_DS1_9_Pos ) +#define GPIO_DS1_GPIO_DS1_9_3 ( 0x8UL << GPIO_DS1_GPIO_DS1_9_Pos ) + +#define GPIO_DS1_GPIO_DS1_8_Pos ( 0U ) +#define GPIO_DS1_GPIO_DS1_8_Msk ( 0xfUL << GPIO_DS1_GPIO_DS1_8_Pos ) +#define GPIO_DS1_GPIO_DS1_8 ( GPIO_DS1_GPIO_DS1_8_Msk ) +#define GPIO_DS1_GPIO_DS1_8_0 ( 0x1UL << GPIO_DS1_GPIO_DS1_8_Pos ) +#define GPIO_DS1_GPIO_DS1_8_1 ( 0x2UL << GPIO_DS1_GPIO_DS1_8_Pos ) +#define GPIO_DS1_GPIO_DS1_8_2 ( 0x4UL << GPIO_DS1_GPIO_DS1_8_Pos ) +#define GPIO_DS1_GPIO_DS1_8_3 ( 0x8UL << GPIO_DS1_GPIO_DS1_8_Pos ) + + +/*************** Bits definition for GPIO_SMIT **********************/ + +#define GPIO_SMIT_GPIO_SMTEN15_Pos ( 15U ) +#define GPIO_SMIT_GPIO_SMTEN15_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN15_Pos ) +#define GPIO_SMIT_GPIO_SMTEN15 ( GPIO_SMIT_GPIO_SMTEN15_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN14_Pos ( 14U ) +#define GPIO_SMIT_GPIO_SMTEN14_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN14_Pos ) +#define GPIO_SMIT_GPIO_SMTEN14 ( GPIO_SMIT_GPIO_SMTEN14_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN13_Pos ( 13U ) +#define GPIO_SMIT_GPIO_SMTEN13_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN13_Pos ) +#define GPIO_SMIT_GPIO_SMTEN13 ( GPIO_SMIT_GPIO_SMTEN13_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN12_Pos ( 12U ) +#define GPIO_SMIT_GPIO_SMTEN12_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN12_Pos ) +#define GPIO_SMIT_GPIO_SMTEN12 ( GPIO_SMIT_GPIO_SMTEN12_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN11_Pos ( 11U ) +#define GPIO_SMIT_GPIO_SMTEN11_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN11_Pos ) +#define GPIO_SMIT_GPIO_SMTEN11 ( GPIO_SMIT_GPIO_SMTEN11_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN10_Pos ( 10U ) +#define GPIO_SMIT_GPIO_SMTEN10_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN10_Pos ) +#define GPIO_SMIT_GPIO_SMTEN10 ( GPIO_SMIT_GPIO_SMTEN10_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN9_Pos ( 9U ) +#define GPIO_SMIT_GPIO_SMTEN9_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN9_Pos ) +#define GPIO_SMIT_GPIO_SMTEN9 ( GPIO_SMIT_GPIO_SMTEN9_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN8_Pos ( 8U ) +#define GPIO_SMIT_GPIO_SMTEN8_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN8_Pos ) +#define GPIO_SMIT_GPIO_SMTEN8 ( GPIO_SMIT_GPIO_SMTEN8_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN7_Pos ( 7U ) +#define GPIO_SMIT_GPIO_SMTEN7_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN7_Pos ) +#define GPIO_SMIT_GPIO_SMTEN7 ( GPIO_SMIT_GPIO_SMTEN7_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN6_Pos ( 6U ) +#define GPIO_SMIT_GPIO_SMTEN6_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN6_Pos ) +#define GPIO_SMIT_GPIO_SMTEN6 ( GPIO_SMIT_GPIO_SMTEN6_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN5_Pos ( 5U ) +#define GPIO_SMIT_GPIO_SMTEN5_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN5_Pos ) +#define GPIO_SMIT_GPIO_SMTEN5 ( GPIO_SMIT_GPIO_SMTEN5_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN4_Pos ( 4U ) +#define GPIO_SMIT_GPIO_SMTEN4_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN4_Pos ) +#define GPIO_SMIT_GPIO_SMTEN4 ( GPIO_SMIT_GPIO_SMTEN4_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN3_Pos ( 3U ) +#define GPIO_SMIT_GPIO_SMTEN3_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN3_Pos ) +#define GPIO_SMIT_GPIO_SMTEN3 ( GPIO_SMIT_GPIO_SMTEN3_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN2_Pos ( 2U ) +#define GPIO_SMIT_GPIO_SMTEN2_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN2_Pos ) +#define GPIO_SMIT_GPIO_SMTEN2 ( GPIO_SMIT_GPIO_SMTEN2_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN1_Pos ( 1U ) +#define GPIO_SMIT_GPIO_SMTEN1_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN1_Pos ) +#define GPIO_SMIT_GPIO_SMTEN1 ( GPIO_SMIT_GPIO_SMTEN1_Msk ) + + +#define GPIO_SMIT_GPIO_SMTEN0_Pos ( 0U ) +#define GPIO_SMIT_GPIO_SMTEN0_Msk ( 0x1UL << GPIO_SMIT_GPIO_SMTEN0_Pos ) +#define GPIO_SMIT_GPIO_SMTEN0 ( GPIO_SMIT_GPIO_SMTEN0_Msk ) + + + +/*************** Bits definition for GPIO_LOCK **********************/ + +#define GPIO_LOCK_LOCK_KEY_Pos ( 16U ) +#define GPIO_LOCK_LOCK_KEY_Msk ( 0x1UL << GPIO_LOCK_LOCK_KEY_Pos ) +#define GPIO_LOCK_LOCK_KEY ( GPIO_LOCK_LOCK_KEY_Msk ) + +#define GPIO_LOCK_LOCK_EN15_Pos ( 15U ) +#define GPIO_LOCK_LOCK_EN15_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN15_Pos ) +#define GPIO_LOCK_LOCK_EN15 ( GPIO_LOCK_LOCK_EN15_Msk ) + + +#define GPIO_LOCK_LOCK_EN14_Pos ( 14U ) +#define GPIO_LOCK_LOCK_EN14_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN14_Pos ) +#define GPIO_LOCK_LOCK_EN14 ( GPIO_LOCK_LOCK_EN14_Msk ) + + +#define GPIO_LOCK_LOCK_EN13_Pos ( 13U ) +#define GPIO_LOCK_LOCK_EN13_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN13_Pos ) +#define GPIO_LOCK_LOCK_EN13 ( GPIO_LOCK_LOCK_EN13_Msk ) + + +#define GPIO_LOCK_LOCK_EN12_Pos ( 12U ) +#define GPIO_LOCK_LOCK_EN12_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN12_Pos ) +#define GPIO_LOCK_LOCK_EN12 ( GPIO_LOCK_LOCK_EN12_Msk ) + + +#define GPIO_LOCK_LOCK_EN11_Pos ( 11U ) +#define GPIO_LOCK_LOCK_EN11_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN11_Pos ) +#define GPIO_LOCK_LOCK_EN11 ( GPIO_LOCK_LOCK_EN11_Msk ) + + +#define GPIO_LOCK_LOCK_EN10_Pos ( 10U ) +#define GPIO_LOCK_LOCK_EN10_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN10_Pos ) +#define GPIO_LOCK_LOCK_EN10 ( GPIO_LOCK_LOCK_EN10_Msk ) + + +#define GPIO_LOCK_LOCK_EN9_Pos ( 9U ) +#define GPIO_LOCK_LOCK_EN9_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN9_Pos ) +#define GPIO_LOCK_LOCK_EN9 ( GPIO_LOCK_LOCK_EN9_Msk ) + + +#define GPIO_LOCK_LOCK_EN8_Pos ( 8U ) +#define GPIO_LOCK_LOCK_EN8_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN8_Pos ) +#define GPIO_LOCK_LOCK_EN8 ( GPIO_LOCK_LOCK_EN8_Msk ) + + +#define GPIO_LOCK_LOCK_EN7_Pos ( 7U ) +#define GPIO_LOCK_LOCK_EN7_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN7_Pos ) +#define GPIO_LOCK_LOCK_EN7 ( GPIO_LOCK_LOCK_EN7_Msk ) + + +#define GPIO_LOCK_LOCK_EN6_Pos ( 6U ) +#define GPIO_LOCK_LOCK_EN6_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN6_Pos ) +#define GPIO_LOCK_LOCK_EN6 ( GPIO_LOCK_LOCK_EN6_Msk ) + + +#define GPIO_LOCK_LOCK_EN5_Pos ( 5U ) +#define GPIO_LOCK_LOCK_EN5_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN5_Pos ) +#define GPIO_LOCK_LOCK_EN5 ( GPIO_LOCK_LOCK_EN5_Msk ) + + +#define GPIO_LOCK_LOCK_EN4_Pos ( 4U ) +#define GPIO_LOCK_LOCK_EN4_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN4_Pos ) +#define GPIO_LOCK_LOCK_EN4 ( GPIO_LOCK_LOCK_EN4_Msk ) + + +#define GPIO_LOCK_LOCK_EN3_Pos ( 3U ) +#define GPIO_LOCK_LOCK_EN3_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN3_Pos ) +#define GPIO_LOCK_LOCK_EN3 ( GPIO_LOCK_LOCK_EN3_Msk ) + + +#define GPIO_LOCK_LOCK_EN2_Pos ( 2U ) +#define GPIO_LOCK_LOCK_EN2_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN2_Pos ) +#define GPIO_LOCK_LOCK_EN2 ( GPIO_LOCK_LOCK_EN2_Msk ) + + +#define GPIO_LOCK_LOCK_EN1_Pos ( 1U ) +#define GPIO_LOCK_LOCK_EN1_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN1_Pos ) +#define GPIO_LOCK_LOCK_EN1 ( GPIO_LOCK_LOCK_EN1_Msk ) + + +#define GPIO_LOCK_LOCK_EN0_Pos ( 0U ) +#define GPIO_LOCK_LOCK_EN0_Msk ( 0x1UL << GPIO_LOCK_LOCK_EN0_Pos ) +#define GPIO_LOCK_LOCK_EN0 ( GPIO_LOCK_LOCK_EN0_Msk ) + + + +/*************** Bits definition for GPIO_AIEN **********************/ + +#define GPIO_AIEN_GPIO_AIEN15_Pos ( 15U ) +#define GPIO_AIEN_GPIO_AIEN15_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN15_Pos ) +#define GPIO_AIEN_GPIO_AIEN15 ( GPIO_AIEN_GPIO_AIEN15_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN14_Pos ( 14U ) +#define GPIO_AIEN_GPIO_AIEN14_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN14_Pos ) +#define GPIO_AIEN_GPIO_AIEN14 ( GPIO_AIEN_GPIO_AIEN14_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN13_Pos ( 13U ) +#define GPIO_AIEN_GPIO_AIEN13_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN13_Pos ) +#define GPIO_AIEN_GPIO_AIEN13 ( GPIO_AIEN_GPIO_AIEN13_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN12_Pos ( 12U ) +#define GPIO_AIEN_GPIO_AIEN12_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN12_Pos ) +#define GPIO_AIEN_GPIO_AIEN12 ( GPIO_AIEN_GPIO_AIEN12_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN11_Pos ( 11U ) +#define GPIO_AIEN_GPIO_AIEN11_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN11_Pos ) +#define GPIO_AIEN_GPIO_AIEN11 ( GPIO_AIEN_GPIO_AIEN11_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN10_Pos ( 10U ) +#define GPIO_AIEN_GPIO_AIEN10_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN10_Pos ) +#define GPIO_AIEN_GPIO_AIEN10 ( GPIO_AIEN_GPIO_AIEN10_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN9_Pos ( 9U ) +#define GPIO_AIEN_GPIO_AIEN9_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN9_Pos ) +#define GPIO_AIEN_GPIO_AIEN9 ( GPIO_AIEN_GPIO_AIEN9_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN8_Pos ( 8U ) +#define GPIO_AIEN_GPIO_AIEN8_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN8_Pos ) +#define GPIO_AIEN_GPIO_AIEN8 ( GPIO_AIEN_GPIO_AIEN8_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN7_Pos ( 7U ) +#define GPIO_AIEN_GPIO_AIEN7_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN7_Pos ) +#define GPIO_AIEN_GPIO_AIEN7 ( GPIO_AIEN_GPIO_AIEN7_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN6_Pos ( 6U ) +#define GPIO_AIEN_GPIO_AIEN6_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN6_Pos ) +#define GPIO_AIEN_GPIO_AIEN6 ( GPIO_AIEN_GPIO_AIEN6_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN5_Pos ( 5U ) +#define GPIO_AIEN_GPIO_AIEN5_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN5_Pos ) +#define GPIO_AIEN_GPIO_AIEN5 ( GPIO_AIEN_GPIO_AIEN5_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN4_Pos ( 4U ) +#define GPIO_AIEN_GPIO_AIEN4_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN4_Pos ) +#define GPIO_AIEN_GPIO_AIEN4 ( GPIO_AIEN_GPIO_AIEN4_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN3_Pos ( 3U ) +#define GPIO_AIEN_GPIO_AIEN3_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN3_Pos ) +#define GPIO_AIEN_GPIO_AIEN3 ( GPIO_AIEN_GPIO_AIEN3_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN2_Pos ( 2U ) +#define GPIO_AIEN_GPIO_AIEN2_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN2_Pos ) +#define GPIO_AIEN_GPIO_AIEN2 ( GPIO_AIEN_GPIO_AIEN2_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN1_Pos ( 1U ) +#define GPIO_AIEN_GPIO_AIEN1_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN1_Pos ) +#define GPIO_AIEN_GPIO_AIEN1 ( GPIO_AIEN_GPIO_AIEN1_Msk ) + + +#define GPIO_AIEN_GPIO_AIEN0_Pos ( 0U ) +#define GPIO_AIEN_GPIO_AIEN0_Msk ( 0x1UL << GPIO_AIEN_GPIO_AIEN0_Pos ) +#define GPIO_AIEN_GPIO_AIEN0 ( GPIO_AIEN_GPIO_AIEN0_Msk ) + + +/*************** Bits definition for EXTI_IENR1 **********************/ + +#define EXTI_IENR1_INTEN31_Pos ( 31U ) +#define EXTI_IENR1_INTEN31_Msk ( 0x1UL << EXTI_IENR1_INTEN31_Pos ) +#define EXTI_IENR1_INTEN31 ( EXTI_IENR1_INTEN31_Msk ) + + +#define EXTI_IENR1_INTEN30_Pos ( 30U ) +#define EXTI_IENR1_INTEN30_Msk ( 0x1UL << EXTI_IENR1_INTEN30_Pos ) +#define EXTI_IENR1_INTEN30 ( EXTI_IENR1_INTEN30_Msk ) + + +#define EXTI_IENR1_INTEN29_Pos ( 29U ) +#define EXTI_IENR1_INTEN29_Msk ( 0x1UL << EXTI_IENR1_INTEN29_Pos ) +#define EXTI_IENR1_INTEN29 ( EXTI_IENR1_INTEN29_Msk ) + + +#define EXTI_IENR1_INTEN28_Pos ( 28U ) +#define EXTI_IENR1_INTEN28_Msk ( 0x1UL << EXTI_IENR1_INTEN28_Pos ) +#define EXTI_IENR1_INTEN28 ( EXTI_IENR1_INTEN28_Msk ) + + +#define EXTI_IENR1_INTEN27_Pos ( 27U ) +#define EXTI_IENR1_INTEN27_Msk ( 0x1UL << EXTI_IENR1_INTEN27_Pos ) +#define EXTI_IENR1_INTEN27 ( EXTI_IENR1_INTEN27_Msk ) + + +#define EXTI_IENR1_INTEN26_Pos ( 26U ) +#define EXTI_IENR1_INTEN26_Msk ( 0x1UL << EXTI_IENR1_INTEN26_Pos ) +#define EXTI_IENR1_INTEN26 ( EXTI_IENR1_INTEN26_Msk ) + + +#define EXTI_IENR1_INTEN25_Pos ( 25U ) +#define EXTI_IENR1_INTEN25_Msk ( 0x1UL << EXTI_IENR1_INTEN25_Pos ) +#define EXTI_IENR1_INTEN25 ( EXTI_IENR1_INTEN25_Msk ) + + +#define EXTI_IENR1_INTEN24_Pos ( 24U ) +#define EXTI_IENR1_INTEN24_Msk ( 0x1UL << EXTI_IENR1_INTEN24_Pos ) +#define EXTI_IENR1_INTEN24 ( EXTI_IENR1_INTEN24_Msk ) + + +#define EXTI_IENR1_INTEN23_Pos ( 23U ) +#define EXTI_IENR1_INTEN23_Msk ( 0x1UL << EXTI_IENR1_INTEN23_Pos ) +#define EXTI_IENR1_INTEN23 ( EXTI_IENR1_INTEN23_Msk ) + + +#define EXTI_IENR1_INTEN22_Pos ( 22U ) +#define EXTI_IENR1_INTEN22_Msk ( 0x1UL << EXTI_IENR1_INTEN22_Pos ) +#define EXTI_IENR1_INTEN22 ( EXTI_IENR1_INTEN22_Msk ) + + +#define EXTI_IENR1_INTEN21_Pos ( 21U ) +#define EXTI_IENR1_INTEN21_Msk ( 0x1UL << EXTI_IENR1_INTEN21_Pos ) +#define EXTI_IENR1_INTEN21 ( EXTI_IENR1_INTEN21_Msk ) + + +#define EXTI_IENR1_INTEN20_Pos ( 20U ) +#define EXTI_IENR1_INTEN20_Msk ( 0x1UL << EXTI_IENR1_INTEN20_Pos ) +#define EXTI_IENR1_INTEN20 ( EXTI_IENR1_INTEN20_Msk ) + + +#define EXTI_IENR1_INTEN19_Pos ( 19U ) +#define EXTI_IENR1_INTEN19_Msk ( 0x1UL << EXTI_IENR1_INTEN19_Pos ) +#define EXTI_IENR1_INTEN19 ( EXTI_IENR1_INTEN19_Msk ) + + +#define EXTI_IENR1_INTEN18_Pos ( 18U ) +#define EXTI_IENR1_INTEN18_Msk ( 0x1UL << EXTI_IENR1_INTEN18_Pos ) +#define EXTI_IENR1_INTEN18 ( EXTI_IENR1_INTEN18_Msk ) + + +#define EXTI_IENR1_INTEN17_Pos ( 17U ) +#define EXTI_IENR1_INTEN17_Msk ( 0x1UL << EXTI_IENR1_INTEN17_Pos ) +#define EXTI_IENR1_INTEN17 ( EXTI_IENR1_INTEN17_Msk ) + + +#define EXTI_IENR1_INTEN16_Pos ( 16U ) +#define EXTI_IENR1_INTEN16_Msk ( 0x1UL << EXTI_IENR1_INTEN16_Pos ) +#define EXTI_IENR1_INTEN16 ( EXTI_IENR1_INTEN16_Msk ) + + +#define EXTI_IENR1_INTEN15_Pos ( 15U ) +#define EXTI_IENR1_INTEN15_Msk ( 0x1UL << EXTI_IENR1_INTEN15_Pos ) +#define EXTI_IENR1_INTEN15 ( EXTI_IENR1_INTEN15_Msk ) + + +#define EXTI_IENR1_INTEN14_Pos ( 14U ) +#define EXTI_IENR1_INTEN14_Msk ( 0x1UL << EXTI_IENR1_INTEN14_Pos ) +#define EXTI_IENR1_INTEN14 ( EXTI_IENR1_INTEN14_Msk ) + + +#define EXTI_IENR1_INTEN13_Pos ( 13U ) +#define EXTI_IENR1_INTEN13_Msk ( 0x1UL << EXTI_IENR1_INTEN13_Pos ) +#define EXTI_IENR1_INTEN13 ( EXTI_IENR1_INTEN13_Msk ) + + +#define EXTI_IENR1_INTEN12_Pos ( 12U ) +#define EXTI_IENR1_INTEN12_Msk ( 0x1UL << EXTI_IENR1_INTEN12_Pos ) +#define EXTI_IENR1_INTEN12 ( EXTI_IENR1_INTEN12_Msk ) + + +#define EXTI_IENR1_INTEN11_Pos ( 11U ) +#define EXTI_IENR1_INTEN11_Msk ( 0x1UL << EXTI_IENR1_INTEN11_Pos ) +#define EXTI_IENR1_INTEN11 ( EXTI_IENR1_INTEN11_Msk ) + + +#define EXTI_IENR1_INTEN10_Pos ( 10U ) +#define EXTI_IENR1_INTEN10_Msk ( 0x1UL << EXTI_IENR1_INTEN10_Pos ) +#define EXTI_IENR1_INTEN10 ( EXTI_IENR1_INTEN10_Msk ) + + +#define EXTI_IENR1_INTEN9_Pos ( 9U ) +#define EXTI_IENR1_INTEN9_Msk ( 0x1UL << EXTI_IENR1_INTEN9_Pos ) +#define EXTI_IENR1_INTEN9 ( EXTI_IENR1_INTEN9_Msk ) + + +#define EXTI_IENR1_INTEN8_Pos ( 8U ) +#define EXTI_IENR1_INTEN8_Msk ( 0x1UL << EXTI_IENR1_INTEN8_Pos ) +#define EXTI_IENR1_INTEN8 ( EXTI_IENR1_INTEN8_Msk ) + + +#define EXTI_IENR1_INTEN7_Pos ( 7U ) +#define EXTI_IENR1_INTEN7_Msk ( 0x1UL << EXTI_IENR1_INTEN7_Pos ) +#define EXTI_IENR1_INTEN7 ( EXTI_IENR1_INTEN7_Msk ) + + +#define EXTI_IENR1_INTEN6_Pos ( 6U ) +#define EXTI_IENR1_INTEN6_Msk ( 0x1UL << EXTI_IENR1_INTEN6_Pos ) +#define EXTI_IENR1_INTEN6 ( EXTI_IENR1_INTEN6_Msk ) + + +#define EXTI_IENR1_INTEN5_Pos ( 5U ) +#define EXTI_IENR1_INTEN5_Msk ( 0x1UL << EXTI_IENR1_INTEN5_Pos ) +#define EXTI_IENR1_INTEN5 ( EXTI_IENR1_INTEN5_Msk ) + + +#define EXTI_IENR1_INTEN4_Pos ( 4U ) +#define EXTI_IENR1_INTEN4_Msk ( 0x1UL << EXTI_IENR1_INTEN4_Pos ) +#define EXTI_IENR1_INTEN4 ( EXTI_IENR1_INTEN4_Msk ) + + +#define EXTI_IENR1_INTEN3_Pos ( 3U ) +#define EXTI_IENR1_INTEN3_Msk ( 0x1UL << EXTI_IENR1_INTEN3_Pos ) +#define EXTI_IENR1_INTEN3 ( EXTI_IENR1_INTEN3_Msk ) + + +#define EXTI_IENR1_INTEN2_Pos ( 2U ) +#define EXTI_IENR1_INTEN2_Msk ( 0x1UL << EXTI_IENR1_INTEN2_Pos ) +#define EXTI_IENR1_INTEN2 ( EXTI_IENR1_INTEN2_Msk ) + + +#define EXTI_IENR1_INTEN1_Pos ( 1U ) +#define EXTI_IENR1_INTEN1_Msk ( 0x1UL << EXTI_IENR1_INTEN1_Pos ) +#define EXTI_IENR1_INTEN1 ( EXTI_IENR1_INTEN1_Msk ) + + +#define EXTI_IENR1_INTEN0_Pos ( 0U ) +#define EXTI_IENR1_INTEN0_Msk ( 0x1UL << EXTI_IENR1_INTEN0_Pos ) +#define EXTI_IENR1_INTEN0 ( EXTI_IENR1_INTEN0_Msk ) + + + +/*************** Bits definition for EXTI_IENR2 **********************/ + +#define EXTI_IENR2_INTEN34_Pos ( 2U ) +#define EXTI_IENR2_INTEN34_Msk ( 0x1UL << EXTI_IENR2_INTEN34_Pos ) +#define EXTI_IENR2_INTEN34 ( EXTI_IENR2_INTEN34_Msk ) + + +#define EXTI_IENR2_INTEN33_Pos ( 1U ) +#define EXTI_IENR2_INTEN33_Msk ( 0x1UL << EXTI_IENR2_INTEN33_Pos ) +#define EXTI_IENR2_INTEN33 ( EXTI_IENR2_INTEN33_Msk ) + + +#define EXTI_IENR2_INTEN32_Pos ( 0U ) +#define EXTI_IENR2_INTEN32_Msk ( 0x1UL << EXTI_IENR2_INTEN32_Pos ) +#define EXTI_IENR2_INTEN32 ( EXTI_IENR2_INTEN32_Msk ) + + + +/*************** Bits definition for EXTI_EENR1 **********************/ + +#define EXTI_EENR1_EVEN31_Pos ( 31U ) +#define EXTI_EENR1_EVEN31_Msk ( 0x1UL << EXTI_EENR1_EVEN31_Pos ) +#define EXTI_EENR1_EVEN31 ( EXTI_EENR1_EVEN31_Msk ) + + +#define EXTI_EENR1_EVEN30_Pos ( 30U ) +#define EXTI_EENR1_EVEN30_Msk ( 0x1UL << EXTI_EENR1_EVEN30_Pos ) +#define EXTI_EENR1_EVEN30 ( EXTI_EENR1_EVEN30_Msk ) + + +#define EXTI_EENR1_EVEN29_Pos ( 29U ) +#define EXTI_EENR1_EVEN29_Msk ( 0x1UL << EXTI_EENR1_EVEN29_Pos ) +#define EXTI_EENR1_EVEN29 ( EXTI_EENR1_EVEN29_Msk ) + + +#define EXTI_EENR1_EVEN28_Pos ( 28U ) +#define EXTI_EENR1_EVEN28_Msk ( 0x1UL << EXTI_EENR1_EVEN28_Pos ) +#define EXTI_EENR1_EVEN28 ( EXTI_EENR1_EVEN28_Msk ) + + +#define EXTI_EENR1_EVEN27_Pos ( 27U ) +#define EXTI_EENR1_EVEN27_Msk ( 0x1UL << EXTI_EENR1_EVEN27_Pos ) +#define EXTI_EENR1_EVEN27 ( EXTI_EENR1_EVEN27_Msk ) + + +#define EXTI_EENR1_EVEN26_Pos ( 26U ) +#define EXTI_EENR1_EVEN26_Msk ( 0x1UL << EXTI_EENR1_EVEN26_Pos ) +#define EXTI_EENR1_EVEN26 ( EXTI_EENR1_EVEN26_Msk ) + + +#define EXTI_EENR1_EVEN25_Pos ( 25U ) +#define EXTI_EENR1_EVEN25_Msk ( 0x1UL << EXTI_EENR1_EVEN25_Pos ) +#define EXTI_EENR1_EVEN25 ( EXTI_EENR1_EVEN25_Msk ) + + +#define EXTI_EENR1_EVEN24_Pos ( 24U ) +#define EXTI_EENR1_EVEN24_Msk ( 0x1UL << EXTI_EENR1_EVEN24_Pos ) +#define EXTI_EENR1_EVEN24 ( EXTI_EENR1_EVEN24_Msk ) + + +#define EXTI_EENR1_EVEN23_Pos ( 23U ) +#define EXTI_EENR1_EVEN23_Msk ( 0x1UL << EXTI_EENR1_EVEN23_Pos ) +#define EXTI_EENR1_EVEN23 ( EXTI_EENR1_EVEN23_Msk ) + + +#define EXTI_EENR1_EVEN22_Pos ( 22U ) +#define EXTI_EENR1_EVEN22_Msk ( 0x1UL << EXTI_EENR1_EVEN22_Pos ) +#define EXTI_EENR1_EVEN22 ( EXTI_EENR1_EVEN22_Msk ) + + +#define EXTI_EENR1_EVEN21_Pos ( 21U ) +#define EXTI_EENR1_EVEN21_Msk ( 0x1UL << EXTI_EENR1_EVEN21_Pos ) +#define EXTI_EENR1_EVEN21 ( EXTI_EENR1_EVEN21_Msk ) + + +#define EXTI_EENR1_EVEN20_Pos ( 20U ) +#define EXTI_EENR1_EVEN20_Msk ( 0x1UL << EXTI_EENR1_EVEN20_Pos ) +#define EXTI_EENR1_EVEN20 ( EXTI_EENR1_EVEN20_Msk ) + + +#define EXTI_EENR1_EVEN19_Pos ( 19U ) +#define EXTI_EENR1_EVEN19_Msk ( 0x1UL << EXTI_EENR1_EVEN19_Pos ) +#define EXTI_EENR1_EVEN19 ( EXTI_EENR1_EVEN19_Msk ) + + +#define EXTI_EENR1_EVEN18_Pos ( 18U ) +#define EXTI_EENR1_EVEN18_Msk ( 0x1UL << EXTI_EENR1_EVEN18_Pos ) +#define EXTI_EENR1_EVEN18 ( EXTI_EENR1_EVEN18_Msk ) + + +#define EXTI_EENR1_EVEN17_Pos ( 17U ) +#define EXTI_EENR1_EVEN17_Msk ( 0x1UL << EXTI_EENR1_EVEN17_Pos ) +#define EXTI_EENR1_EVEN17 ( EXTI_EENR1_EVEN17_Msk ) + + +#define EXTI_EENR1_EVEN16_Pos ( 16U ) +#define EXTI_EENR1_EVEN16_Msk ( 0x1UL << EXTI_EENR1_EVEN16_Pos ) +#define EXTI_EENR1_EVEN16 ( EXTI_EENR1_EVEN16_Msk ) + + +#define EXTI_EENR1_EVEN15_Pos ( 15U ) +#define EXTI_EENR1_EVEN15_Msk ( 0x1UL << EXTI_EENR1_EVEN15_Pos ) +#define EXTI_EENR1_EVEN15 ( EXTI_EENR1_EVEN15_Msk ) + + +#define EXTI_EENR1_EVEN14_Pos ( 14U ) +#define EXTI_EENR1_EVEN14_Msk ( 0x1UL << EXTI_EENR1_EVEN14_Pos ) +#define EXTI_EENR1_EVEN14 ( EXTI_EENR1_EVEN14_Msk ) + + +#define EXTI_EENR1_EVEN13_Pos ( 13U ) +#define EXTI_EENR1_EVEN13_Msk ( 0x1UL << EXTI_EENR1_EVEN13_Pos ) +#define EXTI_EENR1_EVEN13 ( EXTI_EENR1_EVEN13_Msk ) + + +#define EXTI_EENR1_EVEN12_Pos ( 12U ) +#define EXTI_EENR1_EVEN12_Msk ( 0x1UL << EXTI_EENR1_EVEN12_Pos ) +#define EXTI_EENR1_EVEN12 ( EXTI_EENR1_EVEN12_Msk ) + + +#define EXTI_EENR1_EVEN11_Pos ( 11U ) +#define EXTI_EENR1_EVEN11_Msk ( 0x1UL << EXTI_EENR1_EVEN11_Pos ) +#define EXTI_EENR1_EVEN11 ( EXTI_EENR1_EVEN11_Msk ) + + +#define EXTI_EENR1_EVEN10_Pos ( 10U ) +#define EXTI_EENR1_EVEN10_Msk ( 0x1UL << EXTI_EENR1_EVEN10_Pos ) +#define EXTI_EENR1_EVEN10 ( EXTI_EENR1_EVEN10_Msk ) + + +#define EXTI_EENR1_EVEN9_Pos ( 9U ) +#define EXTI_EENR1_EVEN9_Msk ( 0x1UL << EXTI_EENR1_EVEN9_Pos ) +#define EXTI_EENR1_EVEN9 ( EXTI_EENR1_EVEN9_Msk ) + + +#define EXTI_EENR1_EVEN8_Pos ( 8U ) +#define EXTI_EENR1_EVEN8_Msk ( 0x1UL << EXTI_EENR1_EVEN8_Pos ) +#define EXTI_EENR1_EVEN8 ( EXTI_EENR1_EVEN8_Msk ) + + +#define EXTI_EENR1_EVEN7_Pos ( 7U ) +#define EXTI_EENR1_EVEN7_Msk ( 0x1UL << EXTI_EENR1_EVEN7_Pos ) +#define EXTI_EENR1_EVEN7 ( EXTI_EENR1_EVEN7_Msk ) + + +#define EXTI_EENR1_EVEN6_Pos ( 6U ) +#define EXTI_EENR1_EVEN6_Msk ( 0x1UL << EXTI_EENR1_EVEN6_Pos ) +#define EXTI_EENR1_EVEN6 ( EXTI_EENR1_EVEN6_Msk ) + + +#define EXTI_EENR1_EVEN5_Pos ( 5U ) +#define EXTI_EENR1_EVEN5_Msk ( 0x1UL << EXTI_EENR1_EVEN5_Pos ) +#define EXTI_EENR1_EVEN5 ( EXTI_EENR1_EVEN5_Msk ) + + +#define EXTI_EENR1_EVEN4_Pos ( 4U ) +#define EXTI_EENR1_EVEN4_Msk ( 0x1UL << EXTI_EENR1_EVEN4_Pos ) +#define EXTI_EENR1_EVEN4 ( EXTI_EENR1_EVEN4_Msk ) + + +#define EXTI_EENR1_EVEN3_Pos ( 3U ) +#define EXTI_EENR1_EVEN3_Msk ( 0x1UL << EXTI_EENR1_EVEN3_Pos ) +#define EXTI_EENR1_EVEN3 ( EXTI_EENR1_EVEN3_Msk ) + + +#define EXTI_EENR1_EVEN2_Pos ( 2U ) +#define EXTI_EENR1_EVEN2_Msk ( 0x1UL << EXTI_EENR1_EVEN2_Pos ) +#define EXTI_EENR1_EVEN2 ( EXTI_EENR1_EVEN2_Msk ) + + +#define EXTI_EENR1_EVEN1_Pos ( 1U ) +#define EXTI_EENR1_EVEN1_Msk ( 0x1UL << EXTI_EENR1_EVEN1_Pos ) +#define EXTI_EENR1_EVEN1 ( EXTI_EENR1_EVEN1_Msk ) + + +#define EXTI_EENR1_EVEN0_Pos ( 0U ) +#define EXTI_EENR1_EVEN0_Msk ( 0x1UL << EXTI_EENR1_EVEN0_Pos ) +#define EXTI_EENR1_EVEN0 ( EXTI_EENR1_EVEN0_Msk ) + + + +/*************** Bits definition for EXTI_EENR2 **********************/ + +#define EXTI_EENR2_EVEN34_Pos ( 2U ) +#define EXTI_EENR2_EVEN34_Msk ( 0x1UL << EXTI_EENR2_EVEN34_Pos ) +#define EXTI_EENR2_EVEN34 ( EXTI_EENR2_EVEN34_Msk ) + + +#define EXTI_EENR2_EVEN33_Pos ( 1U ) +#define EXTI_EENR2_EVEN33_Msk ( 0x1UL << EXTI_EENR2_EVEN33_Pos ) +#define EXTI_EENR2_EVEN33 ( EXTI_EENR2_EVEN33_Msk ) + + +#define EXTI_EENR2_EVEN32_Pos ( 0U ) +#define EXTI_EENR2_EVEN32_Msk ( 0x1UL << EXTI_EENR2_EVEN32_Pos ) +#define EXTI_EENR2_EVEN32 ( EXTI_EENR2_EVEN32_Msk ) + + + +/*************** Bits definition for EXTI_RTENR1 **********************/ + +#define EXTI_RTENR1_RTEN31_Pos ( 31U ) +#define EXTI_RTENR1_RTEN31_Msk ( 0x1UL << EXTI_RTENR1_RTEN31_Pos ) +#define EXTI_RTENR1_RTEN31 ( EXTI_RTENR1_RTEN31_Msk ) + + +#define EXTI_RTENR1_RTEN30_Pos ( 30U ) +#define EXTI_RTENR1_RTEN30_Msk ( 0x1UL << EXTI_RTENR1_RTEN30_Pos ) +#define EXTI_RTENR1_RTEN30 ( EXTI_RTENR1_RTEN30_Msk ) + + +#define EXTI_RTENR1_RTEN29_Pos ( 29U ) +#define EXTI_RTENR1_RTEN29_Msk ( 0x1UL << EXTI_RTENR1_RTEN29_Pos ) +#define EXTI_RTENR1_RTEN29 ( EXTI_RTENR1_RTEN29_Msk ) + + +#define EXTI_RTENR1_RTEN28_Pos ( 28U ) +#define EXTI_RTENR1_RTEN28_Msk ( 0x1UL << EXTI_RTENR1_RTEN28_Pos ) +#define EXTI_RTENR1_RTEN28 ( EXTI_RTENR1_RTEN28_Msk ) + + +#define EXTI_RTENR1_RTEN27_Pos ( 27U ) +#define EXTI_RTENR1_RTEN27_Msk ( 0x1UL << EXTI_RTENR1_RTEN27_Pos ) +#define EXTI_RTENR1_RTEN27 ( EXTI_RTENR1_RTEN27_Msk ) + + +#define EXTI_RTENR1_RTEN26_Pos ( 26U ) +#define EXTI_RTENR1_RTEN26_Msk ( 0x1UL << EXTI_RTENR1_RTEN26_Pos ) +#define EXTI_RTENR1_RTEN26 ( EXTI_RTENR1_RTEN26_Msk ) + + +#define EXTI_RTENR1_RTEN25_Pos ( 25U ) +#define EXTI_RTENR1_RTEN25_Msk ( 0x1UL << EXTI_RTENR1_RTEN25_Pos ) +#define EXTI_RTENR1_RTEN25 ( EXTI_RTENR1_RTEN25_Msk ) + + +#define EXTI_RTENR1_RTEN24_Pos ( 24U ) +#define EXTI_RTENR1_RTEN24_Msk ( 0x1UL << EXTI_RTENR1_RTEN24_Pos ) +#define EXTI_RTENR1_RTEN24 ( EXTI_RTENR1_RTEN24_Msk ) + + +#define EXTI_RTENR1_RTEN23_Pos ( 23U ) +#define EXTI_RTENR1_RTEN23_Msk ( 0x1UL << EXTI_RTENR1_RTEN23_Pos ) +#define EXTI_RTENR1_RTEN23 ( EXTI_RTENR1_RTEN23_Msk ) + + +#define EXTI_RTENR1_RTEN22_Pos ( 22U ) +#define EXTI_RTENR1_RTEN22_Msk ( 0x1UL << EXTI_RTENR1_RTEN22_Pos ) +#define EXTI_RTENR1_RTEN22 ( EXTI_RTENR1_RTEN22_Msk ) + + +#define EXTI_RTENR1_RTEN21_Pos ( 21U ) +#define EXTI_RTENR1_RTEN21_Msk ( 0x1UL << EXTI_RTENR1_RTEN21_Pos ) +#define EXTI_RTENR1_RTEN21 ( EXTI_RTENR1_RTEN21_Msk ) + + +#define EXTI_RTENR1_RTEN20_Pos ( 20U ) +#define EXTI_RTENR1_RTEN20_Msk ( 0x1UL << EXTI_RTENR1_RTEN20_Pos ) +#define EXTI_RTENR1_RTEN20 ( EXTI_RTENR1_RTEN20_Msk ) + + +#define EXTI_RTENR1_RTEN19_Pos ( 19U ) +#define EXTI_RTENR1_RTEN19_Msk ( 0x1UL << EXTI_RTENR1_RTEN19_Pos ) +#define EXTI_RTENR1_RTEN19 ( EXTI_RTENR1_RTEN19_Msk ) + + +#define EXTI_RTENR1_RTEN18_Pos ( 18U ) +#define EXTI_RTENR1_RTEN18_Msk ( 0x1UL << EXTI_RTENR1_RTEN18_Pos ) +#define EXTI_RTENR1_RTEN18 ( EXTI_RTENR1_RTEN18_Msk ) + + +#define EXTI_RTENR1_RTEN17_Pos ( 17U ) +#define EXTI_RTENR1_RTEN17_Msk ( 0x1UL << EXTI_RTENR1_RTEN17_Pos ) +#define EXTI_RTENR1_RTEN17 ( EXTI_RTENR1_RTEN17_Msk ) + + +#define EXTI_RTENR1_RTEN16_Pos ( 16U ) +#define EXTI_RTENR1_RTEN16_Msk ( 0x1UL << EXTI_RTENR1_RTEN16_Pos ) +#define EXTI_RTENR1_RTEN16 ( EXTI_RTENR1_RTEN16_Msk ) + + +#define EXTI_RTENR1_RTEN15_Pos ( 15U ) +#define EXTI_RTENR1_RTEN15_Msk ( 0x1UL << EXTI_RTENR1_RTEN15_Pos ) +#define EXTI_RTENR1_RTEN15 ( EXTI_RTENR1_RTEN15_Msk ) + + +#define EXTI_RTENR1_RTEN14_Pos ( 14U ) +#define EXTI_RTENR1_RTEN14_Msk ( 0x1UL << EXTI_RTENR1_RTEN14_Pos ) +#define EXTI_RTENR1_RTEN14 ( EXTI_RTENR1_RTEN14_Msk ) + + +#define EXTI_RTENR1_RTEN13_Pos ( 13U ) +#define EXTI_RTENR1_RTEN13_Msk ( 0x1UL << EXTI_RTENR1_RTEN13_Pos ) +#define EXTI_RTENR1_RTEN13 ( EXTI_RTENR1_RTEN13_Msk ) + + +#define EXTI_RTENR1_RTEN12_Pos ( 12U ) +#define EXTI_RTENR1_RTEN12_Msk ( 0x1UL << EXTI_RTENR1_RTEN12_Pos ) +#define EXTI_RTENR1_RTEN12 ( EXTI_RTENR1_RTEN12_Msk ) + + +#define EXTI_RTENR1_RTEN11_Pos ( 11U ) +#define EXTI_RTENR1_RTEN11_Msk ( 0x1UL << EXTI_RTENR1_RTEN11_Pos ) +#define EXTI_RTENR1_RTEN11 ( EXTI_RTENR1_RTEN11_Msk ) + + +#define EXTI_RTENR1_RTEN10_Pos ( 10U ) +#define EXTI_RTENR1_RTEN10_Msk ( 0x1UL << EXTI_RTENR1_RTEN10_Pos ) +#define EXTI_RTENR1_RTEN10 ( EXTI_RTENR1_RTEN10_Msk ) + + +#define EXTI_RTENR1_RTEN9_Pos ( 9U ) +#define EXTI_RTENR1_RTEN9_Msk ( 0x1UL << EXTI_RTENR1_RTEN9_Pos ) +#define EXTI_RTENR1_RTEN9 ( EXTI_RTENR1_RTEN9_Msk ) + + +#define EXTI_RTENR1_RTEN8_Pos ( 8U ) +#define EXTI_RTENR1_RTEN8_Msk ( 0x1UL << EXTI_RTENR1_RTEN8_Pos ) +#define EXTI_RTENR1_RTEN8 ( EXTI_RTENR1_RTEN8_Msk ) + + +#define EXTI_RTENR1_RTEN7_Pos ( 7U ) +#define EXTI_RTENR1_RTEN7_Msk ( 0x1UL << EXTI_RTENR1_RTEN7_Pos ) +#define EXTI_RTENR1_RTEN7 ( EXTI_RTENR1_RTEN7_Msk ) + + +#define EXTI_RTENR1_RTEN6_Pos ( 6U ) +#define EXTI_RTENR1_RTEN6_Msk ( 0x1UL << EXTI_RTENR1_RTEN6_Pos ) +#define EXTI_RTENR1_RTEN6 ( EXTI_RTENR1_RTEN6_Msk ) + + +#define EXTI_RTENR1_RTEN5_Pos ( 5U ) +#define EXTI_RTENR1_RTEN5_Msk ( 0x1UL << EXTI_RTENR1_RTEN5_Pos ) +#define EXTI_RTENR1_RTEN5 ( EXTI_RTENR1_RTEN5_Msk ) + + +#define EXTI_RTENR1_RTEN4_Pos ( 4U ) +#define EXTI_RTENR1_RTEN4_Msk ( 0x1UL << EXTI_RTENR1_RTEN4_Pos ) +#define EXTI_RTENR1_RTEN4 ( EXTI_RTENR1_RTEN4_Msk ) + + +#define EXTI_RTENR1_RTEN3_Pos ( 3U ) +#define EXTI_RTENR1_RTEN3_Msk ( 0x1UL << EXTI_RTENR1_RTEN3_Pos ) +#define EXTI_RTENR1_RTEN3 ( EXTI_RTENR1_RTEN3_Msk ) + + +#define EXTI_RTENR1_RTEN2_Pos ( 2U ) +#define EXTI_RTENR1_RTEN2_Msk ( 0x1UL << EXTI_RTENR1_RTEN2_Pos ) +#define EXTI_RTENR1_RTEN2 ( EXTI_RTENR1_RTEN2_Msk ) + + +#define EXTI_RTENR1_RTEN1_Pos ( 1U ) +#define EXTI_RTENR1_RTEN1_Msk ( 0x1UL << EXTI_RTENR1_RTEN1_Pos ) +#define EXTI_RTENR1_RTEN1 ( EXTI_RTENR1_RTEN1_Msk ) + + +#define EXTI_RTENR1_RTEN0_Pos ( 0U ) +#define EXTI_RTENR1_RTEN0_Msk ( 0x1UL << EXTI_RTENR1_RTEN0_Pos ) +#define EXTI_RTENR1_RTEN0 ( EXTI_RTENR1_RTEN0_Msk ) + + + +/*************** Bits definition for EXTI_RTENR2 **********************/ + +#define EXTI_RTENR2_RTEN34_Pos ( 2U ) +#define EXTI_RTENR2_RTEN34_Msk ( 0x1UL << EXTI_RTENR2_RTEN34_Pos ) +#define EXTI_RTENR2_RTEN34 ( EXTI_RTENR2_RTEN34_Msk ) + + +#define EXTI_RTENR2_RTEN33_Pos ( 1U ) +#define EXTI_RTENR2_RTEN33_Msk ( 0x1UL << EXTI_RTENR2_RTEN33_Pos ) +#define EXTI_RTENR2_RTEN33 ( EXTI_RTENR2_RTEN33_Msk ) + + +#define EXTI_RTENR2_RTEN32_Pos ( 0U ) +#define EXTI_RTENR2_RTEN32_Msk ( 0x1UL << EXTI_RTENR2_RTEN32_Pos ) +#define EXTI_RTENR2_RTEN32 ( EXTI_RTENR2_RTEN32_Msk ) + + + +/*************** Bits definition for EXTI_FTENR1 **********************/ + +#define EXTI_FTENR1_FTEN31_Pos ( 31U ) +#define EXTI_FTENR1_FTEN31_Msk ( 0x1UL << EXTI_FTENR1_FTEN31_Pos ) +#define EXTI_FTENR1_FTEN31 ( EXTI_FTENR1_FTEN31_Msk ) + + +#define EXTI_FTENR1_FTEN30_Pos ( 30U ) +#define EXTI_FTENR1_FTEN30_Msk ( 0x1UL << EXTI_FTENR1_FTEN30_Pos ) +#define EXTI_FTENR1_FTEN30 ( EXTI_FTENR1_FTEN30_Msk ) + + +#define EXTI_FTENR1_FTEN29_Pos ( 29U ) +#define EXTI_FTENR1_FTEN29_Msk ( 0x1UL << EXTI_FTENR1_FTEN29_Pos ) +#define EXTI_FTENR1_FTEN29 ( EXTI_FTENR1_FTEN29_Msk ) + + +#define EXTI_FTENR1_FTEN28_Pos ( 28U ) +#define EXTI_FTENR1_FTEN28_Msk ( 0x1UL << EXTI_FTENR1_FTEN28_Pos ) +#define EXTI_FTENR1_FTEN28 ( EXTI_FTENR1_FTEN28_Msk ) + + +#define EXTI_FTENR1_FTEN27_Pos ( 27U ) +#define EXTI_FTENR1_FTEN27_Msk ( 0x1UL << EXTI_FTENR1_FTEN27_Pos ) +#define EXTI_FTENR1_FTEN27 ( EXTI_FTENR1_FTEN27_Msk ) + + +#define EXTI_FTENR1_FTEN26_Pos ( 26U ) +#define EXTI_FTENR1_FTEN26_Msk ( 0x1UL << EXTI_FTENR1_FTEN26_Pos ) +#define EXTI_FTENR1_FTEN26 ( EXTI_FTENR1_FTEN26_Msk ) + + +#define EXTI_FTENR1_FTEN25_Pos ( 25U ) +#define EXTI_FTENR1_FTEN25_Msk ( 0x1UL << EXTI_FTENR1_FTEN25_Pos ) +#define EXTI_FTENR1_FTEN25 ( EXTI_FTENR1_FTEN25_Msk ) + + +#define EXTI_FTENR1_FTEN24_Pos ( 24U ) +#define EXTI_FTENR1_FTEN24_Msk ( 0x1UL << EXTI_FTENR1_FTEN24_Pos ) +#define EXTI_FTENR1_FTEN24 ( EXTI_FTENR1_FTEN24_Msk ) + + +#define EXTI_FTENR1_FTEN23_Pos ( 23U ) +#define EXTI_FTENR1_FTEN23_Msk ( 0x1UL << EXTI_FTENR1_FTEN23_Pos ) +#define EXTI_FTENR1_FTEN23 ( EXTI_FTENR1_FTEN23_Msk ) + + +#define EXTI_FTENR1_FTEN22_Pos ( 22U ) +#define EXTI_FTENR1_FTEN22_Msk ( 0x1UL << EXTI_FTENR1_FTEN22_Pos ) +#define EXTI_FTENR1_FTEN22 ( EXTI_FTENR1_FTEN22_Msk ) + + +#define EXTI_FTENR1_FTEN21_Pos ( 21U ) +#define EXTI_FTENR1_FTEN21_Msk ( 0x1UL << EXTI_FTENR1_FTEN21_Pos ) +#define EXTI_FTENR1_FTEN21 ( EXTI_FTENR1_FTEN21_Msk ) + + +#define EXTI_FTENR1_FTEN20_Pos ( 20U ) +#define EXTI_FTENR1_FTEN20_Msk ( 0x1UL << EXTI_FTENR1_FTEN20_Pos ) +#define EXTI_FTENR1_FTEN20 ( EXTI_FTENR1_FTEN20_Msk ) + + +#define EXTI_FTENR1_FTEN19_Pos ( 19U ) +#define EXTI_FTENR1_FTEN19_Msk ( 0x1UL << EXTI_FTENR1_FTEN19_Pos ) +#define EXTI_FTENR1_FTEN19 ( EXTI_FTENR1_FTEN19_Msk ) + + +#define EXTI_FTENR1_FTEN18_Pos ( 18U ) +#define EXTI_FTENR1_FTEN18_Msk ( 0x1UL << EXTI_FTENR1_FTEN18_Pos ) +#define EXTI_FTENR1_FTEN18 ( EXTI_FTENR1_FTEN18_Msk ) + + +#define EXTI_FTENR1_FTEN17_Pos ( 17U ) +#define EXTI_FTENR1_FTEN17_Msk ( 0x1UL << EXTI_FTENR1_FTEN17_Pos ) +#define EXTI_FTENR1_FTEN17 ( EXTI_FTENR1_FTEN17_Msk ) + + +#define EXTI_FTENR1_FTEN16_Pos ( 16U ) +#define EXTI_FTENR1_FTEN16_Msk ( 0x1UL << EXTI_FTENR1_FTEN16_Pos ) +#define EXTI_FTENR1_FTEN16 ( EXTI_FTENR1_FTEN16_Msk ) + + +#define EXTI_FTENR1_FTEN15_Pos ( 15U ) +#define EXTI_FTENR1_FTEN15_Msk ( 0x1UL << EXTI_FTENR1_FTEN15_Pos ) +#define EXTI_FTENR1_FTEN15 ( EXTI_FTENR1_FTEN15_Msk ) + + +#define EXTI_FTENR1_FTEN14_Pos ( 14U ) +#define EXTI_FTENR1_FTEN14_Msk ( 0x1UL << EXTI_FTENR1_FTEN14_Pos ) +#define EXTI_FTENR1_FTEN14 ( EXTI_FTENR1_FTEN14_Msk ) + + +#define EXTI_FTENR1_FTEN13_Pos ( 13U ) +#define EXTI_FTENR1_FTEN13_Msk ( 0x1UL << EXTI_FTENR1_FTEN13_Pos ) +#define EXTI_FTENR1_FTEN13 ( EXTI_FTENR1_FTEN13_Msk ) + + +#define EXTI_FTENR1_FTEN12_Pos ( 12U ) +#define EXTI_FTENR1_FTEN12_Msk ( 0x1UL << EXTI_FTENR1_FTEN12_Pos ) +#define EXTI_FTENR1_FTEN12 ( EXTI_FTENR1_FTEN12_Msk ) + + +#define EXTI_FTENR1_FTEN11_Pos ( 11U ) +#define EXTI_FTENR1_FTEN11_Msk ( 0x1UL << EXTI_FTENR1_FTEN11_Pos ) +#define EXTI_FTENR1_FTEN11 ( EXTI_FTENR1_FTEN11_Msk ) + + +#define EXTI_FTENR1_FTEN10_Pos ( 10U ) +#define EXTI_FTENR1_FTEN10_Msk ( 0x1UL << EXTI_FTENR1_FTEN10_Pos ) +#define EXTI_FTENR1_FTEN10 ( EXTI_FTENR1_FTEN10_Msk ) + + +#define EXTI_FTENR1_FTEN9_Pos ( 9U ) +#define EXTI_FTENR1_FTEN9_Msk ( 0x1UL << EXTI_FTENR1_FTEN9_Pos ) +#define EXTI_FTENR1_FTEN9 ( EXTI_FTENR1_FTEN9_Msk ) + + +#define EXTI_FTENR1_FTEN8_Pos ( 8U ) +#define EXTI_FTENR1_FTEN8_Msk ( 0x1UL << EXTI_FTENR1_FTEN8_Pos ) +#define EXTI_FTENR1_FTEN8 ( EXTI_FTENR1_FTEN8_Msk ) + + +#define EXTI_FTENR1_FTEN7_Pos ( 7U ) +#define EXTI_FTENR1_FTEN7_Msk ( 0x1UL << EXTI_FTENR1_FTEN7_Pos ) +#define EXTI_FTENR1_FTEN7 ( EXTI_FTENR1_FTEN7_Msk ) + + +#define EXTI_FTENR1_FTEN6_Pos ( 6U ) +#define EXTI_FTENR1_FTEN6_Msk ( 0x1UL << EXTI_FTENR1_FTEN6_Pos ) +#define EXTI_FTENR1_FTEN6 ( EXTI_FTENR1_FTEN6_Msk ) + + +#define EXTI_FTENR1_FTEN5_Pos ( 5U ) +#define EXTI_FTENR1_FTEN5_Msk ( 0x1UL << EXTI_FTENR1_FTEN5_Pos ) +#define EXTI_FTENR1_FTEN5 ( EXTI_FTENR1_FTEN5_Msk ) + + +#define EXTI_FTENR1_FTEN4_Pos ( 4U ) +#define EXTI_FTENR1_FTEN4_Msk ( 0x1UL << EXTI_FTENR1_FTEN4_Pos ) +#define EXTI_FTENR1_FTEN4 ( EXTI_FTENR1_FTEN4_Msk ) + + +#define EXTI_FTENR1_FTEN3_Pos ( 3U ) +#define EXTI_FTENR1_FTEN3_Msk ( 0x1UL << EXTI_FTENR1_FTEN3_Pos ) +#define EXTI_FTENR1_FTEN3 ( EXTI_FTENR1_FTEN3_Msk ) + + +#define EXTI_FTENR1_FTEN2_Pos ( 2U ) +#define EXTI_FTENR1_FTEN2_Msk ( 0x1UL << EXTI_FTENR1_FTEN2_Pos ) +#define EXTI_FTENR1_FTEN2 ( EXTI_FTENR1_FTEN2_Msk ) + + +#define EXTI_FTENR1_FTEN1_Pos ( 1U ) +#define EXTI_FTENR1_FTEN1_Msk ( 0x1UL << EXTI_FTENR1_FTEN1_Pos ) +#define EXTI_FTENR1_FTEN1 ( EXTI_FTENR1_FTEN1_Msk ) + + +#define EXTI_FTENR1_FTEN0_Pos ( 0U ) +#define EXTI_FTENR1_FTEN0_Msk ( 0x1UL << EXTI_FTENR1_FTEN0_Pos ) +#define EXTI_FTENR1_FTEN0 ( EXTI_FTENR1_FTEN0_Msk ) + + + +/*************** Bits definition for EXTI_FTENR2 **********************/ + +#define EXTI_FTENR2_FTEN34_Pos ( 2U ) +#define EXTI_FTENR2_FTEN34_Msk ( 0x1UL << EXTI_FTENR2_FTEN34_Pos ) +#define EXTI_FTENR2_FTEN34 ( EXTI_FTENR2_FTEN34_Msk ) + + +#define EXTI_FTENR2_FTEN33_Pos ( 1U ) +#define EXTI_FTENR2_FTEN33_Msk ( 0x1UL << EXTI_FTENR2_FTEN33_Pos ) +#define EXTI_FTENR2_FTEN33 ( EXTI_FTENR2_FTEN33_Msk ) + + +#define EXTI_FTENR2_FTEN32_Pos ( 0U ) +#define EXTI_FTENR2_FTEN32_Msk ( 0x1UL << EXTI_FTENR2_FTEN32_Pos ) +#define EXTI_FTENR2_FTEN32 ( EXTI_FTENR2_FTEN32_Msk ) + + + +/*************** Bits definition for EXTI_SWIER1 **********************/ + +#define EXTI_SWIER1_SWIE31_Pos ( 31U ) +#define EXTI_SWIER1_SWIE31_Msk ( 0x1UL << EXTI_SWIER1_SWIE31_Pos ) +#define EXTI_SWIER1_SWIE31 ( EXTI_SWIER1_SWIE31_Msk ) + + +#define EXTI_SWIER1_SWIE30_Pos ( 30U ) +#define EXTI_SWIER1_SWIE30_Msk ( 0x1UL << EXTI_SWIER1_SWIE30_Pos ) +#define EXTI_SWIER1_SWIE30 ( EXTI_SWIER1_SWIE30_Msk ) + + +#define EXTI_SWIER1_SWIE29_Pos ( 29U ) +#define EXTI_SWIER1_SWIE29_Msk ( 0x1UL << EXTI_SWIER1_SWIE29_Pos ) +#define EXTI_SWIER1_SWIE29 ( EXTI_SWIER1_SWIE29_Msk ) + + +#define EXTI_SWIER1_SWIE28_Pos ( 28U ) +#define EXTI_SWIER1_SWIE28_Msk ( 0x1UL << EXTI_SWIER1_SWIE28_Pos ) +#define EXTI_SWIER1_SWIE28 ( EXTI_SWIER1_SWIE28_Msk ) + + +#define EXTI_SWIER1_SWIE27_Pos ( 27U ) +#define EXTI_SWIER1_SWIE27_Msk ( 0x1UL << EXTI_SWIER1_SWIE27_Pos ) +#define EXTI_SWIER1_SWIE27 ( EXTI_SWIER1_SWIE27_Msk ) + + +#define EXTI_SWIER1_SWIE26_Pos ( 26U ) +#define EXTI_SWIER1_SWIE26_Msk ( 0x1UL << EXTI_SWIER1_SWIE26_Pos ) +#define EXTI_SWIER1_SWIE26 ( EXTI_SWIER1_SWIE26_Msk ) + + +#define EXTI_SWIER1_SWIE25_Pos ( 25U ) +#define EXTI_SWIER1_SWIE25_Msk ( 0x1UL << EXTI_SWIER1_SWIE25_Pos ) +#define EXTI_SWIER1_SWIE25 ( EXTI_SWIER1_SWIE25_Msk ) + + +#define EXTI_SWIER1_SWIE24_Pos ( 24U ) +#define EXTI_SWIER1_SWIE24_Msk ( 0x1UL << EXTI_SWIER1_SWIE24_Pos ) +#define EXTI_SWIER1_SWIE24 ( EXTI_SWIER1_SWIE24_Msk ) + + +#define EXTI_SWIER1_SWIE23_Pos ( 23U ) +#define EXTI_SWIER1_SWIE23_Msk ( 0x1UL << EXTI_SWIER1_SWIE23_Pos ) +#define EXTI_SWIER1_SWIE23 ( EXTI_SWIER1_SWIE23_Msk ) + + +#define EXTI_SWIER1_SWIE22_Pos ( 22U ) +#define EXTI_SWIER1_SWIE22_Msk ( 0x1UL << EXTI_SWIER1_SWIE22_Pos ) +#define EXTI_SWIER1_SWIE22 ( EXTI_SWIER1_SWIE22_Msk ) + + +#define EXTI_SWIER1_SWIE21_Pos ( 21U ) +#define EXTI_SWIER1_SWIE21_Msk ( 0x1UL << EXTI_SWIER1_SWIE21_Pos ) +#define EXTI_SWIER1_SWIE21 ( EXTI_SWIER1_SWIE21_Msk ) + + +#define EXTI_SWIER1_SWIE20_Pos ( 20U ) +#define EXTI_SWIER1_SWIE20_Msk ( 0x1UL << EXTI_SWIER1_SWIE20_Pos ) +#define EXTI_SWIER1_SWIE20 ( EXTI_SWIER1_SWIE20_Msk ) + + +#define EXTI_SWIER1_SWIE19_Pos ( 19U ) +#define EXTI_SWIER1_SWIE19_Msk ( 0x1UL << EXTI_SWIER1_SWIE19_Pos ) +#define EXTI_SWIER1_SWIE19 ( EXTI_SWIER1_SWIE19_Msk ) + + +#define EXTI_SWIER1_SWIE18_Pos ( 18U ) +#define EXTI_SWIER1_SWIE18_Msk ( 0x1UL << EXTI_SWIER1_SWIE18_Pos ) +#define EXTI_SWIER1_SWIE18 ( EXTI_SWIER1_SWIE18_Msk ) + + +#define EXTI_SWIER1_SWIE17_Pos ( 17U ) +#define EXTI_SWIER1_SWIE17_Msk ( 0x1UL << EXTI_SWIER1_SWIE17_Pos ) +#define EXTI_SWIER1_SWIE17 ( EXTI_SWIER1_SWIE17_Msk ) + + +#define EXTI_SWIER1_SWIE16_Pos ( 16U ) +#define EXTI_SWIER1_SWIE16_Msk ( 0x1UL << EXTI_SWIER1_SWIE16_Pos ) +#define EXTI_SWIER1_SWIE16 ( EXTI_SWIER1_SWIE16_Msk ) + + +#define EXTI_SWIER1_SWIE15_Pos ( 15U ) +#define EXTI_SWIER1_SWIE15_Msk ( 0x1UL << EXTI_SWIER1_SWIE15_Pos ) +#define EXTI_SWIER1_SWIE15 ( EXTI_SWIER1_SWIE15_Msk ) + + +#define EXTI_SWIER1_SWIE14_Pos ( 14U ) +#define EXTI_SWIER1_SWIE14_Msk ( 0x1UL << EXTI_SWIER1_SWIE14_Pos ) +#define EXTI_SWIER1_SWIE14 ( EXTI_SWIER1_SWIE14_Msk ) + + +#define EXTI_SWIER1_SWIE13_Pos ( 13U ) +#define EXTI_SWIER1_SWIE13_Msk ( 0x1UL << EXTI_SWIER1_SWIE13_Pos ) +#define EXTI_SWIER1_SWIE13 ( EXTI_SWIER1_SWIE13_Msk ) + + +#define EXTI_SWIER1_SWIE12_Pos ( 12U ) +#define EXTI_SWIER1_SWIE12_Msk ( 0x1UL << EXTI_SWIER1_SWIE12_Pos ) +#define EXTI_SWIER1_SWIE12 ( EXTI_SWIER1_SWIE12_Msk ) + + +#define EXTI_SWIER1_SWIE11_Pos ( 11U ) +#define EXTI_SWIER1_SWIE11_Msk ( 0x1UL << EXTI_SWIER1_SWIE11_Pos ) +#define EXTI_SWIER1_SWIE11 ( EXTI_SWIER1_SWIE11_Msk ) + + +#define EXTI_SWIER1_SWIE10_Pos ( 10U ) +#define EXTI_SWIER1_SWIE10_Msk ( 0x1UL << EXTI_SWIER1_SWIE10_Pos ) +#define EXTI_SWIER1_SWIE10 ( EXTI_SWIER1_SWIE10_Msk ) + + +#define EXTI_SWIER1_SWIE9_Pos ( 9U ) +#define EXTI_SWIER1_SWIE9_Msk ( 0x1UL << EXTI_SWIER1_SWIE9_Pos ) +#define EXTI_SWIER1_SWIE9 ( EXTI_SWIER1_SWIE9_Msk ) + + +#define EXTI_SWIER1_SWIE8_Pos ( 8U ) +#define EXTI_SWIER1_SWIE8_Msk ( 0x1UL << EXTI_SWIER1_SWIE8_Pos ) +#define EXTI_SWIER1_SWIE8 ( EXTI_SWIER1_SWIE8_Msk ) + + +#define EXTI_SWIER1_SWIE7_Pos ( 7U ) +#define EXTI_SWIER1_SWIE7_Msk ( 0x1UL << EXTI_SWIER1_SWIE7_Pos ) +#define EXTI_SWIER1_SWIE7 ( EXTI_SWIER1_SWIE7_Msk ) + + +#define EXTI_SWIER1_SWIE6_Pos ( 6U ) +#define EXTI_SWIER1_SWIE6_Msk ( 0x1UL << EXTI_SWIER1_SWIE6_Pos ) +#define EXTI_SWIER1_SWIE6 ( EXTI_SWIER1_SWIE6_Msk ) + + +#define EXTI_SWIER1_SWIE5_Pos ( 5U ) +#define EXTI_SWIER1_SWIE5_Msk ( 0x1UL << EXTI_SWIER1_SWIE5_Pos ) +#define EXTI_SWIER1_SWIE5 ( EXTI_SWIER1_SWIE5_Msk ) + + +#define EXTI_SWIER1_SWIE4_Pos ( 4U ) +#define EXTI_SWIER1_SWIE4_Msk ( 0x1UL << EXTI_SWIER1_SWIE4_Pos ) +#define EXTI_SWIER1_SWIE4 ( EXTI_SWIER1_SWIE4_Msk ) + + +#define EXTI_SWIER1_SWIE3_Pos ( 3U ) +#define EXTI_SWIER1_SWIE3_Msk ( 0x1UL << EXTI_SWIER1_SWIE3_Pos ) +#define EXTI_SWIER1_SWIE3 ( EXTI_SWIER1_SWIE3_Msk ) + + +#define EXTI_SWIER1_SWIE2_Pos ( 2U ) +#define EXTI_SWIER1_SWIE2_Msk ( 0x1UL << EXTI_SWIER1_SWIE2_Pos ) +#define EXTI_SWIER1_SWIE2 ( EXTI_SWIER1_SWIE2_Msk ) + + +#define EXTI_SWIER1_SWIE1_Pos ( 1U ) +#define EXTI_SWIER1_SWIE1_Msk ( 0x1UL << EXTI_SWIER1_SWIE1_Pos ) +#define EXTI_SWIER1_SWIE1 ( EXTI_SWIER1_SWIE1_Msk ) + + +#define EXTI_SWIER1_SWIE0_Pos ( 0U ) +#define EXTI_SWIER1_SWIE0_Msk ( 0x1UL << EXTI_SWIER1_SWIE0_Pos ) +#define EXTI_SWIER1_SWIE0 ( EXTI_SWIER1_SWIE0_Msk ) + + + +/*************** Bits definition for EXTI_SWIER2 **********************/ + +#define EXTI_SWIER2_SWIE34_Pos ( 2U ) +#define EXTI_SWIER2_SWIE34_Msk ( 0x1UL << EXTI_SWIER2_SWIE34_Pos ) +#define EXTI_SWIER2_SWIE34 ( EXTI_SWIER2_SWIE34_Msk ) + + +#define EXTI_SWIER2_SWIE33_Pos ( 1U ) +#define EXTI_SWIER2_SWIE33_Msk ( 0x1UL << EXTI_SWIER2_SWIE33_Pos ) +#define EXTI_SWIER2_SWIE33 ( EXTI_SWIER2_SWIE33_Msk ) + + +#define EXTI_SWIER2_SWIE32_Pos ( 0U ) +#define EXTI_SWIER2_SWIE32_Msk ( 0x1UL << EXTI_SWIER2_SWIE32_Pos ) +#define EXTI_SWIER2_SWIE32 ( EXTI_SWIER2_SWIE32_Msk ) + + + +/*************** Bits definition for EXTI_PDR1 **********************/ + +#define EXTI_PDR1_PD31_Pos ( 31U ) +#define EXTI_PDR1_PD31_Msk ( 0x1UL << EXTI_PDR1_PD31_Pos ) +#define EXTI_PDR1_PD31 ( EXTI_PDR1_PD31_Msk ) + + +#define EXTI_PDR1_PD30_Pos ( 30U ) +#define EXTI_PDR1_PD30_Msk ( 0x1UL << EXTI_PDR1_PD30_Pos ) +#define EXTI_PDR1_PD30 ( EXTI_PDR1_PD30_Msk ) + + +#define EXTI_PDR1_PD29_Pos ( 29U ) +#define EXTI_PDR1_PD29_Msk ( 0x1UL << EXTI_PDR1_PD29_Pos ) +#define EXTI_PDR1_PD29 ( EXTI_PDR1_PD29_Msk ) + + +#define EXTI_PDR1_PD28_Pos ( 28U ) +#define EXTI_PDR1_PD28_Msk ( 0x1UL << EXTI_PDR1_PD28_Pos ) +#define EXTI_PDR1_PD28 ( EXTI_PDR1_PD28_Msk ) + + +#define EXTI_PDR1_PD27_Pos ( 27U ) +#define EXTI_PDR1_PD27_Msk ( 0x1UL << EXTI_PDR1_PD27_Pos ) +#define EXTI_PDR1_PD27 ( EXTI_PDR1_PD27_Msk ) + + +#define EXTI_PDR1_PD26_Pos ( 26U ) +#define EXTI_PDR1_PD26_Msk ( 0x1UL << EXTI_PDR1_PD26_Pos ) +#define EXTI_PDR1_PD26 ( EXTI_PDR1_PD26_Msk ) + + +#define EXTI_PDR1_PD25_Pos ( 25U ) +#define EXTI_PDR1_PD25_Msk ( 0x1UL << EXTI_PDR1_PD25_Pos ) +#define EXTI_PDR1_PD25 ( EXTI_PDR1_PD25_Msk ) + + +#define EXTI_PDR1_PD24_Pos ( 24U ) +#define EXTI_PDR1_PD24_Msk ( 0x1UL << EXTI_PDR1_PD24_Pos ) +#define EXTI_PDR1_PD24 ( EXTI_PDR1_PD24_Msk ) + + +#define EXTI_PDR1_PD23_Pos ( 23U ) +#define EXTI_PDR1_PD23_Msk ( 0x1UL << EXTI_PDR1_PD23_Pos ) +#define EXTI_PDR1_PD23 ( EXTI_PDR1_PD23_Msk ) + + +#define EXTI_PDR1_PD22_Pos ( 22U ) +#define EXTI_PDR1_PD22_Msk ( 0x1UL << EXTI_PDR1_PD22_Pos ) +#define EXTI_PDR1_PD22 ( EXTI_PDR1_PD22_Msk ) + + +#define EXTI_PDR1_PD21_Pos ( 21U ) +#define EXTI_PDR1_PD21_Msk ( 0x1UL << EXTI_PDR1_PD21_Pos ) +#define EXTI_PDR1_PD21 ( EXTI_PDR1_PD21_Msk ) + + +#define EXTI_PDR1_PD20_Pos ( 20U ) +#define EXTI_PDR1_PD20_Msk ( 0x1UL << EXTI_PDR1_PD20_Pos ) +#define EXTI_PDR1_PD20 ( EXTI_PDR1_PD20_Msk ) + + +#define EXTI_PDR1_PD19_Pos ( 19U ) +#define EXTI_PDR1_PD19_Msk ( 0x1UL << EXTI_PDR1_PD19_Pos ) +#define EXTI_PDR1_PD19 ( EXTI_PDR1_PD19_Msk ) + + +#define EXTI_PDR1_PD18_Pos ( 18U ) +#define EXTI_PDR1_PD18_Msk ( 0x1UL << EXTI_PDR1_PD18_Pos ) +#define EXTI_PDR1_PD18 ( EXTI_PDR1_PD18_Msk ) + + +#define EXTI_PDR1_PD17_Pos ( 17U ) +#define EXTI_PDR1_PD17_Msk ( 0x1UL << EXTI_PDR1_PD17_Pos ) +#define EXTI_PDR1_PD17 ( EXTI_PDR1_PD17_Msk ) + + +#define EXTI_PDR1_PD16_Pos ( 16U ) +#define EXTI_PDR1_PD16_Msk ( 0x1UL << EXTI_PDR1_PD16_Pos ) +#define EXTI_PDR1_PD16 ( EXTI_PDR1_PD16_Msk ) + + +#define EXTI_PDR1_PD15_Pos ( 15U ) +#define EXTI_PDR1_PD15_Msk ( 0x1UL << EXTI_PDR1_PD15_Pos ) +#define EXTI_PDR1_PD15 ( EXTI_PDR1_PD15_Msk ) + + +#define EXTI_PDR1_PD14_Pos ( 14U ) +#define EXTI_PDR1_PD14_Msk ( 0x1UL << EXTI_PDR1_PD14_Pos ) +#define EXTI_PDR1_PD14 ( EXTI_PDR1_PD14_Msk ) + + +#define EXTI_PDR1_PD13_Pos ( 13U ) +#define EXTI_PDR1_PD13_Msk ( 0x1UL << EXTI_PDR1_PD13_Pos ) +#define EXTI_PDR1_PD13 ( EXTI_PDR1_PD13_Msk ) + + +#define EXTI_PDR1_PD12_Pos ( 12U ) +#define EXTI_PDR1_PD12_Msk ( 0x1UL << EXTI_PDR1_PD12_Pos ) +#define EXTI_PDR1_PD12 ( EXTI_PDR1_PD12_Msk ) + + +#define EXTI_PDR1_PD11_Pos ( 11U ) +#define EXTI_PDR1_PD11_Msk ( 0x1UL << EXTI_PDR1_PD11_Pos ) +#define EXTI_PDR1_PD11 ( EXTI_PDR1_PD11_Msk ) + + +#define EXTI_PDR1_PD10_Pos ( 10U ) +#define EXTI_PDR1_PD10_Msk ( 0x1UL << EXTI_PDR1_PD10_Pos ) +#define EXTI_PDR1_PD10 ( EXTI_PDR1_PD10_Msk ) + + +#define EXTI_PDR1_PD9_Pos ( 9U ) +#define EXTI_PDR1_PD9_Msk ( 0x1UL << EXTI_PDR1_PD9_Pos ) +#define EXTI_PDR1_PD9 ( EXTI_PDR1_PD9_Msk ) + + +#define EXTI_PDR1_PD8_Pos ( 8U ) +#define EXTI_PDR1_PD8_Msk ( 0x1UL << EXTI_PDR1_PD8_Pos ) +#define EXTI_PDR1_PD8 ( EXTI_PDR1_PD8_Msk ) + + +#define EXTI_PDR1_PD7_Pos ( 7U ) +#define EXTI_PDR1_PD7_Msk ( 0x1UL << EXTI_PDR1_PD7_Pos ) +#define EXTI_PDR1_PD7 ( EXTI_PDR1_PD7_Msk ) + + +#define EXTI_PDR1_PD6_Pos ( 6U ) +#define EXTI_PDR1_PD6_Msk ( 0x1UL << EXTI_PDR1_PD6_Pos ) +#define EXTI_PDR1_PD6 ( EXTI_PDR1_PD6_Msk ) + + +#define EXTI_PDR1_PD5_Pos ( 5U ) +#define EXTI_PDR1_PD5_Msk ( 0x1UL << EXTI_PDR1_PD5_Pos ) +#define EXTI_PDR1_PD5 ( EXTI_PDR1_PD5_Msk ) + + +#define EXTI_PDR1_PD4_Pos ( 4U ) +#define EXTI_PDR1_PD4_Msk ( 0x1UL << EXTI_PDR1_PD4_Pos ) +#define EXTI_PDR1_PD4 ( EXTI_PDR1_PD4_Msk ) + + +#define EXTI_PDR1_PD3_Pos ( 3U ) +#define EXTI_PDR1_PD3_Msk ( 0x1UL << EXTI_PDR1_PD3_Pos ) +#define EXTI_PDR1_PD3 ( EXTI_PDR1_PD3_Msk ) + + +#define EXTI_PDR1_PD2_Pos ( 2U ) +#define EXTI_PDR1_PD2_Msk ( 0x1UL << EXTI_PDR1_PD2_Pos ) +#define EXTI_PDR1_PD2 ( EXTI_PDR1_PD2_Msk ) + + +#define EXTI_PDR1_PD1_Pos ( 1U ) +#define EXTI_PDR1_PD1_Msk ( 0x1UL << EXTI_PDR1_PD1_Pos ) +#define EXTI_PDR1_PD1 ( EXTI_PDR1_PD1_Msk ) + + +#define EXTI_PDR1_PD0_Pos ( 0U ) +#define EXTI_PDR1_PD0_Msk ( 0x1UL << EXTI_PDR1_PD0_Pos ) +#define EXTI_PDR1_PD0 ( EXTI_PDR1_PD0_Msk ) + + + +/*************** Bits definition for EXTI_PDR2 **********************/ + +#define EXTI_PDR2_PD34_Pos ( 2U ) +#define EXTI_PDR2_PD34_Msk ( 0x1UL << EXTI_PDR2_PD34_Pos ) +#define EXTI_PDR2_PD34 ( EXTI_PDR2_PD34_Msk ) + + +#define EXTI_PDR2_PD33_Pos ( 1U ) +#define EXTI_PDR2_PD33_Msk ( 0x1UL << EXTI_PDR2_PD33_Pos ) +#define EXTI_PDR2_PD33 ( EXTI_PDR2_PD33_Msk ) + + +#define EXTI_PDR2_PD32_Pos ( 0U ) +#define EXTI_PDR2_PD32_Msk ( 0x1UL << EXTI_PDR2_PD32_Pos ) +#define EXTI_PDR2_PD32 ( EXTI_PDR2_PD32_Msk ) + + + +/*************** Bits definition for EXTI_CR1 **********************/ + +#define EXTI_CR1_EXTI_5_Pos ( 25U ) +#define EXTI_CR1_EXTI_5_Msk ( 0x1FUL << EXTI_CR1_EXTI_5_Pos ) +#define EXTI_CR1_EXTI_5 ( EXTI_CR1_EXTI_5_Msk ) +#define EXTI_CR1_EXTI_5_0 ( 0x01UL << EXTI_CR1_EXTI_5_Pos ) +#define EXTI_CR1_EXTI_5_1 ( 0x02UL << EXTI_CR1_EXTI_5_Pos ) +#define EXTI_CR1_EXTI_5_2 ( 0x04UL << EXTI_CR1_EXTI_5_Pos ) +#define EXTI_CR1_EXTI_5_3 ( 0x08UL << EXTI_CR1_EXTI_5_Pos ) +#define EXTI_CR1_EXTI_5_4 ( 0x10UL << EXTI_CR1_EXTI_5_Pos ) + +#define EXTI_CR1_EXTI_4_Pos ( 20U ) +#define EXTI_CR1_EXTI_4_Msk ( 0x1FUL << EXTI_CR1_EXTI_4_Pos ) +#define EXTI_CR1_EXTI_4 ( EXTI_CR1_EXTI_4_Msk ) +#define EXTI_CR1_EXTI_4_0 ( 0x01UL << EXTI_CR1_EXTI_4_Pos ) +#define EXTI_CR1_EXTI_4_1 ( 0x02UL << EXTI_CR1_EXTI_4_Pos ) +#define EXTI_CR1_EXTI_4_2 ( 0x04UL << EXTI_CR1_EXTI_4_Pos ) +#define EXTI_CR1_EXTI_4_3 ( 0x08UL << EXTI_CR1_EXTI_4_Pos ) +#define EXTI_CR1_EXTI_4_4 ( 0x10UL << EXTI_CR1_EXTI_4_Pos ) + +#define EXTI_CR1_EXTI_3_Pos ( 15U ) +#define EXTI_CR1_EXTI_3_Msk ( 0x1FUL << EXTI_CR1_EXTI_3_Pos ) +#define EXTI_CR1_EXTI_3 ( EXTI_CR1_EXTI_3_Msk ) +#define EXTI_CR1_EXTI_3_0 ( 0x01UL << EXTI_CR1_EXTI_3_Pos ) +#define EXTI_CR1_EXTI_3_1 ( 0x02UL << EXTI_CR1_EXTI_3_Pos ) +#define EXTI_CR1_EXTI_3_2 ( 0x04UL << EXTI_CR1_EXTI_3_Pos ) +#define EXTI_CR1_EXTI_3_3 ( 0x08UL << EXTI_CR1_EXTI_3_Pos ) +#define EXTI_CR1_EXTI_3_4 ( 0x10UL << EXTI_CR1_EXTI_3_Pos ) + +#define EXTI_CR1_EXTI_2_Pos ( 10U ) +#define EXTI_CR1_EXTI_2_Msk ( 0x1FUL << EXTI_CR1_EXTI_2_Pos ) +#define EXTI_CR1_EXTI_2 ( EXTI_CR1_EXTI_2_Msk ) +#define EXTI_CR1_EXTI_2_0 ( 0x01UL << EXTI_CR1_EXTI_2_Pos ) +#define EXTI_CR1_EXTI_2_1 ( 0x02UL << EXTI_CR1_EXTI_2_Pos ) +#define EXTI_CR1_EXTI_2_2 ( 0x04UL << EXTI_CR1_EXTI_2_Pos ) +#define EXTI_CR1_EXTI_2_3 ( 0x08UL << EXTI_CR1_EXTI_2_Pos ) +#define EXTI_CR1_EXTI_2_4 ( 0x10UL << EXTI_CR1_EXTI_2_Pos ) + +#define EXTI_CR1_EXTI_1_Pos ( 5U ) +#define EXTI_CR1_EXTI_1_Msk ( 0x1FUL << EXTI_CR1_EXTI_1_Pos ) +#define EXTI_CR1_EXTI_1 ( EXTI_CR1_EXTI_1_Msk ) +#define EXTI_CR1_EXTI_1_0 ( 0x01UL << EXTI_CR1_EXTI_1_Pos ) +#define EXTI_CR1_EXTI_1_1 ( 0x02UL << EXTI_CR1_EXTI_1_Pos ) +#define EXTI_CR1_EXTI_1_2 ( 0x04UL << EXTI_CR1_EXTI_1_Pos ) +#define EXTI_CR1_EXTI_1_3 ( 0x08UL << EXTI_CR1_EXTI_1_Pos ) +#define EXTI_CR1_EXTI_1_4 ( 0x10UL << EXTI_CR1_EXTI_1_Pos ) + +#define EXTI_CR1_EXTI_0_Pos ( 0U ) +#define EXTI_CR1_EXTI_0_Msk ( 0x1FUL << EXTI_CR1_EXTI_0_Pos ) +#define EXTI_CR1_EXTI_0 ( EXTI_CR1_EXTI_0_Msk ) +#define EXTI_CR1_EXTI_0_0 ( 0x01UL << EXTI_CR1_EXTI_0_Pos ) +#define EXTI_CR1_EXTI_0_1 ( 0x02UL << EXTI_CR1_EXTI_0_Pos ) +#define EXTI_CR1_EXTI_0_2 ( 0x04UL << EXTI_CR1_EXTI_0_Pos ) +#define EXTI_CR1_EXTI_0_3 ( 0x08UL << EXTI_CR1_EXTI_0_Pos ) +#define EXTI_CR1_EXTI_0_4 ( 0x10UL << EXTI_CR1_EXTI_0_Pos ) + +/*************** Bits definition for EXTI_CR2 **********************/ + +#define EXTI_CR2_EXTI_11_Pos ( 25U ) +#define EXTI_CR2_EXTI_11_Msk ( 0x1FUL << EXTI_CR2_EXTI_11_Pos ) +#define EXTI_CR2_EXTI_11 ( EXTI_CR2_EXTI_11_Msk ) +#define EXTI_CR2_EXTI_11_0 ( 0x01UL << EXTI_CR2_EXTI_11_Pos ) +#define EXTI_CR2_EXTI_11_1 ( 0x02UL << EXTI_CR2_EXTI_11_Pos ) +#define EXTI_CR2_EXTI_11_2 ( 0x04UL << EXTI_CR2_EXTI_11_Pos ) +#define EXTI_CR2_EXTI_11_3 ( 0x08UL << EXTI_CR2_EXTI_11_Pos ) +#define EXTI_CR2_EXTI_11_4 ( 0x10UL << EXTI_CR2_EXTI_11_Pos ) + +#define EXTI_CR2_EXTI_10_Pos ( 20U ) +#define EXTI_CR2_EXTI_10_Msk ( 0x1FUL << EXTI_CR2_EXTI_10_Pos ) +#define EXTI_CR2_EXTI_10 ( EXTI_CR2_EXTI_10_Msk ) +#define EXTI_CR2_EXTI_10_0 ( 0x01UL << EXTI_CR2_EXTI_10_Pos ) +#define EXTI_CR2_EXTI_10_1 ( 0x02UL << EXTI_CR2_EXTI_10_Pos ) +#define EXTI_CR2_EXTI_10_2 ( 0x04UL << EXTI_CR2_EXTI_10_Pos ) +#define EXTI_CR2_EXTI_10_3 ( 0x08UL << EXTI_CR2_EXTI_10_Pos ) +#define EXTI_CR2_EXTI_10_4 ( 0x10UL << EXTI_CR2_EXTI_10_Pos ) + +#define EXTI_CR2_EXTI_9_Pos ( 15U ) +#define EXTI_CR2_EXTI_9_Msk ( 0x1FUL << EXTI_CR2_EXTI_9_Pos ) +#define EXTI_CR2_EXTI_9 ( EXTI_CR2_EXTI_9_Msk ) +#define EXTI_CR2_EXTI_9_0 ( 0x01UL << EXTI_CR2_EXTI_9_Pos ) +#define EXTI_CR2_EXTI_9_1 ( 0x02UL << EXTI_CR2_EXTI_9_Pos ) +#define EXTI_CR2_EXTI_9_2 ( 0x04UL << EXTI_CR2_EXTI_9_Pos ) +#define EXTI_CR2_EXTI_9_3 ( 0x08UL << EXTI_CR2_EXTI_9_Pos ) +#define EXTI_CR2_EXTI_9_4 ( 0x10UL << EXTI_CR2_EXTI_9_Pos ) + +#define EXTI_CR2_EXTI_8_Pos ( 10U ) +#define EXTI_CR2_EXTI_8_Msk ( 0x1FUL << EXTI_CR2_EXTI_8_Pos ) +#define EXTI_CR2_EXTI_8 ( EXTI_CR2_EXTI_8_Msk ) +#define EXTI_CR2_EXTI_8_0 ( 0x01UL << EXTI_CR2_EXTI_8_Pos ) +#define EXTI_CR2_EXTI_8_1 ( 0x02UL << EXTI_CR2_EXTI_8_Pos ) +#define EXTI_CR2_EXTI_8_2 ( 0x04UL << EXTI_CR2_EXTI_8_Pos ) +#define EXTI_CR2_EXTI_8_3 ( 0x08UL << EXTI_CR2_EXTI_8_Pos ) +#define EXTI_CR2_EXTI_8_4 ( 0x10UL << EXTI_CR2_EXTI_8_Pos ) + +#define EXTI_CR2_EXTI_7_Pos ( 5U ) +#define EXTI_CR2_EXTI_7_Msk ( 0x1FUL << EXTI_CR2_EXTI_7_Pos ) +#define EXTI_CR2_EXTI_7 ( EXTI_CR2_EXTI_7_Msk ) +#define EXTI_CR2_EXTI_7_0 ( 0x01UL << EXTI_CR2_EXTI_7_Pos ) +#define EXTI_CR2_EXTI_7_1 ( 0x02UL << EXTI_CR2_EXTI_7_Pos ) +#define EXTI_CR2_EXTI_7_2 ( 0x04UL << EXTI_CR2_EXTI_7_Pos ) +#define EXTI_CR2_EXTI_7_3 ( 0x08UL << EXTI_CR2_EXTI_7_Pos ) +#define EXTI_CR2_EXTI_7_4 ( 0x10UL << EXTI_CR2_EXTI_7_Pos ) + +#define EXTI_CR2_EXTI_6_Pos ( 0U ) +#define EXTI_CR2_EXTI_6_Msk ( 0x1FUL << EXTI_CR2_EXTI_6_Pos ) +#define EXTI_CR2_EXTI_6 ( EXTI_CR2_EXTI_6_Msk ) +#define EXTI_CR2_EXTI_6_0 ( 0x01UL << EXTI_CR2_EXTI_6_Pos ) +#define EXTI_CR2_EXTI_6_1 ( 0x02UL << EXTI_CR2_EXTI_6_Pos ) +#define EXTI_CR2_EXTI_6_2 ( 0x04UL << EXTI_CR2_EXTI_6_Pos ) +#define EXTI_CR2_EXTI_6_3 ( 0x08UL << EXTI_CR2_EXTI_6_Pos ) +#define EXTI_CR2_EXTI_6_4 ( 0x10UL << EXTI_CR2_EXTI_6_Pos ) + +/*************** Bits definition for EXTI_CR3 **********************/ + +#define EXTI_CR3_EXTI_15_Pos ( 15U ) +#define EXTI_CR3_EXTI_15_Msk ( 0x1FUL << EXTI_CR3_EXTI_15_Pos ) +#define EXTI_CR3_EXTI_15 ( EXTI_CR3_EXTI_15_Msk ) +#define EXTI_CR3_EXTI_15_0 ( 0x01UL << EXTI_CR3_EXTI_15_Pos ) +#define EXTI_CR3_EXTI_15_1 ( 0x02UL << EXTI_CR3_EXTI_15_Pos ) +#define EXTI_CR3_EXTI_15_2 ( 0x04UL << EXTI_CR3_EXTI_15_Pos ) +#define EXTI_CR3_EXTI_15_3 ( 0x08UL << EXTI_CR3_EXTI_15_Pos ) +#define EXTI_CR3_EXTI_15_4 ( 0x10UL << EXTI_CR3_EXTI_15_Pos ) + +#define EXTI_CR3_EXTI_14_Pos ( 10U ) +#define EXTI_CR3_EXTI_14_Msk ( 0x1FUL << EXTI_CR3_EXTI_14_Pos ) +#define EXTI_CR3_EXTI_14 ( EXTI_CR3_EXTI_14_Msk ) +#define EXTI_CR3_EXTI_14_0 ( 0x01UL << EXTI_CR3_EXTI_14_Pos ) +#define EXTI_CR3_EXTI_14_1 ( 0x02UL << EXTI_CR3_EXTI_14_Pos ) +#define EXTI_CR3_EXTI_14_2 ( 0x04UL << EXTI_CR3_EXTI_14_Pos ) +#define EXTI_CR3_EXTI_14_3 ( 0x08UL << EXTI_CR3_EXTI_14_Pos ) +#define EXTI_CR3_EXTI_14_4 ( 0x10UL << EXTI_CR3_EXTI_14_Pos ) + +#define EXTI_CR3_EXTI_13_Pos ( 5U ) +#define EXTI_CR3_EXTI_13_Msk ( 0x1FUL << EXTI_CR3_EXTI_13_Pos ) +#define EXTI_CR3_EXTI_13 ( EXTI_CR3_EXTI_13_Msk ) +#define EXTI_CR3_EXTI_13_0 ( 0x01UL << EXTI_CR3_EXTI_13_Pos ) +#define EXTI_CR3_EXTI_13_1 ( 0x02UL << EXTI_CR3_EXTI_13_Pos ) +#define EXTI_CR3_EXTI_13_2 ( 0x04UL << EXTI_CR3_EXTI_13_Pos ) +#define EXTI_CR3_EXTI_13_3 ( 0x08UL << EXTI_CR3_EXTI_13_Pos ) +#define EXTI_CR3_EXTI_13_4 ( 0x10UL << EXTI_CR3_EXTI_13_Pos ) + +#define EXTI_CR3_EXTI_12_Pos ( 0U ) +#define EXTI_CR3_EXTI_12_Msk ( 0x1FUL << EXTI_CR3_EXTI_12_Pos ) +#define EXTI_CR3_EXTI_12 ( EXTI_CR3_EXTI_12_Msk ) +#define EXTI_CR3_EXTI_12_0 ( 0x01UL << EXTI_CR3_EXTI_12_Pos ) +#define EXTI_CR3_EXTI_12_1 ( 0x02UL << EXTI_CR3_EXTI_12_Pos ) +#define EXTI_CR3_EXTI_12_2 ( 0x04UL << EXTI_CR3_EXTI_12_Pos ) +#define EXTI_CR3_EXTI_12_3 ( 0x08UL << EXTI_CR3_EXTI_12_Pos ) +#define EXTI_CR3_EXTI_12_4 ( 0x10UL << EXTI_CR3_EXTI_12_Pos ) + +/*************** Bits definition for DMA_IntStatus **********************/ + +#define DMA_INTSTATUS_INTSTATUS7_Pos ( 7U ) +#define DMA_INTSTATUS_INTSTATUS7_Msk ( 0x1UL << DMA_INTSTATUS_INTSTATUS7_Pos ) +#define DMA_INTSTATUS_INTSTATUS7 ( DMA_INTSTATUS_INTSTATUS7_Msk ) + + +#define DMA_INTSTATUS_INTSTATUS6_Pos ( 6U ) +#define DMA_INTSTATUS_INTSTATUS6_Msk ( 0x1UL << DMA_INTSTATUS_INTSTATUS6_Pos ) +#define DMA_INTSTATUS_INTSTATUS6 ( DMA_INTSTATUS_INTSTATUS6_Msk ) + + +#define DMA_INTSTATUS_INTSTATUS5_Pos ( 5U ) +#define DMA_INTSTATUS_INTSTATUS5_Msk ( 0x1UL << DMA_INTSTATUS_INTSTATUS5_Pos ) +#define DMA_INTSTATUS_INTSTATUS5 ( DMA_INTSTATUS_INTSTATUS5_Msk ) + + +#define DMA_INTSTATUS_INTSTATUS4_Pos ( 4U ) +#define DMA_INTSTATUS_INTSTATUS4_Msk ( 0x1UL << DMA_INTSTATUS_INTSTATUS4_Pos ) +#define DMA_INTSTATUS_INTSTATUS4 ( DMA_INTSTATUS_INTSTATUS4_Msk ) + + +#define DMA_INTSTATUS_INTSTATUS3_Pos ( 3U ) +#define DMA_INTSTATUS_INTSTATUS3_Msk ( 0x1UL << DMA_INTSTATUS_INTSTATUS3_Pos ) +#define DMA_INTSTATUS_INTSTATUS3 ( DMA_INTSTATUS_INTSTATUS3_Msk ) + + +#define DMA_INTSTATUS_INTSTATUS2_Pos ( 2U ) +#define DMA_INTSTATUS_INTSTATUS2_Msk ( 0x1UL << DMA_INTSTATUS_INTSTATUS2_Pos ) +#define DMA_INTSTATUS_INTSTATUS2 ( DMA_INTSTATUS_INTSTATUS2_Msk ) + + +#define DMA_INTSTATUS_INTSTATUS1_Pos ( 1U ) +#define DMA_INTSTATUS_INTSTATUS1_Msk ( 0x1UL << DMA_INTSTATUS_INTSTATUS1_Pos ) +#define DMA_INTSTATUS_INTSTATUS1 ( DMA_INTSTATUS_INTSTATUS1_Msk ) + + +#define DMA_INTSTATUS_INTSTATUS0_Pos ( 0U ) +#define DMA_INTSTATUS_INTSTATUS0_Msk ( 0x1UL << DMA_INTSTATUS_INTSTATUS0_Pos ) +#define DMA_INTSTATUS_INTSTATUS0 ( DMA_INTSTATUS_INTSTATUS0_Msk ) + + + +/*************** Bits definition for DMA_IntTCStatus **********************/ + +#define DMA_INTTCSTATUS_INTHFTCSTATUS7_Pos ( 15U ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS7_Msk ( 0x1UL << DMA_INTTCSTATUS_INTHFTCSTATUS7_Pos ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS7 ( DMA_INTTCSTATUS_INTHFTCSTATUS7_Msk ) + + +#define DMA_INTTCSTATUS_INTHFTCSTATUS6_Pos ( 14U ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS6_Msk ( 0x1UL << DMA_INTTCSTATUS_INTHFTCSTATUS6_Pos ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS6 ( DMA_INTTCSTATUS_INTHFTCSTATUS6_Msk ) + + +#define DMA_INTTCSTATUS_INTHFTCSTATUS5_Pos ( 13U ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS5_Msk ( 0x1UL << DMA_INTTCSTATUS_INTHFTCSTATUS5_Pos ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS5 ( DMA_INTTCSTATUS_INTHFTCSTATUS5_Msk ) + + +#define DMA_INTTCSTATUS_INTHFTCSTATUS4_Pos ( 12U ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS4_Msk ( 0x1UL << DMA_INTTCSTATUS_INTHFTCSTATUS4_Pos ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS4 ( DMA_INTTCSTATUS_INTHFTCSTATUS4_Msk ) + + +#define DMA_INTTCSTATUS_INTHFTCSTATUS3_Pos ( 11U ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS3_Msk ( 0x1UL << DMA_INTTCSTATUS_INTHFTCSTATUS3_Pos ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS3 ( DMA_INTTCSTATUS_INTHFTCSTATUS3_Msk ) + + +#define DMA_INTTCSTATUS_INTHFTCSTATUS2_Pos ( 10U ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS2_Msk ( 0x1UL << DMA_INTTCSTATUS_INTHFTCSTATUS2_Pos ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS2 ( DMA_INTTCSTATUS_INTHFTCSTATUS2_Msk ) + + +#define DMA_INTTCSTATUS_INTHFTCSTATUS1_Pos ( 9U ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS1_Msk ( 0x1UL << DMA_INTTCSTATUS_INTHFTCSTATUS1_Pos ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS1 ( DMA_INTTCSTATUS_INTHFTCSTATUS1_Msk ) + + +#define DMA_INTTCSTATUS_INTHFTCSTATUS0_Pos ( 8U ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS0_Msk ( 0x1UL << DMA_INTTCSTATUS_INTHFTCSTATUS0_Pos ) +#define DMA_INTTCSTATUS_INTHFTCSTATUS0 ( DMA_INTTCSTATUS_INTHFTCSTATUS0_Msk ) + + +#define DMA_INTTCSTATUS_INTTCSTATUS7_Pos ( 7U ) +#define DMA_INTTCSTATUS_INTTCSTATUS7_Msk ( 0x1UL << DMA_INTTCSTATUS_INTTCSTATUS7_Pos ) +#define DMA_INTTCSTATUS_INTTCSTATUS7 ( DMA_INTTCSTATUS_INTTCSTATUS7_Msk ) + + +#define DMA_INTTCSTATUS_INTTCSTATUS6_Pos ( 6U ) +#define DMA_INTTCSTATUS_INTTCSTATUS6_Msk ( 0x1UL << DMA_INTTCSTATUS_INTTCSTATUS6_Pos ) +#define DMA_INTTCSTATUS_INTTCSTATUS6 ( DMA_INTTCSTATUS_INTTCSTATUS6_Msk ) + + +#define DMA_INTTCSTATUS_INTTCSTATUS5_Pos ( 5U ) +#define DMA_INTTCSTATUS_INTTCSTATUS5_Msk ( 0x1UL << DMA_INTTCSTATUS_INTTCSTATUS5_Pos ) +#define DMA_INTTCSTATUS_INTTCSTATUS5 ( DMA_INTTCSTATUS_INTTCSTATUS5_Msk ) + + +#define DMA_INTTCSTATUS_INTTCSTATUS4_Pos ( 4U ) +#define DMA_INTTCSTATUS_INTTCSTATUS4_Msk ( 0x1UL << DMA_INTTCSTATUS_INTTCSTATUS4_Pos ) +#define DMA_INTTCSTATUS_INTTCSTATUS4 ( DMA_INTTCSTATUS_INTTCSTATUS4_Msk ) + + +#define DMA_INTTCSTATUS_INTTCSTATUS3_Pos ( 3U ) +#define DMA_INTTCSTATUS_INTTCSTATUS3_Msk ( 0x1UL << DMA_INTTCSTATUS_INTTCSTATUS3_Pos ) +#define DMA_INTTCSTATUS_INTTCSTATUS3 ( DMA_INTTCSTATUS_INTTCSTATUS3_Msk ) + + +#define DMA_INTTCSTATUS_INTTCSTATUS2_Pos ( 2U ) +#define DMA_INTTCSTATUS_INTTCSTATUS2_Msk ( 0x1UL << DMA_INTTCSTATUS_INTTCSTATUS2_Pos ) +#define DMA_INTTCSTATUS_INTTCSTATUS2 ( DMA_INTTCSTATUS_INTTCSTATUS2_Msk ) + + +#define DMA_INTTCSTATUS_INTTCSTATUS1_Pos ( 1U ) +#define DMA_INTTCSTATUS_INTTCSTATUS1_Msk ( 0x1UL << DMA_INTTCSTATUS_INTTCSTATUS1_Pos ) +#define DMA_INTTCSTATUS_INTTCSTATUS1 ( DMA_INTTCSTATUS_INTTCSTATUS1_Msk ) + + +#define DMA_INTTCSTATUS_INTTCSTATUS0_Pos ( 0U ) +#define DMA_INTTCSTATUS_INTTCSTATUS0_Msk ( 0x1UL << DMA_INTTCSTATUS_INTTCSTATUS0_Pos ) +#define DMA_INTTCSTATUS_INTTCSTATUS0 ( DMA_INTTCSTATUS_INTTCSTATUS0_Msk ) + + + +/*************** Bits definition for DMA_IntTCClr **********************/ + +#define DMA_INTTCCLR_INTHFTCCLR7_Pos ( 15U ) +#define DMA_INTTCCLR_INTHFTCCLR7_Msk ( 0x1UL << DMA_INTTCCLR_INTHFTCCLR7_Pos ) +#define DMA_INTTCCLR_INTHFTCCLR7 ( DMA_INTTCCLR_INTHFTCCLR7_Msk ) + + +#define DMA_INTTCCLR_INTHFTCCLR6_Pos ( 14U ) +#define DMA_INTTCCLR_INTHFTCCLR6_Msk ( 0x1UL << DMA_INTTCCLR_INTHFTCCLR6_Pos ) +#define DMA_INTTCCLR_INTHFTCCLR6 ( DMA_INTTCCLR_INTHFTCCLR6_Msk ) + + +#define DMA_INTTCCLR_INTHFTCCLR5_Pos ( 13U ) +#define DMA_INTTCCLR_INTHFTCCLR5_Msk ( 0x1UL << DMA_INTTCCLR_INTHFTCCLR5_Pos ) +#define DMA_INTTCCLR_INTHFTCCLR5 ( DMA_INTTCCLR_INTHFTCCLR5_Msk ) + + +#define DMA_INTTCCLR_INTHFTCCLR4_Pos ( 12U ) +#define DMA_INTTCCLR_INTHFTCCLR4_Msk ( 0x1UL << DMA_INTTCCLR_INTHFTCCLR4_Pos ) +#define DMA_INTTCCLR_INTHFTCCLR4 ( DMA_INTTCCLR_INTHFTCCLR4_Msk ) + + +#define DMA_INTTCCLR_INTHFTCCLR3_Pos ( 11U ) +#define DMA_INTTCCLR_INTHFTCCLR3_Msk ( 0x1UL << DMA_INTTCCLR_INTHFTCCLR3_Pos ) +#define DMA_INTTCCLR_INTHFTCCLR3 ( DMA_INTTCCLR_INTHFTCCLR3_Msk ) + + +#define DMA_INTTCCLR_INTHFTCCLR2_Pos ( 10U ) +#define DMA_INTTCCLR_INTHFTCCLR2_Msk ( 0x1UL << DMA_INTTCCLR_INTHFTCCLR2_Pos ) +#define DMA_INTTCCLR_INTHFTCCLR2 ( DMA_INTTCCLR_INTHFTCCLR2_Msk ) + + +#define DMA_INTTCCLR_INTHFTCCLR1_Pos ( 9U ) +#define DMA_INTTCCLR_INTHFTCCLR1_Msk ( 0x1UL << DMA_INTTCCLR_INTHFTCCLR1_Pos ) +#define DMA_INTTCCLR_INTHFTCCLR1 ( DMA_INTTCCLR_INTHFTCCLR1_Msk ) + + +#define DMA_INTTCCLR_INTHFTCCLR0_Pos ( 8U ) +#define DMA_INTTCCLR_INTHFTCCLR0_Msk ( 0x1UL << DMA_INTTCCLR_INTHFTCCLR0_Pos ) +#define DMA_INTTCCLR_INTHFTCCLR0 ( DMA_INTTCCLR_INTHFTCCLR0_Msk ) + + +#define DMA_INTTCCLR_INTTCCLR7_Pos ( 7U ) +#define DMA_INTTCCLR_INTTCCLR7_Msk ( 0x1UL << DMA_INTTCCLR_INTTCCLR7_Pos ) +#define DMA_INTTCCLR_INTTCCLR7 ( DMA_INTTCCLR_INTTCCLR7_Msk ) + + +#define DMA_INTTCCLR_INTTCCLR6_Pos ( 6U ) +#define DMA_INTTCCLR_INTTCCLR6_Msk ( 0x1UL << DMA_INTTCCLR_INTTCCLR6_Pos ) +#define DMA_INTTCCLR_INTTCCLR6 ( DMA_INTTCCLR_INTTCCLR6_Msk ) + + +#define DMA_INTTCCLR_INTTCCLR5_Pos ( 5U ) +#define DMA_INTTCCLR_INTTCCLR5_Msk ( 0x1UL << DMA_INTTCCLR_INTTCCLR5_Pos ) +#define DMA_INTTCCLR_INTTCCLR5 ( DMA_INTTCCLR_INTTCCLR5_Msk ) + + +#define DMA_INTTCCLR_INTTCCLR4_Pos ( 4U ) +#define DMA_INTTCCLR_INTTCCLR4_Msk ( 0x1UL << DMA_INTTCCLR_INTTCCLR4_Pos ) +#define DMA_INTTCCLR_INTTCCLR4 ( DMA_INTTCCLR_INTTCCLR4_Msk ) + + +#define DMA_INTTCCLR_INTTCCLR3_Pos ( 3U ) +#define DMA_INTTCCLR_INTTCCLR3_Msk ( 0x1UL << DMA_INTTCCLR_INTTCCLR3_Pos ) +#define DMA_INTTCCLR_INTTCCLR3 ( DMA_INTTCCLR_INTTCCLR3_Msk ) + + +#define DMA_INTTCCLR_INTTCCLR2_Pos ( 2U ) +#define DMA_INTTCCLR_INTTCCLR2_Msk ( 0x1UL << DMA_INTTCCLR_INTTCCLR2_Pos ) +#define DMA_INTTCCLR_INTTCCLR2 ( DMA_INTTCCLR_INTTCCLR2_Msk ) + + +#define DMA_INTTCCLR_INTTCCLR1_Pos ( 1U ) +#define DMA_INTTCCLR_INTTCCLR1_Msk ( 0x1UL << DMA_INTTCCLR_INTTCCLR1_Pos ) +#define DMA_INTTCCLR_INTTCCLR1 ( DMA_INTTCCLR_INTTCCLR1_Msk ) + + +#define DMA_INTTCCLR_INTTCCLR0_Pos ( 0U ) +#define DMA_INTTCCLR_INTTCCLR0_Msk ( 0x1UL << DMA_INTTCCLR_INTTCCLR0_Pos ) +#define DMA_INTTCCLR_INTTCCLR0 ( DMA_INTTCCLR_INTTCCLR0_Msk ) + + + +/*************** Bits definition for DMA_IntErrStatus **********************/ + +#define DMA_INTERRSTATUS_INTERRSTATUS7_Pos ( 7U ) +#define DMA_INTERRSTATUS_INTERRSTATUS7_Msk ( 0x1UL << DMA_INTERRSTATUS_INTERRSTATUS7_Pos ) +#define DMA_INTERRSTATUS_INTERRSTATUS7 ( DMA_INTERRSTATUS_INTERRSTATUS7_Msk ) + + +#define DMA_INTERRSTATUS_INTERRSTATUS6_Pos ( 6U ) +#define DMA_INTERRSTATUS_INTERRSTATUS6_Msk ( 0x1UL << DMA_INTERRSTATUS_INTERRSTATUS6_Pos ) +#define DMA_INTERRSTATUS_INTERRSTATUS6 ( DMA_INTERRSTATUS_INTERRSTATUS6_Msk ) + + +#define DMA_INTERRSTATUS_INTERRSTATUS5_Pos ( 5U ) +#define DMA_INTERRSTATUS_INTERRSTATUS5_Msk ( 0x1UL << DMA_INTERRSTATUS_INTERRSTATUS5_Pos ) +#define DMA_INTERRSTATUS_INTERRSTATUS5 ( DMA_INTERRSTATUS_INTERRSTATUS5_Msk ) + + +#define DMA_INTERRSTATUS_INTERRSTATUS4_Pos ( 4U ) +#define DMA_INTERRSTATUS_INTERRSTATUS4_Msk ( 0x1UL << DMA_INTERRSTATUS_INTERRSTATUS4_Pos ) +#define DMA_INTERRSTATUS_INTERRSTATUS4 ( DMA_INTERRSTATUS_INTERRSTATUS4_Msk ) + + +#define DMA_INTERRSTATUS_INTERRSTATUS3_Pos ( 3U ) +#define DMA_INTERRSTATUS_INTERRSTATUS3_Msk ( 0x1UL << DMA_INTERRSTATUS_INTERRSTATUS3_Pos ) +#define DMA_INTERRSTATUS_INTERRSTATUS3 ( DMA_INTERRSTATUS_INTERRSTATUS3_Msk ) + + +#define DMA_INTERRSTATUS_INTERRSTATUS2_Pos ( 2U ) +#define DMA_INTERRSTATUS_INTERRSTATUS2_Msk ( 0x1UL << DMA_INTERRSTATUS_INTERRSTATUS2_Pos ) +#define DMA_INTERRSTATUS_INTERRSTATUS2 ( DMA_INTERRSTATUS_INTERRSTATUS2_Msk ) + + +#define DMA_INTERRSTATUS_INTERRSTATUS1_Pos ( 1U ) +#define DMA_INTERRSTATUS_INTERRSTATUS1_Msk ( 0x1UL << DMA_INTERRSTATUS_INTERRSTATUS1_Pos ) +#define DMA_INTERRSTATUS_INTERRSTATUS1 ( DMA_INTERRSTATUS_INTERRSTATUS1_Msk ) + + +#define DMA_INTERRSTATUS_INTERRSTATUS0_Pos ( 0U ) +#define DMA_INTERRSTATUS_INTERRSTATUS0_Msk ( 0x1UL << DMA_INTERRSTATUS_INTERRSTATUS0_Pos ) +#define DMA_INTERRSTATUS_INTERRSTATUS0 ( DMA_INTERRSTATUS_INTERRSTATUS0_Msk ) + + + +/*************** Bits definition for DMA_IntErrClr **********************/ + +#define DMA_INTERRCLR_INTERRCLR7_Pos ( 7U ) +#define DMA_INTERRCLR_INTERRCLR7_Msk ( 0x1UL << DMA_INTERRCLR_INTERRCLR7_Pos ) +#define DMA_INTERRCLR_INTERRCLR7 ( DMA_INTERRCLR_INTERRCLR7_Msk ) + + +#define DMA_INTERRCLR_INTERRCLR6_Pos ( 6U ) +#define DMA_INTERRCLR_INTERRCLR6_Msk ( 0x1UL << DMA_INTERRCLR_INTERRCLR6_Pos ) +#define DMA_INTERRCLR_INTERRCLR6 ( DMA_INTERRCLR_INTERRCLR6_Msk ) + + +#define DMA_INTERRCLR_INTERRCLR5_Pos ( 5U ) +#define DMA_INTERRCLR_INTERRCLR5_Msk ( 0x1UL << DMA_INTERRCLR_INTERRCLR5_Pos ) +#define DMA_INTERRCLR_INTERRCLR5 ( DMA_INTERRCLR_INTERRCLR5_Msk ) + + +#define DMA_INTERRCLR_INTERRCLR4_Pos ( 4U ) +#define DMA_INTERRCLR_INTERRCLR4_Msk ( 0x1UL << DMA_INTERRCLR_INTERRCLR4_Pos ) +#define DMA_INTERRCLR_INTERRCLR4 ( DMA_INTERRCLR_INTERRCLR4_Msk ) + + +#define DMA_INTERRCLR_INTERRCLR3_Pos ( 3U ) +#define DMA_INTERRCLR_INTERRCLR3_Msk ( 0x1UL << DMA_INTERRCLR_INTERRCLR3_Pos ) +#define DMA_INTERRCLR_INTERRCLR3 ( DMA_INTERRCLR_INTERRCLR3_Msk ) + + +#define DMA_INTERRCLR_INTERRCLR2_Pos ( 2U ) +#define DMA_INTERRCLR_INTERRCLR2_Msk ( 0x1UL << DMA_INTERRCLR_INTERRCLR2_Pos ) +#define DMA_INTERRCLR_INTERRCLR2 ( DMA_INTERRCLR_INTERRCLR2_Msk ) + + +#define DMA_INTERRCLR_INTERRCLR1_Pos ( 1U ) +#define DMA_INTERRCLR_INTERRCLR1_Msk ( 0x1UL << DMA_INTERRCLR_INTERRCLR1_Pos ) +#define DMA_INTERRCLR_INTERRCLR1 ( DMA_INTERRCLR_INTERRCLR1_Msk ) + + +#define DMA_INTERRCLR_INTERRCLR0_Pos ( 0U ) +#define DMA_INTERRCLR_INTERRCLR0_Msk ( 0x1UL << DMA_INTERRCLR_INTERRCLR0_Pos ) +#define DMA_INTERRCLR_INTERRCLR0 ( DMA_INTERRCLR_INTERRCLR0_Msk ) + + + +/*************** Bits definition for DMA_RawIntTCStatus **********************/ + +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS7_Pos ( 15U ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS7_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS7_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS7 ( DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS7_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS6_Pos ( 14U ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS6_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS6_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS6 ( DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS6_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS5_Pos ( 13U ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS5_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS5_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS5 ( DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS5_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS4_Pos ( 12U ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS4_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS4_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS4 ( DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS4_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS3_Pos ( 11U ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS3_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS3_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS3 ( DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS3_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS2_Pos ( 10U ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS2_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS2_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS2 ( DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS2_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS1_Pos ( 9U ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS1_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS1_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS1 ( DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS1_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS0_Pos ( 8U ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS0_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS0_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS0 ( DMA_RAWINTTCSTATUS_RAWINTHFTCSTATUS0_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS7_Pos ( 7U ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS7_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTTCSTATUS7_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS7 ( DMA_RAWINTTCSTATUS_RAWINTTCSTATUS7_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS6_Pos ( 6U ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS6_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTTCSTATUS6_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS6 ( DMA_RAWINTTCSTATUS_RAWINTTCSTATUS6_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS5_Pos ( 5U ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS5_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTTCSTATUS5_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS5 ( DMA_RAWINTTCSTATUS_RAWINTTCSTATUS5_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS4_Pos ( 4U ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS4_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTTCSTATUS4_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS4 ( DMA_RAWINTTCSTATUS_RAWINTTCSTATUS4_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS3_Pos ( 3U ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS3_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTTCSTATUS3_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS3 ( DMA_RAWINTTCSTATUS_RAWINTTCSTATUS3_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS2_Pos ( 2U ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS2_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTTCSTATUS2_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS2 ( DMA_RAWINTTCSTATUS_RAWINTTCSTATUS2_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS1_Pos ( 1U ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS1_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTTCSTATUS1_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS1 ( DMA_RAWINTTCSTATUS_RAWINTTCSTATUS1_Msk ) + + +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS0_Pos ( 0U ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS0_Msk ( 0x1UL << DMA_RAWINTTCSTATUS_RAWINTTCSTATUS0_Pos ) +#define DMA_RAWINTTCSTATUS_RAWINTTCSTATUS0 ( DMA_RAWINTTCSTATUS_RAWINTTCSTATUS0_Msk ) + + + +/*************** Bits definition for DMA_RawIntErrStatus **********************/ + +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS7_Pos ( 7U ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS7_Msk ( 0x1UL << DMA_RAWINTERRSTATUS_RAWINTERRSTATUS7_Pos ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS7 ( DMA_RAWINTERRSTATUS_RAWINTERRSTATUS7_Msk ) + + +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS6_Pos ( 6U ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS6_Msk ( 0x1UL << DMA_RAWINTERRSTATUS_RAWINTERRSTATUS6_Pos ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS6 ( DMA_RAWINTERRSTATUS_RAWINTERRSTATUS6_Msk ) + + +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS5_Pos ( 5U ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS5_Msk ( 0x1UL << DMA_RAWINTERRSTATUS_RAWINTERRSTATUS5_Pos ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS5 ( DMA_RAWINTERRSTATUS_RAWINTERRSTATUS5_Msk ) + + +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS4_Pos ( 4U ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS4_Msk ( 0x1UL << DMA_RAWINTERRSTATUS_RAWINTERRSTATUS4_Pos ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS4 ( DMA_RAWINTERRSTATUS_RAWINTERRSTATUS4_Msk ) + + +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS3_Pos ( 3U ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS3_Msk ( 0x1UL << DMA_RAWINTERRSTATUS_RAWINTERRSTATUS3_Pos ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS3 ( DMA_RAWINTERRSTATUS_RAWINTERRSTATUS3_Msk ) + + +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS2_Pos ( 2U ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS2_Msk ( 0x1UL << DMA_RAWINTERRSTATUS_RAWINTERRSTATUS2_Pos ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS2 ( DMA_RAWINTERRSTATUS_RAWINTERRSTATUS2_Msk ) + + +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS1_Pos ( 1U ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS1_Msk ( 0x1UL << DMA_RAWINTERRSTATUS_RAWINTERRSTATUS1_Pos ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS1 ( DMA_RAWINTERRSTATUS_RAWINTERRSTATUS1_Msk ) + + +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS0_Pos ( 0U ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS0_Msk ( 0x1UL << DMA_RAWINTERRSTATUS_RAWINTERRSTATUS0_Pos ) +#define DMA_RAWINTERRSTATUS_RAWINTERRSTATUS0 ( DMA_RAWINTERRSTATUS_RAWINTERRSTATUS0_Msk ) + + + +/*************** Bits definition for DMA_EnChStatus **********************/ + +#define DMA_ENCHSTATUS_ENCHSTAT7_Pos ( 7U ) +#define DMA_ENCHSTATUS_ENCHSTAT7_Msk ( 0x1UL << DMA_ENCHSTATUS_ENCHSTAT7_Pos ) +#define DMA_ENCHSTATUS_ENCHSTAT7 ( DMA_ENCHSTATUS_ENCHSTAT7_Msk ) + + +#define DMA_ENCHSTATUS_ENCHSTAT6_Pos ( 6U ) +#define DMA_ENCHSTATUS_ENCHSTAT6_Msk ( 0x1UL << DMA_ENCHSTATUS_ENCHSTAT6_Pos ) +#define DMA_ENCHSTATUS_ENCHSTAT6 ( DMA_ENCHSTATUS_ENCHSTAT6_Msk ) + + +#define DMA_ENCHSTATUS_ENCHSTAT5_Pos ( 5U ) +#define DMA_ENCHSTATUS_ENCHSTAT5_Msk ( 0x1UL << DMA_ENCHSTATUS_ENCHSTAT5_Pos ) +#define DMA_ENCHSTATUS_ENCHSTAT5 ( DMA_ENCHSTATUS_ENCHSTAT5_Msk ) + + +#define DMA_ENCHSTATUS_ENCHSTAT4_Pos ( 4U ) +#define DMA_ENCHSTATUS_ENCHSTAT4_Msk ( 0x1UL << DMA_ENCHSTATUS_ENCHSTAT4_Pos ) +#define DMA_ENCHSTATUS_ENCHSTAT4 ( DMA_ENCHSTATUS_ENCHSTAT4_Msk ) + + +#define DMA_ENCHSTATUS_ENCHSTAT3_Pos ( 3U ) +#define DMA_ENCHSTATUS_ENCHSTAT3_Msk ( 0x1UL << DMA_ENCHSTATUS_ENCHSTAT3_Pos ) +#define DMA_ENCHSTATUS_ENCHSTAT3 ( DMA_ENCHSTATUS_ENCHSTAT3_Msk ) + + +#define DMA_ENCHSTATUS_ENCHSTAT2_Pos ( 2U ) +#define DMA_ENCHSTATUS_ENCHSTAT2_Msk ( 0x1UL << DMA_ENCHSTATUS_ENCHSTAT2_Pos ) +#define DMA_ENCHSTATUS_ENCHSTAT2 ( DMA_ENCHSTATUS_ENCHSTAT2_Msk ) + + +#define DMA_ENCHSTATUS_ENCHSTAT1_Pos ( 1U ) +#define DMA_ENCHSTATUS_ENCHSTAT1_Msk ( 0x1UL << DMA_ENCHSTATUS_ENCHSTAT1_Pos ) +#define DMA_ENCHSTATUS_ENCHSTAT1 ( DMA_ENCHSTATUS_ENCHSTAT1_Msk ) + + +#define DMA_ENCHSTATUS_ENCHSTAT0_Pos ( 0U ) +#define DMA_ENCHSTATUS_ENCHSTAT0_Msk ( 0x1UL << DMA_ENCHSTATUS_ENCHSTAT0_Pos ) +#define DMA_ENCHSTATUS_ENCHSTAT0 ( DMA_ENCHSTATUS_ENCHSTAT0_Msk ) + + + +/*************** Bits definition for DMA_Config **********************/ + +#define DMA_CONFIG_M2ENDIAN_Pos ( 2U ) +#define DMA_CONFIG_M2ENDIAN_Msk ( 0x1UL << DMA_CONFIG_M2ENDIAN_Pos ) +#define DMA_CONFIG_M2ENDIAN ( DMA_CONFIG_M2ENDIAN_Msk ) + +#define DMA_CONFIG_M1ENDIAN_Pos ( 1U ) +#define DMA_CONFIG_M1ENDIAN_Msk ( 0x1UL << DMA_CONFIG_M1ENDIAN_Pos ) +#define DMA_CONFIG_M1ENDIAN ( DMA_CONFIG_M1ENDIAN_Msk ) + +#define DMA_CONFIG_EN_Pos ( 0U ) +#define DMA_CONFIG_EN_Msk ( 0x1UL << DMA_CONFIG_EN_Pos ) +#define DMA_CONFIG_EN ( DMA_CONFIG_EN_Msk ) + + +/*************** Bits definition for DMA_SyncLo **********************/ + +#define DMA_SYNCLO_SYNCLO_Pos ( 0U ) +#define DMA_SYNCLO_SYNCLO_Msk ( 0xffffffffUL << DMA_SYNCLO_SYNCLO_Pos ) +#define DMA_SYNCLO_SYNCLO ( DMA_SYNCLO_SYNCLO_Msk ) + + +/*************** Bits definition for DMA_SyncHi **********************/ + +#define DMA_SYNCHI_SYNCHI_Pos ( 0U ) +#define DMA_SYNCHI_SYNCHI_Msk ( 0xffffffffUL << DMA_SYNCHI_SYNCHI_Pos ) +#define DMA_SYNCHI_SYNCHI ( DMA_SYNCHI_SYNCHI_Msk ) + + +/*************** Bits definition for DMA_CxSrcAddr **********************/ + +#define DMA_CXSRCADDR_DMA_CXSRCADDR_Pos ( 0U ) +#define DMA_CXSRCADDR_DMA_CXSRCADDR_Msk ( 0xffffffffUL << DMA_CXSRCADDR_DMA_CXSRCADDR_Pos ) +#define DMA_CXSRCADDR_DMA_CXSRCADDR ( DMA_CXSRCADDR_DMA_CXSRCADDR_Msk ) + + +/*************** Bits definition for DMA_CxDestAddr **********************/ + +#define DMA_CXDESTADDR_DMA_CXDESTADDR_Pos ( 0U ) +#define DMA_CXDESTADDR_DMA_CXDESTADDR_Msk ( 0xffffffffUL << DMA_CXDESTADDR_DMA_CXDESTADDR_Pos ) +#define DMA_CXDESTADDR_DMA_CXDESTADDR ( DMA_CXDESTADDR_DMA_CXDESTADDR_Msk ) + + +/*************** Bits definition for DMA_CxLLI **********************/ + +#define DMA_CXLLI_LLI_Pos ( 2U ) +#define DMA_CXLLI_LLI_Msk ( 0x3fffffffUL << DMA_CXLLI_LLI_Pos ) +#define DMA_CXLLI_LLI ( DMA_CXLLI_LLI_Msk ) + +#define DMA_CXLLI_LM_Pos ( 0U ) +#define DMA_CXLLI_LM_Msk ( 0x1UL << DMA_CXLLI_LM_Pos ) +#define DMA_CXLLI_LM ( DMA_CXLLI_LM_Msk ) + + +/*************** Bits definition for DMA_CxCtrl **********************/ + +#define DMA_CXCTRL_RITEN_Pos ( 31U ) +#define DMA_CXCTRL_RITEN_Msk ( 0x1UL << DMA_CXCTRL_RITEN_Pos ) +#define DMA_CXCTRL_RITEN ( DMA_CXCTRL_RITEN_Msk ) + +#define DMA_CXCTRL_DIORDD_Pos ( 28U ) +#define DMA_CXCTRL_DIORDD_Msk ( 0x3UL << DMA_CXCTRL_DIORDD_Pos ) +#define DMA_CXCTRL_DIORDD ( DMA_CXCTRL_DIORDD_Msk ) +#define DMA_CXCTRL_DIORDD_0 ( 0x1UL << DMA_CXCTRL_DIORDD_Pos ) +#define DMA_CXCTRL_DIORDD_1 ( 0x2UL << DMA_CXCTRL_DIORDD_Pos ) + +#define DMA_CXCTRL_SIORSD_Pos ( 26U ) +#define DMA_CXCTRL_SIORSD_Msk ( 0x3UL << DMA_CXCTRL_SIORSD_Pos ) +#define DMA_CXCTRL_SIORSD ( DMA_CXCTRL_SIORSD_Msk ) +#define DMA_CXCTRL_SIORSD_0 ( 0x1UL << DMA_CXCTRL_SIORSD_Pos ) +#define DMA_CXCTRL_SIORSD_1 ( 0x2UL << DMA_CXCTRL_SIORSD_Pos ) + +#define DMA_CXCTRL_DWIDTH_Pos ( 24U ) +#define DMA_CXCTRL_DWIDTH_Msk ( 0x3UL << DMA_CXCTRL_DWIDTH_Pos ) +#define DMA_CXCTRL_DWIDTH ( DMA_CXCTRL_DWIDTH_Msk ) +#define DMA_CXCTRL_DWIDTH_0 ( 0x1UL << DMA_CXCTRL_DWIDTH_Pos ) +#define DMA_CXCTRL_DWIDTH_1 ( 0x2UL << DMA_CXCTRL_DWIDTH_Pos ) + +#define DMA_CXCTRL_SWIDTH_Pos ( 22U ) +#define DMA_CXCTRL_SWIDTH_Msk ( 0x3UL << DMA_CXCTRL_SWIDTH_Pos ) +#define DMA_CXCTRL_SWIDTH ( DMA_CXCTRL_SWIDTH_Msk ) +#define DMA_CXCTRL_SWIDTH_0 ( 0x1UL << DMA_CXCTRL_SWIDTH_Pos ) +#define DMA_CXCTRL_SWIDTH_1 ( 0x2UL << DMA_CXCTRL_SWIDTH_Pos ) + +#define DMA_CXCTRL_DBSIZE_Pos ( 19U ) +#define DMA_CXCTRL_DBSIZE_Msk ( 0x7UL << DMA_CXCTRL_DBSIZE_Pos ) +#define DMA_CXCTRL_DBSIZE ( DMA_CXCTRL_DBSIZE_Msk ) +#define DMA_CXCTRL_DBSIZE_0 ( 0x1UL << DMA_CXCTRL_DBSIZE_Pos ) +#define DMA_CXCTRL_DBSIZE_1 ( 0x2UL << DMA_CXCTRL_DBSIZE_Pos ) +#define DMA_CXCTRL_DBSIZE_2 ( 0x4UL << DMA_CXCTRL_DBSIZE_Pos ) + +#define DMA_CXCTRL_SBSIZE_Pos ( 16U ) +#define DMA_CXCTRL_SBSIZE_Msk ( 0x7UL << DMA_CXCTRL_SBSIZE_Pos ) +#define DMA_CXCTRL_SBSIZE ( DMA_CXCTRL_SBSIZE_Msk ) +#define DMA_CXCTRL_SBSIZE_0 ( 0x1UL << DMA_CXCTRL_SBSIZE_Pos ) +#define DMA_CXCTRL_SBSIZE_1 ( 0x2UL << DMA_CXCTRL_SBSIZE_Pos ) +#define DMA_CXCTRL_SBSIZE_2 ( 0x4UL << DMA_CXCTRL_SBSIZE_Pos ) + +#define DMA_CXCTRL_TRANSFERSIZE_Pos ( 0U ) +#define DMA_CXCTRL_TRANSFERSIZE_Msk ( 0xffffUL << DMA_CXCTRL_TRANSFERSIZE_Pos ) +#define DMA_CXCTRL_TRANSFERSIZE ( DMA_CXCTRL_TRANSFERSIZE_Msk ) + + +/*************** Bits definition for DMA_CxConfig **********************/ + +#define DMA_CXCONFIG_SRCPERIPH_Pos ( 24U ) +#define DMA_CXCONFIG_SRCPERIPH_Msk ( 0xffUL << DMA_CXCONFIG_SRCPERIPH_Pos ) +#define DMA_CXCONFIG_SRCPERIPH ( DMA_CXCONFIG_SRCPERIPH_Msk ) +#define DMA_CXCONFIG_SRCPERIPH_0 ( 0x1UL << DMA_CXCONFIG_SRCPERIPH_Pos ) +#define DMA_CXCONFIG_SRCPERIPH_1 ( 0x2UL << DMA_CXCONFIG_SRCPERIPH_Pos ) +#define DMA_CXCONFIG_SRCPERIPH_2 ( 0x4UL << DMA_CXCONFIG_SRCPERIPH_Pos ) +#define DMA_CXCONFIG_SRCPERIPH_3 ( 0x8UL << DMA_CXCONFIG_SRCPERIPH_Pos ) +#define DMA_CXCONFIG_SRCPERIPH_4 ( 0x10UL << DMA_CXCONFIG_SRCPERIPH_Pos ) +#define DMA_CXCONFIG_SRCPERIPH_5 ( 0x20UL << DMA_CXCONFIG_SRCPERIPH_Pos ) +#define DMA_CXCONFIG_SRCPERIPH_6 ( 0x40UL << DMA_CXCONFIG_SRCPERIPH_Pos ) +#define DMA_CXCONFIG_SRCPERIPH_7 ( 0x80UL << DMA_CXCONFIG_SRCPERIPH_Pos ) + +#define DMA_CXCONFIG_DESTPERIPH_Pos ( 16U ) +#define DMA_CXCONFIG_DESTPERIPH_Msk ( 0xffUL << DMA_CXCONFIG_DESTPERIPH_Pos ) +#define DMA_CXCONFIG_DESTPERIPH ( DMA_CXCONFIG_DESTPERIPH_Msk ) +#define DMA_CXCONFIG_DESTPERIPH_0 ( 0x1UL << DMA_CXCONFIG_DESTPERIPH_Pos ) +#define DMA_CXCONFIG_DESTPERIPH_1 ( 0x2UL << DMA_CXCONFIG_DESTPERIPH_Pos ) +#define DMA_CXCONFIG_DESTPERIPH_2 ( 0x4UL << DMA_CXCONFIG_DESTPERIPH_Pos ) +#define DMA_CXCONFIG_DESTPERIPH_3 ( 0x8UL << DMA_CXCONFIG_DESTPERIPH_Pos ) +#define DMA_CXCONFIG_DESTPERIPH_4 ( 0x10UL << DMA_CXCONFIG_DESTPERIPH_Pos ) +#define DMA_CXCONFIG_DESTPERIPH_5 ( 0x20UL << DMA_CXCONFIG_DESTPERIPH_Pos ) +#define DMA_CXCONFIG_DESTPERIPH_6 ( 0x40UL << DMA_CXCONFIG_DESTPERIPH_Pos ) +#define DMA_CXCONFIG_DESTPERIPH_7 ( 0x80UL << DMA_CXCONFIG_DESTPERIPH_Pos ) + +#define DMA_CXCONFIG_LOCK_Pos ( 11U ) +#define DMA_CXCONFIG_LOCK_Msk ( 0x1UL << DMA_CXCONFIG_LOCK_Pos ) +#define DMA_CXCONFIG_LOCK ( DMA_CXCONFIG_LOCK_Msk ) + +#define DMA_CXCONFIG_D_Pos ( 10U ) +#define DMA_CXCONFIG_D_Msk ( 0x1UL << DMA_CXCONFIG_D_Pos ) +#define DMA_CXCONFIG_D ( DMA_CXCONFIG_D_Msk ) + +#define DMA_CXCONFIG_S_Pos ( 9U ) +#define DMA_CXCONFIG_S_Msk ( 0x1UL << DMA_CXCONFIG_S_Pos ) +#define DMA_CXCONFIG_S ( DMA_CXCONFIG_S_Msk ) + +#define DMA_CXCONFIG_HALT_Pos ( 8U ) +#define DMA_CXCONFIG_HALT_Msk ( 0x1UL << DMA_CXCONFIG_HALT_Pos ) +#define DMA_CXCONFIG_HALT ( DMA_CXCONFIG_HALT_Msk ) + +#define DMA_CXCONFIG_ACTIVE_Pos ( 7U ) +#define DMA_CXCONFIG_ACTIVE_Msk ( 0x1UL << DMA_CXCONFIG_ACTIVE_Pos ) +#define DMA_CXCONFIG_ACTIVE ( DMA_CXCONFIG_ACTIVE_Msk ) + +#define DMA_CXCONFIG_IHFTC_Pos ( 6U ) +#define DMA_CXCONFIG_IHFTC_Msk ( 0x1UL << DMA_CXCONFIG_IHFTC_Pos ) +#define DMA_CXCONFIG_IHFTC ( DMA_CXCONFIG_IHFTC_Msk ) + +#define DMA_CXCONFIG_ITC_Pos ( 5U ) +#define DMA_CXCONFIG_ITC_Msk ( 0x1UL << DMA_CXCONFIG_ITC_Pos ) +#define DMA_CXCONFIG_ITC ( DMA_CXCONFIG_ITC_Msk ) + +#define DMA_CXCONFIG_IE_Pos ( 4U ) +#define DMA_CXCONFIG_IE_Msk ( 0x1UL << DMA_CXCONFIG_IE_Pos ) +#define DMA_CXCONFIG_IE ( DMA_CXCONFIG_IE_Msk ) + +#define DMA_CXCONFIG_FLOWCTRL_Pos ( 1U ) +#define DMA_CXCONFIG_FLOWCTRL_Msk ( 0x7UL << DMA_CXCONFIG_FLOWCTRL_Pos ) +#define DMA_CXCONFIG_FLOWCTRL ( DMA_CXCONFIG_FLOWCTRL_Msk ) +#define DMA_CXCONFIG_FLOWCTRL_0 ( 0x1UL << DMA_CXCONFIG_FLOWCTRL_Pos ) +#define DMA_CXCONFIG_FLOWCTRL_1 ( 0x2UL << DMA_CXCONFIG_FLOWCTRL_Pos ) +#define DMA_CXCONFIG_FLOWCTRL_2 ( 0x4UL << DMA_CXCONFIG_FLOWCTRL_Pos ) + +#define DMA_CXCONFIG_EN_Pos ( 0U ) +#define DMA_CXCONFIG_EN_Msk ( 0x1UL << DMA_CXCONFIG_EN_Pos ) +#define DMA_CXCONFIG_EN ( DMA_CXCONFIG_EN_Msk ) + + +/*************** Bits definition for USART_DR **********************/ + +#define USART_DR_OE_Pos ( 12U ) +#define USART_DR_OE_Msk ( 0x1UL << USART_DR_OE_Pos ) +#define USART_DR_OE ( USART_DR_OE_Msk ) + +#define USART_DR_BE_Pos ( 11U ) +#define USART_DR_BE_Msk ( 0x1UL << USART_DR_BE_Pos ) +#define USART_DR_BE ( USART_DR_BE_Msk ) + +#define USART_DR_PE_Pos ( 10U ) +#define USART_DR_PE_Msk ( 0x1UL << USART_DR_PE_Pos ) +#define USART_DR_PE ( USART_DR_PE_Msk ) + +#define USART_DR_FE_Pos ( 9U ) +#define USART_DR_FE_Msk ( 0x1UL << USART_DR_FE_Pos ) +#define USART_DR_FE ( USART_DR_FE_Msk ) + +#define USART_DR_DATA_Pos ( 0U ) +#define USART_DR_DATA_Msk ( 0x1ffUL << USART_DR_DATA_Pos ) +#define USART_DR_DATA ( USART_DR_DATA_Msk ) + + +/*************** Bits definition for USART_FR **********************/ + +#define USART_FR_BUSY_Pos ( 9U ) +#define USART_FR_BUSY_Msk ( 0x1UL << USART_FR_BUSY_Pos ) +#define USART_FR_BUSY ( USART_FR_BUSY_Msk ) + +#define USART_FR_CTS_Pos ( 8U ) +#define USART_FR_CTS_Msk ( 0x1UL << USART_FR_CTS_Pos ) +#define USART_FR_CTS ( USART_FR_CTS_Msk ) + +#define USART_FR_TXFE_Pos ( 7U ) +#define USART_FR_TXFE_Msk ( 0x1UL << USART_FR_TXFE_Pos ) +#define USART_FR_TXFE ( USART_FR_TXFE_Msk ) + +#define USART_FR_RXFF_Pos ( 6U ) +#define USART_FR_RXFF_Msk ( 0x1UL << USART_FR_RXFF_Pos ) +#define USART_FR_RXFF ( USART_FR_RXFF_Msk ) + +#define USART_FR_TXFF_Pos ( 5U ) +#define USART_FR_TXFF_Msk ( 0x1UL << USART_FR_TXFF_Pos ) +#define USART_FR_TXFF ( USART_FR_TXFF_Msk ) + +#define USART_FR_RXFE_Pos ( 4U ) +#define USART_FR_RXFE_Msk ( 0x1UL << USART_FR_RXFE_Pos ) +#define USART_FR_RXFE ( USART_FR_RXFE_Msk ) + +#define USART_FR_OE_Pos ( 3U ) +#define USART_FR_OE_Msk ( 0x1UL << USART_FR_OE_Pos ) +#define USART_FR_OE ( USART_FR_OE_Msk ) + +#define USART_FR_BE_Pos ( 2U ) +#define USART_FR_BE_Msk ( 0x1UL << USART_FR_BE_Pos ) +#define USART_FR_BE ( USART_FR_BE_Msk ) + +#define USART_FR_PE_Pos ( 1U ) +#define USART_FR_PE_Msk ( 0x1UL << USART_FR_PE_Pos ) +#define USART_FR_PE ( USART_FR_PE_Msk ) + +#define USART_FR_FE_Pos ( 0U ) +#define USART_FR_FE_Msk ( 0x1UL << USART_FR_FE_Pos ) +#define USART_FR_FE ( USART_FR_FE_Msk ) + + +/*************** Bits definition for USART_BRR **********************/ + +#define USART_BRR_IBAUD_Pos ( 6U ) +#define USART_BRR_IBAUD_Msk ( 0xffffUL << USART_BRR_IBAUD_Pos ) +#define USART_BRR_IBAUD ( USART_BRR_IBAUD_Msk ) + +#define USART_BRR_FBAUD_Pos ( 0U ) +#define USART_BRR_FBAUD_Msk ( 0x3fUL << USART_BRR_FBAUD_Pos ) +#define USART_BRR_FBAUD ( USART_BRR_FBAUD_Msk ) +#define USART_BRR_FBAUD_0 ( 0x1UL << USART_BRR_FBAUD_Pos ) +#define USART_BRR_FBAUD_1 ( 0x2UL << USART_BRR_FBAUD_Pos ) +#define USART_BRR_FBAUD_2 ( 0x4UL << USART_BRR_FBAUD_Pos ) +#define USART_BRR_FBAUD_3 ( 0x8UL << USART_BRR_FBAUD_Pos ) +#define USART_BRR_FBAUD_4 ( 0x10UL << USART_BRR_FBAUD_Pos ) +#define USART_BRR_FBAUD_5 ( 0x20UL << USART_BRR_FBAUD_Pos ) + + +/*************** Bits definition for USART_IE **********************/ + +#define USART_IE_TCI_Pos ( 15U ) +#define USART_IE_TCI_Msk ( 0x1UL << USART_IE_TCI_Pos ) +#define USART_IE_TCI ( USART_IE_TCI_Msk ) + +#define USART_IE_ABRI_Pos ( 14U ) +#define USART_IE_ABRI_Msk ( 0x1UL << USART_IE_ABRI_Pos ) +#define USART_IE_ABRI ( USART_IE_ABRI_Msk ) + +#define USART_IE_IDLEI_Pos ( 13U ) +#define USART_IE_IDLEI_Msk ( 0x1UL << USART_IE_IDLEI_Pos ) +#define USART_IE_IDLEI ( USART_IE_IDLEI_Msk ) + +#define USART_IE_BCNTI_Pos ( 12U ) +#define USART_IE_BCNTI_Msk ( 0x1UL << USART_IE_BCNTI_Pos ) +#define USART_IE_BCNTI ( USART_IE_BCNTI_Msk ) + +#define USART_IE_LBDI_Pos ( 11U ) +#define USART_IE_LBDI_Msk ( 0x1UL << USART_IE_LBDI_Pos ) +#define USART_IE_LBDI ( USART_IE_LBDI_Msk ) + +#define USART_IE_OEI_Pos ( 10U ) +#define USART_IE_OEI_Msk ( 0x1UL << USART_IE_OEI_Pos ) +#define USART_IE_OEI ( USART_IE_OEI_Msk ) + +#define USART_IE_BEI_Pos ( 9U ) +#define USART_IE_BEI_Msk ( 0x1UL << USART_IE_BEI_Pos ) +#define USART_IE_BEI ( USART_IE_BEI_Msk ) + +#define USART_IE_PEI_Pos ( 8U ) +#define USART_IE_PEI_Msk ( 0x1UL << USART_IE_PEI_Pos ) +#define USART_IE_PEI ( USART_IE_PEI_Msk ) + +#define USART_IE_FEI_Pos ( 7U ) +#define USART_IE_FEI_Msk ( 0x1UL << USART_IE_FEI_Pos ) +#define USART_IE_FEI ( USART_IE_FEI_Msk ) + +#define USART_IE_TXI_Pos ( 5U ) +#define USART_IE_TXI_Msk ( 0x1UL << USART_IE_TXI_Pos ) +#define USART_IE_TXI ( USART_IE_TXI_Msk ) + +#define USART_IE_RXI_Pos ( 4U ) +#define USART_IE_RXI_Msk ( 0x1UL << USART_IE_RXI_Pos ) +#define USART_IE_RXI ( USART_IE_RXI_Msk ) + + +/*************** Bits definition for USART_ISR **********************/ + +#define USART_ISR_TCI_Pos ( 15U ) +#define USART_ISR_TCI_Msk ( 0x1UL << USART_ISR_TCI_Pos ) +#define USART_ISR_TCI ( USART_ISR_TCI_Msk ) + +#define USART_ISR_ABRI_Pos ( 14U ) +#define USART_ISR_ABRI_Msk ( 0x1UL << USART_ISR_ABRI_Pos ) +#define USART_ISR_ABRI ( USART_ISR_ABRI_Msk ) + +#define USART_ISR_IDLEI_Pos ( 13U ) +#define USART_ISR_IDLEI_Msk ( 0x1UL << USART_ISR_IDLEI_Pos ) +#define USART_ISR_IDLEI ( USART_ISR_IDLEI_Msk ) + +#define USART_ISR_BCNTI_Pos ( 12U ) +#define USART_ISR_BCNTI_Msk ( 0x1UL << USART_ISR_BCNTI_Pos ) +#define USART_ISR_BCNTI ( USART_ISR_BCNTI_Msk ) + +#define USART_ISR_LBDI_Pos ( 11U ) +#define USART_ISR_LBDI_Msk ( 0x1UL << USART_ISR_LBDI_Pos ) +#define USART_ISR_LBDI ( USART_ISR_LBDI_Msk ) + +#define USART_ISR_OEI_Pos ( 10U ) +#define USART_ISR_OEI_Msk ( 0x1UL << USART_ISR_OEI_Pos ) +#define USART_ISR_OEI ( USART_ISR_OEI_Msk ) + +#define USART_ISR_BEI_Pos ( 9U ) +#define USART_ISR_BEI_Msk ( 0x1UL << USART_ISR_BEI_Pos ) +#define USART_ISR_BEI ( USART_ISR_BEI_Msk ) + +#define USART_ISR_PEI_Pos ( 8U ) +#define USART_ISR_PEI_Msk ( 0x1UL << USART_ISR_PEI_Pos ) +#define USART_ISR_PEI ( USART_ISR_PEI_Msk ) + +#define USART_ISR_FEI_Pos ( 7U ) +#define USART_ISR_FEI_Msk ( 0x1UL << USART_ISR_FEI_Pos ) +#define USART_ISR_FEI ( USART_ISR_FEI_Msk ) + +#define USART_ISR_TXI_Pos ( 5U ) +#define USART_ISR_TXI_Msk ( 0x1UL << USART_ISR_TXI_Pos ) +#define USART_ISR_TXI ( USART_ISR_TXI_Msk ) + +#define USART_ISR_RXI_Pos ( 4U ) +#define USART_ISR_RXI_Msk ( 0x1UL << USART_ISR_RXI_Pos ) +#define USART_ISR_RXI ( USART_ISR_RXI_Msk ) + + +/*************** Bits definition for USART_CR1 **********************/ + +#define USART_CR1_CTSEN_Pos ( 15U ) +#define USART_CR1_CTSEN_Msk ( 0x1UL << USART_CR1_CTSEN_Pos ) +#define USART_CR1_CTSEN ( USART_CR1_CTSEN_Msk ) + +#define USART_CR1_RTSEN_Pos ( 14U ) +#define USART_CR1_RTSEN_Msk ( 0x1UL << USART_CR1_RTSEN_Pos ) +#define USART_CR1_RTSEN ( USART_CR1_RTSEN_Msk ) + +#define USART_CR1_RTS_Pos ( 11U ) +#define USART_CR1_RTS_Msk ( 0x1UL << USART_CR1_RTS_Pos ) +#define USART_CR1_RTS ( USART_CR1_RTS_Msk ) + +#define USART_CR1_RXE_Pos ( 9U ) +#define USART_CR1_RXE_Msk ( 0x1UL << USART_CR1_RXE_Pos ) +#define USART_CR1_RXE ( USART_CR1_RXE_Msk ) + +#define USART_CR1_TXE_Pos ( 8U ) +#define USART_CR1_TXE_Msk ( 0x1UL << USART_CR1_TXE_Pos ) +#define USART_CR1_TXE ( USART_CR1_TXE_Msk ) + +#define USART_CR1_DMAONERR_Pos ( 5U ) +#define USART_CR1_DMAONERR_Msk ( 0x1UL << USART_CR1_DMAONERR_Pos ) +#define USART_CR1_DMAONERR ( USART_CR1_DMAONERR_Msk ) + +#define USART_CR1_TXDMAE_Pos ( 4U ) +#define USART_CR1_TXDMAE_Msk ( 0x1UL << USART_CR1_TXDMAE_Pos ) +#define USART_CR1_TXDMAE ( USART_CR1_TXDMAE_Msk ) + +#define USART_CR1_RXDMAE_Pos ( 3U ) +#define USART_CR1_RXDMAE_Msk ( 0x1UL << USART_CR1_RXDMAE_Pos ) +#define USART_CR1_RXDMAE ( USART_CR1_RXDMAE_Msk ) + +#define USART_CR1_SIRLP_Pos ( 2U ) +#define USART_CR1_SIRLP_Msk ( 0x1UL << USART_CR1_SIRLP_Pos ) +#define USART_CR1_SIRLP ( USART_CR1_SIRLP_Msk ) + +#define USART_CR1_SIREN_Pos ( 1U ) +#define USART_CR1_SIREN_Msk ( 0x1UL << USART_CR1_SIREN_Pos ) +#define USART_CR1_SIREN ( USART_CR1_SIREN_Msk ) + +#define USART_CR1_USARTEN_Pos ( 0U ) +#define USART_CR1_USARTEN_Msk ( 0x1UL << USART_CR1_USARTEN_Pos ) +#define USART_CR1_USARTEN ( USART_CR1_USARTEN_Msk ) + + +/*************** Bits definition for USART_CR2 **********************/ + +#define USART_CR2_ADDM7_Pos ( 18U ) +#define USART_CR2_ADDM7_Msk ( 0x1UL << USART_CR2_ADDM7_Pos ) +#define USART_CR2_ADDM7 ( USART_CR2_ADDM7_Msk ) + +#define USART_CR2_ADDR_Pos ( 11U ) +#define USART_CR2_ADDR_Msk ( 0x7fUL << USART_CR2_ADDR_Pos ) +#define USART_CR2_ADDR ( USART_CR2_ADDR_Msk ) +#define USART_CR2_ADDR_0 ( 0x1UL << USART_CR2_ADDR_Pos ) +#define USART_CR2_ADDR_1 ( 0x2UL << USART_CR2_ADDR_Pos ) +#define USART_CR2_ADDR_2 ( 0x4UL << USART_CR2_ADDR_Pos ) +#define USART_CR2_ADDR_3 ( 0x8UL << USART_CR2_ADDR_Pos ) +#define USART_CR2_ADDR_4 ( 0x10UL << USART_CR2_ADDR_Pos ) +#define USART_CR2_ADDR_5 ( 0x20UL << USART_CR2_ADDR_Pos ) +#define USART_CR2_ADDR_6 ( 0x40UL << USART_CR2_ADDR_Pos ) + +#define USART_CR2_CPOL_Pos ( 10U ) +#define USART_CR2_CPOL_Msk ( 0x1UL << USART_CR2_CPOL_Pos ) +#define USART_CR2_CPOL ( USART_CR2_CPOL_Msk ) + +#define USART_CR2_CPHA_Pos ( 9U ) +#define USART_CR2_CPHA_Msk ( 0x1UL << USART_CR2_CPHA_Pos ) +#define USART_CR2_CPHA ( USART_CR2_CPHA_Msk ) + +#define USART_CR2_LBCL_Pos ( 8U ) +#define USART_CR2_LBCL_Msk ( 0x1UL << USART_CR2_LBCL_Pos ) +#define USART_CR2_LBCL ( USART_CR2_LBCL_Msk ) + +#define USART_CR2_CLKEN_Pos ( 7U ) +#define USART_CR2_CLKEN_Msk ( 0x1UL << USART_CR2_CLKEN_Pos ) +#define USART_CR2_CLKEN ( USART_CR2_CLKEN_Msk ) + +#define USART_CR2_NACK_Pos ( 6U ) +#define USART_CR2_NACK_Msk ( 0x1UL << USART_CR2_NACK_Pos ) +#define USART_CR2_NACK ( USART_CR2_NACK_Msk ) + +#define USART_CR2_SCEN_Pos ( 5U ) +#define USART_CR2_SCEN_Msk ( 0x1UL << USART_CR2_SCEN_Pos ) +#define USART_CR2_SCEN ( USART_CR2_SCEN_Msk ) + +#define USART_CR2_ABREN_Pos ( 4U ) +#define USART_CR2_ABREN_Msk ( 0x1UL << USART_CR2_ABREN_Pos ) +#define USART_CR2_ABREN ( USART_CR2_ABREN_Msk ) + +#define USART_CR2_WAKE_Pos ( 3U ) +#define USART_CR2_WAKE_Msk ( 0x1UL << USART_CR2_WAKE_Pos ) +#define USART_CR2_WAKE ( USART_CR2_WAKE_Msk ) + +#define USART_CR2_RWU_Pos ( 2U ) +#define USART_CR2_RWU_Msk ( 0x1UL << USART_CR2_RWU_Pos ) +#define USART_CR2_RWU ( USART_CR2_RWU_Msk ) + +#define USART_CR2_HDSEL_Pos ( 0U ) +#define USART_CR2_HDSEL_Msk ( 0x1UL << USART_CR2_HDSEL_Pos ) +#define USART_CR2_HDSEL ( USART_CR2_HDSEL_Msk ) + + +/*************** Bits definition for USART_CR3 **********************/ + +#define USART_CR3_RXIFLSEL_Pos ( 13U ) +#define USART_CR3_RXIFLSEL_Msk ( 0x7UL << USART_CR3_RXIFLSEL_Pos ) +#define USART_CR3_RXIFLSEL ( USART_CR3_RXIFLSEL_Msk ) +#define USART_CR3_RXIFLSEL_0 ( 0x1UL << USART_CR3_RXIFLSEL_Pos ) +#define USART_CR3_RXIFLSEL_1 ( 0x2UL << USART_CR3_RXIFLSEL_Pos ) +#define USART_CR3_RXIFLSEL_2 ( 0x4UL << USART_CR3_RXIFLSEL_Pos ) + +#define USART_CR3_TXIFLSEL_Pos ( 10U ) +#define USART_CR3_TXIFLSEL_Msk ( 0x7UL << USART_CR3_TXIFLSEL_Pos ) +#define USART_CR3_TXIFLSEL ( USART_CR3_TXIFLSEL_Msk ) +#define USART_CR3_TXIFLSEL_0 ( 0x1UL << USART_CR3_TXIFLSEL_Pos ) +#define USART_CR3_TXIFLSEL_1 ( 0x2UL << USART_CR3_TXIFLSEL_Pos ) +#define USART_CR3_TXIFLSEL_2 ( 0x4UL << USART_CR3_TXIFLSEL_Pos ) + +#define USART_CR3_SPS_Pos ( 9U ) +#define USART_CR3_SPS_Msk ( 0x1UL << USART_CR3_SPS_Pos ) +#define USART_CR3_SPS ( USART_CR3_SPS_Msk ) + +#define USART_CR3_WLEN_Pos ( 6U ) +#define USART_CR3_WLEN_Msk ( 0x7UL << USART_CR3_WLEN_Pos ) +#define USART_CR3_WLEN ( USART_CR3_WLEN_Msk ) +#define USART_CR3_WLEN_0 ( 0x1UL << USART_CR3_WLEN_Pos ) +#define USART_CR3_WLEN_1 ( 0x2UL << USART_CR3_WLEN_Pos ) +#define USART_CR3_WLEN_2 ( 0x4UL << USART_CR3_WLEN_Pos ) + +#define USART_CR3_FEN_Pos ( 5U ) +#define USART_CR3_FEN_Msk ( 0x1UL << USART_CR3_FEN_Pos ) +#define USART_CR3_FEN ( USART_CR3_FEN_Msk ) + +#define USART_CR3_STP2_Pos ( 3U ) +#define USART_CR3_STP2_Msk ( 0x1UL << USART_CR3_STP2_Pos ) +#define USART_CR3_STP2 ( USART_CR3_STP2_Msk ) + +#define USART_CR3_EPS_Pos ( 2U ) +#define USART_CR3_EPS_Msk ( 0x1UL << USART_CR3_EPS_Pos ) +#define USART_CR3_EPS ( USART_CR3_EPS_Msk ) + +#define USART_CR3_PEN_Pos ( 1U ) +#define USART_CR3_PEN_Msk ( 0x1UL << USART_CR3_PEN_Pos ) +#define USART_CR3_PEN ( USART_CR3_PEN_Msk ) + +#define USART_CR3_BRK_Pos ( 0U ) +#define USART_CR3_BRK_Msk ( 0x1UL << USART_CR3_BRK_Pos ) +#define USART_CR3_BRK ( USART_CR3_BRK_Msk ) + + +/*************** Bits definition for USART_GTPR **********************/ + +#define USART_GTPR_GT_Pos ( 8U ) +#define USART_GTPR_GT_Msk ( 0xfUL << USART_GTPR_GT_Pos ) +#define USART_GTPR_GT ( USART_GTPR_GT_Msk ) +#define USART_GTPR_GT_0 ( 0x1UL << USART_GTPR_GT_Pos ) +#define USART_GTPR_GT_1 ( 0x2UL << USART_GTPR_GT_Pos ) +#define USART_GTPR_GT_2 ( 0x4UL << USART_GTPR_GT_Pos ) +#define USART_GTPR_GT_3 ( 0x8UL << USART_GTPR_GT_Pos ) + +#define USART_GTPR_PSC_Pos ( 0U ) +#define USART_GTPR_PSC_Msk ( 0xffUL << USART_GTPR_PSC_Pos ) +#define USART_GTPR_PSC ( USART_GTPR_PSC_Msk ) +#define USART_GTPR_PSC_0 ( 0x1UL << USART_GTPR_PSC_Pos ) +#define USART_GTPR_PSC_1 ( 0x2UL << USART_GTPR_PSC_Pos ) +#define USART_GTPR_PSC_2 ( 0x4UL << USART_GTPR_PSC_Pos ) +#define USART_GTPR_PSC_3 ( 0x8UL << USART_GTPR_PSC_Pos ) +#define USART_GTPR_PSC_4 ( 0x10UL << USART_GTPR_PSC_Pos ) +#define USART_GTPR_PSC_5 ( 0x20UL << USART_GTPR_PSC_Pos ) +#define USART_GTPR_PSC_6 ( 0x40UL << USART_GTPR_PSC_Pos ) +#define USART_GTPR_PSC_7 ( 0x80UL << USART_GTPR_PSC_Pos ) + + +/*************** Bits definition for USART_BCNT **********************/ + +#define USART_BCNT_DEM_Pos ( 27U ) +#define USART_BCNT_DEM_Msk ( 0x1UL << USART_BCNT_DEM_Pos ) +#define USART_BCNT_DEM ( USART_BCNT_DEM_Msk ) + +#define USART_BCNT_DEP_Pos ( 26U ) +#define USART_BCNT_DEP_Msk ( 0x1UL << USART_BCNT_DEP_Pos ) +#define USART_BCNT_DEP ( USART_BCNT_DEP_Msk ) + +#define USART_BCNT_AUTO_START_EN_Pos ( 25U ) +#define USART_BCNT_AUTO_START_EN_Msk ( 0x1UL << USART_BCNT_AUTO_START_EN_Pos ) +#define USART_BCNT_AUTO_START_EN ( USART_BCNT_AUTO_START_EN_Msk ) + +#define USART_BCNT_BCNTSTART_Pos ( 24U ) +#define USART_BCNT_BCNTSTART_Msk ( 0x1UL << USART_BCNT_BCNTSTART_Pos ) +#define USART_BCNT_BCNTSTART ( USART_BCNT_BCNTSTART_Msk ) + +#define USART_BCNT_BCNTVALUE_Pos ( 0U ) +#define USART_BCNT_BCNTVALUE_Msk ( 0xffffffUL << USART_BCNT_BCNTVALUE_Pos ) +#define USART_BCNT_BCNTVALUE ( USART_BCNT_BCNTVALUE_Msk ) + +#define USART_BCNT_DEAT_Pos ( 4U ) +#define USART_BCNT_DEAT_Msk ( 0xFUL << USART_BCNT_DEAT_Pos ) +#define USART_BCNT_DEAT ( USART_BCNT_DEAT_Msk ) + +#define USART_BCNT_DEDT_Pos ( 0U ) +#define USART_BCNT_DEDT_Msk ( 0xFUL << USART_BCNT_DEDT_Pos ) +#define USART_BCNT_DEDT ( USART_BCNT_DEDT_Msk ) + + +/*************** Bits definition for SPI_TX_RX_DAT **********************/ + +#define SPI_TX_RX_DAT_DAT_Pos ( 0U ) +#define SPI_TX_RX_DAT_DAT_Msk ( 0xffUL << SPI_TX_RX_DAT_DAT_Pos ) +#define SPI_TX_RX_DAT_DAT ( SPI_TX_RX_DAT_DAT_Msk ) +#define SPI_TX_RX_DAT_DAT_0 ( 0x1UL << SPI_TX_RX_DAT_DAT_Pos ) +#define SPI_TX_RX_DAT_DAT_1 ( 0x2UL << SPI_TX_RX_DAT_DAT_Pos ) +#define SPI_TX_RX_DAT_DAT_2 ( 0x4UL << SPI_TX_RX_DAT_DAT_Pos ) +#define SPI_TX_RX_DAT_DAT_3 ( 0x8UL << SPI_TX_RX_DAT_DAT_Pos ) +#define SPI_TX_RX_DAT_DAT_4 ( 0x10UL << SPI_TX_RX_DAT_DAT_Pos ) +#define SPI_TX_RX_DAT_DAT_5 ( 0x20UL << SPI_TX_RX_DAT_DAT_Pos ) +#define SPI_TX_RX_DAT_DAT_6 ( 0x40UL << SPI_TX_RX_DAT_DAT_Pos ) +#define SPI_TX_RX_DAT_DAT_7 ( 0x80UL << SPI_TX_RX_DAT_DAT_Pos ) + + +/*************** Bits definition for SPI_BAUD **********************/ + +#define SPI_BAUD_DIV2_Pos ( 8U ) +#define SPI_BAUD_DIV2_Msk ( 0xffUL << SPI_BAUD_DIV2_Pos ) +#define SPI_BAUD_DIV2 ( SPI_BAUD_DIV2_Msk ) +#define SPI_BAUD_DIV2_0 ( 0x1UL << SPI_BAUD_DIV2_Pos ) +#define SPI_BAUD_DIV2_1 ( 0x2UL << SPI_BAUD_DIV2_Pos ) +#define SPI_BAUD_DIV2_2 ( 0x4UL << SPI_BAUD_DIV2_Pos ) +#define SPI_BAUD_DIV2_3 ( 0x8UL << SPI_BAUD_DIV2_Pos ) +#define SPI_BAUD_DIV2_4 ( 0x10UL << SPI_BAUD_DIV2_Pos ) +#define SPI_BAUD_DIV2_5 ( 0x20UL << SPI_BAUD_DIV2_Pos ) +#define SPI_BAUD_DIV2_6 ( 0x40UL << SPI_BAUD_DIV2_Pos ) +#define SPI_BAUD_DIV2_7 ( 0x80UL << SPI_BAUD_DIV2_Pos ) + +#define SPI_BAUD_DIV1_Pos ( 0U ) +#define SPI_BAUD_DIV1_Msk ( 0xffUL << SPI_BAUD_DIV1_Pos ) +#define SPI_BAUD_DIV1 ( SPI_BAUD_DIV1_Msk ) +#define SPI_BAUD_DIV1_0 ( 0x1UL << SPI_BAUD_DIV1_Pos ) +#define SPI_BAUD_DIV1_1 ( 0x2UL << SPI_BAUD_DIV1_Pos ) +#define SPI_BAUD_DIV1_2 ( 0x4UL << SPI_BAUD_DIV1_Pos ) +#define SPI_BAUD_DIV1_3 ( 0x8UL << SPI_BAUD_DIV1_Pos ) +#define SPI_BAUD_DIV1_4 ( 0x10UL << SPI_BAUD_DIV1_Pos ) +#define SPI_BAUD_DIV1_5 ( 0x20UL << SPI_BAUD_DIV1_Pos ) +#define SPI_BAUD_DIV1_6 ( 0x40UL << SPI_BAUD_DIV1_Pos ) +#define SPI_BAUD_DIV1_7 ( 0x80UL << SPI_BAUD_DIV1_Pos ) + + +/*************** Bits definition for SPI_CTL **********************/ + +#define SPI_CTL_SWCS_EN_Pos ( 21U ) +#define SPI_CTL_SWCS_EN_Msk ( 0x1UL << SPI_CTL_SWCS_EN_Pos ) +#define SPI_CTL_SWCS_EN ( SPI_CTL_SWCS_EN_Msk ) + +#define SPI_CTL_SWCS_Pos ( 20U ) +#define SPI_CTL_SWCS_Msk ( 0x1UL << SPI_CTL_SWCS_Pos ) +#define SPI_CTL_SWCS ( SPI_CTL_SWCS_Msk ) + +#define SPI_CTL_CS_TIME_Pos ( 11U ) +#define SPI_CTL_CS_TIME_Msk ( 0xffUL << SPI_CTL_CS_TIME_Pos ) +#define SPI_CTL_CS_TIME ( SPI_CTL_CS_TIME_Msk ) +#define SPI_CTL_CS_TIME_0 ( 0x1UL << SPI_CTL_CS_TIME_Pos ) +#define SPI_CTL_CS_TIME_1 ( 0x2UL << SPI_CTL_CS_TIME_Pos ) +#define SPI_CTL_CS_TIME_2 ( 0x4UL << SPI_CTL_CS_TIME_Pos ) +#define SPI_CTL_CS_TIME_3 ( 0x8UL << SPI_CTL_CS_TIME_Pos ) +#define SPI_CTL_CS_TIME_4 ( 0x10UL << SPI_CTL_CS_TIME_Pos ) +#define SPI_CTL_CS_TIME_5 ( 0x20UL << SPI_CTL_CS_TIME_Pos ) +#define SPI_CTL_CS_TIME_6 ( 0x40UL << SPI_CTL_CS_TIME_Pos ) +#define SPI_CTL_CS_TIME_7 ( 0x80UL << SPI_CTL_CS_TIME_Pos ) + +#define SPI_CTL_CS_FILTER_Pos ( 10U ) +#define SPI_CTL_CS_FILTER_Msk ( 0x1UL << SPI_CTL_CS_FILTER_Pos ) +#define SPI_CTL_CS_FILTER ( SPI_CTL_CS_FILTER_Msk ) + +#define SPI_CTL_CS_RST_Pos ( 9U ) +#define SPI_CTL_CS_RST_Msk ( 0x1UL << SPI_CTL_CS_RST_Pos ) +#define SPI_CTL_CS_RST ( SPI_CTL_CS_RST_Msk ) + +#define SPI_CTL_SLAVE_EN_Pos ( 8U ) +#define SPI_CTL_SLAVE_EN_Msk ( 0x1UL << SPI_CTL_SLAVE_EN_Pos ) +#define SPI_CTL_SLAVE_EN ( SPI_CTL_SLAVE_EN_Msk ) + +#define SPI_CTL_IO_MODE_Pos ( 7U ) +#define SPI_CTL_IO_MODE_Msk ( 0x1UL << SPI_CTL_IO_MODE_Pos ) +#define SPI_CTL_IO_MODE ( SPI_CTL_IO_MODE_Msk ) + +#define SPI_CTL_X_MODE_Pos ( 5U ) +#define SPI_CTL_X_MODE_Msk ( 0x3UL << SPI_CTL_X_MODE_Pos ) +#define SPI_CTL_X_MODE ( SPI_CTL_X_MODE_Msk ) +#define SPI_CTL_X_MODE_0 ( 0x1UL << SPI_CTL_X_MODE_Pos ) +#define SPI_CTL_X_MODE_1 ( 0x2UL << SPI_CTL_X_MODE_Pos ) + +#define SPI_CTL_LSB_FIRST_Pos ( 4U ) +#define SPI_CTL_LSB_FIRST_Msk ( 0x1UL << SPI_CTL_LSB_FIRST_Pos ) +#define SPI_CTL_LSB_FIRST ( SPI_CTL_LSB_FIRST_Msk ) + +#define SPI_CTL_CPOL_Pos ( 3U ) +#define SPI_CTL_CPOL_Msk ( 0x1UL << SPI_CTL_CPOL_Pos ) +#define SPI_CTL_CPOL ( SPI_CTL_CPOL_Msk ) + +#define SPI_CTL_CPHA_Pos ( 2U ) +#define SPI_CTL_CPHA_Msk ( 0x1UL << SPI_CTL_CPHA_Pos ) +#define SPI_CTL_CPHA ( SPI_CTL_CPHA_Msk ) + +#define SPI_CTL_SFILTER_Pos ( 1U ) +#define SPI_CTL_SFILTER_Msk ( 0x1UL << SPI_CTL_SFILTER_Pos ) +#define SPI_CTL_SFILTER ( SPI_CTL_SFILTER_Msk ) + +#define SPI_CTL_MST_MODE_Pos ( 0U ) +#define SPI_CTL_MST_MODE_Msk ( 0x1UL << SPI_CTL_MST_MODE_Pos ) +#define SPI_CTL_MST_MODE ( SPI_CTL_MST_MODE_Msk ) + + +/*************** Bits definition for SPI_TX_CTL **********************/ + +#define SPI_TX_CTL_DUMMY_Pos ( 8U ) +#define SPI_TX_CTL_DUMMY_Msk ( 0xffUL << SPI_TX_CTL_DUMMY_Pos ) +#define SPI_TX_CTL_DUMMY ( SPI_TX_CTL_DUMMY_Msk ) +#define SPI_TX_CTL_DUMMY_0 ( 0x1UL << SPI_TX_CTL_DUMMY_Pos ) +#define SPI_TX_CTL_DUMMY_1 ( 0x2UL << SPI_TX_CTL_DUMMY_Pos ) +#define SPI_TX_CTL_DUMMY_2 ( 0x4UL << SPI_TX_CTL_DUMMY_Pos ) +#define SPI_TX_CTL_DUMMY_3 ( 0x8UL << SPI_TX_CTL_DUMMY_Pos ) +#define SPI_TX_CTL_DUMMY_4 ( 0x10UL << SPI_TX_CTL_DUMMY_Pos ) +#define SPI_TX_CTL_DUMMY_5 ( 0x20UL << SPI_TX_CTL_DUMMY_Pos ) +#define SPI_TX_CTL_DUMMY_6 ( 0x40UL << SPI_TX_CTL_DUMMY_Pos ) +#define SPI_TX_CTL_DUMMY_7 ( 0x80UL << SPI_TX_CTL_DUMMY_Pos ) + +#define SPI_TX_CTL_DMA_LEVEL_Pos ( 4U ) +#define SPI_TX_CTL_DMA_LEVEL_Msk ( 0xfUL << SPI_TX_CTL_DMA_LEVEL_Pos ) +#define SPI_TX_CTL_DMA_LEVEL ( SPI_TX_CTL_DMA_LEVEL_Msk ) +#define SPI_TX_CTL_DMA_LEVEL_0 ( 0x1UL << SPI_TX_CTL_DMA_LEVEL_Pos ) +#define SPI_TX_CTL_DMA_LEVEL_1 ( 0x2UL << SPI_TX_CTL_DMA_LEVEL_Pos ) +#define SPI_TX_CTL_DMA_LEVEL_2 ( 0x4UL << SPI_TX_CTL_DMA_LEVEL_Pos ) +#define SPI_TX_CTL_DMA_LEVEL_3 ( 0x8UL << SPI_TX_CTL_DMA_LEVEL_Pos ) + +#define SPI_TX_CTL_DMA_REQ_EN_Pos ( 3U ) +#define SPI_TX_CTL_DMA_REQ_EN_Msk ( 0x1UL << SPI_TX_CTL_DMA_REQ_EN_Pos ) +#define SPI_TX_CTL_DMA_REQ_EN ( SPI_TX_CTL_DMA_REQ_EN_Msk ) + +#define SPI_TX_CTL_MODE_Pos ( 2U ) +#define SPI_TX_CTL_MODE_Msk ( 0x1UL << SPI_TX_CTL_MODE_Pos ) +#define SPI_TX_CTL_MODE ( SPI_TX_CTL_MODE_Msk ) + +#define SPI_TX_CTL_FIFO_RESET_Pos ( 1U ) +#define SPI_TX_CTL_FIFO_RESET_Msk ( 0x1UL << SPI_TX_CTL_FIFO_RESET_Pos ) +#define SPI_TX_CTL_FIFO_RESET ( SPI_TX_CTL_FIFO_RESET_Msk ) + +#define SPI_TX_CTL_EN_Pos ( 0U ) +#define SPI_TX_CTL_EN_Msk ( 0x1UL << SPI_TX_CTL_EN_Pos ) +#define SPI_TX_CTL_EN ( SPI_TX_CTL_EN_Msk ) + + +/*************** Bits definition for SPI_RX_CTL **********************/ + +#define SPI_RX_CTL_SSHIFT_Pos ( 8U ) +#define SPI_RX_CTL_SSHIFT_Msk ( 0x3UL << SPI_RX_CTL_SSHIFT_Pos ) +#define SPI_RX_CTL_SSHIFT ( SPI_RX_CTL_SSHIFT_Msk ) +#define SPI_RX_CTL_SSHIFT_0 ( 0x1UL << SPI_RX_CTL_SSHIFT_Pos ) +#define SPI_RX_CTL_SSHIFT_1 ( 0x2UL << SPI_RX_CTL_SSHIFT_Pos ) + +#define SPI_RX_CTL_DMA_LEVEL_Pos ( 4U ) +#define SPI_RX_CTL_DMA_LEVEL_Msk ( 0xfUL << SPI_RX_CTL_DMA_LEVEL_Pos ) +#define SPI_RX_CTL_DMA_LEVEL ( SPI_RX_CTL_DMA_LEVEL_Msk ) +#define SPI_RX_CTL_DMA_LEVEL_0 ( 0x1UL << SPI_RX_CTL_DMA_LEVEL_Pos ) +#define SPI_RX_CTL_DMA_LEVEL_1 ( 0x2UL << SPI_RX_CTL_DMA_LEVEL_Pos ) +#define SPI_RX_CTL_DMA_LEVEL_2 ( 0x4UL << SPI_RX_CTL_DMA_LEVEL_Pos ) +#define SPI_RX_CTL_DMA_LEVEL_3 ( 0x8UL << SPI_RX_CTL_DMA_LEVEL_Pos ) + +#define SPI_RX_CTL_DMA_REQ_EN_Pos ( 3U ) +#define SPI_RX_CTL_DMA_REQ_EN_Msk ( 0x1UL << SPI_RX_CTL_DMA_REQ_EN_Pos ) +#define SPI_RX_CTL_DMA_REQ_EN ( SPI_RX_CTL_DMA_REQ_EN_Msk ) + +#define SPI_RX_CTL_FIFO_RESET_Pos ( 1U ) +#define SPI_RX_CTL_FIFO_RESET_Msk ( 0x1UL << SPI_RX_CTL_FIFO_RESET_Pos ) +#define SPI_RX_CTL_FIFO_RESET ( SPI_RX_CTL_FIFO_RESET_Msk ) + +#define SPI_RX_CTL_EN_Pos ( 0U ) +#define SPI_RX_CTL_EN_Msk ( 0x1UL << SPI_RX_CTL_EN_Pos ) +#define SPI_RX_CTL_EN ( SPI_RX_CTL_EN_Msk ) + + +/*************** Bits definition for SPI_IE **********************/ + +#define SPI_IE_RX_BATCH_DONE_EN_Pos ( 15U ) +#define SPI_IE_RX_BATCH_DONE_EN_Msk ( 0x1UL << SPI_IE_RX_BATCH_DONE_EN_Pos ) +#define SPI_IE_RX_BATCH_DONE_EN ( SPI_IE_RX_BATCH_DONE_EN_Msk ) + +#define SPI_IE_TX_BATCH_DONE_EN_Pos ( 14U ) +#define SPI_IE_TX_BATCH_DONE_EN_Msk ( 0x1UL << SPI_IE_TX_BATCH_DONE_EN_Pos ) +#define SPI_IE_TX_BATCH_DONE_EN ( SPI_IE_TX_BATCH_DONE_EN_Msk ) + +#define SPI_IE_RX_FIFO_FULL_OVERFLOW_EN_Pos ( 13U ) +#define SPI_IE_RX_FIFO_FULL_OVERFLOW_EN_Msk ( 0x1UL << SPI_IE_RX_FIFO_FULL_OVERFLOW_EN_Pos ) +#define SPI_IE_RX_FIFO_FULL_OVERFLOW_EN ( SPI_IE_RX_FIFO_FULL_OVERFLOW_EN_Msk ) + +#define SPI_IE_RX_FIFO_EMPTY_OVERFLOW_EN_Pos ( 12U ) +#define SPI_IE_RX_FIFO_EMPTY_OVERFLOW_EN_Msk ( 0x1UL << SPI_IE_RX_FIFO_EMPTY_OVERFLOW_EN_Pos ) +#define SPI_IE_RX_FIFO_EMPTY_OVERFLOW_EN ( SPI_IE_RX_FIFO_EMPTY_OVERFLOW_EN_Msk ) + +#define SPI_IE_RX_FIFO_NOT_EMPTY_EN_Pos ( 11U ) +#define SPI_IE_RX_FIFO_NOT_EMPTY_EN_Msk ( 0x1UL << SPI_IE_RX_FIFO_NOT_EMPTY_EN_Pos ) +#define SPI_IE_RX_FIFO_NOT_EMPTY_EN ( SPI_IE_RX_FIFO_NOT_EMPTY_EN_Msk ) + +#define SPI_IE_CS_POS_EN_Pos ( 10U ) +#define SPI_IE_CS_POS_EN_Msk ( 0x1UL << SPI_IE_CS_POS_EN_Pos ) +#define SPI_IE_CS_POS_EN ( SPI_IE_CS_POS_EN_Msk ) + +#define SPI_IE_RX_FIFO_HALF_FULL_EN_Pos ( 9U ) +#define SPI_IE_RX_FIFO_HALF_FULL_EN_Msk ( 0x1UL << SPI_IE_RX_FIFO_HALF_FULL_EN_Pos ) +#define SPI_IE_RX_FIFO_HALF_FULL_EN ( SPI_IE_RX_FIFO_HALF_FULL_EN_Msk ) + +#define SPI_IE_RX_FIFO_HALF_EMPTY_EN_Pos ( 8U ) +#define SPI_IE_RX_FIFO_HALF_EMPTY_EN_Msk ( 0x1UL << SPI_IE_RX_FIFO_HALF_EMPTY_EN_Pos ) +#define SPI_IE_RX_FIFO_HALF_EMPTY_EN ( SPI_IE_RX_FIFO_HALF_EMPTY_EN_Msk ) + +#define SPI_IE_TX_FIFO_HALF_FULL_EN_Pos ( 7U ) +#define SPI_IE_TX_FIFO_HALF_FULL_EN_Msk ( 0x1UL << SPI_IE_TX_FIFO_HALF_FULL_EN_Pos ) +#define SPI_IE_TX_FIFO_HALF_FULL_EN ( SPI_IE_TX_FIFO_HALF_FULL_EN_Msk ) + +#define SPI_IE_TX_FIFO_HALF_EMPTY_EN_Pos ( 6U ) +#define SPI_IE_TX_FIFO_HALF_EMPTY_EN_Msk ( 0x1UL << SPI_IE_TX_FIFO_HALF_EMPTY_EN_Pos ) +#define SPI_IE_TX_FIFO_HALF_EMPTY_EN ( SPI_IE_TX_FIFO_HALF_EMPTY_EN_Msk ) + +#define SPI_IE_RX_FIFO_FULL_EN_Pos ( 5U ) +#define SPI_IE_RX_FIFO_FULL_EN_Msk ( 0x1UL << SPI_IE_RX_FIFO_FULL_EN_Pos ) +#define SPI_IE_RX_FIFO_FULL_EN ( SPI_IE_RX_FIFO_FULL_EN_Msk ) + +#define SPI_IE_RX_FIFO_EMPTY_EN_Pos ( 4U ) +#define SPI_IE_RX_FIFO_EMPTY_EN_Msk ( 0x1UL << SPI_IE_RX_FIFO_EMPTY_EN_Pos ) +#define SPI_IE_RX_FIFO_EMPTY_EN ( SPI_IE_RX_FIFO_EMPTY_EN_Msk ) + +#define SPI_IE_TX_FIFO_FULL_EN_Pos ( 3U ) +#define SPI_IE_TX_FIFO_FULL_EN_Msk ( 0x1UL << SPI_IE_TX_FIFO_FULL_EN_Pos ) +#define SPI_IE_TX_FIFO_FULL_EN ( SPI_IE_TX_FIFO_FULL_EN_Msk ) + +#define SPI_IE_TX_FIFO_EMPTY_EN_Pos ( 2U ) +#define SPI_IE_TX_FIFO_EMPTY_EN_Msk ( 0x1UL << SPI_IE_TX_FIFO_EMPTY_EN_Pos ) +#define SPI_IE_TX_FIFO_EMPTY_EN ( SPI_IE_TX_FIFO_EMPTY_EN_Msk ) + +#define SPI_IE_BATCH_DONE_EN_Pos ( 1U ) +#define SPI_IE_BATCH_DONE_EN_Msk ( 0x1UL << SPI_IE_BATCH_DONE_EN_Pos ) +#define SPI_IE_BATCH_DONE_EN ( SPI_IE_BATCH_DONE_EN_Msk ) + + +/*************** Bits definition for SPI_STATUS **********************/ + +#define SPI_STATUS_RX_BATCH_DONE_Pos ( 15U ) +#define SPI_STATUS_RX_BATCH_DONE_Msk ( 0x1UL << SPI_STATUS_RX_BATCH_DONE_Pos ) +#define SPI_STATUS_RX_BATCH_DONE ( SPI_STATUS_RX_BATCH_DONE_Msk ) + +#define SPI_STATUS_TX_BATCH_DONE_Pos ( 14U ) +#define SPI_STATUS_TX_BATCH_DONE_Msk ( 0x1UL << SPI_STATUS_TX_BATCH_DONE_Pos ) +#define SPI_STATUS_TX_BATCH_DONE ( SPI_STATUS_TX_BATCH_DONE_Msk ) + +#define SPI_STATUS_RX_FIFO_FULL_OVERFLOW_Pos ( 13U ) +#define SPI_STATUS_RX_FIFO_FULL_OVERFLOW_Msk ( 0x1UL << SPI_STATUS_RX_FIFO_FULL_OVERFLOW_Pos ) +#define SPI_STATUS_RX_FIFO_FULL_OVERFLOW ( SPI_STATUS_RX_FIFO_FULL_OVERFLOW_Msk ) + +#define SPI_STATUS_RX_FIFO_EMPTY_OVERFLOW_Pos ( 12U ) +#define SPI_STATUS_RX_FIFO_EMPTY_OVERFLOW_Msk ( 0x1UL << SPI_STATUS_RX_FIFO_EMPTY_OVERFLOW_Pos ) +#define SPI_STATUS_RX_FIFO_EMPTY_OVERFLOW ( SPI_STATUS_RX_FIFO_EMPTY_OVERFLOW_Msk ) + +#define SPI_STATUS_RX_FIFO_NOT_EMPTY_Pos ( 11U ) +#define SPI_STATUS_RX_FIFO_NOT_EMPTY_Msk ( 0x1UL << SPI_STATUS_RX_FIFO_NOT_EMPTY_Pos ) +#define SPI_STATUS_RX_FIFO_NOT_EMPTY ( SPI_STATUS_RX_FIFO_NOT_EMPTY_Msk ) + +#define SPI_STATUS_CS_POS_FLG_Pos ( 10U ) +#define SPI_STATUS_CS_POS_FLG_Msk ( 0x1UL << SPI_STATUS_CS_POS_FLG_Pos ) +#define SPI_STATUS_CS_POS_FLG ( SPI_STATUS_CS_POS_FLG_Msk ) + +#define SPI_STATUS_RX_FIFO_HALF_FULL_Pos ( 9U ) +#define SPI_STATUS_RX_FIFO_HALF_FULL_Msk ( 0x1UL << SPI_STATUS_RX_FIFO_HALF_FULL_Pos ) +#define SPI_STATUS_RX_FIFO_HALF_FULL ( SPI_STATUS_RX_FIFO_HALF_FULL_Msk ) + +#define SPI_STATUS_RX_FIFO_HALF_EMPTY_Pos ( 8U ) +#define SPI_STATUS_RX_FIFO_HALF_EMPTY_Msk ( 0x1UL << SPI_STATUS_RX_FIFO_HALF_EMPTY_Pos ) +#define SPI_STATUS_RX_FIFO_HALF_EMPTY ( SPI_STATUS_RX_FIFO_HALF_EMPTY_Msk ) + +#define SPI_STATUS_TX_FIFO_HALF_FULL_Pos ( 7U ) +#define SPI_STATUS_TX_FIFO_HALF_FULL_Msk ( 0x1UL << SPI_STATUS_TX_FIFO_HALF_FULL_Pos ) +#define SPI_STATUS_TX_FIFO_HALF_FULL ( SPI_STATUS_TX_FIFO_HALF_FULL_Msk ) + +#define SPI_STATUS_TX_FIFO_HALF_EMPTY_Pos ( 6U ) +#define SPI_STATUS_TX_FIFO_HALF_EMPTY_Msk ( 0x1UL << SPI_STATUS_TX_FIFO_HALF_EMPTY_Pos ) +#define SPI_STATUS_TX_FIFO_HALF_EMPTY ( SPI_STATUS_TX_FIFO_HALF_EMPTY_Msk ) + +#define SPI_STATUS_RX_FIFO_FULL_Pos ( 5U ) +#define SPI_STATUS_RX_FIFO_FULL_Msk ( 0x1UL << SPI_STATUS_RX_FIFO_FULL_Pos ) +#define SPI_STATUS_RX_FIFO_FULL ( SPI_STATUS_RX_FIFO_FULL_Msk ) + +#define SPI_STATUS_RX_FIFO_EMPTY_Pos ( 4U ) +#define SPI_STATUS_RX_FIFO_EMPTY_Msk ( 0x1UL << SPI_STATUS_RX_FIFO_EMPTY_Pos ) +#define SPI_STATUS_RX_FIFO_EMPTY ( SPI_STATUS_RX_FIFO_EMPTY_Msk ) + +#define SPI_STATUS_TX_FIFO_FULL_Pos ( 3U ) +#define SPI_STATUS_TX_FIFO_FULL_Msk ( 0x1UL << SPI_STATUS_TX_FIFO_FULL_Pos ) +#define SPI_STATUS_TX_FIFO_FULL ( SPI_STATUS_TX_FIFO_FULL_Msk ) + +#define SPI_STATUS_TX_FIFO_EMPTY_Pos ( 2U ) +#define SPI_STATUS_TX_FIFO_EMPTY_Msk ( 0x1UL << SPI_STATUS_TX_FIFO_EMPTY_Pos ) +#define SPI_STATUS_TX_FIFO_EMPTY ( SPI_STATUS_TX_FIFO_EMPTY_Msk ) + +#define SPI_STATUS_BATCH_DONE_Pos ( 1U ) +#define SPI_STATUS_BATCH_DONE_Msk ( 0x1UL << SPI_STATUS_BATCH_DONE_Pos ) +#define SPI_STATUS_BATCH_DONE ( SPI_STATUS_BATCH_DONE_Msk ) + +#define SPI_STATUS_TX_BUSY_Pos ( 0U ) +#define SPI_STATUS_TX_BUSY_Msk ( 0x1UL << SPI_STATUS_TX_BUSY_Pos ) +#define SPI_STATUS_TX_BUSY ( SPI_STATUS_TX_BUSY_Msk ) + + +/*************** Bits definition for SPI_TXDelay **********************/ + +#define SPI_TXDELAY_SPI_TDY_Pos ( 0U ) +#define SPI_TXDELAY_SPI_TDY_Msk ( 0xffffffffUL << SPI_TXDELAY_SPI_TDY_Pos ) +#define SPI_TXDELAY_SPI_TDY ( SPI_TXDELAY_SPI_TDY_Msk ) + + +/*************** Bits definition for SPI_BATCH **********************/ + +#define SPI_BATCH_BATCH_NUMBER_Pos ( 0U ) +#define SPI_BATCH_BATCH_NUMBER_Msk ( 0xffffffffUL << SPI_BATCH_BATCH_NUMBER_Pos ) +#define SPI_BATCH_BATCH_NUMBER ( SPI_BATCH_BATCH_NUMBER_Msk ) + + +/*************** Bits definition for SPI_CS **********************/ + +#define SPI_CS_Pos ( 0U ) +#define SPI_CS_Msk ( 0x1FUL << SPI_CS_Pos ) +#define SPI_CS ( SPI_CS_Msk ) +#define SPI_CS_CS0 ( 0x1UL << SPI_CS_Pos ) +#define SPI_CS_CS1 ( 0x2UL << SPI_CS_Pos ) +#define SPI_CS_CS2 ( 0x4UL << SPI_CS_Pos ) +#define SPI_CS_CS3 ( 0x8UL << SPI_CS_Pos ) +#define SPI_CS_CS4 ( 0x10UL << SPI_CS_Pos ) + +#define SPI_CSMAP_EN_Pos (8) +#define SPI_CSMAP_EN_Msk (0x1UL << SPI_CSMAP_EN_Pos) +#define SPI_CSMAP_EN (SPI_CSMAP_EN_Msk) + +/*************** Bits definition for SPI_OUT_EN **********************/ + +#define SPI_OUT_EN_SPI_HOLD_EN_Pos ( 3U ) +#define SPI_OUT_EN_SPI_HOLD_EN_Msk ( 0x1UL << SPI_OUT_EN_SPI_HOLD_EN_Pos ) +#define SPI_OUT_EN_SPI_HOLD_EN ( SPI_OUT_EN_SPI_HOLD_EN_Msk ) + +#define SPI_OUT_EN_SPI_WP_EN_Pos ( 2U ) +#define SPI_OUT_EN_SPI_WP_EN_Msk ( 0x1UL << SPI_OUT_EN_SPI_WP_EN_Pos ) +#define SPI_OUT_EN_SPI_WP_EN ( SPI_OUT_EN_SPI_WP_EN_Msk ) + +#define SPI_OUT_EN_SPI_MISO_EN_Pos ( 1U ) +#define SPI_OUT_EN_SPI_MISO_EN_Msk ( 0x1UL << SPI_OUT_EN_SPI_MISO_EN_Pos ) +#define SPI_OUT_EN_SPI_MISO_EN ( SPI_OUT_EN_SPI_MISO_EN_Msk ) + + +/*************** Bits definition for SPI_MEMO_ACC **********************/ + +#define SPI_MEMO_ACC_DATA_MODE_Pos ( 25U ) +#define SPI_MEMO_ACC_DATA_MODE_Msk ( 0x3UL << SPI_MEMO_ACC_DATA_MODE_Pos ) +#define SPI_MEMO_ACC_DATA_MODE ( SPI_MEMO_ACC_DATA_MODE_Msk ) +#define SPI_MEMO_ACC_DATA_MODE_0 ( 0x1UL << SPI_MEMO_ACC_DATA_MODE_Pos ) +#define SPI_MEMO_ACC_DATA_MODE_1 ( 0x2UL << SPI_MEMO_ACC_DATA_MODE_Pos ) + +#define SPI_MEMO_ACC_ALTER_BYTE_MODE_Pos ( 23U ) +#define SPI_MEMO_ACC_ALTER_BYTE_MODE_Msk ( 0x3UL << SPI_MEMO_ACC_ALTER_BYTE_MODE_Pos ) +#define SPI_MEMO_ACC_ALTER_BYTE_MODE ( SPI_MEMO_ACC_ALTER_BYTE_MODE_Msk ) +#define SPI_MEMO_ACC_ALTER_BYTE_MODE_0 ( 0x1UL << SPI_MEMO_ACC_ALTER_BYTE_MODE_Pos ) +#define SPI_MEMO_ACC_ALTER_BYTE_MODE_1 ( 0x2UL << SPI_MEMO_ACC_ALTER_BYTE_MODE_Pos ) + +#define SPI_MEMO_ACC_ADDR_MODE_Pos ( 21U ) +#define SPI_MEMO_ACC_ADDR_MODE_Msk ( 0x3UL << SPI_MEMO_ACC_ADDR_MODE_Pos ) +#define SPI_MEMO_ACC_ADDR_MODE ( SPI_MEMO_ACC_ADDR_MODE_Msk ) +#define SPI_MEMO_ACC_ADDR_MODE_0 ( 0x1UL << SPI_MEMO_ACC_ADDR_MODE_Pos ) +#define SPI_MEMO_ACC_ADDR_MODE_1 ( 0x2UL << SPI_MEMO_ACC_ADDR_MODE_Pos ) + +#define SPI_MEMO_ACC_INSTR_MODE_Pos ( 19U ) +#define SPI_MEMO_ACC_INSTR_MODE_Msk ( 0x3UL << SPI_MEMO_ACC_INSTR_MODE_Pos ) +#define SPI_MEMO_ACC_INSTR_MODE ( SPI_MEMO_ACC_INSTR_MODE_Msk ) +#define SPI_MEMO_ACC_INSTR_MODE_0 ( 0x1UL << SPI_MEMO_ACC_INSTR_MODE_Pos ) +#define SPI_MEMO_ACC_INSTR_MODE_1 ( 0x2UL << SPI_MEMO_ACC_INSTR_MODE_Pos ) + +#define SPI_MEMO_ACC_ADDR_WIDTH_Pos ( 17U ) +#define SPI_MEMO_ACC_ADDR_WIDTH_Msk ( 0x3UL << SPI_MEMO_ACC_ADDR_WIDTH_Pos ) +#define SPI_MEMO_ACC_ADDR_WIDTH ( SPI_MEMO_ACC_ADDR_WIDTH_Msk ) +#define SPI_MEMO_ACC_ADDR_WIDTH_0 ( 0x1UL << SPI_MEMO_ACC_ADDR_WIDTH_Pos ) +#define SPI_MEMO_ACC_ADDR_WIDTH_1 ( 0x2UL << SPI_MEMO_ACC_ADDR_WIDTH_Pos ) + +#define SPI_MEMO_ACC_DUMMY_BYTE_SIZE_Pos ( 12U ) +#define SPI_MEMO_ACC_DUMMY_BYTE_SIZE_Msk ( 0x3UL << SPI_MEMO_ACC_DUMMY_BYTE_SIZE_Pos ) +#define SPI_MEMO_ACC_DUMMY_BYTE_SIZE ( SPI_MEMO_ACC_DUMMY_BYTE_SIZE_Msk ) +#define SPI_MEMO_ACC_DUMMY_BYTE_SIZE_0 ( 0x1UL << SPI_MEMO_ACC_DUMMY_BYTE_SIZE_Pos ) +#define SPI_MEMO_ACC_DUMMY_BYTE_SIZE_1 ( 0x2UL << SPI_MEMO_ACC_DUMMY_BYTE_SIZE_Pos ) + +#define SPI_MEMO_ACC_RD_DB_EN_Pos ( 11U ) +#define SPI_MEMO_ACC_RD_DB_EN_Msk ( 0x1UL << SPI_MEMO_ACC_RD_DB_EN_Pos ) +#define SPI_MEMO_ACC_RD_DB_EN ( SPI_MEMO_ACC_RD_DB_EN_Msk ) + +#define SPI_MEMO_ACC_WR_DB_EN_Pos ( 10U ) +#define SPI_MEMO_ACC_WR_DB_EN_Msk ( 0x1UL << SPI_MEMO_ACC_WR_DB_EN_Pos ) +#define SPI_MEMO_ACC_WR_DB_EN ( SPI_MEMO_ACC_WR_DB_EN_Msk ) + +#define SPI_MEMO_ACC_ALTER_BYTE_SIZE_Pos ( 7U ) +#define SPI_MEMO_ACC_ALTER_BYTE_SIZE_Msk ( 0x3UL << SPI_MEMO_ACC_ALTER_BYTE_SIZE_Pos ) +#define SPI_MEMO_ACC_ALTER_BYTE_SIZE ( SPI_MEMO_ACC_ALTER_BYTE_SIZE_Msk ) +#define SPI_MEMO_ACC_ALTER_BYTE_SIZE_0 ( 0x1UL << SPI_MEMO_ACC_ALTER_BYTE_SIZE_Pos ) +#define SPI_MEMO_ACC_ALTER_BYTE_SIZE_1 ( 0x2UL << SPI_MEMO_ACC_ALTER_BYTE_SIZE_Pos ) + +#define SPI_MEMO_ACC_RD_AB_EN_Pos ( 6U ) +#define SPI_MEMO_ACC_RD_AB_EN_Msk ( 0x1UL << SPI_MEMO_ACC_RD_AB_EN_Pos ) +#define SPI_MEMO_ACC_RD_AB_EN ( SPI_MEMO_ACC_RD_AB_EN_Msk ) + +#define SPI_MEMO_ACC_WR_AB_EN_Pos ( 5U ) +#define SPI_MEMO_ACC_WR_AB_EN_Msk ( 0x1UL << SPI_MEMO_ACC_WR_AB_EN_Pos ) +#define SPI_MEMO_ACC_WR_AB_EN ( SPI_MEMO_ACC_WR_AB_EN_Msk ) + +#define SPI_MEMO_ACC_DISABLE_CMD_Pos ( 4U ) +#define SPI_MEMO_ACC_DISABLE_CMD_Msk ( 0x1UL << SPI_MEMO_ACC_DISABLE_CMD_Pos ) +#define SPI_MEMO_ACC_DISABLE_CMD ( SPI_MEMO_ACC_DISABLE_CMD_Msk ) + +#define SPI_MEMO_ACC_CON_MODE_EN_Pos ( 3U ) +#define SPI_MEMO_ACC_CON_MODE_EN_Msk ( 0x1UL << SPI_MEMO_ACC_CON_MODE_EN_Pos ) +#define SPI_MEMO_ACC_CON_MODE_EN ( SPI_MEMO_ACC_CON_MODE_EN_Msk ) + +#define SPI_MEMO_ACC_CON_CS_WAIT_EN_Pos ( 1U ) +#define SPI_MEMO_ACC_CON_CS_WAIT_EN_Msk ( 0x1UL << SPI_MEMO_ACC_CON_CS_WAIT_EN_Pos ) +#define SPI_MEMO_ACC_CON_CS_WAIT_EN ( SPI_MEMO_ACC_CON_CS_WAIT_EN_Msk ) + +#define SPI_MEMO_ACC_SPI_ACC_EN_Pos ( 0U ) +#define SPI_MEMO_ACC_SPI_ACC_EN_Msk ( 0x1UL << SPI_MEMO_ACC_SPI_ACC_EN_Pos ) +#define SPI_MEMO_ACC_SPI_ACC_EN ( SPI_MEMO_ACC_SPI_ACC_EN_Msk ) + + +/*************** Bits definition for SPI_CMD **********************/ + +#define SPI_CMD_WR_CMD_Pos ( 8U ) +#define SPI_CMD_WR_CMD_Msk ( 0xffUL << SPI_CMD_WR_CMD_Pos ) +#define SPI_CMD_WR_CMD ( SPI_CMD_WR_CMD_Msk ) +#define SPI_CMD_WR_CMD_0 ( 0x1UL << SPI_CMD_WR_CMD_Pos ) +#define SPI_CMD_WR_CMD_1 ( 0x2UL << SPI_CMD_WR_CMD_Pos ) +#define SPI_CMD_WR_CMD_2 ( 0x4UL << SPI_CMD_WR_CMD_Pos ) +#define SPI_CMD_WR_CMD_3 ( 0x8UL << SPI_CMD_WR_CMD_Pos ) +#define SPI_CMD_WR_CMD_4 ( 0x10UL << SPI_CMD_WR_CMD_Pos ) +#define SPI_CMD_WR_CMD_5 ( 0x20UL << SPI_CMD_WR_CMD_Pos ) +#define SPI_CMD_WR_CMD_6 ( 0x40UL << SPI_CMD_WR_CMD_Pos ) +#define SPI_CMD_WR_CMD_7 ( 0x80UL << SPI_CMD_WR_CMD_Pos ) + +#define SPI_CMD_RD_CMD_Pos ( 0U ) +#define SPI_CMD_RD_CMD_Msk ( 0xffUL << SPI_CMD_RD_CMD_Pos ) +#define SPI_CMD_RD_CMD ( SPI_CMD_RD_CMD_Msk ) +#define SPI_CMD_RD_CMD_0 ( 0x1UL << SPI_CMD_RD_CMD_Pos ) +#define SPI_CMD_RD_CMD_1 ( 0x2UL << SPI_CMD_RD_CMD_Pos ) +#define SPI_CMD_RD_CMD_2 ( 0x4UL << SPI_CMD_RD_CMD_Pos ) +#define SPI_CMD_RD_CMD_3 ( 0x8UL << SPI_CMD_RD_CMD_Pos ) +#define SPI_CMD_RD_CMD_4 ( 0x10UL << SPI_CMD_RD_CMD_Pos ) +#define SPI_CMD_RD_CMD_5 ( 0x20UL << SPI_CMD_RD_CMD_Pos ) +#define SPI_CMD_RD_CMD_6 ( 0x40UL << SPI_CMD_RD_CMD_Pos ) +#define SPI_CMD_RD_CMD_7 ( 0x80UL << SPI_CMD_RD_CMD_Pos ) + + +/*************** Bits definition for SPI_ALTER_BYTE **********************/ + +#define SPI_ALTER_BYTE_ALTER_BYTE_Pos ( 0U ) +#define SPI_ALTER_BYTE_ALTER_BYTE_Msk ( 0xffffffffUL << SPI_ALTER_BYTE_ALTER_BYTE_Pos ) +#define SPI_ALTER_BYTE_ALTER_BYTE ( SPI_ALTER_BYTE_ALTER_BYTE_Msk ) + + +/*************** Bits definition for SPI_CS_WAIT_VAL **********************/ + +#define SPI_CS_WAIT_VAL_CON_CS_WAIT_VAL_Pos ( 0U ) +#define SPI_CS_WAIT_VAL_CON_CS_WAIT_VAL_Msk ( 0xffffUL << SPI_CS_WAIT_VAL_CON_CS_WAIT_VAL_Pos ) +#define SPI_CS_WAIT_VAL_CON_CS_WAIT_VAL ( SPI_CS_WAIT_VAL_CON_CS_WAIT_VAL_Msk ) + + +/*************** Bits definition for I2C_SLAVE_ADDR1 **********************/ + +#define I2C_SLAVE_ADDR1_ADDR17_Pos ( 7U ) +#define I2C_SLAVE_ADDR1_ADDR17_Msk ( 0x1UL << I2C_SLAVE_ADDR1_ADDR17_Pos ) +#define I2C_SLAVE_ADDR1_ADDR17 ( I2C_SLAVE_ADDR1_ADDR17_Msk ) + + +#define I2C_SLAVE_ADDR1_ADDR16_Pos ( 6U ) +#define I2C_SLAVE_ADDR1_ADDR16_Msk ( 0x1UL << I2C_SLAVE_ADDR1_ADDR16_Pos ) +#define I2C_SLAVE_ADDR1_ADDR16 ( I2C_SLAVE_ADDR1_ADDR16_Msk ) + + +#define I2C_SLAVE_ADDR1_ADDR15_Pos ( 5U ) +#define I2C_SLAVE_ADDR1_ADDR15_Msk ( 0x1UL << I2C_SLAVE_ADDR1_ADDR15_Pos ) +#define I2C_SLAVE_ADDR1_ADDR15 ( I2C_SLAVE_ADDR1_ADDR15_Msk ) + + +#define I2C_SLAVE_ADDR1_ADDR14_Pos ( 4U ) +#define I2C_SLAVE_ADDR1_ADDR14_Msk ( 0x1UL << I2C_SLAVE_ADDR1_ADDR14_Pos ) +#define I2C_SLAVE_ADDR1_ADDR14 ( I2C_SLAVE_ADDR1_ADDR14_Msk ) + + +#define I2C_SLAVE_ADDR1_ADDR13_Pos ( 3U ) +#define I2C_SLAVE_ADDR1_ADDR13_Msk ( 0x1UL << I2C_SLAVE_ADDR1_ADDR13_Pos ) +#define I2C_SLAVE_ADDR1_ADDR13 ( I2C_SLAVE_ADDR1_ADDR13_Msk ) + + +#define I2C_SLAVE_ADDR1_ADDR12_Pos ( 2U ) +#define I2C_SLAVE_ADDR1_ADDR12_Msk ( 0x1UL << I2C_SLAVE_ADDR1_ADDR12_Pos ) +#define I2C_SLAVE_ADDR1_ADDR12 ( I2C_SLAVE_ADDR1_ADDR12_Msk ) + + +#define I2C_SLAVE_ADDR1_ADDR11_Pos ( 1U ) +#define I2C_SLAVE_ADDR1_ADDR11_Msk ( 0x1UL << I2C_SLAVE_ADDR1_ADDR11_Pos ) +#define I2C_SLAVE_ADDR1_ADDR11 ( I2C_SLAVE_ADDR1_ADDR11_Msk ) + + + +/*************** Bits definition for I2C_CLK_DIV **********************/ + +#define I2C_CLK_DIV_I2C_CLK_DIV_Pos ( 0U ) +#define I2C_CLK_DIV_I2C_CLK_DIV_Msk ( 0xfffUL << I2C_CLK_DIV_I2C_CLK_DIV_Pos ) +#define I2C_CLK_DIV_I2C_CLK_DIV ( I2C_CLK_DIV_I2C_CLK_DIV_Msk ) + + +/*************** Bits definition for I2C_CR **********************/ + +#define I2C_CR_SU_HD_FIXEN_Pos ( 24U ) +#define I2C_CR_SU_HD_FIXEN_Msk ( 0x1UL << I2C_CR_SU_HD_FIXEN_Pos ) +#define I2C_CR_SU_HD_FIXEN ( I2C_CR_SU_HD_FIXEN_Msk ) + +#define I2C_CR_MARLO_SEL_Pos ( 23U ) +#define I2C_CR_MARLO_SEL_Msk ( 0x1UL << I2C_CR_MARLO_SEL_Pos ) +#define I2C_CR_MARLO_SEL ( I2C_CR_MARLO_SEL_Msk ) + +#define I2C_CR_TX_RX_FLAG_INTEN_Pos ( 22U ) +#define I2C_CR_TX_RX_FLAG_INTEN_Msk ( 0x1UL << I2C_CR_TX_RX_FLAG_INTEN_Pos ) +#define I2C_CR_TX_RX_FLAG_INTEN ( I2C_CR_TX_RX_FLAG_INTEN_Msk ) + +#define I2C_CR_NACKF_INTEN_Pos ( 21U ) +#define I2C_CR_NACKF_INTEN_Msk ( 0x1UL << I2C_CR_NACKF_INTEN_Pos ) +#define I2C_CR_NACKF_INTEN ( I2C_CR_NACKF_INTEN_Msk ) + +#define I2C_CR_STOPF_INTEN_Pos ( 20U ) +#define I2C_CR_STOPF_INTEN_Msk ( 0x1UL << I2C_CR_STOPF_INTEN_Pos ) +#define I2C_CR_STOPF_INTEN ( I2C_CR_STOPF_INTEN_Msk ) + +#define I2C_CR_RX_ADDR3_INTEN_Pos ( 19U ) +#define I2C_CR_RX_ADDR3_INTEN_Msk ( 0x1UL << I2C_CR_RX_ADDR3_INTEN_Pos ) +#define I2C_CR_RX_ADDR3_INTEN ( I2C_CR_RX_ADDR3_INTEN_Msk ) + +#define I2C_CR_DMA_EN_Pos ( 18U ) +#define I2C_CR_DMA_EN_Msk ( 0x1UL << I2C_CR_DMA_EN_Pos ) +#define I2C_CR_DMA_EN ( I2C_CR_DMA_EN_Msk ) + +#define I2C_CR_TXE_SEL_Pos ( 17U ) +#define I2C_CR_TXE_SEL_Msk ( 0x1UL << I2C_CR_TXE_SEL_Pos ) +#define I2C_CR_TXE_SEL ( I2C_CR_TXE_SEL_Msk ) + +#define I2C_CR_MARLO_INTEN_Pos ( 16U ) +#define I2C_CR_MARLO_INTEN_Msk ( 0x1UL << I2C_CR_MARLO_INTEN_Pos ) +#define I2C_CR_MARLO_INTEN ( I2C_CR_MARLO_INTEN_Msk ) + +#define I2C_CR_TX_AUTO_EN_Pos ( 15U ) +#define I2C_CR_TX_AUTO_EN_Msk ( 0x1UL << I2C_CR_TX_AUTO_EN_Pos ) +#define I2C_CR_TX_AUTO_EN ( I2C_CR_TX_AUTO_EN_Msk ) + +#define I2C_CR_OD_MODE_Pos ( 14U ) +#define I2C_CR_OD_MODE_Msk ( 0x1UL << I2C_CR_OD_MODE_Pos ) +#define I2C_CR_OD_MODE ( I2C_CR_OD_MODE_Msk ) + +#define I2C_CR_DETR_INT_EN_Pos ( 13U ) +#define I2C_CR_DETR_INT_EN_Msk ( 0x1UL << I2C_CR_DETR_INT_EN_Pos ) +#define I2C_CR_DETR_INT_EN ( I2C_CR_DETR_INT_EN_Msk ) + +#define I2C_CR_RX_ADDR2_INT_EN_Pos ( 12U ) +#define I2C_CR_RX_ADDR2_INT_EN_Msk ( 0x1UL << I2C_CR_RX_ADDR2_INT_EN_Pos ) +#define I2C_CR_RX_ADDR2_INT_EN ( I2C_CR_RX_ADDR2_INT_EN_Msk ) + +#define I2C_CR_OVR_INT_EN_Pos ( 11U ) +#define I2C_CR_OVR_INT_EN_Msk ( 0x1UL << I2C_CR_OVR_INT_EN_Pos ) +#define I2C_CR_OVR_INT_EN ( I2C_CR_OVR_INT_EN_Msk ) + +#define I2C_CR_RXNE_INT_EN_Pos ( 10U ) +#define I2C_CR_RXNE_INT_EN_Msk ( 0x1UL << I2C_CR_RXNE_INT_EN_Pos ) +#define I2C_CR_RXNE_INT_EN ( I2C_CR_RXNE_INT_EN_Msk ) + +#define I2C_CR_TXE_INT_EN_Pos ( 9U ) +#define I2C_CR_TXE_INT_EN_Msk ( 0x1UL << I2C_CR_TXE_INT_EN_Pos ) +#define I2C_CR_TXE_INT_EN ( I2C_CR_TXE_INT_EN_Msk ) + +#define I2C_CR_RX_ADDR1_INT_EN_Pos ( 8U ) +#define I2C_CR_RX_ADDR1_INT_EN_Msk ( 0x1UL << I2C_CR_RX_ADDR1_INT_EN_Pos ) +#define I2C_CR_RX_ADDR1_INT_EN ( I2C_CR_RX_ADDR1_INT_EN_Msk ) + +#define I2C_CR_MTF_INT_EN_Pos ( 7U ) +#define I2C_CR_MTF_INT_EN_Msk ( 0x1UL << I2C_CR_MTF_INT_EN_Pos ) +#define I2C_CR_MTF_INT_EN ( I2C_CR_MTF_INT_EN_Msk ) + +#define I2C_CR_TACK_Pos ( 6U ) +#define I2C_CR_TACK_Msk ( 0x1UL << I2C_CR_TACK_Pos ) +#define I2C_CR_TACK ( I2C_CR_TACK_Msk ) + +#define I2C_CR_STOP_Pos ( 5U ) +#define I2C_CR_STOP_Msk ( 0x1UL << I2C_CR_STOP_Pos ) +#define I2C_CR_STOP ( I2C_CR_STOP_Msk ) + +#define I2C_CR_START_Pos ( 4U ) +#define I2C_CR_START_Msk ( 0x1UL << I2C_CR_START_Pos ) +#define I2C_CR_START ( I2C_CR_START_Msk ) + +#define I2C_CR_TX_Pos ( 3U ) +#define I2C_CR_TX_Msk ( 0x1UL << I2C_CR_TX_Pos ) +#define I2C_CR_TX ( I2C_CR_TX_Msk ) + +#define I2C_CR_MASTER_Pos ( 2U ) +#define I2C_CR_MASTER_Msk ( 0x1UL << I2C_CR_MASTER_Pos ) +#define I2C_CR_MASTER ( I2C_CR_MASTER_Msk ) + +#define I2C_CR_NOSTRETCH_Pos ( 1U ) +#define I2C_CR_NOSTRETCH_Msk ( 0x1UL << I2C_CR_NOSTRETCH_Pos ) +#define I2C_CR_NOSTRETCH ( I2C_CR_NOSTRETCH_Msk ) + +#define I2C_CR_MEN_Pos ( 0U ) +#define I2C_CR_MEN_Msk ( 0x1UL << I2C_CR_MEN_Pos ) +#define I2C_CR_MEN ( I2C_CR_MEN_Msk ) + + +/*************** Bits definition for I2C_SR **********************/ + +#define I2C_SR_NACKF_Pos ( 17U ) +#define I2C_SR_NACKF_Msk ( 0x1UL << I2C_SR_NACKF_Pos ) +#define I2C_SR_NACKF ( I2C_SR_NACKF_Msk ) + +#define I2C_SR_TIMEOUTBF_Pos ( 16U ) +#define I2C_SR_TIMEOUTBF_Msk ( 0x1UL << I2C_SR_TIMEOUTBF_Pos ) +#define I2C_SR_TIMEOUTBF ( I2C_SR_TIMEOUTBF_Msk ) + +#define I2C_SR_TIMEOUTAF_Pos ( 15U ) +#define I2C_SR_TIMEOUTAF_Msk ( 0x1UL << I2C_SR_TIMEOUTAF_Pos ) +#define I2C_SR_TIMEOUTAF ( I2C_SR_TIMEOUTAF_Msk ) + +#define I2C_SR_RX_ADDR3_Pos ( 14U ) +#define I2C_SR_RX_ADDR3_Msk ( 0x1UL << I2C_SR_RX_ADDR3_Pos ) +#define I2C_SR_RX_ADDR3 ( I2C_SR_RX_ADDR3_Msk ) + +#define I2C_SR_DETR_Pos ( 13U ) +#define I2C_SR_DETR_Msk ( 0x1UL << I2C_SR_DETR_Pos ) +#define I2C_SR_DETR ( I2C_SR_DETR_Msk ) + +#define I2C_SR_RX_ADDR2_Pos ( 12U ) +#define I2C_SR_RX_ADDR2_Msk ( 0x1UL << I2C_SR_RX_ADDR2_Pos ) +#define I2C_SR_RX_ADDR2 ( I2C_SR_RX_ADDR2_Msk ) + +#define I2C_SR_OVR_Pos ( 11U ) +#define I2C_SR_OVR_Msk ( 0x1UL << I2C_SR_OVR_Pos ) +#define I2C_SR_OVR ( I2C_SR_OVR_Msk ) + +#define I2C_SR_RXNE_Pos ( 10U ) +#define I2C_SR_RXNE_Msk ( 0x1UL << I2C_SR_RXNE_Pos ) +#define I2C_SR_RXNE ( I2C_SR_RXNE_Msk ) + +#define I2C_SR_TXE_Pos ( 9U ) +#define I2C_SR_TXE_Msk ( 0x1UL << I2C_SR_TXE_Pos ) +#define I2C_SR_TXE ( I2C_SR_TXE_Msk ) + +#define I2C_SR_RX_ADDR1_Pos ( 8U ) +#define I2C_SR_RX_ADDR1_Msk ( 0x1UL << I2C_SR_RX_ADDR1_Pos ) +#define I2C_SR_RX_ADDR1 ( I2C_SR_RX_ADDR1_Msk ) + +#define I2C_SR_MTF_Pos ( 7U ) +#define I2C_SR_MTF_Msk ( 0x1UL << I2C_SR_MTF_Pos ) +#define I2C_SR_MTF ( I2C_SR_MTF_Msk ) + +#define I2C_SR_MARLO_Pos ( 6U ) +#define I2C_SR_MARLO_Msk ( 0x1UL << I2C_SR_MARLO_Pos ) +#define I2C_SR_MARLO ( I2C_SR_MARLO_Msk ) + +#define I2C_SR_TX_RX_FLAG_Pos ( 5U ) +#define I2C_SR_TX_RX_FLAG_Msk ( 0x1UL << I2C_SR_TX_RX_FLAG_Pos ) +#define I2C_SR_TX_RX_FLAG ( I2C_SR_TX_RX_FLAG_Msk ) + +#define I2C_SR_BUS_BUSY_Pos ( 4U ) +#define I2C_SR_BUS_BUSY_Msk ( 0x1UL << I2C_SR_BUS_BUSY_Pos ) +#define I2C_SR_BUS_BUSY ( I2C_SR_BUS_BUSY_Msk ) + +#define I2C_SR_SRW_Pos ( 3U ) +#define I2C_SR_SRW_Msk ( 0x1UL << I2C_SR_SRW_Pos ) +#define I2C_SR_SRW ( I2C_SR_SRW_Msk ) + +#define I2C_SR_STOPF_Pos ( 2U ) +#define I2C_SR_STOPF_Msk ( 0x1UL << I2C_SR_STOPF_Pos ) +#define I2C_SR_STOPF ( I2C_SR_STOPF_Msk ) + +#define I2C_SR_STARTF_Pos ( 1U ) +#define I2C_SR_STARTF_Msk ( 0x1UL << I2C_SR_STARTF_Pos ) +#define I2C_SR_STARTF ( I2C_SR_STARTF_Msk ) + +#define I2C_SR_RACK_Pos ( 0U ) +#define I2C_SR_RACK_Msk ( 0x1UL << I2C_SR_RACK_Pos ) +#define I2C_SR_RACK ( I2C_SR_RACK_Msk ) + + +/*************** Bits definition for I2C_DR **********************/ + +#define I2C_DR_I2CDR_Pos ( 0U ) +#define I2C_DR_I2CDR_Msk ( 0xffUL << I2C_DR_I2CDR_Pos ) +#define I2C_DR_I2CDR ( I2C_DR_I2CDR_Msk ) +#define I2C_DR_I2CDR_0 ( 0x1UL << I2C_DR_I2CDR_Pos ) +#define I2C_DR_I2CDR_1 ( 0x2UL << I2C_DR_I2CDR_Pos ) +#define I2C_DR_I2CDR_2 ( 0x4UL << I2C_DR_I2CDR_Pos ) +#define I2C_DR_I2CDR_3 ( 0x8UL << I2C_DR_I2CDR_Pos ) +#define I2C_DR_I2CDR_4 ( 0x10UL << I2C_DR_I2CDR_Pos ) +#define I2C_DR_I2CDR_5 ( 0x20UL << I2C_DR_I2CDR_Pos ) +#define I2C_DR_I2CDR_6 ( 0x40UL << I2C_DR_I2CDR_Pos ) +#define I2C_DR_I2CDR_7 ( 0x80UL << I2C_DR_I2CDR_Pos ) + + +/*************** Bits definition for I2C_SLAVE_ADDR2_3 **********************/ +#define I2C_SLAVE_ADDR3_Pos ( 9U ) +#define I2C_SLAVE_ADDR3_Msk ( 0x7fUL << I2C_SLAVE_ADDR3_Pos ) +#define I2C_SLAVE_ADDR3 ( I2C_SLAVE__ADDR3_Msk ) + + +#define I2C_SLAVE_ADDR3_EN_Pos ( 8U ) +#define I2C_SLAVE_ADDR3_EN_Msk ( 0x1UL << I2C_SLAVE_ADDR3_EN_Pos ) +#define I2C_SLAVE_ADDR3_EN ( I2C_SLAVE_ADDR3_EN_Msk ) + + +#define I2C_SLAVE_ADDR2_Pos ( 1U ) +#define I2C_SLAVE_ADDR2_Msk ( 0x7fUL << I2C_SLAVE_ADDR2_Pos ) +#define I2C_SLAVE_ADDR2 ( I2C_SLAVE_ADDR2_Msk ) + + +#define I2C_SLAVE_ADDR2_EN_Pos ( 0U ) +#define I2C_SLAVE_ADDR2_EN_Msk ( 0x1UL << I2C_SLAVE_ADDR2_EN_Pos ) +#define I2C_SLAVE_ADDR2_EN ( I2C_SLAVE_ADDR2_EN_Msk ) + + +/*************** Bits definition for I2C_DET **********************/ + +#define I2C_DET_DETCNT_Pos ( 0U ) +#define I2C_DET_DETCNT_Msk ( 0xffffUL << I2C_DET_DETCNT_Pos ) +#define I2C_DET_DETCNT ( I2C_DET_DETCNT_Msk ) + + +/*************** Bits definition for I2C_FITER **********************/ + +#define I2C_FITER_SDA_IN_DELAY_Pos ( 8U ) +#define I2C_FITER_SDA_IN_DELAY_Msk ( 0x1FUL << I2C_FITER_SDA_IN_DELAY_Pos ) +#define I2C_FITER_SDA_IN_DELAY ( I2C_FITER_SDA_IN_DELAY_Msk ) +#define I2C_FITER_SDA_IN_DELAY_0 ( 0x1UL << I2C_FITER_SDA_IN_DELAY_Pos ) +#define I2C_FITER_SDA_IN_DELAY_1 ( 0x2UL << I2C_FITER_SDA_IN_DELAY_Pos ) +#define I2C_FITER_SDA_IN_DELAY_2 ( 0x4UL << I2C_FITER_SDA_IN_DELAY_Pos ) +#define I2C_FITER_SDA_IN_DELAY_3 ( 0x8UL << I2C_FITER_SDA_IN_DELAY_Pos ) +#define I2C_FITER_SDA_IN_DELAY_4 ( 0x10UL << I2C_FITER_SDA_IN_DELAY_Pos ) + +#define I2C_FITER_SCL_FITER_Pos ( 0U ) +#define I2C_FITER_SCL_FITER_Msk ( 0x1FUL << I2C_FITER_SCL_FITER_Pos ) +#define I2C_FITER_SCL_FITER ( I2C_FITER_SCL_FITER_Msk ) +#define I2C_FITER_SCL_FITER_0 ( 0x1UL << I2C_FITER_SCL_FITER_Pos ) +#define I2C_FITER_SCL_FITER_1 ( 0x2UL << I2C_FITER_SCL_FITER_Pos ) +#define I2C_FITER_SCL_FITER_2 ( 0x4UL << I2C_FITER_SCL_FITER_Pos ) +#define I2C_FITER_SCL_FITER_3 ( 0x8UL << I2C_FITER_SCL_FITER_Pos ) +#define I2C_FITER_SCL_FITER_4 ( 0x10UL << I2C_FITER_SCL_FITER_Pos ) + + +/*************** Bits definition for I2C_Timeout **********************/ + +#define I2C_TIMEOUT_EXTEN_Pos ( 31U ) +#define I2C_TIMEOUT_EXTEN_Msk ( 0x1UL << I2C_TIMEOUT_EXTEN_Pos ) +#define I2C_TIMEOUT_EXTEN ( I2C_TIMEOUT_EXTEN_Msk ) + +#define I2C_TIMEOUTB_INTEN_Pos ( 30U ) +#define I2C_TIMEOUTB_INTEN_Msk ( 0x1UL << I2C_TIMEOUT_TOUTB_INTEN_Pos ) +#define I2C_TIMEOUTB_INTEN ( I2C_TIMEOUT_TOUTB_INTEN_Msk ) + +#define I2C_TIMEOUT_EXT_MODE_Pos ( 29U ) +#define I2C_TIMEOUT_EXT_MODE_Msk ( 0x1UL << I2C_TIMEOUT_EXT_MODE_Pos ) +#define I2C_TIMEOUT_EXT_MODE ( I2C_TIMEOUT_EXT_MODE_Msk ) + +#define I2C_TIMEOUTB_Pos ( 16U ) +#define I2C_TIMEOUTB_Msk ( 0xfffUL << I2C_TIMEOUT_TIMEOUTB_Pos ) +#define I2C_TIMEOUTB ( I2C_TIMEOUT_TIMEOUTB_Msk ) + +#define I2C_TIMOUTEN_Pos ( 15U ) +#define I2C_TIMOUTEN_Msk ( 0x1UL << I2C_TIMEOUT_TIMOUTEN_Pos ) +#define I2C_TIMOUTEN ( I2C_TIMEOUT_TIMOUTEN_Msk ) + +#define I2C_TIMEOUTA_INTEN_Pos ( 14U ) +#define I2C_TIMEOUTA_INTEN_Msk ( 0x1UL << I2C_TIMEOUT_TOUTA_INTEN_Pos ) +#define I2C_TIMEOUTA_INTEN ( I2C_TIMEOUT_TOUTA_INTEN_Msk ) + +#define I2C_TIMEOUTA_Pos ( 0U ) +#define I2C_TIMEOUTA_Msk ( 0xfffUL << I2C_TIMEOUT_TIMEOUTA_Pos ) +#define I2C_TIMEOUTA ( I2C_TIMEOUT_TIMEOUTA_Msk ) + + +/*************** Bits definition for FDCAN_RBUFx **********************/ + +#define FDCAN_RBUFX_RBUFX_Pos ( 0U ) +#define FDCAN_RBUFX_RBUFX_Msk ( 0xffffffffUL << FDCAN_RBUFX_RBUFX_Pos ) +#define FDCAN_RBUFX_RBUFX ( FDCAN_RBUFX_RBUFX_Msk ) + + +/*************** Bits definition for FDCAN_TBUFx **********************/ + +#define FDCAN_TBUFX_TBUFX_Pos ( 0U ) +#define FDCAN_TBUFX_TBUFX_Msk ( 0xffffffffUL << FDCAN_TBUFX_TBUFX_Pos ) +#define FDCAN_TBUFX_TBUFX ( FDCAN_TBUFX_TBUFX_Msk ) + + +/*************** Bits definition for FDCAN_TTSL **********************/ + +#define FDCAN_TTSL_TTS_Pos ( 0U ) +#define FDCAN_TTSL_TTS_Msk ( 0xffffffffUL << FDCAN_TTSL_TTS_Pos ) +#define FDCAN_TTSL_TTS ( FDCAN_TTSL_TTS_Msk ) + + +/*************** Bits definition for FDCAN_TTSH **********************/ + +#define FDCAN_TTSH_TTS_Pos ( 0U ) +#define FDCAN_TTSH_TTS_Msk ( 0xffffffffUL << FDCAN_TTSH_TTS_Pos ) +#define FDCAN_TTSH_TTS ( FDCAN_TTSH_TTS_Msk ) + + +/*************** Bits definition for FDCAN_CR **********************/ + +#define FDCAN_CR_SACK_Pos ( 31U ) +#define FDCAN_CR_SACK_Msk ( 0x1UL << FDCAN_CR_SACK_Pos ) +#define FDCAN_CR_SACK ( FDCAN_CR_SACK_Msk ) + +#define FDCAN_CR_ROM_Pos ( 30U ) +#define FDCAN_CR_ROM_Msk ( 0x1UL << FDCAN_CR_ROM_Pos ) +#define FDCAN_CR_ROM ( FDCAN_CR_ROM_Msk ) + +#define FDCAN_CR_ROV_Pos ( 29U ) +#define FDCAN_CR_ROV_Msk ( 0x1UL << FDCAN_CR_ROV_Pos ) +#define FDCAN_CR_ROV ( FDCAN_CR_ROV_Msk ) + +#define FDCAN_CR_RREL_Pos ( 28U ) +#define FDCAN_CR_RREL_Msk ( 0x1UL << FDCAN_CR_RREL_Pos ) +#define FDCAN_CR_RREL ( FDCAN_CR_RREL_Msk ) + +#define FDCAN_CR_RBALL_Pos ( 27U ) +#define FDCAN_CR_RBALL_Msk ( 0x1UL << FDCAN_CR_RBALL_Pos ) +#define FDCAN_CR_RBALL ( FDCAN_CR_RBALL_Msk ) + +#define FDCAN_CR_RSTAT_Pos ( 24U ) +#define FDCAN_CR_RSTAT_Msk ( 0x3UL << FDCAN_CR_RSTAT_Pos ) +#define FDCAN_CR_RSTAT ( FDCAN_CR_RSTAT_Msk ) +#define FDCAN_CR_RSTAT_0 ( 0x1UL << FDCAN_CR_RSTAT_Pos ) +#define FDCAN_CR_RSTAT_1 ( 0x2UL << FDCAN_CR_RSTAT_Pos ) + +#define FDCAN_CR_FD_ISO_Pos ( 23U ) +#define FDCAN_CR_FD_ISO_Msk ( 0x1UL << FDCAN_CR_FD_ISO_Pos ) +#define FDCAN_CR_FD_ISO ( FDCAN_CR_FD_ISO_Msk ) + +#define FDCAN_CR_TSNEXT_Pos ( 22U ) +#define FDCAN_CR_TSNEXT_Msk ( 0x1UL << FDCAN_CR_TSNEXT_Pos ) +#define FDCAN_CR_TSNEXT ( FDCAN_CR_TSNEXT_Msk ) + +#define FDCAN_CR_TSMODE_Pos ( 21U ) +#define FDCAN_CR_TSMODE_Msk ( 0x1UL << FDCAN_CR_TSMODE_Pos ) +#define FDCAN_CR_TSMODE ( FDCAN_CR_TSMODE_Msk ) + +#define FDCAN_CR_TTTBM_Pos ( 20U ) +#define FDCAN_CR_TTTBM_Msk ( 0x1UL << FDCAN_CR_TTTBM_Pos ) +#define FDCAN_CR_TTTBM ( FDCAN_CR_TTTBM_Msk ) + +#define FDCAN_CR_TSSTAT_Pos ( 16U ) +#define FDCAN_CR_TSSTAT_Msk ( 0x3UL << FDCAN_CR_TSSTAT_Pos ) +#define FDCAN_CR_TSSTAT ( FDCAN_CR_TSSTAT_Msk ) +#define FDCAN_CR_TSSTAT_0 ( 0x1UL << FDCAN_CR_TSSTAT_Pos ) +#define FDCAN_CR_TSSTAT_1 ( 0x2UL << FDCAN_CR_TSSTAT_Pos ) + +#define FDCAN_CR_TBSEL_Pos ( 15U ) +#define FDCAN_CR_TBSEL_Msk ( 0x1UL << FDCAN_CR_TBSEL_Pos ) +#define FDCAN_CR_TBSEL ( FDCAN_CR_TBSEL_Msk ) + +#define FDCAN_CR_LOM_Pos ( 14U ) +#define FDCAN_CR_LOM_Msk ( 0x1UL << FDCAN_CR_LOM_Pos ) +#define FDCAN_CR_LOM ( FDCAN_CR_LOM_Msk ) + +#define FDCAN_CR_STBY_Pos ( 13U ) +#define FDCAN_CR_STBY_Msk ( 0x1UL << FDCAN_CR_STBY_Pos ) +#define FDCAN_CR_STBY ( FDCAN_CR_STBY_Msk ) + +#define FDCAN_CR_TPE_Pos ( 12U ) +#define FDCAN_CR_TPE_Msk ( 0x1UL << FDCAN_CR_TPE_Pos ) +#define FDCAN_CR_TPE ( FDCAN_CR_TPE_Msk ) + +#define FDCAN_CR_TPA_Pos ( 11U ) +#define FDCAN_CR_TPA_Msk ( 0x1UL << FDCAN_CR_TPA_Pos ) +#define FDCAN_CR_TPA ( FDCAN_CR_TPA_Msk ) + +#define FDCAN_CR_TSONE_Pos ( 10U ) +#define FDCAN_CR_TSONE_Msk ( 0x1UL << FDCAN_CR_TSONE_Pos ) +#define FDCAN_CR_TSONE ( FDCAN_CR_TSONE_Msk ) + +#define FDCAN_CR_TSALL_Pos ( 9U ) +#define FDCAN_CR_TSALL_Msk ( 0x1UL << FDCAN_CR_TSALL_Pos ) +#define FDCAN_CR_TSALL ( FDCAN_CR_TSALL_Msk ) + +#define FDCAN_CR_TSA_Pos ( 8U ) +#define FDCAN_CR_TSA_Msk ( 0x1UL << FDCAN_CR_TSA_Pos ) +#define FDCAN_CR_TSA ( FDCAN_CR_TSA_Msk ) + +#define FDCAN_CR_RESET_Pos ( 7U ) +#define FDCAN_CR_RESET_Msk ( 0x1UL << FDCAN_CR_RESET_Pos ) +#define FDCAN_CR_RESET ( FDCAN_CR_RESET_Msk ) + +#define FDCAN_CR_LBME_Pos ( 6U ) +#define FDCAN_CR_LBME_Msk ( 0x1UL << FDCAN_CR_LBME_Pos ) +#define FDCAN_CR_LBME ( FDCAN_CR_LBME_Msk ) + +#define FDCAN_CR_LBMI_Pos ( 5U ) +#define FDCAN_CR_LBMI_Msk ( 0x1UL << FDCAN_CR_LBMI_Pos ) +#define FDCAN_CR_LBMI ( FDCAN_CR_LBMI_Msk ) + +#define FDCAN_CR_TPSS_Pos ( 4U ) +#define FDCAN_CR_TPSS_Msk ( 0x1UL << FDCAN_CR_TPSS_Pos ) +#define FDCAN_CR_TPSS ( FDCAN_CR_TPSS_Msk ) + +#define FDCAN_CR_TSSS_Pos ( 3U ) +#define FDCAN_CR_TSSS_Msk ( 0x1UL << FDCAN_CR_TSSS_Pos ) +#define FDCAN_CR_TSSS ( FDCAN_CR_TSSS_Msk ) + +#define FDCAN_CR_RACTIVE_Pos ( 2U ) +#define FDCAN_CR_RACTIVE_Msk ( 0x1UL << FDCAN_CR_RACTIVE_Pos ) +#define FDCAN_CR_RACTIVE ( FDCAN_CR_RACTIVE_Msk ) + +#define FDCAN_CR_TACTIVE_Pos ( 1U ) +#define FDCAN_CR_TACTIVE_Msk ( 0x1UL << FDCAN_CR_TACTIVE_Pos ) +#define FDCAN_CR_TACTIVE ( FDCAN_CR_TACTIVE_Msk ) + +#define FDCAN_CR_BUSOFF_Pos ( 0U ) +#define FDCAN_CR_BUSOFF_Msk ( 0x1UL << FDCAN_CR_BUSOFF_Pos ) +#define FDCAN_CR_BUSOFF ( FDCAN_CR_BUSOFF_Msk ) + + +/*************** Bits definition for FDCAN_IR **********************/ + +#define FDCAN_IR_EWARN_Pos ( 23U ) +#define FDCAN_IR_EWARN_Msk ( 0x1UL << FDCAN_IR_EWARN_Pos ) +#define FDCAN_IR_EWARN ( FDCAN_IR_EWARN_Msk ) + +#define FDCAN_IR_EPASS_Pos ( 22U ) +#define FDCAN_IR_EPASS_Msk ( 0x1UL << FDCAN_IR_EPASS_Pos ) +#define FDCAN_IR_EPASS ( FDCAN_IR_EPASS_Msk ) + +#define FDCAN_IR_EPIE_Pos ( 21U ) +#define FDCAN_IR_EPIE_Msk ( 0x1UL << FDCAN_IR_EPIE_Pos ) +#define FDCAN_IR_EPIE ( FDCAN_IR_EPIE_Msk ) + +#define FDCAN_IR_EPIF_Pos ( 20U ) +#define FDCAN_IR_EPIF_Msk ( 0x1UL << FDCAN_IR_EPIF_Pos ) +#define FDCAN_IR_EPIF ( FDCAN_IR_EPIF_Msk ) + +#define FDCAN_IR_ALIE_Pos ( 19U ) +#define FDCAN_IR_ALIE_Msk ( 0x1UL << FDCAN_IR_ALIE_Pos ) +#define FDCAN_IR_ALIE ( FDCAN_IR_ALIE_Msk ) + +#define FDCAN_IR_ALIF_Pos ( 18U ) +#define FDCAN_IR_ALIF_Msk ( 0x1UL << FDCAN_IR_ALIF_Pos ) +#define FDCAN_IR_ALIF ( FDCAN_IR_ALIF_Msk ) + +#define FDCAN_IR_BEIE_Pos ( 17U ) +#define FDCAN_IR_BEIE_Msk ( 0x1UL << FDCAN_IR_BEIE_Pos ) +#define FDCAN_IR_BEIE ( FDCAN_IR_BEIE_Msk ) + +#define FDCAN_IR_BEIF_Pos ( 16U ) +#define FDCAN_IR_BEIF_Msk ( 0x1UL << FDCAN_IR_BEIF_Pos ) +#define FDCAN_IR_BEIF ( FDCAN_IR_BEIF_Msk ) + +#define FDCAN_IR_RIF_Pos ( 15U ) +#define FDCAN_IR_RIF_Msk ( 0x1UL << FDCAN_IR_RIF_Pos ) +#define FDCAN_IR_RIF ( FDCAN_IR_RIF_Msk ) + +#define FDCAN_IR_ROIF_Pos ( 14U ) +#define FDCAN_IR_ROIF_Msk ( 0x1UL << FDCAN_IR_ROIF_Pos ) +#define FDCAN_IR_ROIF ( FDCAN_IR_ROIF_Msk ) + +#define FDCAN_IR_RFIF_Pos ( 13U ) +#define FDCAN_IR_RFIF_Msk ( 0x1UL << FDCAN_IR_RFIF_Pos ) +#define FDCAN_IR_RFIF ( FDCAN_IR_RFIF_Msk ) + +#define FDCAN_IR_RAFIF_Pos ( 12U ) +#define FDCAN_IR_RAFIF_Msk ( 0x1UL << FDCAN_IR_RAFIF_Pos ) +#define FDCAN_IR_RAFIF ( FDCAN_IR_RAFIF_Msk ) + +#define FDCAN_IR_TPIF_Pos ( 11U ) +#define FDCAN_IR_TPIF_Msk ( 0x1UL << FDCAN_IR_TPIF_Pos ) +#define FDCAN_IR_TPIF ( FDCAN_IR_TPIF_Msk ) + +#define FDCAN_IR_TSIF_Pos ( 10U ) +#define FDCAN_IR_TSIF_Msk ( 0x1UL << FDCAN_IR_TSIF_Pos ) +#define FDCAN_IR_TSIF ( FDCAN_IR_TSIF_Msk ) + +#define FDCAN_IR_EIF_Pos ( 9U ) +#define FDCAN_IR_EIF_Msk ( 0x1UL << FDCAN_IR_EIF_Pos ) +#define FDCAN_IR_EIF ( FDCAN_IR_EIF_Msk ) + +#define FDCAN_IR_AIF_Pos ( 8U ) +#define FDCAN_IR_AIF_Msk ( 0x1UL << FDCAN_IR_AIF_Pos ) +#define FDCAN_IR_AIF ( FDCAN_IR_AIF_Msk ) + +#define FDCAN_IR_RIE_Pos ( 7U ) +#define FDCAN_IR_RIE_Msk ( 0x1UL << FDCAN_IR_RIE_Pos ) +#define FDCAN_IR_RIE ( FDCAN_IR_RIE_Msk ) + +#define FDCAN_IR_ROIE_Pos ( 6U ) +#define FDCAN_IR_ROIE_Msk ( 0x1UL << FDCAN_IR_ROIE_Pos ) +#define FDCAN_IR_ROIE ( FDCAN_IR_ROIE_Msk ) + +#define FDCAN_IR_RFIE_Pos ( 5U ) +#define FDCAN_IR_RFIE_Msk ( 0x1UL << FDCAN_IR_RFIE_Pos ) +#define FDCAN_IR_RFIE ( FDCAN_IR_RFIE_Msk ) + +#define FDCAN_IR_RAFIE_Pos ( 4U ) +#define FDCAN_IR_RAFIE_Msk ( 0x1UL << FDCAN_IR_RAFIE_Pos ) +#define FDCAN_IR_RAFIE ( FDCAN_IR_RAFIE_Msk ) + +#define FDCAN_IR_TPIE_Pos ( 3U ) +#define FDCAN_IR_TPIE_Msk ( 0x1UL << FDCAN_IR_TPIE_Pos ) +#define FDCAN_IR_TPIE ( FDCAN_IR_TPIE_Msk ) + +#define FDCAN_IR_TSIE_Pos ( 2U ) +#define FDCAN_IR_TSIE_Msk ( 0x1UL << FDCAN_IR_TSIE_Pos ) +#define FDCAN_IR_TSIE ( FDCAN_IR_TSIE_Msk ) + +#define FDCAN_IR_EIE_Pos ( 1U ) +#define FDCAN_IR_EIE_Msk ( 0x1UL << FDCAN_IR_EIE_Pos ) +#define FDCAN_IR_EIE ( FDCAN_IR_EIE_Msk ) + +#define FDCAN_IR_TSFF_Pos ( 0U ) +#define FDCAN_IR_TSFF_Msk ( 0x1UL << FDCAN_IR_TSFF_Pos ) +#define FDCAN_IR_TSFF ( FDCAN_IR_TSFF_Msk ) + + +/*************** Bits definition for FDCAN_LIMIT **********************/ + +#define FDCAN_LIMIT_AFWL_Pos ( 4U ) +#define FDCAN_LIMIT_AFWL_Msk ( 0xfUL << FDCAN_LIMIT_AFWL_Pos ) +#define FDCAN_LIMIT_AFWL ( FDCAN_LIMIT_AFWL_Msk ) +#define FDCAN_LIMIT_AFWL_0 ( 0x1UL << FDCAN_LIMIT_AFWL_Pos ) +#define FDCAN_LIMIT_AFWL_1 ( 0x2UL << FDCAN_LIMIT_AFWL_Pos ) +#define FDCAN_LIMIT_AFWL_2 ( 0x4UL << FDCAN_LIMIT_AFWL_Pos ) +#define FDCAN_LIMIT_AFWL_3 ( 0x8UL << FDCAN_LIMIT_AFWL_Pos ) + +#define FDCAN_LIMIT_EWL_Pos ( 0U ) +#define FDCAN_LIMIT_EWL_Msk ( 0xfUL << FDCAN_LIMIT_EWL_Pos ) +#define FDCAN_LIMIT_EWL ( FDCAN_LIMIT_EWL_Msk ) +#define FDCAN_LIMIT_EWL_0 ( 0x1UL << FDCAN_LIMIT_EWL_Pos ) +#define FDCAN_LIMIT_EWL_1 ( 0x2UL << FDCAN_LIMIT_EWL_Pos ) +#define FDCAN_LIMIT_EWL_2 ( 0x4UL << FDCAN_LIMIT_EWL_Pos ) +#define FDCAN_LIMIT_EWL_3 ( 0x8UL << FDCAN_LIMIT_EWL_Pos ) + + +/*************** Bits definition for FDCAN_SBTR **********************/ + +#define FDCAN_SBTR_S_PRESC_Pos ( 24U ) +#define FDCAN_SBTR_S_PRESC_Msk ( 0xffUL << FDCAN_SBTR_S_PRESC_Pos ) +#define FDCAN_SBTR_S_PRESC ( FDCAN_SBTR_S_PRESC_Msk ) +#define FDCAN_SBTR_S_PRESC_0 ( 0x1UL << FDCAN_SBTR_S_PRESC_Pos ) +#define FDCAN_SBTR_S_PRESC_1 ( 0x2UL << FDCAN_SBTR_S_PRESC_Pos ) +#define FDCAN_SBTR_S_PRESC_2 ( 0x4UL << FDCAN_SBTR_S_PRESC_Pos ) +#define FDCAN_SBTR_S_PRESC_3 ( 0x8UL << FDCAN_SBTR_S_PRESC_Pos ) +#define FDCAN_SBTR_S_PRESC_4 ( 0x10UL << FDCAN_SBTR_S_PRESC_Pos ) +#define FDCAN_SBTR_S_PRESC_5 ( 0x20UL << FDCAN_SBTR_S_PRESC_Pos ) +#define FDCAN_SBTR_S_PRESC_6 ( 0x40UL << FDCAN_SBTR_S_PRESC_Pos ) +#define FDCAN_SBTR_S_PRESC_7 ( 0x80UL << FDCAN_SBTR_S_PRESC_Pos ) + +#define FDCAN_SBTR_S_SJW_Pos ( 16U ) +#define FDCAN_SBTR_S_SJW_Msk ( 0x7fUL << FDCAN_SBTR_S_SJW_Pos ) +#define FDCAN_SBTR_S_SJW ( FDCAN_SBTR_S_SJW_Msk ) +#define FDCAN_SBTR_S_SJW_0 ( 0x1UL << FDCAN_SBTR_S_SJW_Pos ) +#define FDCAN_SBTR_S_SJW_1 ( 0x2UL << FDCAN_SBTR_S_SJW_Pos ) +#define FDCAN_SBTR_S_SJW_2 ( 0x4UL << FDCAN_SBTR_S_SJW_Pos ) +#define FDCAN_SBTR_S_SJW_3 ( 0x8UL << FDCAN_SBTR_S_SJW_Pos ) +#define FDCAN_SBTR_S_SJW_4 ( 0x10UL << FDCAN_SBTR_S_SJW_Pos ) +#define FDCAN_SBTR_S_SJW_5 ( 0x20UL << FDCAN_SBTR_S_SJW_Pos ) +#define FDCAN_SBTR_S_SJW_6 ( 0x40UL << FDCAN_SBTR_S_SJW_Pos ) + +#define FDCAN_SBTR_S_SEG_2_Pos ( 8U ) +#define FDCAN_SBTR_S_SEG_2_Msk ( 0x7fUL << FDCAN_SBTR_S_SEG_2_Pos ) +#define FDCAN_SBTR_S_SEG_2 ( FDCAN_SBTR_S_SEG_2_Msk ) +#define FDCAN_SBTR_S_SEG_2_0 ( 0x1UL << FDCAN_SBTR_S_SEG_2_Pos ) +#define FDCAN_SBTR_S_SEG_2_1 ( 0x2UL << FDCAN_SBTR_S_SEG_2_Pos ) +#define FDCAN_SBTR_S_SEG_2_2 ( 0x4UL << FDCAN_SBTR_S_SEG_2_Pos ) +#define FDCAN_SBTR_S_SEG_2_3 ( 0x8UL << FDCAN_SBTR_S_SEG_2_Pos ) +#define FDCAN_SBTR_S_SEG_2_4 ( 0x10UL << FDCAN_SBTR_S_SEG_2_Pos ) +#define FDCAN_SBTR_S_SEG_2_5 ( 0x20UL << FDCAN_SBTR_S_SEG_2_Pos ) +#define FDCAN_SBTR_S_SEG_2_6 ( 0x40UL << FDCAN_SBTR_S_SEG_2_Pos ) + +#define FDCAN_SBTR_S_SEG_1_Pos ( 0U ) +#define FDCAN_SBTR_S_SEG_1_Msk ( 0xffUL << FDCAN_SBTR_S_SEG_1_Pos ) +#define FDCAN_SBTR_S_SEG_1 ( FDCAN_SBTR_S_SEG_1_Msk ) +#define FDCAN_SBTR_S_SEG_1_0 ( 0x1UL << FDCAN_SBTR_S_SEG_1_Pos ) +#define FDCAN_SBTR_S_SEG_1_1 ( 0x2UL << FDCAN_SBTR_S_SEG_1_Pos ) +#define FDCAN_SBTR_S_SEG_1_2 ( 0x4UL << FDCAN_SBTR_S_SEG_1_Pos ) +#define FDCAN_SBTR_S_SEG_1_3 ( 0x8UL << FDCAN_SBTR_S_SEG_1_Pos ) +#define FDCAN_SBTR_S_SEG_1_4 ( 0x10UL << FDCAN_SBTR_S_SEG_1_Pos ) +#define FDCAN_SBTR_S_SEG_1_5 ( 0x20UL << FDCAN_SBTR_S_SEG_1_Pos ) +#define FDCAN_SBTR_S_SEG_1_6 ( 0x40UL << FDCAN_SBTR_S_SEG_1_Pos ) +#define FDCAN_SBTR_S_SEG_1_7 ( 0x80UL << FDCAN_SBTR_S_SEG_1_Pos ) + + +/*************** Bits definition for FDCAN_FBTR **********************/ + +#define FDCAN_FBTR_F_PRESC_Pos ( 24U ) +#define FDCAN_FBTR_F_PRESC_Msk ( 0xffUL << FDCAN_FBTR_F_PRESC_Pos ) +#define FDCAN_FBTR_F_PRESC ( FDCAN_FBTR_F_PRESC_Msk ) +#define FDCAN_FBTR_F_PRESC_0 ( 0x1UL << FDCAN_FBTR_F_PRESC_Pos ) +#define FDCAN_FBTR_F_PRESC_1 ( 0x2UL << FDCAN_FBTR_F_PRESC_Pos ) +#define FDCAN_FBTR_F_PRESC_2 ( 0x4UL << FDCAN_FBTR_F_PRESC_Pos ) +#define FDCAN_FBTR_F_PRESC_3 ( 0x8UL << FDCAN_FBTR_F_PRESC_Pos ) +#define FDCAN_FBTR_F_PRESC_4 ( 0x10UL << FDCAN_FBTR_F_PRESC_Pos ) +#define FDCAN_FBTR_F_PRESC_5 ( 0x20UL << FDCAN_FBTR_F_PRESC_Pos ) +#define FDCAN_FBTR_F_PRESC_6 ( 0x40UL << FDCAN_FBTR_F_PRESC_Pos ) +#define FDCAN_FBTR_F_PRESC_7 ( 0x80UL << FDCAN_FBTR_F_PRESC_Pos ) + +#define FDCAN_FBTR_F_SJW_Pos ( 16U ) +#define FDCAN_FBTR_F_SJW_Msk ( 0xfUL << FDCAN_FBTR_F_SJW_Pos ) +#define FDCAN_FBTR_F_SJW ( FDCAN_FBTR_F_SJW_Msk ) +#define FDCAN_FBTR_F_SJW_0 ( 0x1UL << FDCAN_FBTR_F_SJW_Pos ) +#define FDCAN_FBTR_F_SJW_1 ( 0x2UL << FDCAN_FBTR_F_SJW_Pos ) +#define FDCAN_FBTR_F_SJW_2 ( 0x4UL << FDCAN_FBTR_F_SJW_Pos ) +#define FDCAN_FBTR_F_SJW_3 ( 0x8UL << FDCAN_FBTR_F_SJW_Pos ) + +#define FDCAN_FBTR_F_SEG_2_Pos ( 8U ) +#define FDCAN_FBTR_F_SEG_2_Msk ( 0xfUL << FDCAN_FBTR_F_SEG_2_Pos ) +#define FDCAN_FBTR_F_SEG_2 ( FDCAN_FBTR_F_SEG_2_Msk ) +#define FDCAN_FBTR_F_SEG_2_0 ( 0x1UL << FDCAN_FBTR_F_SEG_2_Pos ) +#define FDCAN_FBTR_F_SEG_2_1 ( 0x2UL << FDCAN_FBTR_F_SEG_2_Pos ) +#define FDCAN_FBTR_F_SEG_2_2 ( 0x4UL << FDCAN_FBTR_F_SEG_2_Pos ) +#define FDCAN_FBTR_F_SEG_2_3 ( 0x8UL << FDCAN_FBTR_F_SEG_2_Pos ) + +#define FDCAN_FBTR_F_SEG_1_Pos ( 0U ) +#define FDCAN_FBTR_F_SEG_1_Msk ( 0x1fUL << FDCAN_FBTR_F_SEG_1_Pos ) +#define FDCAN_FBTR_F_SEG_1 ( FDCAN_FBTR_F_SEG_1_Msk ) +#define FDCAN_FBTR_F_SEG_1_0 ( 0x1UL << FDCAN_FBTR_F_SEG_1_Pos ) +#define FDCAN_FBTR_F_SEG_1_1 ( 0x2UL << FDCAN_FBTR_F_SEG_1_Pos ) +#define FDCAN_FBTR_F_SEG_1_2 ( 0x4UL << FDCAN_FBTR_F_SEG_1_Pos ) +#define FDCAN_FBTR_F_SEG_1_3 ( 0x8UL << FDCAN_FBTR_F_SEG_1_Pos ) +#define FDCAN_FBTR_F_SEG_1_4 ( 0x10UL << FDCAN_FBTR_F_SEG_1_Pos ) + + +/*************** Bits definition for FDCAN_TDC **********************/ + +#define FDCAN_TDC_TDCEN_Pos ( 7U ) +#define FDCAN_TDC_TDCEN_Msk ( 0x1UL << FDCAN_TDC_TDCEN_Pos ) +#define FDCAN_TDC_TDCEN ( FDCAN_TDC_TDCEN_Msk ) + +#define FDCAN_TDC_SSPOFF_Pos ( 0U ) +#define FDCAN_TDC_SSPOFF_Msk ( 0x7fUL << FDCAN_TDC_SSPOFF_Pos ) +#define FDCAN_TDC_SSPOFF ( FDCAN_TDC_SSPOFF_Msk ) +#define FDCAN_TDC_SSPOFF_0 ( 0x1UL << FDCAN_TDC_SSPOFF_Pos ) +#define FDCAN_TDC_SSPOFF_1 ( 0x2UL << FDCAN_TDC_SSPOFF_Pos ) +#define FDCAN_TDC_SSPOFF_2 ( 0x4UL << FDCAN_TDC_SSPOFF_Pos ) +#define FDCAN_TDC_SSPOFF_3 ( 0x8UL << FDCAN_TDC_SSPOFF_Pos ) +#define FDCAN_TDC_SSPOFF_4 ( 0x10UL << FDCAN_TDC_SSPOFF_Pos ) +#define FDCAN_TDC_SSPOFF_5 ( 0x20UL << FDCAN_TDC_SSPOFF_Pos ) +#define FDCAN_TDC_SSPOFF_6 ( 0x40UL << FDCAN_TDC_SSPOFF_Pos ) + + +/*************** Bits definition for FDCAN_ECC **********************/ + +#define FDCAN_ECC_TECNT_Pos ( 24U ) +#define FDCAN_ECC_TECNT_Msk ( 0xffUL << FDCAN_ECC_TECNT_Pos ) +#define FDCAN_ECC_TECNT ( FDCAN_ECC_TECNT_Msk ) +#define FDCAN_ECC_TECNT_0 ( 0x1UL << FDCAN_ECC_TECNT_Pos ) +#define FDCAN_ECC_TECNT_1 ( 0x2UL << FDCAN_ECC_TECNT_Pos ) +#define FDCAN_ECC_TECNT_2 ( 0x4UL << FDCAN_ECC_TECNT_Pos ) +#define FDCAN_ECC_TECNT_3 ( 0x8UL << FDCAN_ECC_TECNT_Pos ) +#define FDCAN_ECC_TECNT_4 ( 0x10UL << FDCAN_ECC_TECNT_Pos ) +#define FDCAN_ECC_TECNT_5 ( 0x20UL << FDCAN_ECC_TECNT_Pos ) +#define FDCAN_ECC_TECNT_6 ( 0x40UL << FDCAN_ECC_TECNT_Pos ) +#define FDCAN_ECC_TECNT_7 ( 0x80UL << FDCAN_ECC_TECNT_Pos ) + +#define FDCAN_ECC_RECNT_Pos ( 16U ) +#define FDCAN_ECC_RECNT_Msk ( 0xffUL << FDCAN_ECC_RECNT_Pos ) +#define FDCAN_ECC_RECNT ( FDCAN_ECC_RECNT_Msk ) +#define FDCAN_ECC_RECNT_0 ( 0x1UL << FDCAN_ECC_RECNT_Pos ) +#define FDCAN_ECC_RECNT_1 ( 0x2UL << FDCAN_ECC_RECNT_Pos ) +#define FDCAN_ECC_RECNT_2 ( 0x4UL << FDCAN_ECC_RECNT_Pos ) +#define FDCAN_ECC_RECNT_3 ( 0x8UL << FDCAN_ECC_RECNT_Pos ) +#define FDCAN_ECC_RECNT_4 ( 0x10UL << FDCAN_ECC_RECNT_Pos ) +#define FDCAN_ECC_RECNT_5 ( 0x20UL << FDCAN_ECC_RECNT_Pos ) +#define FDCAN_ECC_RECNT_6 ( 0x40UL << FDCAN_ECC_RECNT_Pos ) +#define FDCAN_ECC_RECNT_7 ( 0x80UL << FDCAN_ECC_RECNT_Pos ) + +#define FDCAN_ECC_KOER_Pos ( 5U ) +#define FDCAN_ECC_KOER_Msk ( 0x7UL << FDCAN_ECC_KOER_Pos ) +#define FDCAN_ECC_KOER ( FDCAN_ECC_KOER_Msk ) +#define FDCAN_ECC_KOER_0 ( 0x1UL << FDCAN_ECC_KOER_Pos ) +#define FDCAN_ECC_KOER_1 ( 0x2UL << FDCAN_ECC_KOER_Pos ) +#define FDCAN_ECC_KOER_2 ( 0x4UL << FDCAN_ECC_KOER_Pos ) + +#define FDCAN_ECC_ALC_Pos ( 0U ) +#define FDCAN_ECC_ALC_Msk ( 0x1fUL << FDCAN_ECC_ALC_Pos ) +#define FDCAN_ECC_ALC ( FDCAN_ECC_ALC_Msk ) +#define FDCAN_ECC_ALC_0 ( 0x1UL << FDCAN_ECC_ALC_Pos ) +#define FDCAN_ECC_ALC_1 ( 0x2UL << FDCAN_ECC_ALC_Pos ) +#define FDCAN_ECC_ALC_2 ( 0x4UL << FDCAN_ECC_ALC_Pos ) +#define FDCAN_ECC_ALC_3 ( 0x8UL << FDCAN_ECC_ALC_Pos ) +#define FDCAN_ECC_ALC_4 ( 0x10UL << FDCAN_ECC_ALC_Pos ) + + +/*************** Bits definition for FDCAN_ACFCR **********************/ + +#define FDCAN_ACFCR_AE_Pos ( 16U ) +#define FDCAN_ACFCR_AE_Msk ( 0xffffUL << FDCAN_ACFCR_AE_Pos ) +#define FDCAN_ACFCR_AE ( FDCAN_ACFCR_AE_Msk ) + +#define FDCAN_ACFCR_SELMASK_Pos ( 5U ) +#define FDCAN_ACFCR_SELMASK_Msk ( 0x1UL << FDCAN_ACFCR_SELMASK_Pos ) +#define FDCAN_ACFCR_SELMASK ( FDCAN_ACFCR_SELMASK_Msk ) + +#define FDCAN_ACFCR_ACFADR_Pos ( 0U ) +#define FDCAN_ACFCR_ACFADR_Msk ( 0xfUL << FDCAN_ACFCR_ACFADR_Pos ) +#define FDCAN_ACFCR_ACFADR ( FDCAN_ACFCR_ACFADR_Msk ) +#define FDCAN_ACFCR_ACFADR_0 ( 0x1UL << FDCAN_ACFCR_ACFADR_Pos ) +#define FDCAN_ACFCR_ACFADR_1 ( 0x2UL << FDCAN_ACFCR_ACFADR_Pos ) +#define FDCAN_ACFCR_ACFADR_2 ( 0x4UL << FDCAN_ACFCR_ACFADR_Pos ) +#define FDCAN_ACFCR_ACFADR_3 ( 0x8UL << FDCAN_ACFCR_ACFADR_Pos ) + + +/*************** Bits definition for FDCAN_ACODR **********************/ + +#define FDCAN_ACODR_AIDEE_Pos ( 30U ) +#define FDCAN_ACODR_AIDEE_Msk ( 0x1UL << FDCAN_ACODR_AIDEE_Pos ) +#define FDCAN_ACODR_AIDEE ( FDCAN_ACODR_AIDEE_Msk ) + +#define FDCAN_ACODR_AIDE_Pos ( 29U ) +#define FDCAN_ACODR_AIDE_Msk ( 0x1UL << FDCAN_ACODR_AIDE_Pos ) +#define FDCAN_ACODR_AIDE ( FDCAN_ACODR_AIDE_Msk ) + +#define FDCAN_ACODR_ACODE_AMASK_Pos ( 0U ) +#define FDCAN_ACODR_ACODE_AMASK_Msk ( 0x1fffffffUL << FDCAN_ACODR_ACODE_AMASK_Pos ) +#define FDCAN_ACODR_ACODE_AMASK ( FDCAN_ACODR_ACODE_AMASK_Msk ) + + +/*************** Bits definition for FDCAN_TIMCFG **********************/ + +#define FDCAN_TIMCFG_TIMEPOS_Pos ( 1U ) +#define FDCAN_TIMCFG_TIMEPOS_Msk ( 0x1UL << FDCAN_TIMCFG_TIMEPOS_Pos ) +#define FDCAN_TIMCFG_TIMEPOS ( FDCAN_TIMCFG_TIMEPOS_Msk ) + +#define FDCAN_TIMCFG_TIMEEN_Pos ( 0U ) +#define FDCAN_TIMCFG_TIMEEN_Msk ( 0x1UL << FDCAN_TIMCFG_TIMEEN_Pos ) +#define FDCAN_TIMCFG_TIMEEN ( FDCAN_TIMCFG_TIMEEN_Msk ) + + +/*************** Bits definition for FDCAN_VER **********************/ + +#define FDCAN_VER_VER_Pos ( 0U ) +#define FDCAN_VER_VER_Msk ( 0xffffUL << FDCAN_VER_VER_Pos ) +#define FDCAN_VER_VER ( FDCAN_VER_VER_Msk ) + + +/*************** Bits definition for FDCAN_TTCFG **********************/ + +#define FDCAN_TTCFG_REFMSGIE_Pos ( 17U ) +#define FDCAN_TTCFG_REFMSGIE_Msk ( 0x1UL << FDCAN_TTCFG_REFMSGIE_Pos ) +#define FDCAN_TTCFG_REFMSGIE ( FDCAN_TTCFG_REFMSGIE_Msk ) + +#define FDCAN_TTCFG_REFMSGIF_Pos ( 16U ) +#define FDCAN_TTCFG_REFMSGIF_Msk ( 0x1UL << FDCAN_TTCFG_REFMSGIF_Pos ) +#define FDCAN_TTCFG_REFMSGIF ( FDCAN_TTCFG_REFMSGIF_Msk ) + +#define FDCAN_TTCFG_WTIE_Pos ( 15U ) +#define FDCAN_TTCFG_WTIE_Msk ( 0x1UL << FDCAN_TTCFG_WTIE_Pos ) +#define FDCAN_TTCFG_WTIE ( FDCAN_TTCFG_WTIE_Msk ) + +#define FDCAN_TTCFG_WTIF_Pos ( 14U ) +#define FDCAN_TTCFG_WTIF_Msk ( 0x1UL << FDCAN_TTCFG_WTIF_Pos ) +#define FDCAN_TTCFG_WTIF ( FDCAN_TTCFG_WTIF_Msk ) + +#define FDCAN_TTCFG_TEIF_Pos ( 13U ) +#define FDCAN_TTCFG_TEIF_Msk ( 0x1UL << FDCAN_TTCFG_TEIF_Pos ) +#define FDCAN_TTCFG_TEIF ( FDCAN_TTCFG_TEIF_Msk ) + +#define FDCAN_TTCFG_TTIE_Pos ( 12U ) +#define FDCAN_TTCFG_TTIE_Msk ( 0x1UL << FDCAN_TTCFG_TTIE_Pos ) +#define FDCAN_TTCFG_TTIE ( FDCAN_TTCFG_TTIE_Msk ) + +#define FDCAN_TTCFG_TTIF_Pos ( 11U ) +#define FDCAN_TTCFG_TTIF_Msk ( 0x1UL << FDCAN_TTCFG_TTIF_Pos ) +#define FDCAN_TTCFG_TTIF ( FDCAN_TTCFG_TTIF_Msk ) + +#define FDCAN_TTCFG_T_PRESC_Pos ( 9U ) +#define FDCAN_TTCFG_T_PRESC_Msk ( 0x3UL << FDCAN_TTCFG_T_PRESC_Pos ) +#define FDCAN_TTCFG_T_PRESC ( FDCAN_TTCFG_T_PRESC_Msk ) +#define FDCAN_TTCFG_T_PRESC_0 ( 0x1UL << FDCAN_TTCFG_T_PRESC_Pos ) +#define FDCAN_TTCFG_T_PRESC_1 ( 0x2UL << FDCAN_TTCFG_T_PRESC_Pos ) + +#define FDCAN_TTCFG_TTEN_Pos ( 8U ) +#define FDCAN_TTCFG_TTEN_Msk ( 0x1UL << FDCAN_TTCFG_TTEN_Pos ) +#define FDCAN_TTCFG_TTEN ( FDCAN_TTCFG_TTEN_Msk ) + +#define FDCAN_TTCFG_TBE_Pos ( 7U ) +#define FDCAN_TTCFG_TBE_Msk ( 0x1UL << FDCAN_TTCFG_TBE_Pos ) +#define FDCAN_TTCFG_TBE ( FDCAN_TTCFG_TBE_Msk ) + +#define FDCAN_TTCFG_TBF_Pos ( 6U ) +#define FDCAN_TTCFG_TBF_Msk ( 0x1UL << FDCAN_TTCFG_TBF_Pos ) +#define FDCAN_TTCFG_TBF ( FDCAN_TTCFG_TBF_Msk ) + +#define FDCAN_TTCFG_TBPTR_Pos ( 0U ) +#define FDCAN_TTCFG_TBPTR_Msk ( 0x3fUL << FDCAN_TTCFG_TBPTR_Pos ) +#define FDCAN_TTCFG_TBPTR ( FDCAN_TTCFG_TBPTR_Msk ) +#define FDCAN_TTCFG_TBPTR_0 ( 0x1UL << FDCAN_TTCFG_TBPTR_Pos ) +#define FDCAN_TTCFG_TBPTR_1 ( 0x2UL << FDCAN_TTCFG_TBPTR_Pos ) +#define FDCAN_TTCFG_TBPTR_2 ( 0x4UL << FDCAN_TTCFG_TBPTR_Pos ) +#define FDCAN_TTCFG_TBPTR_3 ( 0x8UL << FDCAN_TTCFG_TBPTR_Pos ) +#define FDCAN_TTCFG_TBPTR_4 ( 0x10UL << FDCAN_TTCFG_TBPTR_Pos ) +#define FDCAN_TTCFG_TBPTR_5 ( 0x20UL << FDCAN_TTCFG_TBPTR_Pos ) + + +/*************** Bits definition for FDCAN_REFMSG **********************/ + +#define FDCAN_REFMSG_REF_IDE_Pos ( 31U ) +#define FDCAN_REFMSG_REF_IDE_Msk ( 0x1UL << FDCAN_REFMSG_REF_IDE_Pos ) +#define FDCAN_REFMSG_REF_IDE ( FDCAN_REFMSG_REF_IDE_Msk ) + +#define FDCAN_REFMSG_REF_ID_Pos ( 0U ) +#define FDCAN_REFMSG_REF_ID_Msk ( 0x1fffffffUL << FDCAN_REFMSG_REF_ID_Pos ) +#define FDCAN_REFMSG_REF_ID ( FDCAN_REFMSG_REF_ID_Msk ) + + +/*************** Bits definition for FDCAN_TTTRIGR **********************/ + +#define FDCAN_TTTRIGR_TT_TRIG_Pos ( 16U ) +#define FDCAN_TTTRIGR_TT_TRIG_Msk ( 0xffffUL << FDCAN_TTTRIGR_TT_TRIG_Pos ) +#define FDCAN_TTTRIGR_TT_TRIG ( FDCAN_TTTRIGR_TT_TRIG_Msk ) + +#define FDCAN_TTTRIGR_TEW_Pos ( 12U ) +#define FDCAN_TTTRIGR_TEW_Msk ( 0xfUL << FDCAN_TTTRIGR_TEW_Pos ) +#define FDCAN_TTTRIGR_TEW ( FDCAN_TTTRIGR_TEW_Msk ) +#define FDCAN_TTTRIGR_TEW_0 ( 0x1UL << FDCAN_TTTRIGR_TEW_Pos ) +#define FDCAN_TTTRIGR_TEW_1 ( 0x2UL << FDCAN_TTTRIGR_TEW_Pos ) +#define FDCAN_TTTRIGR_TEW_2 ( 0x4UL << FDCAN_TTTRIGR_TEW_Pos ) +#define FDCAN_TTTRIGR_TEW_3 ( 0x8UL << FDCAN_TTTRIGR_TEW_Pos ) + +#define FDCAN_TTTRIGR_TTYPE_Pos ( 8U ) +#define FDCAN_TTTRIGR_TTYPE_Msk ( 0x7UL << FDCAN_TTTRIGR_TTYPE_Pos ) +#define FDCAN_TTTRIGR_TTYPE ( FDCAN_TTTRIGR_TTYPE_Msk ) +#define FDCAN_TTTRIGR_TTYPE_0 ( 0x1UL << FDCAN_TTTRIGR_TTYPE_Pos ) +#define FDCAN_TTTRIGR_TTYPE_1 ( 0x2UL << FDCAN_TTTRIGR_TTYPE_Pos ) +#define FDCAN_TTTRIGR_TTYPE_2 ( 0x4UL << FDCAN_TTTRIGR_TTYPE_Pos ) + +#define FDCAN_TTTRIGR_TTPTR_Pos ( 0U ) +#define FDCAN_TTTRIGR_TTPTR_Msk ( 0x3fUL << FDCAN_TTTRIGR_TTPTR_Pos ) +#define FDCAN_TTTRIGR_TTPTR ( FDCAN_TTTRIGR_TTPTR_Msk ) +#define FDCAN_TTTRIGR_TTPTR_0 ( 0x1UL << FDCAN_TTTRIGR_TTPTR_Pos ) +#define FDCAN_TTTRIGR_TTPTR_1 ( 0x2UL << FDCAN_TTTRIGR_TTPTR_Pos ) +#define FDCAN_TTTRIGR_TTPTR_2 ( 0x4UL << FDCAN_TTTRIGR_TTPTR_Pos ) +#define FDCAN_TTTRIGR_TTPTR_3 ( 0x8UL << FDCAN_TTTRIGR_TTPTR_Pos ) +#define FDCAN_TTTRIGR_TTPTR_4 ( 0x10UL << FDCAN_TTTRIGR_TTPTR_Pos ) +#define FDCAN_TTTRIGR_TTPTR_5 ( 0x20UL << FDCAN_TTTRIGR_TTPTR_Pos ) + + +/*************** Bits definition for FDCAN_WTRIGR **********************/ + +#define FDCAN_WTRIGR_TT_WTRIG_Pos ( 0U ) +#define FDCAN_WTRIGR_TT_WTRIG_Msk ( 0xffffUL << FDCAN_WTRIGR_TT_WTRIG_Pos ) +#define FDCAN_WTRIGR_TT_WTRIG ( FDCAN_WTRIGR_TT_WTRIG_Msk ) + + +/*************** Bits definition for LPUART_RXDR **********************/ + +#define LPUART_RXDR_RXDATA_Pos ( 0U ) +#define LPUART_RXDR_RXDATA_Msk ( 0xffUL << LPUART_RXDR_RXDATA_Pos ) +#define LPUART_RXDR_RXDATA ( LPUART_RXDR_RXDATA_Msk ) +#define LPUART_RXDR_RXDATA_0 ( 0x1UL << LPUART_RXDR_RXDATA_Pos ) +#define LPUART_RXDR_RXDATA_1 ( 0x2UL << LPUART_RXDR_RXDATA_Pos ) +#define LPUART_RXDR_RXDATA_2 ( 0x4UL << LPUART_RXDR_RXDATA_Pos ) +#define LPUART_RXDR_RXDATA_3 ( 0x8UL << LPUART_RXDR_RXDATA_Pos ) +#define LPUART_RXDR_RXDATA_4 ( 0x10UL << LPUART_RXDR_RXDATA_Pos ) +#define LPUART_RXDR_RXDATA_5 ( 0x20UL << LPUART_RXDR_RXDATA_Pos ) +#define LPUART_RXDR_RXDATA_6 ( 0x40UL << LPUART_RXDR_RXDATA_Pos ) +#define LPUART_RXDR_RXDATA_7 ( 0x80UL << LPUART_RXDR_RXDATA_Pos ) + + +/*************** Bits definition for LPUART_TXDR **********************/ + +#define LPUART_TXDR_TXDATA_Pos ( 0U ) +#define LPUART_TXDR_TXDATA_Msk ( 0xffUL << LPUART_TXDR_TXDATA_Pos ) +#define LPUART_TXDR_TXDATA ( LPUART_TXDR_TXDATA_Msk ) +#define LPUART_TXDR_TXDATA_0 ( 0x1UL << LPUART_TXDR_TXDATA_Pos ) +#define LPUART_TXDR_TXDATA_1 ( 0x2UL << LPUART_TXDR_TXDATA_Pos ) +#define LPUART_TXDR_TXDATA_2 ( 0x4UL << LPUART_TXDR_TXDATA_Pos ) +#define LPUART_TXDR_TXDATA_3 ( 0x8UL << LPUART_TXDR_TXDATA_Pos ) +#define LPUART_TXDR_TXDATA_4 ( 0x10UL << LPUART_TXDR_TXDATA_Pos ) +#define LPUART_TXDR_TXDATA_5 ( 0x20UL << LPUART_TXDR_TXDATA_Pos ) +#define LPUART_TXDR_TXDATA_6 ( 0x40UL << LPUART_TXDR_TXDATA_Pos ) +#define LPUART_TXDR_TXDATA_7 ( 0x80UL << LPUART_TXDR_TXDATA_Pos ) + + +/*************** Bits definition for LPUART_LCR **********************/ + +#define LPUART_LCR_BCNT_VALUE_Pos ( 16U ) +#define LPUART_LCR_BCNT_VALUE_Msk ( 0xffffUL << LPUART_LCR_BCNT_VALUE_Pos ) +#define LPUART_LCR_BCNT_VALUE ( LPUART_LCR_BCNT_VALUE_Msk ) + +#define LPUART_LCR_AUTO_START_EN_Pos ( 15U ) +#define LPUART_LCR_AUTO_START_EN_Msk ( 0x1UL << LPUART_LCR_AUTO_START_EN_Pos ) +#define LPUART_LCR_AUTO_START_EN ( LPUART_LCR_AUTO_START_EN_Msk ) + +#define LPUART_LCR_TXPOL_Pos ( 9U ) +#define LPUART_LCR_TXPOL_Msk ( 0x1UL << LPUART_LCR_TXPOL_Pos ) +#define LPUART_LCR_TXPOL ( LPUART_LCR_TXPOL_Msk ) + +#define LPUART_LCR_RXPOL_Pos ( 8U ) +#define LPUART_LCR_RXPOL_Msk ( 0x1UL << LPUART_LCR_RXPOL_Pos ) +#define LPUART_LCR_RXPOL ( LPUART_LCR_RXPOL_Msk ) + +#define LPUART_LCR_WKCK_Pos ( 7U ) +#define LPUART_LCR_WKCK_Msk ( 0x1UL << LPUART_LCR_WKCK_Pos ) +#define LPUART_LCR_WKCK ( LPUART_LCR_WKCK_Msk ) + +#define LPUART_LCR_RXWKS_Pos ( 5U ) +#define LPUART_LCR_RXWKS_Msk ( 0x3UL << LPUART_LCR_RXWKS_Pos ) +#define LPUART_LCR_RXWKS ( LPUART_LCR_RXWKS_Msk ) +#define LPUART_LCR_RXWKS_0 ( 0x1UL << LPUART_LCR_RXWKS_Pos ) +#define LPUART_LCR_RXWKS_1 ( 0x2UL << LPUART_LCR_RXWKS_Pos ) + +#define LPUART_LCR_WLEN_Pos ( 4U ) +#define LPUART_LCR_WLEN_Msk ( 0x1UL << LPUART_LCR_WLEN_Pos ) +#define LPUART_LCR_WLEN ( LPUART_LCR_WLEN_Msk ) + +#define LPUART_LCR_STP2_Pos ( 3U ) +#define LPUART_LCR_STP2_Msk ( 0x1UL << LPUART_LCR_STP2_Pos ) +#define LPUART_LCR_STP2 ( LPUART_LCR_STP2_Msk ) + +#define LPUART_LCR_EPS_Pos ( 2U ) +#define LPUART_LCR_EPS_Msk ( 0x1UL << LPUART_LCR_EPS_Pos ) +#define LPUART_LCR_EPS ( LPUART_LCR_EPS_Msk ) + +#define LPUART_LCR_SPS_Pos ( 1U ) +#define LPUART_LCR_SPS_Msk ( 0x1UL << LPUART_LCR_SPS_Pos ) +#define LPUART_LCR_SPS ( LPUART_LCR_SPS_Msk ) + +#define LPUART_LCR_PEN_Pos ( 0U ) +#define LPUART_LCR_PEN_Msk ( 0x1UL << LPUART_LCR_PEN_Pos ) +#define LPUART_LCR_PEN ( LPUART_LCR_PEN_Msk ) + + +/*************** Bits definition for LPUART_CR **********************/ + +#define LPUART_CR_DMA_EN_Pos ( 2U ) +#define LPUART_CR_DMA_EN_Msk ( 0x1UL << LPUART_CR_DMA_EN_Pos ) +#define LPUART_CR_DMA_EN ( LPUART_CR_DMA_EN_Msk ) + +#define LPUART_CR_TX_EN_Pos ( 1U ) +#define LPUART_CR_TX_EN_Msk ( 0x1UL << LPUART_CR_TX_EN_Pos ) +#define LPUART_CR_TX_EN ( LPUART_CR_TX_EN_Msk ) + +#define LPUART_CR_RX_EN_Pos ( 0U ) +#define LPUART_CR_RX_EN_Msk ( 0x1UL << LPUART_CR_RX_EN_Pos ) +#define LPUART_CR_RX_EN ( LPUART_CR_RX_EN_Msk ) + + +/*************** Bits definition for LPUART_IBAUD **********************/ + +#define LPUART_IBAUD_RXSAM_Pos ( 8U ) +#define LPUART_IBAUD_RXSAM_Msk ( 0xffUL << LPUART_IBAUD_RXSAM_Pos ) +#define LPUART_IBAUD_RXSAM ( LPUART_IBAUD_RXSAM_Msk ) +#define LPUART_IBAUD_RXSAM_0 ( 0x1UL << LPUART_IBAUD_RXSAM_Pos ) +#define LPUART_IBAUD_RXSAM_1 ( 0x2UL << LPUART_IBAUD_RXSAM_Pos ) +#define LPUART_IBAUD_RXSAM_2 ( 0x4UL << LPUART_IBAUD_RXSAM_Pos ) +#define LPUART_IBAUD_RXSAM_3 ( 0x8UL << LPUART_IBAUD_RXSAM_Pos ) +#define LPUART_IBAUD_RXSAM_4 ( 0x10UL << LPUART_IBAUD_RXSAM_Pos ) +#define LPUART_IBAUD_RXSAM_5 ( 0x20UL << LPUART_IBAUD_RXSAM_Pos ) +#define LPUART_IBAUD_RXSAM_6 ( 0x40UL << LPUART_IBAUD_RXSAM_Pos ) +#define LPUART_IBAUD_RXSAM_7 ( 0x80UL << LPUART_IBAUD_RXSAM_Pos ) + +#define LPUART_IBAUD_IBAUD_Pos ( 0U ) +#define LPUART_IBAUD_IBAUD_Msk ( 0xffUL << LPUART_IBAUD_IBAUD_Pos ) +#define LPUART_IBAUD_IBAUD ( LPUART_IBAUD_IBAUD_Msk ) +#define LPUART_IBAUD_IBAUD_0 ( 0x1UL << LPUART_IBAUD_IBAUD_Pos ) +#define LPUART_IBAUD_IBAUD_1 ( 0x2UL << LPUART_IBAUD_IBAUD_Pos ) +#define LPUART_IBAUD_IBAUD_2 ( 0x4UL << LPUART_IBAUD_IBAUD_Pos ) +#define LPUART_IBAUD_IBAUD_3 ( 0x8UL << LPUART_IBAUD_IBAUD_Pos ) +#define LPUART_IBAUD_IBAUD_4 ( 0x10UL << LPUART_IBAUD_IBAUD_Pos ) +#define LPUART_IBAUD_IBAUD_5 ( 0x20UL << LPUART_IBAUD_IBAUD_Pos ) +#define LPUART_IBAUD_IBAUD_6 ( 0x40UL << LPUART_IBAUD_IBAUD_Pos ) +#define LPUART_IBAUD_IBAUD_7 ( 0x80UL << LPUART_IBAUD_IBAUD_Pos ) + + +/*************** Bits definition for LPUART_FBAUD **********************/ + +#define LPUART_FBAUD_FBAUD_Pos ( 0U ) +#define LPUART_FBAUD_FBAUD_Msk ( 0xfffUL << LPUART_FBAUD_FBAUD_Pos ) +#define LPUART_FBAUD_FBAUD ( LPUART_FBAUD_FBAUD_Msk ) + + +/*************** Bits definition for LPUART_IE **********************/ + +#define LPUART_IE_IDLEIE_Pos ( 17U ) +#define LPUART_IE_IDLEIE_Msk ( 0x1UL << LPUART_IE_IDLEIE_Pos ) +#define LPUART_IE_IDLEIE ( LPUART_IE_IDLEIE_Msk ) + +#define LPUART_IE_BCNTIE_Pos ( 16U ) +#define LPUART_IE_BCNTIE_Msk ( 0x1UL << LPUART_IE_BCNTIE_Pos ) +#define LPUART_IE_BCNTIE ( LPUART_IE_BCNTIE_Msk ) + +#define LPUART_IE_STARTIE_Pos ( 9U ) +#define LPUART_IE_STARTIE_Msk ( 0x1UL << LPUART_IE_STARTIE_Pos ) +#define LPUART_IE_STARTIE ( LPUART_IE_STARTIE_Msk ) + +#define LPUART_IE_MATCHIE_Pos ( 8U ) +#define LPUART_IE_MATCHIE_Msk ( 0x1UL << LPUART_IE_MATCHIE_Pos ) +#define LPUART_IE_MATCHIE ( LPUART_IE_MATCHIE_Msk ) + +#define LPUART_IE_RXOVIE_Pos ( 5U ) +#define LPUART_IE_RXOVIE_Msk ( 0x1UL << LPUART_IE_RXOVIE_Pos ) +#define LPUART_IE_RXOVIE ( LPUART_IE_RXOVIE_Msk ) + +#define LPUART_IE_FEIE_Pos ( 4U ) +#define LPUART_IE_FEIE_Msk ( 0x1UL << LPUART_IE_FEIE_Pos ) +#define LPUART_IE_FEIE ( LPUART_IE_FEIE_Msk ) + +#define LPUART_IE_PEIE_Pos ( 3U ) +#define LPUART_IE_PEIE_Msk ( 0x1UL << LPUART_IE_PEIE_Pos ) +#define LPUART_IE_PEIE ( LPUART_IE_PEIE_Msk ) + +#define LPUART_IE_TXEIE_Pos ( 2U ) +#define LPUART_IE_TXEIE_Msk ( 0x1UL << LPUART_IE_TXEIE_Pos ) +#define LPUART_IE_TXEIE ( LPUART_IE_TXEIE_Msk ) + +#define LPUART_IE_TCIE_Pos ( 1U ) +#define LPUART_IE_TCIE_Msk ( 0x1UL << LPUART_IE_TCIE_Pos ) +#define LPUART_IE_TCIE ( LPUART_IE_TCIE_Msk ) + +#define LPUART_IE_RXIE_Pos ( 0U ) +#define LPUART_IE_RXIE_Msk ( 0x1UL << LPUART_IE_RXIE_Pos ) +#define LPUART_IE_RXIE ( LPUART_IE_RXIE_Msk ) + + +/*************** Bits definition for LPUART_SR **********************/ + +#define LPUART_SR_IDLEIF_Pos ( 17U ) +#define LPUART_SR_IDLEIF_Msk ( 0x1UL << LPUART_SR_IDLEIF_Pos ) +#define LPUART_SR_IDLEIF ( LPUART_SR_IDLEIF_Msk ) + +#define LPUART_SR_BCNTIF_Pos ( 16U ) +#define LPUART_SR_BCNTIF_Msk ( 0x1UL << LPUART_SR_BCNTIF_Pos ) +#define LPUART_SR_BCNTIF ( LPUART_SR_BCNTIF_Msk ) + +#define LPUART_SR_TXE_Pos ( 10U ) +#define LPUART_SR_TXE_Msk ( 0x1UL << LPUART_SR_TXE_Pos ) +#define LPUART_SR_TXE ( LPUART_SR_TXE_Msk ) + +#define LPUART_SR_STARTIF_Pos ( 9U ) +#define LPUART_SR_STARTIF_Msk ( 0x1UL << LPUART_SR_STARTIF_Pos ) +#define LPUART_SR_STARTIF ( LPUART_SR_STARTIF_Msk ) + +#define LPUART_SR_MATCHIF_Pos ( 8U ) +#define LPUART_SR_MATCHIF_Msk ( 0x1UL << LPUART_SR_MATCHIF_Pos ) +#define LPUART_SR_MATCHIF ( LPUART_SR_MATCHIF_Msk ) + +#define LPUART_SR_TXOVF_Pos ( 7U ) +#define LPUART_SR_TXOVF_Msk ( 0x1UL << LPUART_SR_TXOVF_Pos ) +#define LPUART_SR_TXOVF ( LPUART_SR_TXOVF_Msk ) + +#define LPUART_SR_RXF_Pos ( 6U ) +#define LPUART_SR_RXF_Msk ( 0x1UL << LPUART_SR_RXF_Pos ) +#define LPUART_SR_RXF ( LPUART_SR_RXF_Msk ) + +#define LPUART_SR_RXOVIF_Pos ( 5U ) +#define LPUART_SR_RXOVIF_Msk ( 0x1UL << LPUART_SR_RXOVIF_Pos ) +#define LPUART_SR_RXOVIF ( LPUART_SR_RXOVIF_Msk ) + +#define LPUART_SR_FEIF_Pos ( 4U ) +#define LPUART_SR_FEIF_Msk ( 0x1UL << LPUART_SR_FEIF_Pos ) +#define LPUART_SR_FEIF ( LPUART_SR_FEIF_Msk ) + +#define LPUART_SR_PEIF_Pos ( 3U ) +#define LPUART_SR_PEIF_Msk ( 0x1UL << LPUART_SR_PEIF_Pos ) +#define LPUART_SR_PEIF ( LPUART_SR_PEIF_Msk ) + +#define LPUART_SR_TXEIF_Pos ( 2U ) +#define LPUART_SR_TXEIF_Msk ( 0x1UL << LPUART_SR_TXEIF_Pos ) +#define LPUART_SR_TXEIF ( LPUART_SR_TXEIF_Msk ) + +#define LPUART_SR_TCIF_Pos ( 1U ) +#define LPUART_SR_TCIF_Msk ( 0x1UL << LPUART_SR_TCIF_Pos ) +#define LPUART_SR_TCIF ( LPUART_SR_TCIF_Msk ) + +#define LPUART_SR_RXIF_Pos ( 0U ) +#define LPUART_SR_RXIF_Msk ( 0x1UL << LPUART_SR_RXIF_Pos ) +#define LPUART_SR_RXIF ( LPUART_SR_RXIF_Msk ) + + +/*************** Bits definition for LPUART_ADDR **********************/ + +#define LPUART_ADDR_ADDR_Pos ( 0U ) +#define LPUART_ADDR_ADDR_Msk ( 0xffUL << LPUART_ADDR_ADDR_Pos ) +#define LPUART_ADDR_ADDR ( LPUART_ADDR_ADDR_Msk ) +#define LPUART_ADDR_ADDR_0 ( 0x1UL << LPUART_ADDR_ADDR_Pos ) +#define LPUART_ADDR_ADDR_1 ( 0x2UL << LPUART_ADDR_ADDR_Pos ) +#define LPUART_ADDR_ADDR_2 ( 0x4UL << LPUART_ADDR_ADDR_Pos ) +#define LPUART_ADDR_ADDR_3 ( 0x8UL << LPUART_ADDR_ADDR_Pos ) +#define LPUART_ADDR_ADDR_4 ( 0x10UL << LPUART_ADDR_ADDR_Pos ) +#define LPUART_ADDR_ADDR_5 ( 0x20UL << LPUART_ADDR_ADDR_Pos ) +#define LPUART_ADDR_ADDR_6 ( 0x40UL << LPUART_ADDR_ADDR_Pos ) +#define LPUART_ADDR_ADDR_7 ( 0x80UL << LPUART_ADDR_ADDR_Pos ) + + +/*************** Bits definition for I2S_TXDR **********************/ + +#define I2S_TXDR_TXDR_Pos ( 0 ) +#define I2S_TXDR_TXDR_Msk ( 0xFFFFFFFFUL << I2S_TXDR_TXDR_Pos ) +#define I2S_TXDR_TXDR ( I2S_TXDR_TXDR_Msk ) + +/*************** Bits definition for I2S_RXDR **********************/ + +#define I2S_RXDR_RXDR_Pos ( 0U ) +#define I2S_RXDR_RXDR_Msk ( 0xFFFFFFFFUL << I2S_RXDR_RXDR_Pos ) +#define I2S_RXDR_RXDR ( I2S_RXDR_RXDR_Msk ) + +/*************** Bits definition for I2S_CR **********************/ + +#define I2S_CR_TXDMAEN_Pos ( 16U ) +#define I2S_CR_TXDMAEN_Msk ( 0x1UL << I2S_CR_TXDMAEN_Pos ) +#define I2S_CR_TXDMAEN ( I2S_CR_TXDMAEN_Msk ) + +#define I2S_CR_RXDMAEN_Pos ( 15U ) +#define I2S_CR_RXDMAEN_Msk ( 0x1UL << I2S_CR_RXDMAEN_Pos ) +#define I2S_CR_RXDMAEN ( I2S_CR_RXDMAEN_Msk ) + +#define I2S_CR_STOP_Pos ( 14U ) +#define I2S_CR_STOP_Msk ( 0x1UL << I2S_CR_STOP_Pos ) +#define I2S_CR_STOP ( I2S_CR_STOP_Msk ) + +#define I2S_CR_START_Pos ( 13U ) +#define I2S_CR_START_Msk ( 0x1UL << I2S_CR_START_Pos ) +#define I2S_CR_START ( I2S_CR_START_Msk ) + +#define I2S_CR_IOSWP_Pos ( 12U ) +#define I2S_CR_IOSWP_Msk ( 0x1UL << I2S_CR_IOSWP_Pos ) +#define I2S_CR_IOSWP ( I2S_CR_IOSWP_Msk ) + +#define I2S_CR_EN_Pos ( 11U ) +#define I2S_CR_EN_Msk ( 0x1UL << I2S_CR_EN_Pos ) +#define I2S_CR_EN ( I2S_CR_EN_Msk ) + +#define I2S_CR_REN_Pos ( 10U ) +#define I2S_CR_REN_Msk ( 0x1UL << I2S_CR_REN_Pos ) +#define I2S_CR_REN ( I2S_CR_REN_Msk ) + +#define I2S_CR_TEN_Pos ( 9U ) +#define I2S_CR_TEN_Msk ( 0x1UL << I2S_CR_TEN_Pos ) +#define I2S_CR_TEN ( I2S_CR_TEN_Msk ) + +#define I2S_CR_MODE_Pos ( 8U ) +#define I2S_CR_MODE_Msk ( 0x1UL << I2S_CR_MODE_Pos ) +#define I2S_CR_MODE ( I2S_CR_MODE_Msk ) + +#define I2S_CR_PCMMODE_Pos ( 7U ) +#define I2S_CR_PCMMODE_Msk ( 0x1UL << I2S_CR_PCMMODE_Pos ) +#define I2S_CR_PCMMODE ( I2S_CR_PCMMODE_Msk ) + +#define I2S_CR_STD_Pos ( 4U ) +#define I2S_CR_STD_Msk ( 0x3UL << I2S_CR_STD_Pos ) +#define I2S_CR_STD ( I2S_CR_STD_Msk ) +#define I2S_CR_STD_0 ( 0x1UL << I2S_CR_STD_Pos ) +#define I2S_CR_STD_1 ( 0x2UL << I2S_CR_STD_Pos ) + +#define I2S_CR_CKPL_Pos ( 3U ) +#define I2S_CR_CKPL_Msk ( 0x1UL << I2S_CR_CKPL_Pos ) +#define I2S_CR_CKPL ( I2S_CR_CKPL_Msk ) + +#define I2S_CR_DLEN_Pos ( 1U ) +#define I2S_CR_DLEN_Msk ( 0x3UL << I2S_CR_DLEN_Pos ) +#define I2S_CR_DLEN ( I2S_CR_DLEN_Msk ) +#define I2S_CR_DLEN_0 ( 0x1UL << I2S_CR_DLEN_Pos ) +#define I2S_CR_DLEN_1 ( 0x2UL << I2S_CR_DLEN_Pos ) + + +#define I2S_CR_CHLEN_Pos ( 0U ) +#define I2S_CR_CHLEN_Msk ( 0x1UL << I2S_CR_CHLEN_Pos ) +#define I2S_CR_CHLEN ( I2S_CR_CHLEN_Msk ) + + +/*************** Bits definition for I2S_PR **********************/ + +#define I2S_PR_MCKOE_Pos ( 10U ) +#define I2S_PR_MCKOE_Msk ( 0x1UL << I2S_PR_MCKOE_Pos ) +#define I2S_PR_MCKOE ( I2S_PR_MCKOE_Msk ) + +#define I2S_PR_OF_Pos ( 9U ) +#define I2S_PR_OF_Msk ( 0x1UL << I2S_PR_OF_Pos ) +#define I2S_PR_OF ( I2S_PR_OF_Msk ) + +#define I2S_PR_DIV_Pos ( 0U ) +#define I2S_PR_DIV_Msk ( 0x1FFUL << I2S_PR_DIV_Pos ) +#define I2S_PR_DIV ( I2S_PR_DIV_Msk ) + + +/*************** Bits definition for I2S_DIER **********************/ + +#define I2S_DIER_SVTCIE_Pos ( 10U ) +#define I2S_DIER_SVTCIE_Msk ( 0x1UL << I2S_DIER_SVTCIE_Pos ) +#define I2S_DIER_SVTCIE ( I2S_DIER_SVTCIE_Msk ) + +#define I2S_DIER_MSUSPIE_Pos ( 9U ) +#define I2S_DIER_MSUSPIE_Msk ( 0x1UL << I2S_DIER_MSUSPIE_Pos ) +#define I2S_DIER_MSUSPIE ( I2S_DIER_MSUSPIE_Msk ) + +#define I2S_DIER_ERRIE_Pos ( 5U ) +#define I2S_DIER_ERRIE_Msk ( 0x1UL << I2S_DIER_ERRIE_Pos ) +#define I2S_DIER_ERRIE ( I2S_DIER_ERRIE_Msk ) + +#define I2S_DIER_TXEIE_Pos ( 1U ) +#define I2S_DIER_TXEIE_Msk ( 0x1UL << I2S_DIER_TXEIE_Pos ) +#define I2S_DIER_TXEIE ( I2S_DIER_TXEIE_Msk ) + +#define I2S_DIER_RXNEIE_Pos ( 0U ) +#define I2S_DIER_RXNEIE_Msk ( 0x1UL << I2S_DIER_RXNEIE_Pos ) +#define I2S_DIER_RXNEIE ( I2S_DIER_RXNEIE_Msk ) + + +/*************** Bits definition for I2S_SR **********************/ + +#define I2S_SR_SVTC_Pos ( 10U ) +#define I2S_SR_SVTC_Msk ( 0x1UL << I2S_SR_SVTC_Pos ) +#define I2S_SR_SVTC ( I2S_SR_SVTC_Msk ) + +#define I2S_SR_MSUSP_Pos ( 9U ) +#define I2S_SR_MSUSP_Msk ( 0x1UL << I2S_SR_MSUSP_Pos ) +#define I2S_SR_MSUSP ( I2S_SR_MSUSP_Msk ) + +#define I2S_SR_FE_Pos ( 5U ) +#define I2S_SR_FE_Msk ( 0x1UL << I2S_SR_FE_Pos ) +#define I2S_SR_FE ( I2S_SR_FE_Msk ) + +#define I2S_SR_OVR_Pos ( 4U ) +#define I2S_SR_OVR_Msk ( 0x1UL << I2S_SR_OVR_Pos ) +#define I2S_SR_OVR ( I2S_SR_OVR_Msk ) + +#define I2S_SR_UDR_Pos ( 3U ) +#define I2S_SR_UDR_Msk ( 0x1UL << I2S_SR_UDR_Pos ) +#define I2S_SR_UDR ( I2S_SR_UDR_Msk ) + +#define I2S_SR_CH_Pos ( 2U ) +#define I2S_SR_CH_Msk ( 0x1UL << I2S_SR_CH_Pos ) +#define I2S_SR_CH ( I2S_SR_CH_Msk ) + +#define I2S_SR_TXE_Pos ( 1U ) +#define I2S_SR_TXE_Msk ( 0x1UL << I2S_SR_TXE_Pos ) +#define I2S_SR_TXE ( I2S_SR_TXE_Msk ) + +#define I2S_SR_RXNE_Pos ( 0U ) +#define I2S_SR_RXNE_Msk ( 0x1UL << I2S_SR_RXNE_Pos ) +#define I2S_SR_RXNE ( I2S_SR_RXNE_Msk ) + + +/*************** Bits definition for I2S_RSIZE **********************/ + +#define I2S_RSIZE_RSIZE_Pos ( 0U ) +#define I2S_RSIZE_RSIZE_Msk ( 0xFFFFUL << I2S_RSIZE_RSIZE_Pos ) +#define I2S_RSIZE_RSIZE ( I2S_RSIZE_RSIZE_Msk ) + + +/*************** Bits definition for ETH_MACCR **********************/ + +#define ETH_MACCR_SARC_Pos ( 28U ) +#define ETH_MACCR_SARC_Msk ( 0x7UL << ETH_MACCR_SARC_Pos ) +#define ETH_MACCR_SARC ( ETH_MACCR_SARC_Msk ) +#define ETH_MACCR_SARC_0 ( 0x1UL << ETH_MACCR_SARC_Pos ) +#define ETH_MACCR_SARC_1 ( 0x2UL << ETH_MACCR_SARC_Pos ) +#define ETH_MACCR_SARC_2 ( 0x4UL << ETH_MACCR_SARC_Pos ) + +#define ETH_MACCR_S2KP_Pos ( 27U ) +#define ETH_MACCR_S2KP_Msk ( 0x1UL << ETH_MACCR_S2KP_Pos ) +#define ETH_MACCR_S2KP ( ETH_MACCR_S2KP_Msk ) + +#define ETH_MACCR_CSTF_Pos ( 25U ) +#define ETH_MACCR_CSTF_Msk ( 0x1UL << ETH_MACCR_CSTF_Pos ) +#define ETH_MACCR_CSTF ( ETH_MACCR_CSTF_Msk ) + +#define ETH_MACCR_WD_Pos ( 23U ) +#define ETH_MACCR_WD_Msk ( 0x1UL << ETH_MACCR_WD_Pos ) +#define ETH_MACCR_WD ( ETH_MACCR_WD_Msk ) + +#define ETH_MACCR_JD_Pos ( 22U ) +#define ETH_MACCR_JD_Msk ( 0x1UL << ETH_MACCR_JD_Pos ) +#define ETH_MACCR_JD ( ETH_MACCR_JD_Msk ) + +#define ETH_MACCR_JE_Pos ( 20U ) +#define ETH_MACCR_JE_Msk ( 0x1UL << ETH_MACCR_JE_Pos ) +#define ETH_MACCR_JE ( ETH_MACCR_JE_Msk ) + +#define ETH_MACCR_IFG_Pos ( 17U ) +#define ETH_MACCR_IFG_Msk ( 0x7UL << ETH_MACCR_IFG_Pos ) +#define ETH_MACCR_IFG ( ETH_MACCR_IFG_Msk ) +#define ETH_MACCR_IFG_0 ( 0x1UL << ETH_MACCR_IFG_Pos ) +#define ETH_MACCR_IFG_1 ( 0x2UL << ETH_MACCR_IFG_Pos ) +#define ETH_MACCR_IFG_2 ( 0x4UL << ETH_MACCR_IFG_Pos ) + +#define ETH_MACCR_CSD_Pos ( 16U ) +#define ETH_MACCR_CSD_Msk ( 0x1UL << ETH_MACCR_CSD_Pos ) +#define ETH_MACCR_CSD ( ETH_MACCR_CSD_Msk ) + +#define ETH_MACCR_FES_Pos ( 14U ) +#define ETH_MACCR_FES_Msk ( 0x1UL << ETH_MACCR_FES_Pos ) +#define ETH_MACCR_FES ( ETH_MACCR_FES_Msk ) + +#define ETH_MACCR_ROD_Pos ( 13U ) +#define ETH_MACCR_ROD_Msk ( 0x1UL << ETH_MACCR_ROD_Pos ) +#define ETH_MACCR_ROD ( ETH_MACCR_ROD_Msk ) + +#define ETH_MACCR_LM_Pos ( 12U ) +#define ETH_MACCR_LM_Msk ( 0x1UL << ETH_MACCR_LM_Pos ) +#define ETH_MACCR_LM ( ETH_MACCR_LM_Msk ) + +#define ETH_MACCR_DM_Pos ( 11U ) +#define ETH_MACCR_DM_Msk ( 0x1UL << ETH_MACCR_DM_Pos ) +#define ETH_MACCR_DM ( ETH_MACCR_DM_Msk ) + +#define ETH_MACCR_IPCO_Pos ( 10U ) +#define ETH_MACCR_IPCO_Msk ( 0x1UL << ETH_MACCR_IPCO_Pos ) +#define ETH_MACCR_IPCO ( ETH_MACCR_IPCO_Msk ) + +#define ETH_MACCR_DR_Pos ( 9U ) +#define ETH_MACCR_DR_Msk ( 0x1UL << ETH_MACCR_DR_Pos ) +#define ETH_MACCR_DR ( ETH_MACCR_DR_Msk ) + +#define ETH_MACCR_APCS_Pos ( 7U ) +#define ETH_MACCR_APCS_Msk ( 0x1UL << ETH_MACCR_APCS_Pos ) +#define ETH_MACCR_APCS ( ETH_MACCR_APCS_Msk ) + +#define ETH_MACCR_BL_Pos ( 5U ) +#define ETH_MACCR_BL_Msk ( 0x3UL << ETH_MACCR_BL_Pos ) +#define ETH_MACCR_BL ( ETH_MACCR_BL_Msk ) +#define ETH_MACCR_BL_0 ( 0x1UL << ETH_MACCR_BL_Pos ) +#define ETH_MACCR_BL_1 ( 0x2UL << ETH_MACCR_BL_Pos ) + +#define ETH_MACCR_DC_Pos ( 4U ) +#define ETH_MACCR_DC_Msk ( 0x1UL << ETH_MACCR_DC_Pos ) +#define ETH_MACCR_DC ( ETH_MACCR_DC_Msk ) + +#define ETH_MACCR_TE_Pos ( 3U ) +#define ETH_MACCR_TE_Msk ( 0x1UL << ETH_MACCR_TE_Pos ) +#define ETH_MACCR_TE ( ETH_MACCR_TE_Msk ) + +#define ETH_MACCR_RE_Pos ( 2U ) +#define ETH_MACCR_RE_Msk ( 0x1UL << ETH_MACCR_RE_Pos ) +#define ETH_MACCR_RE ( ETH_MACCR_RE_Msk ) + +#define ETH_MACCR_PRELEN_Pos ( 0U ) +#define ETH_MACCR_PRELEN_Msk ( 0x3UL << ETH_MACCR_PRELEN_Pos ) +#define ETH_MACCR_PRELEN ( ETH_MACCR_PRELEN_Msk ) +#define ETH_MACCR_PRELEN_0 ( 0x1UL << ETH_MACCR_PRELEN_Pos ) +#define ETH_MACCR_PRELEN_1 ( 0x2UL << ETH_MACCR_PRELEN_Pos ) + + +/*************** Bits definition for ETH_MACFFR **********************/ + +#define ETH_MACFFR_RA_Pos ( 31U ) +#define ETH_MACFFR_RA_Msk ( 0x1UL << ETH_MACFFR_RA_Pos ) +#define ETH_MACFFR_RA ( ETH_MACFFR_RA_Msk ) + +#define ETH_MACFFR_DNTU_Pos ( 21U ) +#define ETH_MACFFR_DNTU_Msk ( 0x1UL << ETH_MACFFR_DNTU_Pos ) +#define ETH_MACFFR_DNTU ( ETH_MACFFR_DNTU_Msk ) + +#define ETH_MACFFR_IPFE_Pos ( 20U ) +#define ETH_MACFFR_IPFE_Msk ( 0x1UL << ETH_MACFFR_IPFE_Pos ) +#define ETH_MACFFR_IPFE ( ETH_MACFFR_IPFE_Msk ) + +#define ETH_MACFFR_VTFE_Pos ( 16U ) +#define ETH_MACFFR_VTFE_Msk ( 0x1UL << ETH_MACFFR_VTFE_Pos ) +#define ETH_MACFFR_VTFE ( ETH_MACFFR_VTFE_Msk ) + +#define ETH_MACFFR_HPF_Pos ( 10U ) +#define ETH_MACFFR_HPF_Msk ( 0x1UL << ETH_MACFFR_HPF_Pos ) +#define ETH_MACFFR_HPF ( ETH_MACFFR_HPF_Msk ) + +#define ETH_MACFFR_SAF_Pos ( 9U ) +#define ETH_MACFFR_SAF_Msk ( 0x1UL << ETH_MACFFR_SAF_Pos ) +#define ETH_MACFFR_SAF ( ETH_MACFFR_SAF_Msk ) + +#define ETH_MACFFR_SAIF_Pos ( 8U ) +#define ETH_MACFFR_SAIF_Msk ( 0x1UL << ETH_MACFFR_SAIF_Pos ) +#define ETH_MACFFR_SAIF ( ETH_MACFFR_SAIF_Msk ) + +#define ETH_MACFFR_PCF_Pos ( 6U ) +#define ETH_MACFFR_PCF_Msk ( 0x3UL << ETH_MACFFR_PCF_Pos ) +#define ETH_MACFFR_PCF ( ETH_MACFFR_PCF_Msk ) +#define ETH_MACFFR_PCF_0 ( 0x1UL << ETH_MACFFR_PCF_Pos ) +#define ETH_MACFFR_PCF_1 ( 0x2UL << ETH_MACFFR_PCF_Pos ) + +#define ETH_MACFFR_DBF_Pos ( 5U ) +#define ETH_MACFFR_DBF_Msk ( 0x1UL << ETH_MACFFR_DBF_Pos ) +#define ETH_MACFFR_DBF ( ETH_MACFFR_DBF_Msk ) + +#define ETH_MACFFR_PAM_Pos ( 4U ) +#define ETH_MACFFR_PAM_Msk ( 0x1UL << ETH_MACFFR_PAM_Pos ) +#define ETH_MACFFR_PAM ( ETH_MACFFR_PAM_Msk ) + +#define ETH_MACFFR_DAIF_Pos ( 3U ) +#define ETH_MACFFR_DAIF_Msk ( 0x1UL << ETH_MACFFR_DAIF_Pos ) +#define ETH_MACFFR_DAIF ( ETH_MACFFR_DAIF_Msk ) + +#define ETH_MACFFR_HMC_Pos ( 2U ) +#define ETH_MACFFR_HMC_Msk ( 0x1UL << ETH_MACFFR_HMC_Pos ) +#define ETH_MACFFR_HMC ( ETH_MACFFR_HMC_Msk ) + +#define ETH_MACFFR_HUC_Pos ( 1U ) +#define ETH_MACFFR_HUC_Msk ( 0x1UL << ETH_MACFFR_HUC_Pos ) +#define ETH_MACFFR_HUC ( ETH_MACFFR_HUC_Msk ) + +#define ETH_MACFFR_PR_Pos ( 0U ) +#define ETH_MACFFR_PR_Msk ( 0x1UL << ETH_MACFFR_PR_Pos ) +#define ETH_MACFFR_PR ( ETH_MACFFR_PR_Msk ) + + +/*************** Bits definition for ETH_MACHTHR **********************/ + +#define ETH_MACHTHR_HTH_Pos ( 0U ) +#define ETH_MACHTHR_HTH_Msk ( 0xffffffffUL << ETH_MACHTHR_HTH_Pos ) +#define ETH_MACHTHR_HTH ( ETH_MACHTHR_HTH_Msk ) + + +/*************** Bits definition for ETH_MACHTLR **********************/ + +#define ETH_MACHTLR_HTL_Pos ( 0U ) +#define ETH_MACHTLR_HTL_Msk ( 0xffffffffUL << ETH_MACHTLR_HTL_Pos ) +#define ETH_MACHTLR_HTL ( ETH_MACHTLR_HTL_Msk ) + + +/*************** Bits definition for ETH_MACMIIAR **********************/ + +#define ETH_MACMIIAR_PA_Pos ( 11U ) +#define ETH_MACMIIAR_PA_Msk ( 0x1fUL << ETH_MACMIIAR_PA_Pos ) +#define ETH_MACMIIAR_PA ( ETH_MACMIIAR_PA_Msk ) +#define ETH_MACMIIAR_PA_0 ( 0x1UL << ETH_MACMIIAR_PA_Pos ) +#define ETH_MACMIIAR_PA_1 ( 0x2UL << ETH_MACMIIAR_PA_Pos ) +#define ETH_MACMIIAR_PA_2 ( 0x4UL << ETH_MACMIIAR_PA_Pos ) +#define ETH_MACMIIAR_PA_3 ( 0x8UL << ETH_MACMIIAR_PA_Pos ) +#define ETH_MACMIIAR_PA_4 ( 0x10UL << ETH_MACMIIAR_PA_Pos ) + +#define ETH_MACMIIAR_MR_Pos ( 6U ) +#define ETH_MACMIIAR_MR_Msk ( 0x1fUL << ETH_MACMIIAR_MR_Pos ) +#define ETH_MACMIIAR_MR ( ETH_MACMIIAR_MR_Msk ) +#define ETH_MACMIIAR_MR_0 ( 0x1UL << ETH_MACMIIAR_MR_Pos ) +#define ETH_MACMIIAR_MR_1 ( 0x2UL << ETH_MACMIIAR_MR_Pos ) +#define ETH_MACMIIAR_MR_2 ( 0x4UL << ETH_MACMIIAR_MR_Pos ) +#define ETH_MACMIIAR_MR_3 ( 0x8UL << ETH_MACMIIAR_MR_Pos ) +#define ETH_MACMIIAR_MR_4 ( 0x10UL << ETH_MACMIIAR_MR_Pos ) + +#define ETH_MACMIIAR_CR_Pos ( 2U ) +#define ETH_MACMIIAR_CR_Msk ( 0xfUL << ETH_MACMIIAR_CR_Pos ) +#define ETH_MACMIIAR_CR ( ETH_MACMIIAR_CR_Msk ) +#define ETH_MACMIIAR_CR_0 ( 0x1UL << ETH_MACMIIAR_CR_Pos ) +#define ETH_MACMIIAR_CR_1 ( 0x2UL << ETH_MACMIIAR_CR_Pos ) +#define ETH_MACMIIAR_CR_2 ( 0x4UL << ETH_MACMIIAR_CR_Pos ) +#define ETH_MACMIIAR_CR_3 ( 0x8UL << ETH_MACMIIAR_CR_Pos ) + +#define ETH_MACMIIAR_MW_Pos ( 1U ) +#define ETH_MACMIIAR_MW_Msk ( 0x1UL << ETH_MACMIIAR_MW_Pos ) +#define ETH_MACMIIAR_MW ( ETH_MACMIIAR_MW_Msk ) + +#define ETH_MACMIIAR_MB_Pos ( 0U ) +#define ETH_MACMIIAR_MB_Msk ( 0x1UL << ETH_MACMIIAR_MB_Pos ) +#define ETH_MACMIIAR_MB ( ETH_MACMIIAR_MB_Msk ) + + +/*************** Bits definition for ETH_MACMIIDR **********************/ + +#define ETH_MACMIIDR_MD_Pos ( 0U ) +#define ETH_MACMIIDR_MD_Msk ( 0xffffUL << ETH_MACMIIDR_MD_Pos ) +#define ETH_MACMIIDR_MD ( ETH_MACMIIDR_MD_Msk ) + + +/*************** Bits definition for ETH_MACFCR **********************/ + +#define ETH_MACFCR_PT_Pos ( 16U ) +#define ETH_MACFCR_PT_Msk ( 0xffffUL << ETH_MACFCR_PT_Pos ) +#define ETH_MACFCR_PT ( ETH_MACFCR_PT_Msk ) + +#define ETH_MACFCR_DZQP_Pos ( 7U ) +#define ETH_MACFCR_DZQP_Msk ( 0x1UL << ETH_MACFCR_DZQP_Pos ) +#define ETH_MACFCR_DZQP ( ETH_MACFCR_DZQP_Msk ) + +#define ETH_MACFCR_PLT_Pos ( 4U ) +#define ETH_MACFCR_PLT_Msk ( 0x3UL << ETH_MACFCR_PLT_Pos ) +#define ETH_MACFCR_PLT ( ETH_MACFCR_PLT_Msk ) +#define ETH_MACFCR_PLT_0 ( 0x1UL << ETH_MACFCR_PLT_Pos ) +#define ETH_MACFCR_PLT_1 ( 0x2UL << ETH_MACFCR_PLT_Pos ) + +#define ETH_MACFCR_UPFD_Pos ( 3U ) +#define ETH_MACFCR_UPFD_Msk ( 0x1UL << ETH_MACFCR_UPFD_Pos ) +#define ETH_MACFCR_UPFD ( ETH_MACFCR_UPFD_Msk ) + +#define ETH_MACFCR_RFCE_Pos ( 2U ) +#define ETH_MACFCR_RFCE_Msk ( 0x1UL << ETH_MACFCR_RFCE_Pos ) +#define ETH_MACFCR_RFCE ( ETH_MACFCR_RFCE_Msk ) + +#define ETH_MACFCR_TFCE_Pos ( 1U ) +#define ETH_MACFCR_TFCE_Msk ( 0x1UL << ETH_MACFCR_TFCE_Pos ) +#define ETH_MACFCR_TFCE ( ETH_MACFCR_TFCE_Msk ) + +#define ETH_MACFCR_FCB_BPA_Pos ( 0U ) +#define ETH_MACFCR_FCB_BPA_Msk ( 0x1UL << ETH_MACFCR_FCB_BPA_Pos ) +#define ETH_MACFCR_FCB_BPA ( ETH_MACFCR_FCB_BPA_Msk ) + + +/*************** Bits definition for ETH_MACVLANTR **********************/ + +#define ETH_MACVLANTR_VTHM_Pos ( 19U ) +#define ETH_MACVLANTR_VTHM_Msk ( 0x1UL << ETH_MACVLANTR_VTHM_Pos ) +#define ETH_MACVLANTR_VTHM ( ETH_MACVLANTR_VTHM_Msk ) + +#define ETH_MACVLANTR_ESVL_Pos ( 18U ) +#define ETH_MACVLANTR_ESVL_Msk ( 0x1UL << ETH_MACVLANTR_ESVL_Pos ) +#define ETH_MACVLANTR_ESVL ( ETH_MACVLANTR_ESVL_Msk ) + +#define ETH_MACVLANTR_VTIM_Pos ( 17U ) +#define ETH_MACVLANTR_VTIM_Msk ( 0x1UL << ETH_MACVLANTR_VTIM_Pos ) +#define ETH_MACVLANTR_VTIM ( ETH_MACVLANTR_VTIM_Msk ) + +#define ETH_MACVLANTR_ETV_Pos ( 16U ) +#define ETH_MACVLANTR_ETV_Msk ( 0x1UL << ETH_MACVLANTR_ETV_Pos ) +#define ETH_MACVLANTR_ETV ( ETH_MACVLANTR_ETV_Msk ) + +#define ETH_MACVLANTR_VL_Pos ( 0U ) +#define ETH_MACVLANTR_VL_Msk ( 0xffffUL << ETH_MACVLANTR_VL_Pos ) +#define ETH_MACVLANTR_VL ( ETH_MACVLANTR_VL_Msk ) + + +/*************** Bits definition for ETH_MACDBGR **********************/ + +#define ETH_MACDBGR_TFF_Pos ( 25U ) +#define ETH_MACDBGR_TFF_Msk ( 0x1UL << ETH_MACDBGR_TFF_Pos ) +#define ETH_MACDBGR_TFF ( ETH_MACDBGR_TFF_Msk ) + +#define ETH_MACDBGR_TFNE_Pos ( 24U ) +#define ETH_MACDBGR_TFNE_Msk ( 0x1UL << ETH_MACDBGR_TFNE_Pos ) +#define ETH_MACDBGR_TFNE ( ETH_MACDBGR_TFNE_Msk ) + +#define ETH_MACDBGR_TFWA_Pos ( 22U ) +#define ETH_MACDBGR_TFWA_Msk ( 0x1UL << ETH_MACDBGR_TFWA_Pos ) +#define ETH_MACDBGR_TFWA ( ETH_MACDBGR_TFWA_Msk ) + +#define ETH_MACDBGR_TFRS_Pos ( 20U ) +#define ETH_MACDBGR_TFRS_Msk ( 0x3UL << ETH_MACDBGR_TFRS_Pos ) +#define ETH_MACDBGR_TFRS ( ETH_MACDBGR_TFRS_Msk ) +#define ETH_MACDBGR_TFRS_0 ( 0x1UL << ETH_MACDBGR_TFRS_Pos ) +#define ETH_MACDBGR_TFRS_1 ( 0x2UL << ETH_MACDBGR_TFRS_Pos ) + +#define ETH_MACDBGR_MTP_Pos ( 19U ) +#define ETH_MACDBGR_MTP_Msk ( 0x1UL << ETH_MACDBGR_MTP_Pos ) +#define ETH_MACDBGR_MTP ( ETH_MACDBGR_MTP_Msk ) + +#define ETH_MACDBGR_MTFCS_Pos ( 17U ) +#define ETH_MACDBGR_MTFCS_Msk ( 0x3UL << ETH_MACDBGR_MTFCS_Pos ) +#define ETH_MACDBGR_MTFCS ( ETH_MACDBGR_MTFCS_Msk ) +#define ETH_MACDBGR_MTFCS_0 ( 0x1UL << ETH_MACDBGR_MTFCS_Pos ) +#define ETH_MACDBGR_MTFCS_1 ( 0x2UL << ETH_MACDBGR_MTFCS_Pos ) + +#define ETH_MACDBGR_MMTEA_Pos ( 16U ) +#define ETH_MACDBGR_MMTEA_Msk ( 0x1UL << ETH_MACDBGR_MMTEA_Pos ) +#define ETH_MACDBGR_MMTEA ( ETH_MACDBGR_MMTEA_Msk ) + +#define ETH_MACDBGR_RFFL_Pos ( 8U ) +#define ETH_MACDBGR_RFFL_Msk ( 0x3UL << ETH_MACDBGR_RFFL_Pos ) +#define ETH_MACDBGR_RFFL ( ETH_MACDBGR_RFFL_Msk ) +#define ETH_MACDBGR_RFFL_0 ( 0x1UL << ETH_MACDBGR_RFFL_Pos ) +#define ETH_MACDBGR_RFFL_1 ( 0x2UL << ETH_MACDBGR_RFFL_Pos ) + +#define ETH_MACDBGR_RFRCS_Pos ( 5U ) +#define ETH_MACDBGR_RFRCS_Msk ( 0x3UL << ETH_MACDBGR_RFRCS_Pos ) +#define ETH_MACDBGR_RFRCS ( ETH_MACDBGR_RFRCS_Msk ) +#define ETH_MACDBGR_RFRCS_0 ( 0x1UL << ETH_MACDBGR_RFRCS_Pos ) +#define ETH_MACDBGR_RFRCS_1 ( 0x2UL << ETH_MACDBGR_RFRCS_Pos ) + +#define ETH_MACDBGR_RFWCS_Pos ( 4U ) +#define ETH_MACDBGR_RFWCS_Msk ( 0x1UL << ETH_MACDBGR_RFWCS_Pos ) +#define ETH_MACDBGR_RFWCS ( ETH_MACDBGR_RFWCS_Msk ) + +#define ETH_MACDBGR_MRFFCS_Pos ( 1U ) +#define ETH_MACDBGR_MRFFCS_Msk ( 0x3UL << ETH_MACDBGR_MRFFCS_Pos ) +#define ETH_MACDBGR_MRFFCS ( ETH_MACDBGR_MRFFCS_Msk ) +#define ETH_MACDBGR_MRFFCS_0 ( 0x1UL << ETH_MACDBGR_MRFFCS_Pos ) +#define ETH_MACDBGR_MRFFCS_1 ( 0x2UL << ETH_MACDBGR_MRFFCS_Pos ) + +#define ETH_MACDBGR_MMRPES_Pos ( 0U ) +#define ETH_MACDBGR_MMRPES_Msk ( 0x1UL << ETH_MACDBGR_MMRPES_Pos ) +#define ETH_MACDBGR_MMRPES ( ETH_MACDBGR_MMRPES_Msk ) + + +/*************** Bits definition for ETH_MACRWUFF **********************/ + +#define ETH_MACRWUFF_MACRWUFF_Pos ( 0U ) +#define ETH_MACRWUFF_MACRWUFF_Msk ( 0xffffffffUL << ETH_MACRWUFF_MACRWUFF_Pos ) +#define ETH_MACRWUFF_MACRWUFF ( ETH_MACRWUFF_MACRWUFF_Msk ) + + +/*************** Bits definition for ETH_MACPMTCSR **********************/ + +#define ETH_MACPMTCSR_RWFFPR_Pos ( 31U ) +#define ETH_MACPMTCSR_RWFFPR_Msk ( 0x1UL << ETH_MACPMTCSR_RWFFPR_Pos ) +#define ETH_MACPMTCSR_RWFFPR ( ETH_MACPMTCSR_RWFFPR_Msk ) + +#define ETH_MACPMTCSR_RWFP_Pos ( 24U ) +#define ETH_MACPMTCSR_RWFP_Msk ( 0x3UL << ETH_MACPMTCSR_GU_Pos ) +#define ETH_MACPMTCSR_RWFP ( ETH_MACPMTCSR_GU_Msk ) +#define ETH_MACPMTCSR_RWFP_0 ( 0x1UL << ETH_MACPMTCSR_GU_Pos ) +#define ETH_MACPMTCSR_RWFP_1 ( 0x2UL << ETH_MACPMTCSR_GU_Pos ) + +#define ETH_MACPMTCSR_GU_Pos ( 9U ) +#define ETH_MACPMTCSR_GU_Msk ( 0x1UL << ETH_MACPMTCSR_GU_Pos ) +#define ETH_MACPMTCSR_GU ( ETH_MACPMTCSR_GU_Msk ) + +#define ETH_MACPMTCSR_WFR_Pos ( 6U ) +#define ETH_MACPMTCSR_WFR_Msk ( 0x1UL << ETH_MACPMTCSR_WFR_Pos ) +#define ETH_MACPMTCSR_WFR ( ETH_MACPMTCSR_WFR_Msk ) + +#define ETH_MACPMTCSR_MPR_Pos ( 5U ) +#define ETH_MACPMTCSR_MPR_Msk ( 0x1UL << ETH_MACPMTCSR_MPR_Pos ) +#define ETH_MACPMTCSR_MPR ( ETH_MACPMTCSR_MPR_Msk ) + +#define ETH_MACPMTCSR_WFE_Pos ( 2U ) +#define ETH_MACPMTCSR_WFE_Msk ( 0x1UL << ETH_MACPMTCSR_WFE_Pos ) +#define ETH_MACPMTCSR_WFE ( ETH_MACPMTCSR_WFE_Msk ) + +#define ETH_MACPMTCSR_MPE_Pos ( 1U ) +#define ETH_MACPMTCSR_MPE_Msk ( 0x1UL << ETH_MACPMTCSR_MPE_Pos ) +#define ETH_MACPMTCSR_MPE ( ETH_MACPMTCSR_MPE_Msk ) + +#define ETH_MACPMTCSR_PD_Pos ( 0U ) +#define ETH_MACPMTCSR_PD_Msk ( 0x1UL << ETH_MACPMTCSR_PD_Pos ) +#define ETH_MACPMTCSR_PD ( ETH_MACPMTCSR_PD_Msk ) + + +/*************** Bits definition for ETH_MACLPICSR **********************/ + +#define ETH_MACLPICSR_LPITXA_Pos ( 19U ) +#define ETH_MACLPICSR_LPITXA_Msk ( 0x1UL << ETH_MACLPICSR_LPITXA_Pos ) +#define ETH_MACLPICSR_LPITXA ( ETH_MACLPICSR_LPITXA_Msk ) + +#define ETH_MACLPICSR_PLSEN_Pos ( 18U ) +#define ETH_MACLPICSR_PLSEN_Msk ( 0x1UL << ETH_MACLPICSR_PLSEN_Pos ) +#define ETH_MACLPICSR_PLSEN ( ETH_MACLPICSR_PLSEN_Msk ) + +#define ETH_MACLPICSR_PLS_Pos ( 17U ) +#define ETH_MACLPICSR_PLS_Msk ( 0x1UL << ETH_MACLPICSR_PLS_Pos ) +#define ETH_MACLPICSR_PLS ( ETH_MACLPICSR_PLS_Msk ) + +#define ETH_MACLPICSR_LPIEN_Pos ( 16U ) +#define ETH_MACLPICSR_LPIEN_Msk ( 0x1UL << ETH_MACLPICSR_LPIEN_Pos ) +#define ETH_MACLPICSR_LPIEN ( ETH_MACLPICSR_LPIEN_Msk ) + +#define ETH_MACLPICSR_RLPIST_Pos ( 9U ) +#define ETH_MACLPICSR_RLPIST_Msk ( 0x1UL << ETH_MACLPICSR_RLPIST_Pos ) +#define ETH_MACLPICSR_RLPIST ( ETH_MACLPICSR_RLPIST_Msk ) + +#define ETH_MACLPICSR_TLPIST_Pos ( 8U ) +#define ETH_MACLPICSR_TLPIST_Msk ( 0x1UL << ETH_MACLPICSR_TLPIST_Pos ) +#define ETH_MACLPICSR_TLPIST ( ETH_MACLPICSR_TLPIST_Msk ) + +#define ETH_MACLPICSR_RLPIEX_Pos ( 3U ) +#define ETH_MACLPICSR_RLPIEX_Msk ( 0x1UL << ETH_MACLPICSR_RLPIEX_Pos ) +#define ETH_MACLPICSR_RLPIEX ( ETH_MACLPICSR_RLPIEX_Msk ) + +#define ETH_MACLPICSR_RLPIEN_Pos ( 2U ) +#define ETH_MACLPICSR_RLPIEN_Msk ( 0x1UL << ETH_MACLPICSR_RLPIEN_Pos ) +#define ETH_MACLPICSR_RLPIEN ( ETH_MACLPICSR_RLPIEN_Msk ) + +#define ETH_MACLPICSR_TLPIEX_Pos ( 1U ) +#define ETH_MACLPICSR_TLPIEX_Msk ( 0x1UL << ETH_MACLPICSR_TLPIEX_Pos ) +#define ETH_MACLPICSR_TLPIEX ( ETH_MACLPICSR_TLPIEX_Msk ) + +#define ETH_MACLPICSR_TLPIEN_Pos ( 0U ) +#define ETH_MACLPICSR_TLPIEN_Msk ( 0x1UL << ETH_MACLPICSR_TLPIEN_Pos ) +#define ETH_MACLPICSR_TLPIEN ( ETH_MACLPICSR_TLPIEN_Msk ) + + +/*************** Bits definition for ETH_MACLPITCR **********************/ + +#define ETH_MACLPITCR_LST_Pos ( 16U ) +#define ETH_MACLPITCR_LST_Msk ( 0x3FFUL << ETH_MACLPITCR_LST_Pos ) +#define ETH_MACLPITCR_LST ( ETH_MACLPITCR_LST_Msk ) + +#define ETH_MACLPITCR_TWT_Pos ( 0U ) +#define ETH_MACLPITCR_TWT_Msk ( 0xFFFFUL << ETH_MACLPITCR_TWT_Pos ) +#define ETH_MACLPITCR_TWT ( ETH_MACLPITCR_TWT_Msk ) + + +/*************** Bits definition for ETH_MACISR **********************/ + +#define ETH_MACISR_LPIIS_Pos ( 10U ) +#define ETH_MACISR_LPIIS_Msk ( 0x1UL << ETH_MACISR_LPIIS_Pos ) +#define ETH_MACISR_LPIIS ( ETH_MACISR_LPIIS_Msk ) + +#define ETH_MACISR_TIS_Pos ( 9U ) +#define ETH_MACISR_TIS_Msk ( 0x1UL << ETH_MACISR_TIS_Pos ) +#define ETH_MACISR_TIS ( ETH_MACISR_TIS_Msk ) + +#define ETH_MACISR_MMCTIS_Pos ( 6U ) +#define ETH_MACISR_MMCTIS_Msk ( 0x1UL << ETH_MACISR_MMCTIS_Pos ) +#define ETH_MACISR_MMCTIS ( ETH_MACISR_MMCTIS_Msk ) + +#define ETH_MACISR_MMCRIS_Pos ( 5U ) +#define ETH_MACISR_MMCRIS_Msk ( 0x1UL << ETH_MACISR_MMCRIS_Pos ) +#define ETH_MACISR_MMCRIS ( ETH_MACISR_MMCRIS_Msk ) + +#define ETH_MACISR_MMCIS_Pos ( 4U ) +#define ETH_MACISR_MMCIS_Msk ( 0x1UL << ETH_MACISR_MMCIS_Pos ) +#define ETH_MACISR_MMCIS ( ETH_MACISR_MMCIS_Msk ) + +#define ETH_MACISR_PMTS_Pos ( 3U ) +#define ETH_MACISR_PMTS_Msk ( 0x1UL << ETH_MACISR_PMTS_Pos ) +#define ETH_MACISR_PMTS ( ETH_MACISR_PMTS_Msk ) + + +/*************** Bits definition for ETH_MACIMR **********************/ + +#define ETH_MACIMR_LPIIM_Pos ( 10U ) +#define ETH_MACIMR_LPIIM_Msk ( 0x1UL << ETH_MACIMR_LPIIM_Pos ) +#define ETH_MACIMR_LPIIM ( ETH_MACIMR_LPIIM_Msk ) + +#define ETH_MACIMR_TIM_Pos ( 9U ) +#define ETH_MACIMR_TIM_Msk ( 0x1UL << ETH_MACIMR_TIM_Pos ) +#define ETH_MACIMR_TIM ( ETH_MACIMR_TIM_Msk ) + +#define ETH_MACIMR_PIM_Pos ( 3U ) +#define ETH_MACIMR_PIM_Msk ( 0x1UL << ETH_MACIMR_PIM_Pos ) +#define ETH_MACIMR_PIM ( ETH_MACIMR_PIM_Msk ) + + +/*************** Bits definition for ETH_MACA0HR **********************/ + +#define ETH_MACA0HR_AE_Pos ( 31U ) +#define ETH_MACA0HR_AE_Msk ( 0x1UL << ETH_MACA0HR_AE_Pos ) +#define ETH_MACA0HR_AE ( ETH_MACA0HR_AE_Msk ) + +#define ETH_MACA0HR_MACA0H_Pos ( 0U ) +#define ETH_MACA0HR_MACA0H_Msk ( 0xffffUL << ETH_MACA0HR_MACA0H_Pos ) +#define ETH_MACA0HR_MACA0H ( ETH_MACA0HR_MACA0H_Msk ) + + +/*************** Bits definition for ETH_MACA0LR **********************/ + +#define ETH_MACA0LR_MACA0L_Pos ( 0U ) +#define ETH_MACA0LR_MACA0L_Msk ( 0xffffffffUL << ETH_MACA0LR_MACA0L_Pos ) +#define ETH_MACA0LR_MACA0L ( ETH_MACA0LR_MACA0L_Msk ) + + +/*************** Bits definition for ETH_MACA1HR **********************/ + +#define ETH_MACA1HR_AE_Pos ( 31U ) +#define ETH_MACA1HR_AE_Msk ( 0x1UL << ETH_MACA1HR_AE_Pos ) +#define ETH_MACA1HR_AE ( ETH_MACA1HR_AE_Msk ) + +#define ETH_MACA1HR_SA_Pos ( 30U ) +#define ETH_MACA1HR_SA_Msk ( 0x1UL << ETH_MACA1HR_SA_Pos ) +#define ETH_MACA1HR_SA ( ETH_MACA1HR_SA_Msk ) + +#define ETH_MACA1HR_MBC_Pos ( 24U ) +#define ETH_MACA1HR_MBC_Msk ( 0x3fUL << ETH_MACA1HR_MBC_Pos ) +#define ETH_MACA1HR_MBC ( ETH_MACA1HR_MBC_Msk ) +#define ETH_MACA1HR_MBC_0 ( 0x1UL << ETH_MACA1HR_MBC_Pos ) +#define ETH_MACA1HR_MBC_1 ( 0x2UL << ETH_MACA1HR_MBC_Pos ) +#define ETH_MACA1HR_MBC_2 ( 0x4UL << ETH_MACA1HR_MBC_Pos ) +#define ETH_MACA1HR_MBC_3 ( 0x8UL << ETH_MACA1HR_MBC_Pos ) +#define ETH_MACA1HR_MBC_4 ( 0x10UL << ETH_MACA1HR_MBC_Pos ) +#define ETH_MACA1HR_MBC_5 ( 0x20UL << ETH_MACA1HR_MBC_Pos ) + +#define ETH_MACA1HR_MACA1H_Pos ( 0U ) +#define ETH_MACA1HR_MACA1H_Msk ( 0xffffUL << ETH_MACA1HR_MACA1H_Pos ) +#define ETH_MACA1HR_MACA1H ( ETH_MACA1HR_MACA1H_Msk ) + + +/*************** Bits definition for ETH_MACA1LR **********************/ + +#define ETH_MACA1LR_MACA1L_Pos ( 0U ) +#define ETH_MACA1LR_MACA1L_Msk ( 0xffffffffUL << ETH_MACA1LR_MACA1L_Pos ) +#define ETH_MACA1LR_MACA1L ( ETH_MACA1LR_MACA1L_Msk ) + + +/*************** Bits definition for ETH_MACA2HR **********************/ + +#define ETH_MACA2HR_AE_Pos ( 31U ) +#define ETH_MACA2HR_AE_Msk ( 0x1UL << ETH_MACA2HR_AE_Pos ) +#define ETH_MACA2HR_AE ( ETH_MACA2HR_AE_Msk ) + +#define ETH_MACA2HR_SA_Pos ( 30U ) +#define ETH_MACA2HR_SA_Msk ( 0x1UL << ETH_MACA2HR_SA_Pos ) +#define ETH_MACA2HR_SA ( ETH_MACA2HR_SA_Msk ) + +#define ETH_MACA2HR_MBC_Pos ( 24U ) +#define ETH_MACA2HR_MBC_Msk ( 0x3fUL << ETH_MACA2HR_MBC_Pos ) +#define ETH_MACA2HR_MBC ( ETH_MACA2HR_MBC_Msk ) +#define ETH_MACA2HR_MBC_0 ( 0x1UL << ETH_MACA2HR_MBC_Pos ) +#define ETH_MACA2HR_MBC_1 ( 0x2UL << ETH_MACA2HR_MBC_Pos ) +#define ETH_MACA2HR_MBC_2 ( 0x4UL << ETH_MACA2HR_MBC_Pos ) +#define ETH_MACA2HR_MBC_3 ( 0x8UL << ETH_MACA2HR_MBC_Pos ) +#define ETH_MACA2HR_MBC_4 ( 0x10UL << ETH_MACA2HR_MBC_Pos ) +#define ETH_MACA2HR_MBC_5 ( 0x20UL << ETH_MACA2HR_MBC_Pos ) + +#define ETH_MACA2HR_MACA2H_Pos ( 0U ) +#define ETH_MACA2HR_MACA2H_Msk ( 0xffffUL << ETH_MACA2HR_MACA2H_Pos ) +#define ETH_MACA2HR_MACA2H ( ETH_MACA2HR_MACA2H_Msk ) + + +/*************** Bits definition for ETH_MACA2LR **********************/ + +#define ETH_MACA2LR_MACA2L_Pos ( 0U ) +#define ETH_MACA2LR_MACA2L_Msk ( 0xffffffffUL << ETH_MACA2LR_MACA2L_Pos ) +#define ETH_MACA2LR_MACA2L ( ETH_MACA2LR_MACA2L_Msk ) + + +/*************** Bits definition for ETH_MACA3HR **********************/ + +#define ETH_MACA3HR_AE_Pos ( 31U ) +#define ETH_MACA3HR_AE_Msk ( 0x1UL << ETH_MACA3HR_AE_Pos ) +#define ETH_MACA3HR_AE ( ETH_MACA3HR_AE_Msk ) + +#define ETH_MACA3HR_SA_Pos ( 30U ) +#define ETH_MACA3HR_SA_Msk ( 0x1UL << ETH_MACA3HR_SA_Pos ) +#define ETH_MACA3HR_SA ( ETH_MACA3HR_SA_Msk ) + +#define ETH_MACA3HR_MBC_Pos ( 24U ) +#define ETH_MACA3HR_MBC_Msk ( 0x3fUL << ETH_MACA3HR_MBC_Pos ) +#define ETH_MACA3HR_MBC ( ETH_MACA3HR_MBC_Msk ) +#define ETH_MACA3HR_MBC_0 ( 0x1UL << ETH_MACA3HR_MBC_Pos ) +#define ETH_MACA3HR_MBC_1 ( 0x2UL << ETH_MACA3HR_MBC_Pos ) +#define ETH_MACA3HR_MBC_2 ( 0x4UL << ETH_MACA3HR_MBC_Pos ) +#define ETH_MACA3HR_MBC_3 ( 0x8UL << ETH_MACA3HR_MBC_Pos ) +#define ETH_MACA3HR_MBC_4 ( 0x10UL << ETH_MACA3HR_MBC_Pos ) +#define ETH_MACA3HR_MBC_5 ( 0x20UL << ETH_MACA3HR_MBC_Pos ) + +#define ETH_MACA3HR_MACA3H_Pos ( 0U ) +#define ETH_MACA3HR_MACA3H_Msk ( 0xffffUL << ETH_MACA3HR_MACA3H_Pos ) +#define ETH_MACA3HR_MACA3H ( ETH_MACA3HR_MACA3H_Msk ) + + +/*************** Bits definition for ETH_MACA3LR **********************/ + +#define ETH_MACA3LR_MACA3L_Pos ( 0U ) +#define ETH_MACA3LR_MACA3L_Msk ( 0xffffffffUL << ETH_MACA3LR_MACA3L_Pos ) +#define ETH_MACA3LR_MACA3L ( ETH_MACA3LR_MACA3L_Msk ) + + +/*************** Bits definition for ETH_MACWTR **********************/ + +#define ETH_MACWTR_PWE_Pos ( 16U ) +#define ETH_MACWTR_PWE_Msk ( 0x1UL << ETH_MACWTR_PWE_Pos ) +#define ETH_MACWTR_PWE ( ETH_MACWTR_PWE_Msk ) + +#define ETH_MACWTR_WTO_Pos ( 0U ) +#define ETH_MACWTR_WTO_Msk ( 0x3FFFUL << ETH_MACWTR_WTO_Pos ) +#define ETH_MACWTR_WTO ( ETH_MACWTR_WTO_Msk ) + + +/*************** Bits definition for ETH_MMCCR **********************/ + +#define ETH_MMCCR_UCDBC_Pos ( 8U ) +#define ETH_MMCCR_UCDBC_Msk ( 0x1UL << ETH_MMCCR_UCDBC_Pos ) +#define ETH_MMCCR_UCDBC ( ETH_MMCCR_UCDBC_Msk ) + +#define ETH_MMCCR_CNTPRSTLVL_Pos ( 5U ) +#define ETH_MMCCR_CNTPRSTLVL_Msk ( 0x1UL << ETH_MMCCR_CNTPRSTLVL_Pos ) +#define ETH_MMCCR_CNTPRSTLVL ( ETH_MMCCR_CNTPRSTLVL_Msk ) + +#define ETH_MMCCR_CNTPRST_Pos ( 4U ) +#define ETH_MMCCR_CNTPRST_Msk ( 0x1UL << ETH_MMCCR_CNTPRST_Pos ) +#define ETH_MMCCR_CNTPRST ( ETH_MMCCR_CNTPRST_Msk ) + +#define ETH_MMCCR_CNTFREEZ_Pos ( 3U ) +#define ETH_MMCCR_CNTFREEZ_Msk ( 0x1UL << ETH_MMCCR_CNTFREEZ_Pos ) +#define ETH_MMCCR_CNTFREEZ ( ETH_MMCCR_CNTFREEZ_Msk ) + +#define ETH_MMCCR_RSTONRD_Pos ( 2U ) +#define ETH_MMCCR_RSTONRD_Msk ( 0x1UL << ETH_MMCCR_RSTONRD_Pos ) +#define ETH_MMCCR_RSTONRD ( ETH_MMCCR_RSTONRD_Msk ) + +#define ETH_MMCCR_CNTSTOPRO_Pos ( 1U ) +#define ETH_MMCCR_CNTSTOPRO_Msk ( 0x1UL << ETH_MMCCR_CNTSTOPRO_Pos ) +#define ETH_MMCCR_CNTSTOPRO ( ETH_MMCCR_CNTSTOPRO_Msk ) + +#define ETH_MMCCR_CNTRST_Pos ( 0U ) +#define ETH_MMCCR_CNTRST_Msk ( 0x1UL << ETH_MMCCR_CNTRST_Pos ) +#define ETH_MMCCR_CNTRST ( ETH_MMCCR_CNTRST_Msk ) + + +/*************** Bits definition for ETH_MMCRIR **********************/ + +#define ETH_MMCRIR_RGUFIS_Pos ( 17U ) +#define ETH_MMCRIR_RGUFIS_Msk ( 0x1UL << ETH_MMCRIR_RGUFIS_Pos ) +#define ETH_MMCRIR_RGUFIS ( ETH_MMCRIR_RGUFIS_Msk ) + +#define ETH_MMCRIR_RFAEIS_Pos ( 6U ) +#define ETH_MMCRIR_RFAEIS_Msk ( 0x1UL << ETH_MMCRIR_RFAEIS_Pos ) +#define ETH_MMCRIR_RFAEIS ( ETH_MMCRIR_RFAEIS_Msk ) + +#define ETH_MMCRIR_RFCEIS_Pos ( 5U ) +#define ETH_MMCRIR_RFCEIS_Msk ( 0x1UL << ETH_MMCRIR_RFCEIS_Pos ) +#define ETH_MMCRIR_RFCEIS ( ETH_MMCRIR_RFCEIS_Msk ) + + +/*************** Bits definition for ETH_MMCTIR **********************/ + +#define ETH_MMCTIR_TGFIS_Pos ( 21U ) +#define ETH_MMCTIR_TGFIS_Msk ( 0x1UL << ETH_MMCTIR_TGFIS_Pos ) +#define ETH_MMCTIR_TGFIS ( ETH_MMCTIR_TGFIS_Msk ) + +#define ETH_MMCTIR_TMCGFCIS_Pos ( 15U ) +#define ETH_MMCTIR_TMCGFCIS_Msk ( 0x1UL << ETH_MMCTIR_TMCGFCIS_Pos ) +#define ETH_MMCTIR_TMCGFCIS ( ETH_MMCTIR_TMCGFCIS_Msk ) + +#define ETH_MMCTIR_TSCGFCIS_Pos ( 14U ) +#define ETH_MMCTIR_TSCGFCIS_Msk ( 0x1UL << ETH_MMCTIR_TSCGFCIS_Pos ) +#define ETH_MMCTIR_TSCGFCIS ( ETH_MMCTIR_TSCGFCIS_Msk ) + + +/*************** Bits definition for ETH_MMCRIMR **********************/ + +#define ETH_MMCRIMR_RGUFIM_Pos ( 17U ) +#define ETH_MMCRIMR_RGUFIM_Msk ( 0x1UL << ETH_MMCRIMR_RGUFIM_Pos ) +#define ETH_MMCRIMR_RGUFIM ( ETH_MMCRIMR_RGUFIM_Msk ) + +#define ETH_MMCRIMR_RFAEIM_Pos ( 6U ) +#define ETH_MMCRIMR_RFAEIM_Msk ( 0x1UL << ETH_MMCRIMR_RFAEIM_Pos ) +#define ETH_MMCRIMR_RFAEIM ( ETH_MMCRIMR_RFAEIM_Msk ) + +#define ETH_MMCRIMR_RFCEIM_Pos ( 5U ) +#define ETH_MMCRIMR_RFCEIM_Msk ( 0x1UL << ETH_MMCRIMR_RFCEIM_Pos ) +#define ETH_MMCRIMR_RFCEIM ( ETH_MMCRIMR_RFCEIM_Msk ) + + +/*************** Bits definition for ETH_MMCTIMR **********************/ + +#define ETH_MMCTIMR_TGFIM_Pos ( 21U ) +#define ETH_MMCTIMR_TGFIM_Msk ( 0x1UL << ETH_MMCTIMR_TGFIM_Pos ) +#define ETH_MMCTIMR_TGFIM ( ETH_MMCTIMR_TGFIM_Msk ) + +#define ETH_MMCTIMR_TMCGFCIM_Pos ( 15U ) +#define ETH_MMCTIMR_TMCGFCIM_Msk ( 0x1UL << ETH_MMCTIMR_TMCGFCIM_Pos ) +#define ETH_MMCTIMR_TMCGFCIM ( ETH_MMCTIMR_TMCGFCIM_Msk ) + +#define ETH_MMCTIMR_TSCGFCIM_Pos ( 14U ) +#define ETH_MMCTIMR_TSCGFCIM_Msk ( 0x1UL << ETH_MMCTIMR_TSCGFCIM_Pos ) +#define ETH_MMCTIMR_TSCGFCIM ( ETH_MMCTIMR_TSCGFCIM_Msk ) + + +/*************** Bits definition for ETH_MMCTGFSCCR **********************/ + +#define ETH_MMCTGFSCCR_TGFSCC_Pos ( 0U ) +#define ETH_MMCTGFSCCR_TGFSCC_Msk ( 0xffffffffUL << ETH_MMCTGFSCCR_TGFSCC_Pos ) +#define ETH_MMCTGFSCCR_TGFSCC ( ETH_MMCTGFSCCR_TGFSCC_Msk ) + + +/*************** Bits definition for ETH_MMCTGFMCCR **********************/ + +#define ETH_MMCTGFMCCR_TGFMCC_Pos ( 0U ) +#define ETH_MMCTGFMCCR_TGFMCC_Msk ( 0xffffffffUL << ETH_MMCTGFMCCR_TGFMCC_Pos ) +#define ETH_MMCTGFMCCR_TGFMCC ( ETH_MMCTGFMCCR_TGFMCC_Msk ) + + +/*************** Bits definition for ETH_MMCTGFCR **********************/ + +#define ETH_MMCTGFCR_TGFC_Pos ( 0U ) +#define ETH_MMCTGFCR_TGFC_Msk ( 0xffffffffUL << ETH_MMCTGFCR_TGFC_Pos ) +#define ETH_MMCTGFCR_TGFC ( ETH_MMCTGFCR_TGFC_Msk ) + + +/*************** Bits definition for ETH_MMCRFCECR **********************/ + +#define ETH_MMCRFCECR_RFCEC_Pos ( 0U ) +#define ETH_MMCRFCECR_RFCEC_Msk ( 0xffffffffUL << ETH_MMCRFCECR_RFCEC_Pos ) +#define ETH_MMCRFCECR_RFCEC ( ETH_MMCRFCECR_RFCEC_Msk ) + + +/*************** Bits definition for ETH_MMCRFAECR **********************/ + +#define ETH_MMCRFAECR_RFAEC_Pos ( 0U ) +#define ETH_MMCRFAECR_RFAEC_Msk ( 0xffffffffUL << ETH_MMCRFAECR_RFAEC_Pos ) +#define ETH_MMCRFAECR_RFAEC ( ETH_MMCRFAECR_RFAEC_Msk ) + + +/*************** Bits definition for ETH_MMCRGUFCR **********************/ + +#define ETH_MMCRGUFCR_RGUFC_Pos ( 0U ) +#define ETH_MMCRGUFCR_RGUFC_Msk ( 0xffffffffUL << ETH_MMCRGUFCR_RGUFC_Pos ) +#define ETH_MMCRGUFCR_RGUFC ( ETH_MMCRGUFCR_RGUFC_Msk ) + + +/*************** Bits definition for ETH_MACL3L4C0R **********************/ + +#define ETH_MACL3L4C0R_L4DPIM0_Pos ( 21U ) +#define ETH_MACL3L4C0R_L4DPIM0_Msk ( 0x1UL << ETH_MACL3L4C0R_L4DPIM0_Pos ) +#define ETH_MACL3L4C0R_L4DPIM0 ( ETH_MACL3L4C0R_L4DPIM0_Msk ) + +#define ETH_MACL3L4C0R_L4DPM0_Pos ( 20U ) +#define ETH_MACL3L4C0R_L4DPM0_Msk ( 0x1UL << ETH_MACL3L4C0R_L4DPM0_Pos ) +#define ETH_MACL3L4C0R_L4DPM0 ( ETH_MACL3L4C0R_L4DPM0_Msk ) + +#define ETH_MACL3L4C0R_L4SPIM0_Pos ( 19U ) +#define ETH_MACL3L4C0R_L4SPIM0_Msk ( 0x1UL << ETH_MACL3L4C0R_L4SPIM0_Pos ) +#define ETH_MACL3L4C0R_L4SPIM0 ( ETH_MACL3L4C0R_L4SPIM0_Msk ) + +#define ETH_MACL3L4C0R_L4SPM0_Pos ( 18U ) +#define ETH_MACL3L4C0R_L4SPM0_Msk ( 0x1UL << ETH_MACL3L4C0R_L4SPM0_Pos ) +#define ETH_MACL3L4C0R_L4SPM0 ( ETH_MACL3L4C0R_L4SPM0_Msk ) + +#define ETH_MACL3L4C0R_L4PEN0_Pos ( 16U ) +#define ETH_MACL3L4C0R_L4PEN0_Msk ( 0x1UL << ETH_MACL3L4C0R_L4PEN0_Pos ) +#define ETH_MACL3L4C0R_L4PEN0 ( ETH_MACL3L4C0R_L4PEN0_Msk ) + +#define ETH_MACL3L4C0R_L3HDBM0_Pos ( 11U ) +#define ETH_MACL3L4C0R_L3HDBM0_Msk ( 0x1FUL << ETH_MACL3L4C0R_L3HDBM0_Pos ) +#define ETH_MACL3L4C0R_L3HDBM0 ( ETH_MACL3L4C0R_L3HDBM0_Msk ) +#define ETH_MACL3L4C0R_L3HDBM0_0 ( 0x01UL << ETH_MACL3L4C0R_L3HDBM0_Pos ) +#define ETH_MACL3L4C0R_L3HDBM0_1 ( 0x02UL << ETH_MACL3L4C0R_L3HDBM0_Pos ) +#define ETH_MACL3L4C0R_L3HDBM0_2 ( 0x04UL << ETH_MACL3L4C0R_L3HDBM0_Pos ) +#define ETH_MACL3L4C0R_L3HDBM0_3 ( 0x08UL << ETH_MACL3L4C0R_L3HDBM0_Pos ) +#define ETH_MACL3L4C0R_L3HDBM0_4 ( 0x10UL << ETH_MACL3L4C0R_L3HDBM0_Pos ) + +#define ETH_MACL3L4C0R_L3HSBM0_Pos ( 6U ) +#define ETH_MACL3L4C0R_L3HSBM0_Msk ( 0x1FUL << ETH_MACL3L4C0R_L3HSBM0_Pos ) +#define ETH_MACL3L4C0R_L3HSBM0 ( ETH_MACL3L4C0R_L3HSBM0_Msk ) +#define ETH_MACL3L4C0R_L3HSBM0_0 ( 0x01UL << ETH_MACL3L4C0R_L3HSBM0_Pos ) +#define ETH_MACL3L4C0R_L3HSBM0_1 ( 0x02UL << ETH_MACL3L4C0R_L3HSBM0_Pos ) +#define ETH_MACL3L4C0R_L3HSBM0_2 ( 0x04UL << ETH_MACL3L4C0R_L3HSBM0_Pos ) +#define ETH_MACL3L4C0R_L3HSBM0_3 ( 0x08UL << ETH_MACL3L4C0R_L3HSBM0_Pos ) +#define ETH_MACL3L4C0R_L3HSBM0_4 ( 0x10UL << ETH_MACL3L4C0R_L3HSBM0_Pos ) + +#define ETH_MACL3L4C0R_L3DAIM0_Pos ( 5U ) +#define ETH_MACL3L4C0R_L3DAIM0_Msk ( 0x1UL << ETH_MACL3L4C0R_L3DAIM0_Pos ) +#define ETH_MACL3L4C0R_L3DAIM0 ( ETH_MACL3L4C0R_L3DAIM0_Msk ) + +#define ETH_MACL3L4C0R_L3DAM0_Pos ( 4U ) +#define ETH_MACL3L4C0R_L3DAM0_Msk ( 0x1UL << ETH_MACL3L4C0R_L3DAM0_Pos ) +#define ETH_MACL3L4C0R_L3DAM0 ( ETH_MACL3L4C0R_L3DAM0_Msk ) + +#define ETH_MACL3L4C0R_L3SAIM0_Pos ( 3U ) +#define ETH_MACL3L4C0R_L3SAIM0_Msk ( 0x1UL << ETH_MACL3L4C0R_L3SAIM0_Pos ) +#define ETH_MACL3L4C0R_L3SAIM0 ( ETH_MACL3L4C0R_L3SAIM0_Msk ) + +#define ETH_MACL3L4C0R_L3SAM0_Pos ( 2U ) +#define ETH_MACL3L4C0R_L3SAM0_Msk ( 0x1UL << ETH_MACL3L4C0R_L3SAM0_Pos ) +#define ETH_MACL3L4C0R_L3SAM0 ( ETH_MACL3L4C0R_L3SAM0_Msk ) + +#define ETH_MACL3L4C0R_L3PEN0_Pos ( 0U ) +#define ETH_MACL3L4C0R_L3PEN0_Msk ( 0x1UL << ETH_MACL3L4C0R_L3PEN0_Pos ) +#define ETH_MACL3L4C0R_L3PEN0 ( ETH_MACL3L4C0R_L3PEN0_Msk ) + + +/*************** Bits definition for ETH_MACL4A0R **********************/ + +#define ETH_MACL4A0R_L4DP0_Pos ( 16U ) +#define ETH_MACL4A0R_L4DP0_Msk ( 0xFFFFUL << ETH_MACL4A0R_L4DP0_Pos ) +#define ETH_MACL4A0R_L4DP0 ( ETH_MACL4A0R_L4DP0_Msk ) + +#define ETH_MACL4A0R_L4SP0_Pos ( 0U ) +#define ETH_MACL4A0R_L4SP0_Msk ( 0xFFFFUL << ETH_MACL4A0R_L4SP0_Pos ) +#define ETH_MACL4A0R_L4SP0 ( ETH_MACL4A0R_L4SP0_Msk ) + + +/*************** Bits definition for ETH_MACL3A00R **********************/ + +#define ETH_MACL3A00R_L3A00_Pos ( 0U ) +#define ETH_MACL3A00R_L3A00_Msk ( 0xFFFFFFFFUL << ETH_MACL3A00R_L3A00_Pos ) +#define ETH_MACL3A00R_L3A00 ( ETH_MACL3A00R_L3A00_Msk ) + + +/*************** Bits definition for ETH_MACL3A10R **********************/ + +#define ETH_MACL3A10R_L3A10_Pos ( 0U ) +#define ETH_MACL3A10R_L3A10_Msk ( 0xFFFFFFFFUL << ETH_MACL3A10R_L3A10_Pos ) +#define ETH_MACL3A10R_L3A10 ( ETH_MACL3A10R_L3A10_Msk ) + + +/*************** Bits definition for ETH_MACL3A20R **********************/ + +#define ETH_MACL3A20R_L3A20_Pos ( 0U ) +#define ETH_MACL3A20R_L3A20_Msk ( 0xFFFFFFFFUL << ETH_MACL3A20R_L3A20_Pos ) +#define ETH_MACL3A20R_L3A20 ( ETH_MACL3A20R_L3A20_Msk ) + + +/*************** Bits definition for ETH_MACL3A30R **********************/ + +#define ETH_MACL3A30R_L3A30_Pos ( 0U ) +#define ETH_MACL3A30R_L3A30_Msk ( 0xFFFFFFFFUL << ETH_MACL3A30R_L3A30_Pos ) +#define ETH_MACL3A30R_L3A30 ( ETH_MACL3A30R_L3A30_Msk ) + + +/*************** Bits definition for ETH_MACL3L4C1R **********************/ + +#define ETH_MACL3L4C1R_L4DPIM1_Pos ( 21U ) +#define ETH_MACL3L4C1R_L4DPIM1_Msk ( 0x1UL << ETH_MACL3L4C1R_L4DPIM1_Pos ) +#define ETH_MACL3L4C1R_L4DPIM1 ( ETH_MACL3L4C1R_L4DPIM1_Msk ) + +#define ETH_MACL3L4C1R_L4DPM1_Pos ( 20U ) +#define ETH_MACL3L4C1R_L4DPM1_Msk ( 0x1UL << ETH_MACL3L4C1R_L4DPM1_Pos ) +#define ETH_MACL3L4C1R_L4DPM1 ( ETH_MACL3L4C1R_L4DPM1_Msk ) + +#define ETH_MACL3L4C1R_L4SPIM1_Pos ( 19U ) +#define ETH_MACL3L4C1R_L4SPIM1_Msk ( 0x1UL << ETH_MACL3L4C1R_L4SPIM1_Pos ) +#define ETH_MACL3L4C1R_L4SPIM1 ( ETH_MACL3L4C1R_L4SPIM1_Msk ) + +#define ETH_MACL3L4C1R_L4SPM1_Pos ( 18U ) +#define ETH_MACL3L4C1R_L4SPM1_Msk ( 0x1UL << ETH_MACL3L4C1R_L4SPM1_Pos ) +#define ETH_MACL3L4C1R_L4SPM1 ( ETH_MACL3L4C1R_L4SPM1_Msk ) + +#define ETH_MACL3L4C1R_L4PEN1_Pos ( 16U ) +#define ETH_MACL3L4C1R_L4PEN1_Msk ( 0x1UL << ETH_MACL3L4C1R_L4PEN1_Pos ) +#define ETH_MACL3L4C1R_L4PEN1 ( ETH_MACL3L4C1R_L4PEN1_Msk ) + +#define ETH_MACL3L4C1R_L3HDBM1_Pos ( 11U ) +#define ETH_MACL3L4C1R_L3HDBM1_Msk ( 0x1FUL << ETH_MACL3L4C1R_L3HDBM1_Pos ) +#define ETH_MACL3L4C1R_L3HDBM1 ( ETH_MACL3L4C1R_L3HDBM1_Msk ) +#define ETH_MACL3L4C1R_L3HDBM1_0 ( 0x01UL << ETH_MACL3L4C1R_L3HDBM1_Pos ) +#define ETH_MACL3L4C1R_L3HDBM1_1 ( 0x02UL << ETH_MACL3L4C1R_L3HDBM1_Pos ) +#define ETH_MACL3L4C1R_L3HDBM1_2 ( 0x04UL << ETH_MACL3L4C1R_L3HDBM1_Pos ) +#define ETH_MACL3L4C1R_L3HDBM1_3 ( 0x08UL << ETH_MACL3L4C1R_L3HDBM1_Pos ) +#define ETH_MACL3L4C1R_L3HDBM1_4 ( 0x10UL << ETH_MACL3L4C1R_L3HDBM1_Pos ) + +#define ETH_MACL3L4C1R_L3HSBM1_Pos ( 6U ) +#define ETH_MACL3L4C1R_L3HSBM1_Msk ( 0x1FUL << ETH_MACL3L4C1R_L3HSBM1_Pos ) +#define ETH_MACL3L4C1R_L3HSBM1 ( ETH_MACL3L4C1R_L3HSBM1_Msk ) +#define ETH_MACL3L4C1R_L3HSBM1_0 ( 0x01UL << ETH_MACL3L4C1R_L3HSBM1_Pos ) +#define ETH_MACL3L4C1R_L3HSBM1_1 ( 0x02UL << ETH_MACL3L4C1R_L3HSBM1_Pos ) +#define ETH_MACL3L4C1R_L3HSBM1_2 ( 0x04UL << ETH_MACL3L4C1R_L3HSBM1_Pos ) +#define ETH_MACL3L4C1R_L3HSBM1_3 ( 0x08UL << ETH_MACL3L4C1R_L3HSBM1_Pos ) +#define ETH_MACL3L4C1R_L3HSBM1_4 ( 0x10UL << ETH_MACL3L4C1R_L3HSBM1_Pos ) + +#define ETH_MACL3L4C1R_L3DAIM1_Pos ( 5U ) +#define ETH_MACL3L4C1R_L3DAIM1_Msk ( 0x1UL << ETH_MACL3L4C1R_L3DAIM1_Pos ) +#define ETH_MACL3L4C1R_L3DAIM1 ( ETH_MACL3L4C1R_L3DAIM1_Msk ) + +#define ETH_MACL3L4C1R_L3DAM1_Pos ( 4U ) +#define ETH_MACL3L4C1R_L3DAM1_Msk ( 0x1UL << ETH_MACL3L4C1R_L3DAM1_Pos ) +#define ETH_MACL3L4C1R_L3DAM1 ( ETH_MACL3L4C1R_L3DAM1_Msk ) + +#define ETH_MACL3L4C1R_L3SAIM1_Pos ( 3U ) +#define ETH_MACL3L4C1R_L3SAIM1_Msk ( 0x1UL << ETH_MACL3L4C1R_L3SAIM1_Pos ) +#define ETH_MACL3L4C1R_L3SAIM1 ( ETH_MACL3L4C1R_L3SAIM1_Msk ) + +#define ETH_MACL3L4C1R_L3SAM1_Pos ( 2U ) +#define ETH_MACL3L4C1R_L3SAM1_Msk ( 0x1UL << ETH_MACL3L4C1R_L3SAM1_Pos ) +#define ETH_MACL3L4C1R_L3SAM1 ( ETH_MACL3L4C1R_L3SAM1_Msk ) + +#define ETH_MACL3L4C1R_L3PEN1_Pos ( 0U ) +#define ETH_MACL3L4C1R_L3PEN1_Msk ( 0x1UL << ETH_MACL3L4C1R_L3PEN1_Pos ) +#define ETH_MACL3L4C1R_L3PEN1 ( ETH_MACL3L4C1R_L3PEN1_Msk ) + + +/*************** Bits definition for ETH_MACL4A1R **********************/ + +#define ETH_MACL4A1R_L4DP1_Pos ( 16U ) +#define ETH_MACL4A1R_L4DP1_Msk ( 0xFFFFUL << ETH_MACL4A1R_L4DP1_Pos ) +#define ETH_MACL4A1R_L4DP1 ( ETH_MACL4A1R_L4DP1_Msk ) + +#define ETH_MACL4A1R_L4SP1_Pos ( 0U ) +#define ETH_MACL4A1R_L4SP1_Msk ( 0xFFFFUL << ETH_MACL4A1R_L4SP1_Pos ) +#define ETH_MACL4A1R_L4SP1 ( ETH_MACL4A1R_L4SP1_Msk ) + + +/*************** Bits definition for ETH_MACL3A01R **********************/ + +#define ETH_MACL3A01R_L3A01_Pos ( 0U ) +#define ETH_MACL3A01R_L3A01_Msk ( 0xFFFFFFFFUL << ETH_MACL3A01R_L3A01_Pos ) +#define ETH_MACL3A01R_L3A01 ( ETH_MACL3A01R_L3A01_Msk ) + + +/*************** Bits definition for ETH_MACL3A11R **********************/ + +#define ETH_MACL3A11R_L3A11_Pos ( 0U ) +#define ETH_MACL3A11R_L3A11_Msk ( 0xFFFFFFFFUL << ETH_MACL3A11R_L3A11_Pos ) +#define ETH_MACL3A11R_L3A11 ( ETH_MACL3A11R_L3A11_Msk ) + + +/*************** Bits definition for ETH_MACL3A21R **********************/ + +#define ETH_MACL3A21R_L3A21_Pos ( 0U ) +#define ETH_MACL3A21R_L3A21_Msk ( 0xFFFFFFFFUL << ETH_MACL3A21R_L3A21_Pos ) +#define ETH_MACL3A21R_L3A21 ( ETH_MACL3A21R_L3A21_Msk ) + + +/*************** Bits definition for ETH_MACL3A31R **********************/ + +#define ETH_MACL3A31R_L3A31_Pos ( 0U ) +#define ETH_MACL3A31R_L3A31_Msk ( 0xFFFFFFFFUL << ETH_MACL3A31R_L3A31_Pos ) +#define ETH_MACL3A31R_L3A31 ( ETH_MACL3A31R_L3A31_Msk ) + + +/*************** Bits definition for ETH_MACVTIRR **********************/ + +#define ETH_MACVTIRR_CSVL_Pos ( 19U ) +#define ETH_MACVTIRR_CSVL_Msk ( 0x1UL << ETH_MACVTIRR_CSVL_Pos ) +#define ETH_MACVTIRR_CSVL ( ETH_MACVTIRR_CSVL_Msk ) + +#define ETH_MACVTIRR_VLP_Pos ( 18U ) +#define ETH_MACVTIRR_VLP_Msk ( 0x1UL << ETH_MACVTIRR_VLP_Pos ) +#define ETH_MACVTIRR_VLP ( ETH_MACVTIRR_VLP_Msk ) + +#define ETH_MACVTIRR_VLC_Pos ( 16U ) +#define ETH_MACVTIRR_VLC_Msk ( 0x3UL << ETH_MACVTIRR_VLC_Pos ) +#define ETH_MACVTIRR_VLC ( ETH_MACVTIRR_VLC_Msk ) +#define ETH_MACVTIRR_VLC_0 ( 0x1UL << ETH_MACVTIRR_VLC_Pos ) +#define ETH_MACVTIRR_VLC_1 ( 0x2UL << ETH_MACVTIRR_VLC_Pos ) + +#define ETH_MACVTIRR_VLT_Pos ( 0U ) +#define ETH_MACVTIRR_VLT_Msk ( 0xFFFFUL << ETH_MACVTIRR_VLT_Pos ) +#define ETH_MACVTIRR_VLT ( ETH_MACVTIRR_VLT_Msk ) + + +/*************** Bits definition for ETH_MACVHTR **********************/ + +#define ETH_MACVHTR_CSVL_Pos ( 0U ) +#define ETH_MACVHTR_CSVL_Msk ( 0xFFFFUL << ETH_MACVHTR_CSVL_Pos ) +#define ETH_MACVHTR_CSVL ( ETH_MACVHTR_CSVL_Msk ) + + +/*************** Bits definition for ETH_PTPTSCR **********************/ + +#define ETH_PTPTSCR_ASEN3_Pos ( 28U ) +#define ETH_PTPTSCR_ASEN3_Msk ( 0x1UL << ETH_PTPTSCR_ASEN3_Pos ) +#define ETH_PTPTSCR_ASEN3 ( ETH_PTPTSCR_ASEN3_Msk ) + +#define ETH_PTPTSCR_ASEN2_Pos ( 27U ) +#define ETH_PTPTSCR_ASEN2_Msk ( 0x1UL << ETH_PTPTSCR_ASEN2_Pos ) +#define ETH_PTPTSCR_ASEN2 ( ETH_PTPTSCR_ASEN2_Msk ) + +#define ETH_PTPTSCR_ASEN1_Pos ( 26U ) +#define ETH_PTPTSCR_ASEN1_Msk ( 0x1UL << ETH_PTPTSCR_ASEN1_Pos ) +#define ETH_PTPTSCR_ASEN1 ( ETH_PTPTSCR_ASEN1_Msk ) + +#define ETH_PTPTSCR_ASEN0_Pos ( 25U ) +#define ETH_PTPTSCR_ASEN0_Msk ( 0x1UL << ETH_PTPTSCR_ASEN0_Pos ) +#define ETH_PTPTSCR_ASEN0 ( ETH_PTPTSCR_ASEN0_Msk ) + +#define ETH_PTPTSCR_ASFC_Pos ( 24U ) +#define ETH_PTPTSCR_ASFC_Msk ( 0x1UL << ETH_PTPTSCR_ASFC_Pos ) +#define ETH_PTPTSCR_ASFC ( ETH_PTPTSCR_ASFC_Msk ) + +#define ETH_PTPTSCR_EMAFPFF_Pos ( 18U ) +#define ETH_PTPTSCR_EMAFPFF_Msk ( 0x1UL << ETH_PTPTSCR_EMAFPFF_Pos ) +#define ETH_PTPTSCR_EMAFPFF ( ETH_PTPTSCR_EMAFPFF_Msk ) + +#define ETH_PTPTSCR_SPPFTS_Pos ( 16U ) +#define ETH_PTPTSCR_SPPFTS_Msk ( 0x3UL << ETH_PTPTSCR_SPPFTS_Pos ) +#define ETH_PTPTSCR_SPPFTS ( ETH_PTPTSCR_SPPFTS_Msk ) +#define ETH_PTPTSCR_SPPFTS_0 ( 0x1UL << ETH_PTPTSCR_SPPFTS_Pos ) +#define ETH_PTPTSCR_SPPFTS_1 ( 0x2UL << ETH_PTPTSCR_SPPFTS_Pos ) + +#define ETH_PTPTSCR_ESFMRTM_Pos ( 15U ) +#define ETH_PTPTSCR_ESFMRTM_Msk ( 0x1UL << ETH_PTPTSCR_ESFMRTM_Pos ) +#define ETH_PTPTSCR_ESFMRTM ( ETH_PTPTSCR_ESFMRTM_Msk ) + +#define ETH_PTPTSCR_ETSFEM_Pos ( 14U ) +#define ETH_PTPTSCR_ETSFEM_Msk ( 0x1UL << ETH_PTPTSCR_ETSFEM_Pos ) +#define ETH_PTPTSCR_ETSFEM ( ETH_PTPTSCR_ETSFEM_Msk ) + +#define ETH_PTPTSCR_EPPFSIP4U_Pos ( 13U ) +#define ETH_PTPTSCR_EPPFSIP4U_Msk ( 0x1UL << ETH_PTPTSCR_EPPFSIP4U_Pos ) +#define ETH_PTPTSCR_EPPFSIP4U ( ETH_PTPTSCR_EPPFSIP4U_Msk ) + +#define ETH_PTPTSCR_EPPFSIP6U_Pos ( 12U ) +#define ETH_PTPTSCR_EPPFSIP6U_Msk ( 0x1UL << ETH_PTPTSCR_EPPFSIP6U_Pos ) +#define ETH_PTPTSCR_EPPFSIP6U ( ETH_PTPTSCR_EPPFSIP6U_Msk ) + +#define ETH_PTPTSCR_EPPEF_Pos ( 11U ) +#define ETH_PTPTSCR_EPPEF_Msk ( 0x1UL << ETH_PTPTSCR_EPPEF_Pos ) +#define ETH_PTPTSCR_EPPEF ( ETH_PTPTSCR_EPPEF_Msk ) + +#define ETH_PTPTSCR_TSPTPPSV2E_Pos ( 10U ) +#define ETH_PTPTSCR_TSPTPPSV2E_Msk ( 0x1UL << ETH_PTPTSCR_TSPTPPSV2E_Pos ) +#define ETH_PTPTSCR_TSPTPPSV2E ( ETH_PTPTSCR_TSPTPPSV2E_Msk ) + +#define ETH_PTPTSCR_TSR_Pos ( 9U ) +#define ETH_PTPTSCR_TSR_Msk ( 0x1UL << ETH_PTPTSCR_TSR_Pos ) +#define ETH_PTPTSCR_TSR ( ETH_PTPTSCR_TSR_Msk ) + +#define ETH_PTPTSCR_TSARFE_Pos ( 8U ) +#define ETH_PTPTSCR_TSARFE_Msk ( 0x1UL << ETH_PTPTSCR_TSARFE_Pos ) +#define ETH_PTPTSCR_TSARFE ( ETH_PTPTSCR_TSARFE_Msk ) + +#define ETH_PTPTSCR_TARU_Pos ( 5U ) +#define ETH_PTPTSCR_TARU_Msk ( 0x1UL << ETH_PTPTSCR_TARU_Pos ) +#define ETH_PTPTSCR_TARU ( ETH_PTPTSCR_TARU_Msk ) + +#define ETH_PTPTSCR_TITE_Pos ( 4U ) +#define ETH_PTPTSCR_TITE_Msk ( 0x1UL << ETH_PTPTSCR_TITE_Pos ) +#define ETH_PTPTSCR_TITE ( ETH_PTPTSCR_TITE_Msk ) + +#define ETH_PTPTSCR_TU_Pos ( 3U ) +#define ETH_PTPTSCR_TU_Msk ( 0x1UL << ETH_PTPTSCR_TU_Pos ) +#define ETH_PTPTSCR_TU ( ETH_PTPTSCR_TU_Msk ) + +#define ETH_PTPTSCR_TI_Pos ( 2U ) +#define ETH_PTPTSCR_TI_Msk ( 0x1UL << ETH_PTPTSCR_TI_Pos ) +#define ETH_PTPTSCR_TI ( ETH_PTPTSCR_TI_Msk ) + +#define ETH_PTPTSCR_TFCU_Pos ( 1U ) +#define ETH_PTPTSCR_TFCU_Msk ( 0x1UL << ETH_PTPTSCR_TFCU_Pos ) +#define ETH_PTPTSCR_TFCU ( ETH_PTPTSCR_TFCU_Msk ) + +#define ETH_PTPTSCR_TE_Pos ( 0U ) +#define ETH_PTPTSCR_TE_Msk ( 0x1UL << ETH_PTPTSCR_TE_Pos ) +#define ETH_PTPTSCR_TE ( ETH_PTPTSCR_TE_Msk ) + + +/*************** Bits definition for ETH_PTPSSIR **********************/ + +#define ETH_PTPSSIR_SSIV_Pos ( 0U ) +#define ETH_PTPSSIR_SSIV_Msk ( 0xffUL << ETH_PTPSSIR_SSIV_Pos ) +#define ETH_PTPSSIR_SSIV ( ETH_PTPSSIR_SSIV_Msk ) +#define ETH_PTPSSIR_SSIV_0 ( 0x1UL << ETH_PTPSSIR_SSIV_Pos ) +#define ETH_PTPSSIR_SSIV_1 ( 0x2UL << ETH_PTPSSIR_SSIV_Pos ) +#define ETH_PTPSSIR_SSIV_2 ( 0x4UL << ETH_PTPSSIR_SSIV_Pos ) +#define ETH_PTPSSIR_SSIV_3 ( 0x8UL << ETH_PTPSSIR_SSIV_Pos ) +#define ETH_PTPSSIR_SSIV_4 ( 0x10UL << ETH_PTPSSIR_SSIV_Pos ) +#define ETH_PTPSSIR_SSIV_5 ( 0x20UL << ETH_PTPSSIR_SSIV_Pos ) +#define ETH_PTPSSIR_SSIV_6 ( 0x40UL << ETH_PTPSSIR_SSIV_Pos ) +#define ETH_PTPSSIR_SSIV_7 ( 0x80UL << ETH_PTPSSIR_SSIV_Pos ) + + +/*************** Bits definition for ETH_PTPTSHR **********************/ + +#define ETH_PTPTSHR_TS_Pos ( 0U ) +#define ETH_PTPTSHR_TS_Msk ( 0xffffffffUL << ETH_PTPTSHR_TS_Pos ) +#define ETH_PTPTSHR_TS ( ETH_PTPTSHR_TS_Msk ) + + +/*************** Bits definition for ETH_PTPTSLR **********************/ + +#define ETH_PTPTSLR_TSS_Pos ( 0U ) +#define ETH_PTPTSLR_TSS_Msk ( 0x7fffffffUL << ETH_PTPTSLR_TSS_Pos ) +#define ETH_PTPTSLR_TSS ( ETH_PTPTSLR_TSS_Msk ) + + +/*************** Bits definition for ETH_PTPTSHUR **********************/ + +#define ETH_PTPTSHUR_TSU_Pos ( 0U ) +#define ETH_PTPTSHUR_TSU_Msk ( 0xffffffffUL << ETH_PTPTSHUR_TSU_Pos ) +#define ETH_PTPTSHUR_TSU ( ETH_PTPTSHUR_TSU_Msk ) + + +/*************** Bits definition for ETH_PTPTSLUR **********************/ + +#define ETH_PTPTSLUR_AST_Pos ( 31U ) +#define ETH_PTPTSLUR_AST_Msk ( 0x1UL << ETH_PTPTSLUR_AST_Pos ) +#define ETH_PTPTSLUR_AST ( ETH_PTPTSLUR_AST_Msk ) + +#define ETH_PTPTSLUR_TSSU_Pos ( 0U ) +#define ETH_PTPTSLUR_TSSU_Msk ( 0x7fffffffUL << ETH_PTPTSLUR_TSSU_Pos ) +#define ETH_PTPTSLUR_TSSU ( ETH_PTPTSLUR_TSSU_Msk ) + + +/*************** Bits definition for ETH_PTPTSAR **********************/ + +#define ETH_PTPTSAR_TAR_Pos ( 0U ) +#define ETH_PTPTSAR_TAR_Msk ( 0xffffffffUL << ETH_PTPTSAR_TAR_Pos ) +#define ETH_PTPTSAR_TAR ( ETH_PTPTSAR_TAR_Msk ) + + +/*************** Bits definition for ETH_PTPTTHR **********************/ + +#define ETH_PTPTTHR_TTSR_Pos ( 0U ) +#define ETH_PTPTTHR_TTSR_Msk ( 0xffffffffUL << ETH_PTPTTHR_TTSR_Pos ) +#define ETH_PTPTTHR_TTSR ( ETH_PTPTTHR_TTSR_Msk ) + + +/*************** Bits definition for ETH_PTPTTLR **********************/ + +#define ETH_PTPTTLR_TTRB_Pos ( 31U ) +#define ETH_PTPTTLR_TTRB_Msk ( 0x1UL << ETH_PTPTTLR_TTRB_Pos ) +#define ETH_PTPTTLR_TTRB ( ETH_PTPTTLR_TTRB_Msk ) + +#define ETH_PTPTTLR_TTLR_Pos ( 0U ) +#define ETH_PTPTTLR_TTLR_Msk ( 0x7fffffffUL << ETH_PTPTTLR_TTLR_Pos ) +#define ETH_PTPTTLR_TTLR ( ETH_PTPTTLR_TTLR_Msk ) + + +/*************** Bits definition for ETH_PTPTSSR **********************/ + +#define ETH_PTPTSSR_ATSNS_Pos ( 25U ) +#define ETH_PTPTSSR_ATSNS_Msk ( 0x7UL << ETH_PTPTSSR_ATSNS_Pos ) +#define ETH_PTPTSSR_ATSNS ( ETH_PTPTSSR_ATSNS_Msk ) + +#define ETH_PTPTSSR_ATSTM_Pos ( 24U ) +#define ETH_PTPTSSR_ATSTM_Msk ( 0x1UL << ETH_PTPTSSR_ATSTM_Pos ) +#define ETH_PTPTSSR_ATSTM ( ETH_PTPTSSR_ATSTM_Msk ) + +#define ETH_PTPTSSR_ATSTI_Pos ( 16U ) +#define ETH_PTPTSSR_ATSTI_Msk ( 0xFUL << ETH_PTPTSSR_ATSTI_Pos ) +#define ETH_PTPTSSR_ATSTI ( ETH_PTPTSSR_ATSTI_Msk ) +#define ETH_PTPTSSR_ATSTI_0 ( 0x1UL << ETH_PTPTSSR_ATSTI_Pos ) +#define ETH_PTPTSSR_ATSTI_1 ( 0x2UL << ETH_PTPTSSR_ATSTI_Pos ) +#define ETH_PTPTSSR_ATSTI_2 ( 0x4UL << ETH_PTPTSSR_ATSTI_Pos ) +#define ETH_PTPTSSR_ATSTI_3 ( 0x8UL << ETH_PTPTSSR_ATSTI_Pos ) + +#define ETH_PTPTSSR_TTTE_Pos ( 3U ) +#define ETH_PTPTSSR_TTTE_Msk ( 0x1UL << ETH_PTPTSSR_TTTE_Pos ) +#define ETH_PTPTSSR_TTTE ( ETH_PTPTSSR_TTTE_Msk ) + +#define ETH_PTPTSSR_ATTS_Pos ( 2U ) +#define ETH_PTPTSSR_ATTS_Msk ( 0x1UL << ETH_PTPTSSR_ATTS_Pos ) +#define ETH_PTPTSSR_ATTS ( ETH_PTPTSSR_ATTS_Msk ) + +#define ETH_PTPTSSR_TTTR_Pos ( 1U ) +#define ETH_PTPTSSR_TTTR_Msk ( 0x1UL << ETH_PTPTSSR_TTTR_Pos ) +#define ETH_PTPTSSR_TTTR ( ETH_PTPTSSR_TTTR_Msk ) + +#define ETH_PTPTSSR_TSO_Pos ( 0U ) +#define ETH_PTPTSSR_TSO_Msk ( 0x1UL << ETH_PTPTSSR_TSO_Pos ) +#define ETH_PTPTSSR_TSO ( ETH_PTPTSSR_TSO_Msk ) + + +/*************** Bits definition for ETH_PTPPPSCR **********************/ + +#define ETH_PTPPPSCR_TRGTMODSEL_Pos ( 5U ) +#define ETH_PTPPPSCR_TRGTMODSEL_Msk ( 0x3UL << ETH_PTPPPSCR_TRGTMODSEL_Pos ) +#define ETH_PTPPPSCR_TRGTMODSEL ( ETH_PTPPPSCR_TRGTMODSEL_Msk ) +#define ETH_PTPPPSCR_TRGTMODSEL_0 ( 0x1UL << ETH_PTPPPSCR_TRGTMODSEL_Pos ) +#define ETH_PTPPPSCR_TRGTMODSEL_1 ( 0x2UL << ETH_PTPPPSCR_TRGTMODSEL_Pos ) + +#define ETH_PTPPPSCR_PPSEN_Pos ( 4U ) +#define ETH_PTPPPSCR_PPSEN_Msk ( 0x1UL << ETH_PTPPPSCR_PPSEN_Pos ) +#define ETH_PTPPPSCR_PPSEN ( ETH_PTPPPSCR_PPSEN_Msk ) + +#define ETH_PTPPPSCR_PPSCTRL_Pos ( 0U ) +#define ETH_PTPPPSCR_PPSCTRL_Msk ( 0xfUL << ETH_PTPPPSCR_PPSCTRL_Pos ) +#define ETH_PTPPPSCR_PPSCTRL ( ETH_PTPPPSCR_PPSCTRL_Msk ) +#define ETH_PTPPPSCR_PPSCTRL_0 ( 0x1UL << ETH_PTPPPSCR_PPSCTRL_Pos ) +#define ETH_PTPPPSCR_PPSCTRL_1 ( 0x2UL << ETH_PTPPPSCR_PPSCTRL_Pos ) +#define ETH_PTPPPSCR_PPSCTRL_2 ( 0x4UL << ETH_PTPPPSCR_PPSCTRL_Pos ) +#define ETH_PTPPPSCR_PPSCTRL_3 ( 0x8UL << ETH_PTPPPSCR_PPSCTRL_Pos ) + +#define ETH_PTPPPSCR_PPSCMD_Pos ( 0U ) +#define ETH_PTPPPSCR_PPSCMD_Msk ( 0xfUL << ETH_PTPPPSCR_PPSCMD_Pos ) +#define ETH_PTPPPSCR_PPSCMD ( ETH_PTPPPSCR_PPSCMD_Msk ) +#define ETH_PTPPPSCR_PPSCMD_0 ( 0x1UL << ETH_PTPPPSCR_PPSCMD_Pos ) +#define ETH_PTPPPSCR_PPSCMD_1 ( 0x2UL << ETH_PTPPPSCR_PPSCMD_Pos ) +#define ETH_PTPPPSCR_PPSCMD_2 ( 0x4UL << ETH_PTPPPSCR_PPSCMD_Pos ) +#define ETH_PTPPPSCR_PPSCMD_3 ( 0x8UL << ETH_PTPPPSCR_PPSCMD_Pos ) + + +/*************** Bits definition for ETH_PTPATSNR **********************/ + +#define ETH_PTPATSNR_AUSTSLO_Pos ( 0U ) +#define ETH_PTPATSNR_AUSTSLO_Msk ( 0x7fffffffUL << ETH_PTPATSNR_AUSTSLO_Pos ) +#define ETH_PTPATSNR_AUSTSLO ( ETH_PTPATSNR_AUSTSLO_Msk ) + + +/*************** Bits definition for ETH_PTPATSSR **********************/ + +#define ETH_PTPATSSR_AUSTSHI_Pos ( 0U ) +#define ETH_PTPATSSR_AUSTSHI_Msk ( 0x7fffffffUL << ETH_PTPATSSR_AUSTSHI_Pos ) +#define ETH_PTPATSSR_AUSTSHI ( ETH_PTPATSSR_AUSTSHI_Msk ) + + +/*************** Bits definition for ETH_PTPPPSIR **********************/ + +#define ETH_PTPPPSIR_PPSINT_Pos ( 0U ) +#define ETH_PTPPPSIR_PPSINT_Msk ( 0xffffffffUL << ETH_PTPPPSIR_PPSINT_Pos ) +#define ETH_PTPPPSIR_PPSINT ( ETH_PTPPPSIR_PPSINT_Msk ) + + +/*************** Bits definition for ETH_PTPPPSWR **********************/ + +#define ETH_PTPPPSWR_PPSWIDTH_Pos ( 0U ) +#define ETH_PTPPPSWR_PPSWIDTH_Msk ( 0xffffffffUL << ETH_PTPPPSWR_PPSWIDTH_Pos ) +#define ETH_PTPPPSWR_PPSWIDTH ( ETH_PTPPPSWR_PPSWIDTH_Msk ) + + +/*************** Bits definition for ETH_DMABMR **********************/ + +#define ETH_DMABMR_RIB_Pos ( 31U ) +#define ETH_DMABMR_RIB_Msk ( 0x1UL << ETH_DMABMR_RIB_Pos ) +#define ETH_DMABMR_RIB ( ETH_DMABMR_RIB_Msk ) + +#define ETH_DMABMR_TXPR_Pos ( 27U ) +#define ETH_DMABMR_TXPR_Msk ( 0x1UL << ETH_DMABMR_TXPR_Pos ) +#define ETH_DMABMR_TXPR ( ETH_DMABMR_TXPR_Msk ) + +#define ETH_DMABMR_MB_Pos ( 26U ) +#define ETH_DMABMR_MB_Msk ( 0x1UL << ETH_DMABMR_MB_Pos ) +#define ETH_DMABMR_MB ( ETH_DMABMR_MB_Msk ) + +#define ETH_DMABMR_AAB_Pos ( 25U ) +#define ETH_DMABMR_AAB_Msk ( 0x1UL << ETH_DMABMR_AAB_Pos ) +#define ETH_DMABMR_AAB ( ETH_DMABMR_AAB_Msk ) + +#define ETH_DMABMR_EPM_Pos ( 24U ) +#define ETH_DMABMR_EPM_Msk ( 0x1UL << ETH_DMABMR_EPM_Pos ) +#define ETH_DMABMR_EPM ( ETH_DMABMR_EPM_Msk ) + +#define ETH_DMABMR_USP_Pos ( 23U ) +#define ETH_DMABMR_USP_Msk ( 0x1UL << ETH_DMABMR_USP_Pos ) +#define ETH_DMABMR_USP ( ETH_DMABMR_USP_Msk ) + +#define ETH_DMABMR_RDP_Pos ( 17U ) +#define ETH_DMABMR_RDP_Msk ( 0x3fUL << ETH_DMABMR_RDP_Pos ) +#define ETH_DMABMR_RDP ( ETH_DMABMR_RDP_Msk ) +#define ETH_DMABMR_RDP_0 ( 0x1UL << ETH_DMABMR_RDP_Pos ) +#define ETH_DMABMR_RDP_1 ( 0x2UL << ETH_DMABMR_RDP_Pos ) +#define ETH_DMABMR_RDP_2 ( 0x4UL << ETH_DMABMR_RDP_Pos ) +#define ETH_DMABMR_RDP_3 ( 0x8UL << ETH_DMABMR_RDP_Pos ) +#define ETH_DMABMR_RDP_4 ( 0x10UL << ETH_DMABMR_RDP_Pos ) +#define ETH_DMABMR_RDP_5 ( 0x20UL << ETH_DMABMR_RDP_Pos ) + +#define ETH_DMABMR_FB_Pos ( 16U ) +#define ETH_DMABMR_FB_Msk ( 0x1UL << ETH_DMABMR_FB_Pos ) +#define ETH_DMABMR_FB ( ETH_DMABMR_FB_Msk ) + +#define ETH_DMABMR_PM_Pos ( 14U ) +#define ETH_DMABMR_PM_Msk ( 0x3UL << ETH_DMABMR_PM_Pos ) +#define ETH_DMABMR_PM ( ETH_DMABMR_PM_Msk ) +#define ETH_DMABMR_PM_0 ( 0x1UL << ETH_DMABMR_PM_Pos ) +#define ETH_DMABMR_PM_1 ( 0x2UL << ETH_DMABMR_PM_Pos ) + +#define ETH_DMABMR_PBL_Pos ( 8U ) +#define ETH_DMABMR_PBL_Msk ( 0x3fUL << ETH_DMABMR_PBL_Pos ) +#define ETH_DMABMR_PBL ( ETH_DMABMR_PBL_Msk ) +#define ETH_DMABMR_PBL_0 ( 0x1UL << ETH_DMABMR_PBL_Pos ) +#define ETH_DMABMR_PBL_1 ( 0x2UL << ETH_DMABMR_PBL_Pos ) +#define ETH_DMABMR_PBL_2 ( 0x4UL << ETH_DMABMR_PBL_Pos ) +#define ETH_DMABMR_PBL_3 ( 0x8UL << ETH_DMABMR_PBL_Pos ) +#define ETH_DMABMR_PBL_4 ( 0x10UL << ETH_DMABMR_PBL_Pos ) +#define ETH_DMABMR_PBL_5 ( 0x20UL << ETH_DMABMR_PBL_Pos ) + +#define ETH_DMABMR_EDFE_Pos ( 7U ) +#define ETH_DMABMR_EDFE_Msk ( 0x1UL << ETH_DMABMR_EDFE_Pos ) +#define ETH_DMABMR_EDFE ( ETH_DMABMR_EDFE_Msk ) + +#define ETH_DMABMR_DSL_Pos ( 2U ) +#define ETH_DMABMR_DSL_Msk ( 0x1fUL << ETH_DMABMR_DSL_Pos ) +#define ETH_DMABMR_DSL ( ETH_DMABMR_DSL_Msk ) +#define ETH_DMABMR_DSL_0 ( 0x1UL << ETH_DMABMR_DSL_Pos ) +#define ETH_DMABMR_DSL_1 ( 0x2UL << ETH_DMABMR_DSL_Pos ) +#define ETH_DMABMR_DSL_2 ( 0x4UL << ETH_DMABMR_DSL_Pos ) +#define ETH_DMABMR_DSL_3 ( 0x8UL << ETH_DMABMR_DSL_Pos ) +#define ETH_DMABMR_DSL_4 ( 0x10UL << ETH_DMABMR_DSL_Pos ) + +#define ETH_DMABMR_DA_Pos ( 1U ) +#define ETH_DMABMR_DA_Msk ( 0x1UL << ETH_DMABMR_DA_Pos ) +#define ETH_DMABMR_DA ( ETH_DMABMR_DA_Msk ) + +#define ETH_DMABMR_SWR_Pos ( 0U ) +#define ETH_DMABMR_SWR_Msk ( 0x1UL << ETH_DMABMR_SWR_Pos ) +#define ETH_DMABMR_SWR ( ETH_DMABMR_SWR_Msk ) + + +/*************** Bits definition for ETH_DMATPDR **********************/ + +#define ETH_DMATPDR_TPD_Pos ( 0U ) +#define ETH_DMATPDR_TPD_Msk ( 0xffffffffUL << ETH_DMATPDR_TPD_Pos ) +#define ETH_DMATPDR_TPD ( ETH_DMATPDR_TPD_Msk ) + + +/*************** Bits definition for ETH_DMARPDR **********************/ + +#define ETH_DMARPDR_RPD_Pos ( 0U ) +#define ETH_DMARPDR_RPD_Msk ( 0xffffffffUL << ETH_DMARPDR_RPD_Pos ) +#define ETH_DMARPDR_RPD ( ETH_DMARPDR_RPD_Msk ) + + +/*************** Bits definition for ETH_DMARDLAR **********************/ + +#define ETH_DMARDLAR_SRL_Pos ( 0U ) +#define ETH_DMARDLAR_SRL_Msk ( 0xffffffffUL << ETH_DMARDLAR_SRL_Pos ) +#define ETH_DMARDLAR_SRL ( ETH_DMARDLAR_SRL_Msk ) + + +/*************** Bits definition for ETH_DMATDLAR **********************/ + +#define ETH_DMATDLAR_STL_Pos ( 0U ) +#define ETH_DMATDLAR_STL_Msk ( 0xffffffffUL << ETH_DMATDLAR_STL_Pos ) +#define ETH_DMATDLAR_STL ( ETH_DMATDLAR_STL_Msk ) + + +/*************** Bits definition for ETH_DMASR **********************/ + +#define ETH_DMASR_LPIS_Pos ( 30U ) +#define ETH_DMASR_LPIS_Msk ( 0x1UL << ETH_DMASR_LPIS_Pos ) +#define ETH_DMASR_LPIS ( ETH_DMASR_LPIS_Msk ) + +#define ETH_DMASR_TSTS_Pos ( 29U ) +#define ETH_DMASR_TSTS_Msk ( 0x1UL << ETH_DMASR_TSTS_Pos ) +#define ETH_DMASR_TSTS ( ETH_DMASR_TSTS_Msk ) + +#define ETH_DMASR_PMTS_Pos ( 28U ) +#define ETH_DMASR_PMTS_Msk ( 0x1UL << ETH_DMASR_PMTS_Pos ) +#define ETH_DMASR_PMTS ( ETH_DMASR_PMTS_Msk ) + +#define ETH_DMASR_MMCS_Pos ( 27U ) +#define ETH_DMASR_MMCS_Msk ( 0x1UL << ETH_DMASR_MMCS_Pos ) +#define ETH_DMASR_MMCS ( ETH_DMASR_MMCS_Msk ) + +#define ETH_DMASR_EBS_Pos ( 23U ) +#define ETH_DMASR_EBS_Msk ( 0x7UL << ETH_DMASR_EBS_Pos ) +#define ETH_DMASR_EBS ( ETH_DMASR_EBS_Msk ) +#define ETH_DMASR_EBS_0 ( 0x1UL << ETH_DMASR_EBS_Pos ) +#define ETH_DMASR_EBS_1 ( 0x2UL << ETH_DMASR_EBS_Pos ) +#define ETH_DMASR_EBS_2 ( 0x4UL << ETH_DMASR_EBS_Pos ) + +#define ETH_DMASR_TPS_Pos ( 20U ) +#define ETH_DMASR_TPS_Msk ( 0x7UL << ETH_DMASR_TPS_Pos ) +#define ETH_DMASR_TPS ( ETH_DMASR_TPS_Msk ) +#define ETH_DMASR_TPS_0 ( 0x1UL << ETH_DMASR_TPS_Pos ) +#define ETH_DMASR_TPS_1 ( 0x2UL << ETH_DMASR_TPS_Pos ) +#define ETH_DMASR_TPS_2 ( 0x4UL << ETH_DMASR_TPS_Pos ) + +#define ETH_DMASR_RPS_Pos ( 17U ) +#define ETH_DMASR_RPS_Msk ( 0x7UL << ETH_DMASR_RPS_Pos ) +#define ETH_DMASR_RPS ( ETH_DMASR_RPS_Msk ) +#define ETH_DMASR_RPS_0 ( 0x1UL << ETH_DMASR_RPS_Pos ) +#define ETH_DMASR_RPS_1 ( 0x2UL << ETH_DMASR_RPS_Pos ) +#define ETH_DMASR_RPS_2 ( 0x4UL << ETH_DMASR_RPS_Pos ) + +#define ETH_DMASR_NIS_Pos ( 16U ) +#define ETH_DMASR_NIS_Msk ( 0x1UL << ETH_DMASR_NIS_Pos ) +#define ETH_DMASR_NIS ( ETH_DMASR_NIS_Msk ) + +#define ETH_DMASR_AIS_Pos ( 15U ) +#define ETH_DMASR_AIS_Msk ( 0x1UL << ETH_DMASR_AIS_Pos ) +#define ETH_DMASR_AIS ( ETH_DMASR_AIS_Msk ) + +#define ETH_DMASR_ERS_Pos ( 14U ) +#define ETH_DMASR_ERS_Msk ( 0x1UL << ETH_DMASR_ERS_Pos ) +#define ETH_DMASR_ERS ( ETH_DMASR_ERS_Msk ) + +#define ETH_DMASR_FBES_Pos ( 13U ) +#define ETH_DMASR_FBES_Msk ( 0x1UL << ETH_DMASR_FBES_Pos ) +#define ETH_DMASR_FBES ( ETH_DMASR_FBES_Msk ) + +#define ETH_DMASR_ETS_Pos ( 10U ) +#define ETH_DMASR_ETS_Msk ( 0x1UL << ETH_DMASR_ETS_Pos ) +#define ETH_DMASR_ETS ( ETH_DMASR_ETS_Msk ) + +#define ETH_DMASR_RWTS_Pos ( 9U ) +#define ETH_DMASR_RWTS_Msk ( 0x1UL << ETH_DMASR_RWTS_Pos ) +#define ETH_DMASR_RWTS ( ETH_DMASR_RWTS_Msk ) + +#define ETH_DMASR_RPSS_Pos ( 8U ) +#define ETH_DMASR_RPSS_Msk ( 0x1UL << ETH_DMASR_RPSS_Pos ) +#define ETH_DMASR_RPSS ( ETH_DMASR_RPSS_Msk ) + +#define ETH_DMASR_RBUS_Pos ( 7U ) +#define ETH_DMASR_RBUS_Msk ( 0x1UL << ETH_DMASR_RBUS_Pos ) +#define ETH_DMASR_RBUS ( ETH_DMASR_RBUS_Msk ) + +#define ETH_DMASR_RS_Pos ( 6U ) +#define ETH_DMASR_RS_Msk ( 0x1UL << ETH_DMASR_RS_Pos ) +#define ETH_DMASR_RS ( ETH_DMASR_RS_Msk ) + +#define ETH_DMASR_TUS_Pos ( 5U ) +#define ETH_DMASR_TUS_Msk ( 0x1UL << ETH_DMASR_TUS_Pos ) +#define ETH_DMASR_TUS ( ETH_DMASR_TUS_Msk ) + +#define ETH_DMASR_ROS_Pos ( 4U ) +#define ETH_DMASR_ROS_Msk ( 0x1UL << ETH_DMASR_ROS_Pos ) +#define ETH_DMASR_ROS ( ETH_DMASR_ROS_Msk ) + +#define ETH_DMASR_TJTS_Pos ( 3U ) +#define ETH_DMASR_TJTS_Msk ( 0x1UL << ETH_DMASR_TJTS_Pos ) +#define ETH_DMASR_TJTS ( ETH_DMASR_TJTS_Msk ) + +#define ETH_DMASR_TBUS_Pos ( 2U ) +#define ETH_DMASR_TBUS_Msk ( 0x1UL << ETH_DMASR_TBUS_Pos ) +#define ETH_DMASR_TBUS ( ETH_DMASR_TBUS_Msk ) + +#define ETH_DMASR_TPSS_Pos ( 1U ) +#define ETH_DMASR_TPSS_Msk ( 0x1UL << ETH_DMASR_TPSS_Pos ) +#define ETH_DMASR_TPSS ( ETH_DMASR_TPSS_Msk ) + +#define ETH_DMASR_TS_Pos ( 0U ) +#define ETH_DMASR_TS_Msk ( 0x1UL << ETH_DMASR_TS_Pos ) +#define ETH_DMASR_TS ( ETH_DMASR_TS_Msk ) + + +/*************** Bits definition for ETH_DMAOMR **********************/ + +#define ETH_DMAOMR_DTCEFD_Pos ( 26U ) +#define ETH_DMAOMR_DTCEFD_Msk ( 0x1UL << ETH_DMAOMR_DTCEFD_Pos ) +#define ETH_DMAOMR_DTCEFD ( ETH_DMAOMR_DTCEFD_Msk ) + +#define ETH_DMAOMR_RSF_Pos ( 25U ) +#define ETH_DMAOMR_RSF_Msk ( 0x1UL << ETH_DMAOMR_RSF_Pos ) +#define ETH_DMAOMR_RSF ( ETH_DMAOMR_RSF_Msk ) + +#define ETH_DMAOMR_DFRF_Pos ( 24U ) +#define ETH_DMAOMR_DFRF_Msk ( 0x1UL << ETH_DMAOMR_DFRF_Pos ) +#define ETH_DMAOMR_DFRF ( ETH_DMAOMR_DFRF_Msk ) + +#define ETH_DMAOMR_TSF_Pos ( 21U ) +#define ETH_DMAOMR_TSF_Msk ( 0x1UL << ETH_DMAOMR_TSF_Pos ) +#define ETH_DMAOMR_TSF ( ETH_DMAOMR_TSF_Msk ) + +#define ETH_DMAOMR_FTF_Pos ( 20U ) +#define ETH_DMAOMR_FTF_Msk ( 0x1UL << ETH_DMAOMR_FTF_Pos ) +#define ETH_DMAOMR_FTF ( ETH_DMAOMR_FTF_Msk ) + +#define ETH_DMAOMR_TTC_Pos ( 14U ) +#define ETH_DMAOMR_TTC_Msk ( 0x7UL << ETH_DMAOMR_TTC_Pos ) +#define ETH_DMAOMR_TTC ( ETH_DMAOMR_TTC_Msk ) +#define ETH_DMAOMR_TTC_0 ( 0x1UL << ETH_DMAOMR_TTC_Pos ) +#define ETH_DMAOMR_TTC_1 ( 0x2UL << ETH_DMAOMR_TTC_Pos ) +#define ETH_DMAOMR_TTC_2 ( 0x4UL << ETH_DMAOMR_TTC_Pos ) + +#define ETH_DMAOMR_ST_Pos ( 13U ) +#define ETH_DMAOMR_ST_Msk ( 0x1UL << ETH_DMAOMR_ST_Pos ) +#define ETH_DMAOMR_ST ( ETH_DMAOMR_ST_Msk ) + +#define ETH_DMAOMR_FEF_Pos ( 7U ) +#define ETH_DMAOMR_FEF_Msk ( 0x1UL << ETH_DMAOMR_FEF_Pos ) +#define ETH_DMAOMR_FEF ( ETH_DMAOMR_FEF_Msk ) + +#define ETH_DMAOMR_FUGF_Pos ( 6U ) +#define ETH_DMAOMR_FUGF_Msk ( 0x1UL << ETH_DMAOMR_FUGF_Pos ) +#define ETH_DMAOMR_FUGF ( ETH_DMAOMR_FUGF_Msk ) + +#define ETH_DMAOMR_DGF_Pos ( 5U ) +#define ETH_DMAOMR_DGF_Msk ( 0x1UL << ETH_DMAOMR_DGF_Pos ) +#define ETH_DMAOMR_DGF ( ETH_DMAOMR_DGF_Msk ) + +#define ETH_DMAOMR_RTC_Pos ( 3U ) +#define ETH_DMAOMR_RTC_Msk ( 0x3UL << ETH_DMAOMR_RTC_Pos ) +#define ETH_DMAOMR_RTC ( ETH_DMAOMR_RTC_Msk ) +#define ETH_DMAOMR_RTC_0 ( 0x1UL << ETH_DMAOMR_RTC_Pos ) +#define ETH_DMAOMR_RTC_1 ( 0x2UL << ETH_DMAOMR_RTC_Pos ) + +#define ETH_DMAOMR_OSF_Pos ( 2U ) +#define ETH_DMAOMR_OSF_Msk ( 0x1UL << ETH_DMAOMR_OSF_Pos ) +#define ETH_DMAOMR_OSF ( ETH_DMAOMR_OSF_Msk ) + +#define ETH_DMAOMR_SR_Pos ( 1U ) +#define ETH_DMAOMR_SR_Msk ( 0x1UL << ETH_DMAOMR_SR_Pos ) +#define ETH_DMAOMR_SR ( ETH_DMAOMR_SR_Msk ) + + +/*************** Bits definition for ETH_DMAIER **********************/ + +#define ETH_DMAIER_NISE_Pos ( 16U ) +#define ETH_DMAIER_NISE_Msk ( 0x1UL << ETH_DMAIER_NISE_Pos ) +#define ETH_DMAIER_NISE ( ETH_DMAIER_NISE_Msk ) + +#define ETH_DMAIER_AISE_Pos ( 15U ) +#define ETH_DMAIER_AISE_Msk ( 0x1UL << ETH_DMAIER_AISE_Pos ) +#define ETH_DMAIER_AISE ( ETH_DMAIER_AISE_Msk ) + +#define ETH_DMAIER_ERIE_Pos ( 14U ) +#define ETH_DMAIER_ERIE_Msk ( 0x1UL << ETH_DMAIER_ERIE_Pos ) +#define ETH_DMAIER_ERIE ( ETH_DMAIER_ERIE_Msk ) + +#define ETH_DMAIER_FBEIE_Pos ( 13U ) +#define ETH_DMAIER_FBEIE_Msk ( 0x1UL << ETH_DMAIER_FBEIE_Pos ) +#define ETH_DMAIER_FBEIE ( ETH_DMAIER_FBEIE_Msk ) + +#define ETH_DMAIER_ETIE_Pos ( 10U ) +#define ETH_DMAIER_ETIE_Msk ( 0x1UL << ETH_DMAIER_ETIE_Pos ) +#define ETH_DMAIER_ETIE ( ETH_DMAIER_ETIE_Msk ) + +#define ETH_DMAIER_RWTIE_Pos ( 9U ) +#define ETH_DMAIER_RWTIE_Msk ( 0x1UL << ETH_DMAIER_RWTIE_Pos ) +#define ETH_DMAIER_RWTIE ( ETH_DMAIER_RWTIE_Msk ) + +#define ETH_DMAIER_RPSIE_Pos ( 8U ) +#define ETH_DMAIER_RPSIE_Msk ( 0x1UL << ETH_DMAIER_RPSIE_Pos ) +#define ETH_DMAIER_RPSIE ( ETH_DMAIER_RPSIE_Msk ) + +#define ETH_DMAIER_RBUIE_Pos ( 7U ) +#define ETH_DMAIER_RBUIE_Msk ( 0x1UL << ETH_DMAIER_RBUIE_Pos ) +#define ETH_DMAIER_RBUIE ( ETH_DMAIER_RBUIE_Msk ) + +#define ETH_DMAIER_RIE_Pos ( 6U ) +#define ETH_DMAIER_RIE_Msk ( 0x1UL << ETH_DMAIER_RIE_Pos ) +#define ETH_DMAIER_RIE ( ETH_DMAIER_RIE_Msk ) + +#define ETH_DMAIER_TUIE_Pos ( 5U ) +#define ETH_DMAIER_TUIE_Msk ( 0x1UL << ETH_DMAIER_TUIE_Pos ) +#define ETH_DMAIER_TUIE ( ETH_DMAIER_TUIE_Msk ) + +#define ETH_DMAIER_ROIE_Pos ( 4U ) +#define ETH_DMAIER_ROIE_Msk ( 0x1UL << ETH_DMAIER_ROIE_Pos ) +#define ETH_DMAIER_ROIE ( ETH_DMAIER_ROIE_Msk ) + +#define ETH_DMAIER_TJTIE_Pos ( 3U ) +#define ETH_DMAIER_TJTIE_Msk ( 0x1UL << ETH_DMAIER_TJTIE_Pos ) +#define ETH_DMAIER_TJTIE ( ETH_DMAIER_TJTIE_Msk ) + +#define ETH_DMAIER_TBUIE_Pos ( 2U ) +#define ETH_DMAIER_TBUIE_Msk ( 0x1UL << ETH_DMAIER_TBUIE_Pos ) +#define ETH_DMAIER_TBUIE ( ETH_DMAIER_TBUIE_Msk ) + +#define ETH_DMAIER_TPSIE_Pos ( 1U ) +#define ETH_DMAIER_TPSIE_Msk ( 0x1UL << ETH_DMAIER_TPSIE_Pos ) +#define ETH_DMAIER_TPSIE ( ETH_DMAIER_TPSIE_Msk ) + +#define ETH_DMAIER_TIE_Pos ( 0U ) +#define ETH_DMAIER_TIE_Msk ( 0x1UL << ETH_DMAIER_TIE_Pos ) +#define ETH_DMAIER_TIE ( ETH_DMAIER_TIE_Msk ) + + +/*************** Bits definition for ETH_DMAMFBOCR **********************/ + +#define ETH_DMAMFBOCR_OBFOC_Pos ( 28U ) +#define ETH_DMAMFBOCR_OBFOC_Msk ( 0x1UL << ETH_DMAMFBOCR_OBFOC_Pos ) +#define ETH_DMAMFBOCR_OBFOC ( ETH_DMAMFBOCR_OBFOC_Msk ) + +#define ETH_DMAMFBOCR_OFC_Pos ( 17U ) +#define ETH_DMAMFBOCR_OFC_Msk ( 0x7ffUL << ETH_DMAMFBOCR_OFC_Pos ) +#define ETH_DMAMFBOCR_OFC ( ETH_DMAMFBOCR_OFC_Msk ) + +#define ETH_DMAMFBOCR_OBMFC_Pos ( 16U ) +#define ETH_DMAMFBOCR_OBMFC_Msk ( 0x1UL << ETH_DMAMFBOCR_OBMFC_Pos ) +#define ETH_DMAMFBOCR_OBMFC ( ETH_DMAMFBOCR_OBMFC_Msk ) + +#define ETH_DMAMFBOCR_MFC_Pos ( 0U ) +#define ETH_DMAMFBOCR_MFC_Msk ( 0xffffUL << ETH_DMAMFBOCR_MFC_Pos ) +#define ETH_DMAMFBOCR_MFC ( ETH_DMAMFBOCR_MFC_Msk ) + + +/*************** Bits definition for ETH_DMARIWTR **********************/ + +#define ETH_DMARIWTR_RIWTC_Pos ( 0U ) +#define ETH_DMARIWTR_RIWTC_Msk ( 0xffUL << ETH_DMARIWTR_RIWTC_Pos ) +#define ETH_DMARIWTR_RIWTC ( ETH_DMARIWTR_RIWTC_Msk ) + + +/*************** Bits definition for ETH_DMACHTDR **********************/ + +#define ETH_DMACHTDR_HTDAP_Pos ( 0U ) +#define ETH_DMACHTDR_HTDAP_Msk ( 0xffffffffUL << ETH_DMACHTDR_HTDAP_Pos ) +#define ETH_DMACHTDR_HTDAP ( ETH_DMACHTDR_HTDAP_Msk ) + + +/*************** Bits definition for ETH_DMACHRDR **********************/ + +#define ETH_DMACHRDR_HRDAP_Pos ( 0U ) +#define ETH_DMACHRDR_HRDAP_Msk ( 0xffffffffUL << ETH_DMACHRDR_HRDAP_Pos ) +#define ETH_DMACHRDR_HRDAP ( ETH_DMACHRDR_HRDAP_Msk ) + + +/*************** Bits definition for ETH_DMACHTBAR **********************/ + +#define ETH_DMACHTBAR_HTBAP_Pos ( 0U ) +#define ETH_DMACHTBAR_HTBAP_Msk ( 0xffffffffUL << ETH_DMACHTBAR_HTBAP_Pos ) +#define ETH_DMACHTBAR_HTBAP ( ETH_DMACHTBAR_HTBAP_Msk ) + + +/*************** Bits definition for ETH_DMACHRBAR **********************/ + +#define ETH_DMACHRBAR_HRBAP_Pos ( 0U ) +#define ETH_DMACHRBAR_HRBAP_Msk ( 0xffffffffUL << ETH_DMACHRBAR_HRBAP_Pos ) +#define ETH_DMACHRBAR_HRBAP ( ETH_DMACHRBAR_HRBAP_Msk ) + + +/*************** Bits definition for PMU_CTRL0 **********************/ + +#define PMU_CTRL0_BKPRAMREN_Pos ( 31U ) +#define PMU_CTRL0_BKPRAMREN_Msk ( 0x1UL << PMU_CTRL0_BKPRAMREN_Pos ) +#define PMU_CTRL0_BKPRAMREN ( PMU_CTRL0_BKPRAMREN_Msk ) + +#define PMU_CTRL0_BKPRAMSEN_Pos ( 30U ) +#define PMU_CTRL0_BKPRAMSEN_Msk ( 0x1UL << PMU_CTRL0_BKPRAMSEN_Pos ) +#define PMU_CTRL0_BKPRAMSEN ( PMU_CTRL0_BKPRAMSEN_Msk ) + +#define PMU_CTRL0_STOPWPT_Pos ( 16U ) +#define PMU_CTRL0_STOPWPT_Msk ( 0xfffUL << PMU_CTRL0_STOPWPT_Pos ) +#define PMU_CTRL0_STOPWPT ( PMU_CTRL0_STOPWPT_Msk ) + +#define PMU_CTRL0_LPLDO12_Pos ( 12U ) +#define PMU_CTRL0_LPLDO12_Msk ( 0x7UL << PMU_CTRL0_LPLDO12_Pos ) +#define PMU_CTRL0_LPLDO12 ( PMU_CTRL0_LPLDO12_Msk ) +#define PMU_CTRL0_LPLDO12_0 ( 0x1UL << PMU_CTRL0_LPLDO12_Pos ) +#define PMU_CTRL0_LPLDO12_1 ( 0x2UL << PMU_CTRL0_LPLDO12_Pos ) +#define PMU_CTRL0_LPLDO12_2 ( 0x4UL << PMU_CTRL0_LPLDO12_Pos ) + +#define PMU_CTRL0_MLDO12_Pos ( 8U ) +#define PMU_CTRL0_MLDO12_Msk ( 0x3UL << PMU_CTRL0_MLDO12_Pos ) +#define PMU_CTRL0_MLDO12 ( PMU_CTRL0_MLDO12_Msk ) +#define PMU_CTRL0_MLDO12_0 ( 0x1UL << PMU_CTRL0_MLDO12_Pos ) +#define PMU_CTRL0_MLDO12_1 ( 0x2UL << PMU_CTRL0_MLDO12_Pos ) + +#define PMU_CTRL0_RTCWE_Pos ( 7U ) +#define PMU_CTRL0_RTCWE_Msk ( 0x1UL << PMU_CTRL0_RTCWE_Pos ) +#define PMU_CTRL0_RTCWE ( PMU_CTRL0_RTCWE_Msk ) + +#define PMU_CTRL0_RCHDIV_Pos ( 5U ) +#define PMU_CTRL0_RCHDIV_Msk ( 0x1UL << PMU_CTRL0_RCHDIV_Pos ) +#define PMU_CTRL0_RCHDIV ( PMU_CTRL0_RCHDIV_Msk ) + +#define PMU_CTRL0_RCHPDEN_Pos ( 4U ) +#define PMU_CTRL0_RCHPDEN_Msk ( 0x1UL << PMU_CTRL0_RCHPDEN_Pos ) +#define PMU_CTRL0_RCHPDEN ( PMU_CTRL0_RCHPDEN_Msk ) + +#define PMU_CTRL0_LPMS_Pos ( 0U ) +#define PMU_CTRL0_LPMS_Msk ( 0x1UL << PMU_CTRL0_LPMS_Pos ) +#define PMU_CTRL0_LPMS ( PMU_CTRL0_LPMS_Msk ) + + +/*************** Bits definition for PMU_CTRL1 **********************/ + +#define PMU_CTRL1_LVDVALUE_Pos ( 15U ) +#define PMU_CTRL1_LVDVALUE_Msk ( 0x1UL << PMU_CTRL1_LVDVALUE_Pos ) +#define PMU_CTRL1_LVDVALUE ( PMU_CTRL1_LVDVALUE_Msk ) + +#define PMU_CTRL1_LVDFILTER_Pos ( 14U ) +#define PMU_CTRL1_LVDFILTER_Msk ( 0x1UL << PMU_CTRL1_LVDFILTER_Pos ) +#define PMU_CTRL1_LVDFILTER ( PMU_CTRL1_LVDFILTER_Msk ) + +#define PMU_CTRL1_FLTTIME_Pos ( 9U ) +#define PMU_CTRL1_FLTTIME_Msk ( 0x7UL << PMU_CTRL1_FLTTIME_Pos ) +#define PMU_CTRL1_FLTTIME ( PMU_CTRL1_FLTTIME_Msk ) +#define PMU_CTRL1_FLTTIME_0 ( 0x1UL << PMU_CTRL1_FLTTIME_Pos ) +#define PMU_CTRL1_FLTTIME_1 ( 0x2UL << PMU_CTRL1_FLTTIME_Pos ) +#define PMU_CTRL1_FLTTIME_2 ( 0x4UL << PMU_CTRL1_FLTTIME_Pos ) + +#define PMU_CTRL1_LVDFLTEN_Pos ( 8U ) +#define PMU_CTRL1_LVDFLTEN_Msk ( 0x1UL << PMU_CTRL1_LVDFLTEN_Pos ) +#define PMU_CTRL1_LVDFLTEN ( PMU_CTRL1_LVDFLTEN_Msk ) + +#define PMU_CTRL1_LVDSEL_Pos ( 1U ) +#define PMU_CTRL1_LVDSEL_Msk ( 0x7UL << PMU_CTRL1_LVDSEL_Pos ) +#define PMU_CTRL1_LVDSEL ( PMU_CTRL1_LVDSEL_Msk ) +#define PMU_CTRL1_LVDSEL_0 ( 0x1UL << PMU_CTRL1_LVDSEL_Pos ) +#define PMU_CTRL1_LVDSEL_1 ( 0x2UL << PMU_CTRL1_LVDSEL_Pos ) +#define PMU_CTRL1_LVDSEL_2 ( 0x4UL << PMU_CTRL1_LVDSEL_Pos ) + +#define PMU_CTRL1_LVDEN_Pos ( 0U ) +#define PMU_CTRL1_LVDEN_Msk ( 0x1UL << PMU_CTRL1_LVDEN_Pos ) +#define PMU_CTRL1_LVDEN ( PMU_CTRL1_LVDEN_Msk ) + + +/*************** Bits definition for PMU_CTRL2 **********************/ + +#define PMU_CTRL2_BORCFG_Pos ( 26U ) +#define PMU_CTRL2_BORCFG_Msk ( 0x3UL << PMU_CTRL2_BORCFG_Pos ) +#define PMU_CTRL2_BORCFG ( PMU_CTRL2_BORCFG_Msk ) +#define PMU_CTRL2_BORCFG_0 ( 0x1UL << PMU_CTRL2_BORCFG_Pos ) +#define PMU_CTRL2_BORCFG_1 ( 0x2UL << PMU_CTRL2_BORCFG_Pos ) + +#define PMU_CTRL2_BOREN_Pos ( 24U ) +#define PMU_CTRL2_BOREN_Msk ( 0x1UL << PMU_CTRL2_BOREN_Pos ) +#define PMU_CTRL2_BOREN ( PMU_CTRL2_BOREN_Msk ) + +#define PMU_CTRL2_BORRSTEN_Pos ( 20U ) +#define PMU_CTRL2_BORRSTEN_Msk ( 0x1UL << PMU_CTRL2_BORRSTEN_Pos ) +#define PMU_CTRL2_BORRSTEN ( PMU_CTRL2_BORRSTEN_Msk ) + +#define PMU_CTRL2_STDBYWPT_Pos ( 16U ) +#define PMU_CTRL2_STDBYWPT_Msk ( 0xfUL << PMU_CTRL2_STDBYWPT_Pos ) +#define PMU_CTRL2_STDBYWPT ( PMU_CTRL2_STDBYWPT_Msk ) +#define PMU_CTRL2_STDBYWPT_0 ( 0x1UL << PMU_CTRL2_STDBYWPT_Pos ) +#define PMU_CTRL2_STDBYWPT_1 ( 0x2UL << PMU_CTRL2_STDBYWPT_Pos ) +#define PMU_CTRL2_STDBYWPT_2 ( 0x4UL << PMU_CTRL2_STDBYWPT_Pos ) + +#define PMU_CTRL2_WUXFILEN_Pos ( 8U ) +#define PMU_CTRL2_WUXFILEN_Msk ( 0x1fUL << PMU_CTRL2_WUXFILEN_Pos ) +#define PMU_CTRL2_WUXFILEN ( PMU_CTRL2_WUXFILEN_Msk ) +#define PMU_CTRL2_WUXFILEN_0 ( 0x1UL << PMU_CTRL2_WUXFILEN_Pos ) +#define PMU_CTRL2_WUXFILEN_1 ( 0x2UL << PMU_CTRL2_WUXFILEN_Pos ) +#define PMU_CTRL2_WUXFILEN_2 ( 0x4UL << PMU_CTRL2_WUXFILEN_Pos ) +#define PMU_CTRL2_WUXFILEN_3 ( 0x8UL << PMU_CTRL2_WUXFILEN_Pos ) +#define PMU_CTRL2_WUXFILEN_4 ( 0x10UL << PMU_CTRL2_WUXFILEN_Pos ) + +#define PMU_CTRL2_EWUPX_Pos ( 0U ) +#define PMU_CTRL2_EWUPX_Msk ( 0x1fUL << PMU_CTRL2_EWUPX_Pos ) +#define PMU_CTRL2_EWUPX ( PMU_CTRL2_EWUPX_Msk ) +#define PMU_CTRL2_EWUPX_0 ( 0x1UL << PMU_CTRL2_EWUPX_Pos ) +#define PMU_CTRL2_EWUPX_1 ( 0x2UL << PMU_CTRL2_EWUPX_Pos ) +#define PMU_CTRL2_EWUPX_2 ( 0x4UL << PMU_CTRL2_EWUPX_Pos ) +#define PMU_CTRL2_EWUPX_3 ( 0x8UL << PMU_CTRL2_EWUPX_Pos ) +#define PMU_CTRL2_EWUPX_4 ( 0x10UL << PMU_CTRL2_EWUPX_Pos ) + + +/*************** Bits definition for PMU_CTRL3 **********************/ + +#define PMU_CTRL3_WUPOLX_Pos ( 0U ) +#define PMU_CTRL3_WUPOLX_Msk ( 0x1fUL << PMU_CTRL3_WUPOLX_Pos ) +#define PMU_CTRL3_WUPOLX ( PMU_CTRL3_WUPOLX_Msk ) +#define PMU_CTRL3_WUPOLX_0 ( 0x1UL << PMU_CTRL3_WUPOLX_Pos ) +#define PMU_CTRL3_WUPOLX_1 ( 0x2UL << PMU_CTRL3_WUPOLX_Pos ) +#define PMU_CTRL3_WUPOLX_2 ( 0x4UL << PMU_CTRL3_WUPOLX_Pos ) +#define PMU_CTRL3_WUPOLX_3 ( 0x8UL << PMU_CTRL3_WUPOLX_Pos ) +#define PMU_CTRL3_WUPOLX_4 ( 0x10UL << PMU_CTRL3_WUPOLX_Pos ) + + +/*************** Bits definition for PMU_ST **********************/ + +#define PMU_SR_BORN_Pos ( 16U ) +#define PMU_SR_BORN_Msk ( 0x1UL << PMU_SR_BORN_Pos ) +#define PMU_SR_BORN ( PMU_SR_BORN_Msk ) + +#define PMU_SR_BORWUF_Pos ( 15U ) +#define PMU_SR_BORWUF_Msk ( 0x1UL << PMU_SR_BORWUF_Pos ) +#define PMU_SR_BORWUF ( PMU_SR_BORWUF_Msk ) + +#define PMU_SR_IWDTWUF_Pos ( 14U ) +#define PMU_SR_IWDTWUF_Msk ( 0x1UL << PMU_SR_IWDTWUF_Pos ) +#define PMU_SR_IWDTWUF ( PMU_SR_IWDTWUF_Msk ) + +#define PMU_SR_RSTWUF_Pos ( 13U ) +#define PMU_SR_RSTWUF_Msk ( 0x1UL << PMU_SR_RSTWUF_Pos ) +#define PMU_SR_RSTWUF ( PMU_SR_RSTWUF_Msk ) + +#define PMU_SR_RTCWUF_Pos ( 12U ) +#define PMU_SR_RTCWUF_Msk ( 0x1UL << PMU_SR_RTCWUF_Pos ) +#define PMU_SR_RTCWUF ( PMU_SR_RTCWUF_Msk ) + +#define PMU_SR_SBF_Pos ( 8U ) +#define PMU_SR_SBF_Msk ( 0x1UL << PMU_SR_SBF_Pos ) +#define PMU_SR_SBF ( PMU_SR_SBF_Msk ) + +#define PMU_SR_WUPFX_Pos ( 0U ) +#define PMU_SR_WUPFX_Msk ( 0x1fUL << PMU_SR_WUPFX_Pos ) +#define PMU_SR_WUPFX ( PMU_SR_WUPFX_Msk ) +#define PMU_SR_WUPFX_0 ( 0x1UL << PMU_SR_WUPFX_Pos ) +#define PMU_SR_WUPFX_1 ( 0x2UL << PMU_SR_WUPFX_Pos ) +#define PMU_SR_WUPFX_2 ( 0x4UL << PMU_SR_WUPFX_Pos ) +#define PMU_SR_WUPFX_3 ( 0x8UL << PMU_SR_WUPFX_Pos ) +#define PMU_SR_WUPFX_4 ( 0x10UL << PMU_SR_WUPFX_Pos ) + + +/*************** Bits definition for PMU_STCLR **********************/ + +#define PMU_STCLR_CBORWUF_Pos ( 15U ) +#define PMU_STCLR_CBORWUF_Msk ( 0x1UL << PMU_STCLR_CBORWUF_Pos ) +#define PMU_STCLR_CBORWUF ( PMU_STCLR_CBORWUF_Msk ) + +#define PMU_STCLR_CIWDTWUF_Pos ( 14U ) +#define PMU_STCLR_CIWDTWUF_Msk ( 0x1UL << PMU_STCLR_CIWDTWUF_Pos ) +#define PMU_STCLR_CIWDTWUF ( PMU_STCLR_CIWDTWUF_Msk ) + +#define PMU_STCLR_CRSTWUF_Pos ( 13U ) +#define PMU_STCLR_CRSTWUF_Msk ( 0x1UL << PMU_STCLR_CRSTWUF_Pos ) +#define PMU_STCLR_CRSTWUF ( PMU_STCLR_CRSTWUF_Msk ) + +#define PMU_STCLR_CRTCWUF_Pos ( 12U ) +#define PMU_STCLR_CRTCWUF_Msk ( 0x1UL << PMU_STCLR_CRTCWUF_Pos ) +#define PMU_STCLR_CRTCWUF ( PMU_STCLR_CRTCWUF_Msk ) + +#define PMU_STCLR_CSBF_Pos ( 8U ) +#define PMU_STCLR_CSBF_Msk ( 0x1UL << PMU_STCLR_CSBF_Pos ) +#define PMU_STCLR_CSBF ( PMU_STCLR_CSBF_Msk ) + +#define PMU_STCLR_CWUFX_Pos ( 0U ) +#define PMU_STCLR_CWUFX_Msk ( 0x1fUL << PMU_STCLR_CWUFX_Pos ) +#define PMU_STCLR_CWUFX ( PMU_STCLR_CWUFX_Msk ) +#define PMU_STCLR_CWUFX_0 ( 0x1UL << PMU_STCLR_CWUFX_Pos ) +#define PMU_STCLR_CWUFX_1 ( 0x2UL << PMU_STCLR_CWUFX_Pos ) +#define PMU_STCLR_CWUFX_2 ( 0x4UL << PMU_STCLR_CWUFX_Pos ) +#define PMU_STCLR_CWUFX_3 ( 0x8UL << PMU_STCLR_CWUFX_Pos ) +#define PMU_STCLR_CWUFX_4 ( 0x10UL << PMU_STCLR_CWUFX_Pos ) + + +/*************** Bits definition for PMU_IOSEL **********************/ + +#define PMU_IOSEL_PI8VALUE_Pos ( 11U ) +#define PMU_IOSEL_PI8VALUE_Msk ( 0x1UL << PMU_IOSEL_PI8VALUE_Pos ) +#define PMU_IOSEL_PI8VALUE ( PMU_IOSEL_PI8VALUE_Msk ) + +#define PMU_IOSEL_PC15VALUE_Pos ( 10U ) +#define PMU_IOSEL_PC15VALUE_Msk ( 0x1UL << PMU_IOSEL_PC15VALUE_Pos ) +#define PMU_IOSEL_PC15VALUE ( PMU_IOSEL_PC15VALUE_Msk ) + +#define PMU_IOSEL_PC14VALUE_Pos ( 9U ) +#define PMU_IOSEL_PC14VALUE_Msk ( 0x1UL << PMU_IOSEL_PC14VALUE_Pos ) +#define PMU_IOSEL_PC14VALUE ( PMU_IOSEL_PC14VALUE_Msk ) + +#define PMU_IOSEL_PC13VALUE_Pos ( 8U ) +#define PMU_IOSEL_PC13VALUE_Msk ( 0x1UL << PMU_IOSEL_PC13VALUE_Pos ) +#define PMU_IOSEL_PC13VALUE ( PMU_IOSEL_PC13VALUE_Msk ) + +#define PMU_IOSEL_PI8SEL_Pos ( 6U ) +#define PMU_IOSEL_PI8SEL_Msk ( 0x3UL << PMU_IOSEL_PI8SEL_Pos ) +#define PMU_IOSEL_PI8SEL ( PMU_IOSEL_PI8SEL_Msk ) +#define PMU_IOSEL_PI8SEL_0 ( 0x1UL << PMU_IOSEL_PI8SEL_Pos ) +#define PMU_IOSEL_PI8SEL_1 ( 0x2UL << PMU_IOSEL_PI8SEL_Pos ) + +#define PMU_IOSEL_PC15SEL_Pos ( 4U ) +#define PMU_IOSEL_PC15SEL_Msk ( 0x3UL << PMU_IOSEL_PC15SEL_Pos ) +#define PMU_IOSEL_PC15SEL ( PMU_IOSEL_PC15SEL_Msk ) +#define PMU_IOSEL_PC15SEL_0 ( 0x1UL << PMU_IOSEL_PC15SEL_Pos ) +#define PMU_IOSEL_PC15SEL_1 ( 0x2UL << PMU_IOSEL_PC15SEL_Pos ) + +#define PMU_IOSEL_PC14SEL_Pos ( 2U ) +#define PMU_IOSEL_PC14SEL_Msk ( 0x3UL << PMU_IOSEL_PC14SEL_Pos ) +#define PMU_IOSEL_PC14SEL ( PMU_IOSEL_PC14SEL_Msk ) +#define PMU_IOSEL_PC14SEL_0 ( 0x1UL << PMU_IOSEL_PC14SEL_Pos ) +#define PMU_IOSEL_PC14SEL_1 ( 0x2UL << PMU_IOSEL_PC14SEL_Pos ) + +#define PMU_IOSEL_PC13SEL_Pos ( 0U ) +#define PMU_IOSEL_PC13SEL_Msk ( 0x3UL << PMU_IOSEL_PC13SEL_Pos ) +#define PMU_IOSEL_PC13SEL ( PMU_IOSEL_PC13SEL_Msk ) +#define PMU_IOSEL_PC13SEL_0 ( 0x1UL << PMU_IOSEL_PC13SEL_Pos ) +#define PMU_IOSEL_PC13SEL_1 ( 0x2UL << PMU_IOSEL_PC13SEL_Pos ) + + +/*************** Bits definition for PMU_TEST_ANATEST_SR **********************/ + +#define PMU_TEST_ANATEST_SR_ANATESTSEL_Pos ( 0U ) +#define PMU_TEST_ANATEST_SR_ANATESTSEL_Msk ( 0x7UL << PMU_TEST_ANATEST_SR_ANATESTSEL_Pos ) +#define PMU_TEST_ANATEST_SR_ANATESTSEL ( PMU_TEST_ANATEST_SR_ANATESTSEL_Msk ) +#define PMU_TEST_ANATEST_SR_ANATESTSEL_0 ( 0x1UL << PMU_TEST_ANATEST_SR_ANATESTSEL_Pos ) +#define PMU_TEST_ANATEST_SR_ANATESTSEL_1 ( 0x2UL << PMU_TEST_ANATEST_SR_ANATESTSEL_Pos ) +#define PMU_TEST_ANATEST_SR_ANATESTSEL_2 ( 0x4UL << PMU_TEST_ANATEST_SR_ANATESTSEL_Pos ) + + +/*************** Bits definition for PMU_TEST_LDOCAL **********************/ + +#define PMU_TEST_LDOCAL_LPLDO12TRIM_Pos ( 12U ) +#define PMU_TEST_LDOCAL_LPLDO12TRIM_Msk ( 0x7UL << PMU_TEST_LDOCAL_LPLDO12TRIM_Pos ) +#define PMU_TEST_LDOCAL_LPLDO12TRIM ( PMU_TEST_LDOCAL_LPLDO12TRIM_Msk ) +#define PMU_TEST_LDOCAL_LPLDO12TRIM_0 ( 0x1UL << PMU_TEST_LDOCAL_LPLDO12TRIM_Pos ) +#define PMU_TEST_LDOCAL_LPLDO12TRIM_1 ( 0x2UL << PMU_TEST_LDOCAL_LPLDO12TRIM_Pos ) +#define PMU_TEST_LDOCAL_LPLDO12TRIM_2 ( 0x4UL << PMU_TEST_LDOCAL_LPLDO12TRIM_Pos ) + +#define PMU_TEST_LDOCAL_MLDO12TRIM_Pos ( 8U ) +#define PMU_TEST_LDOCAL_MLDO12TRIM_Msk ( 0xfUL << PMU_TEST_LDOCAL_MLDO12TRIM_Pos ) +#define PMU_TEST_LDOCAL_MLDO12TRIM ( PMU_TEST_LDOCAL_MLDO12TRIM_Msk ) +#define PMU_TEST_LDOCAL_MLDO12TRIM_0 ( 0x1UL << PMU_TEST_LDOCAL_MLDO12TRIM_Pos ) +#define PMU_TEST_LDOCAL_MLDO12TRIM_1 ( 0x2UL << PMU_TEST_LDOCAL_MLDO12TRIM_Pos ) +#define PMU_TEST_LDOCAL_MLDO12TRIM_2 ( 0x4UL << PMU_TEST_LDOCAL_MLDO12TRIM_Pos ) +#define PMU_TEST_LDOCAL_MLDO12TRIM_3 ( 0x8UL << PMU_TEST_LDOCAL_MLDO12TRIM_Pos ) + +#define PMU_TEST_LDOCAL_LPBGRTRIM_Pos ( 4U ) +#define PMU_TEST_LDOCAL_LPBGRTRIM_Msk ( 0x7UL << PMU_TEST_LDOCAL_LPBGRTRIM_Pos ) +#define PMU_TEST_LDOCAL_LPBGRTRIM ( PMU_TEST_LDOCAL_LPBGRTRIM_Msk ) +#define PMU_TEST_LDOCAL_LPBGRTRIM_0 ( 0x1UL << PMU_TEST_LDOCAL_LPBGRTRIM_Pos ) +#define PMU_TEST_LDOCAL_LPBGRTRIM_1 ( 0x2UL << PMU_TEST_LDOCAL_LPBGRTRIM_Pos ) +#define PMU_TEST_LDOCAL_LPBGRTRIM_2 ( 0x4UL << PMU_TEST_LDOCAL_LPBGRTRIM_Pos ) + +#define PMU_TEST_LDOCAL_VREFTRIM_Pos ( 0U ) +#define PMU_TEST_LDOCAL_VREFTRIM_Msk ( 0x7UL << PMU_TEST_LDOCAL_VREFTRIM_Pos ) +#define PMU_TEST_LDOCAL_VREFTRIM ( PMU_TEST_LDOCAL_VREFTRIM_Msk ) +#define PMU_TEST_LDOCAL_VREFTRIM_0 ( 0x1UL << PMU_TEST_LDOCAL_VREFTRIM_Pos ) +#define PMU_TEST_LDOCAL_VREFTRIM_1 ( 0x2UL << PMU_TEST_LDOCAL_VREFTRIM_Pos ) +#define PMU_TEST_LDOCAL_VREFTRIM_2 ( 0x4UL << PMU_TEST_LDOCAL_VREFTRIM_Pos ) + + +/*************** Bits definition for PMU_TEST_LDOCR **********************/ + +#define PMU_TEST_LDOCR_TEST_LPLDO12EN_Pos ( 9U ) +#define PMU_TEST_LDOCR_TEST_LPLDO12EN_Msk ( 0x1UL << PMU_TEST_LDOCR_TEST_LPLDO12EN_Pos ) +#define PMU_TEST_LDOCR_TEST_LPLDO12EN ( PMU_TEST_LDOCR_TEST_LPLDO12EN_Msk ) + +#define PMU_TEST_LDOCR_TEST_MLDO12LV_Pos ( 4U ) +#define PMU_TEST_LDOCR_TEST_MLDO12LV_Msk ( 0x3UL << PMU_TEST_LDOCR_TEST_MLDO12LV_Pos ) +#define PMU_TEST_LDOCR_TEST_MLDO12LV ( PMU_TEST_LDOCR_TEST_MLDO12LV_Msk ) +#define PMU_TEST_LDOCR_TEST_MLDO12LV_0 ( 0x1UL << PMU_TEST_LDOCR_TEST_MLDO12LV_Pos ) +#define PMU_TEST_LDOCR_TEST_MLDO12LV_1 ( 0x2UL << PMU_TEST_LDOCR_TEST_MLDO12LV_Pos ) + +#define PMU_TEST_LDOCR_LDO_TESTEN_Pos ( 0U ) +#define PMU_TEST_LDOCR_LDO_TESTEN_Msk ( 0x1UL << PMU_TEST_LDOCR_LDO_TESTEN_Pos ) +#define PMU_TEST_LDOCR_LDO_TESTEN ( PMU_TEST_LDOCR_LDO_TESTEN_Msk ) + + +/*************** Bits definition for RTC_WP **********************/ + +#define RTC_WP_WE_Pos ( 0U ) +#define RTC_WP_WE_Msk ( 0x1UL << RTC_WP_WE_Pos ) +#define RTC_WP_WE ( RTC_WP_WE_Msk ) + + +/*************** Bits definition for RTC_IE **********************/ + +#define RTC_IE_WUTIE_Pos ( 17U ) +#define RTC_IE_WUTIE_Msk ( 0x1UL << RTC_IE_WUTIE_Pos ) +#define RTC_IE_WUTIE ( RTC_IE_WUTIE_Msk ) + +#define RTC_IE_STP2RIE_Pos ( 16U ) +#define RTC_IE_STP2RIE_Msk ( 0x1UL << RTC_IE_STP2RIE_Pos ) +#define RTC_IE_STP2RIE ( RTC_IE_STP2RIE_Msk ) + +#define RTC_IE_STP2FIE_Pos ( 15U ) +#define RTC_IE_STP2FIE_Msk ( 0x1UL << RTC_IE_STP2FIE_Pos ) +#define RTC_IE_STP2FIE ( RTC_IE_STP2FIE_Msk ) + +#define RTC_IE_STP1RIE_Pos ( 14U ) +#define RTC_IE_STP1RIE_Msk ( 0x1UL << RTC_IE_STP1RIE_Pos ) +#define RTC_IE_STP1RIE ( RTC_IE_STP1RIE_Msk ) + +#define RTC_IE_STP1FIE_Pos ( 13U ) +#define RTC_IE_STP1FIE_Msk ( 0x1UL << RTC_IE_STP1FIE_Pos ) +#define RTC_IE_STP1FIE ( RTC_IE_STP1FIE_Msk ) + +#define RTC_IE_ADJ32_IE_Pos ( 12U ) +#define RTC_IE_ADJ32_IE_Msk ( 0x1UL << RTC_IE_ADJ32_IE_Pos ) +#define RTC_IE_ADJ32_IE ( RTC_IE_ADJ32_IE_Msk ) + +#define RTC_IE_ALM_IE_Pos ( 11U ) +#define RTC_IE_ALM_IE_Msk ( 0x1UL << RTC_IE_ALM_IE_Pos ) +#define RTC_IE_ALM_IE ( RTC_IE_ALM_IE_Msk ) + +#define RTC_IE_1KHZ_IE_Pos ( 10U ) +#define RTC_IE_1KHZ_IE_Msk ( 0x1UL << RTC_IE_1KHZ_IE_Pos ) +#define RTC_IE_1KHZ_IE ( RTC_IE_1KHZ_IE_Msk ) + +#define RTC_IE_256HZ_IE_Pos ( 9U ) +#define RTC_IE_256HZ_IE_Msk ( 0x1UL << RTC_IE_256HZ_IE_Pos ) +#define RTC_IE_256HZ_IE ( RTC_IE_256HZ_IE_Msk ) + +#define RTC_IE_64HZ_IE_Pos ( 8U ) +#define RTC_IE_64HZ_IE_Msk ( 0x1UL << RTC_IE_64HZ_IE_Pos ) +#define RTC_IE_64HZ_IE ( RTC_IE_64HZ_IE_Msk ) + +#define RTC_IE_16HZ_IE_Pos ( 7U ) +#define RTC_IE_16HZ_IE_Msk ( 0x1UL << RTC_IE_16HZ_IE_Pos ) +#define RTC_IE_16HZ_IE ( RTC_IE_16HZ_IE_Msk ) + +#define RTC_IE_8HZ_IE_Pos ( 6U ) +#define RTC_IE_8HZ_IE_Msk ( 0x1UL << RTC_IE_8HZ_IE_Pos ) +#define RTC_IE_8HZ_IE ( RTC_IE_8HZ_IE_Msk ) + +#define RTC_IE_4HZ_IE_Pos ( 5U ) +#define RTC_IE_4HZ_IE_Msk ( 0x1UL << RTC_IE_4HZ_IE_Pos ) +#define RTC_IE_4HZ_IE ( RTC_IE_4HZ_IE_Msk ) + +#define RTC_IE_2HZ_IE_Pos ( 4U ) +#define RTC_IE_2HZ_IE_Msk ( 0x1UL << RTC_IE_2HZ_IE_Pos ) +#define RTC_IE_2HZ_IE ( RTC_IE_2HZ_IE_Msk ) + +#define RTC_IE_SEC_IE_Pos ( 3U ) +#define RTC_IE_SEC_IE_Msk ( 0x1UL << RTC_IE_SEC_IE_Pos ) +#define RTC_IE_SEC_IE ( RTC_IE_SEC_IE_Msk ) + +#define RTC_IE_MIN_IE_Pos ( 2U ) +#define RTC_IE_MIN_IE_Msk ( 0x1UL << RTC_IE_MIN_IE_Pos ) +#define RTC_IE_MIN_IE ( RTC_IE_MIN_IE_Msk ) + +#define RTC_IE_HOUR_IE_Pos ( 1U ) +#define RTC_IE_HOUR_IE_Msk ( 0x1UL << RTC_IE_HOUR_IE_Pos ) +#define RTC_IE_HOUR_IE ( RTC_IE_HOUR_IE_Msk ) + +#define RTC_IE_DATE_IE_Pos ( 0U ) +#define RTC_IE_DATE_IE_Msk ( 0x1UL << RTC_IE_DATE_IE_Pos ) +#define RTC_IE_DATE_IE ( RTC_IE_DATE_IE_Msk ) + + +/*************** Bits definition for RTC_SR **********************/ + +#define RTC_SR_WUTWF_Pos ( 24U ) +#define RTC_SR_WUTWF_Msk ( 0x1UL << RTC_SR_WUTWF_Pos ) +#define RTC_SR_WUTWF ( RTC_SR_WUTWF_Msk ) + +#define RTC_SR_WUTF_Pos ( 17U ) +#define RTC_SR_WUTF_Msk ( 0x1UL << RTC_SR_WUTF_Pos ) +#define RTC_SR_WUTF ( RTC_SR_WUTF_Msk ) + +#define RTC_SR_STP2RIF_Pos ( 16U ) +#define RTC_SR_STP2RIF_Msk ( 0x1UL << RTC_SR_STP2RIF_Pos ) +#define RTC_SR_STP2RIF ( RTC_SR_STP2RIF_Msk ) + +#define RTC_SR_STP2FIF_Pos ( 15U ) +#define RTC_SR_STP2FIF_Msk ( 0x1UL << RTC_SR_STP2FIF_Pos ) +#define RTC_SR_STP2FIF ( RTC_SR_STP2FIF_Msk ) + +#define RTC_SR_STP1RIF_Pos ( 14U ) +#define RTC_SR_STP1RIF_Msk ( 0x1UL << RTC_SR_STP1RIF_Pos ) +#define RTC_SR_STP1RIF ( RTC_SR_STP1RIF_Msk ) + +#define RTC_SR_STP1FIF_Pos ( 13U ) +#define RTC_SR_STP1FIF_Msk ( 0x1UL << RTC_SR_STP1FIF_Pos ) +#define RTC_SR_STP1FIF ( RTC_SR_STP1FIF_Msk ) + +#define RTC_SR_ADJ32_IF_Pos ( 12U ) +#define RTC_SR_ADJ32_IF_Msk ( 0x1UL << RTC_SR_ADJ32_IF_Pos ) +#define RTC_SR_ADJ32_IF ( RTC_SR_ADJ32_IF_Msk ) + +#define RTC_SR_ALM_IF_Pos ( 11U ) +#define RTC_SR_ALM_IF_Msk ( 0x1UL << RTC_SR_ALM_IF_Pos ) +#define RTC_SR_ALM_IF ( RTC_SR_ALM_IF_Msk ) + +#define RTC_SR_1KHZ_IF_Pos ( 10U ) +#define RTC_SR_1KHZ_IF_Msk ( 0x1UL << RTC_SR_1KHZ_IF_Pos ) +#define RTC_SR_1KHZ_IF ( RTC_SR_1KHZ_IF_Msk ) + +#define RTC_SR_256HZ_IF_Pos ( 9U ) +#define RTC_SR_256HZ_IF_Msk ( 0x1UL << RTC_SR_256HZ_IF_Pos ) +#define RTC_SR_256HZ_IF ( RTC_SR_256HZ_IF_Msk ) + +#define RTC_SR_64HZ_IF_Pos ( 8U ) +#define RTC_SR_64HZ_IF_Msk ( 0x1UL << RTC_SR_64HZ_IF_Pos ) +#define RTC_SR_64HZ_IF ( RTC_SR_64HZ_IF_Msk ) + +#define RTC_SR_16HZ_IF_Pos ( 7U ) +#define RTC_SR_16HZ_IF_Msk ( 0x1UL << RTC_SR_16HZ_IF_Pos ) +#define RTC_SR_16HZ_IF ( RTC_SR_16HZ_IF_Msk ) + +#define RTC_SR_8HZ_IF_Pos ( 6U ) +#define RTC_SR_8HZ_IF_Msk ( 0x1UL << RTC_SR_8HZ_IF_Pos ) +#define RTC_SR_8HZ_IF ( RTC_SR_8HZ_IF_Msk ) + +#define RTC_SR_4HZ_IF_Pos ( 5U ) +#define RTC_SR_4HZ_IF_Msk ( 0x1UL << RTC_SR_4HZ_IF_Pos ) +#define RTC_SR_4HZ_IF ( RTC_SR_4HZ_IF_Msk ) + +#define RTC_SR_2HZ_IF_Pos ( 4U ) +#define RTC_SR_2HZ_IF_Msk ( 0x1UL << RTC_SR_2HZ_IF_Pos ) +#define RTC_SR_2HZ_IF ( RTC_SR_2HZ_IF_Msk ) + +#define RTC_SR_SEC_IF_Pos ( 3U ) +#define RTC_SR_SEC_IF_Msk ( 0x1UL << RTC_SR_SEC_IF_Pos ) +#define RTC_SR_SEC_IF ( RTC_SR_SEC_IF_Msk ) + +#define RTC_SR_MIN_IF_Pos ( 2U ) +#define RTC_SR_MIN_IF_Msk ( 0x1UL << RTC_SR_MIN_IF_Pos ) +#define RTC_SR_MIN_IF ( RTC_SR_MIN_IF_Msk ) + +#define RTC_SR_HOUR_IF_Pos ( 1U ) +#define RTC_SR_HOUR_IF_Msk ( 0x1UL << RTC_SR_HOUR_IF_Pos ) +#define RTC_SR_HOUR_IF ( RTC_SR_HOUR_IF_Msk ) + +#define RTC_SR_DATE_IF_Pos ( 0U ) +#define RTC_SR_DATE_IF_Msk ( 0x1UL << RTC_SR_DATE_IF_Pos ) +#define RTC_SR_DATE_IF ( RTC_SR_DATE_IF_Msk ) + + +/*************** Bits definition for RTC_SEC **********************/ + +#define RTC_SEC_BCDSEC_Pos ( 0U ) +#define RTC_SEC_BCDSEC_Msk ( 0x7fUL << RTC_SEC_BCDSEC_Pos ) +#define RTC_SEC_BCDSEC ( RTC_SEC_BCDSEC_Msk ) +#define RTC_SEC_BCDSEC_0 ( 0x1UL << RTC_SEC_BCDSEC_Pos ) +#define RTC_SEC_BCDSEC_1 ( 0x2UL << RTC_SEC_BCDSEC_Pos ) +#define RTC_SEC_BCDSEC_2 ( 0x4UL << RTC_SEC_BCDSEC_Pos ) +#define RTC_SEC_BCDSEC_3 ( 0x8UL << RTC_SEC_BCDSEC_Pos ) +#define RTC_SEC_BCDSEC_4 ( 0x10UL << RTC_SEC_BCDSEC_Pos ) +#define RTC_SEC_BCDSEC_5 ( 0x20UL << RTC_SEC_BCDSEC_Pos ) +#define RTC_SEC_BCDSEC_6 ( 0x40UL << RTC_SEC_BCDSEC_Pos ) + + +/*************** Bits definition for RTC_MIN **********************/ + +#define RTC_MIN_BCDMIN_Pos ( 0U ) +#define RTC_MIN_BCDMIN_Msk ( 0x7fUL << RTC_MIN_BCDMIN_Pos ) +#define RTC_MIN_BCDMIN ( RTC_MIN_BCDMIN_Msk ) +#define RTC_MIN_BCDMIN_0 ( 0x1UL << RTC_MIN_BCDMIN_Pos ) +#define RTC_MIN_BCDMIN_1 ( 0x2UL << RTC_MIN_BCDMIN_Pos ) +#define RTC_MIN_BCDMIN_2 ( 0x4UL << RTC_MIN_BCDMIN_Pos ) +#define RTC_MIN_BCDMIN_3 ( 0x8UL << RTC_MIN_BCDMIN_Pos ) +#define RTC_MIN_BCDMIN_4 ( 0x10UL << RTC_MIN_BCDMIN_Pos ) +#define RTC_MIN_BCDMIN_5 ( 0x20UL << RTC_MIN_BCDMIN_Pos ) +#define RTC_MIN_BCDMIN_6 ( 0x40UL << RTC_MIN_BCDMIN_Pos ) + + +/*************** Bits definition for RTC_HOUR **********************/ + +#define RTC_HOUR_BCDHOUR_Pos ( 0U ) +#define RTC_HOUR_BCDHOUR_Msk ( 0x3fUL << RTC_HOUR_BCDHOUR_Pos ) +#define RTC_HOUR_BCDHOUR ( RTC_HOUR_BCDHOUR_Msk ) +#define RTC_HOUR_BCDHOUR_0 ( 0x1UL << RTC_HOUR_BCDHOUR_Pos ) +#define RTC_HOUR_BCDHOUR_1 ( 0x2UL << RTC_HOUR_BCDHOUR_Pos ) +#define RTC_HOUR_BCDHOUR_2 ( 0x4UL << RTC_HOUR_BCDHOUR_Pos ) +#define RTC_HOUR_BCDHOUR_3 ( 0x8UL << RTC_HOUR_BCDHOUR_Pos ) +#define RTC_HOUR_BCDHOUR_4 ( 0x10UL << RTC_HOUR_BCDHOUR_Pos ) +#define RTC_HOUR_BCDHOUR_5 ( 0x20UL << RTC_HOUR_BCDHOUR_Pos ) + + +/*************** Bits definition for RTC_DAY **********************/ + +#define RTC_DAY_BCDDATE_Pos ( 0U ) +#define RTC_DAY_BCDDATE_Msk ( 0x3fUL << RTC_DAY_BCDDATE_Pos ) +#define RTC_DAY_BCDDATE ( RTC_DAY_BCDDATE_Msk ) +#define RTC_DAY_BCDDATE_0 ( 0x1UL << RTC_DAY_BCDDATE_Pos ) +#define RTC_DAY_BCDDATE_1 ( 0x2UL << RTC_DAY_BCDDATE_Pos ) +#define RTC_DAY_BCDDATE_2 ( 0x4UL << RTC_DAY_BCDDATE_Pos ) +#define RTC_DAY_BCDDATE_3 ( 0x8UL << RTC_DAY_BCDDATE_Pos ) +#define RTC_DAY_BCDDATE_4 ( 0x10UL << RTC_DAY_BCDDATE_Pos ) +#define RTC_DAY_BCDDATE_5 ( 0x20UL << RTC_DAY_BCDDATE_Pos ) + + +/*************** Bits definition for RTC_WEEK **********************/ + +#define RTC_WEEK_BCDWEEK_Pos ( 0U ) +#define RTC_WEEK_BCDWEEK_Msk ( 0x7UL << RTC_WEEK_BCDWEEK_Pos ) +#define RTC_WEEK_BCDWEEK ( RTC_WEEK_BCDWEEK_Msk ) +#define RTC_WEEK_BCDWEEK_0 ( 0x1UL << RTC_WEEK_BCDWEEK_Pos ) +#define RTC_WEEK_BCDWEEK_1 ( 0x2UL << RTC_WEEK_BCDWEEK_Pos ) +#define RTC_WEEK_BCDWEEK_2 ( 0x4UL << RTC_WEEK_BCDWEEK_Pos ) + + +/*************** Bits definition for RTC_MONTH **********************/ + +#define RTC_MONTH_BCDMONTH_Pos ( 0U ) +#define RTC_MONTH_BCDMONTH_Msk ( 0x1fUL << RTC_MONTH_BCDMONTH_Pos ) +#define RTC_MONTH_BCDMONTH ( RTC_MONTH_BCDMONTH_Msk ) +#define RTC_MONTH_BCDMONTH_0 ( 0x1UL << RTC_MONTH_BCDMONTH_Pos ) +#define RTC_MONTH_BCDMONTH_1 ( 0x2UL << RTC_MONTH_BCDMONTH_Pos ) +#define RTC_MONTH_BCDMONTH_2 ( 0x4UL << RTC_MONTH_BCDMONTH_Pos ) +#define RTC_MONTH_BCDMONTH_3 ( 0x8UL << RTC_MONTH_BCDMONTH_Pos ) +#define RTC_MONTH_BCDMONTH_4 ( 0x10UL << RTC_MONTH_BCDMONTH_Pos ) + + +/*************** Bits definition for RTC_YEAR **********************/ + +#define RTC_YEAR_BCDYEAR_Pos ( 0U ) +#define RTC_YEAR_BCDYEAR_Msk ( 0xffUL << RTC_YEAR_BCDYEAR_Pos ) +#define RTC_YEAR_BCDYEAR ( RTC_YEAR_BCDYEAR_Msk ) +#define RTC_YEAR_BCDYEAR_0 ( 0x1UL << RTC_YEAR_BCDYEAR_Pos ) +#define RTC_YEAR_BCDYEAR_1 ( 0x2UL << RTC_YEAR_BCDYEAR_Pos ) +#define RTC_YEAR_BCDYEAR_2 ( 0x4UL << RTC_YEAR_BCDYEAR_Pos ) +#define RTC_YEAR_BCDYEAR_3 ( 0x8UL << RTC_YEAR_BCDYEAR_Pos ) +#define RTC_YEAR_BCDYEAR_4 ( 0x10UL << RTC_YEAR_BCDYEAR_Pos ) +#define RTC_YEAR_BCDYEAR_5 ( 0x20UL << RTC_YEAR_BCDYEAR_Pos ) +#define RTC_YEAR_BCDYEAR_6 ( 0x40UL << RTC_YEAR_BCDYEAR_Pos ) +#define RTC_YEAR_BCDYEAR_7 ( 0x80UL << RTC_YEAR_BCDYEAR_Pos ) + + +/*************** Bits definition for RTC_ALM **********************/ + +#define RTC_ALM_ALM_WDS_Pos ( 31U ) +#define RTC_ALM_ALM_WDS_Msk ( 0x1UL << RTC_ALM_ALM_WDS_Pos ) +#define RTC_ALM_ALM_WDS ( RTC_ALM_ALM_WDS_Msk ) + +#define RTC_ALM_ALMWEEK_ALMDAY_Pos ( 24U ) +#define RTC_ALM_ALMWEEK_ALMDAY_Msk ( 0x7fUL << RTC_ALM_ALMWEEK_ALMDAY_Pos ) +#define RTC_ALM_ALMWEEK_ALMDAY ( RTC_ALM_ALMWEEK_ALMDAY_Msk ) +#define RTC_ALM_ALMWEEK_ALMDAY_0 ( 0x1UL << RTC_ALM_ALMWEEK_ALMDAY_Pos ) +#define RTC_ALM_ALMWEEK_ALMDAY_1 ( 0x2UL << RTC_ALM_ALMWEEK_ALMDAY_Pos ) +#define RTC_ALM_ALMWEEK_ALMDAY_2 ( 0x4UL << RTC_ALM_ALMWEEK_ALMDAY_Pos ) +#define RTC_ALM_ALMWEEK_ALMDAY_3 ( 0x8UL << RTC_ALM_ALMWEEK_ALMDAY_Pos ) +#define RTC_ALM_ALMWEEK_ALMDAY_4 ( 0x10UL << RTC_ALM_ALMWEEK_ALMDAY_Pos ) +#define RTC_ALM_ALMWEEK_ALMDAY_5 ( 0x20UL << RTC_ALM_ALMWEEK_ALMDAY_Pos ) +#define RTC_ALM_ALMWEEK_ALMDAY_6 ( 0x40UL << RTC_ALM_ALMWEEK_ALMDAY_Pos ) + +#define RTC_ALM_ALMHOUR_Pos ( 16U ) +#define RTC_ALM_ALMHOUR_Msk ( 0x3fUL << RTC_ALM_ALMHOUR_Pos ) +#define RTC_ALM_ALMHOUR ( RTC_ALM_ALMHOUR_Msk ) +#define RTC_ALM_ALMHOUR_0 ( 0x1UL << RTC_ALM_ALMHOUR_Pos ) +#define RTC_ALM_ALMHOUR_1 ( 0x2UL << RTC_ALM_ALMHOUR_Pos ) +#define RTC_ALM_ALMHOUR_2 ( 0x4UL << RTC_ALM_ALMHOUR_Pos ) +#define RTC_ALM_ALMHOUR_3 ( 0x8UL << RTC_ALM_ALMHOUR_Pos ) +#define RTC_ALM_ALMHOUR_4 ( 0x10UL << RTC_ALM_ALMHOUR_Pos ) +#define RTC_ALM_ALMHOUR_5 ( 0x20UL << RTC_ALM_ALMHOUR_Pos ) + +#define RTC_ALM_ALMMIN_Pos ( 8U ) +#define RTC_ALM_ALMMIN_Msk ( 0x7fUL << RTC_ALM_ALMMIN_Pos ) +#define RTC_ALM_ALMMIN ( RTC_ALM_ALMMIN_Msk ) +#define RTC_ALM_ALMMIN_0 ( 0x1UL << RTC_ALM_ALMMIN_Pos ) +#define RTC_ALM_ALMMIN_1 ( 0x2UL << RTC_ALM_ALMMIN_Pos ) +#define RTC_ALM_ALMMIN_2 ( 0x4UL << RTC_ALM_ALMMIN_Pos ) +#define RTC_ALM_ALMMIN_3 ( 0x8UL << RTC_ALM_ALMMIN_Pos ) +#define RTC_ALM_ALMMIN_4 ( 0x10UL << RTC_ALM_ALMMIN_Pos ) +#define RTC_ALM_ALMMIN_5 ( 0x20UL << RTC_ALM_ALMMIN_Pos ) +#define RTC_ALM_ALMMIN_6 ( 0x40UL << RTC_ALM_ALMMIN_Pos ) + +#define RTC_ALM_ALMSEC_Pos ( 0U ) +#define RTC_ALM_ALMSEC_Msk ( 0x7fUL << RTC_ALM_ALMSEC_Pos ) +#define RTC_ALM_ALMSEC ( RTC_ALM_ALMSEC_Msk ) +#define RTC_ALM_ALMSEC_0 ( 0x1UL << RTC_ALM_ALMSEC_Pos ) +#define RTC_ALM_ALMSEC_1 ( 0x2UL << RTC_ALM_ALMSEC_Pos ) +#define RTC_ALM_ALMSEC_2 ( 0x4UL << RTC_ALM_ALMSEC_Pos ) +#define RTC_ALM_ALMSEC_3 ( 0x8UL << RTC_ALM_ALMSEC_Pos ) +#define RTC_ALM_ALMSEC_4 ( 0x10UL << RTC_ALM_ALMSEC_Pos ) +#define RTC_ALM_ALMSEC_5 ( 0x20UL << RTC_ALM_ALMSEC_Pos ) +#define RTC_ALM_ALMSEC_6 ( 0x40UL << RTC_ALM_ALMSEC_Pos ) + + +/*************** Bits definition for RTC_CR **********************/ + +#define RTC_CR_WUCKSEL_Pos ( 24U ) +#define RTC_CR_WUCKSEL_Msk ( 0x7UL << RTC_CR_WUCKSEL_Pos ) +#define RTC_CR_WUCKSEL ( RTC_CR_WUCKSEL_Msk ) +#define RTC_CR_WUCKSEL_0 ( 0x1UL << RTC_CR_WUCKSEL_Pos ) +#define RTC_CR_WUCKSEL_1 ( 0x2UL << RTC_CR_WUCKSEL_Pos ) +#define RTC_CR_WUCKSEL_2 ( 0x4UL << RTC_CR_WUCKSEL_Pos ) + +#define RTC_CR_WUTE_Pos ( 23U ) +#define RTC_CR_WUTE_Msk ( 0x1UL << RTC_CR_WUTE_Pos ) +#define RTC_CR_WUTE ( RTC_CR_WUTE_Msk ) + +#define RTC_CR_TAMPFLTCLK_Pos ( 22U ) +#define RTC_CR_TAMPFLTCLK_Msk ( 0x1UL << RTC_CR_TAMPFLTCLK_Pos ) +#define RTC_CR_TAMPFLTCLK ( RTC_CR_TAMPFLTCLK_Msk ) + +#define RTC_CR_TS2EDGE_Pos ( 21U ) +#define RTC_CR_TS2EDGE_Msk ( 0x1UL << RTC_CR_TS2EDGE_Pos ) +#define RTC_CR_TS2EDGE ( RTC_CR_TS2EDGE_Msk ) + +#define RTC_CR_TAMP2FLT_Pos ( 19U ) +#define RTC_CR_TAMP2FLT_Msk ( 0x3UL << RTC_CR_TAMP2FLT_Pos ) +#define RTC_CR_TAMP2FLT ( RTC_CR_TAMP2FLT_Msk ) +#define RTC_CR_TAMP2FLT_0 ( 0x1UL << RTC_CR_TAMP2FLT_Pos ) +#define RTC_CR_TAMP2FLT_1 ( 0x2UL << RTC_CR_TAMP2FLT_Pos ) + +#define RTC_CR_TAMP2FLTEN_Pos ( 18U ) +#define RTC_CR_TAMP2FLTEN_Msk ( 0x1UL << RTC_CR_TAMP2FLTEN_Pos ) +#define RTC_CR_TAMP2FLTEN ( RTC_CR_TAMP2FLTEN_Msk ) + +#define RTC_CR_TAMP2FCLR_Pos ( 17U ) +#define RTC_CR_TAMP2FCLR_Msk ( 0x1UL << RTC_CR_TAMP2FCLR_Pos ) +#define RTC_CR_TAMP2FCLR ( RTC_CR_TAMP2FCLR_Msk ) + +#define RTC_CR_TAMP2RCLR_Pos ( 16U ) +#define RTC_CR_TAMP2RCLR_Msk ( 0x1UL << RTC_CR_TAMP2RCLR_Pos ) +#define RTC_CR_TAMP2RCLR ( RTC_CR_TAMP2RCLR_Msk ) + +#define RTC_CR_TS1EDGE_Pos ( 15U ) +#define RTC_CR_TS1EDGE_Msk ( 0x1UL << RTC_CR_TS1EDGE_Pos ) +#define RTC_CR_TS1EDGE ( RTC_CR_TS1EDGE_Msk ) + +#define RTC_CR_TAMP1FLT_Pos ( 13U ) +#define RTC_CR_TAMP1FLT_Msk ( 0x3UL << RTC_CR_TAMP1FLT_Pos ) +#define RTC_CR_TAMP1FLT ( RTC_CR_TAMP1FLT_Msk ) +#define RTC_CR_TAMP1FLT_0 ( 0x1UL << RTC_CR_TAMP1FLT_Pos ) +#define RTC_CR_TAMP1FLT_1 ( 0x2UL << RTC_CR_TAMP1FLT_Pos ) + +#define RTC_CR_TAMP1FLTEN_Pos ( 12U ) +#define RTC_CR_TAMP1FLTEN_Msk ( 0x1UL << RTC_CR_TAMP1FLTEN_Pos ) +#define RTC_CR_TAMP1FLTEN ( RTC_CR_TAMP1FLTEN_Msk ) + +#define RTC_CR_ALM_MSKD_Pos ( 11U ) +#define RTC_CR_ALM_MSKD_Msk ( 0x1UL << RTC_CR_ALM_MSKD_Pos ) +#define RTC_CR_ALM_MSKD ( RTC_CR_ALM_MSKD_Msk ) + +#define RTC_CR_ALM_MSKH_Pos ( 10U ) +#define RTC_CR_ALM_MSKH_Msk ( 0x1UL << RTC_CR_ALM_MSKH_Pos ) +#define RTC_CR_ALM_MSKH ( RTC_CR_ALM_MSKH_Msk ) + +#define RTC_CR_ALM_MSKM_Pos ( 9U ) +#define RTC_CR_ALM_MSKM_Msk ( 0x1UL << RTC_CR_ALM_MSKM_Pos ) +#define RTC_CR_ALM_MSKM ( RTC_CR_ALM_MSKM_Msk ) + +#define RTC_CR_TAMP1FCLR_Pos ( 8U ) +#define RTC_CR_TAMP1FCLR_Msk ( 0x1UL << RTC_CR_TAMP1FCLR_Pos ) +#define RTC_CR_TAMP1FCLR ( RTC_CR_TAMP1FCLR_Msk ) + +#define RTC_CR_TAMP1RCLR_Pos ( 7U ) +#define RTC_CR_TAMP1RCLR_Msk ( 0x1UL << RTC_CR_TAMP1RCLR_Pos ) +#define RTC_CR_TAMP1RCLR ( RTC_CR_TAMP1RCLR_Msk ) + +#define RTC_CR_TAMP2EN_Pos ( 6U ) +#define RTC_CR_TAMP2EN_Msk ( 0x1UL << RTC_CR_TAMP2EN_Pos ) +#define RTC_CR_TAMP2EN ( RTC_CR_TAMP2EN_Msk ) + +#define RTC_CR_TAMP1EN_Pos ( 5U ) +#define RTC_CR_TAMP1EN_Msk ( 0x1UL << RTC_CR_TAMP1EN_Pos ) +#define RTC_CR_TAMP1EN ( RTC_CR_TAMP1EN_Msk ) + +#define RTC_CR_ALM_EN_Pos ( 4U ) +#define RTC_CR_ALM_EN_Msk ( 0x1UL << RTC_CR_ALM_EN_Pos ) +#define RTC_CR_ALM_EN ( RTC_CR_ALM_EN_Msk ) + +#define RTC_CR_FSEL_Pos ( 0U ) +#define RTC_CR_FSEL_Msk ( 0xfUL << RTC_CR_FSEL_Pos ) +#define RTC_CR_FSEL ( RTC_CR_FSEL_Msk ) +#define RTC_CR_FSEL_0 ( 0x1UL << RTC_CR_FSEL_Pos ) +#define RTC_CR_FSEL_1 ( 0x2UL << RTC_CR_FSEL_Pos ) +#define RTC_CR_FSEL_2 ( 0x4UL << RTC_CR_FSEL_Pos ) +#define RTC_CR_FSEL_3 ( 0x8UL << RTC_CR_FSEL_Pos ) + + +/*************** Bits definition for RTC_ADJUST **********************/ + +#define RTC_ADJUST_ADJSIGN_Pos ( 9U ) +#define RTC_ADJUST_ADJSIGN_Msk ( 0x1UL << RTC_ADJUST_ADJSIGN_Pos ) +#define RTC_ADJUST_ADJSIGN ( RTC_ADJUST_ADJSIGN_Msk ) + +#define RTC_ADJUST_ADJVALUE_Pos ( 0U ) +#define RTC_ADJUST_ADJVALUE_Msk ( 0x1ffUL << RTC_ADJUST_ADJVALUE_Pos ) +#define RTC_ADJUST_ADJVALUE ( RTC_ADJUST_ADJVALUE_Msk ) + + +/*************** Bits definition for RTC_MSECCNT **********************/ + +#define RTC_MSECCNT_MSCNT_Pos ( 0U ) +#define RTC_MSECCNT_MSCNT_Msk ( 0x3fUL << RTC_MSECCNT_MSCNT_Pos ) +#define RTC_MSECCNT_MSCNT ( RTC_MSECCNT_MSCNT_Msk ) +#define RTC_MSECCNT_MSCNT_0 ( 0x1UL << RTC_MSECCNT_MSCNT_Pos ) +#define RTC_MSECCNT_MSCNT_1 ( 0x2UL << RTC_MSECCNT_MSCNT_Pos ) +#define RTC_MSECCNT_MSCNT_2 ( 0x4UL << RTC_MSECCNT_MSCNT_Pos ) +#define RTC_MSECCNT_MSCNT_3 ( 0x8UL << RTC_MSECCNT_MSCNT_Pos ) +#define RTC_MSECCNT_MSCNT_4 ( 0x10UL << RTC_MSECCNT_MSCNT_Pos ) +#define RTC_MSECCNT_MSCNT_5 ( 0x20UL << RTC_MSECCNT_MSCNT_Pos ) + + +/*************** Bits definition for RTC_CLKSTAMP1 **********************/ + +#define RTC_CLKSTAMP1_HRSTP1_Pos ( 16U ) +#define RTC_CLKSTAMP1_HRSTP1_Msk ( 0x3fUL << RTC_CLKSTAMP1_HRSTP1_Pos ) +#define RTC_CLKSTAMP1_HRSTP1 ( RTC_CLKSTAMP1_HRSTP1_Msk ) +#define RTC_CLKSTAMP1_HRSTP1_0 ( 0x1UL << RTC_CLKSTAMP1_HRSTP1_Pos ) +#define RTC_CLKSTAMP1_HRSTP1_1 ( 0x2UL << RTC_CLKSTAMP1_HRSTP1_Pos ) +#define RTC_CLKSTAMP1_HRSTP1_2 ( 0x4UL << RTC_CLKSTAMP1_HRSTP1_Pos ) +#define RTC_CLKSTAMP1_HRSTP1_3 ( 0x8UL << RTC_CLKSTAMP1_HRSTP1_Pos ) +#define RTC_CLKSTAMP1_HRSTP1_4 ( 0x10UL << RTC_CLKSTAMP1_HRSTP1_Pos ) +#define RTC_CLKSTAMP1_HRSTP1_5 ( 0x20UL << RTC_CLKSTAMP1_HRSTP1_Pos ) + +#define RTC_CLKSTAMP1_MINSTP1_Pos ( 8U ) +#define RTC_CLKSTAMP1_MINSTP1_Msk ( 0x7fUL << RTC_CLKSTAMP1_MINSTP1_Pos ) +#define RTC_CLKSTAMP1_MINSTP1 ( RTC_CLKSTAMP1_MINSTP1_Msk ) +#define RTC_CLKSTAMP1_MINSTP1_0 ( 0x1UL << RTC_CLKSTAMP1_MINSTP1_Pos ) +#define RTC_CLKSTAMP1_MINSTP1_1 ( 0x2UL << RTC_CLKSTAMP1_MINSTP1_Pos ) +#define RTC_CLKSTAMP1_MINSTP1_2 ( 0x4UL << RTC_CLKSTAMP1_MINSTP1_Pos ) +#define RTC_CLKSTAMP1_MINSTP1_3 ( 0x8UL << RTC_CLKSTAMP1_MINSTP1_Pos ) +#define RTC_CLKSTAMP1_MINSTP1_4 ( 0x10UL << RTC_CLKSTAMP1_MINSTP1_Pos ) +#define RTC_CLKSTAMP1_MINSTP1_5 ( 0x20UL << RTC_CLKSTAMP1_MINSTP1_Pos ) +#define RTC_CLKSTAMP1_MINSTP1_6 ( 0x40UL << RTC_CLKSTAMP1_MINSTP1_Pos ) + +#define RTC_CLKSTAMP1_SECSTP1_Pos ( 0U ) +#define RTC_CLKSTAMP1_SECSTP1_Msk ( 0x7fUL << RTC_CLKSTAMP1_SECSTP1_Pos ) +#define RTC_CLKSTAMP1_SECSTP1 ( RTC_CLKSTAMP1_SECSTP1_Msk ) +#define RTC_CLKSTAMP1_SECSTP1_0 ( 0x1UL << RTC_CLKSTAMP1_SECSTP1_Pos ) +#define RTC_CLKSTAMP1_SECSTP1_1 ( 0x2UL << RTC_CLKSTAMP1_SECSTP1_Pos ) +#define RTC_CLKSTAMP1_SECSTP1_2 ( 0x4UL << RTC_CLKSTAMP1_SECSTP1_Pos ) +#define RTC_CLKSTAMP1_SECSTP1_3 ( 0x8UL << RTC_CLKSTAMP1_SECSTP1_Pos ) +#define RTC_CLKSTAMP1_SECSTP1_4 ( 0x10UL << RTC_CLKSTAMP1_SECSTP1_Pos ) +#define RTC_CLKSTAMP1_SECSTP1_5 ( 0x20UL << RTC_CLKSTAMP1_SECSTP1_Pos ) +#define RTC_CLKSTAMP1_SECSTP1_6 ( 0x40UL << RTC_CLKSTAMP1_SECSTP1_Pos ) + + +/*************** Bits definition for RTC_CALSTAMP1 **********************/ + +#define RTC_CALSTAMP1_YEARSTP1_Pos ( 24U ) +#define RTC_CALSTAMP1_YEARSTP1_Msk ( 0xffUL << RTC_CALSTAMP1_YEARSTP1_Pos ) +#define RTC_CALSTAMP1_YEARSTP1 ( RTC_CALSTAMP1_YEARSTP1_Msk ) +#define RTC_CALSTAMP1_YEARSTP1_0 ( 0x1UL << RTC_CALSTAMP1_YEARSTP1_Pos ) +#define RTC_CALSTAMP1_YEARSTP1_1 ( 0x2UL << RTC_CALSTAMP1_YEARSTP1_Pos ) +#define RTC_CALSTAMP1_YEARSTP1_2 ( 0x4UL << RTC_CALSTAMP1_YEARSTP1_Pos ) +#define RTC_CALSTAMP1_YEARSTP1_3 ( 0x8UL << RTC_CALSTAMP1_YEARSTP1_Pos ) +#define RTC_CALSTAMP1_YEARSTP1_4 ( 0x10UL << RTC_CALSTAMP1_YEARSTP1_Pos ) +#define RTC_CALSTAMP1_YEARSTP1_5 ( 0x20UL << RTC_CALSTAMP1_YEARSTP1_Pos ) +#define RTC_CALSTAMP1_YEARSTP1_6 ( 0x40UL << RTC_CALSTAMP1_YEARSTP1_Pos ) +#define RTC_CALSTAMP1_YEARSTP1_7 ( 0x80UL << RTC_CALSTAMP1_YEARSTP1_Pos ) + +#define RTC_CALSTAMP1_MONSTP1_Pos ( 16U ) +#define RTC_CALSTAMP1_MONSTP1_Msk ( 0x1fUL << RTC_CALSTAMP1_MONSTP1_Pos ) +#define RTC_CALSTAMP1_MONSTP1 ( RTC_CALSTAMP1_MONSTP1_Msk ) +#define RTC_CALSTAMP1_MONSTP1_0 ( 0x1UL << RTC_CALSTAMP1_MONSTP1_Pos ) +#define RTC_CALSTAMP1_MONSTP1_1 ( 0x2UL << RTC_CALSTAMP1_MONSTP1_Pos ) +#define RTC_CALSTAMP1_MONSTP1_2 ( 0x4UL << RTC_CALSTAMP1_MONSTP1_Pos ) +#define RTC_CALSTAMP1_MONSTP1_3 ( 0x8UL << RTC_CALSTAMP1_MONSTP1_Pos ) +#define RTC_CALSTAMP1_MONSTP1_4 ( 0x10UL << RTC_CALSTAMP1_MONSTP1_Pos ) + +#define RTC_CALSTAMP1_WKSTP1_Pos ( 8U ) +#define RTC_CALSTAMP1_WKSTP1_Msk ( 0x7UL << RTC_CALSTAMP1_WKSTP1_Pos ) +#define RTC_CALSTAMP1_WKSTP1 ( RTC_CALSTAMP1_WKSTP1_Msk ) +#define RTC_CALSTAMP1_WKSTP1_0 ( 0x1UL << RTC_CALSTAMP1_WKSTP1_Pos ) +#define RTC_CALSTAMP1_WKSTP1_1 ( 0x2UL << RTC_CALSTAMP1_WKSTP1_Pos ) +#define RTC_CALSTAMP1_WKSTP1_2 ( 0x4UL << RTC_CALSTAMP1_WKSTP1_Pos ) + +#define RTC_CALSTAMP1_DAYSTP1_Pos ( 0U ) +#define RTC_CALSTAMP1_DAYSTP1_Msk ( 0x3fUL << RTC_CALSTAMP1_DAYSTP1_Pos ) +#define RTC_CALSTAMP1_DAYSTP1 ( RTC_CALSTAMP1_DAYSTP1_Msk ) +#define RTC_CALSTAMP1_DAYSTP1_0 ( 0x1UL << RTC_CALSTAMP1_DAYSTP1_Pos ) +#define RTC_CALSTAMP1_DAYSTP1_1 ( 0x2UL << RTC_CALSTAMP1_DAYSTP1_Pos ) +#define RTC_CALSTAMP1_DAYSTP1_2 ( 0x4UL << RTC_CALSTAMP1_DAYSTP1_Pos ) +#define RTC_CALSTAMP1_DAYSTP1_3 ( 0x8UL << RTC_CALSTAMP1_DAYSTP1_Pos ) +#define RTC_CALSTAMP1_DAYSTP1_4 ( 0x10UL << RTC_CALSTAMP1_DAYSTP1_Pos ) +#define RTC_CALSTAMP1_DAYSTP1_5 ( 0x20UL << RTC_CALSTAMP1_DAYSTP1_Pos ) + + +/*************** Bits definition for RTC_CLKSTAMP2 **********************/ + +#define RTC_CLKSTAMP2_HRSTP2_Pos ( 16U ) +#define RTC_CLKSTAMP2_HRSTP2_Msk ( 0x3fUL << RTC_CLKSTAMP2_HRSTP2_Pos ) +#define RTC_CLKSTAMP2_HRSTP2 ( RTC_CLKSTAMP2_HRSTP2_Msk ) +#define RTC_CLKSTAMP2_HRSTP2_0 ( 0x1UL << RTC_CLKSTAMP2_HRSTP2_Pos ) +#define RTC_CLKSTAMP2_HRSTP2_1 ( 0x2UL << RTC_CLKSTAMP2_HRSTP2_Pos ) +#define RTC_CLKSTAMP2_HRSTP2_2 ( 0x4UL << RTC_CLKSTAMP2_HRSTP2_Pos ) +#define RTC_CLKSTAMP2_HRSTP2_3 ( 0x8UL << RTC_CLKSTAMP2_HRSTP2_Pos ) +#define RTC_CLKSTAMP2_HRSTP2_4 ( 0x10UL << RTC_CLKSTAMP2_HRSTP2_Pos ) +#define RTC_CLKSTAMP2_HRSTP2_5 ( 0x20UL << RTC_CLKSTAMP2_HRSTP2_Pos ) + +#define RTC_CLKSTAMP2_MINSTP2_Pos ( 8U ) +#define RTC_CLKSTAMP2_MINSTP2_Msk ( 0x7fUL << RTC_CLKSTAMP2_MINSTP2_Pos ) +#define RTC_CLKSTAMP2_MINSTP2 ( RTC_CLKSTAMP2_MINSTP2_Msk ) +#define RTC_CLKSTAMP2_MINSTP2_0 ( 0x1UL << RTC_CLKSTAMP2_MINSTP2_Pos ) +#define RTC_CLKSTAMP2_MINSTP2_1 ( 0x2UL << RTC_CLKSTAMP2_MINSTP2_Pos ) +#define RTC_CLKSTAMP2_MINSTP2_2 ( 0x4UL << RTC_CLKSTAMP2_MINSTP2_Pos ) +#define RTC_CLKSTAMP2_MINSTP2_3 ( 0x8UL << RTC_CLKSTAMP2_MINSTP2_Pos ) +#define RTC_CLKSTAMP2_MINSTP2_4 ( 0x10UL << RTC_CLKSTAMP2_MINSTP2_Pos ) +#define RTC_CLKSTAMP2_MINSTP2_5 ( 0x20UL << RTC_CLKSTAMP2_MINSTP2_Pos ) +#define RTC_CLKSTAMP2_MINSTP2_6 ( 0x40UL << RTC_CLKSTAMP2_MINSTP2_Pos ) + +#define RTC_CLKSTAMP2_SECSTP2_Pos ( 0U ) +#define RTC_CLKSTAMP2_SECSTP2_Msk ( 0x7fUL << RTC_CLKSTAMP2_SECSTP2_Pos ) +#define RTC_CLKSTAMP2_SECSTP2 ( RTC_CLKSTAMP2_SECSTP2_Msk ) +#define RTC_CLKSTAMP2_SECSTP2_0 ( 0x1UL << RTC_CLKSTAMP2_SECSTP2_Pos ) +#define RTC_CLKSTAMP2_SECSTP2_1 ( 0x2UL << RTC_CLKSTAMP2_SECSTP2_Pos ) +#define RTC_CLKSTAMP2_SECSTP2_2 ( 0x4UL << RTC_CLKSTAMP2_SECSTP2_Pos ) +#define RTC_CLKSTAMP2_SECSTP2_3 ( 0x8UL << RTC_CLKSTAMP2_SECSTP2_Pos ) +#define RTC_CLKSTAMP2_SECSTP2_4 ( 0x10UL << RTC_CLKSTAMP2_SECSTP2_Pos ) +#define RTC_CLKSTAMP2_SECSTP2_5 ( 0x20UL << RTC_CLKSTAMP2_SECSTP2_Pos ) +#define RTC_CLKSTAMP2_SECSTP2_6 ( 0x40UL << RTC_CLKSTAMP2_SECSTP2_Pos ) + + +/*************** Bits definition for RTC_CALSTAMP2 **********************/ + +#define RTC_CALSTAMP2_YEARSTP2_Pos ( 24U ) +#define RTC_CALSTAMP2_YEARSTP2_Msk ( 0xffUL << RTC_CALSTAMP2_YEARSTP2_Pos ) +#define RTC_CALSTAMP2_YEARSTP2 ( RTC_CALSTAMP2_YEARSTP2_Msk ) +#define RTC_CALSTAMP2_YEARSTP2_0 ( 0x1UL << RTC_CALSTAMP2_YEARSTP2_Pos ) +#define RTC_CALSTAMP2_YEARSTP2_1 ( 0x2UL << RTC_CALSTAMP2_YEARSTP2_Pos ) +#define RTC_CALSTAMP2_YEARSTP2_2 ( 0x4UL << RTC_CALSTAMP2_YEARSTP2_Pos ) +#define RTC_CALSTAMP2_YEARSTP2_3 ( 0x8UL << RTC_CALSTAMP2_YEARSTP2_Pos ) +#define RTC_CALSTAMP2_YEARSTP2_4 ( 0x10UL << RTC_CALSTAMP2_YEARSTP2_Pos ) +#define RTC_CALSTAMP2_YEARSTP2_5 ( 0x20UL << RTC_CALSTAMP2_YEARSTP2_Pos ) +#define RTC_CALSTAMP2_YEARSTP2_6 ( 0x40UL << RTC_CALSTAMP2_YEARSTP2_Pos ) +#define RTC_CALSTAMP2_YEARSTP2_7 ( 0x80UL << RTC_CALSTAMP2_YEARSTP2_Pos ) + +#define RTC_CALSTAMP2_MONSTP2_Pos ( 16U ) +#define RTC_CALSTAMP2_MONSTP2_Msk ( 0x1fUL << RTC_CALSTAMP2_MONSTP2_Pos ) +#define RTC_CALSTAMP2_MONSTP2 ( RTC_CALSTAMP2_MONSTP2_Msk ) +#define RTC_CALSTAMP2_MONSTP2_0 ( 0x1UL << RTC_CALSTAMP2_MONSTP2_Pos ) +#define RTC_CALSTAMP2_MONSTP2_1 ( 0x2UL << RTC_CALSTAMP2_MONSTP2_Pos ) +#define RTC_CALSTAMP2_MONSTP2_2 ( 0x4UL << RTC_CALSTAMP2_MONSTP2_Pos ) +#define RTC_CALSTAMP2_MONSTP2_3 ( 0x8UL << RTC_CALSTAMP2_MONSTP2_Pos ) +#define RTC_CALSTAMP2_MONSTP2_4 ( 0x10UL << RTC_CALSTAMP2_MONSTP2_Pos ) + +#define RTC_CALSTAMP2_WKSTP2_Pos ( 8U ) +#define RTC_CALSTAMP2_WKSTP2_Msk ( 0x7UL << RTC_CALSTAMP2_WKSTP2_Pos ) +#define RTC_CALSTAMP2_WKSTP2 ( RTC_CALSTAMP2_WKSTP2_Msk ) +#define RTC_CALSTAMP2_WKSTP2_0 ( 0x1UL << RTC_CALSTAMP2_WKSTP2_Pos ) +#define RTC_CALSTAMP2_WKSTP2_1 ( 0x2UL << RTC_CALSTAMP2_WKSTP2_Pos ) +#define RTC_CALSTAMP2_WKSTP2_2 ( 0x4UL << RTC_CALSTAMP2_WKSTP2_Pos ) + +#define RTC_CALSTAMP2_DAYSTP2_Pos ( 0U ) +#define RTC_CALSTAMP2_DAYSTP2_Msk ( 0x3fUL << RTC_CALSTAMP2_DAYSTP2_Pos ) +#define RTC_CALSTAMP2_DAYSTP2 ( RTC_CALSTAMP2_DAYSTP2_Msk ) +#define RTC_CALSTAMP2_DAYSTP2_0 ( 0x1UL << RTC_CALSTAMP2_DAYSTP2_Pos ) +#define RTC_CALSTAMP2_DAYSTP2_1 ( 0x2UL << RTC_CALSTAMP2_DAYSTP2_Pos ) +#define RTC_CALSTAMP2_DAYSTP2_2 ( 0x4UL << RTC_CALSTAMP2_DAYSTP2_Pos ) +#define RTC_CALSTAMP2_DAYSTP2_3 ( 0x8UL << RTC_CALSTAMP2_DAYSTP2_Pos ) +#define RTC_CALSTAMP2_DAYSTP2_4 ( 0x10UL << RTC_CALSTAMP2_DAYSTP2_Pos ) +#define RTC_CALSTAMP2_DAYSTP2_5 ( 0x20UL << RTC_CALSTAMP2_DAYSTP2_Pos ) + + +/*************** Bits definition for RTC_WUTR **********************/ + +#define RTC_WUTR_WUT_Pos ( 0U ) +#define RTC_WUTR_WUT_Msk ( 0xffffUL << RTC_WUTR_WUT_Pos ) +#define RTC_WUTR_WUT ( RTC_WUTR_WUT_Msk ) + + +/*************** Bits definition for RTC_BAKUPx **********************/ + +#define RTC_BAKUPX_BAKUP_Pos ( 0U ) +#define RTC_BAKUPX_BAKUP_Msk ( 0xffffffffUL << RTC_BAKUPX_BAKUP_Pos ) +#define RTC_BAKUPX_BAKUP ( RTC_BAKUPX_BAKUP_Msk ) + + +/*************** Bits definition for WDT_LOAD **********************/ + +#define WDT_LOAD_LOAD_Pos ( 0U ) +#define WDT_LOAD_LOAD_Msk ( 0xffffffffUL << WDT_LOAD_LOAD_Pos ) +#define WDT_LOAD_LOAD ( WDT_LOAD_LOAD_Msk ) + + +/*************** Bits definition for WDT_COUNT **********************/ + +#define WDT_COUNT_COUNT_Pos ( 0U ) +#define WDT_COUNT_COUNT_Msk ( 0xffffffffUL << WDT_COUNT_COUNT_Pos ) +#define WDT_COUNT_COUNT ( WDT_COUNT_COUNT_Msk ) + + +/*************** Bits definition for WDT_CTRL **********************/ + +#define WDT_CTRL_EN_Pos ( 7U ) +#define WDT_CTRL_EN_Msk ( 0x1UL << WDT_CTRL_EN_Pos ) +#define WDT_CTRL_EN ( WDT_CTRL_EN_Msk ) + +#define WDT_CTRL_MODE_Pos ( 6U ) +#define WDT_CTRL_MODE_Msk ( 0x1UL << WDT_CTRL_MODE_Pos ) +#define WDT_CTRL_MODE ( WDT_CTRL_MODE_Msk ) + +#define WDT_CTRL_INTEN_Pos ( 4U ) +#define WDT_CTRL_INTEN_Msk ( 0x1UL << WDT_CTRL_INTEN_Pos ) +#define WDT_CTRL_INTEN ( WDT_CTRL_INTEN_Msk ) + +#define WDT_CTRL_DIVISOR_Pos ( 0U ) +#define WDT_CTRL_DIVISOR_Msk ( 0x7UL << WDT_CTRL_DIVISOR_Pos ) +#define WDT_CTRL_DIVISOR ( WDT_CTRL_DIVISOR_Msk ) +#define WDT_CTRL_DIVISOR_0 ( 0x1UL << WDT_CTRL_DIVISOR_Pos ) +#define WDT_CTRL_DIVISOR_1 ( 0x2UL << WDT_CTRL_DIVISOR_Pos ) +#define WDT_CTRL_DIVISOR_2 ( 0x4UL << WDT_CTRL_DIVISOR_Pos ) + + +/*************** Bits definition for WDT_FEED **********************/ + +#define WDT_FEED_FEED_Pos ( 0U ) +#define WDT_FEED_FEED_Msk ( 0xffffffffUL << WDT_FEED_FEED_Pos ) +#define WDT_FEED_FEED ( WDT_FEED_FEED_Msk ) + + +/*************** Bits definition for WDT_INTCLRTIME **********************/ + +#define WDT_INTCLRTIME_INTCLRT_Pos ( 0U ) +#define WDT_INTCLRTIME_INTCLRT_Msk ( 0xffffUL << WDT_INTCLRTIME_INTCLRT_Pos ) +#define WDT_INTCLRTIME_INTCLRT ( WDT_INTCLRTIME_INTCLRT_Msk ) + + +/*************** Bits definition for WDT_RIS **********************/ + +#define WDT_RIS_WDT_RIS_Pos ( 0U ) +#define WDT_RIS_WDT_RIS_Msk ( 0x1UL << WDT_RIS_WDT_RIS_Pos ) +#define WDT_RIS_WDT_RIS ( WDT_RIS_WDT_RIS_Msk ) + + +/*************** Bits definition for IWDT_CMDR **********************/ + +#define IWDT_CMDR_CMD_Pos ( 0U ) +#define IWDT_CMDR_CMD_Msk ( 0xffffUL << IWDT_CMDR_CMD_Pos ) +#define IWDT_CMDR_CMD ( IWDT_CMDR_CMD_Msk ) + + +/*************** Bits definition for IWDT_PR **********************/ + +#define IWDT_PR_PR_Pos ( 0U ) +#define IWDT_PR_PR_Msk ( 0x7UL << IWDT_PR_PR_Pos ) +#define IWDT_PR_PR ( IWDT_PR_PR_Msk ) +#define IWDT_PR_PR_0 ( 0x1UL << IWDT_PR_PR_Pos ) +#define IWDT_PR_PR_1 ( 0x2UL << IWDT_PR_PR_Pos ) +#define IWDT_PR_PR_2 ( 0x4UL << IWDT_PR_PR_Pos ) + + +/*************** Bits definition for IWDT_RLR **********************/ + +#define IWDT_RLR_PL_Pos ( 0U ) +#define IWDT_RLR_PL_Msk ( 0xfffUL << IWDT_RLR_PL_Pos ) +#define IWDT_RLR_PL ( IWDT_RLR_PL_Msk ) + + +/*************** Bits definition for IWDT_SR **********************/ + +#define IWDT_SR_RLF_Pos ( 4U ) +#define IWDT_SR_RLF_Msk ( 0x1UL << IWDT_SR_RLF_Pos ) +#define IWDT_SR_RLF ( IWDT_SR_RLF_Msk ) + +#define IWDT_SR_WTU_Pos ( 3U ) +#define IWDT_SR_WTU_Msk ( 0x1UL << IWDT_SR_WTU_Pos ) +#define IWDT_SR_WTU ( IWDT_SR_WTU_Msk ) + +#define IWDT_SR_WVU_Pos ( 2U ) +#define IWDT_SR_WVU_Msk ( 0x1UL << IWDT_SR_WVU_Pos ) +#define IWDT_SR_WVU ( IWDT_SR_WVU_Msk ) + +#define IWDT_SR_RVU_Pos ( 1U ) +#define IWDT_SR_RVU_Msk ( 0x1UL << IWDT_SR_RVU_Pos ) +#define IWDT_SR_RVU ( IWDT_SR_RVU_Msk ) + +#define IWDT_SR_PVU_Pos ( 0U ) +#define IWDT_SR_PVU_Msk ( 0x1UL << IWDT_SR_PVU_Pos ) +#define IWDT_SR_PVU ( IWDT_SR_PVU_Msk ) + + +/*************** Bits definition for IWDT_WINR **********************/ + +#define IWDT_WINR_WIN_Pos ( 0U ) +#define IWDT_WINR_WIN_Msk ( 0xfffUL << IWDT_WINR_WIN_Pos ) +#define IWDT_WINR_WIN ( IWDT_WINR_WIN_Msk ) + + +/*************** Bits definition for IWDT_WUTR **********************/ + +#define IWDT_WUTR_WUT_Pos ( 0U ) +#define IWDT_WUTR_WUT_Msk ( 0xfffUL << IWDT_WUTR_WUT_Pos ) +#define IWDT_WUTR_WUT ( IWDT_WUTR_WUT_Msk ) + + +/*************** Bits definition for ADC_SR **********************/ + +#define ADC_SR_AFE_EOC_Pos ( 8U ) +#define ADC_SR_AFE_EOC_Msk ( 0x1UL << ADC_SR_AFE_EOC_Pos ) +#define ADC_SR_AFE_EOC ( ADC_SR_AFE_EOC_Msk ) + +#define ADC_SR_AWD_Pos ( 7U ) +#define ADC_SR_AWD_Msk ( 0x1UL << ADC_SR_AWD_Pos ) +#define ADC_SR_AWD ( ADC_SR_AWD_Msk ) + +#define ADC_SR_JEOG_Pos ( 6U ) +#define ADC_SR_JEOG_Msk ( 0x1UL << ADC_SR_JEOG_Pos ) +#define ADC_SR_JEOG ( ADC_SR_JEOG_Msk ) + +#define ADC_SR_JEOC_Pos ( 5U ) +#define ADC_SR_JEOC_Msk ( 0x1UL << ADC_SR_JEOC_Pos ) +#define ADC_SR_JEOC ( ADC_SR_JEOC_Msk ) + +#define ADC_SR_OVERF_Pos ( 4U ) +#define ADC_SR_OVERF_Msk ( 0x1UL << ADC_SR_OVERF_Pos ) +#define ADC_SR_OVERF ( ADC_SR_OVERF_Msk ) + +#define ADC_SR_EOG_Pos ( 3U ) +#define ADC_SR_EOG_Msk ( 0x1UL << ADC_SR_EOG_Pos ) +#define ADC_SR_EOG ( ADC_SR_EOG_Msk ) + +#define ADC_SR_EOC_Pos ( 2U ) +#define ADC_SR_EOC_Msk ( 0x1UL << ADC_SR_EOC_Pos ) +#define ADC_SR_EOC ( ADC_SR_EOC_Msk ) + +#define ADC_SR_EOSMP_Pos ( 1U ) +#define ADC_SR_EOSMP_Msk ( 0x1UL << ADC_SR_EOSMP_Pos ) +#define ADC_SR_EOSMP ( ADC_SR_EOSMP_Msk ) + +#define ADC_SR_ADRDY_Pos ( 0U ) +#define ADC_SR_ADRDY_Msk ( 0x1UL << ADC_SR_ADRDY_Pos ) +#define ADC_SR_ADRDY ( ADC_SR_ADRDY_Msk ) + + +/*************** Bits definition for ADC_IE **********************/ + +#define ADC_IE_AWDIE_Pos ( 7U ) +#define ADC_IE_AWDIE_Msk ( 0x1UL << ADC_IE_AWDIE_Pos ) +#define ADC_IE_AWDIE ( ADC_IE_AWDIE_Msk ) + +#define ADC_IE_JEOGIE_Pos ( 6U ) +#define ADC_IE_JEOGIE_Msk ( 0x1UL << ADC_IE_JEOGIE_Pos ) +#define ADC_IE_JEOGIE ( ADC_IE_JEOGIE_Msk ) + +#define ADC_IE_JEOCIE_Pos ( 5U ) +#define ADC_IE_JEOCIE_Msk ( 0x1UL << ADC_IE_JEOCIE_Pos ) +#define ADC_IE_JEOCIE ( ADC_IE_JEOCIE_Msk ) + +#define ADC_IE_OVERFIE_Pos ( 4U ) +#define ADC_IE_OVERFIE_Msk ( 0x1UL << ADC_IE_OVERFIE_Pos ) +#define ADC_IE_OVERFIE ( ADC_IE_OVERFIE_Msk ) + +#define ADC_IE_EOGIE_Pos ( 3U ) +#define ADC_IE_EOGIE_Msk ( 0x1UL << ADC_IE_EOGIE_Pos ) +#define ADC_IE_EOGIE ( ADC_IE_EOGIE_Msk ) + +#define ADC_IE_EOCIE_Pos ( 2U ) +#define ADC_IE_EOCIE_Msk ( 0x1UL << ADC_IE_EOCIE_Pos ) +#define ADC_IE_EOCIE ( ADC_IE_EOCIE_Msk ) + +#define ADC_IE_EOSMPIE_Pos ( 1U ) +#define ADC_IE_EOSMPIE_Msk ( 0x1UL << ADC_IE_EOSMPIE_Pos ) +#define ADC_IE_EOSMPIE ( ADC_IE_EOSMPIE_Msk ) + + +/*************** Bits definition for ADC_CR1 **********************/ + +#define ADC_CR1_DISCNUM_Pos ( 28U ) +#define ADC_CR1_DISCNUM_Msk ( 0x7UL << ADC_CR1_DISCNUM_Pos ) +#define ADC_CR1_DISCNUM ( ADC_CR1_DISCNUM_Msk ) +#define ADC_CR1_DISCNUM_0 ( 0x1UL << ADC_CR1_DISCNUM_Pos ) +#define ADC_CR1_DISCNUM_1 ( 0x2UL << ADC_CR1_DISCNUM_Pos ) +#define ADC_CR1_DISCNUM_2 ( 0x4UL << ADC_CR1_DISCNUM_Pos ) + +#define ADC_CR1_JDISCEN_Pos ( 27U ) +#define ADC_CR1_JDISCEN_Msk ( 0x1UL << ADC_CR1_JDISCEN_Pos ) +#define ADC_CR1_JDISCEN ( ADC_CR1_JDISCEN_Msk ) + +#define ADC_CR1_DISCEN_Pos ( 26U ) +#define ADC_CR1_DISCEN_Msk ( 0x1UL << ADC_CR1_DISCEN_Pos ) +#define ADC_CR1_DISCEN ( ADC_CR1_DISCEN_Msk ) + +#define ADC_CR1_JAUTO_Pos ( 25U ) +#define ADC_CR1_JAUTO_Msk ( 0x1UL << ADC_CR1_JAUTO_Pos ) +#define ADC_CR1_JAUTO ( ADC_CR1_JAUTO_Msk ) + +#define ADC_CR1_CONT_Pos ( 24U ) +#define ADC_CR1_CONT_Msk ( 0x1UL << ADC_CR1_CONT_Pos ) +#define ADC_CR1_CONT ( ADC_CR1_CONT_Msk ) + +#define ADC_CR1_SWSTART_Pos ( 23U ) +#define ADC_CR1_SWSTART_Msk ( 0x1UL << ADC_CR1_SWSTART_Pos ) +#define ADC_CR1_SWSTART ( ADC_CR1_SWSTART_Msk ) + +#define ADC_CR1_JSWSTART_Pos ( 22U ) +#define ADC_CR1_JSWSTART_Msk ( 0x1UL << ADC_CR1_JSWSTART_Pos ) +#define ADC_CR1_JSWSTART ( ADC_CR1_JSWSTART_Msk ) + +#define ADC_CR1_EXTSEL_Pos ( 16U ) +#define ADC_CR1_EXTSEL_Msk ( 0x1fUL << ADC_CR1_EXTSEL_Pos ) +#define ADC_CR1_EXTSEL ( ADC_CR1_EXTSEL_Msk ) +#define ADC_CR1_EXTSEL_0 ( 0x1UL << ADC_CR1_EXTSEL_Pos ) +#define ADC_CR1_EXTSEL_1 ( 0x2UL << ADC_CR1_EXTSEL_Pos ) +#define ADC_CR1_EXTSEL_2 ( 0x4UL << ADC_CR1_EXTSEL_Pos ) +#define ADC_CR1_EXTSEL_3 ( 0x8UL << ADC_CR1_EXTSEL_Pos ) +#define ADC_CR1_EXTSEL_4 ( 0x10UL << ADC_CR1_EXTSEL_Pos ) + +#define ADC_CR1_EXTEN_Pos ( 14U ) +#define ADC_CR1_EXTEN_Msk ( 0x3UL << ADC_CR1_EXTEN_Pos ) +#define ADC_CR1_EXTEN ( ADC_CR1_EXTEN_Msk ) +#define ADC_CR1_EXTEN_0 ( 0x1UL << ADC_CR1_EXTEN_Pos ) +#define ADC_CR1_EXTEN_1 ( 0x2UL << ADC_CR1_EXTEN_Pos ) + +#define ADC_CR1_DMA_Pos ( 13U ) +#define ADC_CR1_DMA_Msk ( 0x1UL << ADC_CR1_DMA_Pos ) +#define ADC_CR1_DMA ( ADC_CR1_DMA_Msk ) + +#define ADC_CR1_AWDEN_Pos ( 12U ) +#define ADC_CR1_AWDEN_Msk ( 0x1UL << ADC_CR1_AWDEN_Pos ) +#define ADC_CR1_AWDEN ( ADC_CR1_AWDEN_Msk ) + +#define ADC_CR1_JAWDEN_Pos ( 11U ) +#define ADC_CR1_JAWDEN_Msk ( 0x1UL << ADC_CR1_JAWDEN_Pos ) +#define ADC_CR1_JAWDEN ( ADC_CR1_JAWDEN_Msk ) + +#define ADC_CR1_AWDSGL_Pos ( 10U ) +#define ADC_CR1_AWDSGL_Msk ( 0x1UL << ADC_CR1_AWDSGL_Pos ) +#define ADC_CR1_AWDSGL ( ADC_CR1_AWDSGL_Msk ) + +#define ADC_CR1_AWDJCH_Pos ( 5U ) +#define ADC_CR1_AWDJCH_Msk ( 0x1fUL << ADC_CR1_AWDJCH_Pos ) +#define ADC_CR1_AWDJCH ( ADC_CR1_AWDJCH_Msk ) +#define ADC_CR1_AWDJCH_0 ( 0x1UL << ADC_CR1_AWDJCH_Pos ) +#define ADC_CR1_AWDJCH_1 ( 0x2UL << ADC_CR1_AWDJCH_Pos ) +#define ADC_CR1_AWDJCH_2 ( 0x4UL << ADC_CR1_AWDJCH_Pos ) +#define ADC_CR1_AWDJCH_3 ( 0x8UL << ADC_CR1_AWDJCH_Pos ) +#define ADC_CR1_AWDJCH_4 ( 0x10UL << ADC_CR1_AWDJCH_Pos ) + +#define ADC_CR1_AWDCH_Pos ( 0U ) +#define ADC_CR1_AWDCH_Msk ( 0x1fUL << ADC_CR1_AWDCH_Pos ) +#define ADC_CR1_AWDCH ( ADC_CR1_AWDCH_Msk ) +#define ADC_CR1_AWDCH_0 ( 0x1UL << ADC_CR1_AWDCH_Pos ) +#define ADC_CR1_AWDCH_1 ( 0x2UL << ADC_CR1_AWDCH_Pos ) +#define ADC_CR1_AWDCH_2 ( 0x4UL << ADC_CR1_AWDCH_Pos ) +#define ADC_CR1_AWDCH_3 ( 0x8UL << ADC_CR1_AWDCH_Pos ) +#define ADC_CR1_AWDCH_4 ( 0x10UL << ADC_CR1_AWDCH_Pos ) + + +/*************** Bits definition for ADC_CR2 **********************/ + +#define ADC_CR2_ADCCAL_Pos ( 31U ) +#define ADC_CR2_ADCCAL_Msk ( 0x1UL << ADC_CR2_ADCCAL_Pos ) +#define ADC_CR2_ADCCAL ( ADC_CR2_ADCCAL_Msk ) + +#define ADC_CR2_ADCCALDIF_Pos ( 30U ) +#define ADC_CR2_ADCCALDIF_Msk ( 0x1UL << ADC_CR2_ADCCALDIF_Pos ) +#define ADC_CR2_ADCCALDIF ( ADC_CR2_ADCCALDIF_Msk ) + +#define ADC_CR2_ADCRSTN_Pos ( 29U ) +#define ADC_CR2_ADCRSTN_Msk ( 0x1UL << ADC_CR2_ADCRSTN_Pos ) +#define ADC_CR2_ADCRSTN ( ADC_CR2_ADCRSTN_Msk ) + +#define ADC_CR2_ADCVREGEN_Pos ( 28U ) +#define ADC_CR2_ADCVREGEN_Msk ( 0x1UL << ADC_CR2_ADCVREGEN_Pos ) +#define ADC_CR2_ADCVREGEN ( ADC_CR2_ADCVREGEN_Msk ) + +#define ADC_CR2_JOVSE_Pos ( 25U ) +#define ADC_CR2_JOVSE_Msk ( 0x1UL << ADC_CR2_JOVSE_Pos ) +#define ADC_CR2_JOVSE ( ADC_CR2_JOVSE_Msk ) + +#define ADC_CR2_TROVS_Pos ( 24U ) +#define ADC_CR2_TROVS_Msk ( 0x1UL << ADC_CR2_TROVS_Pos ) +#define ADC_CR2_TROVS ( ADC_CR2_TROVS_Msk ) + +#define ADC_CR2_OVSS_Pos ( 20U ) +#define ADC_CR2_OVSS_Msk ( 0xfUL << ADC_CR2_OVSS_Pos ) +#define ADC_CR2_OVSS ( ADC_CR2_OVSS_Msk ) +#define ADC_CR2_OVSS_0 ( 0x1UL << ADC_CR2_OVSS_Pos ) +#define ADC_CR2_OVSS_1 ( 0x2UL << ADC_CR2_OVSS_Pos ) +#define ADC_CR2_OVSS_2 ( 0x4UL << ADC_CR2_OVSS_Pos ) +#define ADC_CR2_OVSS_3 ( 0x8UL << ADC_CR2_OVSS_Pos ) + +#define ADC_CR2_OVSR_Pos ( 17U ) +#define ADC_CR2_OVSR_Msk ( 0x7UL << ADC_CR2_OVSR_Pos ) +#define ADC_CR2_OVSR ( ADC_CR2_OVSR_Msk ) +#define ADC_CR2_OVSR_0 ( 0x1UL << ADC_CR2_OVSR_Pos ) +#define ADC_CR2_OVSR_1 ( 0x2UL << ADC_CR2_OVSR_Pos ) +#define ADC_CR2_OVSR_2 ( 0x4UL << ADC_CR2_OVSR_Pos ) + +#define ADC_CR2_OVSE_Pos ( 16U ) +#define ADC_CR2_OVSE_Msk ( 0x1UL << ADC_CR2_OVSE_Pos ) +#define ADC_CR2_OVSE ( ADC_CR2_OVSE_Msk ) + +#define ADC_CR2_TRIMLDO12_Pos ( 6U ) +#define ADC_CR2_TRIMLDO12_Msk ( 0xfUL << ADC_CR2_TRIMLDO12_Pos ) +#define ADC_CR2_TRIMLDO12 ( ADC_CR2_TRIMLDO12_Msk ) +#define ADC_CR2_TRIMLDO12_0 ( 0x1UL << ADC_CR2_TRIMLDO12_Pos ) +#define ADC_CR2_TRIMLDO12_1 ( 0x2UL << ADC_CR2_TRIMLDO12_Pos ) +#define ADC_CR2_TRIMLDO12_2 ( 0x4UL << ADC_CR2_TRIMLDO12_Pos ) +#define ADC_CR2_TRIMLDO12_3 ( 0x8UL << ADC_CR2_TRIMLDO12_Pos ) + +#define ADC_CR2_RES_Pos ( 4U ) +#define ADC_CR2_RES_Msk ( 0x3UL << ADC_CR2_RES_Pos ) +#define ADC_CR2_RES ( ADC_CR2_RES_Msk ) +#define ADC_CR2_RES_0 ( 0x1UL << ADC_CR2_RES_Pos ) +#define ADC_CR2_RES_1 ( 0x2UL << ADC_CR2_RES_Pos ) + +#define ADC_CR2_ALIGN_Pos ( 3U ) +#define ADC_CR2_ALIGN_Msk ( 0x1UL << ADC_CR2_ALIGN_Pos ) +#define ADC_CR2_ALIGN ( ADC_CR2_ALIGN_Msk ) + +#define ADC_CR2_STP_Pos ( 2U ) +#define ADC_CR2_STP_Msk ( 0x1UL << ADC_CR2_STP_Pos ) +#define ADC_CR2_STP ( ADC_CR2_STP_Msk ) + +#define ADC_CR2_OVRMOD_Pos ( 1U ) +#define ADC_CR2_OVRMOD_Msk ( 0x1UL << ADC_CR2_OVRMOD_Pos ) +#define ADC_CR2_OVRMOD ( ADC_CR2_OVRMOD_Msk ) + +#define ADC_CR2_EN_Pos ( 0U ) +#define ADC_CR2_EN_Msk ( 0x1UL << ADC_CR2_EN_Pos ) +#define ADC_CR2_EN ( ADC_CR2_EN_Msk ) + + +/*************** Bits definition for ADC_SMPR1 **********************/ + +#define ADC_SMPR1_SMP7_Pos ( 28U ) +#define ADC_SMPR1_SMP7_Msk ( 0xfUL << ADC_SMPR1_SMP7_Pos ) +#define ADC_SMPR1_SMP7 ( ADC_SMPR1_SMP7_Msk ) +#define ADC_SMPR1_SMP7_0 ( 0x1UL << ADC_SMPR1_SMP7_Pos ) +#define ADC_SMPR1_SMP7_1 ( 0x2UL << ADC_SMPR1_SMP7_Pos ) +#define ADC_SMPR1_SMP7_2 ( 0x4UL << ADC_SMPR1_SMP7_Pos ) +#define ADC_SMPR1_SMP7_3 ( 0x8UL << ADC_SMPR1_SMP7_Pos ) + +#define ADC_SMPR1_SMP6_Pos ( 24U ) +#define ADC_SMPR1_SMP6_Msk ( 0xfUL << ADC_SMPR1_SMP6_Pos ) +#define ADC_SMPR1_SMP6 ( ADC_SMPR1_SMP6_Msk ) +#define ADC_SMPR1_SMP6_0 ( 0x1UL << ADC_SMPR1_SMP6_Pos ) +#define ADC_SMPR1_SMP6_1 ( 0x2UL << ADC_SMPR1_SMP6_Pos ) +#define ADC_SMPR1_SMP6_2 ( 0x4UL << ADC_SMPR1_SMP6_Pos ) +#define ADC_SMPR1_SMP6_3 ( 0x8UL << ADC_SMPR1_SMP6_Pos ) + +#define ADC_SMPR1_SMP5_Pos ( 20U ) +#define ADC_SMPR1_SMP5_Msk ( 0xfUL << ADC_SMPR1_SMP5_Pos ) +#define ADC_SMPR1_SMP5 ( ADC_SMPR1_SMP5_Msk ) +#define ADC_SMPR1_SMP5_0 ( 0x1UL << ADC_SMPR1_SMP5_Pos ) +#define ADC_SMPR1_SMP5_1 ( 0x2UL << ADC_SMPR1_SMP5_Pos ) +#define ADC_SMPR1_SMP5_2 ( 0x4UL << ADC_SMPR1_SMP5_Pos ) +#define ADC_SMPR1_SMP5_3 ( 0x8UL << ADC_SMPR1_SMP5_Pos ) + +#define ADC_SMPR1_SMP4_Pos ( 16U ) +#define ADC_SMPR1_SMP4_Msk ( 0xfUL << ADC_SMPR1_SMP4_Pos ) +#define ADC_SMPR1_SMP4 ( ADC_SMPR1_SMP4_Msk ) +#define ADC_SMPR1_SMP4_0 ( 0x1UL << ADC_SMPR1_SMP4_Pos ) +#define ADC_SMPR1_SMP4_1 ( 0x2UL << ADC_SMPR1_SMP4_Pos ) +#define ADC_SMPR1_SMP4_2 ( 0x4UL << ADC_SMPR1_SMP4_Pos ) +#define ADC_SMPR1_SMP4_3 ( 0x8UL << ADC_SMPR1_SMP4_Pos ) + +#define ADC_SMPR1_SMP3_Pos ( 12U ) +#define ADC_SMPR1_SMP3_Msk ( 0xfUL << ADC_SMPR1_SMP3_Pos ) +#define ADC_SMPR1_SMP3 ( ADC_SMPR1_SMP3_Msk ) +#define ADC_SMPR1_SMP3_0 ( 0x1UL << ADC_SMPR1_SMP3_Pos ) +#define ADC_SMPR1_SMP3_1 ( 0x2UL << ADC_SMPR1_SMP3_Pos ) +#define ADC_SMPR1_SMP3_2 ( 0x4UL << ADC_SMPR1_SMP3_Pos ) +#define ADC_SMPR1_SMP3_3 ( 0x8UL << ADC_SMPR1_SMP3_Pos ) + +#define ADC_SMPR1_SMP2_Pos ( 8U ) +#define ADC_SMPR1_SMP2_Msk ( 0xfUL << ADC_SMPR1_SMP2_Pos ) +#define ADC_SMPR1_SMP2 ( ADC_SMPR1_SMP2_Msk ) +#define ADC_SMPR1_SMP2_0 ( 0x1UL << ADC_SMPR1_SMP2_Pos ) +#define ADC_SMPR1_SMP2_1 ( 0x2UL << ADC_SMPR1_SMP2_Pos ) +#define ADC_SMPR1_SMP2_2 ( 0x4UL << ADC_SMPR1_SMP2_Pos ) +#define ADC_SMPR1_SMP2_3 ( 0x8UL << ADC_SMPR1_SMP2_Pos ) + +#define ADC_SMPR1_SMP1_Pos ( 4U ) +#define ADC_SMPR1_SMP1_Msk ( 0xfUL << ADC_SMPR1_SMP1_Pos ) +#define ADC_SMPR1_SMP1 ( ADC_SMPR1_SMP1_Msk ) +#define ADC_SMPR1_SMP1_0 ( 0x1UL << ADC_SMPR1_SMP1_Pos ) +#define ADC_SMPR1_SMP1_1 ( 0x2UL << ADC_SMPR1_SMP1_Pos ) +#define ADC_SMPR1_SMP1_2 ( 0x4UL << ADC_SMPR1_SMP1_Pos ) +#define ADC_SMPR1_SMP1_3 ( 0x8UL << ADC_SMPR1_SMP1_Pos ) + +#define ADC_SMPR1_SMP0_Pos ( 0U ) +#define ADC_SMPR1_SMP0_Msk ( 0xfUL << ADC_SMPR1_SMP0_Pos ) +#define ADC_SMPR1_SMP0 ( ADC_SMPR1_SMP0_Msk ) +#define ADC_SMPR1_SMP0_0 ( 0x1UL << ADC_SMPR1_SMP0_Pos ) +#define ADC_SMPR1_SMP0_1 ( 0x2UL << ADC_SMPR1_SMP0_Pos ) +#define ADC_SMPR1_SMP0_2 ( 0x4UL << ADC_SMPR1_SMP0_Pos ) +#define ADC_SMPR1_SMP0_3 ( 0x8UL << ADC_SMPR1_SMP0_Pos ) + + +/*************** Bits definition for ADC_SMPR2 **********************/ + +#define ADC_SMPR2_SMP15_Pos ( 28U ) +#define ADC_SMPR2_SMP15_Msk ( 0xfUL << ADC_SMPR2_SMP15_Pos ) +#define ADC_SMPR2_SMP15 ( ADC_SMPR2_SMP15_Msk ) +#define ADC_SMPR2_SMP15_0 ( 0x1UL << ADC_SMPR2_SMP15_Pos ) +#define ADC_SMPR2_SMP15_1 ( 0x2UL << ADC_SMPR2_SMP15_Pos ) +#define ADC_SMPR2_SMP15_2 ( 0x4UL << ADC_SMPR2_SMP15_Pos ) +#define ADC_SMPR2_SMP15_3 ( 0x8UL << ADC_SMPR2_SMP15_Pos ) + +#define ADC_SMPR2_SMP14_Pos ( 24U ) +#define ADC_SMPR2_SMP14_Msk ( 0xfUL << ADC_SMPR2_SMP14_Pos ) +#define ADC_SMPR2_SMP14 ( ADC_SMPR2_SMP14_Msk ) +#define ADC_SMPR2_SMP14_0 ( 0x1UL << ADC_SMPR2_SMP14_Pos ) +#define ADC_SMPR2_SMP14_1 ( 0x2UL << ADC_SMPR2_SMP14_Pos ) +#define ADC_SMPR2_SMP14_2 ( 0x4UL << ADC_SMPR2_SMP14_Pos ) +#define ADC_SMPR2_SMP14_3 ( 0x8UL << ADC_SMPR2_SMP14_Pos ) + +#define ADC_SMPR2_SMP13_Pos ( 20U ) +#define ADC_SMPR2_SMP13_Msk ( 0xfUL << ADC_SMPR2_SMP13_Pos ) +#define ADC_SMPR2_SMP13 ( ADC_SMPR2_SMP13_Msk ) +#define ADC_SMPR2_SMP13_0 ( 0x1UL << ADC_SMPR2_SMP13_Pos ) +#define ADC_SMPR2_SMP13_1 ( 0x2UL << ADC_SMPR2_SMP13_Pos ) +#define ADC_SMPR2_SMP13_2 ( 0x4UL << ADC_SMPR2_SMP13_Pos ) +#define ADC_SMPR2_SMP13_3 ( 0x8UL << ADC_SMPR2_SMP13_Pos ) + +#define ADC_SMPR2_SMP12_Pos ( 16U ) +#define ADC_SMPR2_SMP12_Msk ( 0xfUL << ADC_SMPR2_SMP12_Pos ) +#define ADC_SMPR2_SMP12 ( ADC_SMPR2_SMP12_Msk ) +#define ADC_SMPR2_SMP12_0 ( 0x1UL << ADC_SMPR2_SMP12_Pos ) +#define ADC_SMPR2_SMP12_1 ( 0x2UL << ADC_SMPR2_SMP12_Pos ) +#define ADC_SMPR2_SMP12_2 ( 0x4UL << ADC_SMPR2_SMP12_Pos ) +#define ADC_SMPR2_SMP12_3 ( 0x8UL << ADC_SMPR2_SMP12_Pos ) + +#define ADC_SMPR2_SMP11_Pos ( 12U ) +#define ADC_SMPR2_SMP11_Msk ( 0xfUL << ADC_SMPR2_SMP11_Pos ) +#define ADC_SMPR2_SMP11 ( ADC_SMPR2_SMP11_Msk ) +#define ADC_SMPR2_SMP11_0 ( 0x1UL << ADC_SMPR2_SMP11_Pos ) +#define ADC_SMPR2_SMP11_1 ( 0x2UL << ADC_SMPR2_SMP11_Pos ) +#define ADC_SMPR2_SMP11_2 ( 0x4UL << ADC_SMPR2_SMP11_Pos ) +#define ADC_SMPR2_SMP11_3 ( 0x8UL << ADC_SMPR2_SMP11_Pos ) + +#define ADC_SMPR2_SMP10_Pos ( 8U ) +#define ADC_SMPR2_SMP10_Msk ( 0xfUL << ADC_SMPR2_SMP10_Pos ) +#define ADC_SMPR2_SMP10 ( ADC_SMPR2_SMP10_Msk ) +#define ADC_SMPR2_SMP10_0 ( 0x1UL << ADC_SMPR2_SMP10_Pos ) +#define ADC_SMPR2_SMP10_1 ( 0x2UL << ADC_SMPR2_SMP10_Pos ) +#define ADC_SMPR2_SMP10_2 ( 0x4UL << ADC_SMPR2_SMP10_Pos ) +#define ADC_SMPR2_SMP10_3 ( 0x8UL << ADC_SMPR2_SMP10_Pos ) + +#define ADC_SMPR2_SMP9_Pos ( 4U ) +#define ADC_SMPR2_SMP9_Msk ( 0xfUL << ADC_SMPR2_SMP9_Pos ) +#define ADC_SMPR2_SMP9 ( ADC_SMPR2_SMP9_Msk ) +#define ADC_SMPR2_SMP9_0 ( 0x1UL << ADC_SMPR2_SMP9_Pos ) +#define ADC_SMPR2_SMP9_1 ( 0x2UL << ADC_SMPR2_SMP9_Pos ) +#define ADC_SMPR2_SMP9_2 ( 0x4UL << ADC_SMPR2_SMP9_Pos ) +#define ADC_SMPR2_SMP9_3 ( 0x8UL << ADC_SMPR2_SMP9_Pos ) + +#define ADC_SMPR2_SMP8_Pos ( 0U ) +#define ADC_SMPR2_SMP8_Msk ( 0xfUL << ADC_SMPR2_SMP8_Pos ) +#define ADC_SMPR2_SMP8 ( ADC_SMPR2_SMP8_Msk ) +#define ADC_SMPR2_SMP8_0 ( 0x1UL << ADC_SMPR2_SMP8_Pos ) +#define ADC_SMPR2_SMP8_1 ( 0x2UL << ADC_SMPR2_SMP8_Pos ) +#define ADC_SMPR2_SMP8_2 ( 0x4UL << ADC_SMPR2_SMP8_Pos ) +#define ADC_SMPR2_SMP8_3 ( 0x8UL << ADC_SMPR2_SMP8_Pos ) + + +/*************** Bits definition for ADC_SMPR3 **********************/ + +#define ADC_SMPR3_CONV_PLUS_Pos ( 20U ) +#define ADC_SMPR3_CONV_PLUS_Msk ( 0x3UL << ADC_SMPR3_CONV_PLUS_Pos ) +#define ADC_SMPR3_CONV_PLUS ( ADC_SMPR3_CONV_PLUS_Msk ) +#define ADC_SMPR3_CONV_PLUS_0 ( 0x1UL << ADC_SMPR3_CONV_PLUS_Pos ) +#define ADC_SMPR3_CONV_PLUS_1 ( 0x2UL << ADC_SMPR3_CONV_PLUS_Pos ) + +#define ADC_SMPR3_SMP20_Pos ( 16U ) +#define ADC_SMPR3_SMP20_Msk ( 0xfUL << ADC_SMPR3_SMP20_Pos ) +#define ADC_SMPR3_SMP20 ( ADC_SMPR3_SMP20_Msk ) +#define ADC_SMPR3_SMP20_0 ( 0x1UL << ADC_SMPR3_SMP20_Pos ) +#define ADC_SMPR3_SMP20_1 ( 0x2UL << ADC_SMPR3_SMP20_Pos ) +#define ADC_SMPR3_SMP20_2 ( 0x4UL << ADC_SMPR3_SMP20_Pos ) +#define ADC_SMPR3_SMP20_3 ( 0x8UL << ADC_SMPR3_SMP20_Pos ) + +#define ADC_SMPR3_SMP19_Pos ( 12U ) +#define ADC_SMPR3_SMP19_Msk ( 0xfUL << ADC_SMPR3_SMP19_Pos ) +#define ADC_SMPR3_SMP19 ( ADC_SMPR3_SMP19_Msk ) +#define ADC_SMPR3_SMP19_0 ( 0x1UL << ADC_SMPR3_SMP19_Pos ) +#define ADC_SMPR3_SMP19_1 ( 0x2UL << ADC_SMPR3_SMP19_Pos ) +#define ADC_SMPR3_SMP19_2 ( 0x4UL << ADC_SMPR3_SMP19_Pos ) +#define ADC_SMPR3_SMP19_3 ( 0x8UL << ADC_SMPR3_SMP19_Pos ) + +#define ADC_SMPR3_SMP18_Pos ( 8U ) +#define ADC_SMPR3_SMP18_Msk ( 0xfUL << ADC_SMPR3_SMP18_Pos ) +#define ADC_SMPR3_SMP18 ( ADC_SMPR3_SMP18_Msk ) +#define ADC_SMPR3_SMP18_0 ( 0x1UL << ADC_SMPR3_SMP18_Pos ) +#define ADC_SMPR3_SMP18_1 ( 0x2UL << ADC_SMPR3_SMP18_Pos ) +#define ADC_SMPR3_SMP18_2 ( 0x4UL << ADC_SMPR3_SMP18_Pos ) +#define ADC_SMPR3_SMP18_3 ( 0x8UL << ADC_SMPR3_SMP18_Pos ) + +#define ADC_SMPR3_SMP17_Pos ( 4U ) +#define ADC_SMPR3_SMP17_Msk ( 0xfUL << ADC_SMPR3_SMP17_Pos ) +#define ADC_SMPR3_SMP17 ( ADC_SMPR3_SMP17_Msk ) +#define ADC_SMPR3_SMP17_0 ( 0x1UL << ADC_SMPR3_SMP17_Pos ) +#define ADC_SMPR3_SMP17_1 ( 0x2UL << ADC_SMPR3_SMP17_Pos ) +#define ADC_SMPR3_SMP17_2 ( 0x4UL << ADC_SMPR3_SMP17_Pos ) +#define ADC_SMPR3_SMP17_3 ( 0x8UL << ADC_SMPR3_SMP17_Pos ) + +#define ADC_SMPR3_SMP16_Pos ( 0U ) +#define ADC_SMPR3_SMP16_Msk ( 0xfUL << ADC_SMPR3_SMP16_Pos ) +#define ADC_SMPR3_SMP16 ( ADC_SMPR3_SMP16_Msk ) +#define ADC_SMPR3_SMP16_0 ( 0x1UL << ADC_SMPR3_SMP16_Pos ) +#define ADC_SMPR3_SMP16_1 ( 0x2UL << ADC_SMPR3_SMP16_Pos ) +#define ADC_SMPR3_SMP16_2 ( 0x4UL << ADC_SMPR3_SMP16_Pos ) +#define ADC_SMPR3_SMP16_3 ( 0x8UL << ADC_SMPR3_SMP16_Pos ) + + +/*************** Bits definition for ADC_HTR **********************/ + +#define ADC_HTR_HT_Pos ( 0U ) +#define ADC_HTR_HT_Msk ( 0xfffUL << ADC_HTR_HT_Pos ) +#define ADC_HTR_HT ( ADC_HTR_HT_Msk ) + + +/*************** Bits definition for ADC_LTR **********************/ + +#define ADC_LTR_LT_Pos ( 0U ) +#define ADC_LTR_LT_Msk ( 0xfffUL << ADC_LTR_LT_Pos ) +#define ADC_LTR_LT ( ADC_LTR_LT_Msk ) + + +/*************** Bits definition for ADC_SQR1 **********************/ + +#define ADC_SQR1_SQ5_Pos ( 25U ) +#define ADC_SQR1_SQ5_Msk ( 0x1fUL << ADC_SQR1_SQ5_Pos ) +#define ADC_SQR1_SQ5 ( ADC_SQR1_SQ5_Msk ) +#define ADC_SQR1_SQ5_0 ( 0x1UL << ADC_SQR1_SQ5_Pos ) +#define ADC_SQR1_SQ5_1 ( 0x2UL << ADC_SQR1_SQ5_Pos ) +#define ADC_SQR1_SQ5_2 ( 0x4UL << ADC_SQR1_SQ5_Pos ) +#define ADC_SQR1_SQ5_3 ( 0x8UL << ADC_SQR1_SQ5_Pos ) +#define ADC_SQR1_SQ5_4 ( 0x10UL << ADC_SQR1_SQ5_Pos ) + +#define ADC_SQR1_SQ4_Pos ( 20U ) +#define ADC_SQR1_SQ4_Msk ( 0x1fUL << ADC_SQR1_SQ4_Pos ) +#define ADC_SQR1_SQ4 ( ADC_SQR1_SQ4_Msk ) +#define ADC_SQR1_SQ4_0 ( 0x1UL << ADC_SQR1_SQ4_Pos ) +#define ADC_SQR1_SQ4_1 ( 0x2UL << ADC_SQR1_SQ4_Pos ) +#define ADC_SQR1_SQ4_2 ( 0x4UL << ADC_SQR1_SQ4_Pos ) +#define ADC_SQR1_SQ4_3 ( 0x8UL << ADC_SQR1_SQ4_Pos ) +#define ADC_SQR1_SQ4_4 ( 0x10UL << ADC_SQR1_SQ4_Pos ) + +#define ADC_SQR1_SQ3_Pos ( 15U ) +#define ADC_SQR1_SQ3_Msk ( 0x1fUL << ADC_SQR1_SQ3_Pos ) +#define ADC_SQR1_SQ3 ( ADC_SQR1_SQ3_Msk ) +#define ADC_SQR1_SQ3_0 ( 0x1UL << ADC_SQR1_SQ3_Pos ) +#define ADC_SQR1_SQ3_1 ( 0x2UL << ADC_SQR1_SQ3_Pos ) +#define ADC_SQR1_SQ3_2 ( 0x4UL << ADC_SQR1_SQ3_Pos ) +#define ADC_SQR1_SQ3_3 ( 0x8UL << ADC_SQR1_SQ3_Pos ) +#define ADC_SQR1_SQ3_4 ( 0x10UL << ADC_SQR1_SQ3_Pos ) + +#define ADC_SQR1_SQ2_Pos ( 10U ) +#define ADC_SQR1_SQ2_Msk ( 0x1fUL << ADC_SQR1_SQ2_Pos ) +#define ADC_SQR1_SQ2 ( ADC_SQR1_SQ2_Msk ) +#define ADC_SQR1_SQ2_0 ( 0x1UL << ADC_SQR1_SQ2_Pos ) +#define ADC_SQR1_SQ2_1 ( 0x2UL << ADC_SQR1_SQ2_Pos ) +#define ADC_SQR1_SQ2_2 ( 0x4UL << ADC_SQR1_SQ2_Pos ) +#define ADC_SQR1_SQ2_3 ( 0x8UL << ADC_SQR1_SQ2_Pos ) +#define ADC_SQR1_SQ2_4 ( 0x10UL << ADC_SQR1_SQ2_Pos ) + +#define ADC_SQR1_SQ1_Pos ( 5U ) +#define ADC_SQR1_SQ1_Msk ( 0x1fUL << ADC_SQR1_SQ1_Pos ) +#define ADC_SQR1_SQ1 ( ADC_SQR1_SQ1_Msk ) +#define ADC_SQR1_SQ1_0 ( 0x1UL << ADC_SQR1_SQ1_Pos ) +#define ADC_SQR1_SQ1_1 ( 0x2UL << ADC_SQR1_SQ1_Pos ) +#define ADC_SQR1_SQ1_2 ( 0x4UL << ADC_SQR1_SQ1_Pos ) +#define ADC_SQR1_SQ1_3 ( 0x8UL << ADC_SQR1_SQ1_Pos ) +#define ADC_SQR1_SQ1_4 ( 0x10UL << ADC_SQR1_SQ1_Pos ) + +#define ADC_SQR1_L_Pos ( 0U ) +#define ADC_SQR1_L_Msk ( 0xfUL << ADC_SQR1_L_Pos ) +#define ADC_SQR1_L ( ADC_SQR1_L_Msk ) +#define ADC_SQR1_L_0 ( 0x1UL << ADC_SQR1_L_Pos ) +#define ADC_SQR1_L_1 ( 0x2UL << ADC_SQR1_L_Pos ) +#define ADC_SQR1_L_2 ( 0x4UL << ADC_SQR1_L_Pos ) +#define ADC_SQR1_L_3 ( 0x8UL << ADC_SQR1_L_Pos ) + + +/*************** Bits definition for ADC_SQR2 **********************/ + +#define ADC_SQR2_SQ11_Pos ( 25U ) +#define ADC_SQR2_SQ11_Msk ( 0x1fUL << ADC_SQR2_SQ11_Pos ) +#define ADC_SQR2_SQ11 ( ADC_SQR2_SQ11_Msk ) +#define ADC_SQR2_SQ11_0 ( 0x1UL << ADC_SQR2_SQ11_Pos ) +#define ADC_SQR2_SQ11_1 ( 0x2UL << ADC_SQR2_SQ11_Pos ) +#define ADC_SQR2_SQ11_2 ( 0x4UL << ADC_SQR2_SQ11_Pos ) +#define ADC_SQR2_SQ11_3 ( 0x8UL << ADC_SQR2_SQ11_Pos ) +#define ADC_SQR2_SQ11_4 ( 0x10UL << ADC_SQR2_SQ11_Pos ) + +#define ADC_SQR2_SQ10_Pos ( 20U ) +#define ADC_SQR2_SQ10_Msk ( 0x1fUL << ADC_SQR2_SQ10_Pos ) +#define ADC_SQR2_SQ10 ( ADC_SQR2_SQ10_Msk ) +#define ADC_SQR2_SQ10_0 ( 0x1UL << ADC_SQR2_SQ10_Pos ) +#define ADC_SQR2_SQ10_1 ( 0x2UL << ADC_SQR2_SQ10_Pos ) +#define ADC_SQR2_SQ10_2 ( 0x4UL << ADC_SQR2_SQ10_Pos ) +#define ADC_SQR2_SQ10_3 ( 0x8UL << ADC_SQR2_SQ10_Pos ) +#define ADC_SQR2_SQ10_4 ( 0x10UL << ADC_SQR2_SQ10_Pos ) + +#define ADC_SQR2_SQ9_Pos ( 15U ) +#define ADC_SQR2_SQ9_Msk ( 0x1fUL << ADC_SQR2_SQ9_Pos ) +#define ADC_SQR2_SQ9 ( ADC_SQR2_SQ9_Msk ) +#define ADC_SQR2_SQ9_0 ( 0x1UL << ADC_SQR2_SQ9_Pos ) +#define ADC_SQR2_SQ9_1 ( 0x2UL << ADC_SQR2_SQ9_Pos ) +#define ADC_SQR2_SQ9_2 ( 0x4UL << ADC_SQR2_SQ9_Pos ) +#define ADC_SQR2_SQ9_3 ( 0x8UL << ADC_SQR2_SQ9_Pos ) +#define ADC_SQR2_SQ9_4 ( 0x10UL << ADC_SQR2_SQ9_Pos ) + +#define ADC_SQR2_SQ8_Pos ( 10U ) +#define ADC_SQR2_SQ8_Msk ( 0x1fUL << ADC_SQR2_SQ8_Pos ) +#define ADC_SQR2_SQ8 ( ADC_SQR2_SQ8_Msk ) +#define ADC_SQR2_SQ8_0 ( 0x1UL << ADC_SQR2_SQ8_Pos ) +#define ADC_SQR2_SQ8_1 ( 0x2UL << ADC_SQR2_SQ8_Pos ) +#define ADC_SQR2_SQ8_2 ( 0x4UL << ADC_SQR2_SQ8_Pos ) +#define ADC_SQR2_SQ8_3 ( 0x8UL << ADC_SQR2_SQ8_Pos ) +#define ADC_SQR2_SQ8_4 ( 0x10UL << ADC_SQR2_SQ8_Pos ) + +#define ADC_SQR2_SQ7_Pos ( 5U ) +#define ADC_SQR2_SQ7_Msk ( 0x1fUL << ADC_SQR2_SQ7_Pos ) +#define ADC_SQR2_SQ7 ( ADC_SQR2_SQ7_Msk ) +#define ADC_SQR2_SQ7_0 ( 0x1UL << ADC_SQR2_SQ7_Pos ) +#define ADC_SQR2_SQ7_1 ( 0x2UL << ADC_SQR2_SQ7_Pos ) +#define ADC_SQR2_SQ7_2 ( 0x4UL << ADC_SQR2_SQ7_Pos ) +#define ADC_SQR2_SQ7_3 ( 0x8UL << ADC_SQR2_SQ7_Pos ) +#define ADC_SQR2_SQ7_4 ( 0x10UL << ADC_SQR2_SQ7_Pos ) + +#define ADC_SQR2_SQ6_Pos ( 0U ) +#define ADC_SQR2_SQ6_Msk ( 0x1fUL << ADC_SQR2_SQ6_Pos ) +#define ADC_SQR2_SQ6 ( ADC_SQR2_SQ6_Msk ) +#define ADC_SQR2_SQ6_0 ( 0x1UL << ADC_SQR2_SQ6_Pos ) +#define ADC_SQR2_SQ6_1 ( 0x2UL << ADC_SQR2_SQ6_Pos ) +#define ADC_SQR2_SQ6_2 ( 0x4UL << ADC_SQR2_SQ6_Pos ) +#define ADC_SQR2_SQ6_3 ( 0x8UL << ADC_SQR2_SQ6_Pos ) +#define ADC_SQR2_SQ6_4 ( 0x10UL << ADC_SQR2_SQ6_Pos ) + + +/*************** Bits definition for ADC_SQR3 **********************/ + +#define ADC_SQR3_SQ16_Pos ( 20U ) +#define ADC_SQR3_SQ16_Msk ( 0x1fUL << ADC_SQR3_SQ16_Pos ) +#define ADC_SQR3_SQ16 ( ADC_SQR3_SQ16_Msk ) +#define ADC_SQR3_SQ16_0 ( 0x1UL << ADC_SQR3_SQ16_Pos ) +#define ADC_SQR3_SQ16_1 ( 0x2UL << ADC_SQR3_SQ16_Pos ) +#define ADC_SQR3_SQ16_2 ( 0x4UL << ADC_SQR3_SQ16_Pos ) +#define ADC_SQR3_SQ16_3 ( 0x8UL << ADC_SQR3_SQ16_Pos ) +#define ADC_SQR3_SQ16_4 ( 0x10UL << ADC_SQR3_SQ16_Pos ) + +#define ADC_SQR3_SQ15_Pos ( 15U ) +#define ADC_SQR3_SQ15_Msk ( 0x1fUL << ADC_SQR3_SQ15_Pos ) +#define ADC_SQR3_SQ15 ( ADC_SQR3_SQ15_Msk ) +#define ADC_SQR3_SQ15_0 ( 0x1UL << ADC_SQR3_SQ15_Pos ) +#define ADC_SQR3_SQ15_1 ( 0x2UL << ADC_SQR3_SQ15_Pos ) +#define ADC_SQR3_SQ15_2 ( 0x4UL << ADC_SQR3_SQ15_Pos ) +#define ADC_SQR3_SQ15_3 ( 0x8UL << ADC_SQR3_SQ15_Pos ) +#define ADC_SQR3_SQ15_4 ( 0x10UL << ADC_SQR3_SQ15_Pos ) + +#define ADC_SQR3_SQ14_Pos ( 10U ) +#define ADC_SQR3_SQ14_Msk ( 0x1fUL << ADC_SQR3_SQ14_Pos ) +#define ADC_SQR3_SQ14 ( ADC_SQR3_SQ14_Msk ) +#define ADC_SQR3_SQ14_0 ( 0x1UL << ADC_SQR3_SQ14_Pos ) +#define ADC_SQR3_SQ14_1 ( 0x2UL << ADC_SQR3_SQ14_Pos ) +#define ADC_SQR3_SQ14_2 ( 0x4UL << ADC_SQR3_SQ14_Pos ) +#define ADC_SQR3_SQ14_3 ( 0x8UL << ADC_SQR3_SQ14_Pos ) +#define ADC_SQR3_SQ14_4 ( 0x10UL << ADC_SQR3_SQ14_Pos ) + +#define ADC_SQR3_SQ13_Pos ( 5U ) +#define ADC_SQR3_SQ13_Msk ( 0x1fUL << ADC_SQR3_SQ13_Pos ) +#define ADC_SQR3_SQ13 ( ADC_SQR3_SQ13_Msk ) +#define ADC_SQR3_SQ13_0 ( 0x1UL << ADC_SQR3_SQ13_Pos ) +#define ADC_SQR3_SQ13_1 ( 0x2UL << ADC_SQR3_SQ13_Pos ) +#define ADC_SQR3_SQ13_2 ( 0x4UL << ADC_SQR3_SQ13_Pos ) +#define ADC_SQR3_SQ13_3 ( 0x8UL << ADC_SQR3_SQ13_Pos ) +#define ADC_SQR3_SQ13_4 ( 0x10UL << ADC_SQR3_SQ13_Pos ) + +#define ADC_SQR3_SQ12_Pos ( 0U ) +#define ADC_SQR3_SQ12_Msk ( 0x1fUL << ADC_SQR3_SQ12_Pos ) +#define ADC_SQR3_SQ12 ( ADC_SQR3_SQ12_Msk ) +#define ADC_SQR3_SQ12_0 ( 0x1UL << ADC_SQR3_SQ12_Pos ) +#define ADC_SQR3_SQ12_1 ( 0x2UL << ADC_SQR3_SQ12_Pos ) +#define ADC_SQR3_SQ12_2 ( 0x4UL << ADC_SQR3_SQ12_Pos ) +#define ADC_SQR3_SQ12_3 ( 0x8UL << ADC_SQR3_SQ12_Pos ) +#define ADC_SQR3_SQ12_4 ( 0x10UL << ADC_SQR3_SQ12_Pos ) + + +/*************** Bits definition for ADC_JSQR **********************/ + +#define ADC_JSQR_JEXTSEL_Pos ( 27U ) +#define ADC_JSQR_JEXTSEL_Msk ( 0x1fUL << ADC_JSQR_JEXTSEL_Pos ) +#define ADC_JSQR_JEXTSEL ( ADC_JSQR_JEXTSEL_Msk ) +#define ADC_JSQR_JEXTSEL_0 ( 0x1UL << ADC_JSQR_JEXTSEL_Pos ) +#define ADC_JSQR_JEXTSEL_1 ( 0x2UL << ADC_JSQR_JEXTSEL_Pos ) +#define ADC_JSQR_JEXTSEL_2 ( 0x4UL << ADC_JSQR_JEXTSEL_Pos ) +#define ADC_JSQR_JEXTSEL_3 ( 0x8UL << ADC_JSQR_JEXTSEL_Pos ) +#define ADC_JSQR_JEXTSEL_4 ( 0x10UL << ADC_JSQR_JEXTSEL_Pos ) + +#define ADC_JSQR_JEXTEN_Pos ( 25U ) +#define ADC_JSQR_JEXTEN_Msk ( 0x3UL << ADC_JSQR_JEXTEN_Pos ) +#define ADC_JSQR_JEXTEN ( ADC_JSQR_JEXTEN_Msk ) +#define ADC_JSQR_JEXTEN_0 ( 0x1UL << ADC_JSQR_JEXTEN_Pos ) +#define ADC_JSQR_JEXTEN_1 ( 0x2UL << ADC_JSQR_JEXTEN_Pos ) + +#define ADC_JSQR_JSQ4_Pos ( 20U ) +#define ADC_JSQR_JSQ4_Msk ( 0x1fUL << ADC_JSQR_JSQ4_Pos ) +#define ADC_JSQR_JSQ4 ( ADC_JSQR_JSQ4_Msk ) +#define ADC_JSQR_JSQ4_0 ( 0x1UL << ADC_JSQR_JSQ4_Pos ) +#define ADC_JSQR_JSQ4_1 ( 0x2UL << ADC_JSQR_JSQ4_Pos ) +#define ADC_JSQR_JSQ4_2 ( 0x4UL << ADC_JSQR_JSQ4_Pos ) +#define ADC_JSQR_JSQ4_3 ( 0x8UL << ADC_JSQR_JSQ4_Pos ) +#define ADC_JSQR_JSQ4_4 ( 0x10UL << ADC_JSQR_JSQ4_Pos ) + +#define ADC_JSQR_JSQ3_Pos ( 15U ) +#define ADC_JSQR_JSQ3_Msk ( 0x1fUL << ADC_JSQR_JSQ3_Pos ) +#define ADC_JSQR_JSQ3 ( ADC_JSQR_JSQ3_Msk ) +#define ADC_JSQR_JSQ3_0 ( 0x1UL << ADC_JSQR_JSQ3_Pos ) +#define ADC_JSQR_JSQ3_1 ( 0x2UL << ADC_JSQR_JSQ3_Pos ) +#define ADC_JSQR_JSQ3_2 ( 0x4UL << ADC_JSQR_JSQ3_Pos ) +#define ADC_JSQR_JSQ3_3 ( 0x8UL << ADC_JSQR_JSQ3_Pos ) +#define ADC_JSQR_JSQ3_4 ( 0x10UL << ADC_JSQR_JSQ3_Pos ) + +#define ADC_JSQR_JSQ2_Pos ( 10U ) +#define ADC_JSQR_JSQ2_Msk ( 0x1fUL << ADC_JSQR_JSQ2_Pos ) +#define ADC_JSQR_JSQ2 ( ADC_JSQR_JSQ2_Msk ) +#define ADC_JSQR_JSQ2_0 ( 0x1UL << ADC_JSQR_JSQ2_Pos ) +#define ADC_JSQR_JSQ2_1 ( 0x2UL << ADC_JSQR_JSQ2_Pos ) +#define ADC_JSQR_JSQ2_2 ( 0x4UL << ADC_JSQR_JSQ2_Pos ) +#define ADC_JSQR_JSQ2_3 ( 0x8UL << ADC_JSQR_JSQ2_Pos ) +#define ADC_JSQR_JSQ2_4 ( 0x10UL << ADC_JSQR_JSQ2_Pos ) + +#define ADC_JSQR_JSQ1_Pos ( 5U ) +#define ADC_JSQR_JSQ1_Msk ( 0x1fUL << ADC_JSQR_JSQ1_Pos ) +#define ADC_JSQR_JSQ1 ( ADC_JSQR_JSQ1_Msk ) +#define ADC_JSQR_JSQ1_0 ( 0x1UL << ADC_JSQR_JSQ1_Pos ) +#define ADC_JSQR_JSQ1_1 ( 0x2UL << ADC_JSQR_JSQ1_Pos ) +#define ADC_JSQR_JSQ1_2 ( 0x4UL << ADC_JSQR_JSQ1_Pos ) +#define ADC_JSQR_JSQ1_3 ( 0x8UL << ADC_JSQR_JSQ1_Pos ) +#define ADC_JSQR_JSQ1_4 ( 0x10UL << ADC_JSQR_JSQ1_Pos ) + +#define ADC_JSQR_JL_Pos ( 0U ) +#define ADC_JSQR_JL_Msk ( 0x3UL << ADC_JSQR_JL_Pos ) +#define ADC_JSQR_JL ( ADC_JSQR_JL_Msk ) +#define ADC_JSQR_JL_0 ( 0x1UL << ADC_JSQR_JL_Pos ) +#define ADC_JSQR_JL_1 ( 0x2UL << ADC_JSQR_JL_Pos ) + + +/*************** Bits definition for ADC_JDRx **********************/ + +#define ADC_JDRX_JCH_Pos ( 16U ) +#define ADC_JDRX_JCH_Msk ( 0x1fUL << ADC_JDRX_JCH_Pos ) +#define ADC_JDRX_JCH ( ADC_JDRX_JCH_Msk ) +#define ADC_JDRX_JCH_0 ( 0x1UL << ADC_JDRX_JCH_Pos ) +#define ADC_JDRX_JCH_1 ( 0x2UL << ADC_JDRX_JCH_Pos ) +#define ADC_JDRX_JCH_2 ( 0x4UL << ADC_JDRX_JCH_Pos ) +#define ADC_JDRX_JCH_3 ( 0x8UL << ADC_JDRX_JCH_Pos ) +#define ADC_JDRX_JCH_4 ( 0x10UL << ADC_JDRX_JCH_Pos ) + +#define ADC_JDRX_JDATA_Pos ( 0U ) +#define ADC_JDRX_JDATA_Msk ( 0xffffUL << ADC_JDRX_JDATA_Pos ) +#define ADC_JDRX_JDATA ( ADC_JDRX_JDATA_Msk ) + + +/*************** Bits definition for ADC_DR **********************/ + +#define ADC_DR_CH_Pos ( 16U ) +#define ADC_DR_CH_Msk ( 0x1fUL << ADC_DR_CH_Pos ) +#define ADC_DR_CH ( ADC_DR_CH_Msk ) +#define ADC_DR_CH_0 ( 0x1UL << ADC_DR_CH_Pos ) +#define ADC_DR_CH_1 ( 0x2UL << ADC_DR_CH_Pos ) +#define ADC_DR_CH_2 ( 0x4UL << ADC_DR_CH_Pos ) +#define ADC_DR_CH_3 ( 0x8UL << ADC_DR_CH_Pos ) +#define ADC_DR_CH_4 ( 0x10UL << ADC_DR_CH_Pos ) + +#define ADC_DR_DATA_Pos ( 0U ) +#define ADC_DR_DATA_Msk ( 0xffffUL << ADC_DR_DATA_Pos ) +#define ADC_DR_DATA ( ADC_DR_DATA_Msk ) + + +/*************** Bits definition for ADC_DIFSEL **********************/ + +#define ADC_DIFSEL_DIFSEL_Pos ( 0U ) +#define ADC_DIFSEL_DIFSEL_Msk ( 0x7ffffUL << ADC_DIFSEL_DIFSEL_Pos ) +#define ADC_DIFSEL_DIFSEL ( ADC_DIFSEL_DIFSEL_Msk ) + + +/*************** Bits definition for ADC_OFRx **********************/ + +#define ADC_OFRX_OFFSETY_EN_Pos ( 31U ) +#define ADC_OFRX_OFFSETY_EN_Msk ( 0x1UL << ADC_OFRX_OFFSETY_EN_Pos ) +#define ADC_OFRX_OFFSETY_EN ( ADC_OFRX_OFFSETY_EN_Msk ) + +#define ADC_OFRX_OFFSETY_CH_Pos ( 26U ) +#define ADC_OFRX_OFFSETY_CH_Msk ( 0x1fUL << ADC_OFRX_OFFSETY_CH_Pos ) +#define ADC_OFRX_OFFSETY_CH ( ADC_OFRX_OFFSETY_CH_Msk ) +#define ADC_OFRX_OFFSETY_CH_0 ( 0x1UL << ADC_OFRX_OFFSETY_CH_Pos ) +#define ADC_OFRX_OFFSETY_CH_1 ( 0x2UL << ADC_OFRX_OFFSETY_CH_Pos ) +#define ADC_OFRX_OFFSETY_CH_2 ( 0x4UL << ADC_OFRX_OFFSETY_CH_Pos ) +#define ADC_OFRX_OFFSETY_CH_3 ( 0x8UL << ADC_OFRX_OFFSETY_CH_Pos ) +#define ADC_OFRX_OFFSETY_CH_4 ( 0x10UL << ADC_OFRX_OFFSETY_CH_Pos ) + +#define ADC_OFRX_OFFSETY_SAT_Pos ( 25U ) +#define ADC_OFRX_OFFSETY_SAT_Msk ( 0x1UL << ADC_OFRX_OFFSETY_SAT_Pos ) +#define ADC_OFRX_OFFSETY_SAT ( ADC_OFRX_OFFSETY_SAT_Msk ) + +#define ADC_OFRX_OFFSETY_POS_Pos ( 24U ) +#define ADC_OFRX_OFFSETY_POS_Msk ( 0x1UL << ADC_OFRX_OFFSETY_POS_Pos ) +#define ADC_OFRX_OFFSETY_POS ( ADC_OFRX_OFFSETY_POS_Msk ) + +#define ADC_OFRX_OFFSETY_Pos ( 0U ) +#define ADC_OFRX_OFFSETY_Msk ( 0xfffUL << ADC_OFRX_OFFSETY_Pos ) +#define ADC_OFRX_OFFSETY ( ADC_OFRX_OFFSETY_Msk ) + + +/*************** Bits definition for ADC_CALFACT **********************/ + +#define ADC_CALFACT_CALFACT_D_Pos ( 16U ) +#define ADC_CALFACT_CALFACT_D_Msk ( 0x7fUL << ADC_CALFACT_CALFACT_D_Pos ) +#define ADC_CALFACT_CALFACT_D ( ADC_CALFACT_CALFACT_D_Msk ) +#define ADC_CALFACT_CALFACT_D_0 ( 0x1UL << ADC_CALFACT_CALFACT_D_Pos ) +#define ADC_CALFACT_CALFACT_D_1 ( 0x2UL << ADC_CALFACT_CALFACT_D_Pos ) +#define ADC_CALFACT_CALFACT_D_2 ( 0x4UL << ADC_CALFACT_CALFACT_D_Pos ) +#define ADC_CALFACT_CALFACT_D_3 ( 0x8UL << ADC_CALFACT_CALFACT_D_Pos ) +#define ADC_CALFACT_CALFACT_D_4 ( 0x10UL << ADC_CALFACT_CALFACT_D_Pos ) +#define ADC_CALFACT_CALFACT_D_5 ( 0x20UL << ADC_CALFACT_CALFACT_D_Pos ) +#define ADC_CALFACT_CALFACT_D_6 ( 0x40UL << ADC_CALFACT_CALFACT_D_Pos ) + +#define ADC_CALFACT_CALFACT_S_Pos ( 0U ) +#define ADC_CALFACT_CALFACT_S_Msk ( 0x7fUL << ADC_CALFACT_CALFACT_S_Pos ) +#define ADC_CALFACT_CALFACT_S ( ADC_CALFACT_CALFACT_S_Msk ) +#define ADC_CALFACT_CALFACT_S_0 ( 0x1UL << ADC_CALFACT_CALFACT_S_Pos ) +#define ADC_CALFACT_CALFACT_S_1 ( 0x2UL << ADC_CALFACT_CALFACT_S_Pos ) +#define ADC_CALFACT_CALFACT_S_2 ( 0x4UL << ADC_CALFACT_CALFACT_S_Pos ) +#define ADC_CALFACT_CALFACT_S_3 ( 0x8UL << ADC_CALFACT_CALFACT_S_Pos ) +#define ADC_CALFACT_CALFACT_S_4 ( 0x10UL << ADC_CALFACT_CALFACT_S_Pos ) +#define ADC_CALFACT_CALFACT_S_5 ( 0x20UL << ADC_CALFACT_CALFACT_S_Pos ) +#define ADC_CALFACT_CALFACT_S_6 ( 0x40UL << ADC_CALFACT_CALFACT_S_Pos ) + + +/*************** Bits definition for ADC_CSR **********************/ + +#define ADC_CSR_AWD_SLV_Pos ( 23U ) +#define ADC_CSR_AWD_SLV_Msk ( 0x1UL << ADC_CSR_AWD_SLV_Pos ) +#define ADC_CSR_AWD_SLV ( ADC_CSR_AWD_SLV_Msk ) + +#define ADC_CSR_JEOG_SLV_Pos ( 22U ) +#define ADC_CSR_JEOG_SLV_Msk ( 0x1UL << ADC_CSR_JEOG_SLV_Pos ) +#define ADC_CSR_JEOG_SLV ( ADC_CSR_JEOG_SLV_Msk ) + +#define ADC_CSR_JEOC_SLV_Pos ( 21U ) +#define ADC_CSR_JEOC_SLV_Msk ( 0x1UL << ADC_CSR_JEOC_SLV_Pos ) +#define ADC_CSR_JEOC_SLV ( ADC_CSR_JEOC_SLV_Msk ) + +#define ADC_CSR_OVERF_SLV_Pos ( 20U ) +#define ADC_CSR_OVERF_SLV_Msk ( 0x1UL << ADC_CSR_OVERF_SLV_Pos ) +#define ADC_CSR_OVERF_SLV ( ADC_CSR_OVERF_SLV_Msk ) + +#define ADC_CSR_EOG_SLV_Pos ( 19U ) +#define ADC_CSR_EOG_SLV_Msk ( 0x1UL << ADC_CSR_EOG_SLV_Pos ) +#define ADC_CSR_EOG_SLV ( ADC_CSR_EOG_SLV_Msk ) + +#define ADC_CSR_EOC_SLV_Pos ( 18U ) +#define ADC_CSR_EOC_SLV_Msk ( 0x1UL << ADC_CSR_EOC_SLV_Pos ) +#define ADC_CSR_EOC_SLV ( ADC_CSR_EOC_SLV_Msk ) + +#define ADC_CSR_EOSMP_SLV_Pos ( 17U ) +#define ADC_CSR_EOSMP_SLV_Msk ( 0x1UL << ADC_CSR_EOSMP_SLV_Pos ) +#define ADC_CSR_EOSMP_SLV ( ADC_CSR_EOSMP_SLV_Msk ) + +#define ADC_CSR_ADRDY_SLV_Pos ( 16U ) +#define ADC_CSR_ADRDY_SLV_Msk ( 0x1UL << ADC_CSR_ADRDY_SLV_Pos ) +#define ADC_CSR_ADRDY_SLV ( ADC_CSR_ADRDY_SLV_Msk ) + +#define ADC_CSR_AWD_MST_Pos ( 7U ) +#define ADC_CSR_AWD_MST_Msk ( 0x1UL << ADC_CSR_AWD_MST_Pos ) +#define ADC_CSR_AWD_MST ( ADC_CSR_AWD_MST_Msk ) + +#define ADC_CSR_JEOG_MST_Pos ( 6U ) +#define ADC_CSR_JEOG_MST_Msk ( 0x1UL << ADC_CSR_JEOG_MST_Pos ) +#define ADC_CSR_JEOG_MST ( ADC_CSR_JEOG_MST_Msk ) + +#define ADC_CSR_JEOC_MST_Pos ( 5U ) +#define ADC_CSR_JEOC_MST_Msk ( 0x1UL << ADC_CSR_JEOC_MST_Pos ) +#define ADC_CSR_JEOC_MST ( ADC_CSR_JEOC_MST_Msk ) + +#define ADC_CSR_OVERF_MST_Pos ( 4U ) +#define ADC_CSR_OVERF_MST_Msk ( 0x1UL << ADC_CSR_OVERF_MST_Pos ) +#define ADC_CSR_OVERF_MST ( ADC_CSR_OVERF_MST_Msk ) + +#define ADC_CSR_EOG_MST_Pos ( 3U ) +#define ADC_CSR_EOG_MST_Msk ( 0x1UL << ADC_CSR_EOG_MST_Pos ) +#define ADC_CSR_EOG_MST ( ADC_CSR_EOG_MST_Msk ) + +#define ADC_CSR_EOC_MST_Pos ( 2U ) +#define ADC_CSR_EOC_MST_Msk ( 0x1UL << ADC_CSR_EOC_MST_Pos ) +#define ADC_CSR_EOC_MST ( ADC_CSR_EOC_MST_Msk ) + +#define ADC_CSR_EOSMP_MST_Pos ( 1U ) +#define ADC_CSR_EOSMP_MST_Msk ( 0x1UL << ADC_CSR_EOSMP_MST_Pos ) +#define ADC_CSR_EOSMP_MST ( ADC_CSR_EOSMP_MST_Msk ) + +#define ADC_CSR_ADRDY_MST_Pos ( 0U ) +#define ADC_CSR_ADRDY_MST_Msk ( 0x1UL << ADC_CSR_ADRDY_MST_Pos ) +#define ADC_CSR_ADRDY_MST ( ADC_CSR_ADRDY_MST_Msk ) + + +/*************** Bits definition for ADC_CCR **********************/ + +#define ADC_CCR_VBATEN_Pos ( 24U ) +#define ADC_CCR_VBATEN_Msk ( 0x01UL << ADC_CCR_VBATEN_Pos ) +#define ADC_CCR_VBATEN ( ADC_CCR_VBATEN_Msk ) + +#define ADC_CCR_VREFINTEN_Pos ( 23U ) +#define ADC_CCR_VREFINTEN_Msk ( 0x01UL << ADC_CCR_VREFINTEN_Pos ) +#define ADC_CCR_VREFINTEN ( ADC_CCR_VREFINTEN_Msk ) + +#define ADC_CCR_TSEN_Pos ( 22U ) +#define ADC_CCR_TSEN_Msk ( 0x01UL << ADC_CCR_TSEN_Pos ) +#define ADC_CCR_TSEN ( ADC_CCR_TSEN_Msk ) + +#define ADC_CCR_ADCDIV_Pos ( 16U ) +#define ADC_CCR_ADCDIV_Msk ( 0x3fUL << ADC_CCR_ADCDIV_Pos ) +#define ADC_CCR_ADCDIV ( ADC_CCR_ADCDIV_Msk ) +#define ADC_CCR_ADCDIV_0 ( 0x1UL << ADC_CCR_ADCDIV_Pos ) +#define ADC_CCR_ADCDIV_1 ( 0x2UL << ADC_CCR_ADCDIV_Pos ) +#define ADC_CCR_ADCDIV_2 ( 0x4UL << ADC_CCR_ADCDIV_Pos ) +#define ADC_CCR_ADCDIV_3 ( 0x8UL << ADC_CCR_ADCDIV_Pos ) +#define ADC_CCR_ADCDIV_4 ( 0x10UL << ADC_CCR_ADCDIV_Pos ) +#define ADC_CCR_ADCDIV_5 ( 0x20UL << ADC_CCR_ADCDIV_Pos ) + +#define ADC_CCR_DMADUAL_Pos ( 14U ) +#define ADC_CCR_DMADUAL_Msk ( 0x3UL << ADC_CCR_DMADUAL_Pos ) +#define ADC_CCR_DMADUAL ( ADC_CCR_DMADUAL_Msk ) +#define ADC_CCR_DMADUAL_0 ( 0x1UL << ADC_CCR_DMADUAL_Pos ) +#define ADC_CCR_DMADUAL_1 ( 0x2UL << ADC_CCR_DMADUAL_Pos ) + +#define ADC_CCR_CLKMODE_Pos ( 13U ) +#define ADC_CCR_CLKMODE_Msk ( 0x1UL << ADC_CCR_CLKMODE_Pos ) +#define ADC_CCR_CLKMODE ( ADC_CCR_CLKMODE_Msk ) + +#define ADC_CCR_DELAY_Pos ( 8U ) +#define ADC_CCR_DELAY_Msk ( 0xfUL << ADC_CCR_DELAY_Pos ) +#define ADC_CCR_DELAY ( ADC_CCR_DELAY_Msk ) +#define ADC_CCR_DELAY_0 ( 0x1UL << ADC_CCR_DELAY_Pos ) +#define ADC_CCR_DELAY_1 ( 0x2UL << ADC_CCR_DELAY_Pos ) +#define ADC_CCR_DELAY_2 ( 0x4UL << ADC_CCR_DELAY_Pos ) +#define ADC_CCR_DELAY_3 ( 0x8UL << ADC_CCR_DELAY_Pos ) + +#define ADC_CCR_DUALMOD_Pos ( 0U ) +#define ADC_CCR_DUALMOD_Msk ( 0x1fUL << ADC_CCR_DUALMOD_Pos ) +#define ADC_CCR_DUALMOD ( ADC_CCR_DUALMOD_Msk ) +#define ADC_CCR_DUALMOD_0 ( 0x1UL << ADC_CCR_DUALMOD_Pos ) +#define ADC_CCR_DUALMOD_1 ( 0x2UL << ADC_CCR_DUALMOD_Pos ) +#define ADC_CCR_DUALMOD_2 ( 0x4UL << ADC_CCR_DUALMOD_Pos ) +#define ADC_CCR_DUALMOD_3 ( 0x8UL << ADC_CCR_DUALMOD_Pos ) +#define ADC_CCR_DUALMOD_4 ( 0x10UL << ADC_CCR_DUALMOD_Pos ) + + +/*************** Bits definition for ADC_CDR **********************/ + +#define ADC_CDR_DATA2_Pos ( 16U ) +#define ADC_CDR_DATA2_Msk ( 0xffffUL << ADC_CDR_DATA2_Pos ) +#define ADC_CDR_DATA2 ( ADC_CDR_DATA2_Msk ) + +#define ADC_CDR_DATA1_Pos ( 0U ) +#define ADC_CDR_DATA1_Msk ( 0xffffUL << ADC_CDR_DATA1_Pos ) +#define ADC_CDR_DATA1 ( ADC_CDR_DATA1_Msk ) + + +/*************** Bits definition for ADC_CVRB **********************/ + +#define ADC_CVRB_VRBTRIM_Pos ( 4U ) +#define ADC_CVRB_VRBTRIM_Msk ( 0x1fUL << ADC_CVRB_VRBTRIM_Pos ) +#define ADC_CVRB_VRBTRIM ( ADC_CVRB_VRBTRIM_Msk ) +#define ADC_CVRB_VRBTRIM_0 ( 0x1UL << ADC_CVRB_VRBTRIM_Pos ) +#define ADC_CVRB_VRBTRIM_1 ( 0x2UL << ADC_CVRB_VRBTRIM_Pos ) +#define ADC_CVRB_VRBTRIM_2 ( 0x4UL << ADC_CVRB_VRBTRIM_Pos ) +#define ADC_CVRB_VRBTRIM_3 ( 0x8UL << ADC_CVRB_VRBTRIM_Pos ) +#define ADC_CVRB_VRBTRIM_4 ( 0x10UL << ADC_CVRB_VRBTRIM_Pos ) + +#define ADC_CVRB_VRS_Pos ( 2U ) +#define ADC_CVRB_VRS_Msk ( 0x3UL << ADC_CVRB_VRS_Pos ) +#define ADC_CVRB_VRS ( ADC_CVRB_VRS_Msk ) +#define ADC_CVRB_VRS_0 ( 0x1UL << ADC_CVRB_VRS_Pos ) +#define ADC_CVRB_VRS_1 ( 0x2UL << ADC_CVRB_VRS_Pos ) + +#define ADC_CVRB_HIZ_Pos ( 1U ) +#define ADC_CVRB_HIZ_Msk ( 0x1UL << ADC_CVRB_HIZ_Pos ) +#define ADC_CVRB_HIZ ( ADC_CVRB_HIZ_Msk ) + +#define ADC_CVRB_ENVR_Pos ( 0U ) +#define ADC_CVRB_ENVR_Msk ( 0x1UL << ADC_CVRB_ENVR_Pos ) +#define ADC_CVRB_ENVR ( ADC_CVRB_ENVR_Msk ) + + +/*************** Bits definition for DAC_CR register ***********************/ + +#define DAC_CR_CEN2_Pos ( 30U ) +#define DAC_CR_CEN2_Msk ( 0x1UL << DAC_CR_CEN2_Pos ) +#define DAC_CR_CEN2 ( DAC_CR_CEN2_Msk ) + +#define DAC_CR_DMAUDIE2_Pos ( 29U ) +#define DAC_CR_DMAUDIE2_Msk ( 0x1UL << DAC_CR_DMAUDIE2_Pos ) +#define DAC_CR_DMAUDIE2 ( DAC_CR_DMAUDIE2_Msk ) + +#define DAC_CR_DMAEN2_Pos ( 28U ) +#define DAC_CR_DMAEN2_Msk ( 0x1UL << DAC_CR_DMAEN2_Pos ) +#define DAC_CR_DMAEN2 ( DAC_CR_DMAEN2_Msk ) + +#define DAC_CR_MAMP2_Pos ( 24U ) +#define DAC_CR_MAMP2_Msk ( 0xFUL << DAC_CR_MAMP2_Pos ) +#define DAC_CR_MAMP2 ( DAC_CR_MAMP2_Msk ) +#define DAC_CR_MAMP2_0 ( 0x1UL << DAC_CR_MAMP2_Pos ) +#define DAC_CR_MAMP2_1 ( 0x2UL << DAC_CR_MAMP2_Pos ) +#define DAC_CR_MAMP2_2 ( 0x4UL << DAC_CR_MAMP2_Pos ) +#define DAC_CR_MAMP2_3 ( 0x8UL << DAC_CR_MAMP2_Pos ) + +#define DAC_CR_WAVE2_Pos ( 22U ) +#define DAC_CR_WAVE2_Msk ( 0x3UL << DAC_CR_WAVE2_Pos ) +#define DAC_CR_WAVE2 ( DAC_CR_WAVE2_Msk ) +#define DAC_CR_WAVE2_0 ( 0x1UL << DAC_CR_WAVE2_Pos ) +#define DAC_CR_WAVE2_1 ( 0x2UL << DAC_CR_WAVE2_Pos ) + +#define DAC_CR_TSEL2_Pos ( 18U ) +#define DAC_CR_TSEL2_Msk ( 0xFUL << DAC_CR_TSEL2_Pos ) +#define DAC_CR_TSEL2 ( DAC_CR_TSEL2_Msk ) +#define DAC_CR_TSEL2_0 ( 0x1UL << DAC_CR_TSEL2_Pos ) +#define DAC_CR_TSEL2_1 ( 0x2UL << DAC_CR_TSEL2_Pos ) +#define DAC_CR_TSEL2_2 ( 0x4UL << DAC_CR_TSEL2_Pos ) +#define DAC_CR_TSEL2_3 ( 0x8UL << DAC_CR_TSEL2_Pos ) + +#define DAC_CR_TEN2_Pos ( 17U ) +#define DAC_CR_TEN2_Msk ( 0x1UL << DAC_CR_TEN2_Pos ) +#define DAC_CR_TEN2 ( DAC_CR_TEN2_Msk ) + +#define DAC_CR_EN2_Pos ( 16U ) +#define DAC_CR_EN2_Msk ( 0x1UL << DAC_CR_EN2_Pos ) +#define DAC_CR_EN2 ( DAC_CR_EN2_Msk ) + +#define DAC_CR_CEN1_Pos ( 14U ) +#define DAC_CR_CEN1_Msk ( 0x1UL << DAC_CR_CEN1_Pos ) +#define DAC_CR_CEN1 ( DAC_CR_CEN1_Msk ) + +#define DAC_CR_DMAUDIE1_Pos ( 13U ) +#define DAC_CR_DMAUDIE1_Msk ( 0x1UL << DAC_CR_DMAUDIE1_Pos ) +#define DAC_CR_DMAUDIE1 ( DAC_CR_DMAUDIE1_Msk ) + +#define DAC_CR_DMAEN1_Pos ( 12U ) +#define DAC_CR_DMAEN1_Msk ( 0x1UL << DAC_CR_DMAEN1_Pos ) +#define DAC_CR_DMAEN1 ( DAC_CR_DMAEN1_Msk ) + +#define DAC_CR_MAMP1_Pos ( 8U ) +#define DAC_CR_MAMP1_Msk ( 0xFUL << DAC_CR_MAMP1_Pos ) +#define DAC_CR_MAMP1 ( DAC_CR_MAMP1_Msk ) +#define DAC_CR_MAMP1_0 ( 0x1UL << DAC_CR_MAMP1_Pos ) +#define DAC_CR_MAMP1_1 ( 0x2UL << DAC_CR_MAMP1_Pos ) +#define DAC_CR_MAMP1_2 ( 0x4UL << DAC_CR_MAMP1_Pos ) +#define DAC_CR_MAMP1_3 ( 0x8UL << DAC_CR_MAMP1_Pos ) + +#define DAC_CR_WAVE1_Pos ( 6U ) +#define DAC_CR_WAVE1_Msk ( 0x3UL << DAC_CR_WAVE1_Pos ) +#define DAC_CR_WAVE1 ( DAC_CR_WAVE1_Msk ) +#define DAC_CR_WAVE1_0 ( 0x1UL << DAC_CR_WAVE1_Pos ) +#define DAC_CR_WAVE1_1 ( 0x2UL << DAC_CR_WAVE1_Pos ) + +#define DAC_CR_TSEL1_Pos ( 2U ) +#define DAC_CR_TSEL1_Msk ( 0xFUL << DAC_CR_TSEL1_Pos ) +#define DAC_CR_TSEL1 ( DAC_CR_TSEL1_Msk ) +#define DAC_CR_TSEL1_0 ( 0x1UL << DAC_CR_TSEL1_Pos ) +#define DAC_CR_TSEL1_1 ( 0x2UL << DAC_CR_TSEL1_Pos ) +#define DAC_CR_TSEL1_2 ( 0x4UL << DAC_CR_TSEL1_Pos ) +#define DAC_CR_TSEL1_3 ( 0x8UL << DAC_CR_TSEL1_Pos ) + +#define DAC_CR_TEN1_Pos ( 1U ) +#define DAC_CR_TEN1_Msk ( 0x1UL << DAC_CR_TEN1_Pos ) +#define DAC_CR_TEN1 ( DAC_CR_TEN1_Msk ) + +#define DAC_CR_EN1_Pos ( 0U ) +#define DAC_CR_EN1_Msk ( 0x1UL << DAC_CR_EN1_Pos ) +#define DAC_CR_EN1 ( DAC_CR_EN1_Msk ) + +/*************** Bits definition for DAC_SWTRIGR register ******************/ + +#define DAC_SWTRIGR_SWTRIGB2_Pos ( 17U ) +#define DAC_SWTRIGR_SWTRIGB2_Msk ( 0x1UL << DAC_SWTRIGR_SWTRIGB2_Pos ) +#define DAC_SWTRIGR_SWTRIGB2 ( DAC_SWTRIGR_SWTRIGB2_Msk ) + +#define DAC_SWTRIGR_SWTRIGB1_Pos ( 16U ) +#define DAC_SWTRIGR_SWTRIGB1_Msk ( 0x1UL << DAC_SWTRIGR_SWTRIGB1_Pos ) +#define DAC_SWTRIGR_SWTRIGB1 ( DAC_SWTRIGR_SWTRIGB1_Msk ) + +#define DAC_SWTRIGR_SWTRIG2_Pos ( 1U ) +#define DAC_SWTRIGR_SWTRIG2_Msk ( 0x1UL << DAC_SWTRIGR_SWTRIG2_Pos ) +#define DAC_SWTRIGR_SWTRIG2 ( DAC_SWTRIGR_SWTRIG2_Msk ) + +#define DAC_SWTRIGR_SWTRIG1_Pos ( 0U ) +#define DAC_SWTRIGR_SWTRIG1_Msk ( 0x1UL << DAC_SWTRIGR_SWTRIG1_Pos ) +#define DAC_SWTRIGR_SWTRIG1 ( DAC_SWTRIGR_SWTRIG1_Msk ) + + +/*************** Bits definition for DAC_DHR12R1 register ******************/ + +#define DAC_DHR12R1_DACC1DHRB_Pos ( 16U ) +#define DAC_DHR12R1_DACC1DHRB_Msk ( 0xFFFUL << DAC_DHR12R1_DACC1DHRB_Pos ) +#define DAC_DHR12R1_DACC1DHRB ( DAC_DHR12R1_DACC1DHRB_Msk ) + +#define DAC_DHR12R1_DACC1DHR_Pos ( 0U ) +#define DAC_DHR12R1_DACC1DHR_Msk ( 0xFFFUL << DAC_DHR12R1_DACC1DHR_Pos ) +#define DAC_DHR12R1_DACC1DHR ( DAC_DHR12R1_DACC1DHR_Msk ) + + +/*************** Bits definition for DAC_DHR12L1 register ******************/ + +#define DAC_DHR12L1_DACC1DHRB_Pos ( 20U ) +#define DAC_DHR12L1_DACC1DHRB_Msk ( 0xFFFUL << DAC_DHR12L1_DACC1DHRB_Pos ) +#define DAC_DHR12L1_DACC1DHRB ( DAC_DHR12L1_DACC1DHRB_Msk ) + +#define DAC_DHR12L1_DACC1DHR_Pos ( 4U ) +#define DAC_DHR12L1_DACC1DHR_Msk ( 0xFFFUL << DAC_DHR12L1_DACC1DHR_Pos ) +#define DAC_DHR12L1_DACC1DHR ( DAC_DHR12L1_DACC1DHR_Msk ) + + +/*************** Bits definition for DAC_DHR8R1 register *******************/ + +#define DAC_DHR8R1_DACC1DHRB_Pos ( 8U ) +#define DAC_DHR8R1_DACC1DHRB_Msk ( 0xFFUL << DAC_DHR8R1_DACC1DHRB_Pos ) +#define DAC_DHR8R1_DACC1DHRB ( DAC_DHR8R1_DACC1DHRB_Msk ) + +#define DAC_DHR8R1_DACC1DHR_Pos ( 0U ) +#define DAC_DHR8R1_DACC1DHR_Msk ( 0xFFUL << DAC_DHR8R1_DACC1DHR_Pos ) +#define DAC_DHR8R1_DACC1DHR ( DAC_DHR8R1_DACC1DHR_Msk ) + + +/*************** Bits definition for DAC_DHR12R2 register ******************/ + +#define DAC_DHR12R2_DACC2DHRB_Pos ( 16U ) +#define DAC_DHR12R2_DACC2DHRB_Msk ( 0xFFFUL << DAC_DHR12R2_DACC2DHRB_Pos ) +#define DAC_DHR12R2_DACC2DHRB ( DAC_DHR12R2_DACC2DHRB_Msk ) + +#define DAC_DHR12R2_DACC2DHR_Pos ( 0U ) +#define DAC_DHR12R2_DACC2DHR_Msk ( 0xFFFUL << DAC_DHR12R2_DACC2DHR_Pos ) +#define DAC_DHR12R2_DACC2DHR ( DAC_DHR12R2_DACC2DHR_Msk ) + + +/*************** Bits definition for DAC_DHR12L2 register ******************/ + +#define DAC_DHR12L2_DACC2DHRB_Pos ( 20U ) +#define DAC_DHR12L2_DACC2DHRB_Msk ( 0xFFFUL << DAC_DHR12L2_DACC2DHRB_Pos ) +#define DAC_DHR12L2_DACC2DHRB ( DAC_DHR12L2_DACC2DHRB_Msk ) + +#define DAC_DHR12L2_DACC2DHR_Pos ( 4U ) +#define DAC_DHR12L2_DACC2DHR_Msk ( 0xFFFUL << DAC_DHR12L2_DACC2DHR_Pos ) +#define DAC_DHR12L2_DACC2DHR ( DAC_DHR12L2_DACC2DHR_Msk ) + + +/*************** Bits definition for DAC_DHR8R2 register *******************/ + +#define DAC_DHR8R2_DACC2DHRB_Pos ( 8U ) +#define DAC_DHR8R2_DACC2DHRB_Msk ( 0xFFUL << DAC_DHR8R2_DACC2DHRB_Pos ) +#define DAC_DHR8R2_DACC2DHRB ( DAC_DHR8R2_DACC2DHRB_Msk ) + +#define DAC_DHR8R2_DACC2DHR_Pos ( 0U ) +#define DAC_DHR8R2_DACC2DHR_Msk ( 0xFFUL << DAC_DHR8R2_DACC2DHR_Pos ) +#define DAC_DHR8R2_DACC2DHR ( DAC_DHR8R2_DACC2DHR_Msk ) + + +/*************** Bits definition for DAC_DHR12RD register ******************/ + +#define DAC_DHR12RD_DACC2DHR_Pos ( 16U ) +#define DAC_DHR12RD_DACC2DHR_Msk ( 0xFFFUL << DAC_DHR12RD_DACC2DHR_Pos ) +#define DAC_DHR12RD_DACC2DHR ( DAC_DHR12RD_DACC2DHR_Msk ) + +#define DAC_DHR12RD_DACC1DHR_Pos ( 0U ) +#define DAC_DHR12RD_DACC1DHR_Msk ( 0xFFFUL << DAC_DHR12RD_DACC1DHR_Pos ) +#define DAC_DHR12RD_DACC1DHR ( DAC_DHR12RD_DACC1DHR_Msk ) + + +/*************** Bits definition for DAC_DHR12LD register ******************/ + +#define DAC_DHR12LD_DACC2DHR_Pos ( 20U ) +#define DAC_DHR12LD_DACC2DHR_Msk ( 0xFFFUL << DAC_DHR12LD_DACC2DHR_Pos ) +#define DAC_DHR12LD_DACC2DHR ( DAC_DHR12LD_DACC2DHR_Msk ) + +#define DAC_DHR12LD_DACC1DHR_Pos ( 4U ) +#define DAC_DHR12LD_DACC1DHR_Msk ( 0xFFFUL << DAC_DHR12LD_DACC1DHR_Pos ) +#define DAC_DHR12LD_DACC1DHR ( DAC_DHR12LD_DACC1DHR_Msk ) + + +/*************** Bits definition for DAC_DHR8RD register *******************/ + +#define DAC_DHR8RD_DACC2DHR_Pos ( 16U ) +#define DAC_DHR8RD_DACC2DHR_Msk ( 0xFFUL << DAC_DHR8RD_DACC2DHR_Pos ) +#define DAC_DHR8RD_DACC2DHR ( DAC_DHR8RD_DACC2DHR_Msk ) + +#define DAC_DHR8RD_DACC1DHR_Pos ( 0U ) +#define DAC_DHR8RD_DACC1DHR_Msk ( 0xFFUL << DAC_DHR8RD_DACC1DHR_Pos ) +#define DAC_DHR8RD_DACC1DHR ( DAC_DHR8RD_DACC1DHR_Msk ) + + +/*************** Bits definition for DAC_DOR1 register *********************/ + +#define DAC_DOR1_DACC1DORB_Pos ( 16U ) +#define DAC_DOR1_DACC1DORB_Msk ( 0xFFFUL << DAC_DOR1_DACC1DORB_Pos ) +#define DAC_DOR1_DACC1DORB ( DAC_DOR1_DACC1DORB_Msk ) + +#define DAC_DOR1_DACC1DOR_Pos ( 0U ) +#define DAC_DOR1_DACC1DOR_Msk ( 0xFFFUL << DAC_DOR1_DACC1DOR_Pos ) +#define DAC_DOR1_DACC1DOR ( DAC_DOR1_DACC1DOR_Msk ) + + +/*************** Bits definition for DAC_DOR2 register *********************/ + +#define DAC_DOR2_DACC2DORB_Pos ( 16U ) +#define DAC_DOR2_DACC2DORB_Msk ( 0xFFFUL << DAC_DOR2_DACC2DORB_Pos ) +#define DAC_DOR2_DACC2DORB ( DAC_DOR2_DACC2DORB_Msk ) + +#define DAC_DOR2_DACC2DOR_Pos ( 0U ) +#define DAC_DOR2_DACC2DOR_Msk ( 0xFFFUL << DAC_DOR2_DACC2DOR_Pos ) +#define DAC_DOR2_DACC2DOR ( DAC_DOR2_DACC2DOR_Msk ) + + +/*************** Bits definition for DAC_SR register ***********************/ + +#define DAC_SR_CALFLAG2_Pos ( 30U ) +#define DAC_SR_CALFLAG2_Msk ( 0x1UL << DAC_SR_CALFLAG2_Pos ) +#define DAC_SR_CALFLAG2 ( DAC_SR_CALFLAG2_Msk ) + +#define DAC_SR_DMAUDR2_Pos ( 29U ) +#define DAC_SR_DMAUDR2_Msk ( 0x1UL << DAC_SR_DMAUDR2_Pos ) +#define DAC_SR_DMAUDR2 ( DAC_SR_DMAUDR2_Msk ) + +#define DAC_SR_DORSTAT2_Pos ( 28U ) +#define DAC_SR_DORSTAT2_Msk ( 0x1UL << DAC_SR_DORSTAT2_Pos ) +#define DAC_SR_DORSTAT2 ( DAC_SR_DORSTAT2_Msk ) + +#define DAC_SR_SAMOV2_Pos ( 24U ) +#define DAC_SR_SAMOV2_Msk ( 0x1UL << DAC_SR_SAMOV2_Pos ) +#define DAC_SR_SAMOV2 ( DAC_SR_SAMOV2_Msk ) + +#define DAC_SR_CALFLAG1_Pos ( 14U ) +#define DAC_SR_CALFLAG1_Msk ( 0x1UL << DAC_SR_CALFLAG1_Pos ) +#define DAC_SR_CALFLAG1 ( DAC_SR_CALFLAG1_Msk ) + +#define DAC_SR_DMAUDR1_Pos ( 13U ) +#define DAC_SR_DMAUDR1_Msk ( 0x1UL << DAC_SR_DMAUDR1_Pos ) +#define DAC_SR_DMAUDR1 ( DAC_SR_DMAUDR1_Msk ) + +#define DAC_SR_DORSTAT1_Pos ( 12U ) +#define DAC_SR_DORSTAT1_Msk ( 0x1UL << DAC_SR_DORSTAT1_Pos ) +#define DAC_SR_DORSTAT1 ( DAC_SR_DORSTAT1_Msk ) + +#define DAC_SR_SAMOV1_Pos ( 8U ) +#define DAC_SR_SAMOV1_Msk ( 0x1UL << DAC_SR_SAMOV1_Pos ) +#define DAC_SR_SAMOV1 ( DAC_SR_SAMOV1_Msk ) + + +/*************** Bits definition for DAC_CCR register **********************/ + +#define DAC_CCR_OTRIM2_Pos ( 16U ) +#define DAC_CCR_OTRIM2_Msk ( 0x1FUL << DAC_CCR_OTRIM2_Pos ) +#define DAC_CCR_OTRIM2 ( DAC_CCR_OTRIM2_Msk ) +#define DAC_CCR_OTRIM2_0 ( 0x1UL << DAC_CCR_OTRIM2_Pos ) +#define DAC_CCR_OTRIM2_1 ( 0x2UL << DAC_CCR_OTRIM2_Pos ) +#define DAC_CCR_OTRIM2_2 ( 0x4UL << DAC_CCR_OTRIM2_Pos ) +#define DAC_CCR_OTRIM2_3 ( 0x8UL << DAC_CCR_OTRIM2_Pos ) +#define DAC_CCR_OTRIM2_4 ( 0x10UL << DAC_CCR_OTRIM2_Pos ) + +#define DAC_CCR_OTRIM1_Pos ( 0U ) +#define DAC_CCR_OTRIM1_Msk ( 0x1FUL << DAC_CCR_OTRIM1_Pos ) +#define DAC_CCR_OTRIM1 ( DAC_CCR_OTRIM1_Msk ) +#define DAC_CCR_OTRIM1_0 ( 0x1UL << DAC_CCR_OTRIM1_Pos ) +#define DAC_CCR_OTRIM1_1 ( 0x2UL << DAC_CCR_OTRIM1_Pos ) +#define DAC_CCR_OTRIM1_2 ( 0x4UL << DAC_CCR_OTRIM1_Pos ) +#define DAC_CCR_OTRIM1_3 ( 0x8UL << DAC_CCR_OTRIM1_Pos ) +#define DAC_CCR_OTRIM1_4 ( 0x10UL << DAC_CCR_OTRIM1_Pos ) + + +/*************** Bits definition for DAC_MCR register **********************/ + +#define DAC_MCR_SINFORMAT2_Pos ( 25U ) +#define DAC_MCR_SINFORMAT2_Msk ( 0x1UL << DAC_MCR_SINFORMAT2_Pos ) +#define DAC_MCR_SINFORMAT2 ( DAC_MCR_SINFORMAT2_Msk ) + +#define DAC_MCR_DMADOUBLE2_Pos ( 24U ) +#define DAC_MCR_DMADOUBLE2_Msk ( 0x1UL << DAC_MCR_DMADOUBLE2_Pos ) +#define DAC_MCR_DMADOUBLE2 ( DAC_MCR_DMADOUBLE2_Msk ) + +#define DAC_MCR_MODE2_Pos ( 16U ) +#define DAC_MCR_MODE2_Msk ( 0x7UL << DAC_MCR_MODE2_Pos ) +#define DAC_MCR_MODE2 ( DAC_MCR_MODE2_Msk ) +#define DAC_MCR_MODE2_0 ( 0x1UL << DAC_MCR_MODE2_Pos ) +#define DAC_MCR_MODE2_1 ( 0x2UL << DAC_MCR_MODE2_Pos ) +#define DAC_MCR_MODE2_2 ( 0x4UL << DAC_MCR_MODE2_Pos ) + +#define DAC_MCR_SINFORMAT1_Pos ( 9U ) +#define DAC_MCR_SINFORMAT1_Msk ( 0x1UL << DAC_MCR_SINFORMAT1_Pos ) +#define DAC_MCR_SINFORMAT1 ( DAC_MCR_SINFORMAT1_Msk ) + +#define DAC_MCR_DMADOUBLE1_Pos ( 8U ) +#define DAC_MCR_DMADOUBLE1_Msk ( 0x1UL << DAC_MCR_DMADOUBLE1_Pos ) +#define DAC_MCR_DMADOUBLE1 ( DAC_MCR_DMADOUBLE1_Msk ) + +#define DAC_MCR_MODE1_Pos ( 0U ) +#define DAC_MCR_MODE1_Msk ( 0x7UL << DAC_MCR_MODE1_Pos ) +#define DAC_MCR_MODE1 ( DAC_MCR_MODE1_Msk ) +#define DAC_MCR_MODE1_0 ( 0x1UL << DAC_MCR_MODE1_Pos ) +#define DAC_MCR_MODE1_1 ( 0x2UL << DAC_MCR_MODE1_Pos ) +#define DAC_MCR_MODE1_2 ( 0x4UL << DAC_MCR_MODE1_Pos ) + + +/*************** Bits definition for DAC_SHSR1 register ********************/ + +#define DAC_SHSR1_TSAMPLE1_Pos ( 0U ) +#define DAC_SHSR1_TSAMPLE1_Msk ( 0x3FFUL << DAC_SHSR1_TSAMPLE1_Pos ) +#define DAC_SHSR1_TSAMPLE1 ( DAC_SHSR1_TSAMPLE1_Msk ) + + +/*************** Bits definition for DAC_SHSR2 register ********************/ + +#define DAC_SHSR2_TSAMPLE2_Pos ( 0U ) +#define DAC_SHSR2_TSAMPLE2_Msk ( 0x3FFUL << DAC_SHSR2_TSAMPLE2_Pos ) +#define DAC_SHSR2_TSAMPLE2 ( DAC_SHSR2_TSAMPLE2_Msk ) + + +/*************** Bits definition for DAC_SHHR register *********************/ + +#define DAC_SHHR_THOLD2_Pos ( 16U ) +#define DAC_SHHR_THOLD2_Msk ( 0x3FFUL << DAC_SHHR_THOLD2_Pos ) +#define DAC_SHHR_THOLD2 ( DAC_SHHR_THOLD2_Msk ) + +#define DAC_SHHR_THOLD1_Pos ( 0U ) +#define DAC_SHHR_THOLD1_Msk ( 0x3FFUL << DAC_SHHR_THOLD1_Pos ) +#define DAC_SHHR_THOLD1 ( DAC_SHHR_THOLD1_Msk ) + + +/*************** Bits definition for DAC_SHRR register *********************/ + +#define DAC_SHRR_TREFRESH2_Pos ( 16U ) +#define DAC_SHRR_TREFRESH2_Msk ( 0xFFUL << DAC_SHRR_TREFRESH2_Pos ) +#define DAC_SHRR_TREFRESH2 ( DAC_SHRR_TREFRESH2_Msk ) + +#define DAC_SHRR_TREFRESH1_Pos ( 0U ) +#define DAC_SHRR_TREFRESH1_Msk ( 0xFFUL << DAC_SHRR_TREFRESH1_Pos ) +#define DAC_SHRR_TREFRESH1 ( DAC_SHRR_TREFRESH1_Msk ) + + +/*************** Bits definition for DAC_STR1 register *********************/ + +#define DAC_STR1_STINCDATA1_Pos ( 16U ) +#define DAC_STR1_STINCDATA1_Msk ( 0xFFFFUL << DAC_STR1_STINCDATA1_Pos ) +#define DAC_STR1_STINCDATA1 ( DAC_STR1_STINCDATA1_Msk ) + +#define DAC_STR1_STDIR1_Pos ( 12U ) +#define DAC_STR1_STDIR1_Msk ( 0x1UL << DAC_STR1_STDIR1_Pos ) +#define DAC_STR1_STDIR1 ( DAC_STR1_STDIR1_Msk ) + +#define DAC_STR1_STRSTDATA1_Pos ( 0U ) +#define DAC_STR1_STRSTDATA1_Msk ( 0xFFFUL << DAC_STR1_STRSTDATA1_Pos ) +#define DAC_STR1_STRSTDATA1 ( DAC_STR1_STRSTDATA1_Msk ) + + +/*************** Bits definition for DAC_STR2 register *********************/ + +#define DAC_STR2_STINCDATA2_Pos ( 16U ) +#define DAC_STR2_STINCDATA2_Msk ( 0xFFFFUL << DAC_STR2_STINCDATA2_Pos ) +#define DAC_STR2_STINCDATA2 ( DAC_STR2_STINCDATA2_Msk ) + +#define DAC_STR2_STDIR2_Pos ( 12U ) +#define DAC_STR2_STDIR2_Msk ( 0x1UL << DAC_STR2_STDIR2_Pos ) +#define DAC_STR2_STDIR2 ( DAC_STR2_STDIR2_Msk ) + +#define DAC_STR2_STRSTDATA2_Pos ( 0U ) +#define DAC_STR2_STRSTDATA2_Msk ( 0xFFFUL << DAC_STR2_STRSTDATA2_Pos ) +#define DAC_STR2_STRSTDATA2 ( DAC_STR2_STRSTDATA2_Msk ) + + +/*************** Bits definition for DAC_STMODR register *******************/ + +#define DAC_STMODR_STINCTRIGSEL2_Pos ( 24U ) +#define DAC_STMODR_STINCTRIGSEL2_Msk ( 0xFUL << DAC_STMODR_STINCTRIGSEL2_Pos ) +#define DAC_STMODR_STINCTRIGSEL2 ( DAC_STMODR_STINCTRIGSEL2_Msk ) +#define DAC_STMODR_STINCTRIGSEL2_0 ( 0x1UL << DAC_STMODR_STINCTRIGSEL2_Pos ) +#define DAC_STMODR_STINCTRIGSEL2_1 ( 0x2UL << DAC_STMODR_STINCTRIGSEL2_Pos ) +#define DAC_STMODR_STINCTRIGSEL2_2 ( 0x4UL << DAC_STMODR_STINCTRIGSEL2_Pos ) +#define DAC_STMODR_STINCTRIGSEL2_3 ( 0x8UL << DAC_STMODR_STINCTRIGSEL2_Pos ) + +#define DAC_STMODR_STRSTTRIGSEL2_Pos ( 16U ) +#define DAC_STMODR_STRSTTRIGSEL2_Msk ( 0xFUL << DAC_STMODR_STRSTTRIGSEL2_Pos ) +#define DAC_STMODR_STRSTTRIGSEL2 ( DAC_STMODR_STRSTTRIGSEL2_Msk ) +#define DAC_STMODR_STRSTTRIGSEL2_0 ( 0x1UL << DAC_STMODR_STRSTTRIGSEL2_Pos ) +#define DAC_STMODR_STRSTTRIGSEL2_1 ( 0x2UL << DAC_STMODR_STRSTTRIGSEL2_Pos ) +#define DAC_STMODR_STRSTTRIGSEL2_2 ( 0x4UL << DAC_STMODR_STRSTTRIGSEL2_Pos ) +#define DAC_STMODR_STRSTTRIGSEL2_3 ( 0x8UL << DAC_STMODR_STRSTTRIGSEL2_Pos ) + +#define DAC_STMODR_STINCTRIGSEL1_Pos ( 8U ) +#define DAC_STMODR_STINCTRIGSEL1_Msk ( 0xFUL << DAC_STMODR_STINCTRIGSEL1_Pos ) +#define DAC_STMODR_STINCTRIGSEL1 ( DAC_STMODR_STINCTRIGSEL1_Msk ) +#define DAC_STMODR_STINCTRIGSEL1_0 ( 0x1UL << DAC_STMODR_STINCTRIGSEL1_Pos ) +#define DAC_STMODR_STINCTRIGSEL1_1 ( 0x2UL << DAC_STMODR_STINCTRIGSEL1_Pos ) +#define DAC_STMODR_STINCTRIGSEL1_2 ( 0x4UL << DAC_STMODR_STINCTRIGSEL1_Pos ) +#define DAC_STMODR_STINCTRIGSEL1_3 ( 0x8UL << DAC_STMODR_STINCTRIGSEL1_Pos ) + +#define DAC_STMODR_STRSTTRIGSEL1_Pos ( 0U ) +#define DAC_STMODR_STRSTTRIGSEL1_Msk ( 0xFUL << DAC_STMODR_STRSTTRIGSEL1_Pos ) +#define DAC_STMODR_STRSTTRIGSEL1 ( DAC_STMODR_STRSTTRIGSEL1_Msk ) +#define DAC_STMODR_STRSTTRIGSEL1_0 ( 0x1UL << DAC_STMODR_STRSTTRIGSEL1_Pos ) +#define DAC_STMODR_STRSTTRIGSEL1_1 ( 0x2UL << DAC_STMODR_STRSTTRIGSEL1_Pos ) +#define DAC_STMODR_STRSTTRIGSEL1_2 ( 0x4UL << DAC_STMODR_STRSTTRIGSEL1_Pos ) +#define DAC_STMODR_STRSTTRIGSEL1_3 ( 0x8UL << DAC_STMODR_STRSTTRIGSEL1_Pos ) + +/*************** Bits definition for MDAC_VDACx_CR **********************/ + +#define MDAC_VDACX_CR_CAL_FLAG_Pos ( 16U ) +#define MDAC_VDACX_CR_CAL_FLAG_Msk ( 0x1UL << MDAC_VDACX_CR_CAL_FLAG_Pos ) +#define MDAC_VDACX_CR_CAL_FLAG ( MDAC_VDACX_CR_CAL_FLAG_Msk ) + +#define MDAC_VDACX_CR_SAMPLE_EN_Pos ( 10U ) +#define MDAC_VDACX_CR_SAMPLE_EN_Msk ( 0x1UL << MDAC_VDACX_CR_SAMPLE_EN_Pos ) +#define MDAC_VDACX_CR_SAMPLE_EN ( MDAC_VDACX_CR_SAMPLE_EN_Msk ) + +#define MDAC_VDACX_CR_OTRIM_Pos ( 5U ) +#define MDAC_VDACX_CR_OTRIM_Msk ( 0x1FL << MDAC_VDACX_CR_OTRIM_Pos ) +#define MDAC_VDACX_CR_OTRIM ( MDAC_VDACX_CR_OTRIM_Msk ) + +#define MDAC_VDACX_CR_OTRIM4_Pos ( 9U ) +#define MDAC_VDACX_CR_OTRIM4_Msk ( 0x1UL << MDAC_VDACX_CR_OTRIM4_Pos ) +#define MDAC_VDACX_CR_OTRIM4 ( MDAC_VDACX_CR_OTRIM4_Msk ) + + +#define MDAC_VDACX_CR_OTRIM3_Pos ( 8U ) +#define MDAC_VDACX_CR_OTRIM3_Msk ( 0x1UL << MDAC_VDACX_CR_OTRIM3_Pos ) +#define MDAC_VDACX_CR_OTRIM3 ( MDAC_VDACX_CR_OTRIM3_Msk ) + + +#define MDAC_VDACX_CR_OTRIM2_Pos ( 7U ) +#define MDAC_VDACX_CR_OTRIM2_Msk ( 0x1UL << MDAC_VDACX_CR_OTRIM2_Pos ) +#define MDAC_VDACX_CR_OTRIM2 ( MDAC_VDACX_CR_OTRIM2_Msk ) + + +#define MDAC_VDACX_CR_OTRIM1_Pos ( 6U ) +#define MDAC_VDACX_CR_OTRIM1_Msk ( 0x1UL << MDAC_VDACX_CR_OTRIM1_Pos ) +#define MDAC_VDACX_CR_OTRIM1 ( MDAC_VDACX_CR_OTRIM1_Msk ) + + +#define MDAC_VDACX_CR_OTRIM0_Pos ( 5U ) +#define MDAC_VDACX_CR_OTRIM0_Msk ( 0x1UL << MDAC_VDACX_CR_OTRIM0_Pos ) +#define MDAC_VDACX_CR_OTRIM0 ( MDAC_VDACX_CR_OTRIM0_Msk ) + + +#define MDAC_VDACX_CR_CEN_Pos ( 4U ) +#define MDAC_VDACX_CR_CEN_Msk ( 0x1UL << MDAC_VDACX_CR_CEN_Pos ) +#define MDAC_VDACX_CR_CEN ( MDAC_VDACX_CR_CEN_Msk ) + +#define MDAC_VDACX_CR_MODE_Pos ( 1U ) +#define MDAC_VDACX_CR_MODE_Msk ( 0x7UL << MDAC_VDACX_CR_MODE_Pos ) +#define MDAC_VDACX_CR_MODE ( MDAC_VDACX_CR_MODE_Msk ) + +#define MDAC_VDACX_CR_MODE2_Pos ( 3U ) +#define MDAC_VDACX_CR_MODE2_Msk ( 0x1UL << MDAC_VDACX_CR_MODE2_Pos ) +#define MDAC_VDACX_CR_MODE2 ( MDAC_VDACX_CR_MODE2_Msk ) + + +#define MDAC_VDACX_CR_MODE1_Pos ( 2U ) +#define MDAC_VDACX_CR_MODE1_Msk ( 0x1UL << MDAC_VDACX_CR_MODE1_Pos ) +#define MDAC_VDACX_CR_MODE1 ( MDAC_VDACX_CR_MODE1_Msk ) + + +#define MDAC_VDACX_CR_MODE0_Pos ( 1U ) +#define MDAC_VDACX_CR_MODE0_Msk ( 0x1UL << MDAC_VDACX_CR_MODE0_Pos ) +#define MDAC_VDACX_CR_MODE0 ( MDAC_VDACX_CR_MODE0_Msk ) + + +#define MDAC_VDACX_CR_EN_Pos ( 0U ) +#define MDAC_VDACX_CR_EN_Msk ( 0x1UL << MDAC_VDACX_CR_EN_Pos ) +#define MDAC_VDACX_CR_EN ( MDAC_VDACX_CR_EN_Msk ) + + +/*************** Bits definition for MDAC_IDACx_CR **********************/ + +#define MDAC_IDACX_CR_ITURE_Pos ( 1U ) +#define MDAC_IDACX_CR_ITURE_Msk ( 0x1FUL << MDAC_IDACX_CR_ITURE_Pos ) +#define MDAC_IDACX_CR_ITURE ( MDAC_IDACX_CR_ITURE_Msk ) + +#define MDAC_IDACX_CR_ITURE4_Pos ( 5U ) +#define MDAC_IDACX_CR_ITURE4_Msk ( 0x1UL << MDAC_IDACX_CR_ITURE4_Pos ) +#define MDAC_IDACX_CR_ITURE4 ( MDAC_IDACX_CR_ITURE4_Msk ) + + +#define MDAC_IDACX_CR_ITURE3_Pos ( 4U ) +#define MDAC_IDACX_CR_ITURE3_Msk ( 0x1UL << MDAC_IDACX_CR_ITURE3_Pos ) +#define MDAC_IDACX_CR_ITURE3 ( MDAC_IDACX_CR_ITURE3_Msk ) + + +#define MDAC_IDACX_CR_ITURE2_Pos ( 3U ) +#define MDAC_IDACX_CR_ITURE2_Msk ( 0x1UL << MDAC_IDACX_CR_ITURE2_Pos ) +#define MDAC_IDACX_CR_ITURE2 ( MDAC_IDACX_CR_ITURE2_Msk ) + + +#define MDAC_IDACX_CR_ITURE1_Pos ( 2U ) +#define MDAC_IDACX_CR_ITURE1_Msk ( 0x1UL << MDAC_IDACX_CR_ITURE1_Pos ) +#define MDAC_IDACX_CR_ITURE1 ( MDAC_IDACX_CR_ITURE1_Msk ) + + +#define MDAC_IDACX_CR_ITURE0_Pos ( 1U ) +#define MDAC_IDACX_CR_ITURE0_Msk ( 0x1UL << MDAC_IDACX_CR_ITURE0_Pos ) +#define MDAC_IDACX_CR_ITURE0 ( MDAC_IDACX_CR_ITURE0_Msk ) + + +#define MDAC_IDACX_CR_EN_Pos ( 0U ) +#define MDAC_IDACX_CR_EN_Msk ( 0x1UL << MDAC_IDACX_CR_EN_Pos ) +#define MDAC_IDACX_CR_EN ( MDAC_IDACX_CR_EN_Msk ) + + +/*************** Bits definition for MDAC_DACx_DOR **********************/ + +#define MDAC_DACX_DOR_DACDOR11_Pos ( 11U ) +#define MDAC_DACX_DOR_DACDOR11_Msk ( 0x1UL << MDAC_DACX_DOR_DACDOR11_Pos ) +#define MDAC_DACX_DOR_DACDOR11 ( MDAC_DACX_DOR_DACDOR11_Msk ) + + +#define MDAC_DACX_DOR_DACDOR10_Pos ( 10U ) +#define MDAC_DACX_DOR_DACDOR10_Msk ( 0x1UL << MDAC_DACX_DOR_DACDOR10_Pos ) +#define MDAC_DACX_DOR_DACDOR10 ( MDAC_DACX_DOR_DACDOR10_Msk ) + + +#define MDAC_DACX_DOR_DACDOR9_Pos ( 9U ) +#define MDAC_DACX_DOR_DACDOR9_Msk ( 0x1UL << MDAC_DACX_DOR_DACDOR9_Pos ) +#define MDAC_DACX_DOR_DACDOR9 ( MDAC_DACX_DOR_DACDOR9_Msk ) + + +#define MDAC_DACX_DOR_DACDOR8_Pos ( 8U ) +#define MDAC_DACX_DOR_DACDOR8_Msk ( 0x1UL << MDAC_DACX_DOR_DACDOR8_Pos ) +#define MDAC_DACX_DOR_DACDOR8 ( MDAC_DACX_DOR_DACDOR8_Msk ) + + +#define MDAC_DACX_DOR_DACDOR7_Pos ( 7U ) +#define MDAC_DACX_DOR_DACDOR7_Msk ( 0x1UL << MDAC_DACX_DOR_DACDOR7_Pos ) +#define MDAC_DACX_DOR_DACDOR7 ( MDAC_DACX_DOR_DACDOR7_Msk ) + + +#define MDAC_DACX_DOR_DACDOR6_Pos ( 6U ) +#define MDAC_DACX_DOR_DACDOR6_Msk ( 0x1UL << MDAC_DACX_DOR_DACDOR6_Pos ) +#define MDAC_DACX_DOR_DACDOR6 ( MDAC_DACX_DOR_DACDOR6_Msk ) + + +#define MDAC_DACX_DOR_DACDOR5_Pos ( 5U ) +#define MDAC_DACX_DOR_DACDOR5_Msk ( 0x1UL << MDAC_DACX_DOR_DACDOR5_Pos ) +#define MDAC_DACX_DOR_DACDOR5 ( MDAC_DACX_DOR_DACDOR5_Msk ) + + +#define MDAC_DACX_DOR_DACDOR4_Pos ( 4U ) +#define MDAC_DACX_DOR_DACDOR4_Msk ( 0x1UL << MDAC_DACX_DOR_DACDOR4_Pos ) +#define MDAC_DACX_DOR_DACDOR4 ( MDAC_DACX_DOR_DACDOR4_Msk ) + + +#define MDAC_DACX_DOR_DACDOR3_Pos ( 3U ) +#define MDAC_DACX_DOR_DACDOR3_Msk ( 0x1UL << MDAC_DACX_DOR_DACDOR3_Pos ) +#define MDAC_DACX_DOR_DACDOR3 ( MDAC_DACX_DOR_DACDOR3_Msk ) + + +#define MDAC_DACX_DOR_DACDOR2_Pos ( 2U ) +#define MDAC_DACX_DOR_DACDOR2_Msk ( 0x1UL << MDAC_DACX_DOR_DACDOR2_Pos ) +#define MDAC_DACX_DOR_DACDOR2 ( MDAC_DACX_DOR_DACDOR2_Msk ) + + +#define MDAC_DACX_DOR_DACDOR1_Pos ( 1U ) +#define MDAC_DACX_DOR_DACDOR1_Msk ( 0x1UL << MDAC_DACX_DOR_DACDOR1_Pos ) +#define MDAC_DACX_DOR_DACDOR1 ( MDAC_DACX_DOR_DACDOR1_Msk ) + + +#define MDAC_DACX_DOR_DACDOR0_Pos ( 0U ) +#define MDAC_DACX_DOR_DACDOR0_Msk ( 0x1UL << MDAC_DACX_DOR_DACDOR0_Pos ) +#define MDAC_DACX_DOR_DACDOR0 ( MDAC_DACX_DOR_DACDOR0_Msk ) + +/*************** Bits definition for TKEY_SR **********************/ + +#define TKEY_SR_MEOC_Pos ( 11U ) +#define TKEY_SR_MEOC_Msk ( 0x1UL << TKEY_SR_MEOC_Pos ) +#define TKEY_SR_MEOC ( TKEY_SR_MEOC_Msk ) + +#define TKEY_SR_CHGDONE_Pos ( 10U ) +#define TKEY_SR_CHGDONE_Msk ( 0x1UL << TKEY_SR_CHGDONE_Pos ) +#define TKEY_SR_CHGDONE ( TKEY_SR_CHGDONE_Msk ) + +#define TKEY_SR_CHG_Pos ( 9U ) +#define TKEY_SR_CHG_Msk ( 0x1UL << TKEY_SR_CHG_Pos ) +#define TKEY_SR_CHG ( TKEY_SR_CHG_Msk ) + +#define TKEY_SR_DONE_Pos ( 8U ) +#define TKEY_SR_DONE_Msk ( 0x1UL << TKEY_SR_DONE_Pos ) +#define TKEY_SR_DONE ( TKEY_SR_DONE_Msk ) + +#define TKEY_SR_CHNUM_Pos ( 4U ) +#define TKEY_SR_CHNUM_Msk ( 0xfUL << TKEY_SR_CHNUM_Pos ) +#define TKEY_SR_CHNUM ( TKEY_SR_CHNUM_Msk ) +#define TKEY_SR_CHNUM_0 ( 0x1UL << TKEY_SR_CHNUM_Pos ) +#define TKEY_SR_CHNUM_1 ( 0x2UL << TKEY_SR_CHNUM_Pos ) +#define TKEY_SR_CHNUM_2 ( 0x4UL << TKEY_SR_CHNUM_Pos ) +#define TKEY_SR_CHNUM_3 ( 0x8UL << TKEY_SR_CHNUM_Pos ) + +#define TKEY_SR_BUSY_Pos ( 3U ) +#define TKEY_SR_BUSY_Msk ( 0x1UL << TKEY_SR_BUSY_Pos ) +#define TKEY_SR_BUSY ( TKEY_SR_BUSY_Msk ) + +#define TKEY_SR_TIMEOUT_Pos ( 2U ) +#define TKEY_SR_TIMEOUT_Msk ( 0x1UL << TKEY_SR_TIMEOUT_Pos ) +#define TKEY_SR_TIMEOUT ( TKEY_SR_TIMEOUT_Msk ) + +#define TKEY_SR_YESTOUCH_Pos ( 1U ) +#define TKEY_SR_YESTOUCH_Msk ( 0x1UL << TKEY_SR_YESTOUCH_Pos ) +#define TKEY_SR_YESTOUCH ( TKEY_SR_YESTOUCH_Msk ) + +#define TKEY_SR_EOC_Pos ( 0U ) +#define TKEY_SR_EOC_Msk ( 0x1UL << TKEY_SR_EOC_Pos ) +#define TKEY_SR_EOC ( TKEY_SR_EOC_Msk ) + + +/*************** Bits definition for TKEY_IER **********************/ + +#define TKEY_IER_MEOCIE_Pos ( 11U ) +#define TKEY_IER_MEOCIE_Msk ( 0x1UL << TKEY_IER_MEOCIE_Pos ) +#define TKEY_IER_MEOCIE ( TKEY_IER_MEOCIE_Msk ) + +#define TKEY_IER_CHGDONEIE_Pos ( 10U ) +#define TKEY_IER_CHGDONEIE_Msk ( 0x1UL << TKEY_IER_CHGDONEIE_Pos ) +#define TKEY_IER_CHGDONEIE ( TKEY_IESR_CHGDONEIE_Msk ) + +#define TKEY_IER_CHIE_Pos ( 9U ) +#define TKEY_IER_CHIE_Msk ( 0x1UL << TKEY_IER_CHIE_Pos ) +#define TKEY_IER_CHIE ( TKEY_IER_CHIE_Msk ) + +#define TKEY_IER_DONEIE_Pos ( 8U ) +#define TKEY_IER_DONEIE_Msk ( 0x1UL << TKEY_IER_DONEIE_Pos ) +#define TKEY_IER_DONEIE ( TKEY_IER_DONEIE_Msk ) + +#define TKEY_IER_TIMEOUTIE_Pos ( 2U ) +#define TKEY_IER_TIMEOUTIE_Msk ( 0x1UL << TKEY_IER_TIMEOUTIE_Pos ) +#define TKEY_IER_TIMEOUTIE ( TKEY_IER_TIMEOUTIE_Msk ) + +#define TKEY_IER_YESTOUCHIE_Pos ( 1U ) +#define TKEY_IER_YESTOUCHIE_Msk ( 0x1UL << TKEY_IER_YESTOUCHIE_Pos ) +#define TKEY_IER_YESTOUCHIE ( TKEY_IER_YESTOUCHIE_Msk ) + +#define TKEY_IER_EOCIE_Pos ( 0U ) +#define TKEY_IER_EOCIE_Msk ( 0x1UL << TKEY_IER_EOCIE_Pos ) +#define TKEY_IER_EOCIE ( TKEY_IER_EOCIE_Msk ) + + +/*************** Bits definition for TKEY_CR **********************/ + +#define TKEY_CR_CHGDONEEN_Pos ( 15U ) +#define TKEY_CR_CHGDONEEN_Msk ( 0x1UL << TKEY_CR_CHGDONEEN_Pos ) +#define TKEY_CR_CHGDONEEN ( TKEY_CR_CHGDONEEN_Msk ) + +#define TKEY_CR_CHGEN_Pos ( 14U ) +#define TKEY_CR_CHGEN_Msk ( 0x1UL << TKEY_CR_CHGEN_Pos ) +#define TKEY_CR_CHGEN ( TKEY_CR_CHGEN_Msk ) + +#define TKEY_CR_DISMS_Pos ( 11U ) +#define TKEY_CR_DISMS_Msk ( 0x7UL << TKEY_CR_DISMS_Pos ) +#define TKEY_CR_DISMS ( TKEY_CR_DISMS_Msk ) +#define TKEY_CR_DISMS_0 ( 0x1UL << TKEY_CR_DISMS_Pos ) +#define TKEY_CR_DISMS_1 ( 0x2UL << TKEY_CR_DISMS_Pos ) +#define TKEY_CR_DISMS_2 ( 0x4UL << TKEY_CR_DISMS_Pos ) + +#define TKEY_CR_RANDM_Pos ( 9U ) +#define TKEY_CR_RANDM_Msk ( 0x3UL << TKEY_CR_RANDM_Pos ) +#define TKEY_CR_RANDM ( TKEY_CR_RANDM_Msk ) +#define TKEY_CR_RANDM_0 ( 0x1UL << TKEY_CR_RANDM_Pos ) +#define TKEY_CR_RANDM_1 ( 0x2UL << TKEY_CR_RANDM_Pos ) + +#define TKEY_CR_AUTO_Pos ( 8U ) +#define TKEY_CR_AUTO_Msk ( 0x1UL << TKEY_CR_AUTO_Pos ) +#define TKEY_CR_AUTO ( TKEY_CR_AUTO_Msk ) + +#define TKEY_CR_SPREAD_Pos ( 7U ) +#define TKEY_CR_SPREAD_Msk ( 0x1UL << TKEY_CR_SPREAD_Pos ) +#define TKEY_CR_SPREAD ( TKEY_CR_SPREAD_Msk ) + +#define TKEY_CR_CONT_Pos ( 6U ) +#define TKEY_CR_CONT_Msk ( 0x1UL << TKEY_CR_CONT_Pos ) +#define TKEY_CR_CONT ( TKEY_CR_CONT_Msk ) + +#define TKEY_CR_SHIELDEN_Pos ( 5U ) +#define TKEY_CR_SHIELDEN_Msk ( 0x1UL << TKEY_CR_SHIELDEN_Pos ) +#define TKEY_CR_SHIELDEN ( TKEY_CR_SHIELDEN_Msk ) + +#define TKEY_CR_PCEN_Pos ( 4U ) +#define TKEY_CR_PCEN_Msk ( 0x1UL << TKEY_CR_PCEN_Pos ) +#define TKEY_CR_PCEN ( TKEY_CR_PCEN_Msk ) + +#define TKEY_CR_CHEN_Pos ( 3U ) +#define TKEY_CR_CHEN_Msk ( 0x1UL << TKEY_CR_CHEN_Pos ) +#define TKEY_CR_CHEN ( TKEY_CR_CHEN_Msk ) + +#define TKEY_CR_START_Pos ( 2U ) +#define TKEY_CR_START_Msk ( 0x1UL << TKEY_CR_START_Pos ) +#define TKEY_CR_START ( TKEY_CR_START_Msk ) + +#define TKEY_CR_TKMS_Pos ( 1U ) +#define TKEY_CR_TKMS_Msk ( 0x1UL << TKEY_CR_TKMS_Pos ) +#define TKEY_CR_TKMS ( TKEY_CR_TKMS_Msk ) + +#define TKEY_CR_TKEN_Pos ( 0U ) +#define TKEY_CR_TKEN_Msk ( 0x1UL << TKEY_CR_TKEN_Pos ) +#define TKEY_CR_TKEN ( TKEY_CR_TKEN_Msk ) + + +/*************** Bits definition for TKEY_CFGR1 **********************/ + +#define TKEY_CFGR1_FLTSEL_Pos ( 11U ) +#define TKEY_CFGR1_FLTSEL_Msk ( 0x7UL << TKEY_CFGR1_FLTSEL_Pos ) +#define TKEY_CFGR1_FLTSEL ( TKEY_CFGR1_FLTSEL_Msk ) +#define TKEY_CFGR1_FLTSEL_0 ( 0x1UL << TKEY_CFGR1_FLTSEL_Pos ) +#define TKEY_CFGR1_FLTSEL_1 ( 0x2UL << TKEY_CFGR1_FLTSEL_Pos ) +#define TKEY_CFGR1_FLTSEL_2 ( 0x4UL << TKEY_CFGR1_FLTSEL_Pos ) + +#define TKEY_CFGR1_SMPSEL_Pos ( 9U ) +#define TKEY_CFGR1_SMPSEL_Msk ( 0x3UL << TKEY_CFGR1_SMPSEL_Pos ) +#define TKEY_CFGR1_SMPSEL ( TKEY_CFGR1_SMPSEL_Msk ) +#define TKEY_CFGR1_SMPSEL_0 ( 0x1UL << TKEY_CFGR1_SMPSEL_Pos ) +#define TKEY_CFGR1_SMPSEL_1 ( 0x2UL << TKEY_CFGR1_SMPSEL_Pos ) + +#define TKEY_CFGR1_CCPSEL_Pos ( 6U ) +#define TKEY_CFGR1_CCPSEL_Msk ( 0x7UL << TKEY_CFGR1_CCPSEL_Pos ) +#define TKEY_CFGR1_CCPSEL ( TKEY_CFGR1_CCPSEL_Msk ) +#define TKEY_CFGR1_CCPSEL_0 ( 0x1UL << TKEY_CFGR1_CCPSEL_Pos ) +#define TKEY_CFGR1_CCPSEL_1 ( 0x2UL << TKEY_CFGR1_CCPSEL_Pos ) +#define TKEY_CFGR1_CCPSEL_2 ( 0x4UL << TKEY_CFGR1_CCPSEL_Pos ) + +#define TKEY_CFGR1_RCPSEL_Pos ( 4U ) +#define TKEY_CFGR1_RCPSEL_Msk ( 0x3UL << TKEY_CFGR1_RCPSEL_Pos ) +#define TKEY_CFGR1_RCPSEL ( TKEY_CFGR1_RCPSEL_Msk ) +#define TKEY_CFGR1_RCPSEL_0 ( 0x1UL << TKEY_CFGR1_RCPSEL_Pos ) +#define TKEY_CFGR1_RCPSEL_1 ( 0x2UL << TKEY_CFGR1_RCPSEL_Pos ) + +#define TKEY_CFGR1_VCHRSEL_Pos ( 2U ) +#define TKEY_CFGR1_VCHRSEL_Msk ( 0x3UL << TKEY_CFGR1_VCHRSEL_Pos ) +#define TKEY_CFGR1_VCHRSEL ( TKEY_CFGR1_VCHRSEL_Msk ) +#define TKEY_CFGR1_VCHRSEL_0 ( 0x1UL << TKEY_CFGR1_VCHRSEL_Pos ) +#define TKEY_CFGR1_VCHRSEL_1 ( 0x2UL << TKEY_CFGR1_VCHRSEL_Pos ) + +#define TKEY_CFGR1_VCMPSEL_Pos ( 0U ) +#define TKEY_CFGR1_VCMPSEL_Msk ( 0x3UL << TKEY_CFGR1_VCMPSEL_Pos ) +#define TKEY_CFGR1_VCMPSEL ( TKEY_CFGR1_VCMPSEL_Msk ) +#define TKEY_CFGR1_VCMPSEL_0 ( 0x1UL << TKEY_CFGR1_VCMPSEL_Pos ) +#define TKEY_CFGR1_VCMPSEL_1 ( 0x2UL << TKEY_CFGR1_VCMPSEL_Pos ) + + +/*************** Bits definition for TKEY_CFGR2 **********************/ + +#define TKEY_CFGR2_IDISSEL_Pos ( 8U ) +#define TKEY_CFGR2_IDISSEL_Msk ( 0xffUL << TKEY_CFGR2_IDISSEL_Pos ) +#define TKEY_CFGR2_IDISSEL ( TKEY_CFGR2_IDISSEL_Msk ) +#define TKEY_CFGR2_IDISSEL_0 ( 0x1UL << TKEY_CFGR2_IDISSEL_Pos ) +#define TKEY_CFGR2_IDISSEL_1 ( 0x2UL << TKEY_CFGR2_IDISSEL_Pos ) +#define TKEY_CFGR2_IDISSEL_2 ( 0x4UL << TKEY_CFGR2_IDISSEL_Pos ) +#define TKEY_CFGR2_IDISSEL_3 ( 0x8UL << TKEY_CFGR2_IDISSEL_Pos ) +#define TKEY_CFGR2_IDISSEL_4 ( 0x10UL << TKEY_CFGR2_IDISSEL_Pos ) +#define TKEY_CFGR2_IDISSEL_5 ( 0x20UL << TKEY_CFGR2_IDISSEL_Pos ) +#define TKEY_CFGR2_IDISSEL_6 ( 0x40UL << TKEY_CFGR2_IDISSEL_Pos ) +#define TKEY_CFGR2_IDISSEL_7 ( 0x80UL << TKEY_CFGR2_IDISSEL_Pos ) + +#define TKEY_CFGR2_RDISSEL_Pos ( 0U ) +#define TKEY_CFGR2_RDISSEL_Msk ( 0xffUL << TKEY_CFGR2_RDISSEL_Pos ) +#define TKEY_CFGR2_RDISSEL ( TKEY_CFGR2_RDISSEL_Msk ) +#define TKEY_CFGR2_RDISSEL_0 ( 0x1UL << TKEY_CFGR2_RDISSEL_Pos ) +#define TKEY_CFGR2_RDISSEL_1 ( 0x2UL << TKEY_CFGR2_RDISSEL_Pos ) +#define TKEY_CFGR2_RDISSEL_2 ( 0x4UL << TKEY_CFGR2_RDISSEL_Pos ) +#define TKEY_CFGR2_RDISSEL_3 ( 0x8UL << TKEY_CFGR2_RDISSEL_Pos ) +#define TKEY_CFGR2_RDISSEL_4 ( 0x10UL << TKEY_CFGR2_RDISSEL_Pos ) +#define TKEY_CFGR2_RDISSEL_5 ( 0x20UL << TKEY_CFGR2_RDISSEL_Pos ) +#define TKEY_CFGR2_RDISSEL_6 ( 0x40UL << TKEY_CFGR2_RDISSEL_Pos ) +#define TKEY_CFGR2_RDISSEL_7 ( 0x80UL << TKEY_CFGR2_RDISSEL_Pos ) + + +/*************** Bits definition for TKEY_SMPCR **********************/ + +#define TKEY_INTVLR_INTERVAL_Pos ( 0U ) +#define TKEY_INTVLR_INTERVAL_Msk ( 0xffffUL << TKEY_SMPCR_GAP_Pos ) +#define TKEY_INTVLR_INTERVAL ( TKEY_SMPCR_GAP_Msk ) + +/*************** Bits definition for TKEY_CCR **********************/ + +#define TKEY_DIVR_SCANCLKDIV_Pos ( 8U ) +#define TKEY_DIVR_SCANCLKDIV_Msk ( 0xffUL << TKEY_DIVR_SCANCLKDIV_Pos ) +#define TKEY_DIVR_SCANCLKDIV ( TKEY_DIVR_SCANCLKDIV_Msk ) +#define TKEY_DIVR_SCANCLKDIV_0 ( 0x1UL << TKEY_DIVR_SCANCLKDIV_Pos ) +#define TKEY_DIVR_SCANCLKDIV_1 ( 0x2UL << TKEY_DIVR_SCANCLKDIV_Pos ) +#define TKEY_DIVR_SCANCLKDIV_2 ( 0x4UL << TKEY_DIVR_SCANCLKDIV_Pos ) +#define TKEY_DIVR_SCANCLKDIV_3 ( 0x8UL << TKEY_DIVR_SCANCLKDIV_Pos ) +#define TKEY_DIVR_SCANCLKDIV_4 ( 0x10UL << TKEY_DIVR_SCANCLKDIV_Pos ) +#define TKEY_DIVR_SCANCLKDIV_5 ( 0x20UL << TKEY_DIVR_SCANCLKDIV_Pos ) +#define TKEY_DIVR_SCANCLKDIV_6 ( 0x40UL << TKEY_DIVR_SCANCLKDIV_Pos ) +#define TKEY_DIVR_SCANCLKDIV_7 ( 0x80UL << TKEY_DIVR_SCANCLKDIV_Pos ) + +#define TKEY_DIVR_SMPCLKDIV_Pos ( 0U ) +#define TKEY_DIVR_SMPCLKDIV_Msk ( 0xffUL << TKEY_DIVR_SMPCLKDIV_Pos ) +#define TKEY_DIVR_SMPCLKDIV ( TKEY_DIVR_SMPCLKDIV_Msk ) +#define TKEY_DIVR_SMPCLKDIV_0 ( 0x1UL << TKEY_DIVR_SMPCLKDIV_Pos ) +#define TKEY_DIVR_SMPCLKDIV_1 ( 0x2UL << TKEY_DIVR_SMPCLKDIV_Pos ) +#define TKEY_DIVR_SMPCLKDIV_2 ( 0x4UL << TKEY_DIVR_SMPCLKDIV_Pos ) +#define TKEY_DIVR_SMPCLKDIV_3 ( 0x8UL << TKEY_DIVR_SMPCLKDIV_Pos ) +#define TKEY_DIVR_SMPCLKDIV_4 ( 0x10UL << TKEY_DIVR_SMPCLKDIV_Pos ) +#define TKEY_DIVR_SMPCLKDIV_5 ( 0x20UL << TKEY_DIVR_SMPCLKDIV_Pos ) +#define TKEY_DIVR_SMPCLKDIV_6 ( 0x40UL << TKEY_DIVR_SMPCLKDIV_Pos ) +#define TKEY_DIVR_SMPCLKDIV_7 ( 0x80UL << TKEY_DIVR_SMPCLKDIV_Pos ) + + +/*************** Bits definition for TKEY_SCCR **********************/ + +#define TKEY_SCCR_SW1H_Pos ( 8U ) +#define TKEY_SCCR_SW1H_Msk ( 0xffUL << TKEY_SCCR_SW1H_Pos ) +#define TKEY_SCCR_SW1H ( TKEY_SCCR_SW1H_Msk ) +#define TKEY_SCCR_SW1H_0 ( 0x1UL << TKEY_SCCR_SW1H_Pos ) +#define TKEY_SCCR_SW1H_1 ( 0x2UL << TKEY_SCCR_SW1H_Pos ) +#define TKEY_SCCR_SW1H_2 ( 0x4UL << TKEY_SCCR_SW1H_Pos ) +#define TKEY_SCCR_SW1H_3 ( 0x8UL << TKEY_SCCR_SW1H_Pos ) +#define TKEY_SCCR_SW1H_4 ( 0x10UL << TKEY_SCCR_SW1H_Pos ) +#define TKEY_SCCR_SW1H_5 ( 0x20UL << TKEY_SCCR_SW1H_Pos ) +#define TKEY_SCCR_SW1H_6 ( 0x40UL << TKEY_SCCR_SW1H_Pos ) +#define TKEY_SCCR_SW1H_7 ( 0x80UL << TKEY_SCCR_SW1H_Pos ) + +#define TKEY_SCCR_SW1L_Pos ( 0U ) +#define TKEY_SCCR_SW1L_Msk ( 0xffUL << TKEY_SCCR_SW1L_Pos ) +#define TKEY_SCCR_SW1L ( TKEY_SCCR_SW1L_Msk ) +#define TKEY_SCCR_SW1L_0 ( 0x1UL << TKEY_SCCR_SW1L_Pos ) +#define TKEY_SCCR_SW1L_1 ( 0x2UL << TKEY_SCCR_SW1L_Pos ) +#define TKEY_SCCR_SW1L_2 ( 0x4UL << TKEY_SCCR_SW1L_Pos ) +#define TKEY_SCCR_SW1L_3 ( 0x8UL << TKEY_SCCR_SW1L_Pos ) +#define TKEY_SCCR_SW1L_4 ( 0x10UL << TKEY_SCCR_SW1L_Pos ) +#define TKEY_SCCR_SW1L_5 ( 0x20UL << TKEY_SCCR_SW1L_Pos ) +#define TKEY_SCCR_SW1L_6 ( 0x40UL << TKEY_SCCR_SW1L_Pos ) +#define TKEY_SCCR_SW1L_7 ( 0x80UL << TKEY_SCCR_SW1L_Pos ) + + +/*************** Bits definition for TKEY_TSETR **********************/ + +#define TKEY_TSETR_TEST_Pos ( 4U ) +#define TKEY_TSETR_TEST_Msk ( 0xfffUL << TKEY_TSETR_TEST_Pos ) +#define TKEY_TSETR_TEST ( TKEY_TSETR_TEST_Msk ) +#define TKEY_TSETR_TEST_0 ( 0x1UL << TKEY_TSETR_TEST_Pos ) +#define TKEY_TSETR_TEST_1 ( 0x2UL << TKEY_TSETR_TEST_Pos ) +#define TKEY_TSETR_TEST_2 ( 0x4UL << TKEY_TSETR_TEST_Pos ) +#define TKEY_TSETR_TEST_3 ( 0x8UL << TKEY_TSETR_TEST_Pos ) +#define TKEY_TSETR_TEST_4 ( 0x10UL << TKEY_TSETR_TEST_Pos ) +#define TKEY_TSETR_TEST_5 ( 0x20UL << TKEY_TSETR_TEST_Pos ) +#define TKEY_TSETR_TEST_6 ( 0x40UL << TKEY_TSETR_TEST_Pos ) +#define TKEY_TSETR_TEST_7 ( 0x80UL << TKEY_TSETR_TEST_Pos ) + +#define TKEY_TSETR_CST_Pos ( 0U ) +#define TKEY_TSETR_CST_Msk ( 0xfUL << TKEY_TSETR_CST_Pos ) +#define TKEY_TSETR_CST ( TKEY_TSETR_CST_Msk ) +#define TKEY_TSETR_CST_0 ( 0x1UL << TKEY_TSETR_CST_Pos ) +#define TKEY_TSETR_CST_1 ( 0x2UL << TKEY_TSETR_CST_Pos ) +#define TKEY_TSETR_CST_2 ( 0x4UL << TKEY_TSETR_CST_Pos ) +#define TKEY_TSETR_CST_3 ( 0x8UL << TKEY_TSETR_CST_Pos ) + + +/*************** Bits definition for TKEY_CXENR **********************/ + +#define TKEY_CXENR_CX15EN_Pos ( 15U ) +#define TKEY_CXENR_CX15EN_Msk ( 0x1UL << TKEY_CXENR_CX15EN_Pos ) +#define TKEY_CXENR_CX15EN ( TKEY_CXENR_CX15EN_Msk ) + +#define TKEY_CXENR_CX14EN_Pos ( 14U ) +#define TKEY_CXENR_CX14EN_Msk ( 0x1UL << TKEY_CXENR_CX14EN_Pos ) +#define TKEY_CXENR_CX14EN ( TKEY_CXENR_CX14EN_Msk ) + +#define TKEY_CXENR_CX13EN_Pos ( 13U ) +#define TKEY_CXENR_CX13EN_Msk ( 0x1UL << TKEY_CXENR_CX13EN_Pos ) +#define TKEY_CXENR_CX13EN ( TKEY_CXENR_CX13EN_Msk ) + +#define TKEY_CXENR_CX12EN_Pos ( 12U ) +#define TKEY_CXENR_CX12EN_Msk ( 0x1UL << TKEY_CXENR_CX12EN_Pos ) +#define TKEY_CXENR_CX12EN ( TKEY_CXENR_CX12EN_Msk ) + +#define TKEY_CXENR_CX11EN_Pos ( 11U ) +#define TKEY_CXENR_CX11EN_Msk ( 0x1UL << TKEY_CXENR_CX11EN_Pos ) +#define TKEY_CXENR_CX11EN ( TKEY_CXENR_CX11EN_Msk ) + +#define TKEY_CXENR_CX10EN_Pos ( 10U ) +#define TKEY_CXENR_CX10EN_Msk ( 0x1UL << TKEY_CXENR_CX10EN_Pos ) +#define TKEY_CXENR_CX10EN ( TKEY_CXENR_CX10EN_Msk ) + +#define TKEY_CXENR_CX9EN_Pos ( 9U ) +#define TKEY_CXENR_CX9EN_Msk ( 0x1UL << TKEY_CXENR_CX9EN_Pos ) +#define TKEY_CXENR_CX9EN ( TKEY_CXENR_CX9EN_Msk ) + +#define TKEY_CXENR_CX8EN_Pos ( 8U ) +#define TKEY_CXENR_CX8EN_Msk ( 0x1UL << TKEY_CXENR_CX8EN_Pos ) +#define TKEY_CXENR_CX8EN ( TKEY_CXENR_CX8EN_Msk ) + +#define TKEY_CXENR_CX7EN_Pos ( 7U ) +#define TKEY_CXENR_CX7EN_Msk ( 0x1UL << TKEY_CXENR_CX7EN_Pos ) +#define TKEY_CXENR_CX7EN ( TKEY_CXENR_CX7EN_Msk ) + +#define TKEY_CXENR_CX6EN_Pos ( 6U ) +#define TKEY_CXENR_CX6EN_Msk ( 0x1UL << TKEY_CXENR_CX6EN_Pos ) +#define TKEY_CXENR_CX6EN ( TKEY_CXENR_CX6EN_Msk ) + +#define TKEY_CXENR_CX5EN_Pos ( 5U ) +#define TKEY_CXENR_CX5EN_Msk ( 0x1UL << TKEY_CXENR_CX5EN_Pos ) +#define TKEY_CXENR_CX5EN ( TKEY_CXENR_CX5EN_Msk ) + +#define TKEY_CXENR_CX4EN_Pos ( 4U ) +#define TKEY_CXENR_CX4EN_Msk ( 0x1UL << TKEY_CXENR_CX4EN_Pos ) +#define TKEY_CXENR_CX4EN ( TKEY_CXENR_CX4EN_Msk ) + +#define TKEY_CXENR_CX3EN_Pos ( 3U ) +#define TKEY_CXENR_CX3EN_Msk ( 0x1UL << TKEY_CXENR_CX3EN_Pos ) +#define TKEY_CXENR_CX3EN ( TKEY_CXENR_CX3EN_Msk ) + +#define TKEY_CXENR_CX2EN_Pos ( 2U ) +#define TKEY_CXENR_CX2EN_Msk ( 0x1UL << TKEY_CXENR_CX2EN_Pos ) +#define TKEY_CXENR_CX2EN ( TKEY_CXENR_CX2EN_Msk ) + +#define TKEY_CXENR_CX1EN_Pos ( 1U ) +#define TKEY_CXENR_CX1EN_Msk ( 0x1UL << TKEY_CXENR_CX1EN_Pos ) +#define TKEY_CXENR_CX1EN ( TKEY_CXENR_CX1EN_Msk ) + +#define TKEY_CXENR_CX0EN_Pos ( 0U ) +#define TKEY_CXENR_CX0EN_Msk ( 0x1UL << TKEY_CXENR_CX0EN_Pos ) +#define TKEY_CXENR_CX0EN ( TKEY_CXENR_CX0EN_Msk ) + + +/*************** Bits definition for TKEY_DR **********************/ + +#define TKEY_DR_DATA_Pos ( 0U ) +#define TKEY_DR_DATA_Msk ( 0xffffUL << TKEY_DR_DATA_Pos ) +#define TKEY_DR_DATA ( TKEY_DR_DATA_Msk ) + + +/*************** Bits definition for TKEY_THx **********************/ + +#define TKEY_THX_DNX_Pos ( 0U ) +#define TKEY_THX_DNX_Msk ( 0xffUL << TKEY_THX_DNX_Pos ) +#define TKEY_THX_DNX ( TKEY_THX_DNX_Msk ) + + +/*************** Bits definition for TKEY_CHx **********************/ + +#define TKEY_CHX_CNTX_Pos ( 0U ) +#define TKEY_CHX_CNTX_Msk ( 0xffffUL << TKEY_CHX_CNTX_Pos ) +#define TKEY_CHX_CNTX ( TKEY_CHX_CNTX_Msk ) + + +/*************** Bits definition for TKEY_CFLTR **********************/ + +#define TKEY_CFLTR_CFLTNUM_Pos ( 1U ) +#define TKEY_CFLTR_CFLTNUM_Msk ( 0xfUL << TKEY_CFLTR_CFLTNUM_Pos ) +#define TKEY_CFLTR_CFLTNUM ( TKEY_CFLTR_CFLTNUM_Msk ) +#define TKEY_CFLTR_CFLTNUM_0 ( 0x1UL << TKEY_CFLTR_CFLTNUM_Pos ) +#define TKEY_CFLTR_CFLTNUM_1 ( 0x2UL << TKEY_CFLTR_CFLTNUM_Pos ) +#define TKEY_CFLTR_CFLTNUM_2 ( 0x4UL << TKEY_CFLTR_CFLTNUM_Pos ) +#define TKEY_CFLTR_CFLTNUM_3 ( 0x8UL << TKEY_CFLTR_CFLTNUM_Pos ) + +#define TKEY_CFLTR_CFLTEN_Pos ( 0U ) +#define TKEY_CFLTR_CFLTEN_Msk ( 0x1UL << TKEY_CFLTR_CFLTEN_Pos ) +#define TKEY_CFLTR_CFLTEN ( TKEY_CFLTR_CFLTEN_Msk ) + + +/*************** Bits definition for TKEY_NSETR **********************/ + +#define TKEY_NSETR_CHGNUM_Pos ( 0U ) +#define TKEY_NSETR_CHGNUM_Msk ( 0xffffUL << TKEY_NSETR_CHGNUM_Pos ) +#define TKEY_NSETR_CHGNUM ( TKEY_NSETR_CHGNUM_Msk ) + + +/*************** Bits definition for TKEY_TWAITR **********************/ + +#define TKEY_TWAITR_WAITTIME_Pos ( 0U ) +#define TKEY_TWAITR_WAITTIME_Msk ( 0xffffUL << TKEY_TWAITR_WAITTIME_Pos ) +#define TKEY_TWAITR_WAITTIME ( TKEY_TWAITR_WAITTIME_Msk ) + + +/*************** Bits definition for TKEY_MUTUALR **********************/ + +#define TKEY_MUTUALR_TXNUM_Pos ( 11U ) +#define TKEY_MUTUALR_TXNUM_Msk ( 0x1fUL << TKEY_MUTUALR_TXNUM_Pos ) +#define TKEY_MUTUALR_TXNUM ( TKEY_MUTUALR_TXNUM_Msk ) + +#define TKEY_MUTUALR_MTXDLY_Pos ( 3U ) +#define TKEY_MUTUALR_MTXDLY_Msk ( 0xffUL << TKEY_MUTUALR_MTXDLY_Pos ) +#define TKEY_MUTUALR_MTXDLY ( TKEY_MUTUALR_MTXDLY_Msk ) + +#define TKEY_MUTUALR_MTXDLYEN_Pos ( 2U ) +#define TKEY_MUTUALR_MTXDLYEN_Msk ( 0x1UL << TKEY_MUTUALR_MTXDLYEN_Pos ) +#define TKEY_MUTUALR_MTXDLYEN ( TKEY_MUTUALR_MTXDLYEN_Msk ) + +#define TKEY_MUTUALR_MTXRST_Pos ( 1U ) +#define TKEY_MUTUALR_MTXRST_Msk ( 0x1UL << TKEY_MUTUALR_MTXRST_Pos ) +#define TKEY_MUTUALR_MTXRST ( TKEY_MUTUALR_MTXRST_Msk ) + +#define TKEY_MUTUALR_MUTUALEN_Pos ( 0U ) +#define TKEY_MUTUALR_MUTUALEN_Msk ( 0x1UL << TKEY_MUTUALR_MUTUALEN_Pos ) +#define TKEY_MUTUALR_MUTUALEN ( TKEY_MUTUALR_MUTUALEN_Msk ) + + +/*************** Bits definition for TKEY_TXENR1 **********************/ + +#define TKEY_TXENR1_TX15EN_Pos ( 15U ) +#define TKEY_TXENR1_TX15EN_Msk ( 0x1UL << TKEY_TXENR1_TX15EN_Pos ) +#define TKEY_TXENR1_TX15EN ( TKEY_TXENR1_TX15EN_Msk ) + +#define TKEY_TXENR1_TX14EN_Pos ( 14U ) +#define TKEY_TXENR1_TX14EN_Msk ( 0x1UL << TKEY_TXENR1_TX14EN_Pos ) +#define TKEY_TXENR1_TX14EN ( TKEY_TXENR1_TX14EN_Msk ) + +#define TKEY_TXENR1_TX13EN_Pos ( 13U ) +#define TKEY_TXENR1_TX13EN_Msk ( 0x1UL << TKEY_TXENR1_TX13EN_Pos ) +#define TKEY_TXENR1_TX13EN ( TKEY_TXENR1_TX13EN_Msk ) + +#define TKEY_TXENR1_TX12EN_Pos ( 12U ) +#define TKEY_TXENR1_TX12EN_Msk ( 0x1UL << TKEY_TXENR1_TX12EN_Pos ) +#define TKEY_TXENR1_TX12EN ( TKEY_TXENR1_TX12EN_Msk ) + +#define TKEY_TXENR1_TX11EN_Pos ( 11U ) +#define TKEY_TXENR1_TX11EN_Msk ( 0x1UL << TKEY_TXENR1_TX11EN_Pos ) +#define TKEY_TXENR1_TX11EN ( TKEY_TXENR1_TX11EN_Msk ) + +#define TKEY_TXENR1_TX10EN_Pos ( 10U ) +#define TKEY_TXENR1_TX10EN_Msk ( 0x1UL << TKEY_TXENR1_TX10EN_Pos ) +#define TKEY_TXENR1_TX10EN ( TKEY_TXENR1_TX10EN_Msk ) + +#define TKEY_TXENR1_TX9EN_Pos ( 9U ) +#define TKEY_TXENR1_TX9EN_Msk ( 0x1UL << TKEY_TXENR1_TX9EN_Pos ) +#define TKEY_TXENR1_TX9EN ( TKEY_TXENR1_TX9EN_Msk ) + +#define TKEY_TXENR1_TX8EN_Pos ( 8U ) +#define TKEY_TXENR1_TX8EN_Msk ( 0x1UL << TKEY_TXENR1_TX8EN_Pos ) +#define TKEY_TXENR1_TX8EN ( TKEY_TXENR1_TX8EN_Msk ) + +#define TKEY_TXENR1_TX7EN_Pos ( 7U ) +#define TKEY_TXENR1_TX7EN_Msk ( 0x1UL << TKEY_TXENR1_TX7EN_Pos ) +#define TKEY_TXENR1_TX7EN ( TKEY_TXENR1_TX7EN_Msk ) + +#define TKEY_TXENR1_TX6EN_Pos ( 6U ) +#define TKEY_TXENR1_TX6EN_Msk ( 0x1UL << TKEY_TXENR1_TX6EN_Pos ) +#define TKEY_TXENR1_TX6EN ( TKEY_TXENR1_TX6EN_Msk ) + +#define TKEY_TXENR1_TX5EN_Pos ( 5U ) +#define TKEY_TXENR1_TX5EN_Msk ( 0x1UL << TKEY_TXENR1_TX5EN_Pos ) +#define TKEY_TXENR1_TX5EN ( TKEY_TXENR1_TX5EN_Msk ) + +#define TKEY_TXENR1_TX4EN_Pos ( 4U ) +#define TKEY_TXENR1_TX4EN_Msk ( 0x1UL << TKEY_TXENR1_TX4EN_Pos ) +#define TKEY_TXENR1_TX4EN ( TKEY_TXENR1_TX4EN_Msk ) + +#define TKEY_TXENR1_TX3EN_Pos ( 3U ) +#define TKEY_TXENR1_TX3EN_Msk ( 0x1UL << TKEY_TXENR1_TX3EN_Pos ) +#define TKEY_TXENR1_TX3EN ( TKEY_TXENR1_TX3EN_Msk ) + +#define TKEY_TXENR1_TX2EN_Pos ( 2U ) +#define TKEY_TXENR1_TX2EN_Msk ( 0x1UL << TKEY_TXENR1_TX2EN_Pos ) +#define TKEY_TXENR1_TX2EN ( TKEY_TXENR1_TX2EN_Msk ) + +#define TKEY_TXENR1_TX1EN_Pos ( 1U ) +#define TKEY_TXENR1_TX1EN_Msk ( 0x1UL << TKEY_TXENR1_TX1EN_Pos ) +#define TKEY_TXENR1_TX1EN ( TKEY_TXENR1_TX1EN_Msk ) + +#define TKEY_TXENR1_TX0EN_Pos ( 0U ) +#define TKEY_TXENR1_TX0EN_Msk ( 0x1UL << TKEY_TXENR1_TX0EN_Pos ) +#define TKEY_TXENR1_TX0EN ( TKEY_TXENR1_TX0EN_Msk ) + + +/*************** Bits definition for TKEY_TXENR1 **********************/ + + +#define TKEY_TXENR2_TX27EN_Pos ( 11U ) +#define TKEY_TXENR2_TX27EN_Msk ( 0x1UL << TKEY_TXENR2_TX27EN_Pos ) +#define TKEY_TXENR2_TX27EN ( TKEY_TXENR2_TX27EN_Msk ) + +#define TKEY_TXENR2_TX26EN_Pos ( 10U ) +#define TKEY_TXENR2_TX26EN_Msk ( 0x1UL << TKEY_TXENR2_TX26EN_Pos ) +#define TKEY_TXENR2_TX26EN ( TKEY_TXENR1_TX26EN_Msk ) + +#define TKEY_TXENR2_TX25EN_Pos ( 9U ) +#define TKEY_TXENR2_TX25EN_Msk ( 0x1UL << TKEY_TXENR2_TX25EN_Pos ) +#define TKEY_TXENR2_TX25EN ( TKEY_TXENR2_TX25EN_Msk ) + +#define TKEY_TXENR2_TX24EN_Pos ( 8U ) +#define TKEY_TXENR2_TX24EN_Msk ( 0x1UL << TKEY_TXENR2_TX24EN_Pos ) +#define TKEY_TXENR2_TX24EN ( TKEY_TXENR2_TX24EN_Msk ) + +#define TKEY_TXENR2_TX23EN_Pos ( 7U ) +#define TKEY_TXENR2_TX23EN_Msk ( 0x1UL << TKEY_TXENR2_TX23EN_Pos ) +#define TKEY_TXENR2_TX23EN ( TKEY_TXENR2_TX23EN_Msk ) + +#define TKEY_TXENR2_TX22EN_Pos ( 6U ) +#define TKEY_TXENR2_TX22EN_Msk ( 0x1UL << TKEY_TXENR2_TX22EN_Pos ) +#define TKEY_TXENR2_TX22EN ( TKEY_TXENR2_TX22EN_Msk ) + +#define TKEY_TXENR2_TX21EN_Pos ( 5U ) +#define TKEY_TXENR2_TX21EN_Msk ( 0x1UL << TKEY_TXENR2_TX21EN_Pos ) +#define TKEY_TXENR2_TX21EN ( TKEY_TXENR2_TX21EN_Msk ) + +#define TKEY_TXENR2_TX20EN_Pos ( 4U ) +#define TKEY_TXENR2_TX20EN_Msk ( 0x1UL << TKEY_TXENR2_TX20EN_Pos ) +#define TKEY_TXENR2_TX20EN TKEY_TXENR2_TX20EN_Msk ) + +#define TKEY_TXENR2_TX19EN_Pos ( 3U ) +#define TKEY_TXENR2_TX19EN_Msk ( 0x1UL << TKEY_TXENR2_TX19EN_Pos ) +#define TKEY_TXENR2_TX19EN ( TKEY_TXENR2_TX19EN_Msk ) + +#define TKEY_TXENR2_TX18EN_Pos ( 2U ) +#define TKEY_TXENR2_TX18EN_Msk ( 0x1UL << TKEY_TXENR2_TX18EN_Pos ) +#define TKEY_TXENR2_TX18EN ( TKEY_TXENR2_TX18EN_Msk ) + +#define TKEY_TXENR2_TX17EN_Pos ( 1U ) +#define TKEY_TXENR2_TX17EN_Msk ( 0x1UL << TKEY_TXENR2_TX17EN_Pos ) +#define TKEY_TXENR2_TX17EN ( TKEY_TXENR2_TX17EN_Msk ) + +#define TKEY_TXENR2_TX16EN_Pos ( 0U ) +#define TKEY_TXENR2_TX16EN_Msk ( 0x1UL << TKEY_TXENR2_TX16EN_Pos ) +#define TKEY_TXENR2_TX16EN ( TKEY_TXENR2_TX16EN_Msk ) + + +/*************** Bits definition for OSPI_DAT **********************/ + +#define OSPI_TX_DAT_TX_DAT2_Pos ( 8U ) +#define OSPI_TX_DAT_TX_DAT2_Msk ( 0xffffffUL << OSPI_TX_DAT_TX_DAT2_Pos ) +#define OSPI_TX_DAT_TX_DAT2 ( OSPI_TX_DAT_TX_DAT2_Msk ) + +#define OSPI_TX_RX_DAT_Pos ( 0U ) +#define OSPI_TX_RX_DAT_Msk ( 0xffUL << OSPI_TX_DAT_TX_DAT1_Pos ) +#define OSPI_TX_RX_DAT ( OSPI_TX_DAT_TX_DAT1_Msk ) + + +/*************** Bits definition for OSPI_BAUD **********************/ + +#define OSPI_BAUD_DIV2_Pos ( 8U ) +#define OSPI_BAUD_DIV2_Msk ( 0xffUL << OSPI_BAUD_DIV2_Pos ) +#define OSPI_BAUD_DIV2 ( OSPI_BAUD_DIV2_Msk ) +#define OSPI_BAUD_DIV2_0 ( 0x1UL << OSPI_BAUD_DIV2_Pos ) +#define OSPI_BAUD_DIV2_1 ( 0x2UL << OSPI_BAUD_DIV2_Pos ) +#define OSPI_BAUD_DIV2_2 ( 0x4UL << OSPI_BAUD_DIV2_Pos ) +#define OSPI_BAUD_DIV2_3 ( 0x8UL << OSPI_BAUD_DIV2_Pos ) +#define OSPI_BAUD_DIV2_4 ( 0x10UL << OSPI_BAUD_DIV2_Pos ) +#define OSPI_BAUD_DIV2_5 ( 0x20UL << OSPI_BAUD_DIV2_Pos ) +#define OSPI_BAUD_DIV2_6 ( 0x40UL << OSPI_BAUD_DIV2_Pos ) +#define OSPI_BAUD_DIV2_7 ( 0x80UL << OSPI_BAUD_DIV2_Pos ) + +#define OSPI_BAUD_DIV1_Pos ( 0U ) +#define OSPI_BAUD_DIV1_Msk ( 0xffUL << OSPI_BAUD_DIV1_Pos ) +#define OSPI_BAUD_DIV1 ( OSPI_BAUD_DIV1_Msk ) +#define OSPI_BAUD_DIV1_0 ( 0x1UL << OSPI_BAUD_DIV1_Pos ) +#define OSPI_BAUD_DIV1_1 ( 0x2UL << OSPI_BAUD_DIV1_Pos ) +#define OSPI_BAUD_DIV1_2 ( 0x4UL << OSPI_BAUD_DIV1_Pos ) +#define OSPI_BAUD_DIV1_3 ( 0x8UL << OSPI_BAUD_DIV1_Pos ) +#define OSPI_BAUD_DIV1_4 ( 0x10UL << OSPI_BAUD_DIV1_Pos ) +#define OSPI_BAUD_DIV1_5 ( 0x20UL << OSPI_BAUD_DIV1_Pos ) +#define OSPI_BAUD_DIV1_6 ( 0x40UL << OSPI_BAUD_DIV1_Pos ) +#define OSPI_BAUD_DIV1_7 ( 0x80UL << OSPI_BAUD_DIV1_Pos ) + + +/*************** Bits definition for OSPI_CTL **********************/ + +#define OSPI_CTL_FR_MODE_Pos ( 30U ) +#define OSPI_CTL_FR_MODE_Msk ( 0x3UL << OSPI_CTL_FR_MODE_Pos ) +#define OSPI_CTL_FR_MODE ( OSPI_CTL_FR_MODE_Msk ) +#define OSPI_CTL_FR_MODE_0 ( 0x1UL << OSPI_CTL_FR_MODE_Pos ) +#define OSPI_CTL_FR_MODE_1 ( 0x2UL << OSPI_CTL_FR_MODE_Pos ) + +#define OSPI_CTL_FW_MODE_Pos ( 28U ) +#define OSPI_CTL_FW_MODE_Msk ( 0x3UL << OSPI_CTL_FW_MODE_Pos ) +#define OSPI_CTL_FW_MODE ( OSPI_CTL_FW_MODE_Msk ) +#define OSPI_CTL_FW_MODE_0 ( 0x1UL << OSPI_CTL_FW_MODE_Pos ) +#define OSPI_CTL_FW_MODE_1 ( 0x2UL << OSPI_CTL_FW_MODE_Pos ) + +#define OSPI_CTL_DMCTRL_Pos ( 27U ) +#define OSPI_CTL_DMCTRL_Msk ( 0x1UL << OSPI_CTL_DMCTRL_Pos ) +#define OSPI_CTL_DMCTRL ( OSPI_CTL_DMCTRL_Msk ) + +#define OSPI_CTL_DM_EN_Pos ( 26U ) +#define OSPI_CTL_DM_EN_Msk ( 0x1UL << OSPI_CTL_DM_EN_Pos ) +#define OSPI_CTL_DM_EN ( OSPI_CTL_DM_EN_Msk ) + +#define OSPI_CTL_APMD_CLK_Pos ( 23U ) +#define OSPI_CTL_APMD_CLK_Msk ( 0x7UL << OSPI_CTL_APMD_CLK_Pos ) +#define OSPI_CTL_APMD_CLK ( OSPI_CTL_APMD_CLK_Msk ) +#define OSPI_CTL_APMD_CLK_0 ( 0x1UL << OSPI_CTL_APMD_CLK_Pos ) +#define OSPI_CTL_APMD_CLK_1 ( 0x2UL << OSPI_CTL_APMD_CLK_Pos ) +#define OSPI_CTL_APMD_CLK_2 ( 0x4UL << OSPI_CTL_APMD_CLK_Pos ) + +#define OSPI_CTL_MEM_MODE_Pos ( 21U ) +#define OSPI_CTL_MEM_MODE_Msk ( 0x3UL << OSPI_CTL_MEM_MODE_Pos ) +#define OSPI_CTL_MEM_MODE ( OSPI_CTL_MEM_MODE_Msk ) +#define OSPI_CTL_MEM_MODE_0 ( 0x1UL << OSPI_CTL_MEM_MODE_Pos ) +#define OSPI_CTL_MEM_MODE_1 ( 0x2UL << OSPI_CTL_MEM_MODE_Pos ) + +#define OSPI_CTL_CS_TIME_Pos ( 11U ) +#define OSPI_CTL_CS_TIME_Msk ( 0xffUL << OSPI_CTL_CS_TIME_Pos ) +#define OSPI_CTL_CS_TIME ( OSPI_CTL_CS_TIME_Msk ) +#define OSPI_CTL_CS_TIME_0 ( 0x1UL << OSPI_CTL_CS_TIME_Pos ) +#define OSPI_CTL_CS_TIME_1 ( 0x2UL << OSPI_CTL_CS_TIME_Pos ) +#define OSPI_CTL_CS_TIME_2 ( 0x4UL << OSPI_CTL_CS_TIME_Pos ) +#define OSPI_CTL_CS_TIME_3 ( 0x8UL << OSPI_CTL_CS_TIME_Pos ) +#define OSPI_CTL_CS_TIME_4 ( 0x10UL << OSPI_CTL_CS_TIME_Pos ) +#define OSPI_CTL_CS_TIME_5 ( 0x20UL << OSPI_CTL_CS_TIME_Pos ) +#define OSPI_CTL_CS_TIME_6 ( 0x40UL << OSPI_CTL_CS_TIME_Pos ) +#define OSPI_CTL_CS_TIME_7 ( 0x80UL << OSPI_CTL_CS_TIME_Pos ) + +#define OSPI_CTL_DQSOE_Pos ( 9U ) +#define OSPI_CTL_DQSOE_Msk ( 0x1UL << OSPI_CTL_DQSOE_Pos ) +#define OSPI_CTL_DQSOE ( OSPI_CTL_DQSOE_Msk ) + +#define OSPI_CTL_DTRM_Pos ( 8U ) +#define OSPI_CTL_DTRM_Msk ( 0x1UL << OSPI_CTL_DTRM_Pos ) +#define OSPI_CTL_DTRM ( OSPI_CTL_DTRM_Msk ) + +#define OSPI_CTL_IO_MODE_Pos ( 7U ) +#define OSPI_CTL_IO_MODE_Msk ( 0x1UL << OSPI_CTL_IO_MODE_Pos ) +#define OSPI_CTL_IO_MODE ( OSPI_CTL_IO_MODE_Msk ) + +#define OSPI_CTL_X_MODE_Pos ( 5U ) +#define OSPI_CTL_X_MODE_Msk ( 0x3UL << OSPI_CTL_X_MODE_Pos ) +#define OSPI_CTL_X_MODE ( OSPI_CTL_X_MODE_Msk ) +#define OSPI_CTL_X_MODE_0 ( 0x1UL << OSPI_CTL_X_MODE_Pos ) +#define OSPI_CTL_X_MODE_1 ( 0x2UL << OSPI_CTL_X_MODE_Pos ) + +#define OSPI_CTL_LSB_FIRST_Pos ( 4U ) +#define OSPI_CTL_LSB_FIRST_Msk ( 0x1UL << OSPI_CTL_LSB_FIRST_Pos ) +#define OSPI_CTL_LSB_FIRST ( OSPI_CTL_LSB_FIRST_Msk ) + +#define OSPI_CTL_CPOL_Pos ( 3U ) +#define OSPI_CTL_CPOL_Msk ( 0x1UL << OSPI_CTL_CPOL_Pos ) +#define OSPI_CTL_CPOL ( OSPI_CTL_CPOL_Msk ) + +#define OSPI_CTL_CPHA_Pos ( 2U ) +#define OSPI_CTL_CPHA_Msk ( 0x1UL << OSPI_CTL_CPHA_Pos ) +#define OSPI_CTL_CPHA ( OSPI_CTL_CPHA_Msk ) + +#define OSPI_CTL_MST_MODE_Pos ( 0U ) +#define OSPI_CTL_MST_MODE_Msk ( 0x1UL << OSPI_CTL_MST_MODE_Pos ) +#define OSPI_CTL_MST_MODE ( OSPI_CTL_MST_MODE_Msk ) + + +/*************** Bits definition for OSPI_TX_CTL **********************/ + +#define OSPI_TX_CTL_OUTDLY_Pos ( 16U ) +#define OSPI_TX_CTL_OUTDLY_Msk ( 0x3UL << OSPI_TX_CTL_OUTDLY_Pos ) +#define OSPI_TX_CTL_OUTDLY ( OSPI_TX_CTL_OUTDLY_Msk ) +#define OSPI_TX_CTL_OUTDLY_0 ( 0x1UL << OSPI_TX_CTL_OUTDLY_Pos ) +#define OSPI_TX_CTL_OUTDLY_1 ( 0x2UL << OSPI_TX_CTL_OUTDLY_Pos ) + +#define OSPI_TX_CTL_DUMMY_Pos ( 8U ) +#define OSPI_TX_CTL_DUMMY_Msk ( 0xffUL << OSPI_TX_CTL_DUMMY_Pos ) +#define OSPI_TX_CTL_DUMMY ( OSPI_TX_CTL_DUMMY_Msk ) +#define OSPI_TX_CTL_DUMMY_0 ( 0x1UL << OSPI_TX_CTL_DUMMY_Pos ) +#define OSPI_TX_CTL_DUMMY_1 ( 0x2UL << OSPI_TX_CTL_DUMMY_Pos ) +#define OSPI_TX_CTL_DUMMY_2 ( 0x4UL << OSPI_TX_CTL_DUMMY_Pos ) +#define OSPI_TX_CTL_DUMMY_3 ( 0x8UL << OSPI_TX_CTL_DUMMY_Pos ) +#define OSPI_TX_CTL_DUMMY_4 ( 0x10UL << OSPI_TX_CTL_DUMMY_Pos ) +#define OSPI_TX_CTL_DUMMY_5 ( 0x20UL << OSPI_TX_CTL_DUMMY_Pos ) +#define OSPI_TX_CTL_DUMMY_6 ( 0x40UL << OSPI_TX_CTL_DUMMY_Pos ) +#define OSPI_TX_CTL_DUMMY_7 ( 0x80UL << OSPI_TX_CTL_DUMMY_Pos ) + +#define OSPI_TX_CTL_TX_DMA_LEVEL_Pos ( 4U ) +#define OSPI_TX_CTL_TX_DMA_LEVEL_Msk ( 0xfUL << OSPI_TX_CTL_TX_DMA_LEVEL_Pos ) +#define OSPI_TX_CTL_TX_DMA_LEVEL ( OSPI_TX_CTL_TX_DMA_LEVEL_Msk ) +#define OSPI_TX_CTL_TX_DMA_LEVEL_0 ( 0x1UL << OSPI_TX_CTL_TX_DMA_LEVEL_Pos ) +#define OSPI_TX_CTL_TX_DMA_LEVEL_1 ( 0x2UL << OSPI_TX_CTL_TX_DMA_LEVEL_Pos ) +#define OSPI_TX_CTL_TX_DMA_LEVEL_2 ( 0x4UL << OSPI_TX_CTL_TX_DMA_LEVEL_Pos ) +#define OSPI_TX_CTL_TX_DMA_LEVEL_3 ( 0x8UL << OSPI_TX_CTL_TX_DMA_LEVEL_Pos ) + +#define OSPI_TX_CTL_TX_DMA_REQ_EN_Pos ( 3U ) +#define OSPI_TX_CTL_TX_DMA_REQ_EN_Msk ( 0x1UL << OSPI_TX_CTL_TX_DMA_REQ_EN_Pos ) +#define OSPI_TX_CTL_TX_DMA_REQ_EN ( OSPI_TX_CTL_TX_DMA_REQ_EN_Msk ) + +#define OSPI_TX_CTL_TX_FIFO_RESET_Pos ( 1U ) +#define OSPI_TX_CTL_TX_FIFO_RESET_Msk ( 0x1UL << OSPI_TX_CTL_TX_FIFO_RESET_Pos ) +#define OSPI_TX_CTL_TX_FIFO_RESET ( OSPI_TX_CTL_TX_FIFO_RESET_Msk ) + +#define OSPI_TX_CTL_TX_EN_Pos ( 0U ) +#define OSPI_TX_CTL_TX_EN_Msk ( 0x1UL << OSPI_TX_CTL_TX_EN_Pos ) +#define OSPI_TX_CTL_TX_EN ( OSPI_TX_CTL_TX_EN_Msk ) + + +/*************** Bits definition for OSPI_RX_CTL **********************/ + +#define OSPI_RX_CTL_SSHIFT_Pos ( 28U ) +#define OSPI_RX_CTL_SSHIFT_Msk ( 0xfUL << OSPI_RX_CTL_SSHIFT_Pos ) +#define OSPI_RX_CTL_SSHIFT ( OSPI_RX_CTL_SSHIFT_Msk ) +#define OSPI_RX_CTL_SSHIFT_0 ( 0x1UL << OSPI_RX_CTL_SSHIFT_Pos ) +#define OSPI_RX_CTL_SSHIFT_1 ( 0x2UL << OSPI_RX_CTL_SSHIFT_Pos ) +#define OSPI_RX_CTL_SSHIFT_2 ( 0x4UL << OSPI_RX_CTL_SSHIFT_Pos ) +#define OSPI_RX_CTL_SSHIFT_3 ( 0x8UL << OSPI_RX_CTL_SSHIFT_Pos ) + +#define OSPI_RX_CTL_MSDHA_X7_Pos ( 26U ) +#define OSPI_RX_CTL_MSDHA_X7_Msk ( 0x1UL << OSPI_RX_CTL_MSDHA_X7_Pos ) +#define OSPI_RX_CTL_MSDHA_X7 ( OSPI_RX_CTL_MSDHA_X7_Msk ) + +#define OSPI_RX_CTL_MSDHA_X6_Pos ( 25U ) +#define OSPI_RX_CTL_MSDHA_X6_Msk ( 0x1UL << OSPI_RX_CTL_MSDHA_X6_Pos ) +#define OSPI_RX_CTL_MSDHA_X6 ( OSPI_RX_CTL_MSDHA_X6_Msk ) + +#define OSPI_RX_CTL_MSDHA_X5_Pos ( 24U ) +#define OSPI_RX_CTL_MSDHA_X5_Msk ( 0x1UL << OSPI_RX_CTL_MSDHA_X5_Pos ) +#define OSPI_RX_CTL_MSDHA_X5 ( OSPI_RX_CTL_MSDHA_X5_Msk ) + +#define OSPI_RX_CTL_MSDHA_X4_Pos ( 23U ) +#define OSPI_RX_CTL_MSDHA_X4_Msk ( 0x1UL << OSPI_RX_CTL_MSDHA_X4_Pos ) +#define OSPI_RX_CTL_MSDHA_X4 ( OSPI_RX_CTL_MSDHA_X4_Msk ) + +#define OSPI_RX_CTL_MSDHA_X3_Pos ( 22U ) +#define OSPI_RX_CTL_MSDHA_X3_Msk ( 0x1UL << OSPI_RX_CTL_MSDHA_X3_Pos ) +#define OSPI_RX_CTL_MSDHA_X3 ( OSPI_RX_CTL_MSDHA_X3_Msk ) + +#define OSPI_RX_CTL_MSDHA_X2_Pos ( 21U ) +#define OSPI_RX_CTL_MSDHA_X2_Msk ( 0x1UL << OSPI_RX_CTL_MSDHA_X2_Pos ) +#define OSPI_RX_CTL_MSDHA_X2 ( OSPI_RX_CTL_MSDHA_X2_Msk ) + +#define OSPI_RX_CTL_MSDHA_X1_Pos ( 20U ) +#define OSPI_RX_CTL_MSDHA_X1_Msk ( 0x1UL << OSPI_RX_CTL_MSDHA_X1_Pos ) +#define OSPI_RX_CTL_MSDHA_X1 ( OSPI_RX_CTL_MSDHA_X1_Msk ) + +#define OSPI_RX_CTL_MSDHA_X0_Pos ( 19U ) +#define OSPI_RX_CTL_MSDHA_X0_Msk ( 0x1UL << OSPI_RX_CTL_MSDHA_X0_Pos ) +#define OSPI_RX_CTL_MSDHA_X0 ( OSPI_RX_CTL_MSDHA_X0_Msk ) + +#define OSPI_RX_CTL_MSDA_X7_Pos ( 18U ) +#define OSPI_RX_CTL_MSDA_X7_Msk ( 0x1UL << OSPI_RX_CTL_MSDA_X7_Pos ) +#define OSPI_RX_CTL_MSDA_X7 ( OSPI_RX_CTL_MSDA_X7_Msk ) + +#define OSPI_RX_CTL_MSDA_X6_Pos ( 17U ) +#define OSPI_RX_CTL_MSDA_X6_Msk ( 0x1UL << OSPI_RX_CTL_MSDA_X6_Pos ) +#define OSPI_RX_CTL_MSDA_X6 ( OSPI_RX_CTL_MSDA_X6_Msk ) + +#define OSPI_RX_CTL_MSDA_X5_Pos ( 16U ) +#define OSPI_RX_CTL_MSDA_X5_Msk ( 0x1UL << OSPI_RX_CTL_MSDA_X5_Pos ) +#define OSPI_RX_CTL_MSDA_X5 ( OSPI_RX_CTL_MSDA_X5_Msk ) + +#define OSPI_RX_CTL_MSDA_X4_Pos ( 15U ) +#define OSPI_RX_CTL_MSDA_X4_Msk ( 0x1UL << OSPI_RX_CTL_MSDA_X4_Pos ) +#define OSPI_RX_CTL_MSDA_X4 ( OSPI_RX_CTL_MSDA_X4_Msk ) + +#define OSPI_RX_CTL_MSDA_X3_Pos ( 14U ) +#define OSPI_RX_CTL_MSDA_X3_Msk ( 0x1UL << OSPI_RX_CTL_MSDA_X3_Pos ) +#define OSPI_RX_CTL_MSDA_X3 ( OSPI_RX_CTL_MSDA_X3_Msk ) + +#define OSPI_RX_CTL_MSDA_X2_Pos ( 13U ) +#define OSPI_RX_CTL_MSDA_X2_Msk ( 0x1UL << OSPI_RX_CTL_MSDA_X2_Pos ) +#define OSPI_RX_CTL_MSDA_X2 ( OSPI_RX_CTL_MSDA_X2_Msk ) + +#define OSPI_RX_CTL_MSDA_X1_Pos ( 12U ) +#define OSPI_RX_CTL_MSDA_X1_Msk ( 0x1UL << OSPI_RX_CTL_MSDA_X1_Pos ) +#define OSPI_RX_CTL_MSDA_X1 ( OSPI_RX_CTL_MSDA_X1_Msk ) + +#define OSPI_RX_CTL_MSDA_X0_Pos ( 11U ) +#define OSPI_RX_CTL_MSDA_X0_Msk ( 0x1UL << OSPI_RX_CTL_MSDA_X0_Pos ) +#define OSPI_RX_CTL_MSDA_X0 ( OSPI_RX_CTL_MSDA_X0_Msk ) + +#define OSPI_RX_CTL_MSDA_EN_Pos ( 10U ) +#define OSPI_RX_CTL_MSDA_EN_Msk ( 0x1UL << OSPI_RX_CTL_MSDA_EN_Pos ) +#define OSPI_RX_CTL_MSDA_EN ( OSPI_RX_CTL_MSDA_EN_Msk ) + +#define OSPI_RX_CTL_DQS_SAMP_EN_Pos ( 8U ) +#define OSPI_RX_CTL_DQS_SAMP_EN_Msk ( 0x1UL << OSPI_RX_CTL_DQS_SAMP_EN_Pos ) +#define OSPI_RX_CTL_DQS_SAMP_EN ( OSPI_RX_CTL_DQS_SAMP_EN_Msk ) + +#define OSPI_RX_CTL_RX_DMA_LEVEL_Pos ( 4U ) +#define OSPI_RX_CTL_RX_DMA_LEVEL_Msk ( 0xfUL << OSPI_RX_CTL_RX_DMA_LEVEL_Pos ) +#define OSPI_RX_CTL_RX_DMA_LEVEL ( OSPI_RX_CTL_RX_DMA_LEVEL_Msk ) +#define OSPI_RX_CTL_RX_DMA_LEVEL_0 ( 0x1UL << OSPI_RX_CTL_RX_DMA_LEVEL_Pos ) +#define OSPI_RX_CTL_RX_DMA_LEVEL_1 ( 0x2UL << OSPI_RX_CTL_RX_DMA_LEVEL_Pos ) +#define OSPI_RX_CTL_RX_DMA_LEVEL_2 ( 0x4UL << OSPI_RX_CTL_RX_DMA_LEVEL_Pos ) +#define OSPI_RX_CTL_RX_DMA_LEVEL_3 ( 0x8UL << OSPI_RX_CTL_RX_DMA_LEVEL_Pos ) + +#define OSPI_RX_CTL_RX_DMA_REQ_EN_Pos ( 3U ) +#define OSPI_RX_CTL_RX_DMA_REQ_EN_Msk ( 0x1UL << OSPI_RX_CTL_RX_DMA_REQ_EN_Pos ) +#define OSPI_RX_CTL_RX_DMA_REQ_EN ( OSPI_RX_CTL_RX_DMA_REQ_EN_Msk ) + +#define OSPI_RX_CTL_RX_FIFO_RESET_Pos ( 1U ) +#define OSPI_RX_CTL_RX_FIFO_RESET_Msk ( 0x1UL << OSPI_RX_CTL_RX_FIFO_RESET_Pos ) +#define OSPI_RX_CTL_RX_FIFO_RESET ( OSPI_RX_CTL_RX_FIFO_RESET_Msk ) + +#define OSPI_RX_CTL_RX_EN_Pos ( 0U ) +#define OSPI_RX_CTL_RX_EN_Msk ( 0x1UL << OSPI_RX_CTL_RX_EN_Pos ) +#define OSPI_RX_CTL_RX_EN ( OSPI_RX_CTL_RX_EN_Msk ) + + +/*************** Bits definition for OSPI_IE **********************/ + +#define OSPI_IE_RX_BATCH_DONE_EN_Pos ( 15U ) +#define OSPI_IE_RX_BATCH_DONE_EN_Msk ( 0x1UL << OSPI_IE_RX_BATCH_DONE_EN_Pos ) +#define OSPI_IE_RX_BATCH_DONE_EN ( OSPI_IE_RX_BATCH_DONE_EN_Msk ) + +#define OSPI_IE_TX_BATCH_DONE_EN_Pos ( 14U ) +#define OSPI_IE_TX_BATCH_DONE_EN_Msk ( 0x1UL << OSPI_IE_TX_BATCH_DONE_EN_Pos ) +#define OSPI_IE_TX_BATCH_DONE_EN ( OSPI_IE_TX_BATCH_DONE_EN_Msk ) + +#define OSPI_IE_RX_FIFO_NOT_EMPTY_EN_Pos ( 11U ) +#define OSPI_IE_RX_FIFO_NOT_EMPTY_EN_Msk ( 0x1UL << OSPI_IE_RX_FIFO_NOT_EMPTY_EN_Pos ) +#define OSPI_IE_RX_FIFO_NOT_EMPTY_EN ( OSPI_IE_RX_FIFO_NOT_EMPTY_EN_Msk ) + +#define OSPI_IE_RX_FIFO_HALF_FULL_EN_Pos ( 9U ) +#define OSPI_IE_RX_FIFO_HALF_FULL_EN_Msk ( 0x1UL << OSPI_IE_RX_FIFO_HALF_FULL_EN_Pos ) +#define OSPI_IE_RX_FIFO_HALF_FULL_EN ( OSPI_IE_RX_FIFO_HALF_FULL_EN_Msk ) + +#define OSPI_IE_RX_FIFO_HALF_EMPTY_EN_Pos ( 8U ) +#define OSPI_IE_RX_FIFO_HALF_EMPTY_EN_Msk ( 0x1UL << OSPI_IE_RX_FIFO_HALF_EMPTY_EN_Pos ) +#define OSPI_IE_RX_FIFO_HALF_EMPTY_EN ( OSPI_IE_RX_FIFO_HALF_EMPTY_EN_Msk ) + +#define OSPI_IE_TX_FIFO_HALF_FULL_EN_Pos ( 7U ) +#define OSPI_IE_TX_FIFO_HALF_FULL_EN_Msk ( 0x1UL << OSPI_IE_TX_FIFO_HALF_FULL_EN_Pos ) +#define OSPI_IE_TX_FIFO_HALF_FULL_EN ( OSPI_IE_TX_FIFO_HALF_FULL_EN_Msk ) + +#define OSPI_IE_TX_FIFO_HALF_EMPTY_EN_Pos ( 6U ) +#define OSPI_IE_TX_FIFO_HALF_EMPTY_EN_Msk ( 0x1UL << OSPI_IE_TX_FIFO_HALF_EMPTY_EN_Pos ) +#define OSPI_IE_TX_FIFO_HALF_EMPTY_EN ( OSPI_IE_TX_FIFO_HALF_EMPTY_EN_Msk ) + +#define OSPI_IE_RX_FIFO_FULL_EN_Pos ( 5U ) +#define OSPI_IE_RX_FIFO_FULL_EN_Msk ( 0x1UL << OSPI_IE_RX_FIFO_FULL_EN_Pos ) +#define OSPI_IE_RX_FIFO_FULL_EN ( OSPI_IE_RX_FIFO_FULL_EN_Msk ) + +#define OSPI_IE_RX_FIFO_EMPTY_EN_Pos ( 4U ) +#define OSPI_IE_RX_FIFO_EMPTY_EN_Msk ( 0x1UL << OSPI_IE_RX_FIFO_EMPTY_EN_Pos ) +#define OSPI_IE_RX_FIFO_EMPTY_EN ( OSPI_IE_RX_FIFO_EMPTY_EN_Msk ) + +#define OSPI_IE_TX_FIFO_FULL_EN_Pos ( 3U ) +#define OSPI_IE_TX_FIFO_FULL_EN_Msk ( 0x1UL << OSPI_IE_TX_FIFO_FULL_EN_Pos ) +#define OSPI_IE_TX_FIFO_FULL_EN ( OSPI_IE_TX_FIFO_FULL_EN_Msk ) + +#define OSPI_IE_TX_FIFO_EMPTY_EN_Pos ( 2U ) +#define OSPI_IE_TX_FIFO_EMPTY_EN_Msk ( 0x1UL << OSPI_IE_TX_FIFO_EMPTY_EN_Pos ) +#define OSPI_IE_TX_FIFO_EMPTY_EN ( OSPI_IE_TX_FIFO_EMPTY_EN_Msk ) + +#define OSPI_IE_BATCH_DONE_EN_Pos ( 1U ) +#define OSPI_IE_BATCH_DONE_EN_Msk ( 0x1UL << OSPI_IE_BATCH_DONE_EN_Pos ) +#define OSPI_IE_BATCH_DONE_EN ( OSPI_IE_BATCH_DONE_EN_Msk ) + + +/*************** Bits definition for OSPI_STATUS **********************/ + + +#define OSPI_STATUS_INSTR_SEND_DONE_Pos ( 18U ) +#define OSPI_STATUS_INSTR_SEND_DONE_Msk ( 0x1UL << OSPI_STATUS_INSTR_SEND_DONE_Pos ) +#define OSPI_STATUS_INSTR_SEND_DONE ( OSPI_STATUS_INSTR_SEND_DONE_Msk ) + +#define OSPI_STATUS_RWDS_Pos ( 17U ) +#define OSPI_STATUS_RWDS_Msk ( 0x1UL << OSPI_STATUS_RWDS_Pos ) +#define OSPI_STATUS_RWDS ( OSPI_STATUS_RWDS_Msk ) + +#define OSPI_STATUS_APM_DUMY_DONE_Pos ( 16U ) +#define OSPI_STATUS_APM_DUMY_DONE_Msk ( 0x1UL << OSPI_STATUS_APM_DUMY_DONE_Pos ) +#define OSPI_STATUS_APM_DUMY_DONE ( OSPI_STATUS_APM_DUMY_DONE_Msk ) + +#define OSPI_STATUS_RX_BATCH_DONE_Pos ( 15U ) +#define OSPI_STATUS_RX_BATCH_DONE_Msk ( 0x1UL << OSPI_STATUS_RX_BATCH_DONE_Pos ) +#define OSPI_STATUS_RX_BATCH_DONE ( OSPI_STATUS_RX_BATCH_DONE_Msk ) + +#define OSPI_STATUS_TX_BATCH_DONE_Pos ( 14U ) +#define OSPI_STATUS_TX_BATCH_DONE_Msk ( 0x1UL << OSPI_STATUS_TX_BATCH_DONE_Pos ) +#define OSPI_STATUS_TX_BATCH_DONE ( OSPI_STATUS_TX_BATCH_DONE_Msk ) + +#define OSPI_STATUS_RX_FIFO_NOT_EMPTY_Pos ( 11U ) +#define OSPI_STATUS_RX_FIFO_NOT_EMPTY_Msk ( 0x1UL << OSPI_STATUS_RX_FIFO_NOT_EMPTY_Pos ) +#define OSPI_STATUS_RX_FIFO_NOT_EMPTY ( OSPI_STATUS_RX_FIFO_NOT_EMPTY_Msk ) + +#define OSPI_STATUS_RX_FIFO_HALF_FULL_Pos ( 9U ) +#define OSPI_STATUS_RX_FIFO_HALF_FULL_Msk ( 0x1UL << OSPI_STATUS_RX_FIFO_HALF_FULL_Pos ) +#define OSPI_STATUS_RX_FIFO_HALF_FULL ( OSPI_STATUS_RX_FIFO_HALF_FULL_Msk ) + +#define OSPI_STATUS_RX_FIFO_HALF_EMPTY_Pos ( 8U ) +#define OSPI_STATUS_RX_FIFO_HALF_EMPTY_Msk ( 0x1UL << OSPI_STATUS_RX_FIFO_HALF_EMPTY_Pos ) +#define OSPI_STATUS_RX_FIFO_HALF_EMPTY ( OSPI_STATUS_RX_FIFO_HALF_EMPTY_Msk ) + +#define OSPI_STATUS_TX_FIFO_HALF_FULL_Pos ( 7U ) +#define OSPI_STATUS_TX_FIFO_HALF_FULL_Msk ( 0x1UL << OSPI_STATUS_TX_FIFO_HALF_FULL_Pos ) +#define OSPI_STATUS_TX_FIFO_HALF_FULL ( OSPI_STATUS_TX_FIFO_HALF_FULL_Msk ) + +#define OSPI_STATUS_TX_FIFO_HALF_EMPTY_Pos ( 6U ) +#define OSPI_STATUS_TX_FIFO_HALF_EMPTY_Msk ( 0x1UL << OSPI_STATUS_TX_FIFO_HALF_EMPTY_Pos ) +#define OSPI_STATUS_TX_FIFO_HALF_EMPTY ( OSPI_STATUS_TX_FIFO_HALF_EMPTY_Msk ) + +#define OSPI_STATUS_RX_FIFO_FULL_Pos ( 5U ) +#define OSPI_STATUS_RX_FIFO_FULL_Msk ( 0x1UL << OSPI_STATUS_RX_FIFO_FULL_Pos ) +#define OSPI_STATUS_RX_FIFO_FULL ( OSPI_STATUS_RX_FIFO_FULL_Msk ) + +#define OSPI_STATUS_RX_FIFO_EMPTY_Pos ( 4U ) +#define OSPI_STATUS_RX_FIFO_EMPTY_Msk ( 0x1UL << OSPI_STATUS_RX_FIFO_EMPTY_Pos ) +#define OSPI_STATUS_RX_FIFO_EMPTY ( OSPI_STATUS_RX_FIFO_EMPTY_Msk ) + +#define OSPI_STATUS_TX_FIFO_FULL_Pos ( 3U ) +#define OSPI_STATUS_TX_FIFO_FULL_Msk ( 0x1UL << OSPI_STATUS_TX_FIFO_FULL_Pos ) +#define OSPI_STATUS_TX_FIFO_FULL ( OSPI_STATUS_TX_FIFO_FULL_Msk ) + +#define OSPI_STATUS_TX_FIFO_EMPTY_Pos ( 2U ) +#define OSPI_STATUS_TX_FIFO_EMPTY_Msk ( 0x1UL << OSPI_STATUS_TX_FIFO_EMPTY_Pos ) +#define OSPI_STATUS_TX_FIFO_EMPTY ( OSPI_STATUS_TX_FIFO_EMPTY_Msk ) + +#define OSPI_STATUS_BATCH_DONE_Pos ( 1U ) +#define OSPI_STATUS_BATCH_DONE_Msk ( 0x1UL << OSPI_STATUS_BATCH_DONE_Pos ) +#define OSPI_STATUS_BATCH_DONE ( OSPI_STATUS_BATCH_DONE_Msk ) + +#define OSPI_STATUS_TX_BUSY_Pos ( 0U ) +#define OSPI_STATUS_TX_BUSY_Msk ( 0x1UL << OSPI_STATUS_TX_BUSY_Pos ) +#define OSPI_STATUS_TX_BUSY ( OSPI_STATUS_TX_BUSY_Msk ) + + +/*************** Bits definition for OSPI_TXDelay **********************/ + +#define OSPI_TXDELAY_TDY_Pos ( 0U ) +#define OSPI_TXDELAY_TDY_Msk ( 0xffffffffUL << OSPI_TXDELAY_TDY_Pos ) +#define OSPI_TXDELAY_TDY ( OSPI_TXDELAY_TDY_Msk ) + + +/*************** Bits definition for OSPI_BATCH **********************/ + +#define OSPI_BATCH_BATCH_NUMBER_Pos ( 0U ) +#define OSPI_BATCH_BATCH_NUMBER_Msk ( 0xffffffffUL << OSPI_BATCH_BATCH_NUMBER_Pos ) +#define OSPI_BATCH_BATCH_NUMBER ( OSPI_BATCH_BATCH_NUMBER_Msk ) + + +/*************** Bits definition for OSPI_CS **********************/ + +#define OSPI_CS_CSMAP_EN_Pos ( 3U ) +#define OSPI_CS_CSMAP_EN_Msk ( 0x1UL << OSPI_CS_CSMAP_EN_Pos ) +#define OSPI_CS_CSMAP_EN ( OSPI_CS_CSMAP_EN_Msk ) + +#define OSPI_CS_CS_Pos ( 0U ) +#define OSPI_CS_CS_Msk ( 0x7UL << OSPI_CS_CS_Pos ) +#define OSPI_CS_CS ( OSPI_CS_CS_Msk ) +#define OSPI_CS_CS_0 ( 0x1UL << OSPI_CS_CS_Pos ) +#define OSPI_CS_CS_1 ( 0x2UL << OSPI_CS_CS_Pos ) +#define OSPI_CS_CS_2 ( 0x4UL << OSPI_CS_CS_Pos ) + + +/*************** Bits definition for OSPI_OUT_EN **********************/ + +#define OSPI_OUT_EN_IO7_EN_Pos ( 7U ) +#define OSPI_OUT_EN_IO7_EN_Msk ( 0x1UL << OSPI_OUT_EN_IO7_EN_Pos ) +#define OSPI_OUT_EN_IO7_EN ( OSPI_OUT_EN_IO7_EN_Msk ) + +#define OSPI_OUT_EN_IO6_EN_Pos ( 6U ) +#define OSPI_OUT_EN_IO6_EN_Msk ( 0x1UL << OSPI_OUT_EN_IO6_EN_Pos ) +#define OSPI_OUT_EN_IO6_EN ( OSPI_OUT_EN_IO6_EN_Msk ) + +#define OSPI_OUT_EN_IO5_EN_Pos ( 5U ) +#define OSPI_OUT_EN_IO5_EN_Msk ( 0x1UL << OSPI_OUT_EN_IO5_EN_Pos ) +#define OSPI_OUT_EN_IO5_EN ( OSPI_OUT_EN_IO5_EN_Msk ) + +#define OSPI_OUT_EN_IO4_EN_Pos ( 4U ) +#define OSPI_OUT_EN_IO4_EN_Msk ( 0x1UL << OSPI_OUT_EN_IO4_EN_Pos ) +#define OSPI_OUT_EN_IO4_EN ( OSPI_OUT_EN_IO4_EN_Msk ) + +#define OSPI_OUT_EN_HOLD_EN_Pos ( 3U ) +#define OSPI_OUT_EN_HOLD_EN_Msk ( 0x1UL << OSPI_OUT_EN_HOLD_EN_Pos ) +#define OSPI_OUT_EN_HOLD_EN ( OSPI_OUT_EN_HOLD_EN_Msk ) + +#define OSPI_OUT_EN_WP_EN_Pos ( 2U ) +#define OSPI_OUT_EN_WP_EN_Msk ( 0x1UL << OSPI_OUT_EN_WP_EN_Pos ) +#define OSPI_OUT_EN_WP_EN ( OSPI_OUT_EN_WP_EN_Msk ) + +#define OSPI_OUT_EN_MISO_EN_Pos ( 1U ) +#define OSPI_OUT_EN_MISO_EN_Msk ( 0x1UL << OSPI_OUT_EN_MISO_EN_Pos ) +#define OSPI_OUT_EN_MISO_EN ( OSPI_OUT_EN_MISO_EN_Msk ) + +#define OSPI_OUT_EN_MOSI_EN_Pos ( 0U ) +#define OSPI_OUT_EN_MOSI_EN_Msk ( 0x1UL << OSPI_OUT_EN_MOSI_EN_Pos ) +#define OSPI_OUT_EN_MOSI_EN ( OSPI_OUT_EN_MOSI_EN_Msk ) + + +/*************** Bits definition for OSPI_MEMO_ACC1 **********************/ + + +#define OSPI_MEMO_ACC1_HYPER_BT_Pos ( 27U ) +#define OSPI_MEMO_ACC1_HYPER_BT_Msk ( 0x1UL << OSPI_MEMO_ACC1_HYPER_BT_Pos ) +#define OSPI_MEMO_ACC1_HYPER_BT ( OSPI_MEMO_ACC1_HYPER_BT_Msk ) + +#define OSPI_MEMO_ACC1_DATA_MODE_Pos ( 25U ) +#define OSPI_MEMO_ACC1_DATA_MODE_Msk ( 0x3UL << OSPI_MEMO_ACC1_DATA_MODE_Pos ) +#define OSPI_MEMO_ACC1_DATA_MODE ( OSPI_MEMO_ACC1_DATA_MODE_Msk ) +#define OSPI_MEMO_ACC1_DATA_MODE_0 ( 0x1UL << OSPI_MEMO_ACC1_DATA_MODE_Pos ) +#define OSPI_MEMO_ACC1_DATA_MODE_1 ( 0x2UL << OSPI_MEMO_ACC1_DATA_MODE_Pos ) + +#define OSPI_MEMO_ACC1_ALTER_BYTE_MODE_Pos ( 23U ) +#define OSPI_MEMO_ACC1_ALTER_BYTE_MODE_Msk ( 0x3UL << OSPI_MEMO_ACC1_ALTER_BYTE_MODE_Pos ) +#define OSPI_MEMO_ACC1_ALTER_BYTE_MODE ( OSPI_MEMO_ACC1_ALTER_BYTE_MODE_Msk ) +#define OSPI_MEMO_ACC1_ALTER_BYTE_MODE_0 ( 0x1UL << OSPI_MEMO_ACC1_ALTER_BYTE_MODE_Pos ) +#define OSPI_MEMO_ACC1_ALTER_BYTE_MODE_1 ( 0x2UL << OSPI_MEMO_ACC1_ALTER_BYTE_MODE_Pos ) + +#define OSPI_MEMO_ACC1_ADDR_MODE_Pos ( 21U ) +#define OSPI_MEMO_ACC1_ADDR_MODE_Msk ( 0x3UL << OSPI_MEMO_ACC1_ADDR_MODE_Pos ) +#define OSPI_MEMO_ACC1_ADDR_MODE ( OSPI_MEMO_ACC1_ADDR_MODE_Msk ) +#define OSPI_MEMO_ACC1_ADDR_MODE_0 ( 0x1UL << OSPI_MEMO_ACC1_ADDR_MODE_Pos ) +#define OSPI_MEMO_ACC1_ADDR_MODE_1 ( 0x2UL << OSPI_MEMO_ACC1_ADDR_MODE_Pos ) + +#define OSPI_MEMO_ACC1_INSTR_MODE_Pos ( 19U ) +#define OSPI_MEMO_ACC1_INSTR_MODE_Msk ( 0x3UL << OSPI_MEMO_ACC1_INSTR_MODE_Pos ) +#define OSPI_MEMO_ACC1_INSTR_MODE ( OSPI_MEMO_ACC1_INSTR_MODE_Msk ) +#define OSPI_MEMO_ACC1_INSTR_MODE_0 ( 0x1UL << OSPI_MEMO_ACC1_INSTR_MODE_Pos ) +#define OSPI_MEMO_ACC1_INSTR_MODE_1 ( 0x2UL << OSPI_MEMO_ACC1_INSTR_MODE_Pos ) + +#define OSPI_MEMO_ACC1_ADDR_WIDTH_Pos ( 17U ) +#define OSPI_MEMO_ACC1_ADDR_WIDTH_Msk ( 0x3UL << OSPI_MEMO_ACC1_ADDR_WIDTH_Pos ) +#define OSPI_MEMO_ACC1_ADDR_WIDTH ( OSPI_MEMO_ACC1_ADDR_WIDTH_Msk ) +#define OSPI_MEMO_ACC1_ADDR_WIDTH_0 ( 0x1UL << OSPI_MEMO_ACC1_ADDR_WIDTH_Pos ) +#define OSPI_MEMO_ACC1_ADDR_WIDTH_1 ( 0x2UL << OSPI_MEMO_ACC1_ADDR_WIDTH_Pos ) + +#define OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_Pos ( 12U ) +#define OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_Msk ( 0x1fUL << OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_Pos ) +#define OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE ( OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_Msk ) +#define OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_0 ( 0x1UL << OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_Pos ) +#define OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_1 ( 0x2UL << OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_Pos ) +#define OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_2 ( 0x4UL << OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_Pos ) +#define OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_3 ( 0x8UL << OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_Pos ) +#define OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_4 ( 0x10UL << OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_Pos ) + +#define OSPI_MEMO_ACC1_RD_DB_EN_Pos ( 11U ) +#define OSPI_MEMO_ACC1_RD_DB_EN_Msk ( 0x1UL << OSPI_MEMO_ACC1_RD_DB_EN_Pos ) +#define OSPI_MEMO_ACC1_RD_DB_EN ( OSPI_MEMO_ACC1_RD_DB_EN_Msk ) + +#define OSPI_MEMO_ACC1_WR_DB_EN_Pos ( 10U ) +#define OSPI_MEMO_ACC1_WR_DB_EN_Msk ( 0x1UL << OSPI_MEMO_ACC1_WR_DB_EN_Pos ) +#define OSPI_MEMO_ACC1_WR_DB_EN ( OSPI_MEMO_ACC1_WR_DB_EN_Msk ) + +#define OSPI_MEMO_ACC1_ALTER_BYTE_SIZE_Pos ( 7U ) +#define OSPI_MEMO_ACC1_ALTER_BYTE_SIZE_Msk ( 0x3UL << OSPI_MEMO_ACC1_ALTER_BYTE_SIZE_Pos ) +#define OSPI_MEMO_ACC1_ALTER_BYTE_SIZE ( OSPI_MEMO_ACC1_ALTER_BYTE_SIZE_Msk ) +#define OSPI_MEMO_ACC1_ALTER_BYTE_SIZE_0 ( 0x1UL << OSPI_MEMO_ACC1_ALTER_BYTE_SIZE_Pos ) +#define OSPI_MEMO_ACC1_ALTER_BYTE_SIZE_1 ( 0x2UL << OSPI_MEMO_ACC1_ALTER_BYTE_SIZE_Pos ) + +#define OSPI_MEMO_ACC1_RD_AB_EN_Pos ( 6U ) +#define OSPI_MEMO_ACC1_RD_AB_EN_Msk ( 0x1UL << OSPI_MEMO_ACC1_RD_AB_EN_Pos ) +#define OSPI_MEMO_ACC1_RD_AB_EN ( OSPI_MEMO_ACC1_RD_AB_EN_Msk ) + +#define OSPI_MEMO_ACC1_WR_AB_EN_Pos ( 5U ) +#define OSPI_MEMO_ACC1_WR_AB_EN_Msk ( 0x1UL << OSPI_MEMO_ACC1_WR_AB_EN_Pos ) +#define OSPI_MEMO_ACC1_WR_AB_EN ( OSPI_MEMO_ACC1_WR_AB_EN_Msk ) + +#define OSPI_MEMO_ACC1_SEND_INSTR_ONCE_EN_Pos ( 4U ) +#define OSPI_MEMO_ACC1_SEND_INSTR_ONCE_EN_CMD_Msk ( 0x1UL << OSPI_MEMO_ACC1_SEND_INSTR_ONCE_EN_Pos ) +#define OSPI_MEMO_ACC1_SEND_INSTR_ONCE_EN ( OSPI_MEMO_ACC1_SEND_INSTR_ONCE_EN_CMD_Msk ) + +#define OSPI_MEMO_ACC1_CON_MODE_EN_Pos ( 3U ) +#define OSPI_MEMO_ACC1_CON_MODE_EN_Msk ( 0x1UL << OSPI_MEMO_ACC1_CON_MODE_EN_Pos ) +#define OSPI_MEMO_ACC1_CON_MODE_EN ( OSPI_MEMO_ACC1_CON_MODE_EN_Msk ) + +#define OSPI_MEMO_ACC1_CS_TIMEOUT_EN_Pos ( 1U ) +#define OSPI_MEMO_ACC1_CS_TIMEOUT_EN_Msk ( 0x1UL << OSPI_MEMO_ACC1_CS_TIMEOUT_EN_Pos ) +#define OSPI_MEMO_ACC1_CS_TIMEOUT_EN ( OSPI_MEMO_ACC1_CS_TIMEOUT_EN_Msk ) + +#define OSPI_MEMO_ACC1_ACC_EN_Pos ( 0U ) +#define OSPI_MEMO_ACC1_ACC_EN_Msk ( 0x1UL << OSPI_MEMO_ACC1_ACC_EN_Pos ) +#define OSPI_MEMO_ACC1_ACC_EN ( OSPI_MEMO_ACC1_ACC_EN_Msk ) + + +/*************** Bits definition for OSPI_CMD **********************/ + +#define OSPI_CMD_WR_CMD_Pos ( 8U ) +#define OSPI_CMD_WR_CMD_Msk ( 0xffUL << OSPI_CMD_WR_CMD_Pos ) +#define OSPI_CMD_WR_CMD ( OSPI_CMD_WR_CMD_Msk ) +#define OSPI_CMD_WR_CMD_0 ( 0x1UL << OSPI_CMD_WR_CMD_Pos ) +#define OSPI_CMD_WR_CMD_1 ( 0x2UL << OSPI_CMD_WR_CMD_Pos ) +#define OSPI_CMD_WR_CMD_2 ( 0x4UL << OSPI_CMD_WR_CMD_Pos ) +#define OSPI_CMD_WR_CMD_3 ( 0x8UL << OSPI_CMD_WR_CMD_Pos ) +#define OSPI_CMD_WR_CMD_4 ( 0x10UL << OSPI_CMD_WR_CMD_Pos ) +#define OSPI_CMD_WR_CMD_5 ( 0x20UL << OSPI_CMD_WR_CMD_Pos ) +#define OSPI_CMD_WR_CMD_6 ( 0x40UL << OSPI_CMD_WR_CMD_Pos ) +#define OSPI_CMD_WR_CMD_7 ( 0x80UL << OSPI_CMD_WR_CMD_Pos ) + +#define OSPI_CMD_RD_CMD_Pos ( 0U ) +#define OSPI_CMD_RD_CMD_Msk ( 0xffUL << OSPI_CMD_RD_CMD_Pos ) +#define OSPI_CMD_RD_CMD ( OSPI_CMD_RD_CMD_Msk ) +#define OSPI_CMD_RD_CMD_0 ( 0x1UL << OSPI_CMD_RD_CMD_Pos ) +#define OSPI_CMD_RD_CMD_1 ( 0x2UL << OSPI_CMD_RD_CMD_Pos ) +#define OSPI_CMD_RD_CMD_2 ( 0x4UL << OSPI_CMD_RD_CMD_Pos ) +#define OSPI_CMD_RD_CMD_3 ( 0x8UL << OSPI_CMD_RD_CMD_Pos ) +#define OSPI_CMD_RD_CMD_4 ( 0x10UL << OSPI_CMD_RD_CMD_Pos ) +#define OSPI_CMD_RD_CMD_5 ( 0x20UL << OSPI_CMD_RD_CMD_Pos ) +#define OSPI_CMD_RD_CMD_6 ( 0x40UL << OSPI_CMD_RD_CMD_Pos ) +#define OSPI_CMD_RD_CMD_7 ( 0x80UL << OSPI_CMD_RD_CMD_Pos ) + + +/*************** Bits definition for OSPI_ALTER_BYTE **********************/ + +#define OSPI_ALTER_BYTE_Pos ( 0U ) +#define OSPI_ALTER_BYTE_Msk ( 0xffffffffUL << OSPI_ALTER_BYTE_Pos ) +#define OSPI_ALTER_BYTE ( OSPI_ALTER_BYTE_Msk ) + + +/*************** Bits definition for OSPI_CS_TOUT_VAL **********************/ + +#define OSPI_CS_TIMEOUT_VAL_Pos ( 0U ) +#define OSPI_CS_TIMEOUT_VAL_Msk ( 0xffffUL << OSPI_CS_TIMEOUT_VAL_Pos ) +#define OSPI_CS_TIMEOUT_VAL ( OSPI_CS_TIMEOUT_VAL_Msk ) + + +/*************** Bits definition for OSPI_MEMO_ACC2 **********************/ + +#define OSPI_MEMO_ACC2_WRPS_Pos ( 12U ) +#define OSPI_MEMO_ACC2_WRPS_Msk ( 0xfUL << OSPI_MEMO_ACC2_WRPS_Pos ) +#define OSPI_MEMO_ACC2_WRPS ( OSPI_MEMO_ACC2_WRPS_Msk ) +#define OSPI_MEMO_ACC2_WRPS_0 ( 0x1UL << OSPI_MEMO_ACC2_WRPS_Pos ) +#define OSPI_MEMO_ACC2_WRPS_1 ( 0x2UL << OSPI_MEMO_ACC2_WRPS_Pos ) +#define OSPI_MEMO_ACC2_WRPS_2 ( 0x4UL << OSPI_MEMO_ACC2_WRPS_Pos ) + +#define OSPI_MEMO_ACC2_BL_Pos ( 8U ) +#define OSPI_MEMO_ACC2_BL_Msk ( 0xfUL << OSPI_MEMO_ACC2_BL_Pos ) +#define OSPI_MEMO_ACC2_BL ( OSPI_MEMO_ACC2_BL_Msk ) +#define OSPI_MEMO_ACC2_BL_0 ( 0x1UL << OSPI_MEMO_ACC2_BL_Pos ) +#define OSPI_MEMO_ACC2_BL_1 ( 0x2UL << OSPI_MEMO_ACC2_BL_Pos ) +#define OSPI_MEMO_ACC2_BL_2 ( 0x4UL << OSPI_MEMO_ACC2_BL_Pos ) + +#define OSPI_MEMO_ACC2_HXLC1_Pos ( 4U ) +#define OSPI_MEMO_ACC2_HXLC1_Msk ( 0xfUL << OSPI_MEMO_ACC2_HXLC1_Pos ) +#define OSPI_MEMO_ACC2_HXLC1 ( OSPI_MEMO_ACC2_HXLC1_Msk ) +#define OSPI_MEMO_ACC2_HXLC1_0 ( 0x1UL << OSPI_MEMO_ACC2_HXLC1_Pos ) +#define OSPI_MEMO_ACC2_HXLC1_1 ( 0x2UL << OSPI_MEMO_ACC2_HXLC1_Pos ) +#define OSPI_MEMO_ACC2_HXLC1_2 ( 0x4UL << OSPI_MEMO_ACC2_HXLC1_Pos ) +#define OSPI_MEMO_ACC2_HXLC1_3 ( 0x8UL << OSPI_MEMO_ACC2_HXLC1_Pos ) + +#define OSPI_MEMO_ACC2_HXLC0_Pos ( 0U ) +#define OSPI_MEMO_ACC2_HXLC0_Msk ( 0xfUL << OSPI_MEMO_ACC2_HXLC0_Pos ) +#define OSPI_MEMO_ACC2_HXLC0 ( OSPI_MEMO_ACC2_HXLC0_Msk ) +#define OSPI_MEMO_ACC2_HXLC0_0 ( 0x1UL << OSPI_MEMO_ACC2_HXLC0_Pos ) +#define OSPI_MEMO_ACC2_HXLC0_1 ( 0x2UL << OSPI_MEMO_ACC2_HXLC0_Pos ) +#define OSPI_MEMO_ACC2_HXLC0_2 ( 0x4UL << OSPI_MEMO_ACC2_HXLC0_Pos ) +#define OSPI_MEMO_ACC2_HXLC0_3 ( 0x8UL << OSPI_MEMO_ACC2_HXLC0_Pos ) + + + + +/*************** Bits definition for FMC_SNCTLx **********************/ + +#define FMC_SNCTLX_SYNCWR_Pos ( 19U ) +#define FMC_SNCTLX_SYNCWR_Msk ( 0x1UL << FMC_SNCTLX_SYNCWR_Pos ) +#define FMC_SNCTLX_SYNCWR ( FMC_SNCTLX_SYNCWR_Msk ) + +#define FMC_SNCTLX_CPS_Pos ( 16U ) +#define FMC_SNCTLX_CPS_Msk ( 0x7UL << FMC_SNCTLX_CPS_Pos ) +#define FMC_SNCTLX_CPS ( FMC_SNCTLX_CPS_Msk ) +#define FMC_SNCTLX_CPS_0 ( 0x1UL << FMC_SNCTLX_CPS_Pos ) +#define FMC_SNCTLX_CPS_1 ( 0x2UL << FMC_SNCTLX_CPS_Pos ) +#define FMC_SNCTLX_CPS_2 ( 0x4UL << FMC_SNCTLX_CPS_Pos ) + +#define FMC_SNCTLX_ASYNCWAIT_Pos ( 15U ) +#define FMC_SNCTLX_ASYNCWAIT_Msk ( 0x1UL << FMC_SNCTLX_ASYNCWAIT_Pos ) +#define FMC_SNCTLX_ASYNCWAIT ( FMC_SNCTLX_ASYNCWAIT_Msk ) + +#define FMC_SNCTLX_EXMODEN_Pos ( 14U ) +#define FMC_SNCTLX_EXMODEN_Msk ( 0x1UL << FMC_SNCTLX_EXMODEN_Pos ) +#define FMC_SNCTLX_EXMODEN ( FMC_SNCTLX_EXMODEN_Msk ) + +#define FMC_SNCTLX_NRWTEN_Pos ( 13U ) +#define FMC_SNCTLX_NRWTEN_Msk ( 0x1UL << FMC_SNCTLX_NRWTEN_Pos ) +#define FMC_SNCTLX_NRWTEN ( FMC_SNCTLX_NRWTEN_Msk ) + +#define FMC_SNCTLX_WREN_Pos ( 12U ) +#define FMC_SNCTLX_WREN_Msk ( 0x1UL << FMC_SNCTLX_WREN_Pos ) +#define FMC_SNCTLX_WREN ( FMC_SNCTLX_WREN_Msk ) + +#define FMC_SNCTLX_NRWTCFG_Pos ( 11U ) +#define FMC_SNCTLX_NRWTCFG_Msk ( 0x1UL << FMC_SNCTLX_NRWTCFG_Pos ) +#define FMC_SNCTLX_NRWTCFG ( FMC_SNCTLX_NRWTCFG_Msk ) + +#define FMC_SNCTLX_WRAPEN_Pos ( 10U ) +#define FMC_SNCTLX_WRAPEN_Msk ( 0x1UL << FMC_SNCTLX_WRAPEN_Pos ) +#define FMC_SNCTLX_WRAPEN ( FMC_SNCTLX_WRAPEN_Msk ) + +#define FMC_SNCTLX_NRWTPOL_Pos ( 9U ) +#define FMC_SNCTLX_NRWTPOL_Msk ( 0x1UL << FMC_SNCTLX_NRWTPOL_Pos ) +#define FMC_SNCTLX_NRWTPOL ( FMC_SNCTLX_NRWTPOL_Msk ) + +#define FMC_SNCTLX_SBRSTEN_Pos ( 8U ) +#define FMC_SNCTLX_SBRSTEN_Msk ( 0x1UL << FMC_SNCTLX_SBRSTEN_Pos ) +#define FMC_SNCTLX_SBRSTEN ( FMC_SNCTLX_SBRSTEN_Msk ) + +#define FMC_SNCTLX_NREN_Pos ( 6U ) +#define FMC_SNCTLX_NREN_Msk ( 0x1UL << FMC_SNCTLX_NREN_Pos ) +#define FMC_SNCTLX_NREN ( FMC_SNCTLX_NREN_Msk ) + +#define FMC_SNCTLX_NRW_Pos ( 4U ) +#define FMC_SNCTLX_NRW_Msk ( 0x3UL << FMC_SNCTLX_NRW_Pos ) +#define FMC_SNCTLX_NRW ( FMC_SNCTLX_NRW_Msk ) +#define FMC_SNCTLX_NRW_0 ( 0x1UL << FMC_SNCTLX_NRW_Pos ) +#define FMC_SNCTLX_NRW_1 ( 0x2UL << FMC_SNCTLX_NRW_Pos ) + +#define FMC_SNCTLX_NRTP_Pos ( 2U ) +#define FMC_SNCTLX_NRTP_Msk ( 0x3UL << FMC_SNCTLX_NRTP_Pos ) +#define FMC_SNCTLX_NRTP ( FMC_SNCTLX_NRTP_Msk ) +#define FMC_SNCTLX_NRTP_0 ( 0x1UL << FMC_SNCTLX_NRTP_Pos ) +#define FMC_SNCTLX_NRTP_1 ( 0x2UL << FMC_SNCTLX_NRTP_Pos ) + +#define FMC_SNCTLX_NRMUX_Pos ( 1U ) +#define FMC_SNCTLX_NRMUX_Msk ( 0x1UL << FMC_SNCTLX_NRMUX_Pos ) +#define FMC_SNCTLX_NRMUX ( FMC_SNCTLX_NRMUX_Msk ) + +#define FMC_SNCTLX_NRBKEN_Pos ( 0U ) +#define FMC_SNCTLX_NRBKEN_Msk ( 0x1UL << FMC_SNCTLX_NRBKEN_Pos ) +#define FMC_SNCTLX_NRBKEN ( FMC_SNCTLX_NRBKEN_Msk ) + + +/*************** Bits definition for FMC_SNTCFGx **********************/ + +#define FMC_SNTCFGX_ASYNCMOD_Pos ( 28U ) +#define FMC_SNTCFGX_ASYNCMOD_Msk ( 0x3UL << FMC_SNTCFGX_ASYNCMOD_Pos ) +#define FMC_SNTCFGX_ASYNCMOD ( FMC_SNTCFGX_ASYNCMOD_Msk ) +#define FMC_SNTCFGX_ASYNCMOD_0 ( 0x1UL << FMC_SNTCFGX_ASYNCMOD_Pos ) +#define FMC_SNTCFGX_ASYNCMOD_1 ( 0x2UL << FMC_SNTCFGX_ASYNCMOD_Pos ) + +#define FMC_SNTCFGX_DLAT_Pos ( 24U ) +#define FMC_SNTCFGX_DLAT_Msk ( 0xfUL << FMC_SNTCFGX_DLAT_Pos ) +#define FMC_SNTCFGX_DLAT ( FMC_SNTCFGX_DLAT_Msk ) +#define FMC_SNTCFGX_DLAT_0 ( 0x1UL << FMC_SNTCFGX_DLAT_Pos ) +#define FMC_SNTCFGX_DLAT_1 ( 0x2UL << FMC_SNTCFGX_DLAT_Pos ) +#define FMC_SNTCFGX_DLAT_2 ( 0x4UL << FMC_SNTCFGX_DLAT_Pos ) +#define FMC_SNTCFGX_DLAT_3 ( 0x8UL << FMC_SNTCFGX_DLAT_Pos ) + +#define FMC_SNTCFGX_CKDIV_Pos ( 20U ) +#define FMC_SNTCFGX_CKDIV_Msk ( 0xfUL << FMC_SNTCFGX_CKDIV_Pos ) +#define FMC_SNTCFGX_CKDIV ( FMC_SNTCFGX_CKDIV_Msk ) +#define FMC_SNTCFGX_CKDIV_0 ( 0x1UL << FMC_SNTCFGX_CKDIV_Pos ) +#define FMC_SNTCFGX_CKDIV_1 ( 0x2UL << FMC_SNTCFGX_CKDIV_Pos ) +#define FMC_SNTCFGX_CKDIV_2 ( 0x4UL << FMC_SNTCFGX_CKDIV_Pos ) +#define FMC_SNTCFGX_CKDIV_3 ( 0x8UL << FMC_SNTCFGX_CKDIV_Pos ) + +#define FMC_SNTCFGX_BUSLAT_Pos ( 16U ) +#define FMC_SNTCFGX_BUSLAT_Msk ( 0xfUL << FMC_SNTCFGX_BUSLAT_Pos ) +#define FMC_SNTCFGX_BUSLAT ( FMC_SNTCFGX_BUSLAT_Msk ) +#define FMC_SNTCFGX_BUSLAT_0 ( 0x1UL << FMC_SNTCFGX_BUSLAT_Pos ) +#define FMC_SNTCFGX_BUSLAT_1 ( 0x2UL << FMC_SNTCFGX_BUSLAT_Pos ) +#define FMC_SNTCFGX_BUSLAT_2 ( 0x4UL << FMC_SNTCFGX_BUSLAT_Pos ) +#define FMC_SNTCFGX_BUSLAT_3 ( 0x8UL << FMC_SNTCFGX_BUSLAT_Pos ) + +#define FMC_SNTCFGX_DSET_Pos ( 8U ) +#define FMC_SNTCFGX_DSET_Msk ( 0xffUL << FMC_SNTCFGX_DSET_Pos ) +#define FMC_SNTCFGX_DSET ( FMC_SNTCFGX_DSET_Msk ) +#define FMC_SNTCFGX_DSET_0 ( 0x1UL << FMC_SNTCFGX_DSET_Pos ) +#define FMC_SNTCFGX_DSET_1 ( 0x2UL << FMC_SNTCFGX_DSET_Pos ) +#define FMC_SNTCFGX_DSET_2 ( 0x4UL << FMC_SNTCFGX_DSET_Pos ) +#define FMC_SNTCFGX_DSET_3 ( 0x8UL << FMC_SNTCFGX_DSET_Pos ) +#define FMC_SNTCFGX_DSET_4 ( 0x10UL << FMC_SNTCFGX_DSET_Pos ) +#define FMC_SNTCFGX_DSET_5 ( 0x20UL << FMC_SNTCFGX_DSET_Pos ) +#define FMC_SNTCFGX_DSET_6 ( 0x40UL << FMC_SNTCFGX_DSET_Pos ) +#define FMC_SNTCFGX_DSET_7 ( 0x80UL << FMC_SNTCFGX_DSET_Pos ) + +#define FMC_SNTCFGX_AHLD_Pos ( 4U ) +#define FMC_SNTCFGX_AHLD_Msk ( 0xfUL << FMC_SNTCFGX_AHLD_Pos ) +#define FMC_SNTCFGX_AHLD ( FMC_SNTCFGX_AHLD_Msk ) +#define FMC_SNTCFGX_AHLD_0 ( 0x1UL << FMC_SNTCFGX_AHLD_Pos ) +#define FMC_SNTCFGX_AHLD_1 ( 0x2UL << FMC_SNTCFGX_AHLD_Pos ) +#define FMC_SNTCFGX_AHLD_2 ( 0x4UL << FMC_SNTCFGX_AHLD_Pos ) +#define FMC_SNTCFGX_AHLD_3 ( 0x8UL << FMC_SNTCFGX_AHLD_Pos ) + +#define FMC_SNTCFGX_ASET_Pos ( 0U ) +#define FMC_SNTCFGX_ASET_Msk ( 0xfUL << FMC_SNTCFGX_ASET_Pos ) +#define FMC_SNTCFGX_ASET ( FMC_SNTCFGX_ASET_Msk ) +#define FMC_SNTCFGX_ASET_0 ( 0x1UL << FMC_SNTCFGX_ASET_Pos ) +#define FMC_SNTCFGX_ASET_1 ( 0x2UL << FMC_SNTCFGX_ASET_Pos ) +#define FMC_SNTCFGX_ASET_2 ( 0x4UL << FMC_SNTCFGX_ASET_Pos ) +#define FMC_SNTCFGX_ASET_3 ( 0x8UL << FMC_SNTCFGX_ASET_Pos ) + + +/*************** Bits definition for FMC_SNWTCFGx **********************/ + +#define FMC_SNWTCFGX_WASYNCMOD_Pos ( 28U ) +#define FMC_SNWTCFGX_WASYNCMOD_Msk ( 0x3UL << FMC_SNWTCFGX_WASYNCMOD_Pos ) +#define FMC_SNWTCFGX_WASYNCMOD ( FMC_SNWTCFGX_WASYNCMOD_Msk ) +#define FMC_SNWTCFGX_WASYNCMOD_0 ( 0x1UL << FMC_SNWTCFGX_WASYNCMOD_Pos ) +#define FMC_SNWTCFGX_WASYNCMOD_1 ( 0x2UL << FMC_SNWTCFGX_WASYNCMOD_Pos ) + +#define FMC_SNWTCFGX_DLAT_Pos ( 24U ) +#define FMC_SNWTCFGX_DLAT_Msk ( 0xfUL << FMC_SNWTCFGX_DLAT_Pos ) +#define FMC_SNWTCFGX_DLAT ( FMC_SNWTCFGX_DLAT_Msk ) +#define FMC_SNWTCFGX_DLAT_0 ( 0x1UL << FMC_SNWTCFGX_DLAT_Pos ) +#define FMC_SNWTCFGX_DLAT_1 ( 0x2UL << FMC_SNWTCFGX_DLAT_Pos ) +#define FMC_SNWTCFGX_DLAT_2 ( 0x4UL << FMC_SNWTCFGX_DLAT_Pos ) +#define FMC_SNWTCFGX_DLAT_3 ( 0x8UL << FMC_SNWTCFGX_DLAT_Pos ) + +#define FMC_SNWTCFGX_WBUSLAT_Pos ( 16U ) +#define FMC_SNWTCFGX_WBUSLAT_Msk ( 0xfUL << FMC_SNWTCFGX_WBUSLAT_Pos ) +#define FMC_SNWTCFGX_WBUSLAT ( FMC_SNWTCFGX_WBUSLAT_Msk ) +#define FMC_SNWTCFGX_WBUSLAT_0 ( 0x1UL << FMC_SNWTCFGX_WBUSLAT_Pos ) +#define FMC_SNWTCFGX_WBUSLAT_1 ( 0x2UL << FMC_SNWTCFGX_WBUSLAT_Pos ) +#define FMC_SNWTCFGX_WBUSLAT_2 ( 0x4UL << FMC_SNWTCFGX_WBUSLAT_Pos ) +#define FMC_SNWTCFGX_WBUSLAT_3 ( 0x8UL << FMC_SNWTCFGX_WBUSLAT_Pos ) + +#define FMC_SNWTCFGX_WDSET_Pos ( 8U ) +#define FMC_SNWTCFGX_WDSET_Msk ( 0xffUL << FMC_SNWTCFGX_WDSET_Pos ) +#define FMC_SNWTCFGX_WDSET ( FMC_SNWTCFGX_WDSET_Msk ) +#define FMC_SNWTCFGX_WDSET_0 ( 0x1UL << FMC_SNWTCFGX_WDSET_Pos ) +#define FMC_SNWTCFGX_WDSET_1 ( 0x2UL << FMC_SNWTCFGX_WDSET_Pos ) +#define FMC_SNWTCFGX_WDSET_2 ( 0x4UL << FMC_SNWTCFGX_WDSET_Pos ) +#define FMC_SNWTCFGX_WDSET_3 ( 0x8UL << FMC_SNWTCFGX_WDSET_Pos ) +#define FMC_SNWTCFGX_WDSET_4 ( 0x10UL << FMC_SNWTCFGX_WDSET_Pos ) +#define FMC_SNWTCFGX_WDSET_5 ( 0x20UL << FMC_SNWTCFGX_WDSET_Pos ) +#define FMC_SNWTCFGX_WDSET_6 ( 0x40UL << FMC_SNWTCFGX_WDSET_Pos ) +#define FMC_SNWTCFGX_WDSET_7 ( 0x80UL << FMC_SNWTCFGX_WDSET_Pos ) + +#define FMC_SNWTCFGX_WAHLD_Pos ( 4U ) +#define FMC_SNWTCFGX_WAHLD_Msk ( 0xfUL << FMC_SNWTCFGX_WAHLD_Pos ) +#define FMC_SNWTCFGX_WAHLD ( FMC_SNWTCFGX_WAHLD_Msk ) +#define FMC_SNWTCFGX_WAHLD_0 ( 0x1UL << FMC_SNWTCFGX_WAHLD_Pos ) +#define FMC_SNWTCFGX_WAHLD_1 ( 0x2UL << FMC_SNWTCFGX_WAHLD_Pos ) +#define FMC_SNWTCFGX_WAHLD_2 ( 0x4UL << FMC_SNWTCFGX_WAHLD_Pos ) +#define FMC_SNWTCFGX_WAHLD_3 ( 0x8UL << FMC_SNWTCFGX_WAHLD_Pos ) + +#define FMC_SNWTCFGX_WASET_Pos ( 0U ) +#define FMC_SNWTCFGX_WASET_Msk ( 0xfUL << FMC_SNWTCFGX_WASET_Pos ) +#define FMC_SNWTCFGX_WASET ( FMC_SNWTCFGX_WASET_Msk ) +#define FMC_SNWTCFGX_WASET_0 ( 0x1UL << FMC_SNWTCFGX_WASET_Pos ) +#define FMC_SNWTCFGX_WASET_1 ( 0x2UL << FMC_SNWTCFGX_WASET_Pos ) +#define FMC_SNWTCFGX_WASET_2 ( 0x4UL << FMC_SNWTCFGX_WASET_Pos ) +#define FMC_SNWTCFGX_WASET_3 ( 0x8UL << FMC_SNWTCFGX_WASET_Pos ) + +/*************** Bits definition for FMC_SDRCR **********************/ + +#define FMC_SDRCR_WBUSRLS_Pos ( 20U ) +#define FMC_SDRCR_WBUSRLS_Msk ( 0x1UL << FMC_SDRCR_WBUSRLS_Pos ) +#define FMC_SDRCR_WBUSRLS ( FMC_SDRCR_WBUSRLS_Msk ) + +#define FMC_SDRCR_RBUSRLS_Pos ( 19U ) +#define FMC_SDRCR_RBUSRLS_Msk ( 0x1UL << FMC_SDRCR_RBUSRLS_Pos ) +#define FMC_SDRCR_RBUSRLS ( FMC_SDRCR_RBUSRLS_Msk ) + +#define FMC_SDRCR_BDEPTH_Pos ( 16U ) +#define FMC_SDRCR_BDEPTH_Msk ( 0x7UL << FMC_SDRCR_BDEPTH_Pos ) +#define FMC_SDRCR_BDEPTH_0 ( 0x1UL << FMC_SDRCR_BDEPTH_Pos ) +#define FMC_SDRCR_BDEPTH_1 ( 0x2UL << FMC_SDRCR_BDEPTH_Pos ) +#define FMC_SDRCR_BDEPTH_2 ( 0x4UL << FMC_SDRCR_BDEPTH_Pos ) + +#define FMC_SDRCR_W2RDLY_Pos ( 15U ) +#define FMC_SDRCR_W2RDLY_Msk ( 0x1UL << FMC_SDRCR_W2RDLY_Pos ) +#define FMC_SDRCR_W2RDLY ( FMC_SDRCR_W2RDLY_Msk ) + +#define FMC_SDRCR_RPIPE_Pos ( 13U ) +#define FMC_SDRCR_RPIPE_Msk ( 0x3UL << FMC_SDRCR_RPIPE_Pos ) +#define FMC_SDRCR_RPIPE ( FMC_SDRCR_RPIPE_Msk ) +#define FMC_SDRCR_RPIPE_0 ( 0x1UL << FMC_SDRCR_RPIPE_Pos ) +#define FMC_SDRCR_RPIPE_1 ( 0x2UL << FMC_SDRCR_RPIPE_Pos ) + +#define FMC_SDRCR_RBURST_Pos ( 12U ) +#define FMC_SDRCR_RBURST_Msk ( 0x1UL << FMC_SDRCR_RBURST_Pos ) +#define FMC_SDRCR_RBURST ( FMC_SDRCR_RBURST_Msk ) + +#define FMC_SDRCR_CLKDIV_Pos ( 10U ) +#define FMC_SDRCR_CLKDIV_Msk ( 0x3UL << FMC_SDRCR_CLKDIV_Pos ) +#define FMC_SDRCR_CLKDIV ( FMC_SDRCR_CLKDIV_Msk ) +#define FMC_SDRCR_CLKDIV_0 ( 0x1UL << FMC_SDRCR_CLKDIV_Pos ) +#define FMC_SDRCR_CLKDIV_1 ( 0x2UL << FMC_SDRCR_CLKDIV_Pos ) + +#define FMC_SDRCR_WP_Pos ( 9U ) +#define FMC_SDRCR_WP_Msk ( 0x1UL << FMC_SDRCR_WP_Pos ) +#define FMC_SDRCR_WP ( FMC_SDRCR_WP_Msk ) + +#define FMC_SDRCR_CAS_Pos ( 7U ) +#define FMC_SDRCR_CAS_Msk ( 0x3UL << FMC_SDRCR_CAS_Pos ) +#define FMC_SDRCR_CAS ( FMC_SDRCR_CAS_Msk ) +#define FMC_SDRCR_CAS_0 ( 0x1UL << FMC_SDRCR_CAS_Pos ) +#define FMC_SDRCR_CAS_1 ( 0x2UL << FMC_SDRCR_CAS_Pos ) + +#define FMC_SDRCR_NB_Pos ( 6U ) +#define FMC_SDRCR_NB_Msk ( 0x1UL << FMC_SDRCR_NB_Pos ) +#define FMC_SDRCR_NB ( FMC_SDRCR_NB_Msk ) + +#define FMC_SDRCR_MWID_Pos ( 4U ) +#define FMC_SDRCR_MWID_Msk ( 0x3UL << FMC_SDRCR_MWID_Pos ) +#define FMC_SDRCR_MWID ( FMC_SDRCR_MWID_Msk ) +#define FMC_SDRCR_MWID_0 ( 0x1UL << FMC_SDRCR_MWID_Pos ) +#define FMC_SDRCR_MWID_1 ( 0x2UL << FMC_SDRCR_MWID_Pos ) + +#define FMC_SDRCR_NRA_Pos ( 2U ) +#define FMC_SDRCR_NRA_Msk ( 0x3UL << FMC_SDRCR_NRA_Pos ) +#define FMC_SDRCR_NRA ( FMC_SDRCR_NRA_Msk ) +#define FMC_SDRCR_NRA_0 ( 0x1UL << FMC_SDRCR_NRA_Pos ) +#define FMC_SDRCR_NRA_1 ( 0x2UL << FMC_SDRCR_NRA_Pos ) + +#define FMC_SDRCR_NCA_Pos ( 0U ) +#define FMC_SDRCR_NCA_Msk ( 0x3UL << FMC_SDRCR_NCA_Pos ) +#define FMC_SDRCR_NCA ( FMC_SDRCR_NCA_Msk ) +#define FMC_SDRCR_NCA_0 ( 0x1UL << FMC_SDRCR_NCA_Pos ) +#define FMC_SDRCR_NCA_1 ( 0x2UL << FMC_SDRCR_NCA_Pos ) + + +/*************** Bits definition for FMC_SDRTR **********************/ + +#define FMC_SDRTR_TRCD_Pos ( 24U ) +#define FMC_SDRTR_TRCD_Msk ( 0xfUL << FMC_SDRTR_TRCD_Pos ) +#define FMC_SDRTR_TRCD ( FMC_SDRTR_TRCD_Msk ) +#define FMC_SDRTR_TRCD_0 ( 0x1UL << FMC_SDRTR_TRCD_Pos ) +#define FMC_SDRTR_TRCD_1 ( 0x2UL << FMC_SDRTR_TRCD_Pos ) +#define FMC_SDRTR_TRCD_2 ( 0x4UL << FMC_SDRTR_TRCD_Pos ) +#define FMC_SDRTR_TRCD_3 ( 0x8UL << FMC_SDRTR_TRCD_Pos ) + +#define FMC_SDRTR_TRP_Pos ( 20U ) +#define FMC_SDRTR_TRP_Msk ( 0xfUL << FMC_SDRTR_TRP_Pos ) +#define FMC_SDRTR_TRP ( FMC_SDRTR_TRP_Msk ) +#define FMC_SDRTR_TRP_0 ( 0x1UL << FMC_SDRTR_TRP_Pos ) +#define FMC_SDRTR_TRP_1 ( 0x2UL << FMC_SDRTR_TRP_Pos ) +#define FMC_SDRTR_TRP_2 ( 0x4UL << FMC_SDRTR_TRP_Pos ) +#define FMC_SDRTR_TRP_3 ( 0x8UL << FMC_SDRTR_TRP_Pos ) + +#define FMC_SDRTR_TWR_Pos ( 16U ) +#define FMC_SDRTR_TWR_Msk ( 0xfUL << FMC_SDRTR_TWR_Pos ) +#define FMC_SDRTR_TWR ( FMC_SDRTR_TWR_Msk ) +#define FMC_SDRTR_TWR_0 ( 0x1UL << FMC_SDRTR_TWR_Pos ) +#define FMC_SDRTR_TWR_1 ( 0x2UL << FMC_SDRTR_TWR_Pos ) +#define FMC_SDRTR_TWR_2 ( 0x4UL << FMC_SDRTR_TWR_Pos ) +#define FMC_SDRTR_TWR_3 ( 0x8UL << FMC_SDRTR_TWR_Pos ) + +#define FMC_SDRTR_TRC_Pos ( 12U ) +#define FMC_SDRTR_TRC_Msk ( 0xfUL << FMC_SDRTR_TRC_Pos ) +#define FMC_SDRTR_TRC ( FMC_SDRTR_TRC_Msk ) +#define FMC_SDRTR_TRC_0 ( 0x1UL << FMC_SDRTR_TRC_Pos ) +#define FMC_SDRTR_TRC_1 ( 0x2UL << FMC_SDRTR_TRC_Pos ) +#define FMC_SDRTR_TRC_2 ( 0x4UL << FMC_SDRTR_TRC_Pos ) +#define FMC_SDRTR_TRC_3 ( 0x8UL << FMC_SDRTR_TRC_Pos ) + +#define FMC_SDRTR_TRAS_Pos ( 8U ) +#define FMC_SDRTR_TRAS_Msk ( 0xfUL << FMC_SDRTR_TRAS_Pos ) +#define FMC_SDRTR_TRAS ( FMC_SDRTR_TRAS_Msk ) +#define FMC_SDRTR_TRAS_0 ( 0x1UL << FMC_SDRTR_TRAS_Pos ) +#define FMC_SDRTR_TRAS_1 ( 0x2UL << FMC_SDRTR_TRAS_Pos ) +#define FMC_SDRTR_TRAS_2 ( 0x4UL << FMC_SDRTR_TRAS_Pos ) +#define FMC_SDRTR_TRAS_3 ( 0x8UL << FMC_SDRTR_TRAS_Pos ) + +#define FMC_SDRTR_TXSR_Pos ( 4U ) +#define FMC_SDRTR_TXSR_Msk ( 0xfUL << FMC_SDRTR_TXSR_Pos ) +#define FMC_SDRTR_TXSR ( FMC_SDRTR_TXSR_Msk ) +#define FMC_SDRTR_TXSR_0 ( 0x1UL << FMC_SDRTR_TXSR_Pos ) +#define FMC_SDRTR_TXSR_1 ( 0x2UL << FMC_SDRTR_TXSR_Pos ) +#define FMC_SDRTR_TXSR_2 ( 0x4UL << FMC_SDRTR_TXSR_Pos ) +#define FMC_SDRTR_TXSR_3 ( 0x8UL << FMC_SDRTR_TXSR_Pos ) + +#define FMC_SDRTR_TMRD_Pos ( 0U ) +#define FMC_SDRTR_TMRD_Msk ( 0xfUL << FMC_SDRTR_TMRD_Pos ) +#define FMC_SDRTR_TMRD ( FMC_SDRTR_TMRD_Msk ) +#define FMC_SDRTR_TMRD_0 ( 0x1UL << FMC_SDRTR_TMRD_Pos ) +#define FMC_SDRTR_TMRD_1 ( 0x2UL << FMC_SDRTR_TMRD_Pos ) +#define FMC_SDRTR_TMRD_2 ( 0x4UL << FMC_SDRTR_TMRD_Pos ) +#define FMC_SDRTR_TMRD_3 ( 0x8UL << FMC_SDRTR_TMRD_Pos ) + + +/*************** Bits definition for FMC_SDRCMD **********************/ + +#define FMC_SDRCMD_MRD_Pos ( 9U ) +#define FMC_SDRCMD_MRD_Msk ( 0x1fffUL << FMC_SDRCMD_MRD_Pos ) +#define FMC_SDRCMD_MRD ( FMC_SDRCMD_MRD_Msk ) + +#define FMC_SDRCMD_NARF_Pos ( 5U ) +#define FMC_SDRCMD_NARF_Msk ( 0xfUL << FMC_SDRCMD_NARF_Pos ) +#define FMC_SDRCMD_NARF ( FMC_SDRCMD_NARF_Msk ) +#define FMC_SDRCMD_NARF_0 ( 0x1UL << FMC_SDRCMD_NARF_Pos ) +#define FMC_SDRCMD_NARF_1 ( 0x2UL << FMC_SDRCMD_NARF_Pos ) +#define FMC_SDRCMD_NARF_2 ( 0x4UL << FMC_SDRCMD_NARF_Pos ) +#define FMC_SDRCMD_NARF_3 ( 0x8UL << FMC_SDRCMD_NARF_Pos ) + +#define FMC_SDRCMD_CTD1_Pos ( 4U ) +#define FMC_SDRCMD_CTD1_Msk ( 0x1UL << FMC_SDRCMD_CTD1_Pos ) +#define FMC_SDRCMD_CTD1 ( FMC_SDRCMD_CTD1_Msk ) + +#define FMC_SDRCMD_CTD2_Pos ( 3U ) +#define FMC_SDRCMD_CTD2_Msk ( 0x1UL << FMC_SDRCMD_CTD2_Pos ) +#define FMC_SDRCMD_CTD2 ( FMC_SDRCMD_CTD2_Msk ) + +#define FMC_SDRCMD_CMD_Pos ( 0U ) +#define FMC_SDRCMD_CMD_Msk ( 0x7UL << FMC_SDRCMD_CMD_Pos ) +#define FMC_SDRCMD_CMD ( FMC_SDRCMD_CMD_Msk ) +#define FMC_SDRCMD_CMD_0 ( 0x1UL << FMC_SDRCMD_CMD_Pos ) +#define FMC_SDRCMD_CMD_1 ( 0x2UL << FMC_SDRCMD_CMD_Pos ) +#define FMC_SDRCMD_CMD_2 ( 0x4UL << FMC_SDRCMD_CMD_Pos ) + + +/*************** Bits definition for FMC_SDRART **********************/ + +#define FMC_SDRART_RFEIE_Pos ( 14U ) +#define FMC_SDRART_RFEIE_Msk ( 0x1UL << FMC_SDRART_RFEIE_Pos ) +#define FMC_SDRART_RFEIE ( FMC_SDRART_RFEIE_Msk ) + +#define FMC_SDRART_COUNT_Pos ( 1U ) +#define FMC_SDRART_COUNT_Msk ( 0x1fffUL << FMC_SDRART_COUNT_Pos ) +#define FMC_SDRART_COUNT ( FMC_SDRART_COUNT_Msk ) + +#define FMC_SDRART_CRFE_Pos ( 0U ) +#define FMC_SDRART_CRFE_Msk ( 0x1UL << FMC_SDRART_CRFE_Pos ) +#define FMC_SDRART_CRFE ( FMC_SDRART_CRFE_Msk ) + + +/*************** Bits definition for FMC_SDRSR **********************/ + +#define FMC_SDRSR_BUSY_Pos ( 5U ) +#define FMC_SDRSR_BUSY_Msk ( 0x1UL << FMC_SDRSR_BUSY_Pos ) +#define FMC_SDRSR_BUSY ( FMC_SDRSR_BUSY_Msk ) + +#define FMC_SDRSR_STA2_Pos ( 3U ) +#define FMC_SDRSR_STA2_Msk ( 0x3UL << FMC_SDRSR_STA2_Pos ) +#define FMC_SDRSR_STA2 ( FMC_SDRSR_STA2_Msk ) +#define FMC_SDRSR_STA2_0 ( 0x1UL << FMC_SDRSR_STA2_Pos ) +#define FMC_SDRSR_STA2_1 ( 0x2UL << FMC_SDRSR_STA2_Pos ) + +#define FMC_SDRSR_STA1_Pos ( 1U ) +#define FMC_SDRSR_STA1_Msk ( 0x3UL << FMC_SDRSR_STA1_Pos ) +#define FMC_SDRSR_STA1 ( FMC_SDRSR_STA1_Msk ) +#define FMC_SDRSR_STA1_0 ( 0x1UL << FMC_SDRSR_STA1_Pos ) +#define FMC_SDRSR_STA1_1 ( 0x2UL << FMC_SDRSR_STA1_Pos ) + +#define FMC_SDRSR_RFE_Pos ( 0U ) +#define FMC_SDRSR_RFE_Msk ( 0x1UL << FMC_SDRSR_RFE_Pos ) +#define FMC_SDRSR_RFE ( FMC_SDRSR_RFE_Msk ) + + +/*************** Bits definition for FMC_SDRSMA1 **********************/ + +#define FMC_SDRSMA_SMA1_Pos ( 0U ) +#define FMC_SDRSMA_SMA1_Msk ( 0xffffffffUL << FMC_SDRSMA_SMA1_Pos ) +#define FMC_SDRSMA_SMA1 ( FMC_SDRSMA_SMA1_Msk ) + +/*************** Bits definition for FMC_SDRSMA2 **********************/ + +#define FMC_SDRSMA_SMA2_Pos ( 0U ) +#define FMC_SDRSMA_SMA2_Msk ( 0xffffffffUL << FMC_SDRSMA_SMA2_Pos ) +#define FMC_SDRSMA_SMA2 ( FMC_SDRSMA_SMA2_Msk ) + +/*************** Bits definition for LPTIM_ISR **********************/ + +#define LPTIM_ISR_REPOK_Pos ( 8U ) +#define LPTIM_ISR_REPOK_Msk ( 0x1UL << LPTIM_ISR_REPOK_Pos ) +#define LPTIM_ISR_REPOK ( LPTIM_ISR_REPOK_Msk ) + +#define LPTIM_ISR_REPUE_Pos ( 7U ) +#define LPTIM_ISR_REPUE_Msk ( 0x1UL << LPTIM_ISR_REPUE_Pos ) +#define LPTIM_ISR_REPUE ( LPTIM_ISR_REPUE_Msk ) + +#define LPTIM_ISR_DOWN_Pos ( 6U ) +#define LPTIM_ISR_DOWN_Msk ( 0x1UL << LPTIM_ISR_DOWN_Pos ) +#define LPTIM_ISR_DOWN ( LPTIM_ISR_DOWN_Msk ) + +#define LPTIM_ISR_UP_Pos ( 5U ) +#define LPTIM_ISR_UP_Msk ( 0x1UL << LPTIM_ISR_UP_Pos ) +#define LPTIM_ISR_UP ( LPTIM_ISR_UP_Msk ) + +#define LPTIM_ISR_ARROK_Pos ( 4U ) +#define LPTIM_ISR_ARROK_Msk ( 0x1UL << LPTIM_ISR_ARROK_Pos ) +#define LPTIM_ISR_ARROK ( LPTIM_ISR_ARROK_Msk ) + +#define LPTIM_ISR_CMPOK_Pos ( 3U ) +#define LPTIM_ISR_CMPOK_Msk ( 0x1UL << LPTIM_ISR_CMPOK_Pos ) +#define LPTIM_ISR_CMPOK ( LPTIM_ISR_CMPOK_Msk ) + +#define LPTIM_ISR_EXTTRIG_Pos ( 2U ) +#define LPTIM_ISR_EXTTRIG_Msk ( 0x1UL << LPTIM_ISR_EXTTRIG_Pos ) +#define LPTIM_ISR_EXTTRIG ( LPTIM_ISR_EXTTRIG_Msk ) + +#define LPTIM_ISR_ARRM_Pos ( 1U ) +#define LPTIM_ISR_ARRM_Msk ( 0x1UL << LPTIM_ISR_ARRM_Pos ) +#define LPTIM_ISR_ARRM ( LPTIM_ISR_ARRM_Msk ) + +#define LPTIM_ISR_CMPM_Pos ( 0U ) +#define LPTIM_ISR_CMPM_Msk ( 0x1UL << LPTIM_ISR_CMPM_Pos ) +#define LPTIM_ISR_CMPM ( LPTIM_ISR_CMPM_Msk ) + + +/*************** Bits definition for LPTIM_ICR **********************/ + +#define LPTIM_ICR_REPOKCF_Pos ( 8U ) +#define LPTIM_ICR_REPOKCF_Msk ( 0x1UL << LPTIM_ICR_REPOKCF_Pos ) +#define LPTIM_ICR_REPOKCF ( LPTIM_ICR_REPOKCF_Msk ) + +#define LPTIM_ICR_REPUECF_Pos ( 7U ) +#define LPTIM_ICR_REPUECF_Msk ( 0x1UL << LPTIM_ICR_REPUECF_Pos ) +#define LPTIM_ICR_REPUECF ( LPTIM_ICR_REPUECF_Msk ) + +#define LPTIM_ICR_DOWNCF_Pos ( 6U ) +#define LPTIM_ICR_DOWNCF_Msk ( 0x1UL << LPTIM_ICR_DOWNCF_Pos ) +#define LPTIM_ICR_DOWNCF ( LPTIM_ICR_DOWNCF_Msk ) + +#define LPTIM_ICR_UPCF_Pos ( 5U ) +#define LPTIM_ICR_UPCF_Msk ( 0x1UL << LPTIM_ICR_UPCF_Pos ) +#define LPTIM_ICR_UPCF ( LPTIM_ICR_UPCF_Msk ) + +#define LPTIM_ICR_ARROKCF_Pos ( 4U ) +#define LPTIM_ICR_ARROKCF_Msk ( 0x1UL << LPTIM_ICR_ARROKCF_Pos ) +#define LPTIM_ICR_ARROKCF ( LPTIM_ICR_ARROKCF_Msk ) + +#define LPTIM_ICR_CMPOKCF_Pos ( 3U ) +#define LPTIM_ICR_CMPOKCF_Msk ( 0x1UL << LPTIM_ICR_CMPOKCF_Pos ) +#define LPTIM_ICR_CMPOKCF ( LPTIM_ICR_CMPOKCF_Msk ) + +#define LPTIM_ICR_EXTTRIGCF_Pos ( 2U ) +#define LPTIM_ICR_EXTTRIGCF_Msk ( 0x1UL << LPTIM_ICR_EXTTRIGCF_Pos ) +#define LPTIM_ICR_EXTTRIGCF ( LPTIM_ICR_EXTTRIGCF_Msk ) + +#define LPTIM_ICR_ARRMCF_Pos ( 1U ) +#define LPTIM_ICR_ARRMCF_Msk ( 0x1UL << LPTIM_ICR_ARRMCF_Pos ) +#define LPTIM_ICR_ARRMCF ( LPTIM_ICR_ARRMCF_Msk ) + +#define LPTIM_ICR_CMPMCF_Pos ( 0U ) +#define LPTIM_ICR_CMPMCF_Msk ( 0x1UL << LPTIM_ICR_CMPMCF_Pos ) +#define LPTIM_ICR_CMPMCF ( LPTIM_ICR_CMPMCF_Msk ) + + +/*************** Bits definition for LPTIM_IER **********************/ + +#define LPTIM_IER_REPOKIE_Pos ( 8U ) +#define LPTIM_IER_REPOKIE_Msk ( 0x1UL << LPTIM_IER_REPOKIE_Pos ) +#define LPTIM_IER_REPOKIE ( LPTIM_IER_REPOKIE_Msk ) + +#define LPTIM_IER_REPUEIE_Pos ( 7U ) +#define LPTIM_IER_REPUEIE_Msk ( 0x1UL << LPTIM_IER_REPUEIE_Pos ) +#define LPTIM_IER_REPUEIE ( LPTIM_IER_REPUEIE_Msk ) + +#define LPTIM_IER_DOWNIE_Pos ( 6U ) +#define LPTIM_IER_DOWNIE_Msk ( 0x1UL << LPTIM_IER_DOWNIE_Pos ) +#define LPTIM_IER_DOWNIE ( LPTIM_IER_DOWNIE_Msk ) + +#define LPTIM_IER_UPIE_Pos ( 5U ) +#define LPTIM_IER_UPIE_Msk ( 0x1UL << LPTIM_IER_UPIE_Pos ) +#define LPTIM_IER_UPIE ( LPTIM_IER_UPIE_Msk ) + +#define LPTIM_IER_ARROKIE_Pos ( 4U ) +#define LPTIM_IER_ARROKIE_Msk ( 0x1UL << LPTIM_IER_ARROKIE_Pos ) +#define LPTIM_IER_ARROKIE ( LPTIM_IER_ARROKIE_Msk ) + +#define LPTIM_IER_CMPOKIE_Pos ( 3U ) +#define LPTIM_IER_CMPOKIE_Msk ( 0x1UL << LPTIM_IER_CMPOKIE_Pos ) +#define LPTIM_IER_CMPOKIE ( LPTIM_IER_CMPOKIE_Msk ) + +#define LPTIM_IER_EXTTRIGIE_Pos ( 2U ) +#define LPTIM_IER_EXTTRIGIE_Msk ( 0x1UL << LPTIM_IER_EXTTRIGIE_Pos ) +#define LPTIM_IER_EXTTRIGIE ( LPTIM_IER_EXTTRIGIE_Msk ) + +#define LPTIM_IER_ARRMIE_Pos ( 1U ) +#define LPTIM_IER_ARRMIE_Msk ( 0x1UL << LPTIM_IER_ARRMIE_Pos ) +#define LPTIM_IER_ARRMIE ( LPTIM_IER_ARRMIE_Msk ) + +#define LPTIM_IER_CMPMIE_Pos ( 0U ) +#define LPTIM_IER_CMPMIE_Msk ( 0x1UL << LPTIM_IER_CMPMIE_Pos ) +#define LPTIM_IER_CMPMIE ( LPTIM_IER_CMPMIE_Msk ) + + +/*************** Bits definition for LPTIM_CFGR1 **********************/ + +#define LPTIM_CFGR1_REP_LODMOD_Pos ( 25U ) +#define LPTIM_CFGR1_REP_LODMOD_Msk ( 0x1UL << LPTIM_CFGR1_REP_LODMOD_Pos ) +#define LPTIM_CFGR1_REP_LODMOD ( LPTIM_CFGR1_REP_LODMOD_Msk ) + +#define LPTIM_CFGR1_ENC_Pos ( 24U ) +#define LPTIM_CFGR1_ENC_Msk ( 0x1UL << LPTIM_CFGR1_ENC_Pos ) +#define LPTIM_CFGR1_ENC ( LPTIM_CFGR1_ENC_Msk ) + +#define LPTIM_CFGR1_COUNTMODE_Pos ( 23U ) +#define LPTIM_CFGR1_COUNTMODE_Msk ( 0x1UL << LPTIM_CFGR1_COUNTMODE_Pos ) +#define LPTIM_CFGR1_COUNTMODE ( LPTIM_CFGR1_COUNTMODE_Msk ) + +#define LPTIM_CFGR1_PRELOAD_Pos ( 22U ) +#define LPTIM_CFGR1_PRELOAD_Msk ( 0x1UL << LPTIM_CFGR1_PRELOAD_Pos ) +#define LPTIM_CFGR1_PRELOAD ( LPTIM_CFGR1_PRELOAD_Msk ) + +#define LPTIM_CFGR1_WAVPOL_Pos ( 21U ) +#define LPTIM_CFGR1_WAVPOL_Msk ( 0x1UL << LPTIM_CFGR1_WAVPOL_Pos ) +#define LPTIM_CFGR1_WAVPOL ( LPTIM_CFGR1_WAVPOL_Msk ) + +#define LPTIM_CFGR1_WAVE_Pos ( 20U ) +#define LPTIM_CFGR1_WAVE_Msk ( 0x1UL << LPTIM_CFGR1_WAVE_Pos ) +#define LPTIM_CFGR1_WAVE ( LPTIM_CFGR1_WAVE_Msk ) + +#define LPTIM_CFGR1_TIMEOUT_Pos ( 19U ) +#define LPTIM_CFGR1_TIMEOUT_Msk ( 0x1UL << LPTIM_CFGR1_TIMEOUT_Pos ) +#define LPTIM_CFGR1_TIMEOUT ( LPTIM_CFGR1_TIMEOUT_Msk ) + +#define LPTIM_CFGR1_TRIGEN_Pos ( 17U ) +#define LPTIM_CFGR1_TRIGEN_Msk ( 0x3UL << LPTIM_CFGR1_TRIGEN_Pos ) +#define LPTIM_CFGR1_TRIGEN ( LPTIM_CFGR1_TRIGEN_Msk ) +#define LPTIM_CFGR1_TRIGEN_0 ( 0x1UL << LPTIM_CFGR1_TRIGEN_Pos ) +#define LPTIM_CFGR1_TRIGEN_1 ( 0x2UL << LPTIM_CFGR1_TRIGEN_Pos ) + +#define LPTIM_CFGR1_TRIGSEL_Pos ( 13U ) +#define LPTIM_CFGR1_TRIGSEL_Msk ( 0xfUL << LPTIM_CFGR1_TRIGSEL_Pos ) +#define LPTIM_CFGR1_TRIGSEL ( LPTIM_CFGR1_TRIGSEL_Msk ) +#define LPTIM_CFGR1_TRIGSEL_0 ( 0x1UL << LPTIM_CFGR1_TRIGSEL_Pos ) +#define LPTIM_CFGR1_TRIGSEL_1 ( 0x2UL << LPTIM_CFGR1_TRIGSEL_Pos ) +#define LPTIM_CFGR1_TRIGSEL_2 ( 0x4UL << LPTIM_CFGR1_TRIGSEL_Pos ) +#define LPTIM_CFGR1_TRIGSEL_3 ( 0x8UL << LPTIM_CFGR1_TRIGSEL_Pos ) + +#define LPTIM_CFGR1_PRESC_Pos ( 9U ) +#define LPTIM_CFGR1_PRESC_Msk ( 0x7UL << LPTIM_CFGR1_PRESC_Pos ) +#define LPTIM_CFGR1_PRESC ( LPTIM_CFGR1_PRESC_Msk ) +#define LPTIM_CFGR1_PRESC_0 ( 0x1UL << LPTIM_CFGR1_PRESC_Pos ) +#define LPTIM_CFGR1_PRESC_1 ( 0x2UL << LPTIM_CFGR1_PRESC_Pos ) +#define LPTIM_CFGR1_PRESC_2 ( 0x4UL << LPTIM_CFGR1_PRESC_Pos ) + +#define LPTIM_CFGR1_TRGFLT_Pos ( 6U ) +#define LPTIM_CFGR1_TRGFLT_Msk ( 0x3UL << LPTIM_CFGR1_TRGFLT_Pos ) +#define LPTIM_CFGR1_TRGFLT ( LPTIM_CFGR1_TRGFLT_Msk ) +#define LPTIM_CFGR1_TRGFLT_0 ( 0x1UL << LPTIM_CFGR1_TRGFLT_Pos ) +#define LPTIM_CFGR1_TRGFLT_1 ( 0x2UL << LPTIM_CFGR1_TRGFLT_Pos ) + +#define LPTIM_CFGR1_CKFLT_Pos ( 3U ) +#define LPTIM_CFGR1_CKFLT_Msk ( 0x3UL << LPTIM_CFGR1_CKFLT_Pos ) +#define LPTIM_CFGR1_CKFLT ( LPTIM_CFGR1_CKFLT_Msk ) +#define LPTIM_CFGR1_CKFLT_0 ( 0x1UL << LPTIM_CFGR1_CKFLT_Pos ) +#define LPTIM_CFGR1_CKFLT_1 ( 0x2UL << LPTIM_CFGR1_CKFLT_Pos ) + +#define LPTIM_CFGR1_CKPOL_Pos ( 1U ) +#define LPTIM_CFGR1_CKPOL_Msk ( 0x3UL << LPTIM_CFGR1_CKPOL_Pos ) +#define LPTIM_CFGR1_CKPOL ( LPTIM_CFGR1_CKPOL_Msk ) +#define LPTIM_CFGR1_CKPOL_0 ( 0x1UL << LPTIM_CFGR1_CKPOL_Pos ) +#define LPTIM_CFGR1_CKPOL_1 ( 0x2UL << LPTIM_CFGR1_CKPOL_Pos ) + +#define LPTIM_CFGR1_CKSEL_Pos ( 0U ) +#define LPTIM_CFGR1_CKSEL_Msk ( 0x1UL << LPTIM_CFGR1_CKSEL_Pos ) +#define LPTIM_CFGR1_CKSEL ( LPTIM_CFGR1_CKSEL_Msk ) + + +/*************** Bits definition for LPTIM_CR **********************/ + +#define LPTIM_CR_RSTARE_Pos ( 4U ) +#define LPTIM_CR_RSTARE_Msk ( 0x1UL << LPTIM_CR_RSTARE_Pos ) +#define LPTIM_CR_RSTARE ( LPTIM_CR_RSTARE_Msk ) + +#define LPTIM_CR_COUNTRST_Pos ( 3U ) +#define LPTIM_CR_COUNTRST_Msk ( 0x1UL << LPTIM_CR_COUNTRST_Pos ) +#define LPTIM_CR_COUNTRST ( LPTIM_CR_COUNTRST_Msk ) + +#define LPTIM_CR_CNTSTRT_Pos ( 2U ) +#define LPTIM_CR_CNTSTRT_Msk ( 0x1UL << LPTIM_CR_CNTSTRT_Pos ) +#define LPTIM_CR_CNTSTRT ( LPTIM_CR_CNTSTRT_Msk ) + +#define LPTIM_CR_SNGSTRT_Pos ( 1U ) +#define LPTIM_CR_SNGSTRT_Msk ( 0x1UL << LPTIM_CR_SNGSTRT_Pos ) +#define LPTIM_CR_SNGSTRT ( LPTIM_CR_SNGSTRT_Msk ) + +#define LPTIM_CR_ENABLE_Pos ( 0U ) +#define LPTIM_CR_ENABLE_Msk ( 0x1UL << LPTIM_CR_ENABLE_Pos ) +#define LPTIM_CR_ENABLE ( LPTIM_CR_ENABLE_Msk ) + + +/*************** Bits definition for LPTIM_CMP **********************/ + +#define LPTIM_CMP_CMP_Pos ( 0U ) +#define LPTIM_CMP_CMP_Msk ( 0xffffUL << LPTIM_CMP_CMP_Pos ) +#define LPTIM_CMP_CMP ( LPTIM_CMP_CMP_Msk ) + + +/*************** Bits definition for LPTIM_ARR **********************/ + +#define LPTIM_ARR_ARR_Pos ( 0U ) +#define LPTIM_ARR_ARR_Msk ( 0xffffUL << LPTIM_ARR_ARR_Pos ) +#define LPTIM_ARR_ARR ( LPTIM_ARR_ARR_Msk ) + + +/*************** Bits definition for LPTIM_CNT **********************/ + +#define LPTIM_CNT_CNT_Pos ( 0U ) +#define LPTIM_CNT_CNT_Msk ( 0xffffUL << LPTIM_CNT_CNT_Pos ) +#define LPTIM_CNT_CNT ( LPTIM_CNT_CNT_Msk ) + + +/*************** Bits definition for LPTIM_CFGR2 **********************/ + +#define LPTIM_CFGR2_IN2SEL_Pos ( 4U ) +#define LPTIM_CFGR2_IN2SEL_Msk ( 0xfUL << LPTIM_CFGR2_IN2SEL_Pos ) +#define LPTIM_CFGR2_IN2SEL ( LPTIM_CFGR2_IN2SEL_Msk ) +#define LPTIM_CFGR2_IN2SEL_0 ( 0x1UL << LPTIM_CFGR2_IN2SEL_Pos ) +#define LPTIM_CFGR2_IN2SEL_1 ( 0x2UL << LPTIM_CFGR2_IN2SEL_Pos ) +#define LPTIM_CFGR2_IN2SEL_2 ( 0x4UL << LPTIM_CFGR2_IN2SEL_Pos ) +#define LPTIM_CFGR2_IN2SEL_3 ( 0x8UL << LPTIM_CFGR2_IN2SEL_Pos ) + +#define LPTIM_CFGR2_IN1SEL_Pos ( 0U ) +#define LPTIM_CFGR2_IN1SEL_Msk ( 0xfUL << LPTIM_CFGR2_IN1SEL_Pos ) +#define LPTIM_CFGR2_IN1SEL ( LPTIM_CFGR2_IN1SEL_Msk ) +#define LPTIM_CFGR2_IN1SEL_0 ( 0x1UL << LPTIM_CFGR2_IN1SEL_Pos ) +#define LPTIM_CFGR2_IN1SEL_1 ( 0x2UL << LPTIM_CFGR2_IN1SEL_Pos ) +#define LPTIM_CFGR2_IN1SEL_2 ( 0x4UL << LPTIM_CFGR2_IN1SEL_Pos ) +#define LPTIM_CFGR2_IN1SEL_3 ( 0x8UL << LPTIM_CFGR2_IN1SEL_Pos ) + + +/*************** Bits definition for LPTIM_RCR **********************/ + +#define LPTIM_RCR_REP_Pos ( 0U ) +#define LPTIM_RCR_REP_Msk ( 0xffUL << LPTIM_RCR_REP_Pos ) +#define LPTIM_RCR_REP ( LPTIM_RCR_REP_Msk ) +#define LPTIM_RCR_REP_0 ( 0x1UL << LPTIM_RCR_REP_Pos ) +#define LPTIM_RCR_REP_1 ( 0x2UL << LPTIM_RCR_REP_Pos ) +#define LPTIM_RCR_REP_2 ( 0x4UL << LPTIM_RCR_REP_Pos ) +#define LPTIM_RCR_REP_3 ( 0x8UL << LPTIM_RCR_REP_Pos ) +#define LPTIM_RCR_REP_4 ( 0x10UL << LPTIM_RCR_REP_Pos ) +#define LPTIM_RCR_REP_5 ( 0x20UL << LPTIM_RCR_REP_Pos ) +#define LPTIM_RCR_REP_6 ( 0x40UL << LPTIM_RCR_REP_Pos ) +#define LPTIM_RCR_REP_7 ( 0x80UL << LPTIM_RCR_REP_Pos ) + + +/*************** Bits definition for OPA_CSR **********************/ + +#define OPA_CSR_LOCK_Pos ( 31U ) +#define OPA_CSR_LOCK_Msk ( 0x1UL << OPA_CSR_LOCK_Pos ) +#define OPA_CSR_LOCK ( OPA_CSR_LOCK_Msk ) + +#define OPA_CSR_REV_Pos ( 29U ) +#define OPA_CSR_REV_Msk ( 0x3UL << OPA_CSR_REV_Pos ) +#define OPA_CSR_REV ( OPA_CSR_REV_Msk ) +#define OPA_CSR_REV_0 ( 0x1UL << OPA_CSR_REV_Pos ) +#define OPA_CSR_REV_1 ( 0x2UL << OPA_CSR_REV_Pos ) + +#define OPA_CSR_HSM_Pos ( 28U ) +#define OPA_CSR_HSM_Msk ( 0x1UL << OPA_CSR_HSM_Pos ) +#define OPA_CSR_HSM ( OPA_CSR_HSM_Msk ) + +#define OPA_CSR_GAIN_SEL_Pos ( 23U ) +#define OPA_CSR_GAIN_SEL_Msk ( 0x1fUL << OPA_CSR_GAIN_SEL_Pos ) +#define OPA_CSR_GAIN_SEL ( OPA_CSR_GAIN_SEL_Msk ) +#define OPA_CSR_GAIN_SEL_0 ( 0x1UL << OPA_CSR_GAIN_SEL_Pos ) +#define OPA_CSR_GAIN_SEL_1 ( 0x2UL << OPA_CSR_GAIN_SEL_Pos ) +#define OPA_CSR_GAIN_SEL_2 ( 0x4UL << OPA_CSR_GAIN_SEL_Pos ) +#define OPA_CSR_GAIN_SEL_3 ( 0x8UL << OPA_CSR_GAIN_SEL_Pos ) +#define OPA_CSR_GAIN_SEL_4 ( 0x10UL << OPA_CSR_GAIN_SEL_Pos ) + +#define OPA_CSR_POL_SEL_Pos ( 21U ) +#define OPA_CSR_POL_SEL_Msk ( 0x3UL << OPA_CSR_POL_SEL_Pos ) +#define OPA_CSR_POL_SEL ( OPA_CSR_POL_SEL_Msk ) +#define OPA_CSR_POL_SEL_0 ( 0x1UL << OPA_CSR_POL_SEL_Pos ) +#define OPA_CSR_POL_SEL_1 ( 0x2UL << OPA_CSR_POL_SEL_Pos ) + +#define OPA_CSR_VINM0_EN_Pos ( 20U ) +#define OPA_CSR_VINM0_EN_Msk ( 0x1UL << OPA_CSR_VINM0_EN_Pos ) +#define OPA_CSR_VINM0_EN ( OPA_CSR_VINM0_EN_Msk ) + +#define OPA_CSR_MODE_SEL_Pos ( 18U ) +#define OPA_CSR_MODE_SEL_Msk ( 0x3UL << OPA_CSR_MODE_SEL_Pos ) +#define OPA_CSR_MODE_SEL ( OPA_CSR_MODE_SEL_Msk ) +#define OPA_CSR_MODE_SEL_0 ( 0x1UL << OPA_CSR_MODE_SEL_Pos ) +#define OPA_CSR_MODE_SEL_1 ( 0x2UL << OPA_CSR_MODE_SEL_Pos ) + +#define OPA_CSR_VINP_SEL_Pos ( 16U ) +#define OPA_CSR_VINP_SEL_Msk ( 0x3UL << OPA_CSR_VINP_SEL_Pos ) +#define OPA_CSR_VINP_SEL ( OPA_CSR_VINP_SEL_Msk ) +#define OPA_CSR_VINP_SEL_0 ( 0x1UL << OPA_CSR_VINP_SEL_Pos ) +#define OPA_CSR_VINP_SEL_1 ( 0x2UL << OPA_CSR_VINP_SEL_Pos ) + +#define OPA_CSR_OUT_SEL_Pos ( 14U ) +#define OPA_CSR_OUT_SEL_Msk ( 0x3UL << OPA_CSR_OUT_SEL_Pos ) +#define OPA_CSR_OUT_SEL ( OPA_CSR_OUT_SEL_Msk ) +#define OPA_CSR_OUT_SEL_0 ( 0x1UL << OPA_CSR_OUT_SEL_Pos ) +#define OPA_CSR_OUT_SEL_1 ( 0x2UL << OPA_CSR_OUT_SEL_Pos ) + +#define OPA_CSR_TRIM_OSN_Pos ( 9U ) +#define OPA_CSR_TRIM_OSN_Msk ( 0x1fUL << OPA_CSR_TRIM_OSN_Pos ) +#define OPA_CSR_TRIM_OSN ( OPA_CSR_TRIM_OSN_Msk ) +#define OPA_CSR_TRIM_OSN_0 ( 0x1UL << OPA_CSR_TRIM_OSN_Pos ) +#define OPA_CSR_TRIM_OSN_1 ( 0x2UL << OPA_CSR_TRIM_OSN_Pos ) +#define OPA_CSR_TRIM_OSN_2 ( 0x4UL << OPA_CSR_TRIM_OSN_Pos ) +#define OPA_CSR_TRIM_OSN_3 ( 0x8UL << OPA_CSR_TRIM_OSN_Pos ) +#define OPA_CSR_TRIM_OSN_4 ( 0x10UL << OPA_CSR_TRIM_OSN_Pos ) + +#define OPA_CSR_TRIM_OSP_Pos ( 4U ) +#define OPA_CSR_TRIM_OSP_Msk ( 0x1fUL << OPA_CSR_TRIM_OSP_Pos ) +#define OPA_CSR_TRIM_OSP ( OPA_CSR_TRIM_OSP_Msk ) +#define OPA_CSR_TRIM_OSP_0 ( 0x1UL << OPA_CSR_TRIM_OSP_Pos ) +#define OPA_CSR_TRIM_OSP_1 ( 0x2UL << OPA_CSR_TRIM_OSP_Pos ) +#define OPA_CSR_TRIM_OSP_2 ( 0x4UL << OPA_CSR_TRIM_OSP_Pos ) +#define OPA_CSR_TRIM_OSP_3 ( 0x8UL << OPA_CSR_TRIM_OSP_Pos ) +#define OPA_CSR_TRIM_OSP_4 ( 0x10UL << OPA_CSR_TRIM_OSP_Pos ) + +#define OPA_CSR_CAL_OUT_Pos ( 3U ) +#define OPA_CSR_CAL_OUT_Msk ( 0x1UL << OPA_CSR_CAL_OUT_Pos ) +#define OPA_CSR_CAL_OUT ( OPA_CSR_CAL_OUT_Msk ) + +#define OPA_CSR_CAL_NEN_Pos ( 2U ) +#define OPA_CSR_CAL_NEN_Msk ( 0x1UL << OPA_CSR_CAL_NEN_Pos ) +#define OPA_CSR_CAL_NEN ( OPA_CSR_CAL_NEN_Msk ) + +#define OPA_CSR_CAL_PEN_Pos ( 1U ) +#define OPA_CSR_CAL_PEN_Msk ( 0x1UL << OPA_CSR_CAL_PEN_Pos ) +#define OPA_CSR_CAL_PEN ( OPA_CSR_CAL_PEN_Msk ) + +#define OPA_CSR_EN_Pos ( 0U ) +#define OPA_CSR_EN_Msk ( 0x1UL << OPA_CSR_EN_Pos ) +#define OPA_CSR_EN ( OPA_CSR_EN_Msk ) + +/*************** Bits definition for FMC_NAND_CTRL **********************/ + +#define FMC_NAND_CTRL_EDO_EN_Pos ( 7U ) +#define FMC_NAND_CTRL_EDO_EN_Msk ( 0x1UL << FMC_NAND_CTRL_EDO_EN_Pos ) +#define FMC_NAND_CTRL_EDO_EN ( FMC_NAND_CTRL_EDO_EN_Msk ) + +#define FMC_NAND_CTRL_RBNINT_EN_Pos ( 6U ) +#define FMC_NAND_CTRL_RBNINT_EN_Msk ( 0x1UL << FMC_NAND_CTRL_RBNINTEN_Pos ) +#define FMC_NAND_CTRL_RBNINT_EN ( FMC_NAND_CTRL_RBNINTEN_Msk ) + +#define FMC_NAND_CTRL_ENDIAN_EN_Pos ( 5U ) +#define FMC_NAND_CTRL_ENDIAN_EN_Msk ( 0x1UL << FMC_NAND_CTRL_ENDIAN_Pos ) +#define FMC_NAND_CTRL_ENDIAN_EN ( FMC_NAND_CTRL_ENDIAN_Msk ) + +#define FMC_NAND_CTRL_FWP_Pos ( 4U ) +#define FMC_NAND_CTRL_FWP_Msk ( 0x1UL << FMC_NAND_CTRL_FWP_Pos ) +#define FMC_NAND_CTRL_FWP ( FMC_NAND_CTRL_FWP_Msk ) + +#define FMC_NAND_CTRL_FCE_Pos ( 0U ) +#define FMC_NAND_CTRL_FCE_Msk ( 0xfUL << FMC_NAND_CTRL_FCE_Pos ) +#define FMC_NAND_CTRL_FCE ( FMC_NAND_CTRL_FCE_Msk ) +#define FMC_NAND_CTRL_FCE_0 ( 0x1UL << FMC_NAND_CTRL_FCE_Pos ) +#define FMC_NAND_CTRL_FCE_1 ( 0x2UL << FMC_NAND_CTRL_FCE_Pos ) +#define FMC_NAND_CTRL_FCE_2 ( 0x4UL << FMC_NAND_CTRL_FCE_Pos ) +#define FMC_NAND_CTRL_FCE_3 ( 0x8UL << FMC_NAND_CTRL_FCE_Pos ) + +/*************** Bits definition for FMC_NAND_WST **********************/ + +#define FMC_NAND_WST_TADL_Pos ( 24U ) +#define FMC_NAND_WST_TADL_Msk ( 0xfUL << FMC_NAND_WST_TADL_Pos ) +#define FMC_NAND_WST_TADL ( FMC_NAND_WST_TADL_Msk ) +#define FMC_NAND_WST_TADL_0 ( 0x1UL << FMC_NAND_WST_TADL_Pos ) +#define FMC_NAND_WST_TADL_1 ( 0x2UL << FMC_NAND_WST_TADL_Pos ) +#define FMC_NAND_WST_TADL_2 ( 0x4UL << FMC_NAND_WST_TADL_Pos ) +#define FMC_NAND_WST_TADL_3 ( 0x8UL << FMC_NAND_WST_TADL_Pos ) + +#define FMC_NAND_WST_TRHW_Pos ( 20U ) +#define FMC_NAND_WST_TRHW_Msk ( 0xfUL << FMC_NAND_WST_TRHW_Pos ) +#define FMC_NAND_WST_TRHW ( FMC_NAND_WST_TRHW_Msk ) +#define FMC_NAND_WST_TRHW_0 ( 0x1UL << FMC_NAND_WST_TRHW_Pos ) +#define FMC_NAND_WST_TRHW_1 ( 0x2UL << FMC_NAND_WST_TRHW_Pos ) +#define FMC_NAND_WST_TRHW_2 ( 0x4UL << FMC_NAND_WST_TRHW_Pos ) +#define FMC_NAND_WST_TRHW_3 ( 0x8UL << FMC_NAND_WST_TRHW_Pos ) + +#define FMC_NAND_WST_TWHR_Pos ( 16U ) +#define FMC_NAND_WST_TWHR_Msk ( 0xfUL << FMC_NAND_WST_TWHR_Pos ) +#define FMC_NAND_WST_TWHR ( FMC_NAND_WST_TWHR_Msk ) +#define FMC_NAND_WST_TWHR_0 ( 0x1UL << FMC_NAND_WST_TWHR_Pos ) +#define FMC_NAND_WST_TWHR_1 ( 0x2UL << FMC_NAND_WST_TWHR_Pos ) +#define FMC_NAND_WST_TWHR_2 ( 0x4UL << FMC_NAND_WST_TWHR_Pos ) +#define FMC_NAND_WST_TWHR_3 ( 0x8UL << FMC_NAND_WST_TWHR_Pos ) + +#define FMC_NAND_WST_TREH_Pos ( 12U ) +#define FMC_NAND_WST_TREH_Msk ( 0xfUL << FMC_NAND_WST_TREH_Pos ) +#define FMC_NAND_WST_TREH ( FMC_NAND_WST_TREH_Msk ) +#define FMC_NAND_WST_TREH_0 ( 0x1UL << FMC_NAND_WST_TREH_Pos ) +#define FMC_NAND_WST_TREH_1 ( 0x2UL << FMC_NAND_WST_TREH_Pos ) +#define FMC_NAND_WST_TREH_2 ( 0x4UL << FMC_NAND_WST_TREH_Pos ) +#define FMC_NAND_WST_TREH_3 ( 0x8UL << FMC_NAND_WST_TREH_Pos ) + + +#define FMC_NAND_WST_TRP_Pos ( 8U ) +#define FMC_NAND_WST_TRP_Msk ( 0xfUL << FMC_NAND_WST_TRP_Pos ) +#define FMC_NAND_WST_TRP ( FMC_NAND_WST_TRP_Msk ) +#define FMC_NAND_WST_TRP_0 ( 0x1UL << FMC_NAND_WST_TRP_Pos ) +#define FMC_NAND_WST_TRP_1 ( 0x2UL << FMC_NAND_WST_TRP_Pos ) +#define FMC_NAND_WST_TRP_2 ( 0x4UL << FMC_NAND_WST_TRP_Pos ) +#define FMC_NAND_WST_TRP_3 ( 0x8UL << FMC_NAND_WST_TRP_Pos ) + +#define FMC_NAND_WST_TWH_Pos ( 4U ) +#define FMC_NAND_WST_TWH_Msk ( 0xfUL << FMC_NAND_WST_TWH_Pos ) +#define FMC_NAND_WST_TWH ( FMC_NAND_WST_TWH_Msk ) +#define FMC_NAND_WST_TWH_0 ( 0x1UL << FMC_NAND_WST_TWH_Pos ) +#define FMC_NAND_WST_TWH_1 ( 0x2UL << FMC_NAND_WST_TWH_Pos ) +#define FMC_NAND_WST_TWH_2 ( 0x4UL << FMC_NAND_WST_TWH_Pos ) +#define FMC_NAND_WST_TWH_3 ( 0x8UL << FMC_NAND_WST_TWH_Pos ) + +#define FMC_NAND_WST_TWP_Pos ( 0U ) +#define FMC_NAND_WST_TWP_Msk ( 0xfUL << FMC_NAND_WST_TWP_Pos ) +#define FMC_NAND_WST_TWP ( FMC_NAND_WST_TWP_Msk ) +#define FMC_NAND_WST_TWP_0 ( 0x1UL << FMC_NAND_WST_TWP_Pos ) +#define FMC_NAND_WST_TWP_1 ( 0x2UL << FMC_NAND_WST_TWP_Pos ) +#define FMC_NAND_WST_TWP_2 ( 0x4UL << FMC_NAND_WST_TWP_Pos ) +#define FMC_NAND_WST_TWP_3 ( 0x8UL << FMC_NAND_WST_TWP_Pos ) + +/*************** Bits definition for FMC_NAND_STATUS **********************/ + +#define FMC_NAND_STATUS_POS_RBN_Pos ( 4U ) +#define FMC_NAND_STATUS_POS_RBN_Msk ( 0xfUL << FMC_NAND_STATUS_POS_RBN_Pos ) +#define FMC_NAND_STATUS_POS_RBN ( FMC_NAND_STATUS_POS_RBN_Msk ) +#define FMC_NAND_STATUS_POS_RBN_0 ( 0x1UL << FMC_NAND_STATUS_POS_RBN_Pos ) +#define FMC_NAND_STATUS_POS_RBN_1 ( 0x2UL << FMC_NAND_STATUS_POS_RBN_Pos ) +#define FMC_NAND_STATUS_POS_RBN_2 ( 0x4UL << FMC_NAND_STATUS_POS_RBN_Pos ) +#define FMC_NAND_STATUS_POS_RBN_3 ( 0x8UL << FMC_NAND_STATUS_POS_RBN_Pos ) + +#define FMC_NAND_STATUS_RBN_Pos ( 0U ) +#define FMC_NAND_STATUS_RBN_Msk ( 0xfUL << FMC_NAND_STATUS_RBN_Pos ) +#define FMC_NAND_STATUS_RBN ( FMC_NAND_STATUS_RBN_Msk ) +#define FMC_NAND_STATUS_RBN_0 ( 0x1UL << FMC_NAND_STATUS_RBN_Pos ) +#define FMC_NAND_STATUS_RBN_1 ( 0x2UL << FMC_NAND_STATUS_RBN_Pos ) +#define FMC_NAND_STATUS_RBN_2 ( 0x4UL << FMC_NAND_STATUS_RBN_Pos ) +#define FMC_NAND_STATUS_RBN_3 ( 0x8UL << FMC_NAND_STATUS_RBN_Pos ) + +/*************** Bits definition for FMC_NAND_BCH_CONFIG **********************/ + +#define FMC_NAND_BCH_CONFIG_BCH_TYPE_Pos ( 0U ) +#define FMC_NAND_BCH_CONFIG_BCH_TYPE_Msk ( 0x7UL << FMC_NAND_BCH_CONFIG_BCH_TYPE_Pos ) +#define FMC_NAND_BCH_CONFIG_BCH_TYPE ( FMC_NAND_BCH_CONFIG_BCH_TYPE_Msk ) +#define FMC_NAND_BCH_CONFIG_BCH_TYPE_0 ( 0x1UL << FMC_NAND_BCH_CONFIG_BCH_TYPE_Pos ) +#define FMC_NAND_BCH_CONFIG_BCH_TYPE_1 ( 0x2UL << FMC_NAND_BCH_CONFIG_BCH_TYPE_Pos ) +#define FMC_NAND_BCH_CONFIG_BCH_TYPE_2 ( 0x4UL << FMC_NAND_BCH_CONFIG_BCH_TYPE_Pos ) + +/*************** Bits definition for FMC_NAND_BCH_CTRL **********************/ + +#define FMC_NAND_BCH_CTRL_AUTO_CORRECT_Pos ( 5U ) +#define FMC_NAND_BCH_CTRL_AUTO_CORRECT_Msk ( 0x1UL << FMC_NAND_BCH_CTRL_AUTO_CORRECT_Pos ) +#define FMC_NAND_BCH_CTRL_AUTO_CORRECT ( FMC_NAND_BCH_CTRL_AUTO_CORRECT_Msk ) + +#define FMC_NAND_BCH_CTRL_DECODE_INT_ENABLE_Pos ( 4U ) +#define FMC_NAND_BCH_CTRL_DECODE_INT_ENABLE_Msk ( 0x1UL << FMC_NAND_BCH_CTRL_DECODE_INT_ENABLE_Pos ) +#define FMC_NAND_BCH_CTRL_DECODE_INT_ENABLE ( FMC_NAND_BCH_CTRL_DECODE_INT_ENABLE_Msk ) + +#define FMC_NAND_BCH_CTRL_RESET_CHANNEL_Pos ( 3U ) +#define FMC_NAND_BCH_CTRL_RESET_CHANNEL_Msk ( 0x1UL << FMC_NAND_BCH_CTRL_RESET_CHANNEL_Pos ) +#define FMC_NAND_BCH_CTRL_RESET_CHANNEL ( FMC_NAND_BCH_CTRL_RESET_CHANNEL_Msk ) + +#define FMC_NAND_BCH_CTRL_IGALL1_Pos ( 1U ) +#define FMC_NAND_BCH_CTRL_IGALL1_Msk ( 0x1UL << FMC_NAND_BCH_CTRL_IGALL1_Pos ) +#define FMC_NAND_BCH_CTRL_IGALL1 ( FMC_NAND_BCH_CTRL_IGALL1_Msk ) + +#define FMC_NAND_BCH_CTRL_MODE_Pos ( 0U ) +#define FMC_NAND_BCH_CTRL_MODE_Msk ( 0x1UL << FMC_NAND_BCH_CTRL_MODE_Pos ) +#define FMC_NAND_BCH_CTRL_MODE ( FMC_NAND_BCH_CTRL_MODE_Msk ) + +/*************** Bits definition for FMC_NAND_BCH_STATUS **********************/ + +#define FMC_NAND_BCH_STATUS_CEN_Pos ( 24U ) +#define FMC_NAND_BCH_STATUS_CEN_Msk ( 0xffUL << FMC_NAND_BCH_STATUS_CEN_Pos ) +#define FMC_NAND_BCH_STATUS_CEN ( FMC_NAND_BCH_STATUS_CEN_Msk ) + +#define FMC_NAND_BCH_STATUS_DEN_Pos ( 16U ) +#define FMC_NAND_BCH_STATUS_DEN_Msk ( 0xffUL << FMC_NAND_BCH_STATUS_DEN_Pos ) +#define FMC_NAND_BCH_STATUS_DEN ( FMC_NAND_BCH_STATUS_DEN_Msk ) + +#define FMC_NAND_BCH_STATUS_ERN_Pos ( 8U ) +#define FMC_NAND_BCH_STATUS_ERN_Msk ( 0xffUL << FMC_NAND_BCH_STATUS_ERN_Pos ) +#define FMC_NAND_BCH_STATUS_ERN ( FMC_NAND_BCH_STATUS_ERN_Msk ) + +#define FMC_NAND_BCH_STATUS_DATA_ALL0_Pos ( 6U ) +#define FMC_NAND_BCH_STATUS_DATA_ALL0_Msk ( 0x1UL << FMC_NAND_BCH_STATUS_DATA_ALL0_Pos ) +#define FMC_NAND_BCH_STATUS_DATA_ALL0 ( FMC_NAND_BCH_STATUS_DATA_ALL0_Msk ) + +#define FMC_NAND_BCH_STATUS_DATA_ALL1_Pos ( 5U ) +#define FMC_NAND_BCH_STATUS_DATA_ALL1_Msk ( 0x1UL << FMC_NAND_BCH_STATUS_DATA_ALL1_Pos ) +#define FMC_NAND_BCH_STATUS_DATA_ALL1 ( FMC_NAND_BCH_STATUS_DATA_ALL1_Msk ) + +#define FMC_NAND_BCH_STATUS_BCH_FAIL_Pos ( 4U ) +#define FMC_NAND_BCH_STATUS_BCH_FAIL_Msk ( 0x1UL << FMC_NAND_BCH_STATUS_BCH_FAIL_Pos ) +#define FMC_NAND_BCH_STATUS_BCH_FAIL ( FMC_NAND_BCH_STATUS_BCH_FAIL_Msk ) + +#define FMC_NAND_BCH_STATUS_CORRECT_DONE_Pos ( 3U ) +#define FMC_NAND_BCH_STATUS_CORRECT_DONE_Msk ( 0x1UL << FMC_NAND_BCH_STATUS_CORRECT_DONE_Pos ) +#define FMC_NAND_BCH_STATUS_CORRECT_DONE ( FMC_NAND_BCH_STATUS_CORRECT_DONE_Msk ) + +#define FMC_NAND_BCH_STATUS_BM_DONE_Pos ( 2U ) +#define FMC_NAND_BCH_STATUS_BM_DONE_Msk ( 0x1UL << FMC_NAND_BCH_STATUS_BM_DONE_Pos ) +#define FMC_NAND_BCH_STATUS_BM_DONE ( FMC_NAND_BCH_STATUS_BM_DONE_Msk ) + +#define FMC_NAND_BCH_STATUS_SNYDROME_DONE_Pos ( 1U ) +#define FMC_NAND_BCH_STATUS_SNYDROME_DONE_Msk ( 0x1UL << FMC_NAND_BCH_STATUS_SNYDROME_DONE_Pos ) +#define FMC_NAND_BCH_STATUS_SNYDROME_DONE ( FMC_NAND_BCH_STATUS_SNYDROME_DONE_Msk ) + +#define FMC_NAND_BCH_STATUS_ENCODE_CLR_Pos ( 0U ) +#define FMC_NAND_BCH_STATUS_ENCODE_CLR_Msk ( 0x1UL << FMC_NAND_BCH_STATUS_ENCODE_CLR_Pos ) +#define FMC_NAND_BCH_STATUS_ENCODE_CLR ( FMC_NAND_BCH_STATUS_ENCODE_CLR_Msk ) + +/*************** Bits definition for COMP_CR **********************/ + +#define COMP_CR_LOCK_Pos ( 31U ) +#define COMP_CR_LOCK_Msk ( 0x1UL << COMP_CR_LOCK_Pos ) +#define COMP_CR_LOCK ( COMP_CR_LOCK_Msk ) + +#define COMP_CR_CRV_CFG_Pos ( 25U ) +#define COMP_CR_CRV_CFG_Msk ( 0xfUL << COMP_CR_CRV_CFG_Pos ) +#define COMP_CR_CRV_CFG ( COMP_CR_CRV_CFG_Msk ) +#define COMP_CR_CRV_CFG_0 ( 0x1UL << COMP_CR_CRV_CFG_Pos ) +#define COMP_CR_CRV_CFG_1 ( 0x2UL << COMP_CR_CRV_CFG_Pos ) +#define COMP_CR_CRV_CFG_2 ( 0x4UL << COMP_CR_CRV_CFG_Pos ) +#define COMP_CR_CRV_CFG_3 ( 0x8UL << COMP_CR_CRV_CFG_Pos ) + +#define COMP_CR_CRV_SEL_Pos ( 24U ) +#define COMP_CR_CRV_SEL_Msk ( 0x1UL << COMP_CR_CRV_SEL_Pos ) +#define COMP_CR_CRV_SEL ( COMP_CR_CRV_SEL_Msk ) + +#define COMP_CR_CRV_EN_Pos ( 23U ) +#define COMP_CR_CRV_EN_Msk ( 0x1UL << COMP_CR_CRV_EN_Pos ) +#define COMP_CR_CRV_EN ( COMP_CR_CRV_EN_Msk ) + +#define COMP_CR_POLARITY_Pos ( 20U ) +#define COMP_CR_POLARITY_Msk ( 0x1UL << COMP_CR_POLARITY_Pos ) +#define COMP_CR_POLARITY ( COMP_CR_POLARITY_Msk ) + +#define COMP_CR_FLTEN_Pos ( 19U ) +#define COMP_CR_FLTEN_Msk ( 0x1UL << COMP_CR_FLTEN_Pos ) +#define COMP_CR_FLTEN ( COMP_CR_FLTEN_Msk ) + +#define COMP_CR_FLTTIME_Pos ( 16U ) +#define COMP_CR_FLTTIME_Msk ( 0x7UL << COMP_CR_FLTTIME_Pos ) +#define COMP_CR_FLTTIME ( COMP_CR_FLTTIME_Msk ) +#define COMP_CR_FLTTIME_0 ( 0x1UL << COMP_CR_FLTTIME_Pos ) +#define COMP_CR_FLTTIME_1 ( 0x2UL << COMP_CR_FLTTIME_Pos ) +#define COMP_CR_FLTTIME_2 ( 0x4UL << COMP_CR_FLTTIME_Pos ) + +#define COMP_CR_BLANKSEL_Pos ( 12U ) +#define COMP_CR_BLANKSEL_Msk ( 0x7UL << COMP_CR_BLANKSEL_Pos ) +#define COMP_CR_BLANKSEL ( COMP_CR_BLANKSEL_Msk ) +#define COMP_CR_BLANKSEL_0 ( 0x1UL << COMP_CR_BLANKSEL_Pos ) +#define COMP_CR_BLANKSEL_1 ( 0x2UL << COMP_CR_BLANKSEL_Pos ) +#define COMP_CR_BLANKSEL_2 ( 0x4UL << COMP_CR_BLANKSEL_Pos ) + +#define COMP_CR_INPSEL_Pos ( 8U ) +#define COMP_CR_INPSEL_Msk ( 0xfUL << COMP_CR_INPSEL_Pos ) +#define COMP_CR_INPSEL ( COMP_CR_INPSEL_Msk ) +#define COMP_CR_INPSEL_0 ( 0x1UL << COMP_CR_INPSEL_Pos ) +#define COMP_CR_INPSEL_1 ( 0x2UL << COMP_CR_INPSEL_Pos ) +#define COMP_CR_INPSEL_2 ( 0x4UL << COMP_CR_INPSEL_Pos ) +#define COMP_CR_INPSEL_3 ( 0x8UL << COMP_CR_INPSEL_Pos ) + +#define COMP_CR_INMSEL_Pos ( 4U ) +#define COMP_CR_INMSEL_Msk ( 0xfUL << COMP_CR_INMSEL_Pos ) +#define COMP_CR_INMSEL ( COMP_CR_INMSEL_Msk ) +#define COMP_CR_INMSEL_0 ( 0x1UL << COMP_CR_INMSEL_Pos ) +#define COMP_CR_INMSEL_1 ( 0x2UL << COMP_CR_INMSEL_Pos ) +#define COMP_CR_INMSEL_2 ( 0x4UL << COMP_CR_INMSEL_Pos ) +#define COMP_CR_INMSEL_3 ( 0x8UL << COMP_CR_INMSEL_Pos ) + +#define COMP_CR_HYS_Pos ( 1U ) +#define COMP_CR_HYS_Msk ( 0x7UL << COMP_CR_HYS_Pos ) +#define COMP_CR_HYS ( COMP_CR_HYS_Msk ) +#define COMP_CR_HYS_0 ( 0x1UL << COMP_CR_HYS_Pos ) +#define COMP_CR_HYS_1 ( 0x2UL << COMP_CR_HYS_Pos ) +#define COMP_CR_HYS_2 ( 0x4UL << COMP_CR_HYS_Pos ) + +#define COMP_CR_EN_Pos ( 0U ) +#define COMP_CR_EN_Msk ( 0x1UL << COMP_CR_EN_Pos ) +#define COMP_CR_EN ( COMP_CR_EN_Msk ) + + +/*************** Bits definition for COMP_SR **********************/ + +#define COMP_SR_VCOUT1_ORG_Pos ( 4U ) +#define COMP_SR_VCOUT1_ORG_Msk ( 0x1UL << COMP_SR_VCOUT1_ORG_Pos ) +#define COMP_SR_VCOUT1_ORG ( COMP_SR_VCOUT1_ORG_Msk ) + +#define COMP_SR_VCOUT1_Pos ( 0U ) +#define COMP_SR_VCOUT1_Msk ( 0x1UL << COMP_SR_VCOUT1_Pos ) +#define COMP_SR_VCOUT1 ( COMP_SR_VCOUT1_Msk ) + + + +/*************** Bits definition for EFUSE_WP **********************/ + +#define EFUSE_WP_WP_Pos ( 0U ) +#define EFUSE_WP_WP_Msk ( 0xffffffffUL << EFUSE_WP_WP_Pos ) +#define EFUSE_WP_WP ( EFUSE_WP_WP_Msk ) + + +/*************** Bits definition for EFUSE_CTRL **********************/ + +#define EFUSE_CTRL_MODE_Pos ( 4U ) +#define EFUSE_CTRL_MODE_Msk ( 0x1UL << EFUSE_CTRL_MODE_Pos ) +#define EFUSE_CTRL_MODE ( EFUSE_CTRL_MODE_Msk ) + +#define EFUSE_CTRL_TRIG_Pos ( 0U ) +#define EFUSE_CTRL_TRIG_Msk ( 0x1UL << EFUSE_CTRL_TRIG_Pos ) +#define EFUSE_CTRL_TRIG ( EFUSE_CTRL_TRIG_Msk ) + + +/*************** Bits definition for EFUSE_AR **********************/ + +#define EFUSE_AR_ADDR_Pos ( 0U ) +#define EFUSE_AR_ADDR_Msk ( 0x7ffUL << EFUSE_AR_ADDR_Pos ) +#define EFUSE_AR_ADDR ( EFUSE_AR_ADDR_Msk ) + + +/*************** Bits definition for EFUSE_DWR **********************/ + +#define EFUSE_DWR_WDATA_Pos ( 0U ) +#define EFUSE_DWR_WDATA_Msk ( 0xffUL << EFUSE_DWR_WDATA_Pos ) +#define EFUSE_DWR_WDATA ( EFUSE_DWR_WDATA_Msk ) +#define EFUSE_DWR_WDATA_0 ( 0x1UL << EFUSE_DWR_WDATA_Pos ) +#define EFUSE_DWR_WDATA_1 ( 0x2UL << EFUSE_DWR_WDATA_Pos ) +#define EFUSE_DWR_WDATA_2 ( 0x4UL << EFUSE_DWR_WDATA_Pos ) +#define EFUSE_DWR_WDATA_3 ( 0x8UL << EFUSE_DWR_WDATA_Pos ) +#define EFUSE_DWR_WDATA_4 ( 0x10UL << EFUSE_DWR_WDATA_Pos ) +#define EFUSE_DWR_WDATA_5 ( 0x20UL << EFUSE_DWR_WDATA_Pos ) +#define EFUSE_DWR_WDATA_6 ( 0x40UL << EFUSE_DWR_WDATA_Pos ) +#define EFUSE_DWR_WDATA_7 ( 0x80UL << EFUSE_DWR_WDATA_Pos ) + + +/*************** Bits definition for EFUSE_SR **********************/ + +#define EFUSE_SR_PREREAD_DONE_Pos ( 31U ) +#define EFUSE_SR_PREREAD_DONE_Msk ( 0x1UL << EFUSE_SR_PREREAD_DONE_Pos ) +#define EFUSE_SR_PREREAD_DONE ( EFUSE_SR_PREREAD_DONE_Msk ) + +#define EFUSE_SR_UNPG_Pos ( 1U ) +#define EFUSE_SR_UNPG_Msk ( 0x1UL << EFUSE_SR_UNPG_Pos ) +#define EFUSE_SR_UNPG ( EFUSE_SR_UNPG_Msk ) + +#define EFUSE_SR_DONE_Pos ( 0U ) +#define EFUSE_SR_DONE_Msk ( 0x1UL << EFUSE_SR_DONE_Pos ) +#define EFUSE_SR_DONE ( EFUSE_SR_DONE_Msk ) + + +/*************** Bits definition for EFUSE_CLR **********************/ + +#define EFUSE_CLR_CUNPG_Pos ( 1U ) +#define EFUSE_CLR_CUNPG_Msk ( 0x1UL << EFUSE_CLR_CUNPG_Pos ) +#define EFUSE_CLR_CUNPG ( EFUSE_CLR_CUNPG_Msk ) + +#define EFUSE_CLR_CDONE_Pos ( 0U ) +#define EFUSE_CLR_CDONE_Msk ( 0x1UL << EFUSE_CLR_CDONE_Pos ) +#define EFUSE_CLR_CDONE ( EFUSE_CLR_CDONE_Msk ) + + +/*************** Bits definition for EFUSE_DR **********************/ + +#define EFUSE_DR_DATA_Pos ( 0U ) +#define EFUSE_DR_DATA_Msk ( 0xffUL << EFUSE_DR_DATA_Pos ) +#define EFUSE_DR_DATA ( EFUSE_DR_DATA_Msk ) +#define EFUSE_DR_DATA_0 ( 0x1UL << EFUSE_DR_DATA_Pos ) +#define EFUSE_DR_DATA_1 ( 0x2UL << EFUSE_DR_DATA_Pos ) +#define EFUSE_DR_DATA_2 ( 0x4UL << EFUSE_DR_DATA_Pos ) +#define EFUSE_DR_DATA_3 ( 0x8UL << EFUSE_DR_DATA_Pos ) +#define EFUSE_DR_DATA_4 ( 0x10UL << EFUSE_DR_DATA_Pos ) +#define EFUSE_DR_DATA_5 ( 0x20UL << EFUSE_DR_DATA_Pos ) +#define EFUSE_DR_DATA_6 ( 0x40UL << EFUSE_DR_DATA_Pos ) +#define EFUSE_DR_DATA_7 ( 0x80UL << EFUSE_DR_DATA_Pos ) + + +/*************** Bits definition for EFUSE_DSDP **********************/ + +#define EFUSE_DSDP_DP_Pos ( 0U ) +#define EFUSE_DSDP_DP_Msk ( 0xffffffffUL << EFUSE_DSDP_DP_Pos ) +#define EFUSE_DSDP_DP ( EFUSE_DSDP_DP_Msk ) + + +/*************** Bits definition for EFUSE_BYTEWP **********************/ + +#define EFUSE_BYTEWP_BYTEWP_Pos ( 0U ) +#define EFUSE_BYTEWP_BYTEWP_Msk ( 0xffffffffUL << EFUSE_BYTEWP_BYTEWP_Pos ) +#define EFUSE_BYTEWP_BYTEWP ( EFUSE_BYTEWP_BYTEWP_Msk ) + + +/*************** Bits definition for EFUSE_PGCFG **********************/ + +#define EFUSE_PGCFG_AVDD_SP_Pos ( 24U ) +#define EFUSE_PGCFG_AVDD_SP_Msk ( 0xffUL << EFUSE_PGCFG_AVDD_SP_Pos ) +#define EFUSE_PGCFG_AVDD_SP ( EFUSE_PGCFG_AVDD_SP_Msk ) +#define EFUSE_PGCFG_AVDD_SP_0 ( 0x1UL << EFUSE_PGCFG_AVDD_SP_Pos ) +#define EFUSE_PGCFG_AVDD_SP_1 ( 0x2UL << EFUSE_PGCFG_AVDD_SP_Pos ) +#define EFUSE_PGCFG_AVDD_SP_2 ( 0x4UL << EFUSE_PGCFG_AVDD_SP_Pos ) +#define EFUSE_PGCFG_AVDD_SP_3 ( 0x8UL << EFUSE_PGCFG_AVDD_SP_Pos ) +#define EFUSE_PGCFG_AVDD_SP_4 ( 0x10UL << EFUSE_PGCFG_AVDD_SP_Pos ) +#define EFUSE_PGCFG_AVDD_SP_5 ( 0x20UL << EFUSE_PGCFG_AVDD_SP_Pos ) +#define EFUSE_PGCFG_AVDD_SP_6 ( 0x40UL << EFUSE_PGCFG_AVDD_SP_Pos ) +#define EFUSE_PGCFG_AVDD_SP_7 ( 0x80UL << EFUSE_PGCFG_AVDD_SP_Pos ) + +#define EFUSE_PGCFG_AVDD_HD_Pos ( 16U ) +#define EFUSE_PGCFG_AVDD_HD_Msk ( 0xffUL << EFUSE_PGCFG_AVDD_HD_Pos ) +#define EFUSE_PGCFG_AVDD_HD ( EFUSE_PGCFG_AVDD_HD_Msk ) +#define EFUSE_PGCFG_AVDD_HD_0 ( 0x1UL << EFUSE_PGCFG_AVDD_HD_Pos ) +#define EFUSE_PGCFG_AVDD_HD_1 ( 0x2UL << EFUSE_PGCFG_AVDD_HD_Pos ) +#define EFUSE_PGCFG_AVDD_HD_2 ( 0x4UL << EFUSE_PGCFG_AVDD_HD_Pos ) +#define EFUSE_PGCFG_AVDD_HD_3 ( 0x8UL << EFUSE_PGCFG_AVDD_HD_Pos ) +#define EFUSE_PGCFG_AVDD_HD_4 ( 0x10UL << EFUSE_PGCFG_AVDD_HD_Pos ) +#define EFUSE_PGCFG_AVDD_HD_5 ( 0x20UL << EFUSE_PGCFG_AVDD_HD_Pos ) +#define EFUSE_PGCFG_AVDD_HD_6 ( 0x40UL << EFUSE_PGCFG_AVDD_HD_Pos ) +#define EFUSE_PGCFG_AVDD_HD_7 ( 0x80UL << EFUSE_PGCFG_AVDD_HD_Pos ) + +#define EFUSE_PGCFG_PGWT_Pos ( 8U ) +#define EFUSE_PGCFG_PGWT_Msk ( 0xffUL << EFUSE_PGCFG_PGWT_Pos ) +#define EFUSE_PGCFG_PGWT ( EFUSE_PGCFG_PGWT_Msk ) +#define EFUSE_PGCFG_PGWT_0 ( 0x1UL << EFUSE_PGCFG_PGWT_Pos ) +#define EFUSE_PGCFG_PGWT_1 ( 0x2UL << EFUSE_PGCFG_PGWT_Pos ) +#define EFUSE_PGCFG_PGWT_2 ( 0x4UL << EFUSE_PGCFG_PGWT_Pos ) +#define EFUSE_PGCFG_PGWT_3 ( 0x8UL << EFUSE_PGCFG_PGWT_Pos ) +#define EFUSE_PGCFG_PGWT_4 ( 0x10UL << EFUSE_PGCFG_PGWT_Pos ) +#define EFUSE_PGCFG_PGWT_5 ( 0x20UL << EFUSE_PGCFG_PGWT_Pos ) +#define EFUSE_PGCFG_PGWT_6 ( 0x40UL << EFUSE_PGCFG_PGWT_Pos ) +#define EFUSE_PGCFG_PGWT_7 ( 0x80UL << EFUSE_PGCFG_PGWT_Pos ) + +#define EFUSE_PGCFG_PGT_Pos ( 0U ) +#define EFUSE_PGCFG_PGT_Msk ( 0xffUL << EFUSE_PGCFG_PGT_Pos ) +#define EFUSE_PGCFG_PGT ( EFUSE_PGCFG_PGT_Msk ) +#define EFUSE_PGCFG_PGT_0 ( 0x1UL << EFUSE_PGCFG_PGT_Pos ) +#define EFUSE_PGCFG_PGT_1 ( 0x2UL << EFUSE_PGCFG_PGT_Pos ) +#define EFUSE_PGCFG_PGT_2 ( 0x4UL << EFUSE_PGCFG_PGT_Pos ) +#define EFUSE_PGCFG_PGT_3 ( 0x8UL << EFUSE_PGCFG_PGT_Pos ) +#define EFUSE_PGCFG_PGT_4 ( 0x10UL << EFUSE_PGCFG_PGT_Pos ) +#define EFUSE_PGCFG_PGT_5 ( 0x20UL << EFUSE_PGCFG_PGT_Pos ) +#define EFUSE_PGCFG_PGT_6 ( 0x40UL << EFUSE_PGCFG_PGT_Pos ) +#define EFUSE_PGCFG_PGT_7 ( 0x80UL << EFUSE_PGCFG_PGT_Pos ) + + +/*************** Bits definition for EFUSE_DSRx **********************/ + +#define EFUSE_DSRX_DATA_Pos ( 0U ) +#define EFUSE_DSRX_DATA_Msk ( 0xffUL << EFUSE_DSRX_DATA_Pos ) +#define EFUSE_DSRX_DATA ( EFUSE_DSRX_DATA_Msk ) +#define EFUSE_DSRX_DATA_0 ( 0x1UL << EFUSE_DSRX_DATA_Pos ) +#define EFUSE_DSRX_DATA_1 ( 0x2UL << EFUSE_DSRX_DATA_Pos ) +#define EFUSE_DSRX_DATA_2 ( 0x4UL << EFUSE_DSRX_DATA_Pos ) +#define EFUSE_DSRX_DATA_3 ( 0x8UL << EFUSE_DSRX_DATA_Pos ) +#define EFUSE_DSRX_DATA_4 ( 0x10UL << EFUSE_DSRX_DATA_Pos ) +#define EFUSE_DSRX_DATA_5 ( 0x20UL << EFUSE_DSRX_DATA_Pos ) +#define EFUSE_DSRX_DATA_6 ( 0x40UL << EFUSE_DSRX_DATA_Pos ) +#define EFUSE_DSRX_DATA_7 ( 0x80UL << EFUSE_DSRX_DATA_Pos ) + + +/******************* Bit definition for DLYB_CR register ********************/ + +#define DLYB_CR_SEN_Pos ( 1U ) +#define DLYB_CR_SEN_Msk ( 0x1UL << DLYB_CR_SEN_Pos ) +#define DLYB_CR_SEN ( DLYB_CR_SEN_Msk ) + +#define DLYB_CR_DEN_Pos ( 0U ) +#define DLYB_CR_DEN_Msk ( 0x1UL << DLYB_CR_DEN_Pos ) +#define DLYB_CR_DEN ( DLYB_CR_DEN_Msk ) + + +/******************* Bit definition for DLYB_CFGR register ********************/ + +#define DLYB_CFGR_LENF_Pos ( 31U) +#define DLYB_CFGR_LENF_Msk ( 0x1UL << DLYB_CFGR_LENF_Pos ) +#define DLYB_CFGR_LENF ( DLYB_CFGR_LENF_Msk ) + +#define DLYB_CFGR_LEN_Pos ( 16U ) +#define DLYB_CFGR_LEN_Msk ( 0xFFFUL << DLYB_CFGR_LEN_Pos ) +#define DLYB_CFGR_LEN ( DLYB_CFGR_LEN_Msk ) +#define DLYB_CFGR_LEN_0 ( 0x001UL << DLYB_CFGR_LEN_Pos ) +#define DLYB_CFGR_LEN_1 ( 0x002UL << DLYB_CFGR_LEN_Pos ) +#define DLYB_CFGR_LEN_2 ( 0x004UL << DLYB_CFGR_LEN_Pos ) +#define DLYB_CFGR_LEN_3 ( 0x008UL << DLYB_CFGR_LEN_Pos ) +#define DLYB_CFGR_LEN_4 ( 0x010UL << DLYB_CFGR_LEN_Pos ) +#define DLYB_CFGR_LEN_5 ( 0x020UL << DLYB_CFGR_LEN_Pos ) +#define DLYB_CFGR_LEN_6 ( 0x040UL << DLYB_CFGR_LEN_Pos ) +#define DLYB_CFGR_LEN_7 ( 0x080UL << DLYB_CFGR_LEN_Pos ) +#define DLYB_CFGR_LEN_8 ( 0x100UL << DLYB_CFGR_LEN_Pos ) +#define DLYB_CFGR_LEN_9 ( 0x200UL << DLYB_CFGR_LEN_Pos ) +#define DLYB_CFGR_LEN_10 ( 0x400UL << DLYB_CFGR_LEN_Pos ) +#define DLYB_CFGR_LEN_11 ( 0x800UL << DLYB_CFGR_LEN_Pos ) + +#define DLYB_CFGR_UNIT_Pos ( 8U ) +#define DLYB_CFGR_UNIT_Msk ( 0x7FUL << DLYB_CFGR_UNIT_Pos ) +#define DLYB_CFGR_UNIT ( DLYB_CFGR_UNIT_Msk ) +#define DLYB_CFGR_UNIT_0 ( 0x01UL << DLYB_CFGR_UNIT_Pos ) +#define DLYB_CFGR_UNIT_1 ( 0x02UL << DLYB_CFGR_UNIT_Pos ) +#define DLYB_CFGR_UNIT_2 ( 0x04UL << DLYB_CFGR_UNIT_Pos ) +#define DLYB_CFGR_UNIT_3 ( 0x08UL << DLYB_CFGR_UNIT_Pos ) +#define DLYB_CFGR_UNIT_4 ( 0x10UL << DLYB_CFGR_UNIT_Pos ) +#define DLYB_CFGR_UNIT_5 ( 0x20UL << DLYB_CFGR_UNIT_Pos ) +#define DLYB_CFGR_UNIT_6 ( 0x40UL << DLYB_CFGR_UNIT_Pos ) + +#define DLYB_CFGR_SEL_Pos ( 0U ) +#define DLYB_CFGR_SEL_Msk ( 0xFUL << DLYB_CFGR_SEL_Pos ) +#define DLYB_CFGR_SEL ( DLYB_CFGR_SEL_Msk ) +#define DLYB_CFGR_SEL_0 ( 0x1UL << DLYB_CFGR_SEL_Pos ) +#define DLYB_CFGR_SEL_1 ( 0x2UL << DLYB_CFGR_SEL_Pos ) +#define DLYB_CFGR_SEL_2 ( 0x3UL << DLYB_CFGR_SEL_Pos ) +#define DLYB_CFGR_SEL_3 ( 0x8UL << DLYB_CFGR_SEL_Pos ) + +///*----------- Peripheral_Registers_Bits_Definition END -----------------*/ + +#if (USE_RTOS == 1U) + #error "USE_RTOS should be 0 in the current HAL release" +#else + #define __HAL_LOCK(__HANDLE__) \ + do{ \ + if((__HANDLE__)->Lock == HAL_LOCKED) \ + { \ + return HAL_BUSY; \ + } \ + else \ + { \ + (__HANDLE__)->Lock = HAL_LOCKED; \ + } \ + }while (0U) + #define __HAL_UNLOCK(__HANDLE__) \ + do{ \ + (__HANDLE__)->Lock = HAL_UNLOCKED; \ + }while (0U) +#endif /* USE_RTOS */ + + +typedef unsigned char UINT8; +typedef unsigned short int UINT16; +typedef unsigned int UINT32; + + +#define SET_BIT(REG, BIT) ((REG) |= (BIT)) +#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) +#define READ_BIT(REG, BIT) ((REG) & (BIT)) +#define CLEAR_REG(REG) ((REG) = (0x0)) +#define WRITE_REG(REG, VAL) ((REG) = (VAL)) +#define READ_REG(REG) ((REG)) +#define MODIFY_REG(REG,MASK,BITS) ((REG) = (((REG)&(~(MASK)))|((BITS)&(MASK)))) +#define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL))) + + +#endif /* __ACM32H5XX_H__ */ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_accelerate.c b/bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_accelerate.c new file mode 100644 index 0000000000..12bc77939d --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_accelerate.c @@ -0,0 +1,407 @@ +/* + ****************************************************************************** + * @file System_Accelerate.c + * @author AisinoChip Firmware Team + * @version V1.0.0 + * @date 2020 + * @brief MCU Cache Peripheral Access Layer System Source File. + ****************************************************************************** + * @attention + * + * Copyright (c) 2020 AisinoChip. + * All rights reserved. + ****************************************************************************** +*/ +#include "hal.h" + +#include "system_accelerate.h" + +/* Cache Size ID Register Macros */ +#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) +#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) + +#ifndef __SCB_DCACHE_LINE_SIZE +#define __SCB_DCACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ +#endif + +#ifndef __SCB_ICACHE_LINE_SIZE +#define __SCB_ICACHE_LINE_SIZE 32U /*!< Cortex-M7 cache line size is fixed to 32 bytes (8 words). See also register SCB_CCSIDR */ +#endif + +/********************************************************************************* +* Function : System_EnableIAccelerate +* Description : Enable I-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_EnableIAccelerate(void) +{ + if (SCB->CCR & SCB_CCR_IC_Msk) /* return if ICache is already enabled */ + { + return; + } + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_DisableIAccelerate +* Description : Disable I-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_DisableIAccelerate(void) +{ + __DSB(); + __ISB(); + + SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_InvalidateIAccelerate +* Description : Invalidate I-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_InvalidateIAccelerate(void) +{ + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; + __DSB(); + __ISB(); +} + +/** + \brief I-Cache Invalidate by address + \details Invalidates I-Cache for the given address. + I-Cache is invalidated starting from a 32 byte aligned address in 32 byte granularity. + I-Cache memory blocks which are part of given address + given size are invalidated. + \param[in] addr address + \param[in] isize size of memory block (in number of bytes) +*/ +void System_InvalidateIAccelerate_by_Addr (volatile void *addr, int32_t isize) +{ + if ( isize > 0 ) { + int32_t op_size = isize + (((uint32_t)addr) & (__SCB_ICACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_ICACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->ICIMVAU = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_ICACHE_LINE_SIZE; + op_size -= __SCB_ICACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } +} + +/********************************************************************************* +* Function : System_EnableDAccelerate +* Description : Enable D-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_EnableDAccelerate(void) +{ + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + if (SCB->CCR & SCB_CCR_DC_Msk) return; /* return if DCache is already enabled */ + + SCB->CSSELR = 0U; /* select Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do + { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do + { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk)); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + }while (ways-- != 0U); + }while(sets-- != 0U); + + __DSB(); + + SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ + + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_DisableDAccelerate +* Description : Disable D-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_DisableDAccelerate(void) +{ + struct { + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + } locals; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* select Level 1 data cache */ + __DSB(); + + SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ + __DSB(); + +#if !defined(__OPTIMIZE__) + /* + * For the endless loop issue with no optimization builds. + * More details, see https://github.com/ARM-software/CMSIS_5/issues/620 + * + * The issue only happens when local variables are in stack. If + * local variables are saved in general purpose register, then the function + * is OK. + * + * When local variables are in stack, after disabling the cache, flush the + * local variables cache line for data consistency. + */ + SCB->DCCIMVAC = (uint32_t)&locals.sets; + SCB->DCCIMVAC = (uint32_t)&locals.ways; + SCB->DCCIMVAC = (uint32_t)&locals.ccsidr; + __DSB(); + __ISB(); +#endif + + locals.ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + locals.sets = (uint32_t)(CCSIDR_SETS(locals.ccsidr)); + do + { + locals.ways = (uint32_t)(CCSIDR_WAYS(locals.ccsidr)); + do + { + SCB->DCCISW = (((locals.sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((locals.ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk)); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + }while(locals.ways-- != 0U); + }while(locals.sets-- != 0U); + + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_InvalidateDAccelerate +* Description : Invalidate D-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_InvalidateDAccelerate(void) +{ + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do + { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do + { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk)); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + }while(ways-- != 0U); + }while(sets-- != 0U); + + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_CleanDAccelerate +* Description : Clean D-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_CleanDAccelerate(void) +{ + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do + { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do + { + SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | + ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk)); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_CleanInvalidateDAccelerate +* Description : Cleans and Invalidates D-Cache +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_CleanInvalidateDAccelerate(void) +{ + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); +} + +/********************************************************************************* +* Function : System_InvalidateDAccelerate +* Description : Invalidate D-Cache by addr +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_InvalidateDAccelerate_by_Addr (volatile void *addr, int32_t dsize) +{ + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } +} + +/********************************************************************************* +* Function : System_CleanDAccelerate_by_Addr +* Description : Cleans D-Cache for the given address +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_CleanDAccelerate_by_Addr (volatile void *addr, int32_t dsize) +{ + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCCMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } +} + +/********************************************************************************* +* Function : System_CleanInvalidateDAccelerate_by_Addr +* Description : Cleans and invalidates D_Cache for the given address +* Input : +* Outpu : +* Author : Chris_Kyle Data : 2020 +**********************************************************************************/ +void System_CleanInvalidateDAccelerate_by_Addr (volatile void *addr, int32_t dsize) +{ + if ( dsize > 0 ) { + int32_t op_size = dsize + (((uint32_t)addr) & (__SCB_DCACHE_LINE_SIZE - 1U)); + uint32_t op_addr = (uint32_t)addr /* & ~(__SCB_DCACHE_LINE_SIZE - 1U) */; + + __DSB(); + + do { + SCB->DCCIMVAC = op_addr; /* register accepts only 32byte aligned values, only bits 31..5 are valid */ + op_addr += __SCB_DCACHE_LINE_SIZE; + op_size -= __SCB_DCACHE_LINE_SIZE; + } while ( op_size > 0 ); + + __DSB(); + __ISB(); + } +} + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_accelerate.h b/bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_accelerate.h new file mode 100644 index 0000000000..248bbedff1 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_accelerate.h @@ -0,0 +1,56 @@ +/* + ****************************************************************************** + * @file System_Accelerate.h + * @author AisinoChip Firmware Team + * @version V1.0.0 + * @date 2020 + * @brief MCU Accelerate Peripheral Access Layer System header File. + ****************************************************************************** + * @attention + * + * Copyright (c) 2020 AisinoChip. + * All rights reserved. + ****************************************************************************** +*/ +#ifndef __SYSTEM_ACCELERATE_H__ +#define __SYSTEM_ACCELERATE_H__ + +//#include "cmsis_armclang.h" +#include "stdint.h" + +/* System_EnableIAccelerate */ +void System_EnableIAccelerate(void); + +/* System_DisableIAccelerate */ +void System_DisableIAccelerate(void); + +/* System_InvalidateIAccelerate */ +void System_InvalidateIAccelerate(void); + +void System_InvalidateIAccelerate_by_Addr (volatile void *addr, int32_t isize); + +/* System_EnableDAccelerate */ +void System_EnableDAccelerate(void); + +/* System_DisableDAccelerate */ +void System_DisableDAccelerate(void); + +/* System_InvalidateDAccelerate */ +void System_InvalidateDAccelerate(void); + +/* System_CleanDAccelerate */ +void System_CleanDAccelerate(void); + +/* System_CleanInvalidateDAccelerate */ +void System_CleanInvalidateDAccelerate(void); + +/* System_InvalidateDAccelerate_by_Addr */ +void System_InvalidateDAccelerate_by_Addr (volatile void *addr, int32_t dsize); + +void System_CleanDAccelerate_by_Addr (volatile void *addr, int32_t dsize); + +/* System_CleanInvalidateDAccelerate_by_Addr */ +void System_CleanInvalidateDAccelerate_by_Addr (volatile void *addr, int32_t dsize); + +#endif + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_acm32h5xx.c b/bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_acm32h5xx.c new file mode 100644 index 0000000000..5edd890d92 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_acm32h5xx.c @@ -0,0 +1,753 @@ + +/****************************************************************************** +*@file : system_acm32h5xx.c +*@brief : CMSIS Cortex-M33 Device Peripheral Access Layer System Source File +******************************************************************************/ + +#include "acm32h5xx_hal_conf.h" + +#ifdef DATA_IN_ExtSRAM + void SystemInit_ExtMemCtl(void); +#endif + +/****************************************************************************** +*@note : g_SystemCoreClock variable is updated in three ways: +* 1) by calling CMSIS function SystemCoreClockUpdate() +* 2) by calling HAL API function HAL_RCC_GetSysCoreClockFreq() +* 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency +* If you use this function to configure the system clock; then there +* is no need to call the 2 first functions listed above, since g_SystemCoreClock +* variable is updated automatically. +******************************************************************************/ +volatile uint32_t SystemCoreClock = 220000000; + +/****************************************************************************** +*@brief : configure FPU and vector table address +* - This function is called at startup just after reset and before branch to main program. +* - This call is made inside the "startup_acm32h5xx.s" file +*@param : none +*@return: none +******************************************************************************/ +__attribute__((weak)) void SystemInit(void) +{ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + /* set CP10 and CP11 Full Access */ + SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); + #endif + + RCC->RCHCR |= RCC_RCHCR_RCHEN; + __NOP();__NOP();__NOP();__NOP();__NOP(); + __NOP();__NOP();__NOP();__NOP();__NOP(); + while (!(RCC->RCHCR & RCC_RCHCR_RCHRDY)) {}; + RCC->RCHCR &= ~RCC_RCHCR_RCHSEL; + RCC->CCR1 &= ~RCC_CCR1_SYSCLKSEL; + + RCC->PLL1CR &= ~RCC_PLL1CR_PLL1EN; + RCC->PLL1SCR = 0; + RCC->PLL1CR |= RCC_PLL1CR_PLL1SLEEP; + RCC->PLL2CR &= ~RCC_PLL2CR_PLL2EN; + RCC->PLL2SCR = 0; + RCC->PLL2CR |= RCC_PLL2CR_PLL2SLEEP; + RCC->PLL3CR &= ~RCC_PLL3CR_PLL3EN; + RCC->PLL3CR |= RCC_PLL3CR_PLL3SLEEP; + + RCC->RCHCR &= ~RCC_RCHCR_RCHDIV; + + RCC->CCR2 &= ~RCC_CCR2_SYSDIV0; + __NOP();__NOP();__NOP();__NOP();__NOP(); + __NOP();__NOP();__NOP();__NOP();__NOP(); + while (!(RCC->CCR2 & RCC_CCR2_DIVDONE)) {}; + + RCC->CCR2 &= ~RCC_CCR2_SYSDIV1; + __NOP();__NOP();__NOP();__NOP();__NOP(); + __NOP();__NOP();__NOP();__NOP();__NOP(); + while (!(RCC->CCR2 & RCC_CCR2_DIVDONE)) {}; + + RCC->CCR2 &= ~(RCC_CCR2_PCLK1DIV | RCC_CCR2_PCLK2DIV | RCC_CCR2_PCLK3DIV | RCC_CCR2_PCLK4DIV); + + #ifdef DATA_IN_ExtSRAM + SystemInit_ExtMemCtl(); + #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + + SCB->VTOR = VECT_TAB_ADDR; + + #if (INS_ACCELERATE_ENABLE) + System_EnableIAccelerate(); + #else + System_DisableIAccelerate(); + #endif +} + +/****************************************************************************** +*@brief : Update g_SystemCoreClock variable according to Clock Register Values. +* The SystemCoreClock variable contains the core clock (HCLK), it can +* be used by the user application to setup the SysTick timer or configure +* other parameters. +* +*@note : Each time the core clock (HCLK) changes, this function must be called +* to update SystemCoreClock variable value. Otherwise, any configuration +* based on this variable will be incorrect. +*@param : none +*@return: none +******************************************************************************/ +void SystemCoreClockUpdate(void) +{ + HAL_RCC_GetSysCoreClockFreq(); +} + + +/****************************************************************************** +*@brief : fast config system core clock. +*@param : sysclkSel: system core clk select, see SYSCLK_SelectTypeDef enum +*@param : pclk1Div: pclk1 div select +* @arg RCC_PCLK1_DIV_1 +* @arg RCC_PCLK1_DIV_2 +* @arg RCC_PCLK1_DIV_4 +* @arg RCC_PCLK1_DIV_8 +* @arg RCC_PCLK1_DIV_16 +*@param : pclk2Div: pclk2 div select +* @arg RCC_PCLK2_DIV_1 +* @arg RCC_PCLK2_DIV_2 +* @arg RCC_PCLK2_DIV_4 +* @arg RCC_PCLK2_DIV_8 +* @arg RCC_PCLK2_DIV_16 +*@note : PLLPCLK = Fin * PLLF / PLLN / PLLP +* PLLQCLK = Fin * PLLF / PLLN / PLLQ +* 1MHz <= ( Fin / PLLN ) <= 2MHz +* 100MHz <= ((Fin / PLLN) * PLLF) <= 550MHz +* 30MHz <= ((Fin / PLLN) * PLLF / PLLP) <= 220MHz +* 16MHz <= ((Fin / PLLN) * PLLF / PLLQ) <= 220MHz +*@return: none +******************************************************************************/ +HAL_StatusTypeDef SystemClock_Config(uint32_t sysclkSel, uint32_t pclk1Div, \ + uint32_t pclk2Div, uint32_t pclk3Div, uint32_t pclk4Div) +{ +// uint32_t pllf; +// uint32_t plln; +// uint32_t pllp; +// uint32_t pllq; +// uint32_t sysdiv; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + switch(sysclkSel) + { + case SYSCLK_220M_SRC_RCH: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_RCH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.RCH = ENABLE; + RCC_OscInitStruct.RCHDiv16 = ENABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_RCH_DIV16; + RCC_OscInitStruct.PLL1.PLLF = 330; + RCC_OscInitStruct.PLL1.PLLN = 3; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_200M_SRC_RCH: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_RCH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.RCH = ENABLE; + RCC_OscInitStruct.RCHDiv16 = ENABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_RCH_DIV16; + RCC_OscInitStruct.PLL1.PLLF = 300; + RCC_OscInitStruct.PLL1.PLLN = 3; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_180M_SRC_RCH: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_RCH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.RCH = ENABLE; + RCC_OscInitStruct.RCHDiv16 = ENABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_RCH_DIV16; + RCC_OscInitStruct.PLL1.PLLF = 270; + RCC_OscInitStruct.PLL1.PLLN = 3; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_160M_SRC_RCH: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_RCH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.RCH = ENABLE; + RCC_OscInitStruct.RCHDiv16 = ENABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_RCH_DIV16; + RCC_OscInitStruct.PLL1.PLLF = 240; + RCC_OscInitStruct.PLL1.PLLN = 3; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_100M_SRC_RCH: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_RCH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.RCH = ENABLE; + RCC_OscInitStruct.RCHDiv16 = ENABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_RCH_DIV16; + RCC_OscInitStruct.PLL1.PLLF = 300; + RCC_OscInitStruct.PLL1.PLLN = 3; + RCC_OscInitStruct.PLL1.PLLP = 4; + RCC_OscInitStruct.PLL1.PLLQ = 4; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_80M_SRC_RCH: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_RCH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.RCH = ENABLE; + RCC_OscInitStruct.RCHDiv16 = ENABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_RCH_DIV16; + RCC_OscInitStruct.PLL1.PLLF = 120; + RCC_OscInitStruct.PLL1.PLLN = 3; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_64M_SRC_RCH: + case SYSCLK_32M_SRC_RCH: + case SYSCLK_16M_SRC_RCH: + case SYSCLK_8M_SRC_RCH: + case SYSCLK_4M_SRC_RCH: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_RCH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.RCH = ENABLE; + RCC_OscInitStruct.RCHDiv16 = ENABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_RCH_DIV16; + RCC_OscInitStruct.PLL1.PLLF = 96; + RCC_OscInitStruct.PLL1.PLLN = 3; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1UL << (sysclkSel - SYSCLK_64M_SRC_RCH); + break; + + case SYSCLK_220M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 330; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_210M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 315; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_200M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 300; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_190M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 285; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_180M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 270; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_170M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 255; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_160M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 240; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_150M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 225; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_140M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 210; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_130M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 195; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_120M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 180; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_110M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 165; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_100M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 300; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 4; + RCC_OscInitStruct.PLL1.PLLQ = 4; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_90M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 270; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 4; + RCC_OscInitStruct.PLL1.PLLQ = 4; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_80M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 120; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_70M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 105; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_64M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 96; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_60M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 90; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 2; + RCC_OscInitStruct.PLL1.PLLQ = 2; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_50M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 150; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 4; + RCC_OscInitStruct.PLL1.PLLQ = 4; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_48M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 144; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 4; + RCC_OscInitStruct.PLL1.PLLQ = 4; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_40M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 240; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 8; + RCC_OscInitStruct.PLL1.PLLQ = 8; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_30M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 180; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 8; + RCC_OscInitStruct.PLL1.PLLQ = 8; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_24M_SRC_XTH_12M: + case SYSCLK_12M_SRC_XTH_12M: + case SYSCLK_8M_SRC_XTH_12M: + case SYSCLK_4M_SRC_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_PLL1; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_OscInitStruct.PLL1.PLL = ENABLE; + RCC_OscInitStruct.PLL1.Source = RCC_PLL_SOURCE_XTH; + RCC_OscInitStruct.PLL1.PLLF = 144; + RCC_OscInitStruct.PLL1.PLLN = 9; + RCC_OscInitStruct.PLL1.PLLP = 4; + RCC_OscInitStruct.PLL1.PLLQ = 4; + RCC_OscInitStruct.PLL1.PLLPCLK = ENABLE; + RCC_OscInitStruct.PLL1.PLLQCLK = DISABLE; + RCC_OscInitStruct.PLL1.SSC = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_PLL1PCLK; + if (sysclkSel == SYSCLK_24M_SRC_XTH_12M) + RCC_ClkInitStruct.SYSCLKDiv0 = 2; + if (sysclkSel == SYSCLK_12M_SRC_XTH_12M) + RCC_ClkInitStruct.SYSCLKDiv0 = 4; + if (sysclkSel == SYSCLK_8M_SRC_XTH_12M) + RCC_ClkInitStruct.SYSCLKDiv0 = 6; + if (sysclkSel == SYSCLK_4M_SRC_XTH_12M) + RCC_ClkInitStruct.SYSCLKDiv0 = 12; + break; + + case SYSCLK_64M_RCH: + case SYSCLK_32M_RCH: + case SYSCLK_16M_RCH: + case SYSCLK_8M_RCH: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_RCH; + RCC_OscInitStruct.RCH = ENABLE; + RCC_OscInitStruct.RCHDiv16 = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_RCH; + RCC_ClkInitStruct.SYSCLKDiv0 = 1UL << (sysclkSel - SYSCLK_64M_RCH); + break; + + case SYSCLK_4M_RCH: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_RCH; + RCC_OscInitStruct.RCH = ENABLE; + RCC_OscInitStruct.RCHDiv16 = ENABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_RCH; + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + break; + + case SYSCLK_12M_XTH_12M: + case SYSCLK_6M_XTH_12M: + case SYSCLK_4M_XTH_12M: + RCC_OscInitStruct.OscType = RCC_OSC_TYPE_XTH; + RCC_OscInitStruct.XTH = ENABLE; + RCC_OscInitStruct.XTHBypass = DISABLE; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLK_SOURCE_XTH; + if (sysclkSel == SYSCLK_12M_XTH_12M) + RCC_ClkInitStruct.SYSCLKDiv0 = 1; + else if (sysclkSel == SYSCLK_6M_XTH_12M) + RCC_ClkInitStruct.SYSCLKDiv0 = 2; + else if (sysclkSel == SYSCLK_4M_XTH_12M) + RCC_ClkInitStruct.SYSCLKDiv0 = 3; + break; + + default: + return (HAL_ERROR); + } + + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + return (HAL_ERROR); + + RCC_ClkInitStruct.ClockType = RCC_CLOCK_TYPE_SYSCLK | \ + RCC_CLOCK_TYPE_SYSDIV0 | RCC_CLOCK_TYPE_SYSDIV1 | \ + RCC_CLOCK_TYPE_PCLK1 | RCC_CLOCK_TYPE_PCLK2 | \ + RCC_CLOCK_TYPE_PCLK3 | RCC_CLOCK_TYPE_PCLK4; + RCC_ClkInitStruct.SYSCLKDiv1 = 1; + RCC_ClkInitStruct.PCLK1Div = pclk1Div; + RCC_ClkInitStruct.PCLK2Div = pclk2Div; + RCC_ClkInitStruct.PCLK3Div = pclk3Div; + RCC_ClkInitStruct.PCLK4Div = pclk4Div; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct) != HAL_OK) + return (HAL_ERROR); + return (HAL_OK); +} + +/********************************************************************************* +* Function : System_Module_Enable +* Description : enable module clock +* Input : module id +* Output : none +* Author : Chris_Kyle +**********************************************************************************/ +void System_Module_Enable(enum_Enable_ID_t fe_ID_Index) +{ + assert_param(fe_ID_IndexAHB1CKENR))[fe_ID_Index>>5] |= (1UL<<(fe_ID_Index&0x1F)); + + HAL_SimpleDelay(2); +} + +/********************************************************************************* +* Function : System_Module_Disable +* Description : disable module clock +* Input : module id +* Output : none +* Author : Chris_Kyle +**********************************************************************************/ +void System_Module_Disable(enum_Enable_ID_t fe_ID_Index) +{ + assert_param(fe_ID_IndexAHB1CKENR))[fe_ID_Index>>5] &= (~(1UL<<(fe_ID_Index&0x1F))); +} + + +#ifdef DATA_IN_ExtSRAM + +__attribute__((weak)) void SystemInit_ExtMemCtl(void) +{ +} + +#endif /* (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) */ + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_acm32h5xx.h b/bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_acm32h5xx.h new file mode 100644 index 0000000000..d5c3e057db --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/Device/system_acm32h5xx.h @@ -0,0 +1,415 @@ + +/****************************************************************************** +*@file : system_acm32h5xx.h +*@brief : CMSIS Cortex-M33 Device Peripheral Access Layer System Source File +******************************************************************************/ + +#ifndef __SYSTEM_ACM32H5XX_H +#define __SYSTEM_ACM32H5XX_H + +#include "acm32h5xx_hal_conf.h" + +typedef enum +{ + SYSCLK_220M_SRC_RCH = 0, + SYSCLK_200M_SRC_RCH, + SYSCLK_180M_SRC_RCH, + SYSCLK_160M_SRC_RCH, + SYSCLK_100M_SRC_RCH, + SYSCLK_80M_SRC_RCH, + SYSCLK_64M_SRC_RCH, + SYSCLK_32M_SRC_RCH, + SYSCLK_16M_SRC_RCH, + SYSCLK_8M_SRC_RCH, + SYSCLK_4M_SRC_RCH, + + SYSCLK_220M_SRC_XTH_12M, + SYSCLK_210M_SRC_XTH_12M, + SYSCLK_200M_SRC_XTH_12M, + SYSCLK_190M_SRC_XTH_12M, + SYSCLK_180M_SRC_XTH_12M, + SYSCLK_170M_SRC_XTH_12M, + SYSCLK_160M_SRC_XTH_12M, + SYSCLK_150M_SRC_XTH_12M, + SYSCLK_140M_SRC_XTH_12M, + SYSCLK_130M_SRC_XTH_12M, + SYSCLK_120M_SRC_XTH_12M, + SYSCLK_110M_SRC_XTH_12M, + SYSCLK_100M_SRC_XTH_12M, + SYSCLK_90M_SRC_XTH_12M, + SYSCLK_80M_SRC_XTH_12M, + SYSCLK_70M_SRC_XTH_12M, + SYSCLK_64M_SRC_XTH_12M, + SYSCLK_60M_SRC_XTH_12M, + SYSCLK_50M_SRC_XTH_12M, + SYSCLK_48M_SRC_XTH_12M, + SYSCLK_40M_SRC_XTH_12M, + SYSCLK_30M_SRC_XTH_12M, + SYSCLK_24M_SRC_XTH_12M, + SYSCLK_12M_SRC_XTH_12M, + SYSCLK_8M_SRC_XTH_12M, + SYSCLK_4M_SRC_XTH_12M, + + SYSCLK_64M_RCH, + SYSCLK_32M_RCH, + SYSCLK_16M_RCH, + SYSCLK_8M_RCH, + SYSCLK_4M_RCH, + + SYSCLK_12M_XTH_12M, + SYSCLK_6M_XTH_12M, + SYSCLK_4M_XTH_12M, + + SYSCLK_MAX, + +}SYSCLK_SelectTypeDef; + +/* + * @brief Peripheral Enable structures definition + */ +typedef enum +{ + //Peripheral on AHB1 + EN_DMA1 = 0, + EN_DMA2, + EN_CRC = 5, + EN_ETHMAC, + EN_ETHTX, + EN_ETHRX, + EN_DMA2D = 9, + EN_SPI1, + EN_SPI2, + EN_SPI3, + EN_SPI4, + EN_SPI5, + EN_SPI6, + EN_OTG1 = 20, + EN_OTG2 = 21, + EN_FDCAN1, + EN_FDCAN2, + EN_BKPSRAM = 27, + EN_ROM, + EN_SRAM1, + EN_SRAM2, + EN_SRAM3, + + //Peripheral on AHB2 + EN_GPIOA = (32+0), + EN_GPIOB, + EN_GPIOC, + EN_GPIOD, + EN_GPIOE, + EN_GPIOF, + EN_GPIOG, + EN_GPIOH, + EN_GPIOI, + EN_GPIOJ, + EN_GPIOK, + EN_GPIOL, + EN_GPIOM, + EN_GPION, + EN_GPIOO, + EN_GPIOP, + EN_GPIOQ, + EN_ADC12 = (32+17), + EN_ADC3, + EN_DAC1, + EN_DAC2, + EN_DCMI = (32+23), + EN_AESPI1, + EN_AES, + EN_HRNG, + EN_CORDIC, + EN_FDCAN3 = (32+28), + EN_THM = (32+31), + + //Peripheral on AHB3 + EN_QSPI7 = (32*2+0), + EN_QSPI8, + EN_SDMMC = (32*2+4), + EN_OSPI1 = (32*2+8), + EN_OSPI2, + EN_FMC = (32*2+12), + + //Peripheral on APB11 + EN_TIM2 = (32*3+0), + EN_TIM3, + EN_TIM4, + EN_TIM5, + EN_TIM6, + EN_TIM7, + EN_TIM12, + EN_TIM13, + EN_TIM14, + EN_RTC = (32*3+10), + EN_WDT = (32*3+11), + EN_I2S1 = (32*3+14), + EN_I2S2, + EN_I2S3, + EN_UART2, + EN_UART3, + EN_UART4, + EN_UART5, + EN_I2C1, + EN_I2C2, + EN_I2C3, + EN_I2C4, + EN_PMU = (32*3+27), + EN_LPTIM1 = (32*3+30), + EN_LPUART1, + + //Peripheral on APB12 + EN_LPTIM2 = (32*4+1), + EN_UART7, + EN_UART8, + EN_TIM25, + EN_TIM26, + EN_EFUSE1, + EN_EFUSE2, + + //Peripheral on APB2 + EN_SYSCFG = (32*5+0), + EN_CMP1 = (32*5+2), + EN_EXTI = (32*5+4), + EN_TIM1 = (32*5+6), + EN_TIM8 = (32*5+8), + EN_UART1, + EN_UART6, + EN_TIM15, + EN_TIM16, + EN_TIM17, + EN_TIM20 = (32*5+15), + EN_TKEY = (32*5+18), + EN_LTDC, + EN_TIM9 = (32*5+21), + EN_TIM10, + EN_TIM11, + EN_TIM18, + EN_TIM19, + EN_TIM21, + EN_TIM22, + EN_TIM23, + EN_TIM24, + EN_UART9, + EN_UART10, + + //Peripheral on APB3 + EN_LPTIM3 = (32*6+0), + EN_LPTIM4, + EN_LPTIM5, + EN_LPTIM6, + + //Peripheral on APB4 + EN_SPWM1 = (32*7+0), + EN_SPWM2, + EN_DPWM1, + EN_DPWM2, + EN_DPWM3, + EN_DPWM4, + EN_PNDL, + EN_LPT, + EN_MDAC, + EN_SPWM3 = (32*7+12), + EN_SPWM4, + EN_SPWM5, + EN_SPWM6, + EN_DPWM5, + EN_DPWM6, + + EN_MODULE_MAX = (32*8) + +}enum_Enable_ID_t; + + +/* + * @brief Peripheral Reset structures definition + */ +typedef enum +{ + //Peripheral on AHB1 + RST_DMA1 = 0, + RST_DMA2, + RST_CRC = 5, + RST_ETH, + RST_DMA2D = 9, + RST_SPI1, + RST_SPI2, + RST_SPI3, + RST_SPI4, + RST_SPI5, + RST_SPI6, + RST_OTG1 = 20, + RST_OTG2 = 21, + RST_FDCAN1, + RST_FDCAN2, + + //Peripheral on AHB2 + RST_GPIOA = (32+0), + RST_GPIOB, + RST_GPIOC, + RST_GPIOD, + RST_GPIOE, + RST_GPIOF, + RST_GPIOG, + RST_GPIOH, + RST_GPIOI, + RST_GPIOJ, + RST_GPIOK, + RST_GPIOL, + RST_GPIOM, + RST_GPION, + RST_GPIOO, + RST_GPIOP, + RST_GPIOQ, + RST_ADC12 = (32+17), + RST_ADC3, + RST_DAC1, + RST_DAC2, + RST_DCMI = (32+23), + RST_UAC = (32+27), + RST_FDCAN3 = (32+28), + RST_THM = (32+31), + + //Peripheral on AHB3 + RST_QSPI7 = (32*2+0), + RST_QSPI8, + RST_SDMMC = (32*2+4), + RST_OSPI1 = (32*2+8), + RST_OSPI2, + RST_FMC = (32*2+12), + + //Peripheral on APB11 + RST_TIM2 = (32*3+0), + RST_TIM3, + RST_TIM4, + RST_TIM5, + RST_TIM6, + RST_TIM7, + RST_TIM12, + RST_TIM13, + RST_TIM14, + RST_WDT = (32*3+11), + RST_I2S1 = (32*3+14), + RST_I2S2, + RST_I2S3, + RST_UART2, + RST_UART3, + RST_UART4, + RST_UART5, + RST_I2C1, + RST_I2C2, + RST_I2C3, + RST_I2C4, + RST_PMU = (32*3+27), + RST_LPTIM1 = (32*3+30), + RST_LPUART1, + + //Peripheral on APB12 + RST_LPTIM2 = (32*4+1), + RST_UART7, + RST_UART8, + RST_TIM25, + RST_TIM26, + RST_EFUSE1, + RST_EFUSE2, + + //Peripheral on APB2 + RST_SYSCFG = (32*5+0), + RST_CMP1 = (32*5+2), + RST_EXTI = (32*5+4), + RST_TIM1 = (32*5+6), + RST_TIM8 = (32*5+8), + RST_UART1, + RST_UART6, + RST_TIM15, + RST_TIM16, + RST_TIM17, + RST_TIM20 = (32*5+15), + RST_TKEY = (32*5+18), + RST_LTDC, + RST_TIM9 = (32*5+21), + RST_TIM10, + RST_TIM11, + RST_TIM18, + RST_TIM19, + RST_TIM21, + RST_TIM22, + RST_TIM23, + RST_TIM24, + RST_UART9, + RST_UART10, + + //Peripheral on APB3 + RST_LPTIM3 = (32*6+0), + RST_LPTIM4, + RST_LPTIM5, + RST_LPTIM6, + + //Peripheral on APB4 + RST_SPWM1 = (32*7+0), + RST_SPWM2, + RST_DPWM1, + RST_DPWM2, + RST_DPWM3, + RST_DPWM4, + RST_PNDL, + RST_LPT, + RST_MDAC, + RST_SPWM3 = (32*7+12), + RST_SPWM4, + RST_SPWM5, + RST_SPWM6, + RST_DPWM5, + RST_DPWM6, + +}enum_RST_ID_t; + + +/****** system core clock select, uesr config ***********/ +#define SYSCLK_SELECT SYSCLK_220M_SRC_XTH_12M + +/****************************************************************************** +*@brief : PCLK1_DIV_SELECT: pclk1 div select, uesr config +* @arg 1, 2, 4, 8, 16 +******************************************************************************/ +#define PCLK1_DIV_SELECT 2 + +/****************************************************************************** +*@brief : PCLK2_DIV_SELECT: pclk2 div select, uesr config +* @arg 1, 2, 4, 8, 16 +******************************************************************************/ +#define PCLK2_DIV_SELECT 2 + + +/****************************************************************************** +*@brief : PCLK3_DIV_SELECT: pclk3 div select, uesr config +* @arg 1, 2, 4, 8, 16 +******************************************************************************/ +#define PCLK3_DIV_SELECT 2 + + +/****************************************************************************** +*@brief : PCLK4_DIV_SELECT: pclk4 div select, uesr config +* @arg 1, 2, 4, 8, 16 +******************************************************************************/ +#define PCLK4_DIV_SELECT 2 + +/****************************************************************************** +*@note : SystemCoreClock variable is updated in three ways: +* 1) by calling CMSIS function SystemCoreClockUpdate() +* 2) by calling HAL API function HAL_RCC_GetSysClkFreq() +* 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency +* If you use this function to configure the system clock; then there +* is no need to call the 2 first functions listed above, since SystemCoreClock +* variable is updated automatically. +******************************************************************************/ +extern volatile uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + +void SystemInit(void); +void SystemCoreClockUpdate(void); +HAL_StatusTypeDef SystemClock_Config(uint32_t sysclkSel, uint32_t pclk1Div, \ + uint32_t pclk2Div, uint32_t pclk3Div, uint32_t pclk4Div); +void System_Module_Enable(enum_Enable_ID_t fe_ID_Index); +void System_Module_Disable(enum_Enable_ID_t fe_ID_Index); + +#endif /* __SYSTEM_ACM32H5XX_H */ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_HCD.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_HCD.h new file mode 100644 index 0000000000..61fcb94f18 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_HCD.h @@ -0,0 +1,316 @@ +/** + ****************************************************************************** + * @file hal_hcd.h + * @author MCD Application Team + * @brief Header file of HCD HAL module. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2024 Aisinochip. + * All rights reserved. + * + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef HAL_HCD_H +#define HAL_HCD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "LL_USB.h" + +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +/** @addtogroup + * @{ + */ + +/** @addtogroup HCD + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup HCD_Exported_Types HCD Exported Types + * @{ + */ + +/** @defgroup HCD_Exported_Types_Group1 HCD State Structure definition + * @{ + */ +typedef enum +{ + HAL_HCD_STATE_RESET = 0x00, + HAL_HCD_STATE_READY = 0x01, + HAL_HCD_STATE_ERROR = 0x02, + HAL_HCD_STATE_BUSY = 0x03, + HAL_HCD_STATE_TIMEOUT = 0x04 +} HCD_StateTypeDef; + +typedef USB_OTG_GlobalTypeDef HCD_TypeDef; +typedef USB_OTG_CfgTypeDef HCD_InitTypeDef; +typedef USB_OTG_HCTypeDef HCD_HCTypeDef; +typedef USB_OTG_URBStateTypeDef HCD_URBStateTypeDef; +typedef USB_OTG_HCStateTypeDef HCD_HCStateTypeDef; +/** + * @} + */ + +/** @defgroup HCD_Exported_Types_Group2 HCD Handle Structure definition + * @{ + */ +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) +typedef struct __HCD_HandleTypeDef +#else +typedef struct +#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ +{ + HCD_TypeDef *Instance; /*!< Register base address */ + HCD_InitTypeDef Init; /*!< HCD required parameters */ + HCD_HCTypeDef hc[16]; /*!< Host channels parameters */ + HAL_LockTypeDef Lock; /*!< HCD peripheral status */ + __IO HCD_StateTypeDef State; /*!< HCD communication state */ + __IO uint32_t ErrorCode; /*!< HCD Error code */ + void *pData; /*!< Pointer Stack Handler */ +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) + void (* SOFCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD SOF callback */ + void (* ConnectCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD Connect callback */ + void (* DisconnectCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD Disconnect callback */ + void (* PortEnabledCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD Port Enable callback */ + void (* PortDisabledCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD Port Disable callback */ + void (* HC_NotifyURBChangeCallback)(struct __HCD_HandleTypeDef *hhcd, uint8_t chnum, + HCD_URBStateTypeDef urb_state); /*!< USB OTG HCD Host Channel Notify URB Change callback */ + + void (* MspInitCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD Msp Init callback */ + void (* MspDeInitCallback)(struct __HCD_HandleTypeDef *hhcd); /*!< USB OTG HCD Msp DeInit callback */ +#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ +} HCD_HandleTypeDef; +/** + * @} + */ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup HCD_Exported_Constants HCD Exported Constants + * @{ + */ + +/** @defgroup HCD_Speed HCD Speed + * @{ + */ +#define HCD_SPEED_HIGH USBH_HS_SPEED +#define HCD_SPEED_FULL USBH_FSLS_SPEED +#define HCD_SPEED_LOW USBH_FSLS_SPEED + +/** + * @} + */ + +/** @defgroup HCD_PHY_Module HCD PHY Module + * @{ + */ +#define HCD_PHY_ULPI 1U +#define HCD_PHY_EMBEDDED 2U +/** + * @} + */ + +/** @defgroup HCD_Error_Code_definition HCD Error Code definition + * @brief HCD Error Code definition + * @{ + */ +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) +#define HAL_HCD_ERROR_INVALID_CALLBACK (0x00000010U) /*!< Invalid Callback error */ +#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup HCD_Exported_Macros HCD Exported Macros + * @brief macros to handle interrupts and specific clock configurations + * @{ + */ +#define __HAL_HCD_ENABLE(__HANDLE__) (void)USB_EnableGlobalInt ((__HANDLE__)->Instance) +#define __HAL_HCD_DISABLE(__HANDLE__) (void)USB_DisableGlobalInt ((__HANDLE__)->Instance) + +#define __HAL_HCD_GET_FLAG(__HANDLE__, __INTERRUPT__) ((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__)) +#define __HAL_HCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->GINTSTS) = (__INTERRUPT__)) +#define __HAL_HCD_IS_INVALID_INTERRUPT(__HANDLE__) (USB_ReadInterrupts((__HANDLE__)->Instance) == 0U) + +#define __HAL_HCD_CLEAR_HC_INT(chnum, __INTERRUPT__) (USBx_HC(chnum)->HCINT = (__INTERRUPT__)) +#define __HAL_HCD_MASK_HALT_HC_INT(chnum) (USBx_HC(chnum)->HCINTMSK &= ~USB_OTG_HCINTMSK_CHHM) +#define __HAL_HCD_UNMASK_HALT_HC_INT(chnum) (USBx_HC(chnum)->HCINTMSK |= USB_OTG_HCINTMSK_CHHM) +#define __HAL_HCD_MASK_ACK_HC_INT(chnum) (USBx_HC(chnum)->HCINTMSK &= ~USB_OTG_HCINTMSK_ACKM) +#define __HAL_HCD_UNMASK_ACK_HC_INT(chnum) (USBx_HC(chnum)->HCINTMSK |= USB_OTG_HCINTMSK_ACKM) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup HCD_Exported_Functions HCD Exported Functions + * @{ + */ + +/** @defgroup HCD_Exported_Functions_Group1 Initialization and de-initialization functions + * @{ + */ +HAL_StatusTypeDef HAL_HCD_Init(HCD_HandleTypeDef *hhcd); +HAL_StatusTypeDef HAL_HCD_DeInit(HCD_HandleTypeDef *hhcd); +HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd, uint8_t ch_num, + uint8_t epnum, uint8_t dev_address, + uint8_t speed, uint8_t ep_type, uint16_t mps); + +HAL_StatusTypeDef HAL_HCD_HC_Halt(HCD_HandleTypeDef *hhcd, uint8_t ch_num); +void HAL_HCD_MspInit(HCD_HandleTypeDef *hhcd); +void HAL_HCD_MspDeInit(HCD_HandleTypeDef *hhcd); + +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) +/** @defgroup HAL_HCD_Callback_ID_enumeration_definition HAL USB OTG HCD Callback ID enumeration definition + * @brief HAL USB OTG HCD Callback ID enumeration definition + * @{ + */ +typedef enum +{ + HAL_HCD_SOF_CB_ID = 0x01, /*!< USB HCD SOF callback ID */ + HAL_HCD_CONNECT_CB_ID = 0x02, /*!< USB HCD Connect callback ID */ + HAL_HCD_DISCONNECT_CB_ID = 0x03, /*!< USB HCD Disconnect callback ID */ + HAL_HCD_PORT_ENABLED_CB_ID = 0x04, /*!< USB HCD Port Enable callback ID */ + HAL_HCD_PORT_DISABLED_CB_ID = 0x05, /*!< USB HCD Port Disable callback ID */ + + HAL_HCD_MSPINIT_CB_ID = 0x06, /*!< USB HCD MspInit callback ID */ + HAL_HCD_MSPDEINIT_CB_ID = 0x07 /*!< USB HCD MspDeInit callback ID */ + +} HAL_HCD_CallbackIDTypeDef; +/** + * @} + */ + +/** @defgroup HAL_HCD_Callback_pointer_definition HAL USB OTG HCD Callback pointer definition + * @brief HAL USB OTG HCD Callback pointer definition + * @{ + */ + +typedef void (*pHCD_CallbackTypeDef)(HCD_HandleTypeDef *hhcd); /*!< pointer to a common USB OTG HCD callback function */ +typedef void (*pHCD_HC_NotifyURBChangeCallbackTypeDef)(HCD_HandleTypeDef *hhcd, + uint8_t epnum, + HCD_URBStateTypeDef urb_state); /*!< pointer to USB OTG HCD host channel callback */ +/** + * @} + */ + +HAL_StatusTypeDef HAL_HCD_RegisterCallback(HCD_HandleTypeDef *hhcd, HAL_HCD_CallbackIDTypeDef CallbackID, pHCD_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_HCD_UnRegisterCallback(HCD_HandleTypeDef *hhcd, HAL_HCD_CallbackIDTypeDef CallbackID); + +HAL_StatusTypeDef HAL_HCD_RegisterHC_NotifyURBChangeCallback(HCD_HandleTypeDef *hhcd, pHCD_HC_NotifyURBChangeCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_HCD_UnRegisterHC_NotifyURBChangeCallback(HCD_HandleTypeDef *hhcd); +#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ +/** + * @} + */ + +/* I/O operation functions ***************************************************/ +/** @addtogroup HCD_Exported_Functions_Group2 Input and Output operation functions + * @{ + */ +HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, uint8_t ch_num, + uint8_t direction, uint8_t ep_type, + uint8_t token, uint8_t *pbuff, + uint16_t length, uint8_t do_ping); + +/* Non-Blocking mode: Interrupt */ +void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd); +void HAL_HCD_SOF_Callback(HCD_HandleTypeDef *hhcd); +void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd); +void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef *hhcd); +void HAL_HCD_PortEnabled_Callback(HCD_HandleTypeDef *hhcd); +void HAL_HCD_PortDisabled_Callback(HCD_HandleTypeDef *hhcd); +void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, uint8_t chnum, + HCD_URBStateTypeDef urb_state); +/** + * @} + */ + +/* Peripheral Control functions **********************************************/ +/** @addtogroup HCD_Exported_Functions_Group3 Peripheral Control functions + * @{ + */ +HAL_StatusTypeDef HAL_HCD_ResetPort(HCD_HandleTypeDef *hhcd); +HAL_StatusTypeDef HAL_HCD_Start(HCD_HandleTypeDef *hhcd); +HAL_StatusTypeDef HAL_HCD_Stop(HCD_HandleTypeDef *hhcd); +/** + * @} + */ + +/* Peripheral State functions ************************************************/ +/** @addtogroup HCD_Exported_Functions_Group4 Peripheral State functions + * @{ + */ +HCD_StateTypeDef HAL_HCD_GetState(HCD_HandleTypeDef *hhcd); +HCD_URBStateTypeDef HAL_HCD_HC_GetURBState(HCD_HandleTypeDef *hhcd, uint8_t chnum); +HCD_HCStateTypeDef HAL_HCD_HC_GetState(HCD_HandleTypeDef *hhcd, uint8_t chnum); +uint32_t HAL_HCD_HC_GetXferCount(HCD_HandleTypeDef *hhcd, uint8_t chnum); +uint32_t HAL_HCD_GetCurrentFrame(HCD_HandleTypeDef *hhcd); +uint32_t HAL_HCD_GetCurrentSpeed(HCD_HandleTypeDef *hhcd); +/** + * @} + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup HCD_Private_Macros HCD Private Macros + * @{ + */ + +/** + * @} + */ + +/* Private functions prototypes ----------------------------------------------*/ +/** @defgroup HCD_Private_Functions_Prototypes HCD Private Functions Prototypes + * @{ + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup HCD_Private_Functions HCD Private Functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_HCD_H */ + +/************************ (C) COPYRIGHT Aisinochip *****END OF FILE****/ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_PCD.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_PCD.h new file mode 100644 index 0000000000..73bf46f1c1 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_PCD.h @@ -0,0 +1,409 @@ +/** + ****************************************************************************** + * @file ACM32H5xx_hal_pcd.h + * @author MCD Application Team + * @brief Header file of PCD HAL module. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2024 Aisinochip. + * All rights reserved. + * + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef HAL_PCD_H +#define HAL_PCD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ + +#include "HAL_USB_Def.h" + +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) + +/** @addtogroup + * @{ + */ + +/** @addtogroup PCD + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup PCD_Exported_Types PCD Exported Types + * @{ + */ + +/** + * @brief PCD State structure definition + */ +typedef enum +{ + HAL_PCD_STATE_RESET = 0x00, + HAL_PCD_STATE_READY = 0x01, + HAL_PCD_STATE_ERROR = 0x02, + HAL_PCD_STATE_BUSY = 0x03, + HAL_PCD_STATE_TIMEOUT = 0x04 +} PCD_StateTypeDef; + +/* Device LPM suspend state */ +typedef enum +{ + LPM_L0 = 0x00, /* on */ + LPM_L1 = 0x01, /* LPM L1 sleep */ + LPM_L2 = 0x02, /* suspend */ + LPM_L3 = 0x03, /* off */ +} PCD_LPM_StateTypeDef; + +typedef enum +{ + PCD_LPM_L0_ACTIVE = 0x00, /* on */ + PCD_LPM_L1_ACTIVE = 0x01, /* LPM L1 sleep */ +} PCD_LPM_MsgTypeDef; + +typedef enum +{ + PCD_BCD_ERROR = 0xFF, + PCD_BCD_CONTACT_DETECTION = 0xFE, + PCD_BCD_STD_DOWNSTREAM_PORT = 0xFD, + PCD_BCD_CHARGING_DOWNSTREAM_PORT = 0xFC, + PCD_BCD_DEDICATED_CHARGING_PORT = 0xFB, + PCD_BCD_DISCOVERY_COMPLETED = 0x00, + +} PCD_BCD_MsgTypeDef; + +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +typedef USB_OTG_GlobalTypeDef PCD_TypeDef; +typedef USB_OTG_CfgTypeDef PCD_InitTypeDef; +typedef USB_OTG_EPTypeDef PCD_EPTypeDef; +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + +/** + * @brief PCD Handle Structure definition + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +typedef struct __PCD_HandleTypeDef +#else +typedef struct +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + PCD_TypeDef *Instance; /*!< Register base address */ + PCD_InitTypeDef Init; /*!< PCD required parameters */ + __IO uint8_t USB_Address; /*!< USB Address */ + PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ + PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ + HAL_LockTypeDef Lock; /*!< PCD peripheral status */ + __IO PCD_StateTypeDef State; /*!< PCD communication state */ + __IO uint32_t ErrorCode; /*!< PCD Error code */ + uint32_t Setup[12]; /*!< Setup packet buffer */ + PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ + uint32_t BESL; + + + uint32_t lpm_active; /*!< Enable or disable the Link Power Management . + This parameter can be set to ENABLE or DISABLE */ + void *pData; /*!< Pointer to upper stack Handler */ + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + void (* SOFCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD SOF callback */ + void (* SetupStageCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Setup Stage callback */ + void (* ResetCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Reset callback */ + void (* SuspendCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Suspend callback */ + void (* ResumeCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Resume callback */ + void (* ConnectCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Connect callback */ + void (* DisconnectCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Disconnect callback */ + + void (* DataOutStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD Data OUT Stage callback */ + void (* DataInStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD Data IN Stage callback */ + void (* ISOOUTIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD ISO OUT Incomplete callback */ + void (* ISOINIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD ISO IN Incomplete callback */ + void (* LPMCallback)(struct __PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); /*!< USB OTG PCD LPM callback */ + + void (* MspInitCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Msp Init callback */ + void (* MspDeInitCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Msp DeInit callback */ +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +} PCD_HandleTypeDef; + +/** + * @} + */ + +/* Include PCD HAL Extended module */ +#include "HAL_PCD_EX.h" + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup PCD_Exported_Constants PCD Exported Constants + * @{ + */ + +/** @defgroup PCD_Speed PCD Speed + * @{ + */ +#define PCD_SPEED_HIGH USBD_HS_SPEED +#define PCD_SPEED_HIGH_IN_FULL USBD_HSINFS_SPEED +#define PCD_SPEED_FULL USBD_FS_SPEED +/** + * @} + */ + +/** @defgroup PCD_PHY_Module PCD PHY Module + * @{ + */ +#define PCD_PHY_ULPI 1U +#define PCD_PHY_EMBEDDED 2U +#define PCD_PHY_UTMI 3U +/** + * @} + */ + +/** @defgroup PCD_Error_Code_definition PCD Error Code definition + * @brief PCD Error Code definition + * @{ + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +#define HAL_PCD_ERROR_INVALID_CALLBACK (0x00000010U) /*!< Invalid Callback error */ +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macros -----------------------------------------------------------*/ +/** @defgroup PCD_Exported_Macros PCD Exported Macros + * @brief macros to handle interrupts and specific clock configurations + * @{ + */ +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +#define __HAL_PCD_ENABLE(__HANDLE__) (void)USB_EnableGlobalInt ((__HANDLE__)->Instance) +#define __HAL_PCD_DISABLE(__HANDLE__) (void)USB_DisableGlobalInt ((__HANDLE__)->Instance) + +#define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__) ((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__)) +#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->GINTSTS) &= (__INTERRUPT__)) +#define __HAL_PCD_IS_INVALID_INTERRUPT(__HANDLE__) (USB_ReadInterrupts((__HANDLE__)->Instance) == 0U) + + +#define __HAL_PCD_UNGATE_PHYCLOCK(__HANDLE__) *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) &= \ + ~(USB_OTG_PCGCCTL_STOPCLK) + +#define __HAL_PCD_GATE_PHYCLOCK(__HANDLE__) *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) |= USB_OTG_PCGCCTL_STOPCLK + +#define __HAL_PCD_IS_PHY_SUSPENDED(__HANDLE__) ((*(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE)) & 0x10U) + +#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= (USB_OTG_HS_WAKEUP_EXTI_LINE) +#define __HAL_USB_OTG_HS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE) +#define __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_HS_WAKEUP_EXTI_LINE) +#define __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = (USB_OTG_HS_WAKEUP_EXTI_LINE) + +#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ + do { \ + EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE); \ + EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE; \ + } while(0U) +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= USB_OTG_FS_WAKEUP_EXTI_LINE +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE) +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_FS_WAKEUP_EXTI_LINE) +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = USB_OTG_FS_WAKEUP_EXTI_LINE + +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ + do { \ + EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE); \ + EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE; \ + } while(0U) +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PCD_Exported_Functions PCD Exported Functions + * @{ + */ + +/* Initialization/de-initialization functions ********************************/ +/** @addtogroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions + * @{ + */ +HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd); +HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd); +void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd); +void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd); + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +/** @defgroup HAL_PCD_Callback_ID_enumeration_definition HAL USB OTG PCD Callback ID enumeration definition + * @brief HAL USB OTG PCD Callback ID enumeration definition + * @{ + */ +typedef enum +{ + HAL_PCD_SOF_CB_ID = 0x01, /*!< USB PCD SOF callback ID */ + HAL_PCD_SETUPSTAGE_CB_ID = 0x02, /*!< USB PCD Setup Stage callback ID */ + HAL_PCD_RESET_CB_ID = 0x03, /*!< USB PCD Reset callback ID */ + HAL_PCD_SUSPEND_CB_ID = 0x04, /*!< USB PCD Suspend callback ID */ + HAL_PCD_RESUME_CB_ID = 0x05, /*!< USB PCD Resume callback ID */ + HAL_PCD_CONNECT_CB_ID = 0x06, /*!< USB PCD Connect callback ID */ + HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ + + HAL_PCD_MSPINIT_CB_ID = 0x08, /*!< USB PCD MspInit callback ID */ + HAL_PCD_MSPDEINIT_CB_ID = 0x09 /*!< USB PCD MspDeInit callback ID */ + +} HAL_PCD_CallbackIDTypeDef; +/** + * @} + */ + +/** @defgroup HAL_PCD_Callback_pointer_definition HAL USB OTG PCD Callback pointer definition + * @brief HAL USB OTG PCD Callback pointer definition + * @{ + */ + +typedef void (*pPCD_CallbackTypeDef)(PCD_HandleTypeDef *hpcd); /*!< pointer to a common USB OTG PCD callback function */ +typedef void (*pPCD_DataOutStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD Data OUT Stage callback */ +typedef void (*pPCD_DataInStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD Data IN Stage callback */ +typedef void (*pPCD_IsoOutIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD ISO OUT Incomplete callback */ +typedef void (*pPCD_IsoInIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD ISO IN Incomplete callback */ +typedef void (*pPCD_LpmCallbackTypeDef)(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); /*!< pointer to USB OTG PCD LPM callback */ + +/** + * @} + */ + +HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID, pPCD_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID); + +HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, pPCD_DataOutStageCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd); + +HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, pPCD_DataInStageCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd); + +HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, pPCD_IsoOutIncpltCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd); + +HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, pPCD_IsoInIncpltCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd); + +HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_PCD_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +/** + * @} + */ + +/* I/O operation functions ***************************************************/ +/* Non-Blocking mode: Interrupt */ +/** @addtogroup PCD_Exported_Functions_Group2 Input and Output operation functions + * @{ + */ +HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd); +HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd); +void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd); + +void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd); +void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd); +void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd); +void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd); +void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd); +void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd); +void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd); + +void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); +void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); +void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); +void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); +/** + * @} + */ + +/* Peripheral Control functions **********************************************/ +/** @addtogroup PCD_Exported_Functions_Group3 Peripheral Control functions + * @{ + */ +HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd); +HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd); +HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address); +HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type); +HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); +HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len); +HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len); +uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); +HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); +HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); +HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); +HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd); +HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd); +/** + * @} + */ + +/* Peripheral State functions ************************************************/ +/** @addtogroup PCD_Exported_Functions_Group4 Peripheral State functions + * @{ + */ +PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd); +/** + * @} + */ + +/** + * @} + */ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup PCD_Private_Constants PCD Private Constants + * @{ + */ +/** @defgroup USB_EXTI_Line_Interrupt USB EXTI line interrupt + * @{ + */ +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +#define USB_OTG_FS_WAKEUP_EXTI_LINE (0x1U << 18) /*!< USB FS EXTI Line WakeUp Interrupt */ +#define USB_OTG_HS_WAKEUP_EXTI_LINE (0x1U << 20) /*!< USB HS EXTI Line WakeUp Interrupt */ +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + + +/** + * @} + */ +/** + * @} + */ + + + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup PCD_Private_Macros PCD Private Macros + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_PCD_H */ + +/************************ (C) COPYRIGHT Aisinochip *****END OF FILE****/ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_PCD_EX.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_PCD_EX.h new file mode 100644 index 0000000000..199a44294d --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_PCD_EX.h @@ -0,0 +1,82 @@ +/** + ****************************************************************************** + * @file ACM32H5xx_hal_pcd_ex.h + * @author MCD Application Team + * @brief Header file of PCD HAL Extension module. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2024 Aisinochip. + * All rights reserved. + * + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef ACM32H5xx_HAL_PCD_EX_H +#define ACM32H5xx_HAL_PCD_EX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "hal.h" + +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +/** @addtogroup + * @{ + */ + +/** @addtogroup PCDEx + * @{ + */ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macros -----------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PCDEx_Exported_Functions PCDEx Exported Functions + * @{ + */ +/** @addtogroup PCDEx_Exported_Functions_Group1 Peripheral Control functions + * @{ + */ + +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size); +HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size); +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + + +HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd); +HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd); + +void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); +void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + +#ifdef __cplusplus +} +#endif + + +#endif + +/************************ (C) COPYRIGHT Aisinochip *****END OF FILE****/ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_USB_Def.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_USB_Def.h new file mode 100644 index 0000000000..854e6b84c7 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/HAL_USB_Def.h @@ -0,0 +1,1471 @@ + +/*********************************************************************** + * Filename : HAL_USB_Def.h + * Description : HAL usb driver header file + * Author(s) : CWT + * version : V1.0 + * Modify date : 2020-04-17 + ***********************************************************************/ + +#ifndef __HAL_USB_DEF_H__ +#define __HAL_USB_DEF_H__ + +#include "hal.h" + + +/******************************************************************************/ +/* */ +/* USB_OTG */ +/* */ +/******************************************************************************/ +/******************** Bit definition for USB_OTG_GOTGCTL register ********************/ +#define USB_OTG_GOTGCTL_SRQSCS_Pos (0U) +#define USB_OTG_GOTGCTL_SRQSCS_Msk (0x1UL << USB_OTG_GOTGCTL_SRQSCS_Pos) /*!< 0x00000001 */ +#define USB_OTG_GOTGCTL_SRQSCS USB_OTG_GOTGCTL_SRQSCS_Msk /*!< Session request success */ +#define USB_OTG_GOTGCTL_SRQ_Pos (1U) +#define USB_OTG_GOTGCTL_SRQ_Msk (0x1UL << USB_OTG_GOTGCTL_SRQ_Pos) /*!< 0x00000002 */ +#define USB_OTG_GOTGCTL_SRQ USB_OTG_GOTGCTL_SRQ_Msk /*!< Session request */ +#define USB_OTG_GOTGCTL_VBVALOEN_Pos (2U) +#define USB_OTG_GOTGCTL_VBVALOEN_Msk (0x1UL << USB_OTG_GOTGCTL_VBVALOEN_Pos) /*!< 0x00000004 */ +#define USB_OTG_GOTGCTL_VBVALOEN USB_OTG_GOTGCTL_VBVALOEN_Msk /*!< VBUS valid override enable */ +#define USB_OTG_GOTGCTL_VBVALOVAL_Pos (3U) +#define USB_OTG_GOTGCTL_VBVALOVAL_Msk (0x1UL << USB_OTG_GOTGCTL_VBVALOVAL_Pos) /*!< 0x00000008 */ +#define USB_OTG_GOTGCTL_VBVALOVAL USB_OTG_GOTGCTL_VBVALOVAL_Msk /*!< VBUS valid override value */ +#define USB_OTG_GOTGCTL_AVALOEN_Pos (4U) +#define USB_OTG_GOTGCTL_AVALOEN_Msk (0x1UL << USB_OTG_GOTGCTL_AVALOEN_Pos) /*!< 0x00000010 */ +#define USB_OTG_GOTGCTL_AVALOEN USB_OTG_GOTGCTL_AVALOEN_Msk /*!< A-peripheral session valid override enable */ +#define USB_OTG_GOTGCTL_AVALOVAL_Pos (5U) +#define USB_OTG_GOTGCTL_AVALOVAL_Msk (0x1UL << USB_OTG_GOTGCTL_AVALOVAL_Pos) /*!< 0x00000020 */ +#define USB_OTG_GOTGCTL_AVALOVAL USB_OTG_GOTGCTL_AVALOVAL_Msk /*!< A-peripheral session valid override value */ +#define USB_OTG_GOTGCTL_BVALOEN_Pos (6U) +#define USB_OTG_GOTGCTL_BVALOEN_Msk (0x1UL << USB_OTG_GOTGCTL_BVALOEN_Pos) /*!< 0x00000040 */ +#define USB_OTG_GOTGCTL_BVALOEN USB_OTG_GOTGCTL_BVALOEN_Msk /*!< B-peripheral session valid override enable */ +#define USB_OTG_GOTGCTL_BVALOVAL_Pos (7U) +#define USB_OTG_GOTGCTL_BVALOVAL_Msk (0x1UL << USB_OTG_GOTGCTL_BVALOVAL_Pos) /*!< 0x00000080 */ +#define USB_OTG_GOTGCTL_BVALOVAL USB_OTG_GOTGCTL_BVALOVAL_Msk /*!< B-peripheral session valid override value */ +#define USB_OTG_GOTGCTL_HNGSCS_Pos (8U) +#define USB_OTG_GOTGCTL_HNGSCS_Msk (0x1UL << USB_OTG_GOTGCTL_HNGSCS_Pos) /*!< 0x00000100 */ +#define USB_OTG_GOTGCTL_HNGSCS USB_OTG_GOTGCTL_HNGSCS_Msk /*!< Host set HNP enable */ +#define USB_OTG_GOTGCTL_HNPRQ_Pos (9U) +#define USB_OTG_GOTGCTL_HNPRQ_Msk (0x1UL << USB_OTG_GOTGCTL_HNPRQ_Pos) /*!< 0x00000200 */ +#define USB_OTG_GOTGCTL_HNPRQ USB_OTG_GOTGCTL_HNPRQ_Msk /*!< HNP request */ +#define USB_OTG_GOTGCTL_HSHNPEN_Pos (10U) +#define USB_OTG_GOTGCTL_HSHNPEN_Msk (0x1UL << USB_OTG_GOTGCTL_HSHNPEN_Pos) /*!< 0x00000400 */ +#define USB_OTG_GOTGCTL_HSHNPEN USB_OTG_GOTGCTL_HSHNPEN_Msk /*!< Host set HNP enable */ +#define USB_OTG_GOTGCTL_DHNPEN_Pos (11U) +#define USB_OTG_GOTGCTL_DHNPEN_Msk (0x1UL << USB_OTG_GOTGCTL_DHNPEN_Pos) /*!< 0x00000800 */ +#define USB_OTG_GOTGCTL_DHNPEN USB_OTG_GOTGCTL_DHNPEN_Msk /*!< Device HNP enabled */ +#define USB_OTG_GOTGCTL_EHEN_Pos (12U) +#define USB_OTG_GOTGCTL_EHEN_Msk (0x1UL << USB_OTG_GOTGCTL_EHEN_Pos) /*!< 0x00001000 */ +#define USB_OTG_GOTGCTL_EHEN USB_OTG_GOTGCTL_EHEN_Msk /*!< Embedded host enable */ +#define USB_OTG_GOTGCTL_CIDSTS_Pos (16U) +#define USB_OTG_GOTGCTL_CIDSTS_Msk (0x1UL << USB_OTG_GOTGCTL_CIDSTS_Pos) /*!< 0x00010000 */ +#define USB_OTG_GOTGCTL_CIDSTS USB_OTG_GOTGCTL_CIDSTS_Msk /*!< Connector ID status */ +#define USB_OTG_GOTGCTL_DBCT_Pos (17U) +#define USB_OTG_GOTGCTL_DBCT_Msk (0x1UL << USB_OTG_GOTGCTL_DBCT_Pos) /*!< 0x00020000 */ +#define USB_OTG_GOTGCTL_DBCT USB_OTG_GOTGCTL_DBCT_Msk /*!< Long/short debounce time */ +#define USB_OTG_GOTGCTL_ASVLD_Pos (18U) +#define USB_OTG_GOTGCTL_ASVLD_Msk (0x1UL << USB_OTG_GOTGCTL_ASVLD_Pos) /*!< 0x00040000 */ +#define USB_OTG_GOTGCTL_ASVLD USB_OTG_GOTGCTL_ASVLD_Msk /*!< A-session valid */ +#define USB_OTG_GOTGCTL_BSESVLD_Pos (19U) +#define USB_OTG_GOTGCTL_BSESVLD_Msk (0x1UL << USB_OTG_GOTGCTL_BSESVLD_Pos) /*!< 0x00080000 */ +#define USB_OTG_GOTGCTL_BSESVLD USB_OTG_GOTGCTL_BSESVLD_Msk /*!< B-session valid */ +#define USB_OTG_GOTGCTL_OTGVER_Pos (20U) +#define USB_OTG_GOTGCTL_OTGVER_Msk (0x1UL << USB_OTG_GOTGCTL_OTGVER_Pos) /*!< 0x00100000 */ +#define USB_OTG_GOTGCTL_OTGVER USB_OTG_GOTGCTL_OTGVER_Msk /*!< OTG version */ +#define USB_OTG_GOTGCTL_CURR_MODE_Pos (21U) +#define USB_OTG_GOTGCTL_CURR_MODE_Pos_Msk (0x1UL << USB_OTG_GOTGCTL_CURR_MODE_Pos) /*!< 0x00200000 */ +#define USB_OTG_GOTGCTL_CURR_MODE USB_OTG_GOTGCTL_CURR_MODE_Pos_Msk /*!< OTG Current Mode */ + +/******************** Bit definition for USB_OTG_HCFG register ********************/ +#define USB_OTG_HCFG_FSLSPCS_Pos (0U) +#define USB_OTG_HCFG_FSLSPCS_Msk (0x3UL << USB_OTG_HCFG_FSLSPCS_Pos) /*!< 0x00000003 */ +#define USB_OTG_HCFG_FSLSPCS USB_OTG_HCFG_FSLSPCS_Msk /*!< FS/LS PHY clock select */ +#define USB_OTG_HCFG_FSLSPCS_0 (0x1UL << USB_OTG_HCFG_FSLSPCS_Pos) /*!< 0x00000001 */ +#define USB_OTG_HCFG_FSLSPCS_1 (0x2UL << USB_OTG_HCFG_FSLSPCS_Pos) /*!< 0x00000002 */ +#define USB_OTG_HCFG_FSLSS_Pos (2U) +#define USB_OTG_HCFG_FSLSS_Msk (0x1UL << USB_OTG_HCFG_FSLSS_Pos) /*!< 0x00000004 */ +#define USB_OTG_HCFG_FSLSS USB_OTG_HCFG_FSLSS_Msk /*!< FS- and LS-only support */ + +/******************** Bit definition for USB_OTG_DCFG register ********************/ +#define USB_OTG_DCFG_DSPD_Pos (0U) +#define USB_OTG_DCFG_DSPD_Msk (0x3UL << USB_OTG_DCFG_DSPD_Pos) /*!< 0x00000003 */ +#define USB_OTG_DCFG_DSPD USB_OTG_DCFG_DSPD_Msk /*!< Device speed */ +#define USB_OTG_DCFG_DSPD_0 (0x1UL << USB_OTG_DCFG_DSPD_Pos) /*!< 0x00000001 */ +#define USB_OTG_DCFG_DSPD_1 (0x2UL << USB_OTG_DCFG_DSPD_Pos) /*!< 0x00000002 */ +#define USB_OTG_DCFG_NZLSOHSK_Pos (2U) +#define USB_OTG_DCFG_NZLSOHSK_Msk (0x1UL << USB_OTG_DCFG_NZLSOHSK_Pos) /*!< 0x00000004 */ +#define USB_OTG_DCFG_NZLSOHSK USB_OTG_DCFG_NZLSOHSK_Msk /*!< Nonzero-length status OUT handshake */ + +#define USB_OTG_DCFG_DAD_Pos (4U) +#define USB_OTG_DCFG_DAD_Msk (0x7FUL << USB_OTG_DCFG_DAD_Pos) /*!< 0x000007F0 */ +#define USB_OTG_DCFG_DAD USB_OTG_DCFG_DAD_Msk /*!< Device address */ +#define USB_OTG_DCFG_DAD_0 (0x01UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000010 */ +#define USB_OTG_DCFG_DAD_1 (0x02UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000020 */ +#define USB_OTG_DCFG_DAD_2 (0x04UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000040 */ +#define USB_OTG_DCFG_DAD_3 (0x08UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000080 */ +#define USB_OTG_DCFG_DAD_4 (0x10UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000100 */ +#define USB_OTG_DCFG_DAD_5 (0x20UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000200 */ +#define USB_OTG_DCFG_DAD_6 (0x40UL << USB_OTG_DCFG_DAD_Pos) /*!< 0x00000400 */ + +#define USB_OTG_DCFG_PFIVL_Pos (11U) +#define USB_OTG_DCFG_PFIVL_Msk (0x3UL << USB_OTG_DCFG_PFIVL_Pos) /*!< 0x00001800 */ +#define USB_OTG_DCFG_PFIVL USB_OTG_DCFG_PFIVL_Msk /*!< Periodic (micro)frame interval */ +#define USB_OTG_DCFG_PFIVL_0 (0x1UL << USB_OTG_DCFG_PFIVL_Pos) /*!< 0x00000800 */ +#define USB_OTG_DCFG_PFIVL_1 (0x2UL << USB_OTG_DCFG_PFIVL_Pos) /*!< 0x00001000 */ + +#define USB_OTG_DCFG_PERSCHIVL_Pos (24U) +#define USB_OTG_DCFG_PERSCHIVL_Msk (0x3UL << USB_OTG_DCFG_PERSCHIVL_Pos) /*!< 0x03000000 */ +#define USB_OTG_DCFG_PERSCHIVL USB_OTG_DCFG_PERSCHIVL_Msk /*!< Periodic scheduling interval */ +#define USB_OTG_DCFG_PERSCHIVL_0 (0x1UL << USB_OTG_DCFG_PERSCHIVL_Pos) /*!< 0x01000000 */ +#define USB_OTG_DCFG_PERSCHIVL_1 (0x2UL << USB_OTG_DCFG_PERSCHIVL_Pos) /*!< 0x02000000 */ + +/******************** Bit definition for USB_OTG_PCGCR register ********************/ +#define USB_OTG_PCGCR_STPPCLK_Pos (0U) +#define USB_OTG_PCGCR_STPPCLK_Msk (0x1UL << USB_OTG_PCGCR_STPPCLK_Pos) /*!< 0x00000001 */ +#define USB_OTG_PCGCR_STPPCLK USB_OTG_PCGCR_STPPCLK_Msk /*!< Stop PHY clock */ +#define USB_OTG_PCGCR_GATEHCLK_Pos (1U) +#define USB_OTG_PCGCR_GATEHCLK_Msk (0x1UL << USB_OTG_PCGCR_GATEHCLK_Pos) /*!< 0x00000002 */ +#define USB_OTG_PCGCR_GATEHCLK USB_OTG_PCGCR_GATEHCLK_Msk /*!< Gate HCLK */ +#define USB_OTG_PCGCR_PHYSUSP_Pos (4U) +#define USB_OTG_PCGCR_PHYSUSP_Msk (0x1UL << USB_OTG_PCGCR_PHYSUSP_Pos) /*!< 0x00000010 */ +#define USB_OTG_PCGCR_PHYSUSP USB_OTG_PCGCR_PHYSUSP_Msk /*!< PHY suspended */ + +/******************** Bit definition for USB_OTG_GOTGINT register ********************/ +#define USB_OTG_GOTGINT_SEDET_Pos (2U) +#define USB_OTG_GOTGINT_SEDET_Msk (0x1UL << USB_OTG_GOTGINT_SEDET_Pos) /*!< 0x00000004 */ +#define USB_OTG_GOTGINT_SEDET USB_OTG_GOTGINT_SEDET_Msk /*!< Session end detected */ +#define USB_OTG_GOTGINT_SRSSCHG_Pos (8U) +#define USB_OTG_GOTGINT_SRSSCHG_Msk (0x1UL << USB_OTG_GOTGINT_SRSSCHG_Pos) /*!< 0x00000100 */ +#define USB_OTG_GOTGINT_SRSSCHG USB_OTG_GOTGINT_SRSSCHG_Msk /*!< Session request success status change */ +#define USB_OTG_GOTGINT_HNSSCHG_Pos (9U) +#define USB_OTG_GOTGINT_HNSSCHG_Msk (0x1UL << USB_OTG_GOTGINT_HNSSCHG_Pos) /*!< 0x00000200 */ +#define USB_OTG_GOTGINT_HNSSCHG USB_OTG_GOTGINT_HNSSCHG_Msk /*!< Host negotiation success status change */ +#define USB_OTG_GOTGINT_HNGDET_Pos (17U) +#define USB_OTG_GOTGINT_HNGDET_Msk (0x1UL << USB_OTG_GOTGINT_HNGDET_Pos) /*!< 0x00020000 */ +#define USB_OTG_GOTGINT_HNGDET USB_OTG_GOTGINT_HNGDET_Msk /*!< Host negotiation detected */ +#define USB_OTG_GOTGINT_ADTOCHG_Pos (18U) +#define USB_OTG_GOTGINT_ADTOCHG_Msk (0x1UL << USB_OTG_GOTGINT_ADTOCHG_Pos) /*!< 0x00040000 */ +#define USB_OTG_GOTGINT_ADTOCHG USB_OTG_GOTGINT_ADTOCHG_Msk /*!< A-device timeout change */ +#define USB_OTG_GOTGINT_DBCDNE_Pos (19U) +#define USB_OTG_GOTGINT_DBCDNE_Msk (0x1UL << USB_OTG_GOTGINT_DBCDNE_Pos) /*!< 0x00080000 */ +#define USB_OTG_GOTGINT_DBCDNE USB_OTG_GOTGINT_DBCDNE_Msk /*!< Debounce done */ +#define USB_OTG_GOTGINT_IDCHNG_Pos (20U) +#define USB_OTG_GOTGINT_IDCHNG_Msk (0x1UL << USB_OTG_GOTGINT_IDCHNG_Pos) /*!< 0x00100000 */ +#define USB_OTG_GOTGINT_IDCHNG USB_OTG_GOTGINT_IDCHNG_Msk /*!< Change in ID pin input value */ + +/******************** Bit definition for USB_OTG_DCTL register ********************/ +#define USB_OTG_DCTL_RWUSIG_Pos (0U) +#define USB_OTG_DCTL_RWUSIG_Msk (0x1UL << USB_OTG_DCTL_RWUSIG_Pos) /*!< 0x00000001 */ +#define USB_OTG_DCTL_RWUSIG USB_OTG_DCTL_RWUSIG_Msk /*!< Remote wakeup signaling */ +#define USB_OTG_DCTL_SDIS_Pos (1U) +#define USB_OTG_DCTL_SDIS_Msk (0x1UL << USB_OTG_DCTL_SDIS_Pos) /*!< 0x00000002 */ +#define USB_OTG_DCTL_SDIS USB_OTG_DCTL_SDIS_Msk /*!< Soft disconnect */ +#define USB_OTG_DCTL_GINSTS_Pos (2U) +#define USB_OTG_DCTL_GINSTS_Msk (0x1UL << USB_OTG_DCTL_GINSTS_Pos) /*!< 0x00000004 */ +#define USB_OTG_DCTL_GINSTS USB_OTG_DCTL_GINSTS_Msk /*!< Global IN NAK status */ +#define USB_OTG_DCTL_GONSTS_Pos (3U) +#define USB_OTG_DCTL_GONSTS_Msk (0x1UL << USB_OTG_DCTL_GONSTS_Pos) /*!< 0x00000008 */ +#define USB_OTG_DCTL_GONSTS USB_OTG_DCTL_GONSTS_Msk /*!< Global OUT NAK status */ + +#define USB_OTG_DCTL_TCTL_Pos (4U) +#define USB_OTG_DCTL_TCTL_Msk (0x7UL << USB_OTG_DCTL_TCTL_Pos) /*!< 0x00000070 */ +#define USB_OTG_DCTL_TCTL USB_OTG_DCTL_TCTL_Msk /*!< Test control */ +#define USB_OTG_DCTL_TCTL_0 (0x1UL << USB_OTG_DCTL_TCTL_Pos) /*!< 0x00000010 */ +#define USB_OTG_DCTL_TCTL_1 (0x2UL << USB_OTG_DCTL_TCTL_Pos) /*!< 0x00000020 */ +#define USB_OTG_DCTL_TCTL_2 (0x4UL << USB_OTG_DCTL_TCTL_Pos) /*!< 0x00000040 */ +#define USB_OTG_DCTL_SGINAK_Pos (7U) +#define USB_OTG_DCTL_SGINAK_Msk (0x1UL << USB_OTG_DCTL_SGINAK_Pos) /*!< 0x00000080 */ +#define USB_OTG_DCTL_SGINAK USB_OTG_DCTL_SGINAK_Msk /*!< Set global IN NAK */ +#define USB_OTG_DCTL_CGINAK_Pos (8U) +#define USB_OTG_DCTL_CGINAK_Msk (0x1UL << USB_OTG_DCTL_CGINAK_Pos) /*!< 0x00000100 */ +#define USB_OTG_DCTL_CGINAK USB_OTG_DCTL_CGINAK_Msk /*!< Clear global IN NAK */ +#define USB_OTG_DCTL_SGONAK_Pos (9U) +#define USB_OTG_DCTL_SGONAK_Msk (0x1UL << USB_OTG_DCTL_SGONAK_Pos) /*!< 0x00000200 */ +#define USB_OTG_DCTL_SGONAK USB_OTG_DCTL_SGONAK_Msk /*!< Set global OUT NAK */ +#define USB_OTG_DCTL_CGONAK_Pos (10U) +#define USB_OTG_DCTL_CGONAK_Msk (0x1UL << USB_OTG_DCTL_CGONAK_Pos) /*!< 0x00000400 */ +#define USB_OTG_DCTL_CGONAK USB_OTG_DCTL_CGONAK_Msk /*!< Clear global OUT NAK */ +#define USB_OTG_DCTL_POPRGDNE_Pos (11U) +#define USB_OTG_DCTL_POPRGDNE_Msk (0x1UL << USB_OTG_DCTL_POPRGDNE_Pos) /*!< 0x00000800 */ +#define USB_OTG_DCTL_POPRGDNE USB_OTG_DCTL_POPRGDNE_Msk /*!< Power-on programming done */ + +/******************** Bit definition for USB_OTG_HFIR register ********************/ +#define USB_OTG_HFIR_FRIVL_Pos (0U) +#define USB_OTG_HFIR_FRIVL_Msk (0xFFFFUL << USB_OTG_HFIR_FRIVL_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_HFIR_FRIVL USB_OTG_HFIR_FRIVL_Msk /*!< Frame interval */ + +/******************** Bit definition for USB_OTG_HFNUM register ********************/ +#define USB_OTG_HFNUM_FRNUM_Pos (0U) +#define USB_OTG_HFNUM_FRNUM_Msk (0xFFFFUL << USB_OTG_HFNUM_FRNUM_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_HFNUM_FRNUM USB_OTG_HFNUM_FRNUM_Msk /*!< Frame number */ +#define USB_OTG_HFNUM_FTREM_Pos (16U) +#define USB_OTG_HFNUM_FTREM_Msk (0xFFFFUL << USB_OTG_HFNUM_FTREM_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_HFNUM_FTREM USB_OTG_HFNUM_FTREM_Msk /*!< Frame time remaining */ + +/******************** Bit definition for USB_OTG_DSTS register ********************/ +#define USB_OTG_DSTS_SUSPSTS_Pos (0U) +#define USB_OTG_DSTS_SUSPSTS_Msk (0x1UL << USB_OTG_DSTS_SUSPSTS_Pos) /*!< 0x00000001 */ +#define USB_OTG_DSTS_SUSPSTS USB_OTG_DSTS_SUSPSTS_Msk /*!< Suspend status */ + +#define USB_OTG_DSTS_ENUMSPD_Pos (1U) +#define USB_OTG_DSTS_ENUMSPD_Msk (0x3UL << USB_OTG_DSTS_ENUMSPD_Pos) /*!< 0x00000006 */ +#define USB_OTG_DSTS_ENUMSPD USB_OTG_DSTS_ENUMSPD_Msk /*!< Enumerated speed */ +#define USB_OTG_DSTS_ENUMSPD_0 (0x1UL << USB_OTG_DSTS_ENUMSPD_Pos) /*!< 0x00000002 */ +#define USB_OTG_DSTS_ENUMSPD_1 (0x2UL << USB_OTG_DSTS_ENUMSPD_Pos) /*!< 0x00000004 */ +#define USB_OTG_DSTS_EERR_Pos (3U) +#define USB_OTG_DSTS_EERR_Msk (0x1UL << USB_OTG_DSTS_EERR_Pos) /*!< 0x00000008 */ +#define USB_OTG_DSTS_EERR USB_OTG_DSTS_EERR_Msk /*!< Erratic error */ +#define USB_OTG_DSTS_FNSOF_Pos (8U) +#define USB_OTG_DSTS_FNSOF_Msk (0x3FFFUL << USB_OTG_DSTS_FNSOF_Pos) /*!< 0x003FFF00 */ +#define USB_OTG_DSTS_FNSOF USB_OTG_DSTS_FNSOF_Msk /*!< Frame number of the received SOF */ + +/******************** Bit definition for USB_OTG_GAHBCFG register ********************/ +#define USB_OTG_GAHBCFG_GINT_Pos (0U) +#define USB_OTG_GAHBCFG_GINT_Msk (0x1UL << USB_OTG_GAHBCFG_GINT_Pos) /*!< 0x00000001 */ +#define USB_OTG_GAHBCFG_GINT USB_OTG_GAHBCFG_GINT_Msk /*!< Global interrupt mask */ +#define USB_OTG_GAHBCFG_HBSTLEN_Pos (1U) +#define USB_OTG_GAHBCFG_HBSTLEN_Msk (0xFUL << USB_OTG_GAHBCFG_HBSTLEN_Pos) /*!< 0x0000001E */ +#define USB_OTG_GAHBCFG_HBSTLEN USB_OTG_GAHBCFG_HBSTLEN_Msk /*!< Burst length/type */ +#define USB_OTG_GAHBCFG_HBSTLEN_0 (0x0UL << USB_OTG_GAHBCFG_HBSTLEN_Pos) /*!< Single */ +#define USB_OTG_GAHBCFG_HBSTLEN_1 (0x1UL << USB_OTG_GAHBCFG_HBSTLEN_Pos) /*!< INCR */ +#define USB_OTG_GAHBCFG_HBSTLEN_2 (0x3UL << USB_OTG_GAHBCFG_HBSTLEN_Pos) /*!< INCR4 */ +#define USB_OTG_GAHBCFG_HBSTLEN_3 (0x5UL << USB_OTG_GAHBCFG_HBSTLEN_Pos) /*!< INCR8 */ +#define USB_OTG_GAHBCFG_HBSTLEN_4 (0x7UL << USB_OTG_GAHBCFG_HBSTLEN_Pos) /*!< INCR16 */ +#define USB_OTG_GAHBCFG_DMAEN_Pos (5U) +#define USB_OTG_GAHBCFG_DMAEN_Msk (0x1UL << USB_OTG_GAHBCFG_DMAEN_Pos) /*!< 0x00000020 */ +#define USB_OTG_GAHBCFG_DMAEN USB_OTG_GAHBCFG_DMAEN_Msk /*!< DMA enable */ +#define USB_OTG_GAHBCFG_TXFELVL_Pos (7U) +#define USB_OTG_GAHBCFG_TXFELVL_Msk (0x1UL << USB_OTG_GAHBCFG_TXFELVL_Pos) /*!< 0x00000080 */ +#define USB_OTG_GAHBCFG_TXFELVL USB_OTG_GAHBCFG_TXFELVL_Msk /*!< TxFIFO empty level */ +#define USB_OTG_GAHBCFG_PTXFELVL_Pos (8U) +#define USB_OTG_GAHBCFG_PTXFELVL_Msk (0x1UL << USB_OTG_GAHBCFG_PTXFELVL_Pos) /*!< 0x00000100 */ +#define USB_OTG_GAHBCFG_PTXFELVL USB_OTG_GAHBCFG_PTXFELVL_Msk /*!< Periodic TxFIFO empty level */ + +/******************** Bit definition for USB_OTG_GUSBCFG register ********************/ +#define USB_OTG_GUSBCFG_TOCAL_Pos (0U) +#define USB_OTG_GUSBCFG_TOCAL_Msk (0x7UL << USB_OTG_GUSBCFG_TOCAL_Pos) /*!< 0x00000007 */ +#define USB_OTG_GUSBCFG_TOCAL USB_OTG_GUSBCFG_TOCAL_Msk /*!< FS timeout calibration */ +#define USB_OTG_GUSBCFG_TOCAL_0 (0x1UL << USB_OTG_GUSBCFG_TOCAL_Pos) /*!< 0x00000001 */ +#define USB_OTG_GUSBCFG_TOCAL_1 (0x2UL << USB_OTG_GUSBCFG_TOCAL_Pos) /*!< 0x00000002 */ +#define USB_OTG_GUSBCFG_TOCAL_2 (0x4UL << USB_OTG_GUSBCFG_TOCAL_Pos) /*!< 0x00000004 */ +#define USB_OTG_GUSBCFG_PHYIF_Pos (3U) +#define USB_OTG_GUSBCFG_PHYIF_Msk (0x1UL << USB_OTG_GUSBCFG_PHYIF_Pos) /*!< 0x00000008 */ +#define USB_OTG_GUSBCFG_PHYIF USB_OTG_GUSBCFG_PHYIF_Msk /*!< PHY Interface (PHYIf) */ +#define USB_OTG_GUSBCFG_ULPI_UTMI_SEL_Pos (4U) +#define USB_OTG_GUSBCFG_ULPI_UTMI_SEL_Msk (0x1UL << USB_OTG_GUSBCFG_ULPI_UTMI_SEL_Pos) /*!< 0x00000010 */ +#define USB_OTG_GUSBCFG_ULPI_UTMI_SEL USB_OTG_GUSBCFG_ULPI_UTMI_SEL_Msk /*!< ULPI or UTMI+ Select (ULPI_UTMI_Sel) */ +#define USB_OTG_GUSBCFG_PHYSEL_Pos (6U) +#define USB_OTG_GUSBCFG_PHYSEL_Msk (0x1UL << USB_OTG_GUSBCFG_PHYSEL_Pos) /*!< 0x00000040 */ +#define USB_OTG_GUSBCFG_PHYSEL USB_OTG_GUSBCFG_PHYSEL_Msk /*!< USB 2.0 high-speed ULPI PHY or USB 1.1 full-speed serial transceiver select */ +#define USB_OTG_GUSBCFG_SRPCAP_Pos (8U) +#define USB_OTG_GUSBCFG_SRPCAP_Msk (0x1UL << USB_OTG_GUSBCFG_SRPCAP_Pos) /*!< 0x00000100 */ +#define USB_OTG_GUSBCFG_SRPCAP USB_OTG_GUSBCFG_SRPCAP_Msk /*!< SRP-capable */ +#define USB_OTG_GUSBCFG_HNPCAP_Pos (9U) +#define USB_OTG_GUSBCFG_HNPCAP_Msk (0x1UL << USB_OTG_GUSBCFG_HNPCAP_Pos) /*!< 0x00000200 */ +#define USB_OTG_GUSBCFG_HNPCAP USB_OTG_GUSBCFG_HNPCAP_Msk /*!< HNP-capable */ +#define USB_OTG_GUSBCFG_TRDT_Pos (10U) +#define USB_OTG_GUSBCFG_TRDT_Msk (0xFUL << USB_OTG_GUSBCFG_TRDT_Pos) /*!< 0x00003C00 */ +#define USB_OTG_GUSBCFG_TRDT USB_OTG_GUSBCFG_TRDT_Msk /*!< USB turnaround time */ +#define USB_OTG_GUSBCFG_TRDT_0 (0x1UL << USB_OTG_GUSBCFG_TRDT_Pos) /*!< 0x00000400 */ +#define USB_OTG_GUSBCFG_TRDT_1 (0x2UL << USB_OTG_GUSBCFG_TRDT_Pos) /*!< 0x00000800 */ +#define USB_OTG_GUSBCFG_TRDT_2 (0x4UL << USB_OTG_GUSBCFG_TRDT_Pos) /*!< 0x00001000 */ +#define USB_OTG_GUSBCFG_TRDT_3 (0x8UL << USB_OTG_GUSBCFG_TRDT_Pos) /*!< 0x00002000 */ +#define USB_OTG_GUSBCFG_PHYLPCS_Pos (15U) +#define USB_OTG_GUSBCFG_PHYLPCS_Msk (0x1UL << USB_OTG_GUSBCFG_PHYLPCS_Pos) /*!< 0x00008000 */ +#define USB_OTG_GUSBCFG_PHYLPCS USB_OTG_GUSBCFG_PHYLPCS_Msk /*!< PHY Low-power clock select */ +#define USB_OTG_GUSBCFG_ULPIFSLS_Pos (17U) +#define USB_OTG_GUSBCFG_ULPIFSLS_Msk (0x1UL << USB_OTG_GUSBCFG_ULPIFSLS_Pos) /*!< 0x00020000 */ +#define USB_OTG_GUSBCFG_ULPIFSLS USB_OTG_GUSBCFG_ULPIFSLS_Msk /*!< ULPI FS/LS select */ +#define USB_OTG_GUSBCFG_ULPIAR_Pos (18U) +#define USB_OTG_GUSBCFG_ULPIAR_Msk (0x1UL << USB_OTG_GUSBCFG_ULPIAR_Pos) /*!< 0x00040000 */ +#define USB_OTG_GUSBCFG_ULPIAR USB_OTG_GUSBCFG_ULPIAR_Msk /*!< ULPI Auto-resume */ +#define USB_OTG_GUSBCFG_ULPICSM_Pos (19U) +#define USB_OTG_GUSBCFG_ULPICSM_Msk (0x1UL << USB_OTG_GUSBCFG_ULPICSM_Pos) /*!< 0x00080000 */ +#define USB_OTG_GUSBCFG_ULPICSM USB_OTG_GUSBCFG_ULPICSM_Msk /*!< ULPI Clock SuspendM */ +#define USB_OTG_GUSBCFG_ULPIEVBUSD_Pos (20U) +#define USB_OTG_GUSBCFG_ULPIEVBUSD_Msk (0x1UL << USB_OTG_GUSBCFG_ULPIEVBUSD_Pos) /*!< 0x00100000 */ +#define USB_OTG_GUSBCFG_ULPIEVBUSD USB_OTG_GUSBCFG_ULPIEVBUSD_Msk /*!< ULPI External VBUS Drive */ +#define USB_OTG_GUSBCFG_ULPIEVBUSI_Pos (21U) +#define USB_OTG_GUSBCFG_ULPIEVBUSI_Msk (0x1UL << USB_OTG_GUSBCFG_ULPIEVBUSI_Pos) /*!< 0x00200000 */ +#define USB_OTG_GUSBCFG_ULPIEVBUSI USB_OTG_GUSBCFG_ULPIEVBUSI_Msk /*!< ULPI external VBUS indicator */ +#define USB_OTG_GUSBCFG_TSDPS_Pos (22U) +#define USB_OTG_GUSBCFG_TSDPS_Msk (0x1UL << USB_OTG_GUSBCFG_TSDPS_Pos) /*!< 0x00400000 */ +#define USB_OTG_GUSBCFG_TSDPS USB_OTG_GUSBCFG_TSDPS_Msk /*!< TermSel DLine pulsing selection */ +#define USB_OTG_GUSBCFG_PCCI_Pos (23U) +#define USB_OTG_GUSBCFG_PCCI_Msk (0x1UL << USB_OTG_GUSBCFG_PCCI_Pos) /*!< 0x00800000 */ +#define USB_OTG_GUSBCFG_PCCI USB_OTG_GUSBCFG_PCCI_Msk /*!< Indicator complement */ +#define USB_OTG_GUSBCFG_PTCI_Pos (24U) +#define USB_OTG_GUSBCFG_PTCI_Msk (0x1UL << USB_OTG_GUSBCFG_PTCI_Pos) /*!< 0x01000000 */ +#define USB_OTG_GUSBCFG_PTCI USB_OTG_GUSBCFG_PTCI_Msk /*!< Indicator pass through */ +#define USB_OTG_GUSBCFG_ULPIIPD_Pos (25U) +#define USB_OTG_GUSBCFG_ULPIIPD_Msk (0x1UL << USB_OTG_GUSBCFG_ULPIIPD_Pos) /*!< 0x02000000 */ +#define USB_OTG_GUSBCFG_ULPIIPD USB_OTG_GUSBCFG_ULPIIPD_Msk /*!< ULPI interface protect disable */ +#define USB_OTG_GUSBCFG_FHMOD_Pos (29U) +#define USB_OTG_GUSBCFG_FHMOD_Msk (0x1UL << USB_OTG_GUSBCFG_FHMOD_Pos) /*!< 0x20000000 */ +#define USB_OTG_GUSBCFG_FHMOD USB_OTG_GUSBCFG_FHMOD_Msk /*!< Forced host mode */ +#define USB_OTG_GUSBCFG_FDMOD_Pos (30U) +#define USB_OTG_GUSBCFG_FDMOD_Msk (0x1UL << USB_OTG_GUSBCFG_FDMOD_Pos) /*!< 0x40000000 */ +#define USB_OTG_GUSBCFG_FDMOD USB_OTG_GUSBCFG_FDMOD_Msk /*!< Forced peripheral mode */ +#define USB_OTG_GUSBCFG_CTXPKT_Pos (31U) +#define USB_OTG_GUSBCFG_CTXPKT_Msk (0x1UL << USB_OTG_GUSBCFG_CTXPKT_Pos) /*!< 0x80000000 */ +#define USB_OTG_GUSBCFG_CTXPKT USB_OTG_GUSBCFG_CTXPKT_Msk /*!< Corrupt Tx packet */ + +/******************** Bit definition for USB_OTG_GRSTCTL register ********************/ +#define USB_OTG_GRSTCTL_CSRST_Pos (0U) +#define USB_OTG_GRSTCTL_CSRST_Msk (0x1UL << USB_OTG_GRSTCTL_CSRST_Pos) /*!< 0x00000001 */ +#define USB_OTG_GRSTCTL_CSRST USB_OTG_GRSTCTL_CSRST_Msk /*!< Core soft reset */ +#define USB_OTG_GRSTCTL_HSRST_Pos (1U) +#define USB_OTG_GRSTCTL_HSRST_Msk (0x1UL << USB_OTG_GRSTCTL_HSRST_Pos) /*!< 0x00000002 */ +#define USB_OTG_GRSTCTL_HSRST USB_OTG_GRSTCTL_HSRST_Msk /*!< HCLK soft reset */ +#define USB_OTG_GRSTCTL_FCRST_Pos (2U) +#define USB_OTG_GRSTCTL_FCRST_Msk (0x1UL << USB_OTG_GRSTCTL_FCRST_Pos) /*!< 0x00000004 */ +#define USB_OTG_GRSTCTL_FCRST USB_OTG_GRSTCTL_FCRST_Msk /*!< Host frame counter reset */ +#define USB_OTG_GRSTCTL_RXFFLSH_Pos (4U) +#define USB_OTG_GRSTCTL_RXFFLSH_Msk (0x1UL << USB_OTG_GRSTCTL_RXFFLSH_Pos) /*!< 0x00000010 */ +#define USB_OTG_GRSTCTL_RXFFLSH USB_OTG_GRSTCTL_RXFFLSH_Msk /*!< RxFIFO flush */ +#define USB_OTG_GRSTCTL_TXFFLSH_Pos (5U) +#define USB_OTG_GRSTCTL_TXFFLSH_Msk (0x1UL << USB_OTG_GRSTCTL_TXFFLSH_Pos) /*!< 0x00000020 */ +#define USB_OTG_GRSTCTL_TXFFLSH USB_OTG_GRSTCTL_TXFFLSH_Msk /*!< TxFIFO flush */ +#define USB_OTG_GRSTCTL_TXFNUM_Pos (6U) +#define USB_OTG_GRSTCTL_TXFNUM_Msk (0x1FUL << USB_OTG_GRSTCTL_TXFNUM_Pos) /*!< 0x000007C0 */ +#define USB_OTG_GRSTCTL_TXFNUM USB_OTG_GRSTCTL_TXFNUM_Msk /*!< TxFIFO number */ +#define USB_OTG_GRSTCTL_TXFNUM_0 (0x01UL << USB_OTG_GRSTCTL_TXFNUM_Pos) /*!< 0x00000040 */ +#define USB_OTG_GRSTCTL_TXFNUM_1 (0x02UL << USB_OTG_GRSTCTL_TXFNUM_Pos) /*!< 0x00000080 */ +#define USB_OTG_GRSTCTL_TXFNUM_2 (0x04UL << USB_OTG_GRSTCTL_TXFNUM_Pos) /*!< 0x00000100 */ +#define USB_OTG_GRSTCTL_TXFNUM_3 (0x08UL << USB_OTG_GRSTCTL_TXFNUM_Pos) /*!< 0x00000200 */ +#define USB_OTG_GRSTCTL_TXFNUM_4 (0x10UL << USB_OTG_GRSTCTL_TXFNUM_Pos) /*!< 0x00000400 */ +#define USB_OTG_GRSTCTL_DMAREQ_Pos (30U) +#define USB_OTG_GRSTCTL_DMAREQ_Msk (0x1UL << USB_OTG_GRSTCTL_DMAREQ_Pos) /*!< 0x40000000 */ +#define USB_OTG_GRSTCTL_DMAREQ USB_OTG_GRSTCTL_DMAREQ_Msk /*!< DMA request signal */ +#define USB_OTG_GRSTCTL_AHBIDL_Pos (31U) +#define USB_OTG_GRSTCTL_AHBIDL_Msk (0x1UL << USB_OTG_GRSTCTL_AHBIDL_Pos) /*!< 0x80000000 */ +#define USB_OTG_GRSTCTL_AHBIDL USB_OTG_GRSTCTL_AHBIDL_Msk /*!< AHB master idle */ + +/******************** Bit definition for USB_OTG_DIEPMSK register ********************/ +#define USB_OTG_DIEPMSK_XFRCM_Pos (0U) +#define USB_OTG_DIEPMSK_XFRCM_Msk (0x1UL << USB_OTG_DIEPMSK_XFRCM_Pos) /*!< 0x00000001 */ +#define USB_OTG_DIEPMSK_XFRCM USB_OTG_DIEPMSK_XFRCM_Msk /*!< Transfer completed interrupt mask */ +#define USB_OTG_DIEPMSK_EPDM_Pos (1U) +#define USB_OTG_DIEPMSK_EPDM_Msk (0x1UL << USB_OTG_DIEPMSK_EPDM_Pos) /*!< 0x00000002 */ +#define USB_OTG_DIEPMSK_EPDM USB_OTG_DIEPMSK_EPDM_Msk /*!< Endpoint disabled interrupt mask */ +#define USB_OTG_DIEPMSK_TOM_Pos (3U) +#define USB_OTG_DIEPMSK_TOM_Msk (0x1UL << USB_OTG_DIEPMSK_TOM_Pos) /*!< 0x00000008 */ +#define USB_OTG_DIEPMSK_TOM USB_OTG_DIEPMSK_TOM_Msk /*!< Timeout condition mask (nonisochronous endpoints) */ +#define USB_OTG_DIEPMSK_ITTXFEMSK_Pos (4U) +#define USB_OTG_DIEPMSK_ITTXFEMSK_Msk (0x1UL << USB_OTG_DIEPMSK_ITTXFEMSK_Pos) /*!< 0x00000010 */ +#define USB_OTG_DIEPMSK_ITTXFEMSK USB_OTG_DIEPMSK_ITTXFEMSK_Msk /*!< IN token received when TxFIFO empty mask */ +#define USB_OTG_DIEPMSK_INEPNMM_Pos (5U) +#define USB_OTG_DIEPMSK_INEPNMM_Msk (0x1UL << USB_OTG_DIEPMSK_INEPNMM_Pos) /*!< 0x00000020 */ +#define USB_OTG_DIEPMSK_INEPNMM USB_OTG_DIEPMSK_INEPNMM_Msk /*!< IN token received with EP mismatch mask */ +#define USB_OTG_DIEPMSK_INEPNEM_Pos (6U) +#define USB_OTG_DIEPMSK_INEPNEM_Msk (0x1UL << USB_OTG_DIEPMSK_INEPNEM_Pos) /*!< 0x00000040 */ +#define USB_OTG_DIEPMSK_INEPNEM USB_OTG_DIEPMSK_INEPNEM_Msk /*!< IN endpoint NAK effective mask */ +#define USB_OTG_DIEPMSK_TXFURM_Pos (8U) +#define USB_OTG_DIEPMSK_TXFURM_Msk (0x1UL << USB_OTG_DIEPMSK_TXFURM_Pos) /*!< 0x00000100 */ +#define USB_OTG_DIEPMSK_TXFURM USB_OTG_DIEPMSK_TXFURM_Msk /*!< FIFO underrun mask */ +#define USB_OTG_DIEPMSK_BIM_Pos (9U) +#define USB_OTG_DIEPMSK_BIM_Msk (0x1UL << USB_OTG_DIEPMSK_BIM_Pos) /*!< 0x00000200 */ +#define USB_OTG_DIEPMSK_BIM USB_OTG_DIEPMSK_BIM_Msk /*!< BNA interrupt mask */ + +/******************** Bit definition for USB_OTG_HPTXSTS register ********************/ +#define USB_OTG_HPTXSTS_PTXFSAVL_Pos (0U) +#define USB_OTG_HPTXSTS_PTXFSAVL_Msk (0xFFFFUL << USB_OTG_HPTXSTS_PTXFSAVL_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_HPTXSTS_PTXFSAVL USB_OTG_HPTXSTS_PTXFSAVL_Msk /*!< Periodic transmit data FIFO space available */ +#define USB_OTG_HPTXSTS_PTXQSAV_Pos (16U) +#define USB_OTG_HPTXSTS_PTXQSAV_Msk (0xFFUL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00FF0000 */ +#define USB_OTG_HPTXSTS_PTXQSAV USB_OTG_HPTXSTS_PTXQSAV_Msk /*!< Periodic transmit request queue space available */ +#define USB_OTG_HPTXSTS_PTXQSAV_0 (0x01UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00010000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_1 (0x02UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00020000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_2 (0x04UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00040000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_3 (0x08UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00080000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_4 (0x10UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00100000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_5 (0x20UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00200000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_6 (0x40UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00400000 */ +#define USB_OTG_HPTXSTS_PTXQSAV_7 (0x80UL << USB_OTG_HPTXSTS_PTXQSAV_Pos) /*!< 0x00800000 */ + +#define USB_OTG_HPTXSTS_PTXQTOP_Pos (24U) +#define USB_OTG_HPTXSTS_PTXQTOP_Msk (0xFFUL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0xFF000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP USB_OTG_HPTXSTS_PTXQTOP_Msk /*!< Top of the periodic transmit request queue */ +#define USB_OTG_HPTXSTS_PTXQTOP_0 (0x01UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x01000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_1 (0x02UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x02000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_2 (0x04UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x04000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_3 (0x08UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x08000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_4 (0x10UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x10000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_5 (0x20UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x20000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_6 (0x40UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x40000000 */ +#define USB_OTG_HPTXSTS_PTXQTOP_7 (0x80UL << USB_OTG_HPTXSTS_PTXQTOP_Pos) /*!< 0x80000000 */ + +/******************** Bit definition for USB_OTG_HAINT register ********************/ +#define USB_OTG_HAINT_HAINT_Pos (0U) +#define USB_OTG_HAINT_HAINT_Msk (0xFFFFUL << USB_OTG_HAINT_HAINT_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_HAINT_HAINT USB_OTG_HAINT_HAINT_Msk /*!< Channel interrupts */ + +/******************** Bit definition for USB_OTG_DOEPMSK register ********************/ +#define USB_OTG_DOEPMSK_XFRCM_Pos (0U) +#define USB_OTG_DOEPMSK_XFRCM_Msk (0x1UL << USB_OTG_DOEPMSK_XFRCM_Pos) /*!< 0x00000001 */ +#define USB_OTG_DOEPMSK_XFRCM USB_OTG_DOEPMSK_XFRCM_Msk /*!< Transfer completed interrupt mask */ +#define USB_OTG_DOEPMSK_EPDM_Pos (1U) +#define USB_OTG_DOEPMSK_EPDM_Msk (0x1UL << USB_OTG_DOEPMSK_EPDM_Pos) /*!< 0x00000002 */ +#define USB_OTG_DOEPMSK_EPDM USB_OTG_DOEPMSK_EPDM_Msk /*!< Endpoint disabled interrupt mask */ +#define USB_OTG_DOEPMSK_AHBERRM_Pos (2U) +#define USB_OTG_DOEPMSK_AHBERRM_Msk (0x1UL << USB_OTG_DOEPMSK_AHBERRM_Pos) /*!< 0x00000004 */ +#define USB_OTG_DOEPMSK_AHBERRM USB_OTG_DOEPMSK_AHBERRM_Msk /*!< OUT transaction AHB Error interrupt mask */ +#define USB_OTG_DOEPMSK_STUPM_Pos (3U) +#define USB_OTG_DOEPMSK_STUPM_Msk (0x1UL << USB_OTG_DOEPMSK_STUPM_Pos) /*!< 0x00000008 */ +#define USB_OTG_DOEPMSK_STUPM USB_OTG_DOEPMSK_STUPM_Msk /*!< SETUP phase done mask */ +#define USB_OTG_DOEPMSK_OTEPDM_Pos (4U) +#define USB_OTG_DOEPMSK_OTEPDM_Msk (0x1UL << USB_OTG_DOEPMSK_OTEPDM_Pos) /*!< 0x00000010 */ +#define USB_OTG_DOEPMSK_OTEPDM USB_OTG_DOEPMSK_OTEPDM_Msk /*!< OUT token received when endpoint disabled mask */ +#define USB_OTG_DOEPMSK_OTEPSPRM_Pos (5U) +#define USB_OTG_DOEPMSK_OTEPSPRM_Msk (0x1UL << USB_OTG_DOEPMSK_OTEPSPRM_Pos) /*!< 0x00000020 */ +#define USB_OTG_DOEPMSK_OTEPSPRM USB_OTG_DOEPMSK_OTEPSPRM_Msk /*!< Status Phase Received mask */ +#define USB_OTG_DOEPMSK_B2BSTUP_Pos (6U) +#define USB_OTG_DOEPMSK_B2BSTUP_Msk (0x1UL << USB_OTG_DOEPMSK_B2BSTUP_Pos) /*!< 0x00000040 */ +#define USB_OTG_DOEPMSK_B2BSTUP USB_OTG_DOEPMSK_B2BSTUP_Msk /*!< Back-to-back SETUP packets received mask */ +#define USB_OTG_DOEPMSK_OPEM_Pos (8U) +#define USB_OTG_DOEPMSK_OPEM_Msk (0x1UL << USB_OTG_DOEPMSK_OPEM_Pos) /*!< 0x00000100 */ +#define USB_OTG_DOEPMSK_OPEM USB_OTG_DOEPMSK_OPEM_Msk /*!< OUT packet error mask */ +#define USB_OTG_DOEPMSK_BOIM_Pos (9U) +#define USB_OTG_DOEPMSK_BOIM_Msk (0x1UL << USB_OTG_DOEPMSK_BOIM_Pos) /*!< 0x00000200 */ +#define USB_OTG_DOEPMSK_BOIM USB_OTG_DOEPMSK_BOIM_Msk /*!< BNA interrupt mask */ +#define USB_OTG_DOEPMSK_BERRM_Pos (12U) +#define USB_OTG_DOEPMSK_BERRM_Msk (0x1UL << USB_OTG_DOEPMSK_BERRM_Pos) /*!< 0x00001000 */ +#define USB_OTG_DOEPMSK_BERRM USB_OTG_DOEPMSK_BERRM_Msk /*!< Babble error interrupt mask */ +#define USB_OTG_DOEPMSK_NAKM_Pos (13U) +#define USB_OTG_DOEPMSK_NAKM_Msk (0x1UL << USB_OTG_DOEPMSK_NAKM_Pos) /*!< 0x00002000 */ +#define USB_OTG_DOEPMSK_NAKM USB_OTG_DOEPMSK_NAKM_Msk /*!< OUT Packet NAK interrupt mask */ +#define USB_OTG_DOEPMSK_NYETM_Pos (14U) +#define USB_OTG_DOEPMSK_NYETM_Msk (0x1UL << USB_OTG_DOEPMSK_NYETM_Pos) /*!< 0x00004000 */ +#define USB_OTG_DOEPMSK_NYETM USB_OTG_DOEPMSK_NYETM_Msk /*!< NYET interrupt mask */ + +/******************** Bit definition for USB_OTG_GINTSTS register ********************/ +#define USB_OTG_GINTSTS_CMOD_Pos (0U) +#define USB_OTG_GINTSTS_CMOD_Msk (0x1UL << USB_OTG_GINTSTS_CMOD_Pos) /*!< 0x00000001 */ +#define USB_OTG_GINTSTS_CMOD USB_OTG_GINTSTS_CMOD_Msk /*!< Current mode of operation */ +#define USB_OTG_GINTSTS_MMIS_Pos (1U) +#define USB_OTG_GINTSTS_MMIS_Msk (0x1UL << USB_OTG_GINTSTS_MMIS_Pos) /*!< 0x00000002 */ +#define USB_OTG_GINTSTS_MMIS USB_OTG_GINTSTS_MMIS_Msk /*!< Mode mismatch interrupt */ +#define USB_OTG_GINTSTS_OTGINT_Pos (2U) +#define USB_OTG_GINTSTS_OTGINT_Msk (0x1UL << USB_OTG_GINTSTS_OTGINT_Pos) /*!< 0x00000004 */ +#define USB_OTG_GINTSTS_OTGINT USB_OTG_GINTSTS_OTGINT_Msk /*!< OTG interrupt */ +#define USB_OTG_GINTSTS_SOF_Pos (3U) +#define USB_OTG_GINTSTS_SOF_Msk (0x1UL << USB_OTG_GINTSTS_SOF_Pos) /*!< 0x00000008 */ +#define USB_OTG_GINTSTS_SOF USB_OTG_GINTSTS_SOF_Msk /*!< Start of frame */ +#define USB_OTG_GINTSTS_RXFLVL_Pos (4U) +#define USB_OTG_GINTSTS_RXFLVL_Msk (0x1UL << USB_OTG_GINTSTS_RXFLVL_Pos) /*!< 0x00000010 */ +#define USB_OTG_GINTSTS_RXFLVL USB_OTG_GINTSTS_RXFLVL_Msk /*!< RxFIFO nonempty */ +#define USB_OTG_GINTSTS_NPTXFE_Pos (5U) +#define USB_OTG_GINTSTS_NPTXFE_Msk (0x1UL << USB_OTG_GINTSTS_NPTXFE_Pos) /*!< 0x00000020 */ +#define USB_OTG_GINTSTS_NPTXFE USB_OTG_GINTSTS_NPTXFE_Msk /*!< Nonperiodic TxFIFO empty */ +#define USB_OTG_GINTSTS_GINAKEFF_Pos (6U) +#define USB_OTG_GINTSTS_GINAKEFF_Msk (0x1UL << USB_OTG_GINTSTS_GINAKEFF_Pos) /*!< 0x00000040 */ +#define USB_OTG_GINTSTS_GINAKEFF USB_OTG_GINTSTS_GINAKEFF_Msk /*!< Global IN nonperiodic NAK effective */ +#define USB_OTG_GINTSTS_BOUTNAKEFF_Pos (7U) +#define USB_OTG_GINTSTS_BOUTNAKEFF_Msk (0x1UL << USB_OTG_GINTSTS_BOUTNAKEFF_Pos) /*!< 0x00000080 */ +#define USB_OTG_GINTSTS_BOUTNAKEFF USB_OTG_GINTSTS_BOUTNAKEFF_Msk /*!< Global OUT NAK effective */ +#define USB_OTG_GINTSTS_ESUSP_Pos (10U) +#define USB_OTG_GINTSTS_ESUSP_Msk (0x1UL << USB_OTG_GINTSTS_ESUSP_Pos) /*!< 0x00000400 */ +#define USB_OTG_GINTSTS_ESUSP USB_OTG_GINTSTS_ESUSP_Msk /*!< Early suspend */ +#define USB_OTG_GINTSTS_USBSUSP_Pos (11U) +#define USB_OTG_GINTSTS_USBSUSP_Msk (0x1UL << USB_OTG_GINTSTS_USBSUSP_Pos) /*!< 0x00000800 */ +#define USB_OTG_GINTSTS_USBSUSP USB_OTG_GINTSTS_USBSUSP_Msk /*!< USB suspend */ +#define USB_OTG_GINTSTS_USBRST_Pos (12U) +#define USB_OTG_GINTSTS_USBRST_Msk (0x1UL << USB_OTG_GINTSTS_USBRST_Pos) /*!< 0x00001000 */ +#define USB_OTG_GINTSTS_USBRST USB_OTG_GINTSTS_USBRST_Msk /*!< USB reset */ +#define USB_OTG_GINTSTS_ENUMDNE_Pos (13U) +#define USB_OTG_GINTSTS_ENUMDNE_Msk (0x1UL << USB_OTG_GINTSTS_ENUMDNE_Pos) /*!< 0x00002000 */ +#define USB_OTG_GINTSTS_ENUMDNE USB_OTG_GINTSTS_ENUMDNE_Msk /*!< Enumeration done */ +#define USB_OTG_GINTSTS_ISOODRP_Pos (14U) +#define USB_OTG_GINTSTS_ISOODRP_Msk (0x1UL << USB_OTG_GINTSTS_ISOODRP_Pos) /*!< 0x00004000 */ +#define USB_OTG_GINTSTS_ISOODRP USB_OTG_GINTSTS_ISOODRP_Msk /*!< Isochronous OUT packet dropped interrupt */ +#define USB_OTG_GINTSTS_EOPF_Pos (15U) +#define USB_OTG_GINTSTS_EOPF_Msk (0x1UL << USB_OTG_GINTSTS_EOPF_Pos) /*!< 0x00008000 */ +#define USB_OTG_GINTSTS_EOPF USB_OTG_GINTSTS_EOPF_Msk /*!< End of periodic frame interrupt */ +#define USB_OTG_GINTSTS_IEPINT_Pos (18U) +#define USB_OTG_GINTSTS_IEPINT_Msk (0x1UL << USB_OTG_GINTSTS_IEPINT_Pos) /*!< 0x00040000 */ +#define USB_OTG_GINTSTS_IEPINT USB_OTG_GINTSTS_IEPINT_Msk /*!< IN endpoint interrupt */ +#define USB_OTG_GINTSTS_OEPINT_Pos (19U) +#define USB_OTG_GINTSTS_OEPINT_Msk (0x1UL << USB_OTG_GINTSTS_OEPINT_Pos) /*!< 0x00080000 */ +#define USB_OTG_GINTSTS_OEPINT USB_OTG_GINTSTS_OEPINT_Msk /*!< OUT endpoint interrupt */ +#define USB_OTG_GINTSTS_IISOIXFR_Pos (20U) +#define USB_OTG_GINTSTS_IISOIXFR_Msk (0x1UL << USB_OTG_GINTSTS_IISOIXFR_Pos) /*!< 0x00100000 */ +#define USB_OTG_GINTSTS_IISOIXFR USB_OTG_GINTSTS_IISOIXFR_Msk /*!< Incomplete isochronous IN transfer */ +#define USB_OTG_GINTSTS_PXFR_INCOMPISOOUT_Pos (21U) +#define USB_OTG_GINTSTS_PXFR_INCOMPISOOUT_Msk (0x1UL << USB_OTG_GINTSTS_PXFR_INCOMPISOOUT_Pos) /*!< 0x00200000 */ +#define USB_OTG_GINTSTS_PXFR_INCOMPISOOUT USB_OTG_GINTSTS_PXFR_INCOMPISOOUT_Msk /*!< Incomplete periodic transfer */ +#define USB_OTG_GINTSTS_DATAFSUSP_Pos (22U) +#define USB_OTG_GINTSTS_DATAFSUSP_Msk (0x1UL << USB_OTG_GINTSTS_DATAFSUSP_Pos) /*!< 0x00400000 */ +#define USB_OTG_GINTSTS_DATAFSUSP USB_OTG_GINTSTS_DATAFSUSP_Msk /*!< Data fetch suspended */ +#define USB_OTG_GINTSTS_RSTDET_Pos (23U) +#define USB_OTG_GINTSTS_RSTDET_Msk (0x1UL << USB_OTG_GINTSTS_RSTDET_Pos) /*!< 0x00800000 */ +#define USB_OTG_GINTSTS_RSTDET USB_OTG_GINTSTS_RSTDET_Msk /*!< Reset detected interrupt */ +#define USB_OTG_GINTSTS_HPRTINT_Pos (24U) +#define USB_OTG_GINTSTS_HPRTINT_Msk (0x1UL << USB_OTG_GINTSTS_HPRTINT_Pos) /*!< 0x01000000 */ +#define USB_OTG_GINTSTS_HPRTINT USB_OTG_GINTSTS_HPRTINT_Msk /*!< Host port interrupt */ +#define USB_OTG_GINTSTS_HCINT_Pos (25U) +#define USB_OTG_GINTSTS_HCINT_Msk (0x1UL << USB_OTG_GINTSTS_HCINT_Pos) /*!< 0x02000000 */ +#define USB_OTG_GINTSTS_HCINT USB_OTG_GINTSTS_HCINT_Msk /*!< Host channels interrupt */ +#define USB_OTG_GINTSTS_PTXFE_Pos (26U) +#define USB_OTG_GINTSTS_PTXFE_Msk (0x1UL << USB_OTG_GINTSTS_PTXFE_Pos) /*!< 0x04000000 */ +#define USB_OTG_GINTSTS_PTXFE USB_OTG_GINTSTS_PTXFE_Msk /*!< Periodic TxFIFO empty */ +#define USB_OTG_GINTSTS_LPMINT_Pos (27U) +#define USB_OTG_GINTSTS_LPMINT_Msk (0x1UL << USB_OTG_GINTSTS_LPMINT_Pos) /*!< 0x08000000 */ +#define USB_OTG_GINTSTS_LPMINT USB_OTG_GINTSTS_LPMINT_Msk /*!< LPM interrupt */ +#define USB_OTG_GINTSTS_CIDSCHG_Pos (28U) +#define USB_OTG_GINTSTS_CIDSCHG_Msk (0x1UL << USB_OTG_GINTSTS_CIDSCHG_Pos) /*!< 0x10000000 */ +#define USB_OTG_GINTSTS_CIDSCHG USB_OTG_GINTSTS_CIDSCHG_Msk /*!< Connector ID status change */ +#define USB_OTG_GINTSTS_DISCINT_Pos (29U) +#define USB_OTG_GINTSTS_DISCINT_Msk (0x1UL << USB_OTG_GINTSTS_DISCINT_Pos) /*!< 0x20000000 */ +#define USB_OTG_GINTSTS_DISCINT USB_OTG_GINTSTS_DISCINT_Msk /*!< Disconnect detected interrupt */ +#define USB_OTG_GINTSTS_SRQINT_Pos (30U) +#define USB_OTG_GINTSTS_SRQINT_Msk (0x1UL << USB_OTG_GINTSTS_SRQINT_Pos) /*!< 0x40000000 */ +#define USB_OTG_GINTSTS_SRQINT USB_OTG_GINTSTS_SRQINT_Msk /*!< Session request/new session detected interrupt */ +#define USB_OTG_GINTSTS_WKUINT_Pos (31U) +#define USB_OTG_GINTSTS_WKUINT_Msk (0x1UL << USB_OTG_GINTSTS_WKUINT_Pos) /*!< 0x80000000 */ +#define USB_OTG_GINTSTS_WKUINT USB_OTG_GINTSTS_WKUINT_Msk /*!< Resume/remote wakeup detected interrupt */ + +/******************** Bit definition for USB_OTG_GINTMSK register ********************/ +#define USB_OTG_GINTMSK_MMISM_Pos (1U) +#define USB_OTG_GINTMSK_MMISM_Msk (0x1UL << USB_OTG_GINTMSK_MMISM_Pos) /*!< 0x00000002 */ +#define USB_OTG_GINTMSK_MMISM USB_OTG_GINTMSK_MMISM_Msk /*!< Mode mismatch interrupt mask */ +#define USB_OTG_GINTMSK_OTGINT_Pos (2U) +#define USB_OTG_GINTMSK_OTGINT_Msk (0x1UL << USB_OTG_GINTMSK_OTGINT_Pos) /*!< 0x00000004 */ +#define USB_OTG_GINTMSK_OTGINT USB_OTG_GINTMSK_OTGINT_Msk /*!< OTG interrupt mask */ +#define USB_OTG_GINTMSK_SOFM_Pos (3U) +#define USB_OTG_GINTMSK_SOFM_Msk (0x1UL << USB_OTG_GINTMSK_SOFM_Pos) /*!< 0x00000008 */ +#define USB_OTG_GINTMSK_SOFM USB_OTG_GINTMSK_SOFM_Msk /*!< Start of frame mask */ +#define USB_OTG_GINTMSK_RXFLVLM_Pos (4U) +#define USB_OTG_GINTMSK_RXFLVLM_Msk (0x1UL << USB_OTG_GINTMSK_RXFLVLM_Pos) /*!< 0x00000010 */ +#define USB_OTG_GINTMSK_RXFLVLM USB_OTG_GINTMSK_RXFLVLM_Msk /*!< Receive FIFO nonempty mask */ +#define USB_OTG_GINTMSK_NPTXFEM_Pos (5U) +#define USB_OTG_GINTMSK_NPTXFEM_Msk (0x1UL << USB_OTG_GINTMSK_NPTXFEM_Pos) /*!< 0x00000020 */ +#define USB_OTG_GINTMSK_NPTXFEM USB_OTG_GINTMSK_NPTXFEM_Msk /*!< Nonperiodic TxFIFO empty mask */ +#define USB_OTG_GINTMSK_GINAKEFFM_Pos (6U) +#define USB_OTG_GINTMSK_GINAKEFFM_Msk (0x1UL << USB_OTG_GINTMSK_GINAKEFFM_Pos) /*!< 0x00000040 */ +#define USB_OTG_GINTMSK_GINAKEFFM USB_OTG_GINTMSK_GINAKEFFM_Msk /*!< Global nonperiodic IN NAK effective mask */ +#define USB_OTG_GINTMSK_GONAKEFFM_Pos (7U) +#define USB_OTG_GINTMSK_GONAKEFFM_Msk (0x1UL << USB_OTG_GINTMSK_GONAKEFFM_Pos) /*!< 0x00000080 */ +#define USB_OTG_GINTMSK_GONAKEFFM USB_OTG_GINTMSK_GONAKEFFM_Msk /*!< Global OUT NAK effective mask */ +#define USB_OTG_GINTMSK_ESUSPM_Pos (10U) +#define USB_OTG_GINTMSK_ESUSPM_Msk (0x1UL << USB_OTG_GINTMSK_ESUSPM_Pos) /*!< 0x00000400 */ +#define USB_OTG_GINTMSK_ESUSPM USB_OTG_GINTMSK_ESUSPM_Msk /*!< Early suspend mask */ +#define USB_OTG_GINTMSK_USBSUSPM_Pos (11U) +#define USB_OTG_GINTMSK_USBSUSPM_Msk (0x1UL << USB_OTG_GINTMSK_USBSUSPM_Pos) /*!< 0x00000800 */ +#define USB_OTG_GINTMSK_USBSUSPM USB_OTG_GINTMSK_USBSUSPM_Msk /*!< USB suspend mask */ +#define USB_OTG_GINTMSK_USBRST_Pos (12U) +#define USB_OTG_GINTMSK_USBRST_Msk (0x1UL << USB_OTG_GINTMSK_USBRST_Pos) /*!< 0x00001000 */ +#define USB_OTG_GINTMSK_USBRST USB_OTG_GINTMSK_USBRST_Msk /*!< USB reset mask */ +#define USB_OTG_GINTMSK_ENUMDNEM_Pos (13U) +#define USB_OTG_GINTMSK_ENUMDNEM_Msk (0x1UL << USB_OTG_GINTMSK_ENUMDNEM_Pos) /*!< 0x00002000 */ +#define USB_OTG_GINTMSK_ENUMDNEM USB_OTG_GINTMSK_ENUMDNEM_Msk /*!< Enumeration done mask */ +#define USB_OTG_GINTMSK_ISOODRPM_Pos (14U) +#define USB_OTG_GINTMSK_ISOODRPM_Msk (0x1UL << USB_OTG_GINTMSK_ISOODRPM_Pos) /*!< 0x00004000 */ +#define USB_OTG_GINTMSK_ISOODRPM USB_OTG_GINTMSK_ISOODRPM_Msk /*!< Isochronous OUT packet dropped interrupt mask */ +#define USB_OTG_GINTMSK_EOPFM_Pos (15U) +#define USB_OTG_GINTMSK_EOPFM_Msk (0x1UL << USB_OTG_GINTMSK_EOPFM_Pos) /*!< 0x00008000 */ +#define USB_OTG_GINTMSK_EOPFM USB_OTG_GINTMSK_EOPFM_Msk /*!< End of periodic frame interrupt mask */ +#define USB_OTG_GINTMSK_EPMISM_Pos (17U) +#define USB_OTG_GINTMSK_EPMISM_Msk (0x1UL << USB_OTG_GINTMSK_EPMISM_Pos) /*!< 0x00020000 */ +#define USB_OTG_GINTMSK_EPMISM USB_OTG_GINTMSK_EPMISM_Msk /*!< Endpoint mismatch interrupt mask */ +#define USB_OTG_GINTMSK_IEPINT_Pos (18U) +#define USB_OTG_GINTMSK_IEPINT_Msk (0x1UL << USB_OTG_GINTMSK_IEPINT_Pos) /*!< 0x00040000 */ +#define USB_OTG_GINTMSK_IEPINT USB_OTG_GINTMSK_IEPINT_Msk /*!< IN endpoints interrupt mask */ +#define USB_OTG_GINTMSK_OEPINT_Pos (19U) +#define USB_OTG_GINTMSK_OEPINT_Msk (0x1UL << USB_OTG_GINTMSK_OEPINT_Pos) /*!< 0x00080000 */ +#define USB_OTG_GINTMSK_OEPINT USB_OTG_GINTMSK_OEPINT_Msk /*!< OUT endpoints interrupt mask */ +#define USB_OTG_GINTMSK_IISOIXFRM_Pos (20U) +#define USB_OTG_GINTMSK_IISOIXFRM_Msk (0x1UL << USB_OTG_GINTMSK_IISOIXFRM_Pos) /*!< 0x00100000 */ +#define USB_OTG_GINTMSK_IISOIXFRM USB_OTG_GINTMSK_IISOIXFRM_Msk /*!< Incomplete isochronous IN transfer mask */ +#define USB_OTG_GINTMSK_PXFRM_IISOOXFRM_Pos (21U) +#define USB_OTG_GINTMSK_PXFRM_IISOOXFRM_Msk (0x1UL << USB_OTG_GINTMSK_PXFRM_IISOOXFRM_Pos) /*!< 0x00200000 */ +#define USB_OTG_GINTMSK_PXFRM_IISOOXFRM USB_OTG_GINTMSK_PXFRM_IISOOXFRM_Msk /*!< Incomplete periodic transfer mask */ +#define USB_OTG_GINTMSK_FSUSPM_Pos (22U) +#define USB_OTG_GINTMSK_FSUSPM_Msk (0x1UL << USB_OTG_GINTMSK_FSUSPM_Pos) /*!< 0x00400000 */ +#define USB_OTG_GINTMSK_FSUSPM USB_OTG_GINTMSK_FSUSPM_Msk /*!< Data fetch suspended mask */ +#define USB_OTG_GINTMSK_RSTDEM_Pos (23U) +#define USB_OTG_GINTMSK_RSTDEM_Msk (0x1UL << USB_OTG_GINTMSK_RSTDEM_Pos) /*!< 0x00800000 */ +#define USB_OTG_GINTMSK_RSTDEM USB_OTG_GINTMSK_RSTDEM_Msk /*!< Reset detected interrupt mask */ +#define USB_OTG_GINTMSK_PRTIM_Pos (24U) +#define USB_OTG_GINTMSK_PRTIM_Msk (0x1UL << USB_OTG_GINTMSK_PRTIM_Pos) /*!< 0x01000000 */ +#define USB_OTG_GINTMSK_PRTIM USB_OTG_GINTMSK_PRTIM_Msk /*!< Host port interrupt mask */ +#define USB_OTG_GINTMSK_HCIM_Pos (25U) +#define USB_OTG_GINTMSK_HCIM_Msk (0x1UL << USB_OTG_GINTMSK_HCIM_Pos) /*!< 0x02000000 */ +#define USB_OTG_GINTMSK_HCIM USB_OTG_GINTMSK_HCIM_Msk /*!< Host channels interrupt mask */ +#define USB_OTG_GINTMSK_PTXFEM_Pos (26U) +#define USB_OTG_GINTMSK_PTXFEM_Msk (0x1UL << USB_OTG_GINTMSK_PTXFEM_Pos) /*!< 0x04000000 */ +#define USB_OTG_GINTMSK_PTXFEM USB_OTG_GINTMSK_PTXFEM_Msk /*!< Periodic TxFIFO empty mask */ +#define USB_OTG_GINTMSK_LPMINTM_Pos (27U) +#define USB_OTG_GINTMSK_LPMINTM_Msk (0x1UL << USB_OTG_GINTMSK_LPMINTM_Pos) /*!< 0x08000000 */ +#define USB_OTG_GINTMSK_LPMINTM USB_OTG_GINTMSK_LPMINTM_Msk /*!< LPM interrupt Mask */ +#define USB_OTG_GINTMSK_CIDSCHGM_Pos (28U) +#define USB_OTG_GINTMSK_CIDSCHGM_Msk (0x1UL << USB_OTG_GINTMSK_CIDSCHGM_Pos) /*!< 0x10000000 */ +#define USB_OTG_GINTMSK_CIDSCHGM USB_OTG_GINTMSK_CIDSCHGM_Msk /*!< Connector ID status change mask */ +#define USB_OTG_GINTMSK_DISCINT_Pos (29U) +#define USB_OTG_GINTMSK_DISCINT_Msk (0x1UL << USB_OTG_GINTMSK_DISCINT_Pos) /*!< 0x20000000 */ +#define USB_OTG_GINTMSK_DISCINT USB_OTG_GINTMSK_DISCINT_Msk /*!< Disconnect detected interrupt mask */ +#define USB_OTG_GINTMSK_SRQIM_Pos (30U) +#define USB_OTG_GINTMSK_SRQIM_Msk (0x1UL << USB_OTG_GINTMSK_SRQIM_Pos) /*!< 0x40000000 */ +#define USB_OTG_GINTMSK_SRQIM USB_OTG_GINTMSK_SRQIM_Msk /*!< Session request/new session detected interrupt mask */ +#define USB_OTG_GINTMSK_WUIM_Pos (31U) +#define USB_OTG_GINTMSK_WUIM_Msk (0x1UL << USB_OTG_GINTMSK_WUIM_Pos) /*!< 0x80000000 */ +#define USB_OTG_GINTMSK_WUIM USB_OTG_GINTMSK_WUIM_Msk /*!< Resume/remote wakeup detected interrupt mask */ + +/******************** Bit definition for USB_OTG_DAINT register ********************/ +#define USB_OTG_DAINT_IEPINT_Pos (0U) +#define USB_OTG_DAINT_IEPINT_Msk (0xFFFFUL << USB_OTG_DAINT_IEPINT_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_DAINT_IEPINT USB_OTG_DAINT_IEPINT_Msk /*!< IN endpoint interrupt bits */ +#define USB_OTG_DAINT_OEPINT_Pos (16U) +#define USB_OTG_DAINT_OEPINT_Msk (0xFFFFUL << USB_OTG_DAINT_OEPINT_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_DAINT_OEPINT USB_OTG_DAINT_OEPINT_Msk /*!< OUT endpoint interrupt bits */ + +/******************** Bit definition for USB_OTG_HAINTMSK register ********************/ +#define USB_OTG_HAINTMSK_HAINTM_Pos (0U) +#define USB_OTG_HAINTMSK_HAINTM_Msk (0xFFFFUL << USB_OTG_HAINTMSK_HAINTM_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_HAINTMSK_HAINTM USB_OTG_HAINTMSK_HAINTM_Msk /*!< Channel interrupt mask */ + +/******************** Bit definition for USB_OTG_GRXSTSP register ********************/ +#define USB_OTG_GRXSTSP_EPNUM_Pos (0U) +#define USB_OTG_GRXSTSP_EPNUM_Msk (0xFUL << USB_OTG_GRXSTSP_EPNUM_Pos) /*!< 0x0000000F */ +#define USB_OTG_GRXSTSP_EPNUM USB_OTG_GRXSTSP_EPNUM_Msk /*!< IN EP interrupt mask bits */ +#define USB_OTG_GRXSTSP_BCNT_Pos (4U) +#define USB_OTG_GRXSTSP_BCNT_Msk (0x7FFUL << USB_OTG_GRXSTSP_BCNT_Pos) /*!< 0x00007FF0 */ +#define USB_OTG_GRXSTSP_BCNT USB_OTG_GRXSTSP_BCNT_Msk /*!< OUT EP interrupt mask bits */ +#define USB_OTG_GRXSTSP_DPID_Pos (15U) +#define USB_OTG_GRXSTSP_DPID_Msk (0x3UL << USB_OTG_GRXSTSP_DPID_Pos) /*!< 0x00018000 */ +#define USB_OTG_GRXSTSP_DPID USB_OTG_GRXSTSP_DPID_Msk /*!< OUT EP interrupt mask bits */ +#define USB_OTG_GRXSTSP_PKTSTS_Pos (17U) +#define USB_OTG_GRXSTSP_PKTSTS_Msk (0xFUL << USB_OTG_GRXSTSP_PKTSTS_Pos) /*!< 0x001E0000 */ +#define USB_OTG_GRXSTSP_PKTSTS USB_OTG_GRXSTSP_PKTSTS_Msk /*!< OUT EP interrupt mask bits */ + +/******************** Bit definition for USB_OTG_DAINTMSK register ********************/ +#define USB_OTG_DAINTMSK_IEPM_Pos (0U) +#define USB_OTG_DAINTMSK_IEPM_Msk (0xFFFFUL << USB_OTG_DAINTMSK_IEPM_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_DAINTMSK_IEPM USB_OTG_DAINTMSK_IEPM_Msk /*!< IN EP interrupt mask bits */ +#define USB_OTG_DAINTMSK_OEPM_Pos (16U) +#define USB_OTG_DAINTMSK_OEPM_Msk (0xFFFFUL << USB_OTG_DAINTMSK_OEPM_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_DAINTMSK_OEPM USB_OTG_DAINTMSK_OEPM_Msk /*!< OUT EP interrupt mask bits */ + +/******************** Bit definition for OTG register ********************/ + +#define USB_OTG_CHNUM_Pos (0U) +#define USB_OTG_CHNUM_Msk (0xFUL << USB_OTG_CHNUM_Pos) /*!< 0x0000000F */ +#define USB_OTG_CHNUM USB_OTG_CHNUM_Msk /*!< Channel number */ +#define USB_OTG_CHNUM_0 (0x1UL << USB_OTG_CHNUM_Pos) /*!< 0x00000001 */ +#define USB_OTG_CHNUM_1 (0x2UL << USB_OTG_CHNUM_Pos) /*!< 0x00000002 */ +#define USB_OTG_CHNUM_2 (0x4UL << USB_OTG_CHNUM_Pos) /*!< 0x00000004 */ +#define USB_OTG_CHNUM_3 (0x8UL << USB_OTG_CHNUM_Pos) /*!< 0x00000008 */ +#define USB_OTG_BCNT_Pos (4U) +#define USB_OTG_BCNT_Msk (0x7FFUL << USB_OTG_BCNT_Pos) /*!< 0x00007FF0 */ +#define USB_OTG_BCNT USB_OTG_BCNT_Msk /*!< Byte count */ + +#define USB_OTG_DPID_Pos (15U) +#define USB_OTG_DPID_Msk (0x3UL << USB_OTG_DPID_Pos) /*!< 0x00018000 */ +#define USB_OTG_DPID USB_OTG_DPID_Msk /*!< Data PID */ +#define USB_OTG_DPID_0 (0x1UL << USB_OTG_DPID_Pos) /*!< 0x00008000 */ +#define USB_OTG_DPID_1 (0x2UL << USB_OTG_DPID_Pos) /*!< 0x00010000 */ + +#define USB_OTG_PKTSTS_Pos (17U) +#define USB_OTG_PKTSTS_Msk (0xFUL << USB_OTG_PKTSTS_Pos) /*!< 0x001E0000 */ +#define USB_OTG_PKTSTS USB_OTG_PKTSTS_Msk /*!< Packet status */ +#define USB_OTG_PKTSTS_0 (0x1UL << USB_OTG_PKTSTS_Pos) /*!< 0x00020000 */ +#define USB_OTG_PKTSTS_1 (0x2UL << USB_OTG_PKTSTS_Pos) /*!< 0x00040000 */ +#define USB_OTG_PKTSTS_2 (0x4UL << USB_OTG_PKTSTS_Pos) /*!< 0x00080000 */ +#define USB_OTG_PKTSTS_3 (0x8UL << USB_OTG_PKTSTS_Pos) /*!< 0x00100000 */ + +#define USB_OTG_EPNUM_Pos (0U) +#define USB_OTG_EPNUM_Msk (0xFUL << USB_OTG_EPNUM_Pos) /*!< 0x0000000F */ +#define USB_OTG_EPNUM USB_OTG_EPNUM_Msk /*!< Endpoint number */ +#define USB_OTG_EPNUM_0 (0x1UL << USB_OTG_EPNUM_Pos) /*!< 0x00000001 */ +#define USB_OTG_EPNUM_1 (0x2UL << USB_OTG_EPNUM_Pos) /*!< 0x00000002 */ +#define USB_OTG_EPNUM_2 (0x4UL << USB_OTG_EPNUM_Pos) /*!< 0x00000004 */ +#define USB_OTG_EPNUM_3 (0x8UL << USB_OTG_EPNUM_Pos) /*!< 0x00000008 */ + +#define USB_OTG_FRMNUM_Pos (21U) +#define USB_OTG_FRMNUM_Msk (0xFUL << USB_OTG_FRMNUM_Pos) /*!< 0x01E00000 */ +#define USB_OTG_FRMNUM USB_OTG_FRMNUM_Msk /*!< Frame number */ +#define USB_OTG_FRMNUM_0 (0x1UL << USB_OTG_FRMNUM_Pos) /*!< 0x00200000 */ +#define USB_OTG_FRMNUM_1 (0x2UL << USB_OTG_FRMNUM_Pos) /*!< 0x00400000 */ +#define USB_OTG_FRMNUM_2 (0x4UL << USB_OTG_FRMNUM_Pos) /*!< 0x00800000 */ +#define USB_OTG_FRMNUM_3 (0x8UL << USB_OTG_FRMNUM_Pos) /*!< 0x01000000 */ + +/******************** Bit definition for USB_OTG_GRXFSIZ register ********************/ +#define USB_OTG_GRXFSIZ_RXFD_Pos (0U) +#define USB_OTG_GRXFSIZ_RXFD_Msk (0xFFFFUL << USB_OTG_GRXFSIZ_RXFD_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_GRXFSIZ_RXFD USB_OTG_GRXFSIZ_RXFD_Msk /*!< RxFIFO depth */ + +/******************** Bit definition for USB_OTG_DVBUSDIS register ********************/ +#define USB_OTG_DVBUSDIS_VBUSDT_Pos (0U) +#define USB_OTG_DVBUSDIS_VBUSDT_Msk (0xFFFFUL << USB_OTG_DVBUSDIS_VBUSDT_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_DVBUSDIS_VBUSDT USB_OTG_DVBUSDIS_VBUSDT_Msk /*!< Device VBUS discharge time */ + +/******************** Bit definition for OTG register ********************/ +#define USB_OTG_NPTXFSA_Pos (0U) +#define USB_OTG_NPTXFSA_Msk (0xFFFFUL << USB_OTG_NPTXFSA_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_NPTXFSA USB_OTG_NPTXFSA_Msk /*!< Nonperiodic transmit RAM start address */ +#define USB_OTG_NPTXFD_Pos (16U) +#define USB_OTG_NPTXFD_Msk (0xFFFFUL << USB_OTG_NPTXFD_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_NPTXFD USB_OTG_NPTXFD_Msk /*!< Nonperiodic TxFIFO depth */ +#define USB_OTG_TX0FSA_Pos (0U) +#define USB_OTG_TX0FSA_Msk (0xFFFFUL << USB_OTG_TX0FSA_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_TX0FSA USB_OTG_TX0FSA_Msk /*!< Endpoint 0 transmit RAM start address */ +#define USB_OTG_TX0FD_Pos (16U) +#define USB_OTG_TX0FD_Msk (0xFFFFUL << USB_OTG_TX0FD_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_TX0FD USB_OTG_TX0FD_Msk /*!< Endpoint 0 TxFIFO depth */ + +/******************** Bit definition for USB_OTG_DVBUSPULSE register ********************/ +#define USB_OTG_DVBUSPULSE_DVBUSP_Pos (0U) +#define USB_OTG_DVBUSPULSE_DVBUSP_Msk (0xFFFUL << USB_OTG_DVBUSPULSE_DVBUSP_Pos) /*!< 0x00000FFF */ +#define USB_OTG_DVBUSPULSE_DVBUSP USB_OTG_DVBUSPULSE_DVBUSP_Msk /*!< Device VBUS pulsing time */ + +/******************** Bit definition for USB_OTG_GNPTXSTS register ********************/ +#define USB_OTG_GNPTXSTS_NPTXFSAV_Pos (0U) +#define USB_OTG_GNPTXSTS_NPTXFSAV_Msk (0xFFFFUL << USB_OTG_GNPTXSTS_NPTXFSAV_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_GNPTXSTS_NPTXFSAV USB_OTG_GNPTXSTS_NPTXFSAV_Msk /*!< Nonperiodic TxFIFO space available */ + +#define USB_OTG_GNPTXSTS_NPTQXSAV_Pos (16U) +#define USB_OTG_GNPTXSTS_NPTQXSAV_Msk (0xFFUL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00FF0000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV USB_OTG_GNPTXSTS_NPTQXSAV_Msk /*!< Nonperiodic transmit request queue space available */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_0 (0x01UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00010000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_1 (0x02UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00020000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_2 (0x04UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00040000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_3 (0x08UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00080000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_4 (0x10UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00100000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_5 (0x20UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00200000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_6 (0x40UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00400000 */ +#define USB_OTG_GNPTXSTS_NPTQXSAV_7 (0x80UL << USB_OTG_GNPTXSTS_NPTQXSAV_Pos) /*!< 0x00800000 */ + +#define USB_OTG_GNPTXSTS_NPTXQTOP_Pos (24U) +#define USB_OTG_GNPTXSTS_NPTXQTOP_Msk (0x7FUL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x7F000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP USB_OTG_GNPTXSTS_NPTXQTOP_Msk /*!< Top of the nonperiodic transmit request queue */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_0 (0x01UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x01000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_1 (0x02UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x02000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_2 (0x04UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x04000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_3 (0x08UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x08000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_4 (0x10UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x10000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_5 (0x20UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x20000000 */ +#define USB_OTG_GNPTXSTS_NPTXQTOP_6 (0x40UL << USB_OTG_GNPTXSTS_NPTXQTOP_Pos) /*!< 0x40000000 */ + +/******************** Bit definition for USB_OTG_DTHRCTL register ********************/ +#define USB_OTG_DTHRCTL_NONISOTHREN_Pos (0U) +#define USB_OTG_DTHRCTL_NONISOTHREN_Msk (0x1UL << USB_OTG_DTHRCTL_NONISOTHREN_Pos) /*!< 0x00000001 */ +#define USB_OTG_DTHRCTL_NONISOTHREN USB_OTG_DTHRCTL_NONISOTHREN_Msk /*!< Nonisochronous IN endpoints threshold enable */ +#define USB_OTG_DTHRCTL_ISOTHREN_Pos (1U) +#define USB_OTG_DTHRCTL_ISOTHREN_Msk (0x1UL << USB_OTG_DTHRCTL_ISOTHREN_Pos) /*!< 0x00000002 */ +#define USB_OTG_DTHRCTL_ISOTHREN USB_OTG_DTHRCTL_ISOTHREN_Msk /*!< ISO IN endpoint threshold enable */ + +#define USB_OTG_DTHRCTL_TXTHRLEN_Pos (2U) +#define USB_OTG_DTHRCTL_TXTHRLEN_Msk (0x1FFUL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x000007FC */ +#define USB_OTG_DTHRCTL_TXTHRLEN USB_OTG_DTHRCTL_TXTHRLEN_Msk /*!< Transmit threshold length */ +#define USB_OTG_DTHRCTL_TXTHRLEN_0 (0x001UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000004 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_1 (0x002UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000008 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_2 (0x004UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000010 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_3 (0x008UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000020 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_4 (0x010UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000040 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_5 (0x020UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000080 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_6 (0x040UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000100 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_7 (0x080UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000200 */ +#define USB_OTG_DTHRCTL_TXTHRLEN_8 (0x100UL << USB_OTG_DTHRCTL_TXTHRLEN_Pos) /*!< 0x00000400 */ +#define USB_OTG_DTHRCTL_RXTHREN_Pos (16U) +#define USB_OTG_DTHRCTL_RXTHREN_Msk (0x1UL << USB_OTG_DTHRCTL_RXTHREN_Pos) /*!< 0x00010000 */ +#define USB_OTG_DTHRCTL_RXTHREN USB_OTG_DTHRCTL_RXTHREN_Msk /*!< Receive threshold enable */ + +#define USB_OTG_DTHRCTL_RXTHRLEN_Pos (17U) +#define USB_OTG_DTHRCTL_RXTHRLEN_Msk (0x1FFUL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x03FE0000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN USB_OTG_DTHRCTL_RXTHRLEN_Msk /*!< Receive threshold length */ +#define USB_OTG_DTHRCTL_RXTHRLEN_0 (0x001UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00020000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_1 (0x002UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00040000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_2 (0x004UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00080000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_3 (0x008UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00100000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_4 (0x010UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00200000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_5 (0x020UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00400000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_6 (0x040UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x00800000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_7 (0x080UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x01000000 */ +#define USB_OTG_DTHRCTL_RXTHRLEN_8 (0x100UL << USB_OTG_DTHRCTL_RXTHRLEN_Pos) /*!< 0x02000000 */ +#define USB_OTG_DTHRCTL_ARPEN_Pos (27U) +#define USB_OTG_DTHRCTL_ARPEN_Msk (0x1UL << USB_OTG_DTHRCTL_ARPEN_Pos) /*!< 0x08000000 */ +#define USB_OTG_DTHRCTL_ARPEN USB_OTG_DTHRCTL_ARPEN_Msk /*!< Arbiter parking enable */ + +/******************** Bit definition for USB_OTG_DIEPEMPMSK register ********************/ +#define USB_OTG_DIEPEMPMSK_INEPTXFEM_Pos (0U) +#define USB_OTG_DIEPEMPMSK_INEPTXFEM_Msk (0xFFFFUL << USB_OTG_DIEPEMPMSK_INEPTXFEM_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_DIEPEMPMSK_INEPTXFEM USB_OTG_DIEPEMPMSK_INEPTXFEM_Msk /*!< IN EP Tx FIFO empty interrupt mask bits */ + +/******************** Bit definition for USB_OTG_DEACHINT register ********************/ +#define USB_OTG_DEACHINT_IEP1INT_Pos (1U) +#define USB_OTG_DEACHINT_IEP1INT_Msk (0x1UL << USB_OTG_DEACHINT_IEP1INT_Pos) /*!< 0x00000002 */ +#define USB_OTG_DEACHINT_IEP1INT USB_OTG_DEACHINT_IEP1INT_Msk /*!< IN endpoint 1interrupt bit */ +#define USB_OTG_DEACHINT_OEP1INT_Pos (17U) +#define USB_OTG_DEACHINT_OEP1INT_Msk (0x1UL << USB_OTG_DEACHINT_OEP1INT_Pos) /*!< 0x00020000 */ +#define USB_OTG_DEACHINT_OEP1INT USB_OTG_DEACHINT_OEP1INT_Msk /*!< OUT endpoint 1 interrupt bit */ + +/******************** Bit definition for USB_OTG_GCCFG register ********************/ +#define USB_OTG_GCCFG_DCDET_Pos (0U) +#define USB_OTG_GCCFG_DCDET_Msk (0x1UL << USB_OTG_GCCFG_DCDET_Pos) /*!< 0x00000001 */ +#define USB_OTG_GCCFG_DCDET USB_OTG_GCCFG_DCDET_Msk /*!< Data contact detection (DCD) status */ +#define USB_OTG_GCCFG_PDET_Pos (1U) +#define USB_OTG_GCCFG_PDET_Msk (0x1UL << USB_OTG_GCCFG_PDET_Pos) /*!< 0x00000002 */ +#define USB_OTG_GCCFG_PDET USB_OTG_GCCFG_PDET_Msk /*!< Primary detection (PD) status */ +#define USB_OTG_GCCFG_SDET_Pos (2U) +#define USB_OTG_GCCFG_SDET_Msk (0x1UL << USB_OTG_GCCFG_SDET_Pos) /*!< 0x00000004 */ +#define USB_OTG_GCCFG_SDET USB_OTG_GCCFG_SDET_Msk /*!< Secondary detection (SD) status */ +#define USB_OTG_GCCFG_PS2DET_Pos (3U) +#define USB_OTG_GCCFG_PS2DET_Msk (0x1UL << USB_OTG_GCCFG_PS2DET_Pos) /*!< 0x00000008 */ +#define USB_OTG_GCCFG_PS2DET USB_OTG_GCCFG_PS2DET_Msk /*!< DM pull-up detection status */ +#define USB_OTG_GCCFG_PWRDWN_Pos (16U) +#define USB_OTG_GCCFG_PWRDWN_Msk (0x1UL << USB_OTG_GCCFG_PWRDWN_Pos) /*!< 0x00010000 */ +#define USB_OTG_GCCFG_PWRDWN USB_OTG_GCCFG_PWRDWN_Msk /*!< Power down */ +#define USB_OTG_GCCFG_BCDEN_Pos (17U) +#define USB_OTG_GCCFG_BCDEN_Msk (0x1UL << USB_OTG_GCCFG_BCDEN_Pos) /*!< 0x00020000 */ +#define USB_OTG_GCCFG_BCDEN USB_OTG_GCCFG_BCDEN_Msk /*!< Battery charging detector (BCD) enable */ +#define USB_OTG_GCCFG_DCDEN_Pos (18U) +#define USB_OTG_GCCFG_DCDEN_Msk (0x1UL << USB_OTG_GCCFG_DCDEN_Pos) /*!< 0x00040000 */ +#define USB_OTG_GCCFG_DCDEN USB_OTG_GCCFG_DCDEN_Msk /*!< Data contact detection (DCD) mode enable*/ +#define USB_OTG_GCCFG_PDEN_Pos (19U) +#define USB_OTG_GCCFG_PDEN_Msk (0x1UL << USB_OTG_GCCFG_PDEN_Pos) /*!< 0x00080000 */ +#define USB_OTG_GCCFG_PDEN USB_OTG_GCCFG_PDEN_Msk /*!< Primary detection (PD) mode enable*/ +#define USB_OTG_GCCFG_SDEN_Pos (20U) +#define USB_OTG_GCCFG_SDEN_Msk (0x1UL << USB_OTG_GCCFG_SDEN_Pos) /*!< 0x00100000 */ +#define USB_OTG_GCCFG_SDEN USB_OTG_GCCFG_SDEN_Msk /*!< Secondary detection (SD) mode enable */ +#define USB_OTG_GCCFG_VBDEN_Pos (21U) +#define USB_OTG_GCCFG_VBDEN_Msk (0x1UL << USB_OTG_GCCFG_VBDEN_Pos) /*!< 0x00200000 */ +#define USB_OTG_GCCFG_VBDEN USB_OTG_GCCFG_VBDEN_Msk /*!< VBUS mode enable */ +#define USB_OTG_GCCFG_OTGIDEN_Pos (22U) +#define USB_OTG_GCCFG_OTGIDEN_Msk (0x1UL << USB_OTG_GCCFG_OTGIDEN_Pos) /*!< 0x00400000 */ +#define USB_OTG_GCCFG_OTGIDEN USB_OTG_GCCFG_OTGIDEN_Msk /*!< OTG Id enable */ +#define USB_OTG_GCCFG_PHYHSEN_Pos (23U) +#define USB_OTG_GCCFG_PHYHSEN_Msk (0x1UL << USB_OTG_GCCFG_PHYHSEN_Pos) /*!< 0x00800000 */ +#define USB_OTG_GCCFG_PHYHSEN USB_OTG_GCCFG_PHYHSEN_Msk /*!< HS PHY enable */ + +/******************** Bit definition for USB_OTG_DEACHINTMSK register ********************/ +#define USB_OTG_DEACHINTMSK_IEP1INTM_Pos (1U) +#define USB_OTG_DEACHINTMSK_IEP1INTM_Msk (0x1UL << USB_OTG_DEACHINTMSK_IEP1INTM_Pos) /*!< 0x00000002 */ +#define USB_OTG_DEACHINTMSK_IEP1INTM USB_OTG_DEACHINTMSK_IEP1INTM_Msk /*!< IN Endpoint 1 interrupt mask bit */ +#define USB_OTG_DEACHINTMSK_OEP1INTM_Pos (17U) +#define USB_OTG_DEACHINTMSK_OEP1INTM_Msk (0x1UL << USB_OTG_DEACHINTMSK_OEP1INTM_Pos) /*!< 0x00020000 */ +#define USB_OTG_DEACHINTMSK_OEP1INTM USB_OTG_DEACHINTMSK_OEP1INTM_Msk /*!< OUT Endpoint 1 interrupt mask bit */ + +/******************** Bit definition for USB_OTG_CID register ********************/ +#define USB_OTG_CID_PRODUCT_ID_Pos (0U) +#define USB_OTG_CID_PRODUCT_ID_Msk (0xFFFFFFFFUL << USB_OTG_CID_PRODUCT_ID_Pos) /*!< 0xFFFFFFFF */ +#define USB_OTG_CID_PRODUCT_ID USB_OTG_CID_PRODUCT_ID_Msk /*!< Product ID field */ + +/******************** Bit definition for USB_OTG_GLPMCFG register ********************/ +#define USB_OTG_GLPMCFG_LPMEN_Pos (0U) +#define USB_OTG_GLPMCFG_LPMEN_Msk (0x1UL << USB_OTG_GLPMCFG_LPMEN_Pos) /*!< 0x00000001 */ +#define USB_OTG_GLPMCFG_LPMEN USB_OTG_GLPMCFG_LPMEN_Msk /*!< LPM support enable */ +#define USB_OTG_GLPMCFG_LPMACK_Pos (1U) +#define USB_OTG_GLPMCFG_LPMACK_Msk (0x1UL << USB_OTG_GLPMCFG_LPMACK_Pos) /*!< 0x00000002 */ +#define USB_OTG_GLPMCFG_LPMACK USB_OTG_GLPMCFG_LPMACK_Msk /*!< LPM Token acknowledge enable */ +#define USB_OTG_GLPMCFG_BESL_Pos (2U) +#define USB_OTG_GLPMCFG_BESL_Msk (0xFUL << USB_OTG_GLPMCFG_BESL_Pos) /*!< 0x0000003C */ +#define USB_OTG_GLPMCFG_BESL USB_OTG_GLPMCFG_BESL_Msk /*!< BESL value received with last ACKed LPM Token */ +#define USB_OTG_GLPMCFG_REMWAKE_Pos (6U) +#define USB_OTG_GLPMCFG_REMWAKE_Msk (0x1UL << USB_OTG_GLPMCFG_REMWAKE_Pos) /*!< 0x00000040 */ +#define USB_OTG_GLPMCFG_REMWAKE USB_OTG_GLPMCFG_REMWAKE_Msk /*!< bRemoteWake value received with last ACKed LPM Token */ +#define USB_OTG_GLPMCFG_L1SSEN_Pos (7U) +#define USB_OTG_GLPMCFG_L1SSEN_Msk (0x1UL << USB_OTG_GLPMCFG_L1SSEN_Pos) /*!< 0x00000080 */ +#define USB_OTG_GLPMCFG_L1SSEN USB_OTG_GLPMCFG_L1SSEN_Msk /*!< L1 shallow sleep enable */ +#define USB_OTG_GLPMCFG_BESLTHRS_Pos (8U) +#define USB_OTG_GLPMCFG_BESLTHRS_Msk (0xFUL << USB_OTG_GLPMCFG_BESLTHRS_Pos) /*!< 0x00000F00 */ +#define USB_OTG_GLPMCFG_BESLTHRS USB_OTG_GLPMCFG_BESLTHRS_Msk /*!< BESL threshold */ +#define USB_OTG_GLPMCFG_L1DSEN_Pos (12U) +#define USB_OTG_GLPMCFG_L1DSEN_Msk (0x1UL << USB_OTG_GLPMCFG_L1DSEN_Pos) /*!< 0x00001000 */ +#define USB_OTG_GLPMCFG_L1DSEN USB_OTG_GLPMCFG_L1DSEN_Msk /*!< L1 deep sleep enable */ +#define USB_OTG_GLPMCFG_LPMRSP_Pos (13U) +#define USB_OTG_GLPMCFG_LPMRSP_Msk (0x3UL << USB_OTG_GLPMCFG_LPMRSP_Pos) /*!< 0x00006000 */ +#define USB_OTG_GLPMCFG_LPMRSP USB_OTG_GLPMCFG_LPMRSP_Msk /*!< LPM response */ +#define USB_OTG_GLPMCFG_SLPSTS_Pos (15U) +#define USB_OTG_GLPMCFG_SLPSTS_Msk (0x1UL << USB_OTG_GLPMCFG_SLPSTS_Pos) /*!< 0x00008000 */ +#define USB_OTG_GLPMCFG_SLPSTS USB_OTG_GLPMCFG_SLPSTS_Msk /*!< Port sleep status */ +#define USB_OTG_GLPMCFG_L1RSMOK_Pos (16U) +#define USB_OTG_GLPMCFG_L1RSMOK_Msk (0x1UL << USB_OTG_GLPMCFG_L1RSMOK_Pos) /*!< 0x00010000 */ +#define USB_OTG_GLPMCFG_L1RSMOK USB_OTG_GLPMCFG_L1RSMOK_Msk /*!< Sleep State Resume OK */ +#define USB_OTG_GLPMCFG_LPMCHIDX_Pos (17U) +#define USB_OTG_GLPMCFG_LPMCHIDX_Msk (0xFUL << USB_OTG_GLPMCFG_LPMCHIDX_Pos) /*!< 0x001E0000 */ +#define USB_OTG_GLPMCFG_LPMCHIDX USB_OTG_GLPMCFG_LPMCHIDX_Msk /*!< LPM Channel Index */ +#define USB_OTG_GLPMCFG_LPMRCNT_Pos (21U) +#define USB_OTG_GLPMCFG_LPMRCNT_Msk (0x7UL << USB_OTG_GLPMCFG_LPMRCNT_Pos) /*!< 0x00E00000 */ +#define USB_OTG_GLPMCFG_LPMRCNT USB_OTG_GLPMCFG_LPMRCNT_Msk /*!< LPM retry count */ +#define USB_OTG_GLPMCFG_SNDLPM_Pos (24U) +#define USB_OTG_GLPMCFG_SNDLPM_Msk (0x1UL << USB_OTG_GLPMCFG_SNDLPM_Pos) /*!< 0x01000000 */ +#define USB_OTG_GLPMCFG_SNDLPM USB_OTG_GLPMCFG_SNDLPM_Msk /*!< Send LPM transaction */ +#define USB_OTG_GLPMCFG_LPMRCNTSTS_Pos (25U) +#define USB_OTG_GLPMCFG_LPMRCNTSTS_Msk (0x7UL << USB_OTG_GLPMCFG_LPMRCNTSTS_Pos) /*!< 0x0E000000 */ +#define USB_OTG_GLPMCFG_LPMRCNTSTS USB_OTG_GLPMCFG_LPMRCNTSTS_Msk /*!< LPM retry count status */ +#define USB_OTG_GLPMCFG_ENBESL_Pos (28U) +#define USB_OTG_GLPMCFG_ENBESL_Msk (0x1UL << USB_OTG_GLPMCFG_ENBESL_Pos) /*!< 0x10000000 */ +#define USB_OTG_GLPMCFG_ENBESL USB_OTG_GLPMCFG_ENBESL_Msk /*!< Enable best effort service latency */ + +/******************** Bit definition for USB_OTG_DIEPEACHMSK1 register ********************/ +#define USB_OTG_DIEPEACHMSK1_XFRCM_Pos (0U) +#define USB_OTG_DIEPEACHMSK1_XFRCM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_XFRCM_Pos) /*!< 0x00000001 */ +#define USB_OTG_DIEPEACHMSK1_XFRCM USB_OTG_DIEPEACHMSK1_XFRCM_Msk /*!< Transfer completed interrupt mask */ +#define USB_OTG_DIEPEACHMSK1_EPDM_Pos (1U) +#define USB_OTG_DIEPEACHMSK1_EPDM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_EPDM_Pos) /*!< 0x00000002 */ +#define USB_OTG_DIEPEACHMSK1_EPDM USB_OTG_DIEPEACHMSK1_EPDM_Msk /*!< Endpoint disabled interrupt mask */ +#define USB_OTG_DIEPEACHMSK1_TOM_Pos (3U) +#define USB_OTG_DIEPEACHMSK1_TOM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_TOM_Pos) /*!< 0x00000008 */ +#define USB_OTG_DIEPEACHMSK1_TOM USB_OTG_DIEPEACHMSK1_TOM_Msk /*!< Timeout condition mask (nonisochronous endpoints) */ +#define USB_OTG_DIEPEACHMSK1_ITTXFEMSK_Pos (4U) +#define USB_OTG_DIEPEACHMSK1_ITTXFEMSK_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_ITTXFEMSK_Pos) /*!< 0x00000010 */ +#define USB_OTG_DIEPEACHMSK1_ITTXFEMSK USB_OTG_DIEPEACHMSK1_ITTXFEMSK_Msk /*!< IN token received when TxFIFO empty mask */ +#define USB_OTG_DIEPEACHMSK1_INEPNMM_Pos (5U) +#define USB_OTG_DIEPEACHMSK1_INEPNMM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_INEPNMM_Pos) /*!< 0x00000020 */ +#define USB_OTG_DIEPEACHMSK1_INEPNMM USB_OTG_DIEPEACHMSK1_INEPNMM_Msk /*!< IN token received with EP mismatch mask */ +#define USB_OTG_DIEPEACHMSK1_INEPNEM_Pos (6U) +#define USB_OTG_DIEPEACHMSK1_INEPNEM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_INEPNEM_Pos) /*!< 0x00000040 */ +#define USB_OTG_DIEPEACHMSK1_INEPNEM USB_OTG_DIEPEACHMSK1_INEPNEM_Msk /*!< IN endpoint NAK effective mask */ +#define USB_OTG_DIEPEACHMSK1_TXFURM_Pos (8U) +#define USB_OTG_DIEPEACHMSK1_TXFURM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_TXFURM_Pos) /*!< 0x00000100 */ +#define USB_OTG_DIEPEACHMSK1_TXFURM USB_OTG_DIEPEACHMSK1_TXFURM_Msk /*!< FIFO underrun mask */ +#define USB_OTG_DIEPEACHMSK1_BIM_Pos (9U) +#define USB_OTG_DIEPEACHMSK1_BIM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_BIM_Pos) /*!< 0x00000200 */ +#define USB_OTG_DIEPEACHMSK1_BIM USB_OTG_DIEPEACHMSK1_BIM_Msk /*!< BNA interrupt mask */ +#define USB_OTG_DIEPEACHMSK1_NAKM_Pos (13U) +#define USB_OTG_DIEPEACHMSK1_NAKM_Msk (0x1UL << USB_OTG_DIEPEACHMSK1_NAKM_Pos) /*!< 0x00002000 */ +#define USB_OTG_DIEPEACHMSK1_NAKM USB_OTG_DIEPEACHMSK1_NAKM_Msk /*!< NAK interrupt mask */ + +/******************** Bit definition for USB_OTG_HPRT register ********************/ +#define USB_OTG_HPRT_PCSTS_Pos (0U) +#define USB_OTG_HPRT_PCSTS_Msk (0x1UL << USB_OTG_HPRT_PCSTS_Pos) /*!< 0x00000001 */ +#define USB_OTG_HPRT_PCSTS USB_OTG_HPRT_PCSTS_Msk /*!< Port connect status */ +#define USB_OTG_HPRT_PCDET_Pos (1U) +#define USB_OTG_HPRT_PCDET_Msk (0x1UL << USB_OTG_HPRT_PCDET_Pos) /*!< 0x00000002 */ +#define USB_OTG_HPRT_PCDET USB_OTG_HPRT_PCDET_Msk /*!< Port connect detected */ +#define USB_OTG_HPRT_PENA_Pos (2U) +#define USB_OTG_HPRT_PENA_Msk (0x1UL << USB_OTG_HPRT_PENA_Pos) /*!< 0x00000004 */ +#define USB_OTG_HPRT_PENA USB_OTG_HPRT_PENA_Msk /*!< Port enable */ +#define USB_OTG_HPRT_PENCHNG_Pos (3U) +#define USB_OTG_HPRT_PENCHNG_Msk (0x1UL << USB_OTG_HPRT_PENCHNG_Pos) /*!< 0x00000008 */ +#define USB_OTG_HPRT_PENCHNG USB_OTG_HPRT_PENCHNG_Msk /*!< Port enable/disable change */ +#define USB_OTG_HPRT_POCA_Pos (4U) +#define USB_OTG_HPRT_POCA_Msk (0x1UL << USB_OTG_HPRT_POCA_Pos) /*!< 0x00000010 */ +#define USB_OTG_HPRT_POCA USB_OTG_HPRT_POCA_Msk /*!< Port overcurrent active */ +#define USB_OTG_HPRT_POCCHNG_Pos (5U) +#define USB_OTG_HPRT_POCCHNG_Msk (0x1UL << USB_OTG_HPRT_POCCHNG_Pos) /*!< 0x00000020 */ +#define USB_OTG_HPRT_POCCHNG USB_OTG_HPRT_POCCHNG_Msk /*!< Port overcurrent change */ +#define USB_OTG_HPRT_PRES_Pos (6U) +#define USB_OTG_HPRT_PRES_Msk (0x1UL << USB_OTG_HPRT_PRES_Pos) /*!< 0x00000040 */ +#define USB_OTG_HPRT_PRES USB_OTG_HPRT_PRES_Msk /*!< Port resume */ +#define USB_OTG_HPRT_PSUSP_Pos (7U) +#define USB_OTG_HPRT_PSUSP_Msk (0x1UL << USB_OTG_HPRT_PSUSP_Pos) /*!< 0x00000080 */ +#define USB_OTG_HPRT_PSUSP USB_OTG_HPRT_PSUSP_Msk /*!< Port suspend */ +#define USB_OTG_HPRT_PRST_Pos (8U) +#define USB_OTG_HPRT_PRST_Msk (0x1UL << USB_OTG_HPRT_PRST_Pos) /*!< 0x00000100 */ +#define USB_OTG_HPRT_PRST USB_OTG_HPRT_PRST_Msk /*!< Port reset */ + +#define USB_OTG_HPRT_PLSTS_Pos (10U) +#define USB_OTG_HPRT_PLSTS_Msk (0x3UL << USB_OTG_HPRT_PLSTS_Pos) /*!< 0x00000C00 */ +#define USB_OTG_HPRT_PLSTS USB_OTG_HPRT_PLSTS_Msk /*!< Port line status */ +#define USB_OTG_HPRT_PLSTS_0 (0x1UL << USB_OTG_HPRT_PLSTS_Pos) /*!< 0x00000400 */ +#define USB_OTG_HPRT_PLSTS_1 (0x2UL << USB_OTG_HPRT_PLSTS_Pos) /*!< 0x00000800 */ +#define USB_OTG_HPRT_PPWR_Pos (12U) +#define USB_OTG_HPRT_PPWR_Msk (0x1UL << USB_OTG_HPRT_PPWR_Pos) /*!< 0x00001000 */ +#define USB_OTG_HPRT_PPWR USB_OTG_HPRT_PPWR_Msk /*!< Port power */ + +#define USB_OTG_HPRT_PTCTL_Pos (13U) +#define USB_OTG_HPRT_PTCTL_Msk (0xFUL << USB_OTG_HPRT_PTCTL_Pos) /*!< 0x0001E000 */ +#define USB_OTG_HPRT_PTCTL USB_OTG_HPRT_PTCTL_Msk /*!< Port test control */ +#define USB_OTG_HPRT_PTCTL_0 (0x1UL << USB_OTG_HPRT_PTCTL_Pos) /*!< 0x00002000 */ +#define USB_OTG_HPRT_PTCTL_1 (0x2UL << USB_OTG_HPRT_PTCTL_Pos) /*!< 0x00004000 */ +#define USB_OTG_HPRT_PTCTL_2 (0x4UL << USB_OTG_HPRT_PTCTL_Pos) /*!< 0x00008000 */ +#define USB_OTG_HPRT_PTCTL_3 (0x8UL << USB_OTG_HPRT_PTCTL_Pos) /*!< 0x00010000 */ + +#define USB_OTG_HPRT_PSPD_Pos (17U) +#define USB_OTG_HPRT_PSPD_Msk (0x3UL << USB_OTG_HPRT_PSPD_Pos) /*!< 0x00060000 */ +#define USB_OTG_HPRT_PSPD USB_OTG_HPRT_PSPD_Msk /*!< Port speed */ +#define USB_OTG_HPRT_PSPD_0 (0x1UL << USB_OTG_HPRT_PSPD_Pos) /*!< 0x00020000 */ +#define USB_OTG_HPRT_PSPD_1 (0x2UL << USB_OTG_HPRT_PSPD_Pos) /*!< 0x00040000 */ + +/******************** Bit definition for USB_OTG_DOEPEACHMSK1 register ********************/ +#define USB_OTG_DOEPEACHMSK1_XFRCM_Pos (0U) +#define USB_OTG_DOEPEACHMSK1_XFRCM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_XFRCM_Pos) /*!< 0x00000001 */ +#define USB_OTG_DOEPEACHMSK1_XFRCM USB_OTG_DOEPEACHMSK1_XFRCM_Msk /*!< Transfer completed interrupt mask */ +#define USB_OTG_DOEPEACHMSK1_EPDM_Pos (1U) +#define USB_OTG_DOEPEACHMSK1_EPDM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_EPDM_Pos) /*!< 0x00000002 */ +#define USB_OTG_DOEPEACHMSK1_EPDM USB_OTG_DOEPEACHMSK1_EPDM_Msk /*!< Endpoint disabled interrupt mask */ +#define USB_OTG_DOEPEACHMSK1_TOM_Pos (3U) +#define USB_OTG_DOEPEACHMSK1_TOM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_TOM_Pos) /*!< 0x00000008 */ +#define USB_OTG_DOEPEACHMSK1_TOM USB_OTG_DOEPEACHMSK1_TOM_Msk /*!< Timeout condition mask */ +#define USB_OTG_DOEPEACHMSK1_ITTXFEMSK_Pos (4U) +#define USB_OTG_DOEPEACHMSK1_ITTXFEMSK_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_ITTXFEMSK_Pos) /*!< 0x00000010 */ +#define USB_OTG_DOEPEACHMSK1_ITTXFEMSK USB_OTG_DOEPEACHMSK1_ITTXFEMSK_Msk /*!< IN token received when TxFIFO empty mask */ +#define USB_OTG_DOEPEACHMSK1_INEPNMM_Pos (5U) +#define USB_OTG_DOEPEACHMSK1_INEPNMM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_INEPNMM_Pos) /*!< 0x00000020 */ +#define USB_OTG_DOEPEACHMSK1_INEPNMM USB_OTG_DOEPEACHMSK1_INEPNMM_Msk /*!< IN token received with EP mismatch mask */ +#define USB_OTG_DOEPEACHMSK1_INEPNEM_Pos (6U) +#define USB_OTG_DOEPEACHMSK1_INEPNEM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_INEPNEM_Pos) /*!< 0x00000040 */ +#define USB_OTG_DOEPEACHMSK1_INEPNEM USB_OTG_DOEPEACHMSK1_INEPNEM_Msk /*!< IN endpoint NAK effective mask */ +#define USB_OTG_DOEPEACHMSK1_TXFURM_Pos (8U) +#define USB_OTG_DOEPEACHMSK1_TXFURM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_TXFURM_Pos) /*!< 0x00000100 */ +#define USB_OTG_DOEPEACHMSK1_TXFURM USB_OTG_DOEPEACHMSK1_TXFURM_Msk /*!< OUT packet error mask */ +#define USB_OTG_DOEPEACHMSK1_BIM_Pos (9U) +#define USB_OTG_DOEPEACHMSK1_BIM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_BIM_Pos) /*!< 0x00000200 */ +#define USB_OTG_DOEPEACHMSK1_BIM USB_OTG_DOEPEACHMSK1_BIM_Msk /*!< BNA interrupt mask */ +#define USB_OTG_DOEPEACHMSK1_BERRM_Pos (12U) +#define USB_OTG_DOEPEACHMSK1_BERRM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_BERRM_Pos) /*!< 0x00001000 */ +#define USB_OTG_DOEPEACHMSK1_BERRM USB_OTG_DOEPEACHMSK1_BERRM_Msk /*!< Bubble error interrupt mask */ +#define USB_OTG_DOEPEACHMSK1_NAKM_Pos (13U) +#define USB_OTG_DOEPEACHMSK1_NAKM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_NAKM_Pos) /*!< 0x00002000 */ +#define USB_OTG_DOEPEACHMSK1_NAKM USB_OTG_DOEPEACHMSK1_NAKM_Msk /*!< NAK interrupt mask */ +#define USB_OTG_DOEPEACHMSK1_NYETM_Pos (14U) +#define USB_OTG_DOEPEACHMSK1_NYETM_Msk (0x1UL << USB_OTG_DOEPEACHMSK1_NYETM_Pos) /*!< 0x00004000 */ +#define USB_OTG_DOEPEACHMSK1_NYETM USB_OTG_DOEPEACHMSK1_NYETM_Msk /*!< NYET interrupt mask */ + +/******************** Bit definition for USB_OTG_HPTXFSIZ register ********************/ +#define USB_OTG_HPTXFSIZ_PTXSA_Pos (0U) +#define USB_OTG_HPTXFSIZ_PTXSA_Msk (0xFFFFUL << USB_OTG_HPTXFSIZ_PTXSA_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_HPTXFSIZ_PTXSA USB_OTG_HPTXFSIZ_PTXSA_Msk /*!< Host periodic TxFIFO start address */ +#define USB_OTG_HPTXFSIZ_PTXFD_Pos (16U) +#define USB_OTG_HPTXFSIZ_PTXFD_Msk (0xFFFFUL << USB_OTG_HPTXFSIZ_PTXFD_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_HPTXFSIZ_PTXFD USB_OTG_HPTXFSIZ_PTXFD_Msk /*!< Host periodic TxFIFO depth */ + +/******************** Bit definition for USB_OTG_DIEPCTL register ********************/ +#define USB_OTG_DIEPCTL_MPSIZ_Pos (0U) +#define USB_OTG_DIEPCTL_MPSIZ_Msk (0x7FFUL << USB_OTG_DIEPCTL_MPSIZ_Pos) /*!< 0x000007FF */ +#define USB_OTG_DIEPCTL_MPSIZ USB_OTG_DIEPCTL_MPSIZ_Msk /*!< Maximum packet size */ +#define USB_OTG_DIEPCTL_USBAEP_Pos (15U) +#define USB_OTG_DIEPCTL_USBAEP_Msk (0x1UL << USB_OTG_DIEPCTL_USBAEP_Pos) /*!< 0x00008000 */ +#define USB_OTG_DIEPCTL_USBAEP USB_OTG_DIEPCTL_USBAEP_Msk /*!< USB active endpoint */ +#define USB_OTG_DIEPCTL_EONUM_DPID_Pos (16U) +#define USB_OTG_DIEPCTL_EONUM_DPID_Msk (0x1UL << USB_OTG_DIEPCTL_EONUM_DPID_Pos) /*!< 0x00010000 */ +#define USB_OTG_DIEPCTL_EONUM_DPID USB_OTG_DIEPCTL_EONUM_DPID_Msk /*!< Even/odd frame */ +#define USB_OTG_DIEPCTL_NAKSTS_Pos (17U) +#define USB_OTG_DIEPCTL_NAKSTS_Msk (0x1UL << USB_OTG_DIEPCTL_NAKSTS_Pos) /*!< 0x00020000 */ +#define USB_OTG_DIEPCTL_NAKSTS USB_OTG_DIEPCTL_NAKSTS_Msk /*!< NAK status */ + +#define USB_OTG_DIEPCTL_EPTYP_Pos (18U) +#define USB_OTG_DIEPCTL_EPTYP_Msk (0x3UL << USB_OTG_DIEPCTL_EPTYP_Pos) /*!< 0x000C0000 */ +#define USB_OTG_DIEPCTL_EPTYP USB_OTG_DIEPCTL_EPTYP_Msk /*!< Endpoint type */ +#define USB_OTG_DIEPCTL_EPTYP_0 (0x1UL << USB_OTG_DIEPCTL_EPTYP_Pos) /*!< 0x00040000 */ +#define USB_OTG_DIEPCTL_EPTYP_1 (0x2UL << USB_OTG_DIEPCTL_EPTYP_Pos) /*!< 0x00080000 */ +#define USB_OTG_DIEPCTL_STALL_Pos (21U) +#define USB_OTG_DIEPCTL_STALL_Msk (0x1UL << USB_OTG_DIEPCTL_STALL_Pos) /*!< 0x00200000 */ +#define USB_OTG_DIEPCTL_STALL USB_OTG_DIEPCTL_STALL_Msk /*!< STALL handshake */ + +#define USB_OTG_DIEPCTL_TXFNUM_Pos (22U) +#define USB_OTG_DIEPCTL_TXFNUM_Msk (0xFUL << USB_OTG_DIEPCTL_TXFNUM_Pos) /*!< 0x03C00000 */ +#define USB_OTG_DIEPCTL_TXFNUM USB_OTG_DIEPCTL_TXFNUM_Msk /*!< TxFIFO number */ +#define USB_OTG_DIEPCTL_TXFNUM_0 (0x1UL << USB_OTG_DIEPCTL_TXFNUM_Pos) /*!< 0x00400000 */ +#define USB_OTG_DIEPCTL_TXFNUM_1 (0x2UL << USB_OTG_DIEPCTL_TXFNUM_Pos) /*!< 0x00800000 */ +#define USB_OTG_DIEPCTL_TXFNUM_2 (0x4UL << USB_OTG_DIEPCTL_TXFNUM_Pos) /*!< 0x01000000 */ +#define USB_OTG_DIEPCTL_TXFNUM_3 (0x8UL << USB_OTG_DIEPCTL_TXFNUM_Pos) /*!< 0x02000000 */ +#define USB_OTG_DIEPCTL_CNAK_Pos (26U) +#define USB_OTG_DIEPCTL_CNAK_Msk (0x1UL << USB_OTG_DIEPCTL_CNAK_Pos) /*!< 0x04000000 */ +#define USB_OTG_DIEPCTL_CNAK USB_OTG_DIEPCTL_CNAK_Msk /*!< Clear NAK */ +#define USB_OTG_DIEPCTL_SNAK_Pos (27U) +#define USB_OTG_DIEPCTL_SNAK_Msk (0x1UL << USB_OTG_DIEPCTL_SNAK_Pos) /*!< 0x08000000 */ +#define USB_OTG_DIEPCTL_SNAK USB_OTG_DIEPCTL_SNAK_Msk /*!< Set NAK */ +#define USB_OTG_DIEPCTL_SD0PID_SEVNFRM_Pos (28U) +#define USB_OTG_DIEPCTL_SD0PID_SEVNFRM_Msk (0x1UL << USB_OTG_DIEPCTL_SD0PID_SEVNFRM_Pos) /*!< 0x10000000 */ +#define USB_OTG_DIEPCTL_SD0PID_SEVNFRM USB_OTG_DIEPCTL_SD0PID_SEVNFRM_Msk /*!< Set DATA0 PID */ +#define USB_OTG_DIEPCTL_SODDFRM_Pos (29U) +#define USB_OTG_DIEPCTL_SODDFRM_Msk (0x1UL << USB_OTG_DIEPCTL_SODDFRM_Pos) /*!< 0x20000000 */ +#define USB_OTG_DIEPCTL_SODDFRM USB_OTG_DIEPCTL_SODDFRM_Msk /*!< Set odd frame */ +#define USB_OTG_DIEPCTL_EPDIS_Pos (30U) +#define USB_OTG_DIEPCTL_EPDIS_Msk (0x1UL << USB_OTG_DIEPCTL_EPDIS_Pos) /*!< 0x40000000 */ +#define USB_OTG_DIEPCTL_EPDIS USB_OTG_DIEPCTL_EPDIS_Msk /*!< Endpoint disable */ +#define USB_OTG_DIEPCTL_EPENA_Pos (31U) +#define USB_OTG_DIEPCTL_EPENA_Msk (0x1UL << USB_OTG_DIEPCTL_EPENA_Pos) /*!< 0x80000000 */ +#define USB_OTG_DIEPCTL_EPENA USB_OTG_DIEPCTL_EPENA_Msk /*!< Endpoint enable */ + +/******************** Bit definition for USB_OTG_HCCHAR register ********************/ +#define USB_OTG_HCCHAR_MPSIZ_Pos (0U) +#define USB_OTG_HCCHAR_MPSIZ_Msk (0x7FFUL << USB_OTG_HCCHAR_MPSIZ_Pos) /*!< 0x000007FF */ +#define USB_OTG_HCCHAR_MPSIZ USB_OTG_HCCHAR_MPSIZ_Msk /*!< Maximum packet size */ + +#define USB_OTG_HCCHAR_EPNUM_Pos (11U) +#define USB_OTG_HCCHAR_EPNUM_Msk (0xFUL << USB_OTG_HCCHAR_EPNUM_Pos) /*!< 0x00007800 */ +#define USB_OTG_HCCHAR_EPNUM USB_OTG_HCCHAR_EPNUM_Msk /*!< Endpoint number */ +#define USB_OTG_HCCHAR_EPNUM_0 (0x1UL << USB_OTG_HCCHAR_EPNUM_Pos) /*!< 0x00000800 */ +#define USB_OTG_HCCHAR_EPNUM_1 (0x2UL << USB_OTG_HCCHAR_EPNUM_Pos) /*!< 0x00001000 */ +#define USB_OTG_HCCHAR_EPNUM_2 (0x4UL << USB_OTG_HCCHAR_EPNUM_Pos) /*!< 0x00002000 */ +#define USB_OTG_HCCHAR_EPNUM_3 (0x8UL << USB_OTG_HCCHAR_EPNUM_Pos) /*!< 0x00004000 */ +#define USB_OTG_HCCHAR_EPDIR_Pos (15U) +#define USB_OTG_HCCHAR_EPDIR_Msk (0x1UL << USB_OTG_HCCHAR_EPDIR_Pos) /*!< 0x00008000 */ +#define USB_OTG_HCCHAR_EPDIR USB_OTG_HCCHAR_EPDIR_Msk /*!< Endpoint direction */ +#define USB_OTG_HCCHAR_LSDEV_Pos (17U) +#define USB_OTG_HCCHAR_LSDEV_Msk (0x1UL << USB_OTG_HCCHAR_LSDEV_Pos) /*!< 0x00020000 */ +#define USB_OTG_HCCHAR_LSDEV USB_OTG_HCCHAR_LSDEV_Msk /*!< Low-speed device */ + +#define USB_OTG_HCCHAR_EPTYP_Pos (18U) +#define USB_OTG_HCCHAR_EPTYP_Msk (0x3UL << USB_OTG_HCCHAR_EPTYP_Pos) /*!< 0x000C0000 */ +#define USB_OTG_HCCHAR_EPTYP USB_OTG_HCCHAR_EPTYP_Msk /*!< Endpoint type */ +#define USB_OTG_HCCHAR_EPTYP_0 (0x1UL << USB_OTG_HCCHAR_EPTYP_Pos) /*!< 0x00040000 */ +#define USB_OTG_HCCHAR_EPTYP_1 (0x2UL << USB_OTG_HCCHAR_EPTYP_Pos) /*!< 0x00080000 */ + +#define USB_OTG_HCCHAR_MC_Pos (20U) +#define USB_OTG_HCCHAR_MC_Msk (0x3UL << USB_OTG_HCCHAR_MC_Pos) /*!< 0x00300000 */ +#define USB_OTG_HCCHAR_MC USB_OTG_HCCHAR_MC_Msk /*!< Multi Count (MC) / Error Count (EC) */ +#define USB_OTG_HCCHAR_MC_0 (0x1UL << USB_OTG_HCCHAR_MC_Pos) /*!< 0x00100000 */ +#define USB_OTG_HCCHAR_MC_1 (0x2UL << USB_OTG_HCCHAR_MC_Pos) /*!< 0x00200000 */ + +#define USB_OTG_HCCHAR_DAD_Pos (22U) +#define USB_OTG_HCCHAR_DAD_Msk (0x7FUL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x1FC00000 */ +#define USB_OTG_HCCHAR_DAD USB_OTG_HCCHAR_DAD_Msk /*!< Device address */ +#define USB_OTG_HCCHAR_DAD_0 (0x01UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x00400000 */ +#define USB_OTG_HCCHAR_DAD_1 (0x02UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x00800000 */ +#define USB_OTG_HCCHAR_DAD_2 (0x04UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x01000000 */ +#define USB_OTG_HCCHAR_DAD_3 (0x08UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x02000000 */ +#define USB_OTG_HCCHAR_DAD_4 (0x10UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x04000000 */ +#define USB_OTG_HCCHAR_DAD_5 (0x20UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x08000000 */ +#define USB_OTG_HCCHAR_DAD_6 (0x40UL << USB_OTG_HCCHAR_DAD_Pos) /*!< 0x10000000 */ +#define USB_OTG_HCCHAR_ODDFRM_Pos (29U) +#define USB_OTG_HCCHAR_ODDFRM_Msk (0x1UL << USB_OTG_HCCHAR_ODDFRM_Pos) /*!< 0x20000000 */ +#define USB_OTG_HCCHAR_ODDFRM USB_OTG_HCCHAR_ODDFRM_Msk /*!< Odd frame */ +#define USB_OTG_HCCHAR_CHDIS_Pos (30U) +#define USB_OTG_HCCHAR_CHDIS_Msk (0x1UL << USB_OTG_HCCHAR_CHDIS_Pos) /*!< 0x40000000 */ +#define USB_OTG_HCCHAR_CHDIS USB_OTG_HCCHAR_CHDIS_Msk /*!< Channel disable */ +#define USB_OTG_HCCHAR_CHENA_Pos (31U) +#define USB_OTG_HCCHAR_CHENA_Msk (0x1UL << USB_OTG_HCCHAR_CHENA_Pos) /*!< 0x80000000 */ +#define USB_OTG_HCCHAR_CHENA USB_OTG_HCCHAR_CHENA_Msk /*!< Channel enable */ + +/******************** Bit definition for USB_OTG_HCSPLT register ********************/ + +#define USB_OTG_HCSPLT_PRTADDR_Pos (0U) +#define USB_OTG_HCSPLT_PRTADDR_Msk (0x7FUL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x0000007F */ +#define USB_OTG_HCSPLT_PRTADDR USB_OTG_HCSPLT_PRTADDR_Msk /*!< Port address */ +#define USB_OTG_HCSPLT_PRTADDR_0 (0x01UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000001 */ +#define USB_OTG_HCSPLT_PRTADDR_1 (0x02UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000002 */ +#define USB_OTG_HCSPLT_PRTADDR_2 (0x04UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000004 */ +#define USB_OTG_HCSPLT_PRTADDR_3 (0x08UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000008 */ +#define USB_OTG_HCSPLT_PRTADDR_4 (0x10UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000010 */ +#define USB_OTG_HCSPLT_PRTADDR_5 (0x20UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000020 */ +#define USB_OTG_HCSPLT_PRTADDR_6 (0x40UL << USB_OTG_HCSPLT_PRTADDR_Pos) /*!< 0x00000040 */ + +#define USB_OTG_HCSPLT_HUBADDR_Pos (7U) +#define USB_OTG_HCSPLT_HUBADDR_Msk (0x7FUL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00003F80 */ +#define USB_OTG_HCSPLT_HUBADDR USB_OTG_HCSPLT_HUBADDR_Msk /*!< Hub address */ +#define USB_OTG_HCSPLT_HUBADDR_0 (0x01UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00000080 */ +#define USB_OTG_HCSPLT_HUBADDR_1 (0x02UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00000100 */ +#define USB_OTG_HCSPLT_HUBADDR_2 (0x04UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00000200 */ +#define USB_OTG_HCSPLT_HUBADDR_3 (0x08UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00000400 */ +#define USB_OTG_HCSPLT_HUBADDR_4 (0x10UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00000800 */ +#define USB_OTG_HCSPLT_HUBADDR_5 (0x20UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00001000 */ +#define USB_OTG_HCSPLT_HUBADDR_6 (0x40UL << USB_OTG_HCSPLT_HUBADDR_Pos) /*!< 0x00002000 */ + +#define USB_OTG_HCSPLT_XACTPOS_Pos (14U) +#define USB_OTG_HCSPLT_XACTPOS_Msk (0x3UL << USB_OTG_HCSPLT_XACTPOS_Pos) /*!< 0x0000C000 */ +#define USB_OTG_HCSPLT_XACTPOS USB_OTG_HCSPLT_XACTPOS_Msk /*!< XACTPOS */ +#define USB_OTG_HCSPLT_XACTPOS_0 (0x1UL << USB_OTG_HCSPLT_XACTPOS_Pos) /*!< 0x00004000 */ +#define USB_OTG_HCSPLT_XACTPOS_1 (0x2UL << USB_OTG_HCSPLT_XACTPOS_Pos) /*!< 0x00008000 */ +#define USB_OTG_HCSPLT_COMPLSPLT_Pos (16U) +#define USB_OTG_HCSPLT_COMPLSPLT_Msk (0x1UL << USB_OTG_HCSPLT_COMPLSPLT_Pos) /*!< 0x00010000 */ +#define USB_OTG_HCSPLT_COMPLSPLT USB_OTG_HCSPLT_COMPLSPLT_Msk /*!< Do complete split */ +#define USB_OTG_HCSPLT_SPLITEN_Pos (31U) +#define USB_OTG_HCSPLT_SPLITEN_Msk (0x1UL << USB_OTG_HCSPLT_SPLITEN_Pos) /*!< 0x80000000 */ +#define USB_OTG_HCSPLT_SPLITEN USB_OTG_HCSPLT_SPLITEN_Msk /*!< Split enable */ + +/******************** Bit definition for USB_OTG_HCINT register ********************/ +#define USB_OTG_HCINT_XFRC_Pos (0U) +#define USB_OTG_HCINT_XFRC_Msk (0x1UL << USB_OTG_HCINT_XFRC_Pos) /*!< 0x00000001 */ +#define USB_OTG_HCINT_XFRC USB_OTG_HCINT_XFRC_Msk /*!< Transfer completed */ +#define USB_OTG_HCINT_CHH_Pos (1U) +#define USB_OTG_HCINT_CHH_Msk (0x1UL << USB_OTG_HCINT_CHH_Pos) /*!< 0x00000002 */ +#define USB_OTG_HCINT_CHH USB_OTG_HCINT_CHH_Msk /*!< Channel halted */ +#define USB_OTG_HCINT_AHBERR_Pos (2U) +#define USB_OTG_HCINT_AHBERR_Msk (0x1UL << USB_OTG_HCINT_AHBERR_Pos) /*!< 0x00000004 */ +#define USB_OTG_HCINT_AHBERR USB_OTG_HCINT_AHBERR_Msk /*!< AHB error */ +#define USB_OTG_HCINT_STALL_Pos (3U) +#define USB_OTG_HCINT_STALL_Msk (0x1UL << USB_OTG_HCINT_STALL_Pos) /*!< 0x00000008 */ +#define USB_OTG_HCINT_STALL USB_OTG_HCINT_STALL_Msk /*!< STALL response received interrupt */ +#define USB_OTG_HCINT_NAK_Pos (4U) +#define USB_OTG_HCINT_NAK_Msk (0x1UL << USB_OTG_HCINT_NAK_Pos) /*!< 0x00000010 */ +#define USB_OTG_HCINT_NAK USB_OTG_HCINT_NAK_Msk /*!< NAK response received interrupt */ +#define USB_OTG_HCINT_ACK_Pos (5U) +#define USB_OTG_HCINT_ACK_Msk (0x1UL << USB_OTG_HCINT_ACK_Pos) /*!< 0x00000020 */ +#define USB_OTG_HCINT_ACK USB_OTG_HCINT_ACK_Msk /*!< ACK response received/transmitted interrupt */ +#define USB_OTG_HCINT_NYET_Pos (6U) +#define USB_OTG_HCINT_NYET_Msk (0x1UL << USB_OTG_HCINT_NYET_Pos) /*!< 0x00000040 */ +#define USB_OTG_HCINT_NYET USB_OTG_HCINT_NYET_Msk /*!< Response received interrupt */ +#define USB_OTG_HCINT_TXERR_Pos (7U) +#define USB_OTG_HCINT_TXERR_Msk (0x1UL << USB_OTG_HCINT_TXERR_Pos) /*!< 0x00000080 */ +#define USB_OTG_HCINT_TXERR USB_OTG_HCINT_TXERR_Msk /*!< Transaction error */ +#define USB_OTG_HCINT_BBERR_Pos (8U) +#define USB_OTG_HCINT_BBERR_Msk (0x1UL << USB_OTG_HCINT_BBERR_Pos) /*!< 0x00000100 */ +#define USB_OTG_HCINT_BBERR USB_OTG_HCINT_BBERR_Msk /*!< Babble error */ +#define USB_OTG_HCINT_FRMOR_Pos (9U) +#define USB_OTG_HCINT_FRMOR_Msk (0x1UL << USB_OTG_HCINT_FRMOR_Pos) /*!< 0x00000200 */ +#define USB_OTG_HCINT_FRMOR USB_OTG_HCINT_FRMOR_Msk /*!< Frame overrun */ +#define USB_OTG_HCINT_DTERR_Pos (10U) +#define USB_OTG_HCINT_DTERR_Msk (0x1UL << USB_OTG_HCINT_DTERR_Pos) /*!< 0x00000400 */ +#define USB_OTG_HCINT_DTERR USB_OTG_HCINT_DTERR_Msk /*!< Data toggle error */ + +/******************** Bit definition for USB_OTG_DIEPINT register ********************/ +#define USB_OTG_DIEPINT_XFRC_Pos (0U) +#define USB_OTG_DIEPINT_XFRC_Msk (0x1UL << USB_OTG_DIEPINT_XFRC_Pos) /*!< 0x00000001 */ +#define USB_OTG_DIEPINT_XFRC USB_OTG_DIEPINT_XFRC_Msk /*!< Transfer completed interrupt */ +#define USB_OTG_DIEPINT_EPDISD_Pos (1U) +#define USB_OTG_DIEPINT_EPDISD_Msk (0x1UL << USB_OTG_DIEPINT_EPDISD_Pos) /*!< 0x00000002 */ +#define USB_OTG_DIEPINT_EPDISD USB_OTG_DIEPINT_EPDISD_Msk /*!< Endpoint disabled interrupt */ +#define USB_OTG_DIEPINT_AHBERR_Pos (2U) +#define USB_OTG_DIEPINT_AHBERR_Msk (0x1UL << USB_OTG_DIEPINT_AHBERR_Pos) /*!< 0x00000004 */ +#define USB_OTG_DIEPINT_AHBERR USB_OTG_DIEPINT_AHBERR_Msk /*!< AHB Error (AHBErr) during an IN transaction */ +#define USB_OTG_DIEPINT_TOC_Pos (3U) +#define USB_OTG_DIEPINT_TOC_Msk (0x1UL << USB_OTG_DIEPINT_TOC_Pos) /*!< 0x00000008 */ +#define USB_OTG_DIEPINT_TOC USB_OTG_DIEPINT_TOC_Msk /*!< Timeout condition */ +#define USB_OTG_DIEPINT_ITTXFE_Pos (4U) +#define USB_OTG_DIEPINT_ITTXFE_Msk (0x1UL << USB_OTG_DIEPINT_ITTXFE_Pos) /*!< 0x00000010 */ +#define USB_OTG_DIEPINT_ITTXFE USB_OTG_DIEPINT_ITTXFE_Msk /*!< IN token received when TxFIFO is empty */ +#define USB_OTG_DIEPINT_INEPNM_Pos (5U) +#define USB_OTG_DIEPINT_INEPNM_Msk (0x1UL << USB_OTG_DIEPINT_INEPNM_Pos) /*!< 0x00000020 */ +#define USB_OTG_DIEPINT_INEPNM USB_OTG_DIEPINT_INEPNM_Msk /*!< IN token received with EP mismatch */ +#define USB_OTG_DIEPINT_INEPNE_Pos (6U) +#define USB_OTG_DIEPINT_INEPNE_Msk (0x1UL << USB_OTG_DIEPINT_INEPNE_Pos) /*!< 0x00000040 */ +#define USB_OTG_DIEPINT_INEPNE USB_OTG_DIEPINT_INEPNE_Msk /*!< IN endpoint NAK effective */ +#define USB_OTG_DIEPINT_TXFE_Pos (7U) +#define USB_OTG_DIEPINT_TXFE_Msk (0x1UL << USB_OTG_DIEPINT_TXFE_Pos) /*!< 0x00000080 */ +#define USB_OTG_DIEPINT_TXFE USB_OTG_DIEPINT_TXFE_Msk /*!< Transmit FIFO empty */ +#define USB_OTG_DIEPINT_TXFIFOUDRN_Pos (8U) +#define USB_OTG_DIEPINT_TXFIFOUDRN_Msk (0x1UL << USB_OTG_DIEPINT_TXFIFOUDRN_Pos) /*!< 0x00000100 */ +#define USB_OTG_DIEPINT_TXFIFOUDRN USB_OTG_DIEPINT_TXFIFOUDRN_Msk /*!< Transmit Fifo Underrun */ +#define USB_OTG_DIEPINT_BNA_Pos (9U) +#define USB_OTG_DIEPINT_BNA_Msk (0x1UL << USB_OTG_DIEPINT_BNA_Pos) /*!< 0x00000200 */ +#define USB_OTG_DIEPINT_BNA USB_OTG_DIEPINT_BNA_Msk /*!< Buffer not available interrupt */ +#define USB_OTG_DIEPINT_PKTDRPSTS_Pos (11U) +#define USB_OTG_DIEPINT_PKTDRPSTS_Msk (0x1UL << USB_OTG_DIEPINT_PKTDRPSTS_Pos) /*!< 0x00000800 */ +#define USB_OTG_DIEPINT_PKTDRPSTS USB_OTG_DIEPINT_PKTDRPSTS_Msk /*!< Packet dropped status */ +#define USB_OTG_DIEPINT_BERR_Pos (12U) +#define USB_OTG_DIEPINT_BERR_Msk (0x1UL << USB_OTG_DIEPINT_BERR_Pos) /*!< 0x00001000 */ +#define USB_OTG_DIEPINT_BERR USB_OTG_DIEPINT_BERR_Msk /*!< Babble error interrupt */ +#define USB_OTG_DIEPINT_NAK_Pos (13U) +#define USB_OTG_DIEPINT_NAK_Msk (0x1UL << USB_OTG_DIEPINT_NAK_Pos) /*!< 0x00002000 */ +#define USB_OTG_DIEPINT_NAK USB_OTG_DIEPINT_NAK_Msk /*!< NAK interrupt */ + +/******************** Bit definition for USB_OTG_HCINTMSK register ********************/ +#define USB_OTG_HCINTMSK_XFRCM_Pos (0U) +#define USB_OTG_HCINTMSK_XFRCM_Msk (0x1UL << USB_OTG_HCINTMSK_XFRCM_Pos) /*!< 0x00000001 */ +#define USB_OTG_HCINTMSK_XFRCM USB_OTG_HCINTMSK_XFRCM_Msk /*!< Transfer completed mask */ +#define USB_OTG_HCINTMSK_CHHM_Pos (1U) +#define USB_OTG_HCINTMSK_CHHM_Msk (0x1UL << USB_OTG_HCINTMSK_CHHM_Pos) /*!< 0x00000002 */ +#define USB_OTG_HCINTMSK_CHHM USB_OTG_HCINTMSK_CHHM_Msk /*!< Channel halted mask */ +#define USB_OTG_HCINTMSK_AHBERR_Pos (2U) +#define USB_OTG_HCINTMSK_AHBERR_Msk (0x1UL << USB_OTG_HCINTMSK_AHBERR_Pos) /*!< 0x00000004 */ +#define USB_OTG_HCINTMSK_AHBERR USB_OTG_HCINTMSK_AHBERR_Msk /*!< AHB error */ +#define USB_OTG_HCINTMSK_STALLM_Pos (3U) +#define USB_OTG_HCINTMSK_STALLM_Msk (0x1UL << USB_OTG_HCINTMSK_STALLM_Pos) /*!< 0x00000008 */ +#define USB_OTG_HCINTMSK_STALLM USB_OTG_HCINTMSK_STALLM_Msk /*!< STALL response received interrupt mask */ +#define USB_OTG_HCINTMSK_NAKM_Pos (4U) +#define USB_OTG_HCINTMSK_NAKM_Msk (0x1UL << USB_OTG_HCINTMSK_NAKM_Pos) /*!< 0x00000010 */ +#define USB_OTG_HCINTMSK_NAKM USB_OTG_HCINTMSK_NAKM_Msk /*!< NAK response received interrupt mask */ +#define USB_OTG_HCINTMSK_ACKM_Pos (5U) +#define USB_OTG_HCINTMSK_ACKM_Msk (0x1UL << USB_OTG_HCINTMSK_ACKM_Pos) /*!< 0x00000020 */ +#define USB_OTG_HCINTMSK_ACKM USB_OTG_HCINTMSK_ACKM_Msk /*!< ACK response received/transmitted interrupt mask */ +#define USB_OTG_HCINTMSK_NYET_Pos (6U) +#define USB_OTG_HCINTMSK_NYET_Msk (0x1UL << USB_OTG_HCINTMSK_NYET_Pos) /*!< 0x00000040 */ +#define USB_OTG_HCINTMSK_NYET USB_OTG_HCINTMSK_NYET_Msk /*!< response received interrupt mask */ +#define USB_OTG_HCINTMSK_TXERRM_Pos (7U) +#define USB_OTG_HCINTMSK_TXERRM_Msk (0x1UL << USB_OTG_HCINTMSK_TXERRM_Pos) /*!< 0x00000080 */ +#define USB_OTG_HCINTMSK_TXERRM USB_OTG_HCINTMSK_TXERRM_Msk /*!< Transaction error mask */ +#define USB_OTG_HCINTMSK_BBERRM_Pos (8U) +#define USB_OTG_HCINTMSK_BBERRM_Msk (0x1UL << USB_OTG_HCINTMSK_BBERRM_Pos) /*!< 0x00000100 */ +#define USB_OTG_HCINTMSK_BBERRM USB_OTG_HCINTMSK_BBERRM_Msk /*!< Babble error mask */ +#define USB_OTG_HCINTMSK_FRMORM_Pos (9U) +#define USB_OTG_HCINTMSK_FRMORM_Msk (0x1UL << USB_OTG_HCINTMSK_FRMORM_Pos) /*!< 0x00000200 */ +#define USB_OTG_HCINTMSK_FRMORM USB_OTG_HCINTMSK_FRMORM_Msk /*!< Frame overrun mask */ +#define USB_OTG_HCINTMSK_DTERRM_Pos (10U) +#define USB_OTG_HCINTMSK_DTERRM_Msk (0x1UL << USB_OTG_HCINTMSK_DTERRM_Pos) /*!< 0x00000400 */ +#define USB_OTG_HCINTMSK_DTERRM USB_OTG_HCINTMSK_DTERRM_Msk /*!< Data toggle error mask */ + +/******************** Bit definition for USB_OTG_DIEPTSIZ register ********************/ + +#define USB_OTG_DIEPTSIZ_XFRSIZ_Pos (0U) +#define USB_OTG_DIEPTSIZ_XFRSIZ_Msk (0x7FFFFUL << USB_OTG_DIEPTSIZ_XFRSIZ_Pos) /*!< 0x0007FFFF */ +#define USB_OTG_DIEPTSIZ_XFRSIZ USB_OTG_DIEPTSIZ_XFRSIZ_Msk /*!< Transfer size */ +#define USB_OTG_DIEPTSIZ_PKTCNT_Pos (19U) +#define USB_OTG_DIEPTSIZ_PKTCNT_Msk (0x3FFUL << USB_OTG_DIEPTSIZ_PKTCNT_Pos) /*!< 0x1FF80000 */ +#define USB_OTG_DIEPTSIZ_PKTCNT USB_OTG_DIEPTSIZ_PKTCNT_Msk /*!< Packet count */ +#define USB_OTG_DIEPTSIZ_MULCNT_Pos (29U) +#define USB_OTG_DIEPTSIZ_MULCNT_Msk (0x3UL << USB_OTG_DIEPTSIZ_MULCNT_Pos) /*!< 0x60000000 */ +#define USB_OTG_DIEPTSIZ_MULCNT USB_OTG_DIEPTSIZ_MULCNT_Msk /*!< Packet count */ +/******************** Bit definition for USB_OTG_HCTSIZ register ********************/ +#define USB_OTG_HCTSIZ_XFRSIZ_Pos (0U) +#define USB_OTG_HCTSIZ_XFRSIZ_Msk (0x7FFFFUL << USB_OTG_HCTSIZ_XFRSIZ_Pos) /*!< 0x0007FFFF */ +#define USB_OTG_HCTSIZ_XFRSIZ USB_OTG_HCTSIZ_XFRSIZ_Msk /*!< Transfer size */ +#define USB_OTG_HCTSIZ_PKTCNT_Pos (19U) +#define USB_OTG_HCTSIZ_PKTCNT_Msk (0x3FFUL << USB_OTG_HCTSIZ_PKTCNT_Pos) /*!< 0x1FF80000 */ +#define USB_OTG_HCTSIZ_PKTCNT USB_OTG_HCTSIZ_PKTCNT_Msk /*!< Packet count */ +#define USB_OTG_HCTSIZ_DOPING_Pos (31U) +#define USB_OTG_HCTSIZ_DOPING_Msk (0x1UL << USB_OTG_HCTSIZ_DOPING_Pos) /*!< 0x80000000 */ +#define USB_OTG_HCTSIZ_DOPING USB_OTG_HCTSIZ_DOPING_Msk /*!< Do PING */ +#define USB_OTG_HCTSIZ_DPID_Pos (29U) +#define USB_OTG_HCTSIZ_DPID_Msk (0x3UL << USB_OTG_HCTSIZ_DPID_Pos) /*!< 0x60000000 */ +#define USB_OTG_HCTSIZ_DPID USB_OTG_HCTSIZ_DPID_Msk /*!< Data PID */ +#define USB_OTG_HCTSIZ_DPID_0 (0x1UL << USB_OTG_HCTSIZ_DPID_Pos) /*!< 0x20000000 */ +#define USB_OTG_HCTSIZ_DPID_1 (0x2UL << USB_OTG_HCTSIZ_DPID_Pos) /*!< 0x40000000 */ + +/******************** Bit definition for USB_OTG_DIEPDMA register ********************/ +#define USB_OTG_DIEPDMA_DMAADDR_Pos (0U) +#define USB_OTG_DIEPDMA_DMAADDR_Msk (0xFFFFFFFFUL << USB_OTG_DIEPDMA_DMAADDR_Pos) /*!< 0xFFFFFFFF */ +#define USB_OTG_DIEPDMA_DMAADDR USB_OTG_DIEPDMA_DMAADDR_Msk /*!< DMA address */ + +/******************** Bit definition for USB_OTG_HCDMA register ********************/ +#define USB_OTG_HCDMA_DMAADDR_Pos (0U) +#define USB_OTG_HCDMA_DMAADDR_Msk (0xFFFFFFFFUL << USB_OTG_HCDMA_DMAADDR_Pos) /*!< 0xFFFFFFFF */ +#define USB_OTG_HCDMA_DMAADDR USB_OTG_HCDMA_DMAADDR_Msk /*!< DMA address */ + +/******************** Bit definition for USB_OTG_DTXFSTS register ********************/ +#define USB_OTG_DTXFSTS_INEPTFSAV_Pos (0U) +#define USB_OTG_DTXFSTS_INEPTFSAV_Msk (0xFFFFUL << USB_OTG_DTXFSTS_INEPTFSAV_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_DTXFSTS_INEPTFSAV USB_OTG_DTXFSTS_INEPTFSAV_Msk /*!< IN endpoint TxFIFO space available */ + +/******************** Bit definition for USB_OTG_DIEPTXF register ********************/ +#define USB_OTG_DIEPTXF_INEPTXSA_Pos (0U) +#define USB_OTG_DIEPTXF_INEPTXSA_Msk (0xFFFFUL << USB_OTG_DIEPTXF_INEPTXSA_Pos) /*!< 0x0000FFFF */ +#define USB_OTG_DIEPTXF_INEPTXSA USB_OTG_DIEPTXF_INEPTXSA_Msk /*!< IN endpoint FIFOx transmit RAM start address */ +#define USB_OTG_DIEPTXF_INEPTXFD_Pos (16U) +#define USB_OTG_DIEPTXF_INEPTXFD_Msk (0xFFFFUL << USB_OTG_DIEPTXF_INEPTXFD_Pos) /*!< 0xFFFF0000 */ +#define USB_OTG_DIEPTXF_INEPTXFD USB_OTG_DIEPTXF_INEPTXFD_Msk /*!< IN endpoint TxFIFO depth */ + +/******************** Bit definition for USB_OTG_DOEPCTL register ********************/ +#define USB_OTG_DOEPCTL_MPSIZ_Pos (0U) +#define USB_OTG_DOEPCTL_MPSIZ_Msk (0x7FFUL << USB_OTG_DOEPCTL_MPSIZ_Pos) /*!< 0x000007FF */ +#define USB_OTG_DOEPCTL_MPSIZ USB_OTG_DOEPCTL_MPSIZ_Msk /*!< Maximum packet size */ /*!
© Copyright (c) 2024 Aisinochip. + * All rights reserved. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef LL_USB_H +#define LL_USB_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ + +#include "hal.h" + +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +/** @addtogroup ACM32H5 HAL + * @{ + */ + +/** @addtogroup USB_LL + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief USB Mode definition + */ +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) + +typedef enum +{ + USB_DEVICE_MODE = 0, + USB_HOST_MODE = 1, + USB_DRD_MODE = 2 +} USB_OTG_ModeTypeDef; + +/** + * @brief URB States definition + */ +typedef enum +{ + URB_IDLE = 0, + URB_DONE, + URB_NOTREADY, + URB_NYET, + URB_ERROR, + URB_STALL +} USB_OTG_URBStateTypeDef; + +/** + * @brief Host channel States definition + */ +typedef enum +{ + HC_IDLE = 0, + HC_XFRC, + HC_HALTED, + HC_NAK, + HC_NYET, + HC_STALL, + HC_XACTERR, + HC_BBLERR, + HC_DATATGLERR +} USB_OTG_HCStateTypeDef; + +/** + * @brief USB OTG Initialization Structure definition + */ +typedef struct +{ + uint32_t dev_endpoints; /*!< Device Endpoints number. + This parameter depends on the used USB core. + This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ + + uint32_t Host_channels; /*!< Host Channels number. + This parameter Depends on the used USB core. + This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ + + uint32_t speed; /*!< USB Core speed. + This parameter can be any value of @ref USB_Core_Speed_ */ + + uint32_t dma_enable; /*!< Enable or disable of the USB embedded DMA used only for OTG HS. */ + + uint32_t ep0_mps; /*!< Set the Endpoint 0 Max Packet size. */ + + uint32_t phy_itface; /*!< Select the used PHY interface. + This parameter can be any value of @ref USB_Core_PHY_ */ + + uint32_t Sof_enable; /*!< Enable or disable the output of the SOF signal. */ + + uint32_t low_power_enable; /*!< Enable or disable the low power mode. */ + + uint32_t lpm_enable; /*!< Enable or disable Link Power Management. */ + + uint32_t battery_charging_enable; /*!< Enable or disable Battery charging. */ + + uint32_t vbus_sensing_enable; /*!< Enable or disable the VBUS Sensing feature. */ + + uint32_t use_dedicated_ep1; /*!< Enable or disable the use of the dedicated EP1 interrupt. */ + + uint32_t use_external_vbus; /*!< Enable or disable the use of the external VBUS. */ + + uint32_t phy_cfg; /*!< 60M-8BIT or 30M-16BIT */ +} USB_OTG_CfgTypeDef; + +typedef struct +{ + uint8_t num; /*!< Endpoint number + This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ + + uint8_t is_in; /*!< Endpoint direction + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint8_t is_stall; /*!< Endpoint stall condition + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint8_t type; /*!< Endpoint type + This parameter can be any value of @ref USB_EP_Type_ */ + + uint8_t data_pid_start; /*!< Initial data PID + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint8_t even_odd_frame; /*!< IFrame parity + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint16_t tx_fifo_num; /*!< Transmission FIFO number + This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ + + uint32_t maxpacket; /*!< Endpoint Max packet size + This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */ + + uint8_t *xfer_buff; /*!< Pointer to transfer buffer */ + + uint32_t dma_addr; /*!< 32 bits aligned transfer buffer address */ + + uint32_t xfer_len; /*!< Current transfer length */ + + uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer */ +} USB_OTG_EPTypeDef; + +typedef struct +{ + uint8_t dev_addr; /*!< USB device address. + This parameter must be a number between Min_Data = 1 and Max_Data = 255 */ + + uint8_t ch_num; /*!< Host channel number. + This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ + + uint8_t ep_num; /*!< Endpoint number. + This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ + + uint8_t ep_is_in; /*!< Endpoint direction + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint8_t speed; /*!< USB Host speed. + This parameter can be any value of @ref USB_Core_Speed_ */ + + uint8_t do_ping; /*!< Enable or disable the use of the PING protocol for HS mode. */ + + uint8_t process_ping; /*!< Execute the PING protocol for HS mode. */ + + uint8_t ep_type; /*!< Endpoint Type. + This parameter can be any value of @ref USB_EP_Type_ */ + + uint16_t max_packet; /*!< Endpoint Max packet size. + This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */ + + uint8_t data_pid; /*!< Initial data PID. + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint8_t *xfer_buff; /*!< Pointer to transfer buffer. */ + + uint32_t xfer_len; /*!< Current transfer length. */ + + uint32_t last_xfer_count; /*!< last transfer count */ + + uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer. */ + + uint8_t toggle_in; /*!< IN transfer current toggle flag. + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint8_t toggle_out; /*!< OUT transfer current toggle flag + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint32_t dma_addr; /*!< 32 bits aligned transfer buffer address. */ + + uint32_t ErrCnt; /*!< Host channel error count.*/ + + USB_OTG_URBStateTypeDef urb_state; /*!< URB state. + This parameter can be any value of @ref USB_OTG_URBStateTypeDef */ + + USB_OTG_HCStateTypeDef state; /*!< Host Channel state. + This parameter can be any value of @ref USB_OTG_HCStateTypeDef */ +} USB_OTG_HCTypeDef; +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup PCD_Exported_Constants PCD Exported Constants + * @{ + */ + +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +/** @defgroup USB_OTG_CORE VERSION ID + * @{ + */ +#define USB_HS_OTG_ID1 1 +#define USB_HS_OTG_ID2 2 +/** + * @} + */ + +/** @defgroup USB_Core_Mode_ USB Core Mode + * @{ + */ +#define USB_OTG_MODE_DEVICE 0U +#define USB_OTG_MODE_HOST 1U +#define USB_OTG_MODE_DRD 2U +/** + * @} + */ + +/** @defgroup USB_LL Device Speed + * @{ + */ +#define USBD_HS_SPEED 0U +#define USBD_HSINFS_SPEED 1U +#define USBH_HS_SPEED 0U +#define USBD_FS_SPEED 2U +#define USBH_FSLS_SPEED 1U +/** + * @} + */ + +/** @defgroup USB_LL_Core_Speed USB Low Layer Core Speed + * @{ + */ +#define USB_OTG_SPEED_HIGH 0U +#define USB_OTG_SPEED_HIGH_IN_FULL 1U +#define USB_OTG_SPEED_FULL 3U +/** + * @} + */ + +/** @defgroup USB_LL_Core_PHY USB Low Layer Core PHY + * @{ + */ +#define USB_OTG_ULPI_PHY 1U +#define USB_OTG_EMBEDDED_PHY 2U +#define USB_OTG_HS_EMBEDDED_PHY 3U + +#if !defined (USB_HS_PHYC_TUNE_VALUE) +#define USB_HS_PHYC_TUNE_VALUE 0x00000F13U /*!< Value of USB HS PHY Tune */ +#endif /* USB_HS_PHYC_TUNE_VALUE */ +/** + * @} + */ + +/** @defgroup USB_LL_Turnaround_Timeout Turnaround Timeout Value + * @{ + */ +#ifndef USBD_HS_TRDT_VALUE +#define USBD_HS_TRDT_VALUE_8BIT 9U +#define USBD_HS_TRDT_VALUE_16BIT 5U +#endif /* USBD_HS_TRDT_VALUE */ +#ifndef USBD_FS_TRDT_VALUE +#define USBD_FS_TRDT_VALUE 5U +#define USBD_DEFAULT_TRDT_VALUE 9U +#endif /* USBD_HS_TRDT_VALUE */ +/** + * @} + */ + +/** @defgroup USB_LL_Core_MPS USB Low Layer Core MPS + * @{ + */ +#define USB_OTG_HS_MAX_PACKET_SIZE 512U +#define USB_OTG_FS_MAX_PACKET_SIZE 64U +#define USB_OTG_MAX_EP0_SIZE 64U +/** + * @} + */ + +/** @defgroup USB_LL_Core_PHY_Frequency USB Low Layer Core PHY Frequency + * @{ + */ +#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ (0U << 1) +#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ (1U << 1) +#define DSTS_ENUMSPD_FS_PHY_48MHZ (3U << 1) +/** + * @} + */ + +/** @defgroup USB_LL_CORE_Frame_Interval USB Low Layer Core Frame Interval + * @{ + */ +#define DCFG_FRAME_INTERVAL_80 0U +#define DCFG_FRAME_INTERVAL_85 1U +#define DCFG_FRAME_INTERVAL_90 2U +#define DCFG_FRAME_INTERVAL_95 3U +/** + * @} + */ + +/** @defgroup USB_LL_EP0_MPS USB Low Layer EP0 MPS + * @{ + */ +#define DEP0CTL_MPS_64 0U +#define DEP0CTL_MPS_32 1U +#define DEP0CTL_MPS_16 2U +#define DEP0CTL_MPS_8 3U +/** + * @} + */ + +/** @defgroup USB_LL_EP_Speed USB Low Layer EP Speed + * @{ + */ +#define EP_SPEED_LOW 0U +#define EP_SPEED_FULL 1U +#define EP_SPEED_HIGH 2U +/** + * @} + */ + +/** @defgroup USB_LL_EP_Type USB Low Layer EP Type + * @{ + */ +#define EP_TYPE_CTRL 0U +#define EP_TYPE_ISOC 1U +#define EP_TYPE_BULK 2U +#define EP_TYPE_INTR 3U +#define EP_TYPE_MSK 3U +/** + * @} + */ + +/** @defgroup USB_LL_STS_Defines USB Low Layer STS Defines + * @{ + */ +#define STS_GOUT_NAK 1U +#define STS_DATA_UPDT 2U +#define STS_XFER_COMP 3U +#define STS_SETUP_COMP 4U +#define STS_SETUP_UPDT 6U +/** + * @} + */ + +/** @defgroup USB_LL_HCFG_SPEED_Defines USB Low Layer HCFG Speed Defines + * @{ + */ +#define HCFG_60_MHZ 0U +#define HCFG_30_MHZ 1U + +#define HCFG_30_60_MHZ 0U +#define HCFG_48_MHZ 1U +#define HCFG_6_MHZ 2U + +/** + * @} + */ + +/** @defgroup USB_LL_HPRT0_PRTSPD_SPEED_Defines USB Low Layer HPRT0 PRTSPD Speed Defines + * @{ + */ +#define HPRT0_PRTSPD_HIGH_SPEED 0U +#define HPRT0_PRTSPD_FULL_SPEED 1U +#define HPRT0_PRTSPD_LOW_SPEED 2U +/** + * @} + */ + +#define HCCHAR_CTRL 0U +#define HCCHAR_ISOC 1U +#define HCCHAR_BULK 2U +#define HCCHAR_INTR 3U + +#define HC_PID_DATA0 0U +#define HC_PID_DATA2 1U +#define HC_PID_DATA1 2U +#define HC_PID_SETUP 3U + +#define GRXSTS_PKTSTS_IN 2U +#define GRXSTS_PKTSTS_IN_XFER_COMP 3U +#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5U +#define GRXSTS_PKTSTS_CH_HALTED 7U + +#define USBx_PCGCCTL *(__IO uint32_t *)((uint32_t)USBx_BASE + USB_OTG_PCGCCTL_BASE) +#define USBx_HPRT0 *(__IO uint32_t *)((uint32_t)USBx_BASE + USB_OTG_HOST_PORT_BASE) + +#define USBx_DEVICE ((USB_OTG_DeviceTypeDef *)(USBx_BASE + USB_OTG_DEVICE_BASE)) +#define USBx_INEP(i) ((USB_OTG_INEndpointTypeDef *)(USBx_BASE + USB_OTG_IN_ENDPOINT_BASE + ((i) * USB_OTG_EP_REG_SIZE))) +#define USBx_OUTEP(i) ((USB_OTG_OUTEndpointTypeDef *)(USBx_BASE + USB_OTG_OUT_ENDPOINT_BASE + ((i) * USB_OTG_EP_REG_SIZE))) +#define USBx_DFIFO(i) *(__IO uint32_t *)(USBx_BASE + USB_OTG_FIFO_BASE + ((i) * USB_OTG_FIFO_SIZE)) + +#define USBx_HOST ((USB_OTG_HostTypeDef *)(USBx_BASE + USB_OTG_HOST_BASE)) +#define USBx_HC(i) ((USB_OTG_HostChannelTypeDef *)(USBx_BASE + USB_OTG_HOST_CHANNEL_BASE + ((i) * USB_OTG_HOST_CHANNEL_SIZE))) + +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + +#define EP_ADDR_MSK 0xFU +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup USB_LL_Exported_Macros USB Low Layer Exported Macros + * @{ + */ +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +#define USB_MASK_INTERRUPT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->GINTMSK &= ~(__INTERRUPT__)) +#define USB_UNMASK_INTERRUPT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->GINTMSK |= (__INTERRUPT__)) + +#define CLEAR_IN_EP_INTR(__EPNUM__, __INTERRUPT__) (USBx_INEP(__EPNUM__)->DIEPINT = (__INTERRUPT__)) +#define CLEAR_OUT_EP_INTR(__EPNUM__, __INTERRUPT__) (USBx_OUTEP(__EPNUM__)->DOEPINT = (__INTERRUPT__)) +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup USB_LL_Exported_Functions USB Low Layer Exported Functions + * @{ + */ +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg); +HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg); +HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, uint32_t hclk, uint8_t speed); +HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx, USB_OTG_ModeTypeDef mode); +HAL_StatusTypeDef USB_SetDevSpeed(USB_OTG_GlobalTypeDef *USBx, uint8_t speed); +HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num); +HAL_StatusTypeDef USB_ActivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep, uint8_t dma); +HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep, uint8_t dma); +HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uint8_t ch_ep_num, uint16_t len, uint8_t dma); +void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len); +HAL_StatusTypeDef USB_EPSetStall(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_EPClearStall(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_SetDevAddress(USB_OTG_GlobalTypeDef *USBx, uint8_t address); +HAL_StatusTypeDef USB_DevConnect(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_DevDisconnect(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_ActivateSetup(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_EP0_OutStart(USB_OTG_GlobalTypeDef *USBx, uint8_t dma, uint8_t *psetup); +uint8_t USB_GetDevSpeed(USB_OTG_GlobalTypeDef *USBx); +uint32_t USB_GetMode(USB_OTG_GlobalTypeDef *USBx); +uint32_t USB_ReadInterrupts(USB_OTG_GlobalTypeDef *USBx); +uint32_t USB_ReadDevAllOutEpInterrupt(USB_OTG_GlobalTypeDef *USBx); +uint32_t USB_ReadDevOutEPInterrupt(USB_OTG_GlobalTypeDef *USBx, uint8_t epnum); +uint32_t USB_ReadDevAllInEpInterrupt(USB_OTG_GlobalTypeDef *USBx); +uint32_t USB_ReadDevInEPInterrupt(USB_OTG_GlobalTypeDef *USBx, uint8_t epnum); +void USB_ClearInterrupts(USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt); + +HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg); +HAL_StatusTypeDef USB_InitFSLSPClkSel(USB_OTG_GlobalTypeDef *USBx, uint8_t freq); +HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_DriveVbus(USB_OTG_GlobalTypeDef *USBx, uint8_t state); +uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef *USBx); +uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num, + uint8_t epnum, uint8_t dev_address, uint8_t speed, + uint8_t ep_type, uint16_t mps); +HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma); +uint32_t USB_HC_ReadInterrupt(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num); +HAL_StatusTypeDef USB_DoPing(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num); +HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_ActivateRemoteWakeup(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_DeActivateRemoteWakeup(USB_OTG_GlobalTypeDef *USBx); + +HAL_StatusTypeDef USBD_EP0_Send_Data(void *hpcd, uint8_t * data, uint16_t length); + +HAL_StatusTypeDef USBD_EPx_Receive_Zero_Packet(uint32_t base_address, uint32_t epnum); + +HAL_StatusTypeDef USBD_EPx_Send_Data(void *hpcd, uint32_t ep_num, uint8_t * data, uint16_t length); + +HAL_StatusTypeDef USBD_EPx_Send_Data_Ex(void *hpcd, uint32_t ep_num, uint32_t ep_max, uint8_t * data, uint16_t length); + +uint32_t USBD_EPx_Has_Receive_Data_Started(void * p_hpcd, uint32_t ep_num); + +uint32_t USBD_EPx_Host_Sent_Data_to_OutEP(void * p_hpcd, uint32_t ep_num); + +void USBD_EPx_Clear_Received_Data(void * p_hpcd, uint32_t ep_num); + +uint32_t USBD_EPx_Get_Out_EP_Error(void * p_hpcd, uint32_t ep_num); + +void USBD_EPx_Clear_Out_EP_Error(void * p_hpcd, uint32_t ep_num); + +uint8_t USB_GetIdStatus(USB_OTG_GlobalTypeDef *USBx); + +HAL_StatusTypeDef USB_SetTestMode(USB_OTG_GlobalTypeDef *USBx, uint32_t value); + +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + +#ifdef __cplusplus +} +#endif + + +#endif + +/************************ (C) COPYRIGHT Aisinochip *****END OF FILE****/ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal.h new file mode 100644 index 0000000000..9d1651e72f --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal.h @@ -0,0 +1,64 @@ +/****************************************************************************** +*@file : hal.h +*@brief : +******************************************************************************/ + +#ifndef __HAL_H +#define __HAL_H + +#include "rtdef.h" +#include "acm32h5xx_hal_conf.h" + +typedef struct +{ + uint32_t clktickLatest; + uint32_t mstickLatest; + uint32_t clkCount; + uint32_t msCount; +} HAL_DelayHandleTypeDef; + +typedef struct +{ + uint32_t intPrio; //жȼ + uint32_t freq; //ʱƵʣλ Hz + uint32_t period; //ʱ + uint32_t clkPerUs; //ÿ΢CLK + uint32_t clkPerMs; //ÿCLK + uint32_t msPeriod; //ÿڵ΢ + uint32_t usPer65536Clk; //65536 clk΢ +} HAL_SysTickHandleTypeDef; + +extern HAL_SysTickHandleTypeDef g_systickHandle; + + +HAL_StatusTypeDef HAL_Init(void); +HAL_StatusTypeDef HAL_DeInit(void); +void HAL_MspInit(void); +void HAL_MspDeInit(void); +HAL_StatusTypeDef HAL_InitTick(uint32_t intPrio, uint32_t msPeriod); +void HAL_IncTick(void); +#if 1 +extern rt_tick_t rt_tick_get(void); + +#define HAL_GetTick() rt_tick_get() +#define HAL_Delay(msDelay) rt_thread_mdelay(msDelay) +#else +uint32_t HAL_GetTick(void); +void HAL_Delay(uint32_t msDelay); +#endif +HAL_StatusTypeDef HAL_SetTickMsPeriod(int msPeriod); +uint32_t HAL_GetTickMsPeriod(void); +void HAL_SuspendTick(void); +void HAL_ResumeTick(void); +void HAL_DelayClks(uint32_t clks); +void HAL_DelayUs(uint32_t us); +void HAL_DelayMs(uint32_t ms); +void HAL_SimpleDelay(volatile uint32_t delay); +void HAL_StartDelay(HAL_DelayHandleTypeDef *hdelay); +void HAL_UpdateDelay(HAL_DelayHandleTypeDef *hdelay); +uint32_t HAL_GetClkDelay(HAL_DelayHandleTypeDef *hdelay); +uint32_t HAL_GetUsDelay(HAL_DelayHandleTypeDef *hdelay); +uint32_t HAL_GetMsDelay(HAL_DelayHandleTypeDef *hdelay); +void HAL_GetUID(uint32_t *UID); + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_adc.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_adc.h new file mode 100644 index 0000000000..ff9f2b25e9 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_adc.h @@ -0,0 +1,904 @@ +/****************************************************************************** +*@file : hal_adc.h +*@brief : Header file of ADC HAL module. +******************************************************************************/ +#ifndef __HAL_ADC_H__ +#define __HAL_ADC_H__ + + +#include "hal.h" + + +/** + * @brief ADC ExTigger structure definition + */ +typedef struct +{ + uint32_t ExTrigSel; /*!< Configures the regular channel trig mode. */ + + uint32_t JExTrigSel; /*!< Configures the inject channel trig mode. */ + +}ADC_ExTrigTypeDef; + +/** + * @brief ADC group regular oversampling structure definition + */ +typedef struct +{ + uint32_t Ratio; /*!< Configures the oversampling ratio. */ + + uint32_t RightBitShift; /*!< Configures the division coefficient for the Oversampler. */ + + uint32_t TriggeredMode; /*!< Selects the regular triggered oversampling mode. */ + +}ADC_OversamplingTypeDef; + + + + +/** + * @brief ADC Configuration Structure definition + */ +typedef struct +{ + uint32_t ClockSource; /*!< Specify the ADC clock source. */ + + uint32_t ClockPrescaler; /*!< Specify the ADC clock div from the PCLK. */ + + uint32_t Resolution; /*!< Configure the ADC resolution. */ + + uint32_t DataAlign; /*!< Specify ADC data alignment in conversion data register (right or left). */ + + FunctionalState ConConvMode; /*!< Specify whether the conversion is performed in single mode (one conversion) or continuous mode for + ADC group regular,after the first ADC conversion start trigger occurred (software start or external trigger). */ + FunctionalState DiscontinuousConvMode; /*!< Specifies whether the conversions sequence of regular group is performed in Complete-sequence/Discontinuous-sequence + (main sequence subdivided in successive parts).Discontinuous mode is used only if sequencer is enabled + (parameter 'ScanConvMode'). If sequencer is disabled, this parameter is discarded.Discontinuous mode can be enabled only + if continuous mode is disabled. If continuous mode is enabled, this parameter setting is discarded. */ + uint32_t NbrOfDiscConversion; /*!< Regular channel intermittent mode channel count. */ + + uint32_t ExternalTrigConv; /*!< Selects the external event used to trigger the conversion start of regular group. + If set to ADC_SOFTWARE_START, external triggers are disabled. + If set to external trigger source, triggering is on event rising edge by default. */ + uint32_t ExternalTrigConvEdge; /*!< Selects the external trigger edge of regular group. + If trigger is set to ADC_SOFTWARE_START, this parameter is discarded. */ + + uint32_t ChannelEn; /*!< Specify the enable ADC channels. */ + + + uint32_t DMAMode; /*!< Specify whether the DMA requests are performed in one shot mode (DMA transfer stops when number of conversions is reached) + or in continuous mode (DMA transfer unlimited, whatever number of conversions). */ + uint32_t OverMode; /*!< ADC_OVERMODE_DISABLE,ADC_OVERMODE_ENABLE */ + + uint32_t OverSampMode; /*!< Specify whether the oversampling feature is enabled or disabled. */ + + ADC_OversamplingTypeDef Oversampling; /*!< Specify ADC group regular oversampling structure. */ + + uint32_t AnalogWDGEn; + + + +}ADC_InitTypeDef; + + +typedef struct +{ + uint32_t Channel; /*!< Specify the channel to configure into ADC regular group. */ + + uint32_t Sq; /*!< Add or remove the channel from ADC regular group sequencer and specify its conversion rank. */ + + uint32_t Smp; /*!< Sampling time value to be set for the selected channel. */ + + uint32_t Diff; /*!< Select differential input.In differential mode: Differential measurement is carried out + between the selected channel 'i' (positive input) and channel 'i+1' (negative input). + Only channel 'i' has to be configured, channel 'i+1' is configured automatically. */ + uint32_t OffsetNumber; /*!< Select the offset number. */ + + uint32_t Offset; /*!< Define the offset to be applied on the raw converted data. + Offset value must be a positive number. */ + + uint32_t OffsetCalculate; /*!< Define if the offset should be substracted (negative sign) + or added (positive sign) from or to the raw converted data. */ + uint32_t Offsetsign; /*!< Define if the offset should be saturated upon under or over flow. */ + +}ADC_ChannelConfTypeDef; + +typedef struct +{ + uint32_t WatchdogMode; /*!< Configure the ADC analog watchdog mode: single/all/none channels. For Analog Watchdog 1: + Configure the ADC analog watchdog mode: single channel or all channels, ADC group regular. + For Analog Watchdog 2 and 3: Several channels can be monitored by applying successively the AWD init structure. */ + + uint32_t RegularChannel; /*!< Select the analog watchdog regular channe */ + + uint32_t InjectChannel; /*!< Select the analog watchdog inject channe */ + + uint32_t ITMode; /*!< Specify whether the analog watchdog is configured in interrupt or polling mode. */ + + uint32_t HighThreshold; /*!< Configure the ADC analog watchdog High threshold value. */ + + uint32_t LowThreshold; /*!< Configures the ADC analog watchdog Low threshold value. */ + + uint32_t Diff; /*!< Select differential input. */ + +}ADC_AnalogWDGConfTypeDef; + +/** + * @brief ADC Injected Conversion Oversampling structure definition + */ +typedef struct +{ + uint32_t Ratio; /*!< Configures the oversampling ratio. */ + + uint32_t RightBitShift; /*!< Configures the division coefficient for the Oversampler. */ + +} ADC_InjOversamplingTypeDef; + + +typedef struct +{ + uint32_t InjectedChannel; /*!< Selection of ADC channel to configure */ + + uint32_t InjectedRank; /*!< Rank in the injected group sequencer */ + + uint32_t InjectedSamplingTime; /*!< Sampling time value to be set for the selected channel. */ + + uint32_t InjectedDiff; /*!< Selection of differential input. */ + + uint32_t InjectedOffsetNumber; /*!< Selects the offset number. */ + + uint32_t InjectedOffset; /*!< Defines the offset to be applied on the raw converted data. */ + + uint32_t InjectedOffsetCalculate; /*!< Define if the offset should be substracted (negative sign) or added (positive sign) from or to the raw converted data. */ + + uint32_t InjectedOffsetSign; /*!< Define if the offset should be saturated upon under or over flow. */ + + uint32_t InjectedNbrOfConversion; /*!< Specifies the number of ranks that will be converted within the injected group sequencer. */ + + FunctionalState InjectedDiscontinuousConvMode; /*!< Specifies whether the conversions sequence of injected group is performed in Complete-sequence/Discontinuous-sequence (main sequence subdivided in successive parts). + Discontinuous mode is used only if sequencer is enabled (parameter 'ScanConvMode'). If sequencer is disabled, this parameter is discarded. + Discontinuous mode can be enabled only if continuous mode is disabled. If continuous mode is enabled, this parameter setting is discarded. */ + FunctionalState AutoInjectedConv; /*!< Enables or disables the selected ADC automatic injected group conversion after regular one */ + + uint32_t ExternalTrigInjecConv; /*!< Selects the external event used to trigger the conversion start of injected group. + If set to ADC_INJECTED_SOFTWARE_START, external triggers are disabled. + If set to external trigger source, triggering is on event rising edge. */ + uint32_t ExternalTrigInjecConvEdge; /*!< Selects the external trigger edge of injected group. */ + + FunctionalState InjecOversamplingMode; /*!< Specifies whether the oversampling feature is enabled or disabled. */ + + ADC_InjOversamplingTypeDef InjecOversampling; /*!< Specifies the Oversampling parameters. */ + +}ADC_InjectionConfTypeDef; + +/** + * @brief ADC Configuration multi-mode structure definition + */ +typedef struct +{ + uint32_t Mode; /*!< Configures the ADC to operate in independent or multi mode. */ + + uint32_t DMAAccessMode; /*!< Configures the Direct memory access mode for multi ADC mode. */ + + uint32_t TwoSamplingDelay; /*!< Configures the Delay between 2 sampling phases. */ + +}ADC_MultiModeTypeDef; + +/** + * @brief ADC handle Structure definition + */ +typedef struct __ADC_HandleTypeDef +{ + ADC_TypeDef *Instance; /*!< Register base address */ + + ADC_InitTypeDef Init; /*!< ADC initialization parameters and regular conversions setting */ +#ifdef HAL_DMA_MODULE_ENABLED + DMA_HandleTypeDef *DMA_Handle; /*!< Pointer DMA Handler */ +#endif + uint32_t ChannelNum; /*!< Total enable regular group channel number*/ + + uint32_t *AdcResults; /*!< Point to the convert results*/ + + void (*ConvCpltCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC conversion complete callback */ + + void (*GroupCpltCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC regular group conversion complete callback */ + + void (*InjectedConvCpltCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC injected conversion complete callback */ + + void (*InjectedGroupConvCpltCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC injected Group conversion complete callback */ + + void (*LevelOutOfWindowCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC analog watchdog callback */ + +}ADC_HandleTypeDef; + + +/** @defgroup ADC1/ADC2/ADC3 + * @{ + */ +#define IS_ADC_INSTANCE(INSTANCE) (((INSTANCE) == ADC1) || ((INSTANCE) == ADC2) || ((INSTANCE) == ADC3)) +/** + * @} + */ + +/** @defgroup ADC Trig source define + * @{ + */ +/* | Trig Source | Regular | Inject | * + * | ADC_EXTERNAL_TIG0 | TIM1_CC1 | TIM1_TRGO | * + * | ADC_EXTERNAL_TIG1 | TIM1_CC2 | TIM1_CC4 | * + * | ADC_EXTERNAL_TIG2 | TIM1_CC3 | TIM2_TRGO | * + * | ADC_EXTERNAL_TIG3 | TIM2_CC2 | TIM2_CC1 | * + * | ADC_EXTERNAL_TIG4 | TIM3_TRGO | TIM3_CC4 | * + * | ADC_EXTERNAL_TIG5 | TIM4_CC4 | TIM4_TRGO | * + * | ADC_EXTERNAL_TIG6 | EXTI Line 11 | EXTI Line 15 | * + * | ADC_EXTERNAL_TIG7 | TIM8_TRGO | TIM8_CC4 | * + * | ADC_EXTERNAL_TIG8 | TIM8_TRGO2 | TIM1_TRGO2 | * + * | ADC_EXTERNAL_TIG9 | TIM1_TRGO | TIM8_TRGO | * + * | ADC_EXTERNAL_TIG10 | TIM1_TRGO2 | TIM8_TRGO2 | * + * | ADC_EXTERNAL_TIG11 | TIM2_TRGO | TIM3_CC3 | * + * | ADC_EXTERNAL_TIG12 | TIM4_TRGO | TIM3_TRGO | * + * | ADC_EXTERNAL_TIG13 | TIM6_TRGO | TIM3_CC1 | * + * | ADC_EXTERNAL_TIG14 | TIM15_TRGO | TIM6_TRGO | * + * | ADC_EXTERNAL_TIG15 | TIM3_CC4 | TIM15_TRGO | * + * | ADC_EXTERNAL_TIG16 | | | * + * | ADC_EXTERNAL_TIG17 | | | * + * | ADC_EXTERNAL_TIG18 | LPTIM1_OUT | LPTIM1_OUT | * + * | ADC_EXTERNAL_TIG19 | LPTIM2_OUT | LPTIM2_OUT | * + * | ADC_EXTERNAL_TIG20 | LPTIM3_OUT | LPTIM3_OUT | */ +#define ADC_EXTERNAL_TIG0 (0U) +#define ADC_EXTERNAL_TIG1 (1U) +#define ADC_EXTERNAL_TIG2 (2U) +#define ADC_EXTERNAL_TIG3 (3U) +#define ADC_EXTERNAL_TIG4 (4U) +#define ADC_EXTERNAL_TIG5 (5U) +#define ADC_EXTERNAL_TIG6 (6U) +#define ADC_EXTERNAL_TIG7 (7U) +#define ADC_EXTERNAL_TIG8 (8U) +#define ADC_EXTERNAL_TIG9 (9U) +#define ADC_EXTERNAL_TIG10 (10U) +#define ADC_EXTERNAL_TIG11 (11U) +#define ADC_EXTERNAL_TIG12 (12U) +#define ADC_EXTERNAL_TIG13 (13U) +#define ADC_EXTERNAL_TIG14 (14U) +#define ADC_EXTERNAL_TIG15 (15U) +#define ADC_EXTERNAL_TIG16 (16U) +#define ADC_EXTERNAL_TIG17 (17U) +#define ADC_EXTERNAL_TIG18 (18U) +#define ADC_EXTERNAL_TIG19 (19U) +#define ADC_EXTERNAL_TIG20 (20U) +#define ADC_SOFTWARE_START (32U) +#define IS_ADC_EXT_TRIG(REGTRIG) (((REGTRIG) == ADC_EXTERNAL_TIG0) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG1) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG2) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG3) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG4) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG5) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG6) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG7) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG8) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG9) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG10) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG11) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG12) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG13) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG14) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG15) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG16) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG17) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG18) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG19) || \ + ((REGTRIG) == ADC_EXTERNAL_TIG20) || \ + ((REGTRIG) == ADC_SOFTWARE_START)) + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup ADC External Trigger Edge + * @{ + */ +#define ADC_EXTERNALTRIGCONVEDGE_NONE (0U) +#define ADC_EXTERNALTRIGCONVEDGE_RISING (1U) +#define ADC_EXTERNALTRIGCONVEDGE_FALLING (2U) +#define ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING (3U) +#define IS_ADC_EXT_TRIG_EDGE(EDGE) (((EDGE) == ADC_EXTERNALTRIGCONVEDGE_NONE) || \ + ((EDGE) == ADC_EXTERNALTRIGCONVEDGE_RISING) || \ + ((EDGE) == ADC_EXTERNALTRIGCONVEDGE_FALLING) || \ + ((EDGE) == ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING)) +/** + * @} + */ + +/** @defgroup ADC Data Align +* @{ +*/ +#define ADC_DATAALIGN_RIGHT (0x00U) +#define ADC_DATAALIGN_LEFT ((uint32_t)ADC_CR2_ALIGN) +#define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DATAALIGN_RIGHT) || ((ALIGN) == ADC_DATAALIGN_LEFT)) +/** + * @} + */ + +/** @defgroup ADC Continuous +* @{ +*/ +#define ADC_CONT_DISABLE (0x00U) +#define ADC_CONT_ENABLE ((uint32_t)ADC_CR1_CONT) +#define IS_ADC_CONT(CONT) (((CONT) == ADC_CONT_DISABLE) || ((CONT) == ADC_CONT_ENABLE)) +/** + * @} + */ + +/** @defgroup ADC Resolution + * @{ + */ +#define ADC_RESOLUTION_12B (0x00U) /*!< ADC resolution 12 bits */ +#define ADC_RESOLUTION_10B (ADC_CR2_RES_0) /*!< ADC resolution 10 bits */ +#define ADC_RESOLUTION_8B (ADC_CR2_RES_1) /*!< ADC resolution 8 bits */ +#define ADC_RESOLUTION_6B (ADC_CR2_RES_0 | ADC_CR2_RES_1) /*!< ADC resolution 6 bits */ +#define IS_ADC_RESOLUTION(RESOLUTION) (((RESOLUTION) == ADC_RESOLUTION_12B) || \ + ((RESOLUTION) == ADC_RESOLUTION_10B) || \ + ((RESOLUTION) == ADC_RESOLUTION_8B) || \ + ((RESOLUTION) == ADC_RESOLUTION_6B)) +/** + * @} + */ + +/** @defgroup ADC ClockPrescale + * @{ + */ +#define IS_ADC_CLOCKDIV(CLOCKDIV) (((CLOCKDIV) >= 0x01) && ((CLOCKDIV) <= 0x40)) + +/** + * @} + */ + +/** @defgroup ADC ClockSource + * @{ + */ +#define ADC_CLOCKSOURCE_HCLK (0x00U) +#define ADC_CLOCKSOURCE_PLL3PCLK ((uint32_t)ADC_CCR_CLKMODE) +#define IS_ADC_CLOCKSOURCE(SOURCE) (((SOURCE) == ADC_CLOCKSOURCE_HCLK) || ((SOURCE) == ADC_CLOCKSOURCE_PLL3PCLK)) + +/** + * @} + */ + +/** @defgroup Multimode + * @{ + */ +#define ADC_MODE_INDEPENDENT (0x00U) /*!< ADC dual mode disabled (ADC independent mode) */ +#define ADC_DUALMODE_REGSIMULT_INJECSIMULT (ADC_CCR_DUALMOD_0) /*!< ADC dual mode enabled: Combined group regular simultaneous + group injected simultaneous */ +#define ADC_DUALMODE_REGSIMULT_ALTERTRIG (ADC_CCR_DUALMOD_1) /*!< ADC dual mode enabled: Combined group regular simultaneous + group injected alternate trigger */ +#define ADC_DUALMODE_REGINTERL_INJECSIMULT (ADC_CCR_DUALMOD_0 | ADC_CCR_DUALMOD_1) /*!< ADC dual mode enabled: Combined group regular interleaved + group injected simultaneous */ +#define ADC_DUALMODE_INJECSIMULT (ADC_CCR_DUALMOD_0 | ADC_CCR_DUALMOD_2) /*!< ADC dual mode enabled: group injected simultaneous */ +#define ADC_DUALMODE_REGSIMULT (ADC_CCR_DUALMOD_1 | ADC_CCR_DUALMOD_2) /*!< ADC dual mode enabled: group regular simultaneous */ +#define ADC_DUALMODE_INTERL (ADC_CCR_DUALMOD_0 | ADC_CCR_DUALMOD_1 | ADC_CCR_DUALMOD_2) /*!< ADC dual mode enabled: Combined group regular interleaved */ +#define ADC_DUALMODE_ALTERTRIG (ADC_CCR_DUALMOD_0 | ADC_CCR_DUALMOD_3) /*!< ADC dual mode enabled: group injected alternate trigger. Works only with external triggers (not internal SW start) */ +#define IS_ADC_MODE(MODE) (((MODE) == ADC_MODE_INDEPENDENT) || \ + ((MODE) == ADC_DUALMODE_REGSIMULT_INJECSIMULT) || \ + ((MODE) == ADC_DUALMODE_REGSIMULT_ALTERTRIG) || \ + ((MODE) == ADC_DUALMODE_REGINTERL_INJECSIMULT) || \ + ((MODE) == ADC_DUALMODE_INJECSIMULT) || \ + ((MODE) == ADC_DUALMODE_REGSIMULT) || \ + ((MODE) == ADC_DUALMODE_INTERL) || \ + ((MODE) == ADC_DUALMODE_ALTERTRIG)) +/** + * @} + */ + +/** @defgroup DMA transfer mode depending on ADC resolution + * @{ + */ +#define ADC_DMAACCESSMODE_DISABLED (0x00U) /*!< DMA multimode disabled: each ADC uses its own DMA channel */ +#define ADC_DMAACCESSMODE_12_10_BITS (ADC_CCR_DMADUAL_1) /*!< DMA multimode enabled (one DMA channel for both ADC, DMA of ADC master) for 12 and 10 bits resolution */ +#define ADC_DMAACCESSMODE_8_6_BITS (ADC_CCR_DMADUAL_0 | ADC_CCR_DMADUAL_1) /*!< DMA multimode enabled (one DMA channel for both ADC, DMA of ADC master) for 8 and 6 bits resolution */ +#define IS_ADC_DMA_ACCESS_MODE(MODE) (((MODE) == ADC_DMAACCESSMODE_DISABLED) || \ + ((MODE) == ADC_DMAACCESSMODE_12_10_BITS) || \ + ((MODE) == ADC_DMAACCESSMODE_8_6_BITS)) +/** + * @} + */ + +/** @defgroup ADC Delay Between 2 Sampling Phases + * @{ + */ +#define ADC_TWOSAMPLINGDELAY_5CYCLES (0x00U) +#define ADC_TWOSAMPLINGDELAY_6CYCLES (ADC_CCR_DELAY_0) +#define ADC_TWOSAMPLINGDELAY_7CYCLES (ADC_CCR_DELAY_1) +#define ADC_TWOSAMPLINGDELAY_8CYCLES (ADC_CCR_DELAY_0 | ADC_CCR_DELAY_1) +#define ADC_TWOSAMPLINGDELAY_9CYCLES (ADC_CCR_DELAY_2) +#define ADC_TWOSAMPLINGDELAY_10CYCLES (ADC_CCR_DELAY_0 | ADC_CCR_DELAY_2) +#define ADC_TWOSAMPLINGDELAY_11CYCLES (ADC_CCR_DELAY_1 | ADC_CCR_DELAY_2) +#define ADC_TWOSAMPLINGDELAY_12CYCLES (ADC_CCR_DELAY_0 | ADC_CCR_DELAY_1 | ADC_CCR_DELAY_2) +#define ADC_TWOSAMPLINGDELAY_13CYCLES (ADC_CCR_DELAY_3) +#define ADC_TWOSAMPLINGDELAY_14CYCLES (ADC_CCR_DELAY_0 | ADC_CCR_DELAY_3) +#define ADC_TWOSAMPLINGDELAY_15CYCLES (ADC_CCR_DELAY_1 | ADC_CCR_DELAY_3) +#define ADC_TWOSAMPLINGDELAY_16CYCLES (ADC_CCR_DELAY_0 | ADC_CCR_DELAY_1 | ADC_CCR_DELAY_3) +#define ADC_TWOSAMPLINGDELAY_17CYCLES (ADC_CCR_DELAY_2 | ADC_CCR_DELAY_3) +#define ADC_TWOSAMPLINGDELAY_18CYCLES (ADC_CCR_DELAY_0 | ADC_CCR_DELAY_2 | ADC_CCR_DELAY_3) +#define ADC_TWOSAMPLINGDELAY_19CYCLES (ADC_CCR_DELAY_1 | ADC_CCR_DELAY_2 | ADC_CCR_DELAY_3) +#define ADC_TWOSAMPLINGDELAY_20CYCLES (ADC_CCR_DELAY_0 | ADC_CCR_DELAY_1 | ADC_CCR_DELAY_2 | ADC_CCR_DELAY_3) +#define IS_ADC_SAMPLING_DELAY(DELAY) (((DELAY) == ADC_TWOSAMPLINGDELAY_5CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_6CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_7CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_8CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_9CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_10CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_11CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_12CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_13CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_14CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_15CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_16CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_17CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_18CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_19CYCLES) || \ + ((DELAY) == ADC_TWOSAMPLINGDELAY_20CYCLES)) + +/** + * @} + */ + + +/** @defgroup ADC analog watchdog selection + * @{ + */ +#define ADC_ANALOGWATCHDOG_RCH_SINGLE (ADC_CR1_AWDSGL | ADC_CR1_AWDEN) //Single regular channel +#define ADC_ANALOGWATCHDOG_JCH_SINGLE (ADC_CR1_AWDSGL | ADC_CR1_JAWDEN) //Single Inject channel +#define ADC_ANALOGWATCHDOG_RCH_OR_JCH_SINGLE (ADC_CR1_AWDSGL | ADC_CR1_AWDEN | ADC_CR1_JAWDEN) //Regular or inject channel +#define ADC_ANALOGWATCHDOG_RCH_ALL (ADC_CR1_AWDEN) //All regular channels +#define ADC_ANALOGWATCHDOG_JCH_ALL (ADC_CR1_JAWDEN) //All inject channels +#define ADC_ANALOGWATCHDOG_RCH_AND_JCH_ALL (ADC_CR1_AWDEN | ADC_CR1_JAWDEN) //All regular and inject channels +#define ADC_ANALOGWATCHDOG_NONE (0x00U) +#define IS_ADC_ANALOG_WATCHDOG(WATCHDOG) (((WATCHDOG) == ADC_ANALOGWATCHDOG_RCH_SINGLE) || \ + ((WATCHDOG) == ADC_ANALOGWATCHDOG_JCH_SINGLE) || \ + ((WATCHDOG) == ADC_ANALOGWATCHDOG_RCH_OR_JCH_SINGLE) || \ + ((WATCHDOG) == ADC_ANALOGWATCHDOG_RCH_ALL) || \ + ((WATCHDOG) == ADC_ANALOGWATCHDOG_JCH_ALL) || \ + ((WATCHDOG) == ADC_ANALOGWATCHDOG_RCH_AND_JCH_ALL) || \ + ((WATCHDOG) == ADC_ANALOGWATCHDOG_NONE)) +/** + * @} + */ + +/** @defgroup ADC analog watchdog thresholds + * @{ + */ +#define IS_ADC_THRESHOLD(THRESHOLD) ((THRESHOLD) <= 0xFFF) +/** + * @} + */ + +/** @defgroup ADC channel number +* @{ +*/ +#define ADC_CHANNEL_0 (0U) +#define ADC_CHANNEL_1 (1U) +#define ADC_CHANNEL_2 (2U) +#define ADC_CHANNEL_3 (3U) +#define ADC_CHANNEL_4 (4U) +#define ADC_CHANNEL_5 (5U) +#define ADC_CHANNEL_6 (6U) +#define ADC_CHANNEL_7 (7U) +#define ADC_CHANNEL_8 (8U) +#define ADC_CHANNEL_9 (9U) +#define ADC_CHANNEL_10 (10U) +#define ADC_CHANNEL_11 (11U) +#define ADC_CHANNEL_12 (12U) +#define ADC_CHANNEL_13 (13U) +#define ADC_CHANNEL_14 (14U) +#define ADC_CHANNEL_15 (15U) +#define ADC_CHANNEL_16 (16U) +#define ADC_CHANNEL_17 (17U) +#define ADC_CHANNEL_18 (18U) +#define ADC_CHANNEL_19 (19U) +#define ADC_CHANNEL_VREF (13U) +#define ADC_CHANNEL_VBAT (17U) +#define ADC_CHANNEL_TEMP (18U) +#define ADC_CHANNEL_0_EN (1U << ADC_CHANNEL_0) +#define ADC_CHANNEL_1_EN (1U << ADC_CHANNEL_1) +#define ADC_CHANNEL_2_EN (1U << ADC_CHANNEL_2) +#define ADC_CHANNEL_3_EN (1U << ADC_CHANNEL_3) +#define ADC_CHANNEL_4_EN (1U << ADC_CHANNEL_4) +#define ADC_CHANNEL_5_EN (1U << ADC_CHANNEL_5) +#define ADC_CHANNEL_6_EN (1U << ADC_CHANNEL_5) +#define ADC_CHANNEL_7_EN (1U << ADC_CHANNEL_5) +#define ADC_CHANNEL_8_EN (1U << ADC_CHANNEL_8) +#define ADC_CHANNEL_9_EN (1U << ADC_CHANNEL_9) +#define ADC_CHANNEL_10_EN (1U << ADC_CHANNEL_10) +#define ADC_CHANNEL_11_EN (1U << ADC_CHANNEL_11) +#define ADC_CHANNEL_12_EN (1U << ADC_CHANNEL_12) +#define ADC_CHANNEL_13_EN (1U << ADC_CHANNEL_13) +#define ADC_CHANNEL_14_EN (1U << ADC_CHANNEL_14) +#define ADC_CHANNEL_15_EN (1U << ADC_CHANNEL_15) +#define ADC_CHANNEL_16_EN (1U << ADC_CHANNEL_16) +#define ADC_CHANNEL_17_EN (1U << ADC_CHANNEL_17) +#define ADC_CHANNEL_18_EN (1U << ADC_CHANNEL_18) +#define ADC_CHANNEL_19_EN (1U << ADC_CHANNEL_19) +#define ADC_CHANNEL_VREF_EN (1U << ADC_CHANNEL_VREF) +#define ADC_CHANNEL_VBAT_EN (1U << ADC_CHANNEL_VBAT) +#define ADC_CHANNEL_TEMP_EN (1U << ADC_CHANNEL_TEMP) +#define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) == ADC_CHANNEL_0) || \ + ((CHANNEL) == ADC_CHANNEL_1) || \ + ((CHANNEL) == ADC_CHANNEL_2) || \ + ((CHANNEL) == ADC_CHANNEL_3) || \ + ((CHANNEL) == ADC_CHANNEL_4) || \ + ((CHANNEL) == ADC_CHANNEL_5) || \ + ((CHANNEL) == ADC_CHANNEL_6) || \ + ((CHANNEL) == ADC_CHANNEL_7) || \ + ((CHANNEL) == ADC_CHANNEL_8) || \ + ((CHANNEL) == ADC_CHANNEL_9) || \ + ((CHANNEL) == ADC_CHANNEL_10) || \ + ((CHANNEL) == ADC_CHANNEL_11) || \ + ((CHANNEL) == ADC_CHANNEL_12) || \ + ((CHANNEL) == ADC_CHANNEL_13) || \ + ((CHANNEL) == ADC_CHANNEL_14) || \ + ((CHANNEL) == ADC_CHANNEL_15) || \ + ((CHANNEL) == ADC_CHANNEL_16) || \ + ((CHANNEL) == ADC_CHANNEL_17) || \ + ((CHANNEL) == ADC_CHANNEL_18) || \ + ((CHANNEL) == ADC_CHANNEL_19) || \ + ((CHANNEL) < 32)) + +/** + * @} + */ + +/** @defgroup Sampling time + * @{ + */ +#define ADC_SMP_CLOCK_3 (0U) +#define ADC_SMP_CLOCK_5 (1U) +#define ADC_SMP_CLOCK_7 (2U) +#define ADC_SMP_CLOCK_10 (3U) +#define ADC_SMP_CLOCK_13 (4U) +#define ADC_SMP_CLOCK_16 (5U) +#define ADC_SMP_CLOCK_20 (6U) +#define ADC_SMP_CLOCK_30 (7U) +#define ADC_SMP_CLOCK_60 (8U) +#define ADC_SMP_CLOCK_80 (9U) +#define ADC_SMP_CLOCK_100 (10U) +#define ADC_SMP_CLOCK_120 (11U) +#define ADC_SMP_CLOCK_160 (12U) +#define ADC_SMP_CLOCK_260 (13U) +#define ADC_SMP_CLOCK_320 (14U) +#define ADC_SMP_CLOCK_640 (15U) +#define IS_ADC_SMPCLOCK(SMPCLOCK) (((SMPCLOCK) == ADC_SMP_CLOCK_3) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_5) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_7) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_10) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_13) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_16) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_20) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_30) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_60) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_80) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_100) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_120) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_160) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_260) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_320) || \ + ((SMPCLOCK) == ADC_SMP_CLOCK_640)) +/** + * @} + */ + +/** @defgroup ADC sequence number +* @{ +*/ +#define ADC_SEQUENCE_SQ1 (1U) +#define ADC_SEQUENCE_SQ2 (2U) +#define ADC_SEQUENCE_SQ3 (3U) +#define ADC_SEQUENCE_SQ4 (4U) +#define ADC_SEQUENCE_SQ5 (5U) +#define ADC_SEQUENCE_SQ6 (6U) +#define ADC_SEQUENCE_SQ7 (7U) +#define ADC_SEQUENCE_SQ8 (8U) +#define ADC_SEQUENCE_SQ9 (9U) +#define ADC_SEQUENCE_SQ10 (10U) +#define ADC_SEQUENCE_SQ11 (11U) +#define ADC_SEQUENCE_SQ12 (12U) +#define ADC_SEQUENCE_SQ13 (13U) +#define ADC_SEQUENCE_SQ14 (14U) +#define ADC_SEQUENCE_SQ15 (15U) +#define ADC_SEQUENCE_SQ16 (16U) +#define IS_ADC_SEQUENCE(SEQUENCE) (((SEQUENCE) == ADC_SEQUENCE_SQ1) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ2) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ3) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ4) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ5) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ6) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ7) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ8) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ9) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ10) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ11) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ12) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ13) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ14) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ15) || \ + ((SEQUENCE) == ADC_SEQUENCE_SQ16)) +/** + * @} + */ + +/** @defgroup ADC regular length + * @{ + */ +#define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= 0x01) && ((LENGTH) <= 0x10)) +/** + * @} + */ + +/** @defgroup ADC regular discontinuous mode number + * @{ + */ +#define IS_ADC_REGULAR_DISC_NUMBER(NUMBER) ((NUMBER) <= 0x8) +/** + * @} + */ + +/** @defgroup ADC injected rank + * @{ + */ +#define ADC_INJECTED_RANK_1 (1U) +#define ADC_INJECTED_RANK_2 (2U) +#define ADC_INJECTED_RANK_3 (3U) +#define ADC_INJECTED_RANK_4 (4U) +#define IS_ADC_INJECTED_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x4)) +/** + * @} + */ + +/** @defgroup ADC injected length + * @{ + */ +#define IS_ADC_INJECTED_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x4)) +/** + * @} + */ + +/** @defgroup Offset Number + * @{ + */ +#define ADC_OFR_1 (0U) /*!< ADC offset number 1: ADC_OFR1 */ +#define ADC_OFR_2 (1U) /*!< ADC offset number 2: ADC_OFR2 */ +#define ADC_OFR_3 (2U) /*!< ADC offset number 3: ADC_OFR3 */ +#define ADC_OFR_4 (3U) /*!< ADC offset number 4: ADC_OFR4 */ +#define ADC_OFR_NONE (4U) /*!< ADC offset disabled: no offset correction for the selected ADC channel */ +#define IS_ADC_OFFSET_NUMBER(NUMBER) (((NUMBER) < 0x5)) +/** + * @} + */ + +/** @defgroup offset + * @{ + */ +#define IS_ADC_OFFSET(OFFSET) ((OFFSET) <= 0xFFF) +/** + * @} + */ + + /** @defgroup Offset Calculate + * @{ + */ +#define ADC_OFFSET_MINUS (0x00000000UL) /*!< ADC conversion result minus offset */ +#define ADC_OFFSET_PLUS (ADC_OFRX_OFFSETY_POS) /*!< ADC conversion result plus offset */ +#define IS_ADC_OFFSET_CALCULATE(CALCULATE) (((CALCULATE) == ADC_OFFSET_MINUS) || ((CALCULATE) == ADC_OFFSET_PLUS)) +/** + * @} + */ + + +/** @defgroup Offset sign + * @{ + */ +#define ADC_OFFSET_SIGN_SIGNED (0x00000000UL) /*!< The calculation result is a signed number */ +#define ADC_OFFSET_SIGN_UNSIGNED (ADC_OFRX_OFFSETY_SAT) /*!< The calculation result is an unsigned number */ +#define IS_ADC_OFFSET_SIGN(SIGN) (((SIGN) == ADC_OFFSET_SIGN_SIGNED) || ((SIGN) == ADC_OFFSET_SIGN_UNSIGNED)) +/** + * @} + */ + +/** @defgroup JDR Number + * @{ + */ +#define ADC_JDR_1 (0U) /*!< ADC JDR number 1: ADC_JDR1 */ +#define ADC_JDR_2 (1U) /*!< ADC JDR number 2: ADC_JDR2 */ +#define ADC_JDR_3 (2U) /*!< ADC JDR number 3: ADC_JDR3 */ +#define ADC_JDR_4 (3U) /*!< ADC JDR number 4: ADC_JDR4 */ +#define ADC_JDR_NONE (4U) /*!< none */ +#define IS_ADC_JDR_NUMBER(NUMBER) ((NUMBER) < 0x5) +/** + * @} + */ + +/** @defgroup Oversampling Data shift + * @{ + */ +#define ADC_RIGHTBITSHIFT_NONE (0U) /*!< ADC oversampling no shift (sum of the ADC conversions data is not divided */ +#define ADC_RIGHTBITSHIFT_1 (1U) /*!< ADC oversampling shift of 1 (sum of the ADC conversions data is divided by 2 */ +#define ADC_RIGHTBITSHIFT_2 (2U) /*!< ADC oversampling shift of 2 (sum of the ADC conversions data is divided by 4 */ +#define ADC_RIGHTBITSHIFT_3 (3U) /*!< ADC oversampling shift of 3 (sum of the ADC conversions data is divided by 8 */ +#define ADC_RIGHTBITSHIFT_4 (4U) /*!< ADC oversampling shift of 4 (sum of the ADC conversions data is divided by 16 */ +#define ADC_RIGHTBITSHIFT_5 (5U) /*!< ADC oversampling shift of 5 (sum of the ADC conversions data is divided by 32 */ +#define ADC_RIGHTBITSHIFT_6 (6U) /*!< ADC oversampling shift of 6 (sum of the ADC conversions data is divided by 64 */ +#define ADC_RIGHTBITSHIFT_7 (7U) /*!< ADC oversampling shift of 7 (sum of the ADC conversions data is divided by 128 */ +#define ADC_RIGHTBITSHIFT_8 (8U) /*!< ADC oversampling shift of 8 (sum of the ADC conversions data is divided by 256 */ +#define IS_ADC_RIGHTBITSHIFT(SHIFT) (((SHIFT) == ADC_RIGHTBITSHIFT_NONE) || \ + ((SHIFT) == ADC_RIGHTBITSHIFT_1) || \ + ((SHIFT) == ADC_RIGHTBITSHIFT_2) || \ + ((SHIFT) == ADC_RIGHTBITSHIFT_3) || \ + ((SHIFT) == ADC_RIGHTBITSHIFT_4) || \ + ((SHIFT) == ADC_RIGHTBITSHIFT_5) || \ + ((SHIFT) == ADC_RIGHTBITSHIFT_6) || \ + ((SHIFT) == ADC_RIGHTBITSHIFT_7) || \ + ((SHIFT) == ADC_RIGHTBITSHIFT_8)) +/** + * @} + */ + +/** @defgroup Oversampling Ratio + * @{ + */ +#define ADC_OVERSAMPLING_RATIO_2 (0U) /*!< ADC oversampling ratio of 2 (2 ADC conversions are performed */ +#define ADC_OVERSAMPLING_RATIO_4 (1U) /*!< ADC oversampling ratio of 4 (4 ADC conversions are performed */ +#define ADC_OVERSAMPLING_RATIO_8 (2U) /*!< ADC oversampling ratio of 8 (8 ADC conversions are performed */ +#define ADC_OVERSAMPLING_RATIO_16 (3U) /*!< ADC oversampling ratio of 16 (16 ADC conversions are performed */ +#define ADC_OVERSAMPLING_RATIO_32 (4U) /*!< ADC oversampling ratio of 32 (32 ADC conversions are performed */ +#define ADC_OVERSAMPLING_RATIO_64 (5U) /*!< ADC oversampling ratio of 64 (64 ADC conversions are performed */ +#define ADC_OVERSAMPLING_RATIO_128 (6U) /*!< ADC oversampling ratio of 128 (128 ADC conversions are performed */ +#define ADC_OVERSAMPLING_RATIO_256 (7U) /*!< ADC oversampling ratio of 256 (256 ADC conversions are performed */ +#define IS_ADC_OVERSAMPLING_RATIO(RATIO) (((RATIO) == ADC_OVERSAMPLING_RATIO_2) || \ + ((RATIO) == ADC_OVERSAMPLING_RATIO_4) || \ + ((RATIO) == ADC_OVERSAMPLING_RATIO_8) || \ + ((RATIO) == ADC_OVERSAMPLING_RATIO_16) || \ + ((RATIO) == ADC_OVERSAMPLING_RATIO_32) || \ + ((RATIO) == ADC_OVERSAMPLING_RATIO_64) || \ + ((RATIO) == ADC_OVERSAMPLING_RATIO_128) || \ + ((RATIO) == ADC_OVERSAMPLING_RATIO_256)) +/** + * @} + */ + +/** @defgroup overflow mode + * @{ + */ +#define ADC_OVERFLOWMODE_LAST (0x00000000UL) /*!< ADC keeps the last sampling data when overflow occurs */ +#define ADC_OVERFLOWMODE_NEW (ADC_CR2_OVRMOD) /*!< ADC saves the new sampling data when overflow occurs */ +#define IS_ADC_OVERFLOW_MODE(MODE) (((MODE) == ADC_OVERFLOWMODE_LAST) || ((MODE) == ADC_OVERFLOWMODE_NEW)) +/** + * @} + */ + +/** @defgroup oversampling triger mode + * @{ + */ +#define ADC_OVERSAMPLING_TRIGER_MORE (0x00000000UL) /*!< One trigger for N ADC conversion */ +#define ADC_OVERSAMPLING_TRIGER_ONCE (ADC_CR2_TROVS) /*!< One trigger for ADC conversion */ +#define IS_ADC_OVERSAMPLING_TRIGER(MODE) (((MODE) == ADC_OVERSAMPLING_TRIGER_MORE) || ((MODE) == ADC_OVERSAMPLING_TRIGER_ONCE)) +/** + * @} + */ + +/** @defgroup ADC interrupts and flag definition + * @{ + */ +#define ADC_FLAG_ADRDY (ADC_SR_ADRDY) +#define ADC_IT_FLAG_EOSMP (ADC_SR_EOSMP) +#define ADC_IT_FLAG_EOC (ADC_SR_EOC) +#define ADC_IT_FLAG_EOG (ADC_SR_EOG) +#define ADC_IT_FLAG_OVERF (ADC_SR_OVERF) +#define ADC_IT_FLAG_JEOC (ADC_SR_JEOC) +#define ADC_IT_FLAG_JEOG (ADC_SR_JEOG) +#define ADC_IT_FLAG_AWD (ADC_SR_AWD) +#define ADC_IT_FLAG_ALL (0x000000FFUL) +#define IS_ADC_IT_FLAG(FLAG) (((FLAG) == ADC_IT_FLAG_EOSMP) || ((FLAG) == ADC_IT_FLAG_EOC) || \ + ((FLAG) == ADC_IT_FLAG_EOG)|| ((FLAG) == ADC_IT_FLAG_OVERF) || \ + ((FLAG) == ADC_IT_FLAG_JEOC)|| ((FLAG) == ADC_IT_FLAG_JEOG) || \ + ((FLAG) == ADC_IT_FLAG_AWD) || ((FLAG) <= ADC_IT_FLAG_ALL)) +#define IS_ADC_FLAG(FLAG) (((FLAG) == ADC_IT_FLAG_EOSMP) || ((FLAG) == ADC_IT_FLAG_EOC) || \ + ((FLAG) == ADC_IT_FLAG_EOG)|| ((FLAG) == ADC_IT_FLAG_OVERF) || \ + ((FLAG) == ADC_IT_FLAG_JEOC)|| ((FLAG) == ADC_IT_FLAG_JEOG) || \ + ((FLAG) == ADC_IT_FLAG_AWD) || ((FLAG) <= ADC_IT_FLAG_ALL) || ((FLAG) == ADC_FLAG_ADRDY)) +/** + * @} + */ + +/** @defgroup Single-ended or differential +* @{ +*/ +#define ADC_DIFF_SINGLE (0U) /*!< ADC channel ending set to single ended */ +#define ADC_DIFF_DIFFERENTIAL (1U) /*!< ADC channel ending set to differential */ +#define IS_ADC_DIFF(MODE) (((MODE) == ADC_DIFF_SINGLE) || ((MODE) == ADC_DIFF_DIFFERENTIAL)) +/** + * @} + */ + + +/** @defgroup Signed or unsigned number selection +* @{ +*/ +#define ADC_SIGN_UNSIGNED (0U) /*!< The result is an unsigned number */ +#define ADC_SIGN_SIGNED (1U) /*!< The result is an signed number */ +#define IS_ADC_SIGN(MODE) (((MODE) == ADC_SIGN_SIGNED) || ((MODE) == ADC_SIGN_UNSIGNED)) +/** + * @} + */ + + +void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc); + +void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc); + +void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc); + +HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc); + +HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef* hadc); + +HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig); + +HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef* hadc, ADC_AnalogWDGConfTypeDef* AnalogWDGConfig); + +HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc); + +HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc); + +HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc); + +HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc); + +HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length); + +HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc); + +uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc); + +HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef *hadc, uint32_t EventType, uint32_t Timeout); + +HAL_StatusTypeDef HAL_ADC_InjectedStart_IT(ADC_HandleTypeDef* hadc); + +HAL_StatusTypeDef HAL_ADC_InjectedStop_IT(ADC_HandleTypeDef* hadc); + +uint32_t HAL_ADC_InjectedGetValue(ADC_HandleTypeDef *hadc); + +HAL_StatusTypeDef HAL_ADC_Polling(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length, uint32_t Timeout); + +HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef* hadc, ADC_InjectionConfTypeDef* sConfigInjected); + +HAL_StatusTypeDef HAL_ADCEx_InjectedStart(ADC_HandleTypeDef* hadc); + +HAL_StatusTypeDef HAL_ADC_InjectedStop(ADC_HandleTypeDef* hadc); + +HAL_StatusTypeDef HAL_ADC_InjectedStart_IT(ADC_HandleTypeDef* hadc); + +HAL_StatusTypeDef HAL_ADC_InjectedStop_IT(ADC_HandleTypeDef* hadc); + +uint32_t HAL_ADCEx_InjectedGetValue(ADC_HandleTypeDef* hadc, uint32_t InjectedRank); + +HAL_StatusTypeDef HAL_ADCEx_MultiModeConfigChannel(ADC_HandleTypeDef* hadc, ADC_MultiModeTypeDef* multimode); + +HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length); + +FlagStatus HAL_ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); + +void HAL_ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); + +void HAL_ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); + +ITStatus HAL_ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT); + +void HAL_ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint32_t ADC_IT); + +#endif + + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_aes.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_aes.h new file mode 100644 index 0000000000..2ec97569dc --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_aes.h @@ -0,0 +1,90 @@ +/****************************************************************************** +*@file : hal_aes.h +*@brief : AES module driver header file. +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ + +#ifndef __AES_H__ +#define __AES_H__ + +#include "hal.h" + +#define AES_ENCRYPTION 1 +#define AES_DECRYPTION 0 +#define AES_ECB_MODE 0 +#define AES_CBC_MODE 1 +#define AES_CTR_MODE 2 + +#define AES_SWAP_ENABLE 1 +#define AES_SWAP_DISABLE 0 + +#define AES_NORMAL_MODE 0x12345678 +#define AES_SECURITY_MODE 0 + +#define AES_ADDR_AUTO_ENABLE 1 +#define AES_ADDR_AUTO_DISABLE 0 + +#define AES_KEY_128 0 +#define AES_KEY_192 1 +#define AES_KEY_256 2 + +#define AES_FAIL 0x00 +#define AES_PASS 0xa59ada68 + +/****************************************************************************** +*@brief : set key for aes +*@param : keyin : pointer to buffer of key +*@param : key_len : select length of key(AES_KEY_128/ AES_KEY_192/ AES_KEY_256) +*@param : swap_en : AES_SWAP_ENABLE, AES_SWAP_DISABLE +*@return: None +******************************************************************************/ +void HAL_AES_SetKey(uint32_t *keyin, uint8_t key_len, uint8_t swap_en); +void HAL_AES_SetKey_U8(uint8_t *keyin, uint8_t key_len, uint8_t swap_en); + +/****************************************************************************** +*@brief : function for aes encryption and decryption +*@param : indata : pointer to buffer of input data +*@param : outdata : pointer to buffer of output data +*@param : block_len : block(128bit) length for aes cryption +*@param : operation : AES_ENCRYPTION,AES_DECRYPTION +*@param : mode : AES_ECB_MODE, AES_CBC_MODE +*@param : iv : initial vector for CBC mode +*@param : security_mode : AES_NORMAL_MODE, AES_SECURITY_MDOE +*@return: None +******************************************************************************/ +uint32_t HAL_AES_Crypt( + uint32_t *indata, + uint32_t *outdata, + uint32_t block_len, + uint8_t operation, + uint8_t mode, + uint32_t *iv, + uint32_t security_mode +); + + +uint32_t HAL_AES_Crypt_U8( + uint8_t *indata, + uint8_t *outdata, + uint32_t block_len, + uint8_t operation, + uint8_t mode, + uint8_t *iv, + uint32_t security_mode +); + +void HAL_AES_Crypt_CTR( + uint32_t *indata, + uint32_t *outdata, + uint32_t *iv, + uint32_t block_len, +uint8_t auto_en +); + +void HAL_AES_SetKey_CTR(uint32_t *keyin, uint8_t key_len, uint32_t *iv, uint8_t swap_en); + +#endif +/****************************************************************************** + * end of file +*******************************************************************************/ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_aes_spi1.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_aes_spi1.h new file mode 100644 index 0000000000..bc48a1de9b --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_aes_spi1.h @@ -0,0 +1,139 @@ +/****************************************************************************** +*@file : hal_aes.h +*@brief : AES module driver header file. +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ + +#ifndef __AES_SPI_H__ +#define __AES_SPI_H__ + +#include "hal.h" + +#define AES_SPI_ENCRYPTION 1 +#define AES_SPI_DECRYPTION 0 +#define AES_SPI_ECB_MODE 0 +#define AES_SPI_CBC_MODE 1 +#define AES_SPI_CTR_MODE 2 +#define AES_SPI_SWAP_ENABLE 1 +#define AES_SPI_SWAP_DISABLE 0 + +#define AES_SPI_NORMAL_MODE 0x12345678 +#define AES_SPI_SECURITY_MODE 0 + +#define AES_SPI_KEY_128 0 +#define AES_SPI_KEY_192 1 +#define AES_SPI_KEY_256 2 + +#define AES_SPI_FAIL 0x00 +#define AES_SPI_PASS 0xa59ada68 + +#define AES_SPI_ADDR_AUTO_ENABLE 1 +#define AES_SPI_ADDR_AUTO_DISABLE 0 + + + +#define SPI7_MEM_ADDR 0x08000000 + +#define SPI7_MEM_EXE_ADDR 0x08002000 + +//#define SPI_MEM_ADDR 0x63000000 +//#define SPIB_MEM_ADDR 0x08000000 +//#define SPIB_MEM_ADDR 0x04000000 + + +#define SPI8_MEM_ADDR 0x10000000 +#define SPI8_MEM_EXE_ADDR 0x10002000 + +#define OSPI2_MEM_ADDR 0x18000000 +#define OSPI2_MEM_EXE_ADDR 0x18002000 + +#define MEM_ADDR SPI7_MEM_ADDR +#define MEM_EXE_ADDR SPI7_MEM_EXE_ADDR + +//#define MEM_ADDR SPI8_MEM_ADDR +//#define MEM_EXE_ADDR SPI8_MEM_EXE_ADDR + + +//#define MEM_ADDR OSPI2_MEM_ADDR +//#define MEM_EXE_ADDR OSPI2_MEM_EXE_ADDR + + + + + +#define FIRST_SIZE 0x8000 //32K +#define SECOND_SIZE 0x20000 //128K + + + +/****************************************************************************** +*@brief : set key for aes +*@param : keyin : pointer to buffer of key +*@param : key_len : select length of key(AES_KEY_128/ AES_KEY_192/ AES_KEY_256) +*@param : swap_en : AES_SWAP_ENABLE, AES_SWAP_DISABLE +*@return: None +******************************************************************************/ +void HAL_AES_SPI_SetKey(uint32_t *keyin, uint8_t key_len, uint8_t swap_en); +void HAL_AES_SPI_SetKey_U8(uint8_t *keyin, uint8_t key_len, uint8_t swap_en); +void HAL_AES_SPI_SetKey_CTR(uint32_t *keyin, uint8_t key_len, uint8_t swap_en); + +/****************************************************************************** +*@brief : function for aes encryption and decryption +*@param : indata : pointer to buffer of input data +*@param : outdata : pointer to buffer of output data +*@param : block_len : block(128bit) length for aes cryption +*@param : operation : AES_ENCRYPTION,AES_DECRYPTION +*@param : mode : AES_ECB_MODE, AES_CBC_MODE +*@param : iv : initial vector for CBC mode +*@param : security_mode : AES_NORMAL_MODE, AES_SECURITY_MDOE +*@return: None +******************************************************************************/ +uint32_t HAL_AES_SPI_Crypt( + uint32_t *indata, + uint32_t *outdata, + uint32_t block_len, + uint8_t operation, + uint8_t mode, + uint32_t *iv, + uint32_t security_mode +); + + +uint32_t HAL_AES_SPI_Crypt_U8( + uint8_t *indata, + uint8_t *outdata, + uint32_t block_len, + uint8_t operation, + uint8_t mode, + uint8_t *iv, + uint32_t security_mode +); + +void HAL_AES_SPI_Crypt_CTR( + uint32_t *indata, + uint32_t *outdata, + uint32_t *iv, + uint32_t block_len, + uint8_t auto_en +); + +void HAL_AES_Crypt_soft(uint32_t *datain, uint32_t *dataout, uint32_t *ivin, uint32_t length); + +//write only once after sysreset +void otfdec_uid_set_key(uint32_t *uid, uint32_t *random); +//write only once after sysreset +void otfdec_puf_set_key(uint32_t puf_offset,uint32_t *random); +//otfdec_en : 1: select PUF + RANDOM 3: UID+RANDOM +//write only once after sysreset +void otfdec_en(uint8_t otfdec_en, uint8_t spi_sel); +void otfdec_encrypt(uint32_t *datain, uint32_t start_addr, uint32_t length,uint32_t *dataout); +void otfdec_encrypt1(uint32_t *datain, uint32_t start_addr, uint32_t length,uint32_t *dataout); +void otfdec_uid_set_key2(uint32_t *key2, uint32_t *random); +void otfdec_uid_set_key3(uint32_t *key3); + + +#endif +/****************************************************************************** + * end of file +*******************************************************************************/ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_cde.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_cde.h new file mode 100644 index 0000000000..fb05cb65d5 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_cde.h @@ -0,0 +1,430 @@ +/****************************************************************************** +*@file : hal_cde.h +*@brief : cde header file +*@ver : 1.0.0 +*@date : 2023.2.3 +******************************************************************************/ + + +#ifndef _HAL_CDE_H +#define _HAL_CDE_H + +#include "hal.h" + +void HAL_CDE_EnableCPx(int num); + +void HAL_CDE_DisableCPx(int num); + +#define ROTATE_LEFT(n,x) __ROR(x,32-n) +#define SM3_P0(x) x^ ROTATE_LEFT(9,x) ^ ROTATE_LEFT(17,x) +#define SM3_P1(x) x^ ROTATE_LEFT(15,x) ^ ROTATE_LEFT(23,x) +#define SM4_T1(x) x^ ROTATE_LEFT(2,x) ^ ROTATE_LEFT(10,x) ^ ROTATE_LEFT(18,x) ^ ROTATE_LEFT(24,x) +#define SM4_T2(x) x^ ROTATE_LEFT(13,x) ^ ROTATE_LEFT(23,x) + +#define SM3_FF2(x,y,z) (x&y)|(x&z)|(y&z) // Rounds 16-63 x,y,z is word length; +#define SM3_GG2(x,y,z) (x&y)|(~x&z) // Rounds 16-63 x,y,z is word length; + + +/* + Counting the number of ones in a 32 bit register. + The output of this instruction is a 32 bit register, containing + the number of ones + +refrence C-code: + +uint32_t POPCNT(uint32_t a) { + a = (a&0x55555555) + ((a&0xaaaaaaaa)>> 1); + a = (a&0x33333333) + ((a&0xcccccccc)>> 2); + a = (a&0x0f0f0f0f) + ((a&0xf0f0f0f0)>> 4); + a = (a&0x00ff00ff) + ((a&0xff00ff00)>> 8); + a = (a&0x0000ffff) + ((a&0xffff0000)>>16); + return a; +} +*/ +#define __HAL_CDE_POPCNT(a) __arm_cx1a(0, (a), 1) + + +/* + Reverse bit order of byte in a 32 bit register. + For example, 0x112233344 becomes 0x8844cc22 + +refrence C-code: + +UINT8 reverse_byte(UINT8 in_data) +{ + UINT8 temp; + UINT8 i; + + temp = 0; + for(i = 0; i < 8; i++) + { + if(in_data & (1 << i)) + { + temp |= 0x80 >> i; + } + } + + return temp; +} +*/ +#define __HAL_CDE_BYTE_REVERSE(a) __arm_cx1a(0, (a), 2) + +/* + SM3_P0 + +refrence C-code: + +#define SM3_P0(x) x^ ROTATE_LEFT(9,x) ^ ROTATE_LEFT(17,x) +*/ +#define __HAL_CDE_SM3_P0(a) __arm_cx1a(0, (a), 3) + +/* + SM3_P1 + +refrence C-code: + +#define SM3_P1(x) x^ ROTATE_LEFT(15,x) ^ ROTATE_LEFT(23,x) +*/ +#define __HAL_CDE_SM3_P1(a) __arm_cx1a(0, (a), 4) + +/* + SM4_T1 + +refrence C-code: + +#define SM4_T1(x) x^ ROTATE_LEFT(2,x) ^ ROTATE_LEFT(10,x) ^ ROTATE_LEFT(18,x) ^ ROTATE_LEFT(24,x) +*/ +#define __HAL_CDE_SM4_T1(a) __arm_cx1a(0, (a), 5) + + +/* + SM4_T2 + +refrence C-code: + +#define SM4_T2(x) x^ ROTATE_LEFT(13,x) ^ ROTATE_LEFT(23,x) +*/ +#define __HAL_CDE_SM4_T2(a) __arm_cx1a(0, (a), 6) + +/* + CRC32 instruction for updating a 32 bit state register by 8 bit input + data using the ISO 3309 standard. + Polynomial representation (reversed) : 0xEDB88320 + +refrence C-code: + +#define POLYNOMIAL 0xedb88320 +uint32_t CRC32(uint32_t crc, uint32_t d) { + crc = crc ^ (d&0xff); + if (crc&1) crc = (crc>>1) ^ POLYNOMIAL; else crc = (crc>>1); + if (crc&1) crc = (crc>>1) ^ POLYNOMIAL; else crc = (crc>>1); + if (crc&1) crc = (crc>>1) ^ POLYNOMIAL; else crc = (crc>>1); + if (crc&1) crc = (crc>>1) ^ POLYNOMIAL; else crc = (crc>>1); + if (crc&1) crc = (crc>>1) ^ POLYNOMIAL; else crc = (crc>>1); + if (crc&1) crc = (crc>>1) ^ POLYNOMIAL; else crc = (crc>>1); + if (crc&1) crc = (crc>>1) ^ POLYNOMIAL; else crc = (crc>>1); + if (crc&1) crc = (crc>>1) ^ POLYNOMIAL; else crc = (crc>>1); + return crc; +} +*/ + +/* + SM3_FF2 + +refrence C-code: + +#define SM3_FF2(x,y,z) (x&y)|(x&z)|(y&z) // Rounds 16-63 x,y,z is word length; +*/ +#define __HAL_CDE_SM3_FF2(x, y, z) __arm_cx3a(0,x, y, z,1) + +/* + SM3_GG2 + +refrence C-code: + +#define SM3_GG2(x,y,z) (x&y)|(~x&z) // Rounds 16-63 x,y,z is word length; +*/ +#define __HAL_CDE_SM3_GG2(x, y, z) __arm_cx3a(0,x, y, z,10) + + + +#define __HAL_CDE_CRC32_REVERSE(crc, d) __arm_cx2a(0, (crc), (d), 2) //cpuڲԳʼֵԼз + +/* +CRC module for data[31:0] , crc32[31:0]=1+x^1+x^2+x^4+x^5+x^7+x^8+x^10+x^11+x^12+x^16+x^22+x^23+x^26+x^32; +ʽ0x04C11DB7 +֧һμһ +*/ +#define __HAL_CDE_CRC32_32BIT(crc, d) __arm_cx2a(0, (crc), (d), 1) //ڲd ڵ򣬼d[31:0] תΪ {d[7:0],d[15:8],d[23:16],d[31:24]} + + + +/* This instruction extracts 32 bits from two 32 bit registers. + res[ 0:23] = a[8:31] + res[24:31] = b[0:7] + +refrence C-code: + +uint32_t PACK8(uint32_t a, uint32_t b) { + return (a >> 8) | (b << 24); +} +*/ +#define __HAL_CDE_PACK8(a, b) __arm_cx3(0,(a),(b), 4) + + +/* This instruction extracts 32 bits from two 32 bit registers. + res[ 0:15] = a[16:31] + res[16:31] = b[0:15] + +refrence C-code: + +uint32_t PACK16(uint32_t a, uint32_t b) { + return (a >> 16) | (b << 16); +} +*/ +#define __HAL_CDE_PACK16(a, b) __arm_cx3(0,(a),(b), 5) + +/* Instruction for updating the FIR filter delay line by two 8 bit operands + This instruction extracts 32 bits from two 32 bit registers. + res[ 0:7] = a[24:31] + res[8:31] = b[0:23] + +refrence C-code: + +uint32_t PACK24(uint32_t a, uint32_t b) { + return (a >> 24) | (b << 8); +} +*/ +#define __HAL_CDE_PACK24(a, b) __arm_cx3(0,(a),(b), 6) + + +/* This instruction does four 8x8 bit unsigned multiplicaltions forming + four 16 bit products. + The four products and the accumulator 'a' are added, and the 32 bit + result is returned from the instruction. + +refrence C-code: + +uint32_t UMLAQ(uint32_t a, uint32_t b, uint32_t c) { + uint16_t a0, a1, a2, a3; + a0 = (uint16_t)((b >> 0) & 0xff) * (uint16_t)((c >> 0) & 0xff); + a1 = (uint16_t)((b >> 8) & 0xff) * (uint16_t)((c >> 8) & 0xff); + a2 = (uint16_t)((b >> 16) & 0xff) * (uint16_t)((c >> 16) & 0xff); + a3 = (uint16_t)((b >> 24) & 0xff) * (uint16_t)((c >> 24) & 0xff); + return a + (uint32_t)a0 + (uint32_t)a1 + (uint32_t)a2 + (uint32_t)a3; +} +*/ +#define __HAL_CDE_UMLAQ(a, b, c) __arm_cx3a(0,(a),(b),(c), 2) + + +/* This instruction does four 8x8 bit unsigned multiplicaltions forming + four 16 bit products. + The four products are added, and the 32 bit result is returned from + the instruction. + +uint32_t UMUAQ(uint32_t b, uint32_t c) { + uint16_t a0, a1, a2, a3; + a0 = (uint16_t)((b >> 0) & 0xff) * (uint16_t)((c >> 0) & 0xff); + a1 = (uint16_t)((b >> 8) & 0xff) * (uint16_t)((c >> 8) & 0xff); + a2 = (uint16_t)((b >> 16) & 0xff) * (uint16_t)((c >> 16) & 0xff); + a3 = (uint16_t)((b >> 24) & 0xff) * (uint16_t)((c >> 24) & 0xff); + return (uint32_t)a0 + (uint32_t)a1 + (uint32_t)a2 + (uint32_t)a3; +} +*/ +#define __HAL_CDE_UMUAQ(b, c) __arm_cx3(0,(b),(c), 7) + + +/* This instruction does four 8 bit signed by 8 bit unsigned multi- + plications forming four 16 bit products. + The four products and the accumulator 'a' are added, and the 32 bit + result is returned from the instruction. + +int32_t SUMLAQ(int32_t a, uint32_t b, uint32_t c) { + int16_t a0, a1, a2, a3; + a0 = (int16_t)(int8_t)((b >> 0) & 0xff) * (int16_t)(uint8_t)((c >> 0) & 0xff); + a1 = (int16_t)(int8_t)((b >> 8) & 0xff) * (int16_t)(uint8_t)((c >> 8) & 0xff); + a2 = (int16_t)(int8_t)((b >> 16) & 0xff) * (int16_t)(uint8_t)((c >> 16) & 0xff); + a3 = (int16_t)(int8_t)((b >> 24) & 0xff) * (int16_t)(uint8_t)((c >> 24) & 0xff); + return a + (int32_t)a0 + (int32_t)a1 + (int32_t)a2 + (int32_t)a3; +} +*/ +#define __HAL_CDE_SUMLAQ(a, b, c) __arm_cx3a(0,(a),(b),(c), 3) + + +/* This instruction does four 8 bit signed by 8 bit unsigned multi- + plications forming four 16 bit products. + The four products are added, and the 32 bit result is returned from + the instruction. + +int32_t SUMUAQ(uint32_t b, uint32_t c) { + int16_t a0, a1, a2, a3; + a0 = (int16_t)(int8_t)((b >> 0) & 0xff) * (int16_t)(uint8_t)((c >> 0) & 0xff); + a1 = (int16_t)(int8_t)((b >> 8) & 0xff) * (int16_t)(uint8_t)((c >> 8) & 0xff); + a2 = (int16_t)(int8_t)((b >> 16) & 0xff) * (int16_t)(uint8_t)((c >> 16) & 0xff); + a3 = (int16_t)(int8_t)((b >> 24) & 0xff) * (int16_t)(uint8_t)((c >> 24) & 0xff); + return (int32_t)a0 + (int32_t)a1 + (int32_t)a2 + (int32_t)a3; +} +*/ +#define __HAL_CDE_SUMUAQ(b, c) __arm_cx3(0,(b),(c), 8) + + +/* + This function calculates the hamming distance between two input registers + + Input registers takes any value, valid output values [0:31] + Do not use {A} CDE type, proposed CDE instruction: cx3(p0, a, b, c, #) + +uint32_t HAMMING_DIST(uint32_t b, uint32_t c) { + uint32_t i, a, val; + + val = b ^ c; + a = 0; + for (i = 0; i < 32; i++) { + a = a + (val & 1); + val = val >> 1; + } + + return a; +} +*/ +#define __HAL_CDE_HAMMING_DIST(b, c) __arm_cx3(0,b,c, 9) + +/* + parity of the number of ones in a 32 bit register. + For example, 0x11 : 0 + 0x23 : 1 + 0xffff: 0 +refrence C-code: +__builtin_parity +*/ +#define __HAL_CDE_PARITY(a) __arm_cx1a(0, (a), 7) + +/* + Reverse bit order of u16 in a 32 bit register. + For example, 0x11223344 becomes 0x448822cc + +refrence C-code: + +UINT8 reverse_u16(UINT16 in_data) +{ + UINT8 temp; + UINT8 i; + + temp = 0; + for(i = 0; i < 16; i++) + { + if(in_data & (1 << i)) + { + temp |= 0x8000 >> i; + } + } + + return temp; +} +*/ +#define __HAL_CDE_U16_REVERSE(a) __arm_cx1a(0, (a), 8) + +/* + Counts the number of tailing zeros of a data value. + For example, 0x00 : 32 + 0x11 : 0 + 0x1122 : 1 + 0x80000000: 31 +refrence C-code: +__builtin_ctz + +*/ +#define __HAL_CDE_CTZ(a) __arm_cx2a(0, a, 0, 3) + +/* + from back to front, which position of bit 1 in a data value. + For example, 0x00 : 32 + 0x11 : 1 + 0x1122 : 2 + 0x80000000: 32 +refrence C-code: +__builtin_ffs + +*/ +#define __HAL_CDE_FFS(a) __arm_cx2a(0, a, 1, 3) + + +/* + byte amplification + For example, bit[7:0] a = 01101011 + b=1 : bit[15:0] 00 11 11 00 11 00 11 11 + b=2 : bit[31:0] 00000000 000 111 111 000 111 000 111 111 + b=4 : bit[31:0] 0000 1111 1111 0000 1111 0000 1111 1111 +refrence C-code: + + +*/ +#define __HAL_CDE_BYTE_AMP(a,b) __arm_cx2a(0, a, b, 4) + +/* This instruction extracts 8 bits from two 8 bit registers. + +refrence C-code: +uint8_t BYTE_PACKN(uint8_t a, uint8_t b, uint8_t n) { + return (a >> n) | (b << (8-n)); +} +uint32_t WORD_PACKN(uint32_t a, uint32_t b, uint8_t n) { + uint32_t c,c1,c2,c3,c4; + c1 = ((a&0xff) >> n) | ((b&0xff) << (8-n)); + c2 = ((a&0xff00) >> n) | ((b&0xff00) << (8-n)); + c3 = ((a&0xff0000) >> n) | ((b&0xff0000) << (8-n)); + c4 = ((a&0xff000000) >> n) | ((b&0xff000000) << (8-n)); + c = (c1&0xff) | (c2&0xff00) | (c3&0xff0000) | (c4&0xff000000); + return c; +} +*/ +#define __HAL_CDE_BYTE_PACKN(a, b,n) __arm_cx3a(0,(a),(b), n,11) + +/* This instruction extracts 8 bits from two 8 bit registers. + +refrence C-code: +uint32_t BYTE3_PACKN(uint32_t a, uint8_t n) { + uint8_t c,c1,c2,c3; + uint8_t a1,a2,a3,a4; + a1 = (a&0xff); + a2 = (a&0xff00)>>8; + a3 = (a&0xff0000)>>16; + a4 = (a&0xff000000)>>24; + c1 = (a1 >> n) | (a2 << (8-n)); + c2 = (a2 >> n) | (a3 << (8-n)); + c3 = (a3 >> n) | (a4 << (8-n)); + c = (c1&0xff) | ((c2<<8)&0xff00) | ((c3<<16)&0xff0000); + return c; +} +*/ +#define __HAL_CDE_3BYTE_PACKN(a,n) __arm_cx2a(0,(a),n,5) + +/* This instruction extracts 8 bits from two 8 bit registers. + +refrence C-code: +uint64_t BYTE7_PACKN(uint64_t a, uint8_t n) { + uint64_t c,c1,c2,c3,c4,c5,c6,c7; + uint8_t a1,a2,a3,a4,a5,a6,a7,a8; + a1 = (a&0xff); + a2 = (a&0xff00)>>8; + a3 = (a&0xff0000)>>16; + a4 = (a&0xff000000)>>24; + a5 = (a&0xff00000000)>>32; + a6 = (a&0xff0000000000)>>40; + a7 = (a&0xff000000000000)>>48; + a8 = (a&0xff00000000000000)>>56; + c1 = (a1 >> n) | (a2 << (8-n)); + c2 = (a2 >> n) | (a3 << (8-n)); + c3 = (a3 >> n) | (a4 << (8-n)); + c4 = (a4 >> n) | (a5 << (8-n)); + c5 = (a5 >> n) | (a6 << (8-n)); + c6 = (a6 >> n) | (a7 << (8-n)); + c7 = (a7 >> n) | (a8 << (8-n)); + c = (c1&0xff) | ((c2<<8)&0xff00) | ((c3<<16)&0xff0000) | ((c4<<24)&0xff000000) | ((c5<<32)&0xff00000000) | ((c6<<40)&0xff000000000) | ((c7<<48)&0xff000000000000); + return c; +} +*/ +#define __HAL_CDE_7BYTE_PACKN(a,n) __arm_cx2da(0,(a),n,6) + +#endif + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_comp.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_comp.h new file mode 100644 index 0000000000..b213f648b6 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_comp.h @@ -0,0 +1,163 @@ + +/****************************************************************************** +*@file : hal_comp.h +*@brief : COMP HAL module driver header file. +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ + +#ifndef __HAL_COMP_H__ +#define __HAL_COMP_H__ + +#include "acm32h5xx_hal_conf.h" + + +typedef struct +{ + uint32_t InPSel; //input plus select + uint32_t InMSel; //input minus select + uint32_t Polarity; //polarity + uint32_t HYS; //Hysteresis window + uint32_t BlankSel; //blank source select + uint32_t FltEn; //filt enable + uint32_t FltTime; //filt time + uint32_t CrvEn; //reference voltage divide enable + uint32_t CrvSel; //reference voltage source select + uint32_t CrvCfg; //reference voltage divider factor config +}COMP_InitTypeDef; + + +typedef struct +{ + COMP_TypeDef *Instance; // Register base address + COMP_InitTypeDef Init; // COMP required parameters + uint8_t OutputLevelOrg; // COMP OutputLevel original + uint8_t OutputLevel; // COMP OutputLevel with filter +} COMP_HandleTypeDef; + + +#define COMP_CRVSEL_AVDD (0U) +#define COMP_CRVSEL_VREF (COMP_CR_CRV_SEL) + +#define COMP_CRV_DISABLE (0U) +#define COMP_CRV_ENABLE (COMP_CR_CRV_EN) + +#define COMP_POLARITY_NOINVERT (0U) +#define COMP_POLARITY_INVERT (COMP_CR_POLARITY) + +#define COMP_FLT_DISABLE (0U) +#define COMP_FLT_ENABLE (COMP_CR_FLTEN) + +#define COMP_FLTTIME_1CLK (0U) +#define COMP_FLTTIME_2CLK (1U << COMP_CR_FLTTIME_Pos) +#define COMP_FLTTIME_4CLK (2U << COMP_CR_FLTTIME_Pos) +#define COMP_FLTTIME_16CLK (3U << COMP_CR_FLTTIME_Pos) +#define COMP_FLTTIME_64CLK (4U << COMP_CR_FLTTIME_Pos) +#define COMP_FLTTIME_256CLK (5U << COMP_CR_FLTTIME_Pos) +#define COMP_FLTTIME_1024CLK (6U << COMP_CR_FLTTIME_Pos) +#define COMP_FLTTIME_4095CLK (7U << COMP_CR_FLTTIME_Pos) + +#define COMP_BLANKSEL_NONE (0U) +#define COMP_BLANKSEL_S1 (1U << COMP_CR_BLANKSEL_Pos) +#define COMP_BLANKSEL_S2 (2U << COMP_CR_BLANKSEL_Pos) +#define COMP_BLANKSEL_S3 (3U << COMP_CR_BLANKSEL_Pos) +#define COMP_BLANKSEL_S4 (4U << COMP_CR_BLANKSEL_Pos) +#define COMP_BLANKSEL_S5 (5U << COMP_CR_BLANKSEL_Pos) +#define COMP_BLANKSEL_S6 (6U << COMP_CR_BLANKSEL_Pos) +#define COMP_BLANKSEL_S7 (7U << COMP_CR_BLANKSEL_Pos) + +#define COMP1_BLANKSEL_NONE (0U) +#define COMP1_BLANKSEL_TIM1_OC5 (1U << COMP_CR_BLANKSEL_Pos) +#define COMP1_BLANKSEL_TIM1_OC3 (2U << COMP_CR_BLANKSEL_Pos) +#define COMP1_BLANKSEL_TIM3_OC3 (3U << COMP_CR_BLANKSEL_Pos) +#define COMP1_BLANKSEL_TIM3_OC4 (4U << COMP_CR_BLANKSEL_Pos) +#define COMP1_BLANKSEL_TIM8_OC5 (5U << COMP_CR_BLANKSEL_Pos) +#define COMP1_BLANKSEL_TIM15_OC1 (6U << COMP_CR_BLANKSEL_Pos) +#define COMP1_BLANKSEL_ALL (7U << COMP_CR_BLANKSEL_Pos) + +#define COMP_INPSEL_P0 (0U) +#define COMP_INPSEL_P1 (1U << COMP_CR_INPSEL_Pos) + +#define COMP_INMSEL_DACx (0U) +#define COMP_INMSEL_P1 (1U << COMP_CR_INMSEL_Pos) +#define COMP_INMSEL_P2 (2U << COMP_CR_INMSEL_Pos) +#define COMP_INMSEL_VREF_AVDD (3U << COMP_CR_INMSEL_Pos) + +#define COMP1_INPSEL_PB0 (0U) +#define COMP1_INPSEL_PB2 (1U << COMP_CR_INPSEL_Pos) + +#define COMP1_INMSEL_DAC1 (0U) +#define COMP1_INMSEL_PB1 (1U << COMP_CR_INMSEL_Pos) +#define COMP1_INMSEL_PC4 (2U << COMP_CR_INMSEL_Pos) +#define COMP1_INMSEL_VREF_AVDD (3U << COMP_CR_INMSEL_Pos) + +#define COMP_HYS_NONE (0U) +#define COMP_HYS_4 (4U << COMP_CR_HYS_Pos) +#define COMP_HYS_5 (5U << COMP_CR_HYS_Pos) +#define COMP_HYS_6 (6U << COMP_CR_HYS_Pos) +#define COMP_HYS_7 (7U << COMP_CR_HYS_Pos) + + +#define IS_COMP_INSTANCE(_INSTANCE_) ((_INSTANCE_) == COMP1) + + +#define IS_COMP_CRVCFG(_CRVCFG_) ((_CRVCFG_) <= 15U) + +#define IS_COMP_CRVSEL(_CRVSEL_) (((_CRVSEL_) == COMP_CRVSEL_AVDD) || \ + ((_CRVSEL_) == COMP_CRVSEL_VREF)) + +#define IS_COMP_CRVEN(_CRVEN_) (((_CRVEN_) == COMP_CRV_DISABLE) || \ + ((_CRVEN_) == COMP_CRV_ENABLE)) + +#define IS_COMP_POLARITY(_POLARITY_) (((_POLARITY_) == COMP_POLARITY_NOINVERT) || \ + ((_POLARITY_) == COMP_POLARITY_INVERT)) + +#define IS_COMP_FLTEN(_FLTEN_) (((_FLTEN_) == COMP_FLT_DISABLE) || \ + ((_FLTEN_) == COMP_FLT_ENABLE)) + +#define IS_COMP_FLTTIME(_FLTTIME_) (((_FLTTIME_) == COMP_FLTTIME_1CLK) || \ + ((_FLTTIME_) == COMP_FLTTIME_2CLK) || \ + ((_FLTTIME_) == COMP_FLTTIME_4CLK) || \ + ((_FLTTIME_) == COMP_FLTTIME_16CLK) || \ + ((_FLTTIME_) == COMP_FLTTIME_64CLK) || \ + ((_FLTTIME_) == COMP_FLTTIME_256CLK) || \ + ((_FLTTIME_) == COMP_FLTTIME_1024CLK) || \ + ((_FLTTIME_) == COMP_FLTTIME_4095CLK)) + +#define IS_COMP_BLANKSEL(_BLANKSEL_) (((_BLANKSEL_) == COMP_BLANKSEL_NONE) || \ + ((_BLANKSEL_) == COMP_BLANKSEL_S1) || \ + ((_BLANKSEL_) == COMP_BLANKSEL_S2) || \ + ((_BLANKSEL_) == COMP_BLANKSEL_S3) || \ + ((_BLANKSEL_) == COMP_BLANKSEL_S4) || \ + ((_BLANKSEL_) == COMP_BLANKSEL_S5) || \ + ((_BLANKSEL_) == COMP_BLANKSEL_S6) || \ + ((_BLANKSEL_) == COMP_BLANKSEL_S7)) + +#define IS_COMP_INPSEL(_INPSEL_) (((_INPSEL_) == COMP_INPSEL_P0) || \ + ((_INPSEL_) == COMP_INPSEL_P1)) + +#define IS_COMP_INMSEL(_INMSEL_) (((_INMSEL_) == COMP_INMSEL_DACx) || \ + ((_INMSEL_) == COMP_INMSEL_P1) || \ + ((_INMSEL_) == COMP_INMSEL_P2) || \ + ((_INMSEL_) == COMP_INMSEL_VREF_AVDD)) + +#define IS_COMP_HYS(_HYS_) (((_HYS_) == COMP_HYS_NONE) || \ + ((_HYS_) == COMP_HYS_4) || \ + ((_HYS_) == COMP_HYS_5) || \ + ((_HYS_) == COMP_HYS_6) || \ + ((_HYS_) == COMP_HYS_7)) + + +void HAL_COMP_MspInit(COMP_HandleTypeDef* hcomp); +void HAL_COMP_MspDeInit(COMP_HandleTypeDef* hcomp); +HAL_StatusTypeDef HAL_COMP_Init(COMP_HandleTypeDef* hcomp); +HAL_StatusTypeDef HAL_COMP_DeInit(COMP_HandleTypeDef* hcomp); +HAL_StatusTypeDef HAL_COMP_Enable(COMP_HandleTypeDef* hcomp); +HAL_StatusTypeDef HAL_COMP_Disable(COMP_HandleTypeDef* hcomp); +HAL_StatusTypeDef HAL_COMP_GetOutputLevel(COMP_HandleTypeDef* hcomp); +HAL_StatusTypeDef HAL_COMP_Start(COMP_HandleTypeDef *hcomp); +HAL_StatusTypeDef HAL_COMP_Stop(COMP_HandleTypeDef *hcomp); +HAL_StatusTypeDef HAL_COMP_Lock(COMP_HandleTypeDef* hcomp); + +#endif + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_cordic.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_cordic.h new file mode 100644 index 0000000000..cea216d965 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_cordic.h @@ -0,0 +1,626 @@ +/****************************************************************************** +*@file : hal_fau.h +*@brief : Header file of FAU module. +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ + +#ifndef __CORDIC_H_ +#define __CORDIC_H_ + +#define RANGE 2147483648U //2^31 +#define CORDIC_F_31 0xD2C90A46 // CORDIC gain F +#define W_INV_Q31 0x6A012206 + +#define PI 3.1415926 + +/****************************************************************************** +*@brief : calculate the sin & cos value of the input angle(precision 1) +* +*@param : angle_para: input angle data in radians, divided by ,range[-1,1],Q31 format +*@param : cos_data : the cos value of the input angle,range[-1,1],Q31 format +*@param : sin_data : the sin value of the input angle,range[-1,1],Q31 format +*@return: None +******************************************************************************/ +void HAL_CORDIC_CosSin_1(int angle_para, int* cos_data, int* sin_data); + +/****************************************************************************** +*@brief : calculate the sin & cos value of the input angle(precision 2) +* +*@param : angle_para: input angle data in radians, divided by ,range[-1,1],Q31 format +*@param : cos_data : the cos value of the input angle,range[-1,1],Q31 format +*@param : sin_data : the sin value of the input angle,range[-1,1],Q31 format +*@return: None +******************************************************************************/ +void HAL_CORDIC_CosSin_2(int angle_para, int* cos_data, int* sin_data); + +/****************************************************************************** +*@brief : calculate the sin & cos value of the input angle(precision 3) +* +*@param : angle_para: input angle data in radians, divided by ,range[-1,1],Q31 format +*@param : cos_data : the cos value of the input angle,range[-1,1],Q31 format +*@param : sin_data : the sin value of the input angle,range[-1,1],Q31 format +*@return: None +******************************************************************************/ +void HAL_CORDIC_CosSin_3(int angle_para, int* cos_data, int* sin_data); + +/****************************************************************************** +*@brief : calculate the sin & cos value of the input angle(precision 4) +* +*@param : angle_para: input angle data in radians, divided by ,range[-1,1],Q31 format +*@param : cos_data : the cos value of the input angle,range[-1,1],Q31 format +*@param : sin_data : the sin value of the input angle,range[-1,1],Q31 format +*@return: None +******************************************************************************/ +void HAL_CORDIC_CosSin_4(int angle_para, int* cos_data, int* sin_data); + +/****************************************************************************** +*@brief : calculate the sin & cos value of the input angle(precision 5) +* +*@param : angle_para: input angle data in radians, divided by ,range[-1,1],Q31 format +*@param : cos_data : the cos value of the input angle,range[-1,1],Q31 format +*@param : sin_data : the sin value of the input angle,range[-1,1],Q31 format +*@return: None +******************************************************************************/ +void HAL_CORDIC_CosSin_5(int angle_para, int* cos_data, int* sin_data); + +/****************************************************************************** +*@brief : calculate the sin & cos value of the input angle(precision 6) +* +*@param : angle_para: input angle data in radians, divided by ,range[-1,1],Q31 format +*@param : cos_data : the cos value of the input angle,range[-1,1],Q31 format +*@param : sin_data : the sin value of the input angle,range[-1,1],Q31 format +*@return: None +******************************************************************************/ +void HAL_CORDIC_CosSin_6(int angle_para, int* cos_data, int* sin_data); + +/****************************************************************************** +*@brief : calculate the sin & cos value of the input angle(precision 7) +* +*@param : angle_para: input angle data in radians, divided by ,range[-1,1],Q31 format +*@param : cos_data : the cos value of the input angle,range[-1,1],Q31 format +*@param : sin_data : the sin value of the input angle,range[-1,1],Q31 format +*@return: None +******************************************************************************/ +void HAL_CORDIC_CosSin_7(int angle_para, int* cos_data, int* sin_data); + +/****************************************************************************** +*@brief : calculate the sin & cos value of the input angle(precision 8) +* +*@param : angle_para: input angle data in radians, divided by ,range[-1,1],Q31 format +*@param : cos_data : the cos value of the input angle,range[-1,1],Q31 format +*@param : sin_data : the sin value of the input angle,range[-1,1],Q31 format +*@return: None +******************************************************************************/ +void HAL_CORDIC_CosSin_8(int angle_para, int* cos_data, int* sin_data); + +/****************************************************************************** +*@brief : calculate the atan & sqrt value of the input x,y(precision 1) +* +*@param : x : input x, range[-1,1],Q31 format +*@param : y : input y, range[-1,1],Q31 format +*@param : sqrt_data : the sqrt value of the input x,y,Q31 format +* sqrt_data should devide (CORDIC_F_31>>4) to obtain the value in float +*@param : atan_data : the atan value of the input y/x,Q31 format +* atan_value must be multiplied by to obtain the angle in radians +*@return: None +******************************************************************************/ +void HAL_CORDIC_AtanSqrt_1(int x, int y, int*sqrt_data, int* atan_data); + +/****************************************************************************** +*@brief : calculate the atan & sqrt value of the input x,y(precision 2) +* +*@param : x : input x, range[-1,1],Q31 format +*@param : y : input y, range[-1,1],Q31 format +*@param : sqrt_data : the sqrt value of the input x,y,Q31 format +* sqrt_data should devide (CORDIC_F_31>>4) to obtain the value in float +*@param : atan_data : the atan value of the input y/x,Q31 format +* atan_value must be multiplied by to obtain the angle in radians +*@return: None +******************************************************************************/ +void HAL_CORDIC_AtanSqrt_2(int x, int y, int*sqrt_data, int* atan_data); + +/****************************************************************************** +*@brief : calculate the atan & sqrt value of the input x,y(precision 3) +* +*@param : x : input x, range[-1,1],Q31 format +*@param : y : input y, range[-1,1],Q31 format +*@param : sqrt_data : the sqrt value of the input x,y,Q31 format +* sqrt_data should devide (CORDIC_F_31>>4) to obtain the value in float +*@param : atan_data : the atan value of the input y/x,Q31 format +* atan_value must be multiplied by to obtain the angle in radians +*@return: None +******************************************************************************/ +void HAL_CORDIC_AtanSqrt_3(int x, int y, int*sqrt_data, int* atan_data); + +/****************************************************************************** +*@brief : calculate the atan & sqrt value of the input x,y(precision 4) +* +*@param : x : input x, range[-1,1],Q31 format +*@param : y : input y, range[-1,1],Q31 format +*@param : sqrt_data : the sqrt value of the input x,y,Q31 format +* sqrt_data should devide (CORDIC_F_31>>4) to obtain the value in float +*@param : atan_data : the atan value of the input y/x,Q31 format +* atan_value must be multiplied by to obtain the angle in radians +*@return: None +******************************************************************************/ +void HAL_CORDIC_AtanSqrt_4(int x, int y, int*sqrt_data, int* atan_data); + +/****************************************************************************** +*@brief : calculate the atan & sqrt value of the input x,y(precision 5) +* +*@param : x : input x, range[-1,1],Q31 format +*@param : y : input y, range[-1,1],Q31 format +*@param : sqrt_data : the sqrt value of the input x,y,Q31 format +* sqrt_data should devide (CORDIC_F_31>>4) to obtain the value in float +*@param : atan_data : the atan value of the input y/x,Q31 format +* atan_value must be multiplied by to obtain the angle in radians +*@return: None +******************************************************************************/ +void HAL_CORDIC_AtanSqrt_5(int x, int y, int*sqrt_data, int* atan_data); + +/****************************************************************************** +*@brief : calculate the atan & sqrt value of the input x,y(precision 6) +* +*@param : x : input x, range[-1,1],Q31 format +*@param : y : input y, range[-1,1],Q31 format +*@param : sqrt_data : the sqrt value of the input x,y,Q31 format +* sqrt_data should devide (CORDIC_F_31>>4) to obtain the value in float +*@param : atan_data : the atan value of the input y/x,Q31 format +* atan_value must be multiplied by to obtain the angle in radians +*@return: None +******************************************************************************/ +void HAL_CORDIC_AtanSqrt_6(int x, int y, int*sqrt_data, int* atan_data); + +/****************************************************************************** +*@brief : calculate the atan & sqrt value of the input x,y(precision 7) +* +*@param : x : input x, range[-1,1],Q31 format +*@param : y : input y, range[-1,1],Q31 format +*@param : sqrt_data : the sqrt value of the input x,y,Q31 format +* sqrt_data should devide (CORDIC_F_31>>4) to obtain the value in float +*@param : atan_data : the atan value of the input y/x,Q31 format +* atan_value must be multiplied by to obtain the angle in radians +*@return: None +******************************************************************************/ +void HAL_CORDIC_AtanSqrt_7(int x, int y, int*sqrt_data, int* atan_data); + +/****************************************************************************** +*@brief : calculate the atan & sqrt value of the input x,y(precision 8) +* +*@param : x : input x, range[-1,1],Q31 format +*@param : y : input y, range[-1,1],Q31 format +*@param : sqrt_data : the sqrt value of the input x,y,Q31 format +* sqrt_data should devide (CORDIC_F_31>>4) to obtain the value in float +*@param : atan_data : the atan value of the input y/x,Q31 format +* atan_value must be multiplied by to obtain the angle in radians +*@return: None +******************************************************************************/ +void HAL_CORDIC_AtanSqrt_8(int x, int y, int*sqrt_data, int* atan_data); + +/****************************************************************************** +*@brief : calculate the sinh & cosh value of the input angle(precision 1) +* +*@param : angle_para : input hyperbolic angle data in radians, range [-0.559 ~0. 559]([-1.118 ~ 1.118]/2),Q31 format +*@param : cosh_data : the hyperbolic cosh value of the input angle,,range[0.5 0.846],Q31 format +* cosh_data must be multiplied by 2 to obtain the correct result +*@param : sinh_data : the hyperbolic sinh value of the input angle,range[[-0.683 0.683],Q31 format +* sinh_data must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_CoshSinh_1(int angle_para, int* cosh_data, int* sinh_data); + +/****************************************************************************** +*@brief : calculate the sinh & cosh value of the input angle(precision 2) +* +*@param : angle_para : input hyperbolic angle data in radians, range [-0.559 ~0. 559]([-1.118 ~ 1.118]/2),Q31 format +*@param : cosh_data : the hyperbolic cosh value of the input angle,,range[0.5 0.846],Q31 format +* cosh_data must be multiplied by 2 to obtain the correct result +*@param : sinh_data : the hyperbolic sinh value of the input angle,range[[-0.683 0.683],Q31 format +* sinh_data must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_CoshSinh_2(int angle_para, int* cosh_data, int* sinh_data); + +/****************************************************************************** +*@brief : calculate the sinh & cosh value of the input angle(precision 3) +* +*@param : angle_para : input hyperbolic angle data in radians, range [-0.559 ~0. 559]([-1.118 ~ 1.118]/2),Q31 format +*@param : cosh_data : the hyperbolic cosh value of the input angle,,range[0.5 0.846],Q31 format +* cosh_data must be multiplied by 2 to obtain the correct result +*@param : sinh_data : the hyperbolic sinh value of the input angle,range[[-0.683 0.683],Q31 format +* sinh_data must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_CoshSinh_3(int angle_para, int* cosh_data, int* sinh_data); + +/****************************************************************************** +*@brief : calculate the sinh & cosh value of the input angle(precision 4) +* +*@param : angle_para : input hyperbolic angle data in radians, range [-0.559 ~0. 559]([-1.118 ~ 1.118]/2),Q31 format +*@param : cosh_data : the hyperbolic cosh value of the input angle,,range[0.5 0.846],Q31 format +* cosh_data must be multiplied by 2 to obtain the correct result +*@param : sinh_data : the hyperbolic sinh value of the input angle,range[[-0.683 0.683],Q31 format +* sinh_data must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_CoshSinh_4(int angle_para, int* cosh_data, int* sinh_data); + +/****************************************************************************** +*@brief : calculate the sinh & cosh value of the input angle(precision 5) +* +*@param : angle_para : input hyperbolic angle data in radians, range [-0.559 ~0. 559]([-1.118 ~ 1.118]/2),Q31 format +*@param : cosh_data : the hyperbolic cosh value of the input angle,,range[0.5 0.846],Q31 format +* cosh_data must be multiplied by 2 to obtain the correct result +*@param : sinh_data : the hyperbolic sinh value of the input angle,range[[-0.683 0.683],Q31 format +* sinh_data must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_CoshSinh_5(int angle_para, int* cosh_data, int* sinh_data); + +/****************************************************************************** +*@brief : calculate the sinh & cosh value of the input angle(precision 6) +* +*@param : angle_para : input hyperbolic angle data in radians, range [-0.559 ~0. 559]([-1.118 ~ 1.118]/2),Q31 format +*@param : cosh_data : the hyperbolic cosh value of the input angle,,range[0.5 0.846],Q31 format +* cosh_data must be multiplied by 2 to obtain the correct result +*@param : sinh_data : the hyperbolic sinh value of the input angle,range[[-0.683 0.683],Q31 format +* sinh_data must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_CoshSinh_6(int angle_para, int* cosh_data, int* sinh_data); + +/****************************************************************************** +*@brief : calculate the sinh & cosh value of the input angle(precision 7) +* +*@param : angle_para : input hyperbolic angle data in radians, range [-0.559 ~0. 559]([-1.118 ~ 1.118]/2),Q31 format +*@param : cosh_data : the hyperbolic cosh value of the input angle,,range[0.5 0.846],Q31 format +* cosh_data must be multiplied by 2 to obtain the correct result +*@param : sinh_data : the hyperbolic sinh value of the input angle,range[[-0.683 0.683],Q31 format +* sinh_data must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_CoshSinh_7(int angle_para, int* cosh_data, int* sinh_data); + +/****************************************************************************** +*@brief : calculate the sinh & cosh value of the input angle(precision 8) +* +*@param : angle_para : input hyperbolic angle data in radians, range [-0.559 ~0. 559]([-1.118 ~ 1.118]/2),Q31 format +*@param : cosh_data : the hyperbolic cosh value of the input angle,,range[0.5 0.846],Q31 format +* cosh_data must be multiplied by 2 to obtain the correct result +*@param : sinh_data : the hyperbolic sinh value of the input angle,range[[-0.683 0.683],Q31 format +* sinh_data must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_CoshSinh_8(int angle_para, int* cosh_data, int* sinh_data); + +/****************************************************************************** +*@brief : calculate the hyperbolic arctangent of the input argument(precision 1) +* +*@param : angle_para : input hyperbolic angle data,range [-0.403 0.403]([-0.806 ~ 0.806]/2),Q31 format; +*@param : atanh_value: the atanh value of the input argument,Q31 format + atanh_value must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Atanh_1(int angle_para, int *atanh_value); + +/****************************************************************************** +*@brief : calculate the hyperbolic arctangent of the input argument(precision 27) +* +*@param : angle_para : input hyperbolic angle data,range [-0.403 0.403]([-0.806 ~ 0.806]/2),Q31 format; +*@param : atanh_value: the atanh value of the input argument,Q31 format + atanh_value must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Atanh_2(int angle_para, int *atanh_value); + +/****************************************************************************** +*@brief : calculate the hyperbolic arctangent of the input argument(precision 3) +* +*@param : angle_para : input hyperbolic angle data,range [-0.403 0.403]([-0.806 ~ 0.806]/2),Q31 format; +*@param : atanh_value: the atanh value of the input argument,Q31 format + atanh_value must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Atanh_3(int angle_para, int *atanh_value); + +/****************************************************************************** +*@brief : calculate the hyperbolic arctangent of the input argument(precision 4) +* +*@param : angle_para : input hyperbolic angle data,range [-0.403 0.403]([-0.806 ~ 0.806]/2),Q31 format; +*@param : atanh_value: the atanh value of the input argument,Q31 format + atanh_value must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Atanh_4(int angle_para, int *atanh_value); + +/****************************************************************************** +*@brief : calculate the hyperbolic arctangent of the input argument(precision 5) +* +*@param : angle_para : input hyperbolic angle data,range [-0.403 0.403]([-0.806 ~ 0.806]/2),Q31 format; +*@param : atanh_value: the atanh value of the input argument,Q31 format + atanh_value must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Atanh_5(int angle_para, int *atanh_value); + +/****************************************************************************** +*@brief : calculate the hyperbolic arctangent of the input argument(precision 6) +* +*@param : angle_para : input hyperbolic angle data,range [-0.403 0.403]([-0.806 ~ 0.806]/2),Q31 format; +*@param : atanh_value: the atanh value of the input argument,Q31 format + atanh_value must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Atanh_6(int angle_para, int *atanh_value); + +/****************************************************************************** +*@brief : calculate the hyperbolic arctangent of the input argument(precision 7) +* +*@param : angle_para : input hyperbolic angle data,range [-0.403 0.403]([-0.806 ~ 0.806]/2),Q31 format; +*@param : atanh_value: the atanh value of the input argument,Q31 format + atanh_value must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Atanh_7(int angle_para, int *atanh_value); + +/****************************************************************************** +*@brief : calculate the hyperbolic arctangent of the input argument(precision 8) +* +*@param : angle_para : input hyperbolic angle data,range [-0.403 0.403]([-0.806 ~ 0.806]/2),Q31 format; +*@param : atanh_value: the atanh value of the input argument,Q31 format + atanh_value must be multiplied by 2 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Atanh_8(int angle_para, int *atanh_value); + +/****************************************************************************** +*@brief : calculate the natural logarithm of the input argument(precision 1) +* +*@param : arg : input argument,range [0.054 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.107 x < 1 1 0.0535 ARG1 < 0.5 +* 1 x < 3 2 0.25 ARG1 < 0.75 +* 3 x < 7 3 0.375 ARG1 < 0.875 +* 7 x 9.35 4 0.4375 ARG1 < 0.584 +*@param : ln_value: the natural logarithm value of the input argument,Q31 format +* ln_value must be multiplied by 4 to obtain the correct result. +*@return: None +******************************************************************************/ +void HAL_CORDIC_Ln_1(int arg, int scale, int *ln_value); + +/****************************************************************************** +*@brief : calculate the natural logarithm of the input argument(precision 2) +* +*@param : arg : input argument,range [0.054 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.107 x < 1 1 0.0535 ARG1 < 0.5 +* 1 x < 3 2 0.25 ARG1 < 0.75 +* 3 x < 7 3 0.375 ARG1 < 0.875 +* 7 x 9.35 4 0.4375 ARG1 < 0.584 +*@param : ln_value: the natural logarithm value of the input argument,Q31 format +* ln_value must be multiplied by 4 to obtain the correct result. +*@return: None +******************************************************************************/ +void HAL_CORDIC_Ln_2(int arg, int scale, int *ln_value); + +/****************************************************************************** +*@brief : calculate the natural logarithm of the input argument(precision 3) +* +*@param : arg : input argument,range [0.054 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.107 x < 1 1 0.0535 ARG1 < 0.5 +* 1 x < 3 2 0.25 ARG1 < 0.75 +* 3 x < 7 3 0.375 ARG1 < 0.875 +* 7 x 9.35 4 0.4375 ARG1 < 0.584 +*@param : ln_value: the natural logarithm value of the input argument,Q31 format +* ln_value must be multiplied by 4 to obtain the correct result. +*@return: None +******************************************************************************/ +void HAL_CORDIC_Ln_3(int arg, int scale, int *ln_value); + +/****************************************************************************** +*@brief : calculate the natural logarithm of the input argument(precision 4) +* +*@param : arg : input argument,range [0.054 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.107 x < 1 1 0.0535 ARG1 < 0.5 +* 1 x < 3 2 0.25 ARG1 < 0.75 +* 3 x < 7 3 0.375 ARG1 < 0.875 +* 7 x 9.35 4 0.4375 ARG1 < 0.584 +*@param : ln_value: the natural logarithm value of the input argument,Q31 format +* ln_value must be multiplied by 4 to obtain the correct result. +*@return: None +******************************************************************************/ +void HAL_CORDIC_Ln_4(int arg, int scale, int *ln_value); + +/****************************************************************************** +*@brief : calculate the natural logarithm of the input argument(precision 5) +* +*@param : arg : input argument,range [0.054 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.107 x < 1 1 0.0535 ARG1 < 0.5 +* 1 x < 3 2 0.25 ARG1 < 0.75 +* 3 x < 7 3 0.375 ARG1 < 0.875 +* 7 x 9.35 4 0.4375 ARG1 < 0.584 +*@param : ln_value: the natural logarithm value of the input argument,Q31 format +* ln_value must be multiplied by 4 to obtain the correct result. +*@return: None +******************************************************************************/ +void HAL_CORDIC_Ln_5(int arg, int scale, int *ln_value); + +/****************************************************************************** +*@brief : calculate the natural logarithm of the input argument(precision 6) +* +*@param : arg : input argument,range [0.054 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.107 x < 1 1 0.0535 ARG1 < 0.5 +* 1 x < 3 2 0.25 ARG1 < 0.75 +* 3 x < 7 3 0.375 ARG1 < 0.875 +* 7 x 9.35 4 0.4375 ARG1 < 0.584 +*@param : ln_value: the natural logarithm value of the input argument,Q31 format +* ln_value must be multiplied by 4 to obtain the correct result. +*@return: None +******************************************************************************/ +void HAL_CORDIC_Ln_6(int arg, int scale, int *ln_value); + +/****************************************************************************** +*@brief : calculate the natural logarithm of the input argument(precision 7) +* +*@param : arg : input argument,range [0.054 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.107 x < 1 1 0.0535 ARG1 < 0.5 +* 1 x < 3 2 0.25 ARG1 < 0.75 +* 3 x < 7 3 0.375 ARG1 < 0.875 +* 7 x 9.35 4 0.4375 ARG1 < 0.584 +*@param : ln_value: the natural logarithm value of the input argument,Q31 format +* ln_value must be multiplied by 4 to obtain the correct result. +*@return: None +******************************************************************************/ +void HAL_CORDIC_Ln_7(int arg, int scale, int *ln_value); + +/****************************************************************************** +*@brief : calculate the natural logarithm of the input argument(precision 8) +* +*@param : arg : input argument,range [0.054 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.107 x < 1 1 0.0535 ARG1 < 0.5 +* 1 x < 3 2 0.25 ARG1 < 0.75 +* 3 x < 7 3 0.375 ARG1 < 0.875 +* 7 x 9.35 4 0.4375 ARG1 < 0.584 +*@param : ln_value: the natural logarithm value of the input argument,Q31 format +* ln_value must be multiplied by 4 to obtain the correct result. +*@return: None +******************************************************************************/ +void HAL_CORDIC_Ln_8(int arg, int scale, int *ln_value); + +/****************************************************************************** +*@brief : calculate the square root value of the input argument(precision 1) +* +*@param : arg : input argument,range [0.027 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.027 x < 0.75 0 0.027 ARG1 < 0.75 +* 0.75 x < 1.75 1 0.375 ARG1 < 0.875 +* 1.75 x 2.341 2 0.4375 ARG1 0.585 +*@param : sqrt_value: the squart root value of the input argument,Q31 format +* sqrt_value must be multiplied by 2^scale/W_INV_Q31 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Sqrt_1(int arg, int scale, int *sqrt_value); + +/****************************************************************************** +*@brief : calculate the square root value of the input argument(precision 2) +* +*@param : arg : input argument,range [0.027 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.027 x < 0.75 0 0.027 ARG1 < 0.75 +* 0.75 x < 1.75 1 0.375 ARG1 < 0.875 +* 1.75 x 2.341 2 0.4375 ARG1 0.585 +*@param : sqrt_value: the squart root value of the input argument,Q31 format +* sqrt_value must be multiplied by 2^scale/W_INV_Q31 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Sqrt_2(int arg, int scale, int *sqrt_value); + +/****************************************************************************** +*@brief : calculate the square root value of the input argument(precision 3) +* +*@param : arg : input argument,range [0.027 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.027 x < 0.75 0 0.027 ARG1 < 0.75 +* 0.75 x < 1.75 1 0.375 ARG1 < 0.875 +* 1.75 x 2.341 2 0.4375 ARG1 0.585 +*@param : sqrt_value: the squart root value of the input argument,Q31 format +* sqrt_value must be multiplied by 2^scale/W_INV_Q31 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Sqrt_3(int arg, int scale, int *sqrt_value); + +/****************************************************************************** +*@brief : calculate the square root value of the input argument(precision 4) +* +*@param : arg : input argument,range [0.027 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.027 x < 0.75 0 0.027 ARG1 < 0.75 +* 0.75 x < 1.75 1 0.375 ARG1 < 0.875 +* 1.75 x 2.341 2 0.4375 ARG1 0.585 +*@param : sqrt_value: the squart root value of the input argument,Q31 format +* sqrt_value must be multiplied by 2^scale/W_INV_Q31 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Sqrt_4(int arg, int scale, int *sqrt_value); + +/****************************************************************************** +*@brief : calculate the square root value of the input argument(precision 5) +* +*@param : arg : input argument,range [0.027 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.027 x < 0.75 0 0.027 ARG1 < 0.75 +* 0.75 x < 1.75 1 0.375 ARG1 < 0.875 +* 1.75 x 2.341 2 0.4375 ARG1 0.585 +*@param : sqrt_value: the squart root value of the input argument,Q31 format +* sqrt_value must be multiplied by 2^scale/W_INV_Q31 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Sqrt_5(int arg, int scale, int *sqrt_value); + +/****************************************************************************** +*@brief : calculate the square root value of the input argument(precision 6) +* +*@param : arg : input argument,range [0.027 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.027 x < 0.75 0 0.027 ARG1 < 0.75 +* 0.75 x < 1.75 1 0.375 ARG1 < 0.875 +* 1.75 x 2.341 2 0.4375 ARG1 0.585 +*@param : sqrt_value: the squart root value of the input argument,Q31 format +* sqrt_value must be multiplied by 2^scale/W_INV_Q31 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Sqrt_6(int arg, int scale, int *sqrt_value); + +/****************************************************************************** +*@brief : calculate the square root value of the input argument(precision 7) +* +*@param : arg : input argument,range [0.027 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.027 x < 0.75 0 0.027 ARG1 < 0.75 +* 0.75 x < 1.75 1 0.375 ARG1 < 0.875 +* 1.75 x 2.341 2 0.4375 ARG1 0.585 +*@param : sqrt_value: the squart root value of the input argument,Q31 format +* sqrt_value must be multiplied by 2^scale/W_INV_Q31 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Sqrt_7(int arg, int scale, int *sqrt_value); + +/****************************************************************************** +*@brief : calculate the square root value of the input argument(precision 8) +* +*@param : arg : input argument,range [0.027 0.875],Q31 format; +*@param : scale : scaling factor +* ORIGIN RANGE SCALE ARG RANGE +* 0.027 x < 0.75 0 0.027 ARG1 < 0.75 +* 0.75 x < 1.75 1 0.375 ARG1 < 0.875 +* 1.75 x 2.341 2 0.4375 ARG1 0.585 +*@param : sqrt_value: the squart root value of the input argument,Q31 format +* sqrt_value must be multiplied by 2^scale/W_INV_Q31 to obtain the correct result +*@return: None +******************************************************************************/ +void HAL_CORDIC_Sqrt_8(int arg, int scale, int *sqrt_value); + + +#endif \ No newline at end of file diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_cortex.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_cortex.h new file mode 100644 index 0000000000..bf9bff098b --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_cortex.h @@ -0,0 +1,255 @@ +/****************************************************************************** +*@file : hal_cortex.h +*@brief : Header file of CORTEX HAL module. +******************************************************************************/ + +#ifndef __HAL_CORTEX_H +#define __HAL_CORTEX_H + +#include "hal_def.h" + +#if (__MPU_PRESENT == 1U) +typedef struct +{ + uint8_t Enable; /*!< Specifies the status of the region. + This parameter can be a value of @ref CORTEX_MPU_Region_Enable */ + uint8_t Number; /*!< Specifies the number of the region to protect. + This parameter can be a value of @ref CORTEX_MPU_Region_Number */ + uint32_t BaseAddress; /*!< Specifies the base address of the region to protect. */ + uint32_t LimitAddress; /*!< Specifies the limit address of the region to protect. */ + uint8_t AttributesIndex; /*!< Specifies the memory attributes index. + This parameter can be a value of @ref CORTEX_MPU_Attributes_Number */ + uint8_t AccessPermission; /*!< Specifies the region access permission type. + This parameter can be a value of @ref CORTEX_MPU_Region_Permission_Attributes */ + uint8_t DisableExec; /*!< Specifies the instruction access status. + This parameter can be a value of @ref CORTEX_MPU_Instruction_Access */ + uint8_t IsShareable; /*!< Specifies the shareability status of the protected region. + This parameter can be a value of @ref CORTEX_MPU_Access_Shareable */ +} MPU_Region_InitTypeDef; + +typedef struct +{ + uint8_t Number; /*!< Specifies the number of the memory attributes to configure. + This parameter can be a value of @ref CORTEX_MPU_Attributes_Number */ + + uint8_t Attributes; /*!< Specifies the memory attributes vue. + This parameter must be a number between Min_Data = 0x0 and Max_Data = 0xFFFF */ + +} MPU_Attributes_InitTypeDef; + +#endif /* __MPU_PRESENT */ + + +/** CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group */ +#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority, 4 bits for subpriority */ +#define NVIC_PRIORITYGROUP_1 0x00000006U /*!< 1 bits for pre-emption priority, 3 bits for subpriority */ +#define NVIC_PRIORITYGROUP_2 0x00000005U /*!< 2 bits for pre-emption priority, 2 bits for subpriority */ +#define NVIC_PRIORITYGROUP_3 0x00000004U /*!< 3 bits for pre-emption priority, 1 bits for subpriority */ +#define NVIC_PRIORITYGROUP_4 0x00000003U /*!< 4 bits for pre-emption priority, 0 bits for subpriority */ + +/** CORTEX_SysTick_clock_source CORTEX _SysTick clock source */ +#define SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U +#define SYSTICK_CLKSOURCE_HCLK 0x00000004U + + +/** CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control */ +#if (__MPU_PRESENT == 1) +#define MPU_HFNMI_PRIVDEF_NONE 0U +#define MPU_HARDFAULT_NMI 2U +#define MPU_PRIVILEGED_DEFAULT 4U +#define MPU_HFNMI_PRIVDEF 6U + +/** CORTEX_MPU_Region_Enable CORTEX MPU Region Enable */ +#define MPU_REGION_ENABLE 1U +#define MPU_REGION_DISABLE 0U + +/** CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access */ +#define MPU_INSTRUCTION_ACCESS_ENABLE 0U +#define MPU_INSTRUCTION_ACCESS_DISABLE 1U + +/** CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable */ +#define MPU_ACCESS_NOT_SHAREABLE 0U +#define MPU_ACCESS_OUTER_SHAREABLE 1U +#define MPU_ACCESS_INNER_SHAREABLE 3U + +/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes */ +#define MPU_REGION_PRIV_RW 0U +#define MPU_REGION_ALL_RW 1U +#define MPU_REGION_PRIV_RO 2U +#define MPU_REGION_ALL_RO 3U + +/** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number */ +#define MPU_REGION_NUMBER0 0U +#define MPU_REGION_NUMBER1 1U +#define MPU_REGION_NUMBER2 2U +#define MPU_REGION_NUMBER3 3U +#define MPU_REGION_NUMBER4 4U +#define MPU_REGION_NUMBER5 5U +#define MPU_REGION_NUMBER6 6U +#define MPU_REGION_NUMBER7 7U + +/** @defgroup CORTEX_MPU_Attributes_Number CORTEX MPU Memory Attributes Number */ +#define MPU_ATTRIBUTES_NUMBER0 0U +#define MPU_ATTRIBUTES_NUMBER1 1U +#define MPU_ATTRIBUTES_NUMBER2 2U +#define MPU_ATTRIBUTES_NUMBER3 3U +#define MPU_ATTRIBUTES_NUMBER4 4U +#define MPU_ATTRIBUTES_NUMBER5 5U +#define MPU_ATTRIBUTES_NUMBER6 6U +#define MPU_ATTRIBUTES_NUMBER7 7U + +/** @defgroup CORTEX_MPU_Attributes CORTEX MPU Attributes */ +#define MPU_DEVICE_nGnRnE 0x0U /* Device, noGather, noReorder, noEarly acknowledge. */ +#define MPU_DEVICE_nGnRE 0x4U /* Device, noGather, noReorder, Early acknowledge. */ +#define MPU_DEVICE_nGRE 0x8U /* Device, noGather, Reorder, Early acknowledge. */ +#define MPU_DEVICE_GRE 0xCU /* Device, Gather, Reorder, Early acknowledge. */ + +#define MPU_WRITE_THROUGH 0x0U /* Normal memory, write-through. */ +#define MPU_NOT_CACHEABLE 0x4U /* Normal memory, non-cacheable. */ +#define MPU_WRITE_BACK 0x4U /* Normal memory, write-back. */ + +#define MPU_TRANSIENT 0x0U /* Normal memory, transient. */ +#define MPU_NON_TRANSIENT 0x8U /* Normal memory, non-transient. */ + +#define MPU_NO_ALLOCATE 0x0U /* Normal memory, no allocate. */ +#define MPU_W_ALLOCATE 0x1U /* Normal memory, write allocate. */ +#define MPU_R_ALLOCATE 0x2U /* Normal memory, read allocate. */ +#define MPU_RW_ALLOCATE 0x3U /* Normal memory, read/write allocate. */ + +#define OUTER(__ATTR__) ((__ATTR__) << 4U) +#define INNER_OUTER(__ATTR__) ((__ATTR__) | ((__ATTR__) << 4U)) + + +//@defgroup MPU_HFNMI_xxxx +//@{ +#define MPU_HFNMI_DISABLE (0) // MPU is disabled during HardFault and NMI handlers +#define MPU_HFNMI_ENABLE (1) // The MPU is enabled during HardFault and NMI handlers +//@} + +//@defgroup MPU_PRIVDEF_xxxx +//@{ +#define MPU_PRIVDEF_DISABLE (0) // Disables use of the default memory map +#define MPU_PRIVDEF_ENABLE (1) // Enables use of the default memory map as a background region for privileged software accesses +//@} + +//@defgroup MPU_ACCESS_xxxx +//@{ +#define MPU_ACCESS_PRIV_READ_WRITE (0) // Read/write by privileged code only +#define MPU_ACCESS_ALL_READ_WRITE (1) // Read/write by any privilege level +#define MPU_ACCESS_PRIV_READ_ONLY (2) // Read-only by privileged code only +#define MPU_ACCESS_ALL_READ_ONLY (3) // Read-only by any privilege level +//@} + +//@defgroup MPU_EXECUTE_xxxx +//@{ +#define MPU_EXECUTE_ENABLE (0) // Enables execution +#define MPU_EXECUTE_DISABLE (1) // Disables execution +//@} + +//@defgroup MPU_ATTR_xxxx +//@{ +#define MPU_ATTR_NO_CACHE (0x44) //normal memory,non-cacheable +#define MPU_ATTR_WRITE_THROUGH (0xAA) //normal memory,write-through,read-allocation +#define MPU_ATTR_WRITE_BACK (0xFF) //normal memory,write-back,read-allocation,write-allocation +#define MPU_ATTR_DEVICE (0x00) //device memory?nGnRnE +//@} + +typedef struct +{ + uint32_t BaseAddr; // the lower inclusive limit of the selected MPU memory region,lower 5 bits fixed to 0b'00000 + uint32_t LimitAddr; // the upper inclusive limit of the selected MPU memory region,lower 5 bits fixed to 0b'11111 + uint8_t Access; // read/write access permissions. @ref MPU_ACCESS_xxxx + uint8_t Execute; // execute permissions. @ref MPU_EXECUTE_xxxx + uint8_t Attr; // attributes, @ref MPU_ATTR_xxxx +}MPU_RegionConfigTypeDef; + +typedef struct +{ + uint8_t HfNmi; // @ref MPU_HFNMI_xxxx + uint8_t PrivDef; // @ref MPU_PRIVDEF_xxxx + uint8_t RegionCount; // region count. + MPU_RegionConfigTypeDef *RegionConfigs; //region configs. +}MPU_ConfigInitTypeDef; + +#endif /* __MPU_PRESENT */ + + +void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); +void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); +void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); +void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); +void HAL_NVIC_SystemReset(void); +HAL_StatusTypeDef HAL_SYSTICK_Config(uint32_t TicksNum); + +uint32_t HAL_NVIC_GetPriorityGrouping(void); +void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority); +uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); +void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn); +void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn); +uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn); + +void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource); +void HAL_SYSTICK_IRQHandler(void); +void HAL_SYSTICK_Callback(void); + +#if (__MPU_PRESENT == 1U) +void HAL_MPU_Enable(uint32_t MPU_Control); +void HAL_MPU_Disable(void); +void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_RegionInit); +void HAL_MPU_ConfigMemoryAttributes(MPU_Attributes_InitTypeDef *MPU_AttributesInit); +void HAL_MPU_Config(MPU_ConfigInitTypeDef *MPU_configInit); +#endif /* __MPU_PRESENT */ + + +/** @defgroup CORTEX_Private_Macros CORTEX Private Macros */ +#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PRIORITYGROUP_0) || \ + ((GROUP) == NVIC_PRIORITYGROUP_1) || \ + ((GROUP) == NVIC_PRIORITYGROUP_2) || \ + ((GROUP) == NVIC_PRIORITYGROUP_3) || \ + ((GROUP) == NVIC_PRIORITYGROUP_4)) + +#define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY) ((PRIORITY) < 0x10U) + +#define IS_NVIC_SUB_PRIORITY(PRIORITY) ((PRIORITY) < 0x10U) + +#define IS_NVIC_DEVICE_IRQ(IRQ) ((IRQ) >= (IRQn_Type)0x00U) + +#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SYSTICK_CLKSOURCE_HCLK) || \ + ((SOURCE) == SYSTICK_CLKSOURCE_HCLK_DIV8)) + +#if (__MPU_PRESENT == 1U) +#define IS_MPU_REGION_ENABLE(STATE) (((STATE) == MPU_REGION_ENABLE) || \ + ((STATE) == MPU_REGION_DISABLE)) + +#define IS_MPU_INSTRUCTION_ACCESS(STATE) (((STATE) == MPU_INSTRUCTION_ACCESS_ENABLE) || \ + ((STATE) == MPU_INSTRUCTION_ACCESS_DISABLE)) + +#define IS_MPU_ACCESS_SHAREABLE(STATE) (((STATE) == MPU_ACCESS_OUTER_SHAREABLE) || \ + ((STATE) == MPU_ACCESS_INNER_SHAREABLE) || \ + ((STATE) == MPU_ACCESS_NOT_SHAREABLE)) + +#define IS_MPU_REGION_PERMISSION_ATTRIBUTE(TYPE) (((TYPE) == MPU_REGION_PRIV_RW) || \ + ((TYPE) == MPU_REGION_ALL_RW) || \ + ((TYPE) == MPU_REGION_PRIV_RO) || \ + ((TYPE) == MPU_REGION_ALL_RO)) + +#define IS_MPU_REGION_NUMBER(NUMBER) (((NUMBER) == MPU_REGION_NUMBER0) || \ + ((NUMBER) == MPU_REGION_NUMBER1) || \ + ((NUMBER) == MPU_REGION_NUMBER2) || \ + ((NUMBER) == MPU_REGION_NUMBER3) || \ + ((NUMBER) == MPU_REGION_NUMBER4) || \ + ((NUMBER) == MPU_REGION_NUMBER5) || \ + ((NUMBER) == MPU_REGION_NUMBER6) || \ + ((NUMBER) == MPU_REGION_NUMBER7)) + +#define IS_MPU_ATTRIBUTES_NUMBER(NUMBER) (((NUMBER) == MPU_ATTRIBUTES_NUMBER0) || \ + ((NUMBER) == MPU_ATTRIBUTES_NUMBER1) || \ + ((NUMBER) == MPU_ATTRIBUTES_NUMBER2) || \ + ((NUMBER) == MPU_ATTRIBUTES_NUMBER3) || \ + ((NUMBER) == MPU_ATTRIBUTES_NUMBER4) || \ + ((NUMBER) == MPU_ATTRIBUTES_NUMBER5) || \ + ((NUMBER) == MPU_ATTRIBUTES_NUMBER6) || \ + ((NUMBER) == MPU_ATTRIBUTES_NUMBER7)) +#endif /* __MPU_PRESENT */ + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_crc.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_crc.h new file mode 100644 index 0000000000..244505bd2f --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_crc.h @@ -0,0 +1,159 @@ + +/****************************************************************************** +*@file : hal_crc.h +*@brief : Header file for CRC module. +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ + +#ifndef __HAL_CRC_H__ +#define __HAL_CRC_H__ + +#include "hal.h" + +/** @defgroup CRC POLY Reverse + * @{ + */ + #define CRC_POLY_REV_EN (0x00000400U) /*!< Poly Reverse Enable */ + #define CRC_POLY_REV_DIS (0x00000000U) /*!< Poly Reverse Disable */ +/** + * @} + */ + +/** @defgroup CRC OUTXOR Reverse + * @{ + */ + #define CRC_OUTXOR_REV_EN (0x00000200U) /*!< OUTXOR Reverse Enable */ + #define CRC_OUTXOR_REV_DIS (0x00000000U) /*!< OUTXOR Reverse Disable */ +/** + * @} + */ + +/** @defgroup CRC INIT Reverse + * @{ + */ + #define CRC_INIT_REV_EN (0x00000100U) /*!< INIT Reverse Enable */ + #define CRC_INIT_REV_DIS (0x00000000U) /*!< INIT Reverse Disable */ +/** + * @} + */ + +/** @defgroup CRC RSLT Reverse + * @{ + */ + #define CRC_RSLT_REV_EN (0x00000080U) /*!< RSLT Reverse Enable */ + #define CRC_RSLT_REV_DIS (0x00000000U) /*!< RSLT Reverse Disable */ +/** + * @} + */ + +/** @defgroup CRC DATA Reverse + * @{ + */ + #define CRC_DATA_REV_DISABLE (0x00000000U) /*!< DATA Reverse Disable */ + #define CRC_DATA_REV_BY_BYTE (0x00000020U) /*!< DATA Reverse By Byte */ + #define CRC_DATA_REV_BY_HALFWORD (0x00000040U) /*!< DATA Reverse By HalfWord */ + #define CRC_DATA_REV_BY_WORD (0x00000060U) /*!< DATA Reverse By Word */ +/** + * @} + */ + +/** @defgroup CRC Poly Len + * @{ + */ + #define CRC_POLTY_LEN_32 (0x00000000U) /*!< POLY len = 32bit */ + #define CRC_POLTY_LEN_16 (0x00000008U) /*!< POLY len = 16bit */ + #define CRC_POLTY_LEN_8 (0x00000010U) /*!< POLY len = 8bit */ + #define CRC_POLTY_LEN_7 (0x00000018U) /*!< POLY len = 7bit */ +/** + * @} + */ + +/** @defgroup CRC Data Len + * @{ + */ + #define CRC_DATA_LEN_1B (0x00000000U) /*!< DATA len = 1 Byte */ + #define CRC_DATA_LEN_2B (0x00000002U) /*!< DATA len = 2 Byte */ + #define CRC_DATA_LEN_3B (0x00000004U) /*!< DATA len = 3 Byte */ + #define CRC_DATA_LEN_4B (0x00000006U) /*!< DATA len = 4 Byte */ +/** + * @} + */ + +/** @defgroup CRC RST + * @{ + */ + #define CRC_RST_EN (0x00000001U) /*!< RST CRC_DATA To CRC_INIT */ + #define CRC_RST_DIS (0x00000000U) /*!< RST CRC_DATA To CRC_INIT */ + +/** + * @} + */ + +/* + * @brief CRC Init Structure definition + */ +typedef struct +{ + uint32_t PolyRev; /*!< Specifies if the Poly is reversed in CRC + This parameter can be a value of @ref CRC POLY Reverse. */ + uint32_t OutxorRev; /*!< Specifies if the Outxor is reversed in CRC + This parameter can be a value of @ref CRC OUTXOR Reverse. */ + uint32_t InitRev; /*!< Specifies if the Init is reversed in CRC + This parameter can be a value of @ref CRC INIT Reverse. */ + uint32_t RsltRev; /*!< Specifies if the Result is reversed in CRC + This parameter can be a value of @ref CRC RSLT Reverse. */ + uint32_t DataRev; /*!< Specifies if the Data is reversed in CRC + This parameter can be a value of @ref CRC DATA Reverse. */ + uint32_t PolyLen; /*!< Specifies the Poly Len in CRC + This parameter can be a value of @ref CRC Poly Len. */ + uint32_t DataLen; /*!< Specifies the Data Len in CRC + This parameter can be a value of @ref CRC Data Len. */ + uint32_t RST; /*!< Specifies if CRC is reset + This parameter can be a value of @ref CRC RST. */ + + uint32_t InitData; /*!< This member configures the InitData. */ + + uint32_t OutXorData; /*!< This member configures the OutXorData. */ + + uint32_t PolyData; /*!< This member configures the PolyData. */ + + uint32_t FData; /*!< This member configures the FData. */ + +}CRC_InitTypeDef; + +/* + * @brief UART handle Structure definition + */ +typedef struct +{ + CRC_TypeDef *Instance; /*!< CRC registers base address */ + + CRC_InitTypeDef Init; /*!< CRC calculate parameters */ + + void* CRC_Data_Buff; /*!< CRC databuff base address */ + + uint32_t CRC_Data_Len; /*!< amount of CRC data to be calculated */ + +}CRC_HandleTypeDef; + +/****************************************************************************** +*@brief : Calculate the crc calue of input data +*@param : hcrc: pointer to the CRC handle +*@return: CRC value +******************************************************************************/ +uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc); + +/****************************************************************************** +*@brief : Initialize CRC +*@param : hcrc: pointer to the CRC handle +*@return: None +******************************************************************************/ +void HAL_CRC_Init(CRC_HandleTypeDef *hcrc); + + +#endif + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dac.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dac.h new file mode 100644 index 0000000000..f4aefa7e4f --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dac.h @@ -0,0 +1,397 @@ +/* + ****************************************************************************** + * @file HAL_DAC.h + * @version V1.0.0 + * @date 2020 + * @brief Header file of DAC HAL module. + ****************************************************************************** +*/ +#ifndef __HAL_DAC_H__ +#define __HAL_DAC_H__ + +#include "acm32h5xx_hal_conf.h" + + +/** + * @brief DAC Configuration sample and hold Channel structure definition + */ +typedef struct +{ + uint32_t DAC_SampleTime ; /*!< Specifies the Sample time for the selected channel. + This parameter applies when DAC_SampleAndHold is DAC_SAMPLEANDHOLD_ENABLE. + This parameter must be a number between Min_Data = 0 and Max_Data = 1023 */ + + uint32_t DAC_HoldTime ; /*!< Specifies the hold time for the selected channel + This parameter applies when DAC_SampleAndHold is DAC_SAMPLEANDHOLD_ENABLE. + This parameter must be a number between Min_Data = 0 and Max_Data = 1023 */ + + uint32_t DAC_RefreshTime ; /*!< Specifies the refresh time for the selected channel + This parameter applies when DAC_SampleAndHold is DAC_SAMPLEANDHOLD_ENABLE. + This parameter must be a number between Min_Data = 0 and Max_Data = 255 */ +}DAC_SampleAndHoldConfTypeDef; + + +typedef struct +{ + uint32_t DAC_Calibration ; /*!< Specifies the Sample time for the selected channel. + This parameter can be a value of @ref DAC_Calibration */ + + uint32_t DAC_Calibration_TRIM ; /*!< Specifies the hold time for the selected channel + This parameter applies when DAC_SampleAndHold is DAC_SAMPLEANDHOLD_ENABLE. + This parameter must be a number between Min_Data = 0 and Max_Data = 1023 */ +}DAC_CalibrationConfTypeDef; + +/** + * @brief DAC Configuration regular Channel structure definition + */ +typedef struct +{ + FunctionalState DAC_DMADoubleDataMode; /*!< Specifies if DMA double data mode should be enabled or not for the selected channel. + This parameter can be ENABLE or DISABLE */ + + FunctionalState DAC_SignedFormat; /*!< Specifies if signed format should be used or not for the selected channel. + This parameter can be ENABLE or DISABLE */ + + uint32_t DAC_SampleAndHold; /*!< Specifies whether the DAC mode. + This parameter can be a value of @ref DAC_SampleAndHold */ + + union{ + uint32_t DAC_Trigger; /*!< DAC normal trigger */ + uint32_t SawtoothResetTrigger; /*!< DAC SawTooth wave reset trigger */ + }; + + uint32_t SawtoothStepTrigger; /*!< DAC SawTooth wave step trigger */ + + uint32_t DAC_OutputBuffer; /*!< Specifies whether the DAC channel output buffer is enabled or disabled. + This parameter can be a value of @ref DAC_output_buffer */ + + + uint32_t DAC_ConnectOnChipPeripheral ; /*!< Specifies whether the DAC output is connected or not to on chip peripheral . + This parameter can be a value of @ref DAC_ConnectOnChipPeripheral */ + + uint32_t DAC_UserTrimming; /*!< Specifies the trimming mode + This parameter must be a value of @ref DAC_UserTrimming + DAC_UserTrimming is either factory or user trimming */ + + uint32_t DAC_TrimmingValue; /*!< Specifies the offset trimming value + i.e. when DAC_SampleAndHold is DAC_TRIMMING_USER. + This parameter must be a number between Min_Data = 1 and Max_Data = 31 */ + + DAC_SampleAndHoldConfTypeDef DAC_SampleAndHoldConfig; /*!< Sample and Hold settings */ + +}DAC_ChannelConfTypeDef; + +/** + * @brief CAN handle Structure definition + */ +typedef struct +{ + DAC_TypeDef *Instance; /*!< Register base address */ + +#ifdef HAL_DMA_MODULE_ENABLED + DMA_HandleTypeDef *DMA_Handle1; /*!< Pointer DMA handler for channel 1 */ + + DMA_HandleTypeDef *DMA_Handle2; /*!< Pointer DMA handler for channel 2 */ +#endif + +}DAC_HandleTypeDef; + + +#define IS_DAC_INSTANCE(INSTANCE) (((INSTANCE) == DAC1) || ((INSTANCE) == DAC2)) + + + +/** @defgroup DAC_SampleAndHold DAC power mode + * @{ + */ +#define IS_DAC_SAMPLETIME(TIME) ((TIME) <= 0x000003FFU) +#define IS_DAC_HOLDTIME(TIME) ((TIME) <= 0x000003FFU) +#define IS_DAC_REFRESHTIME(TIME) ((TIME) <= 0x000000FFU) + + +/** @defgroup DAC_CHANNEL + * @{ + */ + +#define DAC_CHANNEL_1 0x00000000U +#define DAC_CHANNEL_2 0x00000010U +#define DAC_CHANNEL_Dual 0x00000020U +#define IS_DAC_CHANNEL(CHANNEL) (((CHANNEL) == DAC_CHANNEL_1) || \ + ((CHANNEL) == DAC_CHANNEL_2) || \ + ((CHANNEL) == DAC_CHANNEL_Dual)) +/** + * @} + */ + + +#define DAC_CR_WAVE_DISABLE (0U) +#define DAC_CR_WAVE_NOISE (DAC_CR_WAVE1_0) +#define DAC_CR_WAVE_TRIANGLE (DAC_CR_WAVE1_1) +#define DAC_CR_WAVE_SAWTOOTH (DAC_CR_WAVE1_0 | DAC_CR_WAVE1_1) + + +/** @defgroup DACEx_SawtoothPolarityMode DAC Sawtooth polarity mode + * @{ + */ +#define DAC_SAWTOOTH_POLARITY_DECREMENT 0x00000000U /*!< Sawtooth wave generation, polarity is decrement */ +#define DAC_SAWTOOTH_POLARITY_INCREMENT (DAC_STR1_STDIR1) /*!< Sawtooth wave generation, polarity is increment */ +#define IS_DAC_SAWTOOTH_POLARITY(POLARITY) ((POLARITY == DAC_SAWTOOTH_POLARITY_DECREMENT) || \ + (POLARITY == DAC_SAWTOOTH_POLARITY_INCREMENT)) + +/** + * @} + */ + /** @defgroup DAC_trigger + * @{ + */ +#define DAC_TRIGGER_NONE 0x00000000U /*!< conversion is automatic once the DAC_DHRxxxx register has been loaded, and not by external trigger */ +#define DAC_TRIGGER_SOFTWARE (0x00000000U | DAC_CR_TEN1) /*!< conversion started by software trigger for DAC channel */ +#define DAC_TRIGGER_T1_TRGO (DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< TIM1 TRGO selected as external conversion trigger for DAC channel. Refer to device datasheet for DACx availability. */ +#define DAC_TRIGGER_T2_TRGO (DAC_CR_TSEL1_1 | DAC_CR_TEN1) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_TRIGGER_T4_TRGO (DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< TIM4 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_TRIGGER_T5_TRGO (DAC_CR_TSEL1_2 | DAC_CR_TEN1) /*!< TIM5 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_TRIGGER_T6_TRGO (DAC_CR_TSEL1_2 | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< TIM6 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_TRIGGER_T7_TRGO (DAC_CR_TSEL1_2 | DAC_CR_TSEL1_1 | DAC_CR_TEN1) /*!< TIM7 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_TRIGGER_T8_TRGO (DAC_CR_TSEL1_2 | DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_TRIGGER_T15_TRGO (DAC_CR_TSEL1_3 | DAC_CR_TEN1) /*!< TIM15 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_TRIGGER_LPT1_TRGO (DAC_CR_TSEL1_3 | DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< LPTIM1 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_TRIGGER_LPT2_TRGO (DAC_CR_TSEL1_3 | DAC_CR_TSEL1_2 | DAC_CR_TEN1) /*!< LPTIM2 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_TRIGGER_EXTI9 (DAC_CR_TSEL1_3 | DAC_CR_TSEL1_2 | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */ +#define DAC_TRIGGER_EXTI10 (DAC_CR_TSEL1_3 | DAC_CR_TSEL1_2 | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */ + +#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_TRIGGER_NONE) || \ + ((TRIGGER) == DAC_TRIGGER_SOFTWARE) || \ + ((TRIGGER) == DAC_TRIGGER_T1_TRGO) || \ + ((TRIGGER) == DAC_TRIGGER_T2_TRGO) || \ + ((TRIGGER) == DAC_TRIGGER_T4_TRGO) || \ + ((TRIGGER) == DAC_TRIGGER_T5_TRGO) || \ + ((TRIGGER) == DAC_TRIGGER_T6_TRGO) || \ + ((TRIGGER) == DAC_TRIGGER_T7_TRGO) || \ + ((TRIGGER) == DAC_TRIGGER_T8_TRGO) || \ + ((TRIGGER) == DAC_TRIGGER_T15_TRGO) || \ + ((TRIGGER) == DAC_TRIGGER_LPT1_TRGO)|| \ + ((TRIGGER) == DAC_TRIGGER_LPT2_TRGO)|| \ + ((TRIGGER) == DAC_TRIGGER_EXTI9)) +/** + * @} + */ + +/** @defgroup DAC_wave_generation + * @{ + */ + +#define DAC_WaveGeneration_None 0x00000000U +#define DAC_WaveGeneration_Noise 0x00000001U +#define DAC_WaveGeneration_Triangle 0x00000002U +#define IS_DAC_GENERATE_WAVE(WAVE) (((WAVE) == DAC_WaveGeneration_None) || \ + ((WAVE) == DAC_WaveGeneration_Noise) || \ + ((WAVE) == DAC_WaveGeneration_Triangle)) +/** + * @} + */ +/** @defgroup DAC_lfsrunmask_triangleamplitude + * @{ + */ +#define DAC_LFSRUNMASK_BIT0 0x00000000U /*!< Unmask DAC channel LFSR bit0 for noise wave generation */ +#define DAC_LFSRUNMASK_BITS1_0 (DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[1:0] for noise wave generation */ +#define DAC_LFSRUNMASK_BITS2_0 (DAC_CR_MAMP1_1) /*!< Unmask DAC channel LFSR bit[2:0] for noise wave generation */ +#define DAC_LFSRUNMASK_BITS3_0 (DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[3:0] for noise wave generation */ +#define DAC_LFSRUNMASK_BITS4_0 (DAC_CR_MAMP1_2) /*!< Unmask DAC channel LFSR bit[4:0] for noise wave generation */ +#define DAC_LFSRUNMASK_BITS5_0 (DAC_CR_MAMP1_2| DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[5:0] for noise wave generation */ +#define DAC_LFSRUNMASK_BITS6_0 (DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1) /*!< Unmask DAC channel LFSR bit[6:0] for noise wave generation */ +#define DAC_LFSRUNMASK_BITS7_0 (DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[7:0] for noise wave generation */ +#define DAC_LFSRUNMASK_BITS8_0 (DAC_CR_MAMP1_3) /*!< Unmask DAC channel LFSR bit[8:0] for noise wave generation */ +#define DAC_LFSRUNMASK_BITS9_0 (DAC_CR_MAMP1_3 | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[9:0] for noise wave generation */ +#define DAC_LFSRUNMASK_BITS10_0 (DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1) /*!< Unmask DAC channel LFSR bit[10:0] for noise wave generation */ +#define DAC_LFSRUNMASK_BITS11_0 (DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[11:0] for noise wave generation */ +#define DAC_TRIANGLEAMPLITUDE_1 0x00000000U /*!< Select max triangle amplitude of 1 */ +#define DAC_TRIANGLEAMPLITUDE_3 (DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 3 */ +#define DAC_TRIANGLEAMPLITUDE_7 (DAC_CR_MAMP1_1) /*!< Select max triangle amplitude of 7 */ +#define DAC_TRIANGLEAMPLITUDE_15 (DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 15 */ +#define DAC_TRIANGLEAMPLITUDE_31 (DAC_CR_MAMP1_2) /*!< Select max triangle amplitude of 31 */ +#define DAC_TRIANGLEAMPLITUDE_63 (DAC_CR_MAMP1_2 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 63 */ +#define DAC_TRIANGLEAMPLITUDE_127 (DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1) /*!< Select max triangle amplitude of 127 */ +#define DAC_TRIANGLEAMPLITUDE_255 (DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 255 */ +#define DAC_TRIANGLEAMPLITUDE_511 (DAC_CR_MAMP1_3) /*!< Select max triangle amplitude of 511 */ +#define DAC_TRIANGLEAMPLITUDE_1023 (DAC_CR_MAMP1_3 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 1023 */ +#define DAC_TRIANGLEAMPLITUDE_2047 (DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1) /*!< Select max triangle amplitude of 2047 */ +#define DAC_TRIANGLEAMPLITUDE_4095 (DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 4095 */ + +#define IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(VALUE) (((VALUE) == DAC_LFSRUNMASK_BIT0) || \ + ((VALUE) == DAC_LFSRUNMASK_BITS1_0) || \ + ((VALUE) == DAC_LFSRUNMASK_BITS2_0) || \ + ((VALUE) == DAC_LFSRUNMASK_BITS3_0) || \ + ((VALUE) == DAC_LFSRUNMASK_BITS4_0) || \ + ((VALUE) == DAC_LFSRUNMASK_BITS5_0) || \ + ((VALUE) == DAC_LFSRUNMASK_BITS6_0) || \ + ((VALUE) == DAC_LFSRUNMASK_BITS7_0) || \ + ((VALUE) == DAC_LFSRUNMASK_BITS8_0) || \ + ((VALUE) == DAC_LFSRUNMASK_BITS9_0) || \ + ((VALUE) == DAC_LFSRUNMASK_BITS10_0) || \ + ((VALUE) == DAC_LFSRUNMASK_BITS11_0) || \ + ((VALUE) == DAC_TRIANGLEAMPLITUDE_1) || \ + ((VALUE) == DAC_TRIANGLEAMPLITUDE_3) || \ + ((VALUE) == DAC_TRIANGLEAMPLITUDE_7) || \ + ((VALUE) == DAC_TRIANGLEAMPLITUDE_15) || \ + ((VALUE) == DAC_TRIANGLEAMPLITUDE_31) || \ + ((VALUE) == DAC_TRIANGLEAMPLITUDE_63) || \ + ((VALUE) == DAC_TRIANGLEAMPLITUDE_127) || \ + ((VALUE) == DAC_TRIANGLEAMPLITUDE_255) || \ + ((VALUE) == DAC_TRIANGLEAMPLITUDE_511) || \ + ((VALUE) == DAC_TRIANGLEAMPLITUDE_1023) || \ + ((VALUE) == DAC_TRIANGLEAMPLITUDE_2047) || \ + ((VALUE) == DAC_TRIANGLEAMPLITUDE_4095)) +/** + * @} + */ + + /** @defgroup DAC_MODE + * @{ + */ + +#define DAC_Mode_Normal_BufferEnable_OutPAD 0x00000000U +#define DAC_Mode_Normal_BufferEnable_OutPAD_OutInternal 0x00000001U +#define DAC_Mode_Normal_BufferDisable_OutPAD 0x00000002U +#define DAC_Mode_Normal_BufferDisable_OutPAD_OutInternal 0x00000003U + +#define DAC_Mode_SampleAndHold_BufferEnable_OutPAD 0x00000004U +#define DAC_Mode_SampleAndHold_BufferEnable_OutPAD_OutInternal 0x00000005U +#define DAC_Mode_SampleAndHold_BufferDisable_OutPAD_OutInternal 0x00000006U +#define DAC_Mode_SampleAndHold_BufferDisable_OutInternal 0x00000007U +#define IS_DAC_MODE(MODE) (((MODE) == DAC_Mode_Normal_BufferEnable_OutPAD) || \ + ((MODE) == DAC_Mode_Normal_BufferEnable_OutPAD_OutInternal) || \ + ((MODE) == DAC_Mode_Normal_BufferDisable_OutPAD)|| \ + ((MODE) == DAC_Mode_Normal_BufferDisable_OutPAD_OutInternal)|| \ + ((MODE) == DAC_Mode_SampleAndHold_BufferEnable_OutPAD)|| \ + ((MODE) == DAC_Mode_SampleAndHold_BufferEnable_OutPAD_OutInternal)|| \ + ((MODE) == DAC_Mode_SampleAndHold_BufferDisable_OutPAD_OutInternal)|| \ + ((MODE) == DAC_Mode_SampleAndHold_BufferDisable_OutInternal)) +/** + * @} + */ + + /** @defgroup DAC_SampleAndHold DAC power mode + * @{ + */ +#define DAC_SAMPLEANDHOLD_DISABLE 0x00000000U +#define DAC_SAMPLEANDHOLD_ENABLE (DAC_MCR_MODE1_2) +#define IS_DAC_SAMPLEANDHOLD(MODE) (((MODE) == DAC_SAMPLEANDHOLD_DISABLE) || \ + ((MODE) == DAC_SAMPLEANDHOLD_ENABLE)) +/** + * @} + */ + + + /** @defgroup DAC_UserTrimming DAC User Trimming +* @{ +*/ + +#define DAC_TRIMMING_FACTORY 0x00000000U /*!< Factory trimming */ +#define DAC_TRIMMING_USER 0x00000001U /*!< User trimming */ +#define IS_DAC_TRIMMING(TRIMMING) (((TRIMMING) == DAC_TRIMMING_FACTORY) || \ + ((TRIMMING) == DAC_TRIMMING_USER)) +#define IS_DAC_TRIMMINGVALUE(TRIMMINGVALUE) ((TRIMMINGVALUE) <= 0x1FU) +/** + * @} + */ + + /** @defgroup DAC_Calibration + * @{ + */ + +#define DAC_Calibration_Disable 0x00000000U +#define DAC_Calibration_Enable 0x00000001U +#define IS_DAC_Calibration(Calibration) (((Calibration) == DAC_Calibration_Disable) || \ + ((Calibration) == DAC_Calibration_Enable)) + +#define IS_DAC_Calibration_TRIM(TRIM) ((TRIM) <= 0x1FU) +/** + * @} + */ + /** @defgroup DAC_output_buffer DAC output buffer + * @{ + */ +#define DAC_OUTPUTBUFFER_ENABLE 0x00000000U +#define DAC_OUTPUTBUFFER_DISABLE (DAC_MCR_MODE1_1) +#define IS_DAC_OUTPUT_BUFFER_STATE(STATE) (((STATE) == DAC_OUTPUTBUFFER_ENABLE) || \ + ((STATE) == DAC_OUTPUTBUFFER_DISABLE)) +/** + * @} + */ + + +/** @defgroup DAC_ConnectOnChipPeripheral DAC ConnectOnChipPeripheral + * @{ + */ + +#define DAC_CHIPCONNECT_EXTERNAL (1UL << 0) +#define DAC_CHIPCONNECT_INTERNAL (1UL << 1) +#define DAC_CHIPCONNECT_BOTH (1UL << 2) + +#define IS_DAC_CHIP_CONNECTION_BUFON(CONNECT) (((CONNECT) == DAC_CHIPCONNECT_EXTERNAL) || \ + ((CONNECT) == DAC_CHIPCONNECT_BOTH)) + +#define IS_DAC_CHIP_CONNECTION_NORMALMODE_BUFOFF(CONNECT) (((CONNECT) == DAC_CHIPCONNECT_EXTERNAL) || \ + ((CONNECT) == DAC_CHIPCONNECT_INTERNAL)) + +#define IS_DAC_CHIP_CONNECTION_SHMODE_BUFOFF(CONNECT) (((CONNECT) == DAC_CHIPCONNECT_INTERNAL) || \ + ((CONNECT) == DAC_CHIPCONNECT_BOTH)) +/** + * @} + */ + + + /** @defgroup DAC_data_alignment DAC data alignment + * @{ + */ + +#define DAC_DHR12R1_ALIGNMENT(__ALIGNMENT__) (0x00000008U + (__ALIGNMENT__)) +#define DAC_DHR12R2_ALIGNMENT(__ALIGNMENT__) (0x00000014U + (__ALIGNMENT__)) + + + +#define DAC_DHR12RD_ALIGNMENT(__ALIGNMENT__) (0x00000020U + (__ALIGNMENT__)) + +#define DAC_ALIGN_12B_R 0x00000000U +#define DAC_ALIGN_12B_L 0x00000004U +#define DAC_ALIGN_8B_R 0x00000008U +#define IS_DAC_ALIGN(ALIGN) (((ALIGN) == DAC_ALIGN_12B_R) || \ + ((ALIGN) == DAC_ALIGN_12B_L) || \ + ((ALIGN) == DAC_ALIGN_8B_R)) +/** + * @} + */ + + + + +/* Initialization/de-initialization functions *********************************/ +void HAL_DAC_IRQHandler(DAC_HandleTypeDef *hdac); +void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac); +void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac); +HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef *hdac); +HAL_StatusTypeDef HAL_DAC_DeInit(DAC_HandleTypeDef* hdac); +HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef* hdac, DAC_ChannelConfTypeDef* sConfig, uint32_t Channel); + +/* I/O operation functions ****************************************************/ +HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel); +HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel); +HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t *pData, uint32_t Length, uint32_t Alignment); +HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel); + +/* Peripheral Control functions ***********************************************/ +HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data); +HAL_StatusTypeDef HAL_DACEx_DualSetValue(DAC_HandleTypeDef *hdac, uint32_t Alignment, uint32_t Data1, uint32_t Data2); +uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel); +uint32_t HAL_DACEx_DualGetValue(DAC_HandleTypeDef *hdac); +HAL_StatusTypeDef HAL_DACEx_TriangleWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude); +HAL_StatusTypeDef HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude) ; +HAL_StatusTypeDef HAL_DACEx_SawtoothWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Polarity,uint32_t ResetData, uint32_t StepData); +HAL_StatusTypeDef HAL_DACEx_SawtoothWaveDataResetBySoftware(DAC_HandleTypeDef *hdac, uint32_t Channel); +HAL_StatusTypeDef HAL_DACEx_SawtoothWaveDataStep(DAC_HandleTypeDef *hdac, uint32_t Channel); +HAL_StatusTypeDef HAL_DACEx_SelfCalibrate(DAC_HandleTypeDef *hdac, DAC_ChannelConfTypeDef *sConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_DACEx_SetUserTrimming(DAC_HandleTypeDef *hdac, DAC_ChannelConfTypeDef *sConfig, uint32_t Channel, uint32_t NewTrimmingValue); +uint32_t HAL_DACEx_GetTrimOffset(DAC_HandleTypeDef *hdac, uint32_t Channel); + + +#endif \ No newline at end of file diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dcmi.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dcmi.h new file mode 100644 index 0000000000..ff200c4f23 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dcmi.h @@ -0,0 +1,735 @@ +/****************************************************************************** +* @file hal_uart.h + +* @brief Header file of UART HAL module. +* @version V1.0.0 +* @date 2020 +******************************************************************************/ +#ifndef __HAL_DCMI_H__ +#define __HAL_DCMI_H__ + +#include "acm32h5xx_hal_conf.h" +/** @addtogroup DCMI DCMI + * @brief DCMI HAL module driver + * @{ + */ +#define DCMI_POSITION_ESCR_LSC (uint32_t)DCMI_ESCR_LSC_Pos /*!< Required left shift to set line start delimiter */ +#define DCMI_POSITION_ESCR_LEC (uint32_t)DCMI_ESCR_LEC_Pos /*!< Required left shift to set line end delimiter */ +#define DCMI_POSITION_ESCR_FEC (uint32_t)DCMI_ESCR_FEC_Pos /*!< Required left shift to set frame end delimiter */ + + #define __HAL_LOCK(__HANDLE__) \ + do{ \ + if((__HANDLE__)->Lock == HAL_LOCKED) \ + { \ + return HAL_BUSY; \ + } \ + else \ + { \ + (__HANDLE__)->Lock = HAL_LOCKED; \ + } \ + }while (0U) + + #define __HAL_UNLOCK(__HANDLE__) \ + do{ \ + (__HANDLE__)->Lock = HAL_UNLOCKED; \ + }while (0U) +/******************************************************************************/ +/* */ +/* DCMI */ +/* */ +/******************************************************************************/ +/******************** Bits definition for DCMI_CR register ******************/ +#define DCMI_CR_CAPTURE_Pos (0U) +#define DCMI_CR_CAPTURE_Msk (0x1U << DCMI_CR_CAPTURE_Pos) /*!< 0x00000001 */ +#define DCMI_CR_CAPTURE DCMI_CR_CAPTURE_Msk +#define DCMI_CR_CM_Pos (1U) +#define DCMI_CR_CM_Msk (0x1U << DCMI_CR_CM_Pos) /*!< 0x00000002 */ +#define DCMI_CR_CM DCMI_CR_CM_Msk +#define DCMI_CR_CROP_Pos (2U) +#define DCMI_CR_CROP_Msk (0x1U << DCMI_CR_CROP_Pos) /*!< 0x00000004 */ +#define DCMI_CR_CROP DCMI_CR_CROP_Msk +#define DCMI_CR_JPEG_Pos (3U) +#define DCMI_CR_JPEG_Msk (0x1U << DCMI_CR_JPEG_Pos) /*!< 0x00000008 */ +#define DCMI_CR_JPEG DCMI_CR_JPEG_Msk +#define DCMI_CR_ESS_Pos (4U) +#define DCMI_CR_ESS_Msk (0x1U << DCMI_CR_ESS_Pos) /*!< 0x00000010 */ +#define DCMI_CR_ESS DCMI_CR_ESS_Msk +#define DCMI_CR_PCKPOL_Pos (5U) +#define DCMI_CR_PCKPOL_Msk (0x1U << DCMI_CR_PCKPOL_Pos) /*!< 0x00000020 */ +#define DCMI_CR_PCKPOL DCMI_CR_PCKPOL_Msk +#define DCMI_CR_HSPOL_Pos (6U) +#define DCMI_CR_HSPOL_Msk (0x1U << DCMI_CR_HSPOL_Pos) /*!< 0x00000040 */ +#define DCMI_CR_HSPOL DCMI_CR_HSPOL_Msk +#define DCMI_CR_VSPOL_Pos (7U) +#define DCMI_CR_VSPOL_Msk (0x1U << DCMI_CR_VSPOL_Pos) /*!< 0x00000080 */ +#define DCMI_CR_VSPOL DCMI_CR_VSPOL_Msk +#define DCMI_CR_FCRC_0 0x00000100U +#define DCMI_CR_FCRC_1 0x00000200U +#define DCMI_CR_EDM_0 0x00000400U +#define DCMI_CR_EDM_1 0x00000800U +//#define DCMI_CR_CRE_Pos (12U) +//#define DCMI_CR_CRE_Msk (0x1U << DCMI_CR_CRE_Pos) /*!< 0x00001000 */ +//#define DCMI_CR_CRE DCMI_CR_CRE_Msk +#define DCMI_CR_ENABLE_Pos (14U) +#define DCMI_CR_ENABLE_Msk (0x1U << DCMI_CR_ENABLE_Pos) /*!< 0x00004000 */ +#define DCMI_CR_ENABLE DCMI_CR_ENABLE_Msk + +/******************** Bits definition for DCMI_SR register ******************/ +#define DCMI_SR_HSYNC_Pos (0U) +#define DCMI_SR_HSYNC_Msk (0x1U << DCMI_SR_HSYNC_Pos) /*!< 0x00000001 */ +#define DCMI_SR_HSYNC DCMI_SR_HSYNC_Msk +#define DCMI_SR_VSYNC_Pos (1U) +#define DCMI_SR_VSYNC_Msk (0x1U << DCMI_SR_VSYNC_Pos) /*!< 0x00000002 */ +#define DCMI_SR_VSYNC DCMI_SR_VSYNC_Msk +#define DCMI_SR_FNE_Pos (2U) +#define DCMI_SR_FNE_Msk (0x1U << DCMI_SR_FNE_Pos) /*!< 0x00000004 */ +#define DCMI_SR_FNE DCMI_SR_FNE_Msk + +/******************** Bits definition for DCMI_RIS register *****************/ +#define DCMI_RIS_FRAME_RIS_Pos (0U) +#define DCMI_RIS_FRAME_RIS_Msk (0x1U << DCMI_RIS_FRAME_RIS_Pos) /*!< 0x00000001 */ +#define DCMI_RIS_FRAME_RIS DCMI_RIS_FRAME_RIS_Msk +#define DCMI_RIS_OVR_RIS_Pos (1U) +#define DCMI_RIS_OVR_RIS_Msk (0x1U << DCMI_RIS_OVR_RIS_Pos) /*!< 0x00000002 */ +#define DCMI_RIS_OVR_RIS DCMI_RIS_OVR_RIS_Msk +#define DCMI_RIS_ERR_RIS_Pos (2U) +#define DCMI_RIS_ERR_RIS_Msk (0x1U << DCMI_RIS_ERR_RIS_Pos) /*!< 0x00000004 */ +#define DCMI_RIS_ERR_RIS DCMI_RIS_ERR_RIS_Msk +#define DCMI_RIS_VSYNC_RIS_Pos (3U) +#define DCMI_RIS_VSYNC_RIS_Msk (0x1U << DCMI_RIS_VSYNC_RIS_Pos) /*!< 0x00000008 */ +#define DCMI_RIS_VSYNC_RIS DCMI_RIS_VSYNC_RIS_Msk +#define DCMI_RIS_LINE_RIS_Pos (4U) +#define DCMI_RIS_LINE_RIS_Msk (0x1U << DCMI_RIS_LINE_RIS_Pos) /*!< 0x00000010 */ +#define DCMI_RIS_LINE_RIS DCMI_RIS_LINE_RIS_Msk +/* Legacy defines */ +#define DCMI_RISR_FRAME_RIS DCMI_RIS_FRAME_RIS +#define DCMI_RISR_OVR_RIS DCMI_RIS_OVR_RIS +#define DCMI_RISR_ERR_RIS DCMI_RIS_ERR_RIS +#define DCMI_RISR_VSYNC_RIS DCMI_RIS_VSYNC_RIS +#define DCMI_RISR_LINE_RIS DCMI_RIS_LINE_RIS +#define DCMI_RISR_OVF_RIS DCMI_RIS_OVR_RIS + +/******************** Bits definition for DCMI_IER register *****************/ +#define DCMI_IER_FRAME_IE_Pos (0U) +#define DCMI_IER_FRAME_IE_Msk (0x1U << DCMI_IER_FRAME_IE_Pos) /*!< 0x00000001 */ +#define DCMI_IER_FRAME_IE DCMI_IER_FRAME_IE_Msk +#define DCMI_IER_OVR_IE_Pos (1U) +#define DCMI_IER_OVR_IE_Msk (0x1U << DCMI_IER_OVR_IE_Pos) /*!< 0x00000002 */ +#define DCMI_IER_OVR_IE DCMI_IER_OVR_IE_Msk +#define DCMI_IER_ERR_IE_Pos (2U) +#define DCMI_IER_ERR_IE_Msk (0x1U << DCMI_IER_ERR_IE_Pos) /*!< 0x00000004 */ +#define DCMI_IER_ERR_IE DCMI_IER_ERR_IE_Msk +#define DCMI_IER_VSYNC_IE_Pos (3U) +#define DCMI_IER_VSYNC_IE_Msk (0x1U << DCMI_IER_VSYNC_IE_Pos) /*!< 0x00000008 */ +#define DCMI_IER_VSYNC_IE DCMI_IER_VSYNC_IE_Msk +#define DCMI_IER_LINE_IE_Pos (4U) +#define DCMI_IER_LINE_IE_Msk (0x1U << DCMI_IER_LINE_IE_Pos) /*!< 0x00000010 */ +#define DCMI_IER_LINE_IE DCMI_IER_LINE_IE_Msk +/* Legacy defines */ +#define DCMI_IER_OVF_IE DCMI_IER_OVR_IE + +/******************** Bits definition for DCMI_MIS register *****************/ +#define DCMI_MIS_FRAME_MIS_Pos (0U) +#define DCMI_MIS_FRAME_MIS_Msk (0x1U << DCMI_MIS_FRAME_MIS_Pos) /*!< 0x00000001 */ +#define DCMI_MIS_FRAME_MIS DCMI_MIS_FRAME_MIS_Msk +#define DCMI_MIS_OVR_MIS_Pos (1U) +#define DCMI_MIS_OVR_MIS_Msk (0x1U << DCMI_MIS_OVR_MIS_Pos) /*!< 0x00000002 */ +#define DCMI_MIS_OVR_MIS DCMI_MIS_OVR_MIS_Msk +#define DCMI_MIS_ERR_MIS_Pos (2U) +#define DCMI_MIS_ERR_MIS_Msk (0x1U << DCMI_MIS_ERR_MIS_Pos) /*!< 0x00000004 */ +#define DCMI_MIS_ERR_MIS DCMI_MIS_ERR_MIS_Msk +#define DCMI_MIS_VSYNC_MIS_Pos (3U) +#define DCMI_MIS_VSYNC_MIS_Msk (0x1U << DCMI_MIS_VSYNC_MIS_Pos) /*!< 0x00000008 */ +#define DCMI_MIS_VSYNC_MIS DCMI_MIS_VSYNC_MIS_Msk +#define DCMI_MIS_LINE_MIS_Pos (4U) +#define DCMI_MIS_LINE_MIS_Msk (0x1U << DCMI_MIS_LINE_MIS_Pos) /*!< 0x00000010 */ +#define DCMI_MIS_LINE_MIS DCMI_MIS_LINE_MIS_Msk + +/* Legacy defines */ +#define DCMI_MISR_FRAME_MIS DCMI_MIS_FRAME_MIS +#define DCMI_MISR_OVF_MIS DCMI_MIS_OVR_MIS +#define DCMI_MISR_ERR_MIS DCMI_MIS_ERR_MIS +#define DCMI_MISR_VSYNC_MIS DCMI_MIS_VSYNC_MIS +#define DCMI_MISR_LINE_MIS DCMI_MIS_LINE_MIS + +/******************** Bits definition for DCMI_ICR register *****************/ +#define DCMI_ICR_FRAME_ISC_Pos (0U) +#define DCMI_ICR_FRAME_ISC_Msk (0x1U << DCMI_ICR_FRAME_ISC_Pos) /*!< 0x00000001 */ +#define DCMI_ICR_FRAME_ISC DCMI_ICR_FRAME_ISC_Msk +#define DCMI_ICR_OVR_ISC_Pos (1U) +#define DCMI_ICR_OVR_ISC_Msk (0x1U << DCMI_ICR_OVR_ISC_Pos) /*!< 0x00000002 */ +#define DCMI_ICR_OVR_ISC DCMI_ICR_OVR_ISC_Msk +#define DCMI_ICR_ERR_ISC_Pos (2U) +#define DCMI_ICR_ERR_ISC_Msk (0x1U << DCMI_ICR_ERR_ISC_Pos) /*!< 0x00000004 */ +#define DCMI_ICR_ERR_ISC DCMI_ICR_ERR_ISC_Msk +#define DCMI_ICR_VSYNC_ISC_Pos (3U) +#define DCMI_ICR_VSYNC_ISC_Msk (0x1U << DCMI_ICR_VSYNC_ISC_Pos) /*!< 0x00000008 */ +#define DCMI_ICR_VSYNC_ISC DCMI_ICR_VSYNC_ISC_Msk +#define DCMI_ICR_LINE_ISC_Pos (4U) +#define DCMI_ICR_LINE_ISC_Msk (0x1U << DCMI_ICR_LINE_ISC_Pos) /*!< 0x00000010 */ +#define DCMI_ICR_LINE_ISC DCMI_ICR_LINE_ISC_Msk + +/* Legacy defines */ +#define DCMI_ICR_OVF_ISC DCMI_ICR_OVR_ISC + +/******************** Bits definition for DCMI_ESCR register ******************/ +#define DCMI_ESCR_FSC_Pos (0U) +#define DCMI_ESCR_FSC_Msk (0xFFU << DCMI_ESCR_FSC_Pos) /*!< 0x000000FF */ +#define DCMI_ESCR_FSC DCMI_ESCR_FSC_Msk +#define DCMI_ESCR_LSC_Pos (8U) +#define DCMI_ESCR_LSC_Msk (0xFFU << DCMI_ESCR_LSC_Pos) /*!< 0x0000FF00 */ +#define DCMI_ESCR_LSC DCMI_ESCR_LSC_Msk +#define DCMI_ESCR_LEC_Pos (16U) +#define DCMI_ESCR_LEC_Msk (0xFFU << DCMI_ESCR_LEC_Pos) /*!< 0x00FF0000 */ +#define DCMI_ESCR_LEC DCMI_ESCR_LEC_Msk +#define DCMI_ESCR_FEC_Pos (24U) +#define DCMI_ESCR_FEC_Msk (0xFFU << DCMI_ESCR_FEC_Pos) /*!< 0xFF000000 */ +#define DCMI_ESCR_FEC DCMI_ESCR_FEC_Msk + +/******************** Bits definition for DCMI_ESUR register ******************/ +#define DCMI_ESUR_FSU_Pos (0U) +#define DCMI_ESUR_FSU_Msk (0xFFU << DCMI_ESUR_FSU_Pos) /*!< 0x000000FF */ +#define DCMI_ESUR_FSU DCMI_ESUR_FSU_Msk +#define DCMI_ESUR_LSU_Pos (8U) +#define DCMI_ESUR_LSU_Msk (0xFFU << DCMI_ESUR_LSU_Pos) /*!< 0x0000FF00 */ +#define DCMI_ESUR_LSU DCMI_ESUR_LSU_Msk +#define DCMI_ESUR_LEU_Pos (16U) +#define DCMI_ESUR_LEU_Msk (0xFFU << DCMI_ESUR_LEU_Pos) /*!< 0x00FF0000 */ +#define DCMI_ESUR_LEU DCMI_ESUR_LEU_Msk +#define DCMI_ESUR_FEU_Pos (24U) +#define DCMI_ESUR_FEU_Msk (0xFFU << DCMI_ESUR_FEU_Pos) /*!< 0xFF000000 */ +#define DCMI_ESUR_FEU DCMI_ESUR_FEU_Msk + +/******************** Bits definition for DCMI_CWSTRT register ******************/ +#define DCMI_CWSTRT_HOFFCNT_Pos (0U) +#define DCMI_CWSTRT_HOFFCNT_Msk (0x3FFFU << DCMI_CWSTRT_HOFFCNT_Pos) /*!< 0x00003FFF */ +#define DCMI_CWSTRT_HOFFCNT DCMI_CWSTRT_HOFFCNT_Msk +#define DCMI_CWSTRT_VST_Pos (16U) +#define DCMI_CWSTRT_VST_Msk (0x1FFFU << DCMI_CWSTRT_VST_Pos) /*!< 0x1FFF0000 */ +#define DCMI_CWSTRT_VST DCMI_CWSTRT_VST_Msk + +/******************** Bits definition for DCMI_CWSIZE register ******************/ +#define DCMI_CWSIZE_CAPCNT_Pos (0U) +#define DCMI_CWSIZE_CAPCNT_Msk (0x3FFFU << DCMI_CWSIZE_CAPCNT_Pos) /*!< 0x00003FFF */ +#define DCMI_CWSIZE_CAPCNT DCMI_CWSIZE_CAPCNT_Msk +#define DCMI_CWSIZE_VLINE_Pos (16U) +#define DCMI_CWSIZE_VLINE_Msk (0x3FFFU << DCMI_CWSIZE_VLINE_Pos) /*!< 0x3FFF0000 */ +#define DCMI_CWSIZE_VLINE DCMI_CWSIZE_VLINE_Msk + +/******************** Bits definition for DCMI_DR register *********************/ +#define DCMI_DR_BYTE0_Pos (0U) +#define DCMI_DR_BYTE0_Msk (0xFFU << DCMI_DR_BYTE0_Pos) /*!< 0x000000FF */ +#define DCMI_DR_BYTE0 DCMI_DR_BYTE0_Msk +#define DCMI_DR_BYTE1_Pos (8U) +#define DCMI_DR_BYTE1_Msk (0xFFU << DCMI_DR_BYTE1_Pos) /*!< 0x0000FF00 */ +#define DCMI_DR_BYTE1 DCMI_DR_BYTE1_Msk +#define DCMI_DR_BYTE2_Pos (16U) +#define DCMI_DR_BYTE2_Msk (0xFFU << DCMI_DR_BYTE2_Pos) /*!< 0x00FF0000 */ +#define DCMI_DR_BYTE2 DCMI_DR_BYTE2_Msk +#define DCMI_DR_BYTE3_Pos (24U) +#define DCMI_DR_BYTE3_Msk (0xFFU << DCMI_DR_BYTE3_Pos) /*!< 0xFF000000 */ +#define DCMI_DR_BYTE3 DCMI_DR_BYTE3_Msk +/* Exported types ------------------------------------------------------------*/ +/** @defgroup DCMI_Exported_Types DCMI Exported Types + * @{ + */ +/** + * @brief HAL DCMI State structures definition + */ +typedef enum +{ + HAL_DCMI_STATE_RESET = 0x00U, /*!< DCMI not yet initialized or disabled */ + HAL_DCMI_STATE_READY = 0x01U, /*!< DCMI initialized and ready for use */ + HAL_DCMI_STATE_BUSY = 0x02U, /*!< DCMI internal processing is ongoing */ + HAL_DCMI_STATE_TIMEOUT = 0x03U, /*!< DCMI timeout state */ + HAL_DCMI_STATE_ERROR = 0x04U, /*!< DCMI error state */ + HAL_DCMI_STATE_SUSPENDED = 0x05U /*!< DCMI suspend state */ +}HAL_DCMI_StateTypeDef; + +/** + * @brief DCMIEx Embedded Synchronisation CODE Init structure definition + */ +typedef struct +{ + uint8_t FrameStartCode; /*!< Specifies the code of the frame start delimiter. */ + uint8_t LineStartCode; /*!< Specifies the code of the line start delimiter. */ + uint8_t LineEndCode; /*!< Specifies the code of the line end delimiter. */ + uint8_t FrameEndCode; /*!< Specifies the code of the frame end delimiter. */ +}DCMI_CodesInitTypeDef; + +/** + * @brief DCMI Init structure definition + */ +/** + * @brief DCMI Init structure definition + */ +typedef struct +{ + uint32_t SynchroMode; /*!< Specifies the Synchronization Mode: Hardware or Embedded. + This parameter can be a value of @ref DCMI_Synchronization_Mode */ + + uint32_t PCKPolarity; /*!< Specifies the Pixel clock polarity: Falling or Rising. + This parameter can be a value of @ref DCMI_PIXCK_Polarity */ + + uint32_t VSPolarity; /*!< Specifies the Vertical synchronization polarity: High or Low. + This parameter can be a value of @ref DCMI_VSYNC_Polarity */ + + uint32_t HSPolarity; /*!< Specifies the Horizontal synchronization polarity: High or Low. + This parameter can be a value of @ref DCMI_HSYNC_Polarity */ + + uint32_t CaptureRate; /*!< Specifies the frequency of frame capture: All, 1/2 or 1/4. + This parameter can be a value of @ref DCMI_Capture_Rate */ + + uint32_t ExtendedDataMode; /*!< Specifies the data width: 8-bit, 10-bit, 12-bit or 14-bit. + This parameter can be a value of @ref DCMI_Extended_Data_Mode */ + + DCMI_CodesInitTypeDef SyncroCode; /*!< Specifies the code of the frame start delimiter. */ + + uint32_t JPEGMode; /*!< Enable or Disable the JPEG mode + This parameter can be a value of @ref DCMI_MODE_JPEG */ +}DCMI_InitTypeDef; + +/** + * @} + */ +/** + * @brief DCMI handle Structure definition + */ +typedef struct +{ + DCMI_TypeDef *Instance; /*!< DCMI Register base address */ + + DCMI_InitTypeDef Init; /*!< DCMI parameters */ + + HAL_LockTypeDef Lock; /*!< DCMI locking object */ + + __IO HAL_DCMI_StateTypeDef State; /*!< DCMI state */ + + __IO uint32_t XferCount; /*!< DMA transfer counter */ + + __IO uint32_t XferSize; /*!< DMA transfer size */ + + uint32_t XferTransferNumber; /*!< DMA transfer number */ + + uint32_t pBuffPtr; /*!< Pointer to DMA output buffer */ + + DMA_HandleTypeDef *DMA_Handle; /*!< Pointer to the DMA handler */ + + __IO uint32_t ErrorCode; /*!< DCMI Error code */ + +}DCMI_HandleTypeDef; +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup DCMI_Exported_Constants DCMI Exported Constants + * @{ + */ + +/** @defgroup DCMI_Error_Code DCMI Error Code + * @{ + */ +#define HAL_DCMI_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_DCMI_ERROR_OVR 0x00000001U /*!< Overrun error */ +#define HAL_DCMI_ERROR_SYNC 0x00000002U /*!< Synchronization error */ +#define HAL_DCMI_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ +#define HAL_DCMI_ERROR_DMA 0x00000040U /*!< DMA error */ +/** + * @} + */ + +/** @defgroup DCMI_Capture_Mode DCMI Capture Mode + * @{ + */ +#define DCMI_MODE_CONTINUOUS 0x00000000U /*!< The received data are transferred continuously + into the destination memory through the DMA */ +#define DCMI_MODE_SNAPSHOT ((uint32_t)DCMI_CR_CM) /*!< Once activated, the interface waits for the start of + frame and then transfers a single frame through the DMA */ +/** + * @} + */ + +/** @defgroup DCMI_Synchronization_Mode DCMI Synchronization Mode + * @{ + */ +#define DCMI_SYNCHRO_HARDWARE 0x00000000U /*!< Hardware synchronization data capture (frame/line start/stop) + is synchronized with the HSYNC/VSYNC signals */ +#define DCMI_SYNCHRO_EMBEDDED ((uint32_t)DCMI_CR_ESS) /*!< Embedded synchronization data capture is synchronized with + synchronization codes embedded in the data flow */ + +/** + * @} + */ + +/** @defgroup DCMI_PIXCK_Polarity DCMI PIXCK Polarity + * @{ + */ +#define DCMI_PCKPOLARITY_FALLING 0x00000000U /*!< Pixel clock active on Falling edge */ +#define DCMI_PCKPOLARITY_RISING ((uint32_t)DCMI_CR_PCKPOL) /*!< Pixel clock active on Rising edge */ + +/** + * @} + */ + +/** @defgroup DCMI_VSYNC_Polarity DCMI VSYNC Polarity + * @{ + */ +#define DCMI_VSPOLARITY_LOW 0x00000000U /*!< Vertical synchronization active Low */ +#define DCMI_VSPOLARITY_HIGH ((uint32_t)DCMI_CR_VSPOL) /*!< Vertical synchronization active High */ + +/** + * @} + */ + +/** @defgroup DCMI_HSYNC_Polarity DCMI HSYNC Polarity + * @{ + */ +#define DCMI_HSPOLARITY_LOW 0x00000000U /*!< Horizontal synchronization active Low */ +#define DCMI_HSPOLARITY_HIGH ((uint32_t)DCMI_CR_HSPOL) /*!< Horizontal synchronization active High */ + +/** + * @} + */ + +/** @defgroup DCMI_MODE_JPEG DCMI MODE JPEG + * @{ + */ +#define DCMI_JPEG_DISABLE 0x00000000U /*!< Mode JPEG Disabled */ +#define DCMI_JPEG_ENABLE ((uint32_t)DCMI_CR_JPEG) /*!< Mode JPEG Enabled */ + +/** + * @} + */ + +/** @defgroup DCMI_Capture_Rate DCMI Capture Rate + * @{ + */ +#define DCMI_CR_ALL_FRAME 0x00000000U /*!< All frames are captured */ +#define DCMI_CR_ALTERNATE_2_FRAME ((uint32_t)DCMI_CR_FCRC_0) /*!< Every alternate frame captured */ +#define DCMI_CR_ALTERNATE_4_FRAME ((uint32_t)DCMI_CR_FCRC_1) /*!< One frame in 4 frames captured */ + +/** + * @} + */ + +/** @defgroup DCMI_Extended_Data_Mode DCMI Extended Data Mode + * @{ + */ +#define DCMI_EXTEND_DATA_8B 0x00000000U /*!< Interface captures 8-bit data on every pixel clock */ +#define DCMI_EXTEND_DATA_10B ((uint32_t)DCMI_CR_EDM_0) /*!< Interface captures 10-bit data on every pixel clock */ +#define DCMI_EXTEND_DATA_12B ((uint32_t)DCMI_CR_EDM_1) /*!< Interface captures 12-bit data on every pixel clock */ +#define DCMI_EXTEND_DATA_14B ((uint32_t)(DCMI_CR_EDM_0 | DCMI_CR_EDM_1)) /*!< Interface captures 14-bit data on every pixel clock */ + +/** + * @} + */ + +/** @defgroup DCMI_Window_Coordinate DCMI Window Coordinate + * @{ + */ +#define DCMI_WINDOW_COORDINATE 0x3FFFU /*!< Window coordinate */ + +/** + * @} + */ + +/** @defgroup DCMI_Window_Height DCMI Window Height + * @{ + */ +#define DCMI_WINDOW_HEIGHT 0x1FFFU /*!< Window Height */ + +/** + * @} + */ + +/** @defgroup DCMI_Window_Vertical_Line DCMI Window Vertical Line + * @{ + */ +#define DCMI_POSITION_CWSIZE_VLINE (uint32_t)DCMI_CWSIZE_VLINE_Pos /*!< Required left shift to set crop window vertical line count */ +#define DCMI_POSITION_CWSTRT_VST (uint32_t)DCMI_CWSTRT_VST_Pos /*!< Required left shift to set crop window vertical start line count */ + +/** + * @} + */ + +/** @defgroup DCMI_interrupt_sources DCMI interrupt sources + * @{ + */ +#define DCMI_IT_FRAME ((uint32_t)DCMI_IER_FRAME_IE) /*!< Capture complete interrupt */ +#define DCMI_IT_OVR ((uint32_t)DCMI_IER_OVR_IE) /*!< Overrun interrupt */ +#define DCMI_IT_ERR ((uint32_t)DCMI_IER_ERR_IE) /*!< Synchronization error interrupt */ +#define DCMI_IT_VSYNC ((uint32_t)DCMI_IER_VSYNC_IE) /*!< VSYNC interrupt */ +#define DCMI_IT_LINE ((uint32_t)DCMI_IER_LINE_IE) /*!< Line interrupt */ +/** + * @} + */ + +/** @defgroup DCMI_Flags DCMI Flags + * @{ + */ + +/** + * @brief DCMI SR register + */ +#define DCMI_FLAG_HSYNC ((uint32_t)DCMI_SR_INDEX|DCMI_SR_HSYNC) /*!< HSYNC pin state (active line / synchronization between lines) */ +#define DCMI_FLAG_VSYNC ((uint32_t)DCMI_SR_INDEX|DCMI_SR_VSYNC) /*!< VSYNC pin state (active frame / synchronization between frames) */ +#define DCMI_FLAG_FNE ((uint32_t)DCMI_SR_INDEX|DCMI_SR_FNE) /*!< FIFO not empty flag */ +/** + * @brief DCMI RIS register + */ +#define DCMI_FLAG_FRAMERI ((uint32_t)DCMI_RISR_FRAME_RIS) /*!< Frame capture complete interrupt flag */ +#define DCMI_FLAG_OVRRI ((uint32_t)DCMI_RISR_OVR_RIS) /*!< Overrun interrupt flag */ +#define DCMI_FLAG_ERRRI ((uint32_t)DCMI_RISR_ERR_RIS) /*!< Synchronization error interrupt flag */ +#define DCMI_FLAG_VSYNCRI ((uint32_t)DCMI_RISR_VSYNC_RIS) /*!< VSYNC interrupt flag */ +#define DCMI_FLAG_LINERI ((uint32_t)DCMI_RISR_LINE_RIS) /*!< Line interrupt flag */ +/** + * @brief DCMI MIS register + */ +#define DCMI_FLAG_FRAMEMI ((uint32_t)DCMI_MIS_INDEX|DCMI_MIS_FRAME_MIS) /*!< DCMI Frame capture complete masked interrupt status */ +#define DCMI_FLAG_OVRMI ((uint32_t)DCMI_MIS_INDEX|DCMI_MIS_OVR_MIS ) /*!< DCMI Overrun masked interrupt status */ +#define DCMI_FLAG_ERRMI ((uint32_t)DCMI_MIS_INDEX|DCMI_MIS_ERR_MIS ) /*!< DCMI Synchronization error masked interrupt status */ +#define DCMI_FLAG_VSYNCMI ((uint32_t)DCMI_MIS_INDEX|DCMI_MIS_VSYNC_MIS) /*!< DCMI VSYNC masked interrupt status */ +#define DCMI_FLAG_LINEMI ((uint32_t)DCMI_MIS_INDEX|DCMI_MIS_LINE_MIS ) /*!< DCMI Line masked interrupt status */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup DCMI_Exported_Macros DCMI Exported Macros + * @{ + */ + +/** @brief Reset DCMI handle state + * @param __HANDLE__ specifies the DCMI handle. + * @retval None + */ +#define __HAL_DCMI_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DCMI_STATE_RESET) + +/** + * @brief Enable the DCMI. + * @param __HANDLE__ DCMI handle + * @retval None + */ +#define __HAL_DCMI_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DCMI_CR_ENABLE) + +/** + * @brief Disable the DCMI. + * @param __HANDLE__ DCMI handle + * @retval None + */ +#define __HAL_DCMI_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~(DCMI_CR_ENABLE)) + +/* Interrupt & Flag management */ +/** + * @brief Get the DCMI pending flag. + * @param __HANDLE__ DCMI handle + * @param __FLAG__ Get the specified flag. + * This parameter can be one of the following values (no combination allowed) + * @arg DCMI_FLAG_HSYNC: HSYNC pin state (active line / synchronization between lines) + * @arg DCMI_FLAG_VSYNC: VSYNC pin state (active frame / synchronization between frames) + * @arg DCMI_FLAG_FNE: FIFO empty flag + * @arg DCMI_FLAG_FRAMERI: Frame capture complete flag mask + * @arg DCMI_FLAG_OVRRI: Overrun flag mask + * @arg DCMI_FLAG_ERRRI: Synchronization error flag mask + * @arg DCMI_FLAG_VSYNCRI: VSYNC flag mask + * @arg DCMI_FLAG_LINERI: Line flag mask + * @arg DCMI_FLAG_FRAMEMI: DCMI Capture complete masked interrupt status + * @arg DCMI_FLAG_OVRMI: DCMI Overrun masked interrupt status + * @arg DCMI_FLAG_ERRMI: DCMI Synchronization error masked interrupt status + * @arg DCMI_FLAG_VSYNCMI: DCMI VSYNC masked interrupt status + * @arg DCMI_FLAG_LINEMI: DCMI Line masked interrupt status + * @retval The state of FLAG. + */ +#define __HAL_DCMI_GET_FLAG(__HANDLE__, __FLAG__)\ +((((__FLAG__) & (DCMI_SR_INDEX|DCMI_MIS_INDEX)) == 0x0U)? ((__HANDLE__)->Instance->RISR & (__FLAG__)) :\ + (((__FLAG__) & DCMI_SR_INDEX) == 0x0U)? ((__HANDLE__)->Instance->MISR & (__FLAG__)) : ((__HANDLE__)->Instance->SR & (__FLAG__))) + +/** + * @brief Clear the DCMI pending flags. + * @param __HANDLE__ DCMI handle + * @param __FLAG__ specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg DCMI_FLAG_FRAMERI: Frame capture complete flag mask + * @arg DCMI_FLAG_OVRRI: Overrun flag mask + * @arg DCMI_FLAG_ERRRI: Synchronization error flag mask + * @arg DCMI_FLAG_VSYNCRI: VSYNC flag mask + * @arg DCMI_FLAG_LINERI: Line flag mask + * @retval None + */ +#define __HAL_DCMI_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ICR = (__FLAG__)) + +/** + * @brief Enable the specified DCMI interrupts. + * @param __HANDLE__ DCMI handle + * @param __INTERRUPT__ specifies the DCMI interrupt sources to be enabled. + * This parameter can be any combination of the following values: + * @arg DCMI_IT_FRAME: Frame capture complete interrupt mask + * @arg DCMI_IT_OVR: Overrun interrupt mask + * @arg DCMI_IT_ERR: Synchronization error interrupt mask + * @arg DCMI_IT_VSYNC: VSYNC interrupt mask + * @arg DCMI_IT_LINE: Line interrupt mask + * @retval None + */ +#define __HAL_DCMI_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER |= (__INTERRUPT__)) + +/** + * @brief Disable the specified DCMI interrupts. + * @param __HANDLE__ DCMI handle + * @param __INTERRUPT__ specifies the DCMI interrupt sources to be enabled. + * This parameter can be any combination of the following values: + * @arg DCMI_IT_FRAME: Frame capture complete interrupt mask + * @arg DCMI_IT_OVR: Overrun interrupt mask + * @arg DCMI_IT_ERR: Synchronization error interrupt mask + * @arg DCMI_IT_VSYNC: VSYNC interrupt mask + * @arg DCMI_IT_LINE: Line interrupt mask + * @retval None + */ +#define __HAL_DCMI_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER &= ~(__INTERRUPT__)) + +/** + * @brief Check whether the specified DCMI interrupt has occurred or not. + * @param __HANDLE__ DCMI handle + * @param __INTERRUPT__ specifies the DCMI interrupt source to check. + * This parameter can be one of the following values: + * @arg DCMI_IT_FRAME: Frame capture complete interrupt mask + * @arg DCMI_IT_OVR: Overrun interrupt mask + * @arg DCMI_IT_ERR: Synchronization error interrupt mask + * @arg DCMI_IT_VSYNC: VSYNC interrupt mask + * @arg DCMI_IT_LINE: Line interrupt mask + * @retval The state of INTERRUPT. + */ +#define __HAL_DCMI_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->MISR & (__INTERRUPT__)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup DCMI_Exported_Functions DCMI Exported Functions + * @{ + */ + +/** @addtogroup DCMI_Exported_Functions_Group1 Initialization and Configuration functions + * @{ + */ +/* Initialization and de-initialization functions *****************************/ +HAL_StatusTypeDef HAL_DCMI_Init(DCMI_HandleTypeDef *hdcmi); +HAL_StatusTypeDef HAL_DCMI_DeInit(DCMI_HandleTypeDef *hdcmi); +void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi); +void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* hdcmi); +/** + * @} + */ + +/** @addtogroup DCMI_Exported_Functions_Group2 IO operation functions + * @{ + */ +/* IO operation functions *****************************************************/ +HAL_StatusTypeDef HAL_DCMI_Start_DMA(DCMI_HandleTypeDef* hdcmi, uint32_t DCMI_Mode, uint32_t pData, uint32_t Length); +HAL_StatusTypeDef HAL_DCMI_Stop(DCMI_HandleTypeDef* hdcmi); +HAL_StatusTypeDef HAL_DCMI_Suspend(DCMI_HandleTypeDef* hdcmi); +HAL_StatusTypeDef HAL_DCMI_Resume(DCMI_HandleTypeDef* hdcmi); +void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi); +void HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef *hdcmi); +void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi); +void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi); +void HAL_DCMI_VsyncCallback(DCMI_HandleTypeDef *hdcmi); +void HAL_DCMI_HsyncCallback(DCMI_HandleTypeDef *hdcmi); +void HAL_DCMI_IRQHandler(DCMI_HandleTypeDef *hdcmi); +/** + * @} + */ + +/** @addtogroup DCMI_Exported_Functions_Group3 Peripheral Control functions + * @{ + */ +/* Peripheral Control functions ***********************************************/ +HAL_StatusTypeDef HAL_DCMI_ConfigCrop(DCMI_HandleTypeDef *hdcmi, uint32_t X0, uint32_t Y0, uint32_t XSize, uint32_t YSize); +HAL_StatusTypeDef HAL_DCMI_EnableCrop(DCMI_HandleTypeDef *hdcmi); +HAL_StatusTypeDef HAL_DCMI_DisableCrop(DCMI_HandleTypeDef *hdcmi); +/** + * @} + */ + +/** @addtogroup DCMI_Exported_Functions_Group4 Peripheral State functions + * @{ + */ +/* Peripheral State functions *************************************************/ +HAL_DCMI_StateTypeDef HAL_DCMI_GetState(DCMI_HandleTypeDef *hdcmi); +uint32_t HAL_DCMI_GetError(DCMI_HandleTypeDef *hdcmi); +/** + * @} + */ + +/** + * @} + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup DCMI_Private_Constants DCMI Private Constants + * @{ + */ +#define DCMI_MIS_INDEX 0x1000U /*!< DCMI MIS register index */ +#define DCMI_SR_INDEX 0x2000U /*!< DCMI SR register index */ +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/** @defgroup DCMI_Private_Macros DCMI Private Macros + * @{ + */ +#define IS_DCMI_CAPTURE_MODE(MODE)(((MODE) == DCMI_MODE_CONTINUOUS) || \ + ((MODE) == DCMI_MODE_SNAPSHOT)) + +#define IS_DCMI_SYNCHRO(MODE)(((MODE) == DCMI_SYNCHRO_HARDWARE) || \ + ((MODE) == DCMI_SYNCHRO_EMBEDDED)) + +#define IS_DCMI_PCKPOLARITY(POLARITY)(((POLARITY) == DCMI_PCKPOLARITY_FALLING) || \ + ((POLARITY) == DCMI_PCKPOLARITY_RISING)) + +#define IS_DCMI_VSPOLARITY(POLARITY)(((POLARITY) == DCMI_VSPOLARITY_LOW) || \ + ((POLARITY) == DCMI_VSPOLARITY_HIGH)) + +#define IS_DCMI_HSPOLARITY(POLARITY)(((POLARITY) == DCMI_HSPOLARITY_LOW) || \ + ((POLARITY) == DCMI_HSPOLARITY_HIGH)) + +#define IS_DCMI_MODE_JPEG(JPEG_MODE)(((JPEG_MODE) == DCMI_JPEG_DISABLE) || \ + ((JPEG_MODE) == DCMI_JPEG_ENABLE)) + +#define IS_DCMI_CAPTURE_RATE(RATE) (((RATE) == DCMI_CR_ALL_FRAME) || \ + ((RATE) == DCMI_CR_ALTERNATE_2_FRAME) || \ + ((RATE) == DCMI_CR_ALTERNATE_4_FRAME)) + +#define IS_DCMI_EXTENDED_DATA(DATA)(((DATA) == DCMI_EXTEND_DATA_8B) || \ + ((DATA) == DCMI_EXTEND_DATA_10B) || \ + ((DATA) == DCMI_EXTEND_DATA_12B) || \ + ((DATA) == DCMI_EXTEND_DATA_14B)) + +#define IS_DCMI_WINDOW_COORDINATE(COORDINATE) ((COORDINATE) <= DCMI_WINDOW_COORDINATE) + +#define IS_DCMI_WINDOW_HEIGHT(HEIGHT) ((HEIGHT) <= DCMI_WINDOW_HEIGHT) +/******************************* DCMI Instances *******************************/ +#define IS_DCMI_ALL_INSTANCE(INSTANCE) ((INSTANCE) == DCMI) +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @addtogroup DCMI_Private_Functions DCMI Private Functions + * @{ + */ + +/** + * @} + */ + +#endif /* __STM32F4xx_HAL_DCMI_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_def.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_def.h new file mode 100644 index 0000000000..ab0479d261 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_def.h @@ -0,0 +1,167 @@ + +/****************************************************************************** +*@file : hal_def.h +*@brief : This file contains HAL common defines, enumeration, macros and structures definitions. +******************************************************************************/ + +#ifndef __HAL_DEF_H +#define __HAL_DEF_H + +/** + * @brief HAL Status structures definition + */ +typedef enum +{ + HAL_OK = 0x00, + HAL_ERROR = 0x01, + HAL_BUSY = 0x02, + HAL_TIMEOUT = 0x03 +} HAL_StatusTypeDef; + +/** + * @brief HAL Lock structures definition + */ +typedef enum +{ + HAL_UNLOCKED = 0x00, + HAL_LOCKED = 0x01 +} HAL_LockTypeDef; + +typedef enum +{ + RESET = 0U, + SET = !RESET +} FlagStatus, ITStatus; + +typedef enum +{ + DISABLE = 0, + ENABLE = !DISABLE +} FunctionalState; + +#define IS_FUNCTIONAL_STATE(State) (((State) == ENABLE) || ((State) == DISABLE)) + +typedef enum +{ + SUCCESS = 0U, + ERROR = !SUCCESS +} ErrorStatus; + + +/* Exported macro ------------------------------------------------------------*/ + +#define HAL_MAX_DELAY 0xFFFFFFFFU + +#define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) == (BIT)) +#define HAL_IS_BIT_CLR(REG, BIT) (((REG) & (BIT)) == 0U) + +#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \ + do{ \ + (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \ + (__DMA_HANDLE__).Parent = (__HANDLE__); \ + } while(0) + +#define UNUSED(x) ((void)(x)) + +/* Macro to get variable aligned on 4-bytes, for __ICCARM__ the directive "#pragma data_alignment=4" must be used instead */ +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */ + #ifndef __ALIGN_BEGIN + #define __ALIGN_BEGIN + #endif + #ifndef __ALIGN_END + #define __ALIGN_END __attribute__ ((aligned (4))) + #endif +#elif defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ + #ifndef __ALIGN_END + #define __ALIGN_END __attribute__ ((aligned (4))) + #endif /* __ALIGN_END */ + #ifndef __ALIGN_BEGIN + #define __ALIGN_BEGIN + #endif /* __ALIGN_BEGIN */ +#else + #ifndef __ALIGN_END + #define __ALIGN_END + #endif /* __ALIGN_END */ + #ifndef __ALIGN_BEGIN + #if defined (__CC_ARM) /* ARM Compiler V5 */ + #define __ALIGN_BEGIN __align(4) + #elif defined (__ICCARM__) /* IAR Compiler */ + #define __ALIGN_BEGIN + #endif /* __CC_ARM */ + #endif /* __ALIGN_BEGIN */ +#endif /* __GNUC__ */ + +/* Macro to get variable aligned on 32-bytes,needed for cache maintenance purpose */ +#if defined (__GNUC__) /* GNU Compiler */ + #define ALIGN_32BYTES(buf) buf __attribute__ ((aligned (32))) +#elif defined (__ICCARM__) /* IAR Compiler */ + #define ALIGN_32BYTES(buf) _Pragma("data_alignment=32") buf +#elif defined (__CC_ARM) /* ARM Compiler */ + #define ALIGN_32BYTES(buf) __align(32) buf +#endif + +/** + * @brief __RAM_FUNC definition + */ +#if defined ( __CC_ARM ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) +/* ARM Compiler V4/V5 and V6 + -------------------------- + RAM functions are defined using the toolchain options. + Functions that are executed in RAM should reside in a separate source module. + Using the 'Options for File' dialog you can simply change the 'Code / Const' + area of a module to a memory space in physical RAM. + Available memory areas are declared in the 'Target' tab of the 'Options for Target' + dialog. +*/ +#define __RAM_FUNC + +#elif defined ( __ICCARM__ ) +/* ICCARM Compiler + --------------- + RAM functions are defined using a specific toolchain keyword "__ramfunc". +*/ +#define __RAM_FUNC __ramfunc + +#elif defined ( __GNUC__ ) +/* GNU Compiler + ------------ + RAM functions are defined using a specific toolchain attribute + "__attribute__((section(".RamFunc")))". +*/ +#define __RAM_FUNC __attribute__((section(".RamFunc"))) + +#endif + +/** + * @brief __NOINLINE definition + */ +#if defined ( __CC_ARM ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) || defined ( __GNUC__ ) +/* ARM V4/V5 and V6 & GNU Compiler + ------------------------------- +*/ +#define __NOINLINE __attribute__ ( (noinline) ) + +#elif defined ( __ICCARM__ ) +/* ICCARM Compiler + --------------- +*/ +#define __NOINLINE _Pragma("optimize = no_inline") + +#endif + + + +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */ + #ifndef __weak + #define __weak __attribute__((weak)) + #endif +#endif + +#ifdef __GNUC__ + #ifndef __weak + #define __weak __WEAK + #endif +#endif +#endif /* __HAL_DEF_H */ + + \ No newline at end of file diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dlyb.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dlyb.h new file mode 100644 index 0000000000..a329aa808f --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dlyb.h @@ -0,0 +1,37 @@ +/* + ****************************************************************************** + * @file HAL_DLYB.h + * @version V1.0.0 + * @date 2020 + * @brief Header file of DLYB HAL module. + ****************************************************************************** +*/ +#ifndef __HAL_DLYB_H__ +#define __HAL_DLYB_H__ + +#include "hal.h" + +/******************************************************************************/ +/* Peripheral Registers Bits Definition */ +/******************************************************************************/ + + + +#define DLYB_SEL_MAX 12 +#define DLYB_UINT_MAX 128 + + +#define DEN_ENABLE (1<<0) +#define SEN_ENABLE (1<<1) + + + + +HAL_StatusTypeDef HAL_DLYB_Enable(DLYB_TypeDef *hdlyb); +HAL_StatusTypeDef HAL_DLYB_Disable(DLYB_TypeDef *hdlyb); + + + + + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dma.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dma.h new file mode 100644 index 0000000000..7e0d56ed80 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dma.h @@ -0,0 +1,910 @@ +/****************************************************************************** +*@file : hal_dma.h +*@brief : Header file of DMA HAL module. +******************************************************************************/ + +#ifndef __HAL_DMA_H__ +#define __HAL_DMA_H__ + +#include "hal.h" + + +/** + * @brief DMA Configuration Structure definition + */ + +typedef struct +{ + uint32_t Mode; /*!< Specifies the operation mode of the DMA. + This parameter can be a value of @ref DMA_Mode + @note The circular buffer mode cannot be used if the memory-to-memory + data transfer is configured on the selected channel */ + uint32_t Lock; + + uint32_t DataFlow; /*!< Specifies if the data will be transferred from memory to peripheral, + from memory to memory or from peripheral to memory. + This parameter can be a value of @ref DMA_DataFlow */ + + uint32_t ReqID; /*!< The request number of the source peripheral and the destination peripheral. + This value is invalid when the memory to memory data transfer is configured + on the selected channel. + This parameter can be a value of @ref DMA1_ReqID or DMA2_ReqID */ + + uint32_t SrcIncDec; /*!< Specifies whether the source address register should be incremented or not. + This parameter can be a value of @ref DMA_SrcIncDec */ + + uint32_t DestIncDec; /*!< Specifies whether the destination address register should be incremented or not. + This parameter can be a value of @ref DMA_DestIncDec */ + + uint32_t SrcWidth; /*!< Specifies whether the source data width. + This parameter can be a value of @ref DMA_SrcWidth */ + + uint32_t DestWidth; /*!< Specifies whether the destination data width. + This parameter can be a value of @ref DMA_DestWidth */ + + uint32_t SrcBurst; /*!< Specifies the Burst transfer configuration for the source transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. This parameter can be a value of @ref DMA_SrcBurst. */ + + uint32_t DestBurst; /*!< Specifies the Burst transfer configuration for the destination transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. This parameter can be a value of @ref DMA_DestBurst. */ + + uint32_t SrcMaster; /*!< Specifies the source master. + This parameter can be a value of @ref DMA_SrcMaster */ + + uint32_t DestMaster; /*!< Specifies the destination master. + This parameter can be a value of @ref DMA_DestMaster */ + + uint32_t NextMaster; /*!< Specifies the next master.Valid only in Circular mode. + This parameter can be a value of @ref DMA_NextMaster */ + +}DMA_InitTypeDef; + +/** + * @brief DMA Link List Item Structure + */ + +typedef struct __DMA_NextLink +{ + uint32_t SrcAddr; /*!< source address */ + + uint32_t DestAddr; /*!< desination address */ + + uint32_t Next; /*!< Next Node pointer */ + + uint32_t Ctrl; /*!< Ctrol */ + +}DMA_LinkTypeDef; + +/** + * @brief DMA handle Structure definition + */ +typedef struct __DMA_HandleTypeDef +{ + DMA_Channel_TypeDef *Instance; /*!< Register base address */ + + DMA_InitTypeDef Init; /*!< DMA communication parameters */ + + void *Parent; /*!< Parent object state */ + + void (*XferCpltCallback)(struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete callback */ + + void (*XferHalfCpltCallback)(struct __DMA_HandleTypeDef * hdma); /* DMA transfer half complete callback */ + + void (*XferErrorCallback)(struct __DMA_HandleTypeDef * hdma); /* DMA transfer error callback */ + + void (*XferAbortCallback)(struct __DMA_HandleTypeDef * hdma); /* DMA transfer abort callback */ + + DMA_TypeDef *DMA; /*!< DMA channel Base Address */ + + uint32_t Channel; /*!< DMA channel */ + + DMA_LinkTypeDef Link; /*!< DMA Link */ + +}DMA_HandleTypeDef; + +/** + * @brief DMA Link Init Structure + */ + +typedef struct __DMA_LinkInitTypeDef +{ + uint32_t SrcAddr; /* source address */ + + uint32_t DestAddr; /* desination address */ + + uint32_t TransferSize; /* The length of data to be transferred from source to destination. */ + + uint32_t Next; /* Next Node pointer */ + + uint32_t NextMaster; /*!< Specifies the next master.Valid only if LLI is valid. + This parameter can be a value of @ref DMA_NextMaster */ + + uint32_t RawInt ; /*!< Raw interrupt enable. + This parameter can be a value of @ref DMA_RawInt */ + + uint32_t SrcIncDec; /*!< Specifies whether the source address register should be incremented or not. + This parameter can be a value of @ref DMA_SrcIncDec */ + + uint32_t DestIncDec; /*!< Specifies whether the destination address register should be incremented or not. + This parameter can be a value of @ref DMA_DestIncDec */ + + uint32_t SrcWidth; /*!< Specifies whether the source data width. + This parameter can be a value of @ref DMA_SrcWidth */ + + uint32_t DestWidth; /*!< Specifies whether the destination data width. + This parameter can be a value of @ref DMA_DestWidth */ + + uint32_t SrcBurst; /*!< Specifies the Burst transfer configuration for the source transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. This parameter can be a value of @ref DMA_SrcBurst. */ + + uint32_t DestBurst; /*!< Specifies the Burst transfer configuration for the destination transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. This parameter can be a value of @ref DMA_DestBurst. */ + +}DMA_LinkInitTypeDef; + + + + +/** @defgroup DMA_RawInt + * @{ + */ + +#define DMA_RAWINT_DISABLE ( 0U ) +#define DMA_RAWINT_ENABLE ( DMA_CXCTRL_RITEN ) +/** + * @} + */ + +/** @defgroup DMA_SrcInc + * @{ + */ + +#define DMA_SRCINCDEC_DISABLE ( 0U ) +#define DMA_SRCINCDEC_INC ( DMA_CXCTRL_SIORSD_0 ) +#define DMA_SRCINCDEC_DEC ( DMA_CXCTRL_SIORSD_1 ) +#define DMA_SRCINCDEC_DISABLE_1 ( DMA_CXCTRL_SIORSD_1 | DMA_CXCTRL_SIORSD_0 ) +/** + * @} + */ + + +/** @defgroup DMA_DestInc + * @{ + */ + +#define DMA_DESTINCDEC_DISABLE ( 0U ) +#define DMA_DESTINCDEC_INC ( DMA_CXCTRL_DIORDD_0 ) +#define DMA_DESTINCDEC_DEC ( DMA_CXCTRL_DIORDD_1 ) +#define DMA_DESTINCDEC_DISABLE_1 ( DMA_CXCTRL_DIORDD_1 | DMA_CXCTRL_DIORDD_0 ) + +/** + * @} + */ + +/** @defgroup DMA_SrcWidth + * @{ + */ +#define DMA_SRCWIDTH_BYTE ( 0U ) /* 8bit */ +#define DMA_SRCWIDTH_HALFWORD ( DMA_CXCTRL_SWIDTH_0 ) /* 16bit */ +#define DMA_SRCWIDTH_WORD ( DMA_CXCTRL_SWIDTH_1 ) /* 32bit */ +/** + * @} + */ + +/** @defgroup DMA_DestWidth + * @{ + */ +#define DMA_DESTWIDTH_BYTE ( 0U ) /* 8bit */ +#define DMA_DESTWIDTH_HALFWORD ( DMA_CXCTRL_DWIDTH_0 ) /* 16bit */ +#define DMA_DESTWIDTH_WORD ( DMA_CXCTRL_DWIDTH_1 ) /* 32bit */ + +/** + * @} + */ + + /** @defgroup DMA_Mode + * @{ + */ +#define DMA_MODE_NORMAL ( 0U ) /*!< Normal mode */ +#define DMA_MODE_CIRCULAR ( 1U ) /*!< Circular mode */ + +/** + * @} + */ + +/** + * @brief DMA_SrcBurst + */ + +#define DMA_SRCBURST_1 ( 0U ) +#define DMA_SRCBURST_4 ( DMA_CXCTRL_SBSIZE_0 ) +#define DMA_SRCBURST_8 ( DMA_CXCTRL_SBSIZE_1 ) +#define DMA_SRCBURST_16 ( DMA_CXCTRL_SBSIZE_1 | DMA_CXCTRL_SBSIZE_0 ) +#define DMA_SRCBURST_32 ( DMA_CXCTRL_SBSIZE_2 ) +#define DMA_SRCBURST_64 ( DMA_CXCTRL_SBSIZE_2 | DMA_CXCTRL_SBSIZE_0 ) +#define DMA_SRCBURST_128 ( DMA_CXCTRL_SBSIZE_2 | DMA_CXCTRL_SBSIZE_1 ) +#define DMA_SRCBURST_256 ( DMA_CXCTRL_SBSIZE_2 | DMA_CXCTRL_SBSIZE_1 | DMA_CXCTRL_SBSIZE_0 ) + +/** + * @} + */ + +/** + * @brief DMA_DestBurst + */ + +#define DMA_DESTBURST_1 ( 0U ) +#define DMA_DESTBURST_4 ( DMA_CXCTRL_DBSIZE_0 ) +#define DMA_DESTBURST_8 ( DMA_CXCTRL_DBSIZE_1 ) +#define DMA_DESTBURST_16 ( DMA_CXCTRL_DBSIZE_1 | DMA_CXCTRL_DBSIZE_0 ) +#define DMA_DESTBURST_32 ( DMA_CXCTRL_DBSIZE_2 ) +#define DMA_DESTBURST_64 ( DMA_CXCTRL_DBSIZE_2 | DMA_CXCTRL_DBSIZE_0 ) +#define DMA_DESTBURST_128 ( DMA_CXCTRL_DBSIZE_2 | DMA_CXCTRL_DBSIZE_1 ) +#define DMA_DESTBURST_256 ( DMA_CXCTRL_DBSIZE_2 | DMA_CXCTRL_DBSIZE_1 | DMA_CXCTRL_DBSIZE_0 ) + +/** + * @} + */ + +/** + * @brief DMA_SrcMaster + */ + +#define DMA_SRCMASTER_1 ( 0U ) +#define DMA_SRCMASTER_2 ( DMA_CXCONFIG_S ) + +/** + * @} + */ + +/** + * @brief DMA_DestMaster + */ + +#define DMA_DESTMASTER_1 ( 0U ) +#define DMA_DESTMASTER_2 ( DMA_CXCONFIG_D ) + +/** + * @} + */ + +/** + * @brief DMA_Master1Endian + */ + +#define DMA_MASTER1_ENDIAN_LITTLE ( 0U ) +#define DMA_MASTER1_ENDIAN_BIG ( DMA_CONFIG_M1ENDIAN ) + +/** + * @} + */ + +/** + * @brief DMA_Master2Endian + */ + +#define DMA_MASTER2_ENDIAN_LITTLE ( 0U ) +#define DMA_MASTER2_ENDIAN_BIG ( DMA_CONFIG_M2ENDIAN ) + +/** + * @} + */ + +/** + * @brief DMA_NextMaster + */ + +#define DMA_NEXTMASTER_1 ( 0U ) +#define DMA_NEXTMASTER_2 ( DMA_CXLLI_LM ) + +/** + * @} + */ + +/** + * @brief DMA transfer max number + */ + +#define DMA_TRANSFER_SIZE ( 0xFFFFU ) + + +/** @defgroup DMA_DataFlow + * @{ + */ + +#define DMA_DATAFLOW_M2M ( 0U ) +#define DMA_DATAFLOW_M2P ( DMA_CXCONFIG_FLOWCTRL_0 ) +#define DMA_DATAFLOW_P2M ( DMA_CXCONFIG_FLOWCTRL_1 ) + +/** + * @} + */ + + +/** @defgroup DMA1_ReqID + * @{ + */ + +#define DMA1_REQ_M2M ( 0U ) +#define DMA1_REQ_ADC1 ( 0U ) +#define DMA1_REQ_SPI1_TX ( 1U ) +#define DMA1_REQ_SPI1_RX ( 2U ) +#define DMA1_REQ_SPI2_TX ( 3U ) +#define DMA1_REQ_SPI2_RX ( 4U ) +#define DMA1_REQ_USART1_TX ( 5U ) +#define DMA1_REQ_USART1_RX ( 6U ) +#define DMA1_REQ_USART2_TX ( 7U ) +#define DMA1_REQ_USART2_RX ( 8U ) +#define DMA1_REQ_I2C1_TX ( 9U ) +#define DMA1_REQ_I2C1_RX ( 10U ) +#define DMA1_REQ_I2C2_TX ( 11U ) +#define DMA1_REQ_I2C2_RX ( 12U ) +#define DMA1_REQ_TIM1_CH1 ( 13U ) +#define DMA1_REQ_TIM1_CH2 ( 14U ) +#define DMA1_REQ_TIM1_CH3 ( 15U ) +#define DMA1_REQ_TIM1_CH4 ( 16U ) +#define DMA1_REQ_TIM1_UP ( 17U ) +#define DMA1_REQ_TIM1_TRIG ( 18U ) +#define DMA1_REQ_TIM1_COM ( 19U ) +#define DMA1_REQ_TIM2_CH1 ( 20U ) +#define DMA1_REQ_TIM2_CH2 ( 21U ) +#define DMA1_REQ_TIM2_CH3 ( 22U ) +#define DMA1_REQ_TIM2_CH4 ( 23U ) +#define DMA1_REQ_TIM2_UP ( 24U ) +#define DMA1_REQ_TIM2_TRIG ( 25U ) +#define DMA1_REQ_ADC2 ( 26U ) +#define DMA1_REQ_ADC3 ( 27U ) +#define DMA1_REQ_USART3_TX ( 28U ) +#define DMA1_REQ_USART3_RX ( 29U ) +#define DMA1_REQ_LPUART_TX ( 30U ) +#define DMA1_REQ_LPUART_RX ( 31U ) +#define DMA1_REQ_TIM15_CH1 ( 32U ) +#define DMA1_REQ_TIM15_CH2 ( 33U ) +#define DMA1_REQ_TIM15_UP ( 34U ) +#define DMA1_REQ_TIM15_TRIG ( 35U ) +#define DMA1_REQ_TIM15_COM ( 36U ) +#define DMA1_REQ_I2S1_TX ( 37U ) +#define DMA1_REQ_I2S1_RX ( 38U ) +#define DMA1_REQ_DAC1_CH1 ( 39U ) +#define DMA1_REQ_DAC1_CH2 ( 40U ) +#define DMA1_REQ_I2S2_TX ( 41U ) +#define DMA1_REQ_I2S2_RX ( 42U ) +#define DMA1_REQ_I2S3_TX ( 43U ) +#define DMA1_REQ_I2S3_RX ( 44U ) +#define DMA1_REQ_USART4_TX ( 45U ) +#define DMA1_REQ_USART4_RX ( 46U ) +#define DMA1_REQ_SPI3_TX ( 47U ) +#define DMA1_REQ_SPI3_RX ( 48U ) +#define DMA1_REQ_TIM4_CH1 ( 49U ) +#define DMA1_REQ_TIM4_CH2 ( 50U ) +#define DMA1_REQ_TIM4_CH3 ( 51U ) +#define DMA1_REQ_TIM4_CH4 ( 52U ) +#define DMA1_REQ_TIM4_UP ( 53U ) +#define DMA1_REQ_TIM4_TRIG ( 54U ) +#define DMA1_REQ_NDL ( 55U ) +#define DMA1_REQ_STM1_PWM ( 56U ) +#define DMA1_REQ_STM2_PWM ( 57U ) +#define DMA1_REQ_DCMI ( 58U ) +#define DMA1_REQ_SPI7_RX ( 59U ) +#define DMA1_REQ_SPI7_TX ( 60U ) +#define DMA1_REQ_SPI8_RX ( 61U ) +#define DMA1_REQ_SPI8_TX ( 62U ) +#define DMA1_REQ_STM3_PWM ( 63U ) +#define DMA1_REQ_STM4_PWM ( 64U ) +#define DMA1_REQ_STM5_PWM ( 65U ) +#define DMA1_REQ_STM6_PWM ( 66U ) +#define DMA1_REQ_LPT ( 67U ) +#define DMA1_REQ_TIM5_UP ( 68U ) +#define DMA1_REQ_TIM5_CH1 ( 69U ) +#define DMA1_REQ_TIM5_CH2 ( 70U ) +#define DMA1_REQ_TIM5_CH3 ( 71U ) +#define DMA1_REQ_TIM5_CH4 ( 72U ) +#define DMA1_REQ_TIM5_TRIG ( 73U ) +#define DMA1_REQ_TIM5_COM ( 74U ) +#define DMA1_REQ_TIM25_UP ( 75U ) +#define DMA1_REQ_TIM25_CH1 ( 76U ) +#define DMA1_REQ_TIM25_CH2 ( 77U ) +#define DMA1_REQ_TIM25_TRIG ( 78U ) +#define DMA1_REQ_TIM25_COM ( 79U ) +#define DMA1_REQ_TIM20_UP ( 80U ) +#define DMA1_REQ_TIM20_CH1 ( 81U ) +#define DMA1_REQ_TIM20_CH2 ( 82U ) +#define DMA1_REQ_TIM20_CH3 ( 83U ) +#define DMA1_REQ_TIM20_CH4 ( 84U ) +#define DMA1_REQ_TIM20_CH5 ( 85U ) +#define DMA1_REQ_TIM20_CH6 ( 86U ) +#define DMA1_REQ_TIM20_TRIG ( 87U ) +#define DMA1_REQ_TIM20_COM ( 88U ) +#define DMA1_REQ_TIM18_UP ( 89U ) +#define DMA1_REQ_TIM18_CH1 ( 90U ) +#define DMA1_REQ_TIM18_TRIG ( 91U ) +#define DMA1_REQ_TIM18_COM ( 92U ) +#define DMA1_REQ_TIM19_UP ( 93U ) +#define DMA1_REQ_TIM19_CH1 ( 94U ) +#define DMA1_REQ_TIM19_TRIG ( 95U ) +#define DMA1_REQ_TIM19_COM ( 96U ) +#define DMA1_REQ_TIM21_UP ( 97U ) +#define DMA1_REQ_TIM22_UP ( 98U ) +#define DMA1_REQ_TIM23_UP ( 99U ) +#define DMA1_REQ_TIM23_CH1 ( 100U ) +#define DMA1_REQ_TIM23_CH2 ( 101U ) +#define DMA1_REQ_TIM23_CH3 ( 102U ) +#define DMA1_REQ_TIM23_CH4 ( 103U ) +#define DMA1_REQ_TIM23_TRIG ( 104U ) +#define DMA1_REQ_TIM23_COM ( 105U ) +#define DMA1_REQ_TIM24_UP ( 106U ) +#define DMA1_REQ_TIM24_CH1 ( 107U ) +#define DMA1_REQ_TIM24_CH2 ( 108U ) +#define DMA1_REQ_TIM24_CH3 ( 109U ) +#define DMA1_REQ_TIM24_CH4 ( 110U ) +#define DMA1_REQ_TIM24_TRIG ( 111U ) +#define DMA1_REQ_TIM24_COM ( 112U ) +#define DMA1_REQ_SPI4_RX ( 113U ) +#define DMA1_REQ_SPI4_TX ( 114U ) +#define DMA1_REQ_SPI5_RX ( 115U ) +#define DMA1_REQ_SPI5_TX ( 116U ) +#define DMA1_REQ_DAC2_CH1 ( 117U ) +#define DMA1_REQ_DAC2_CH2 ( 118U ) +#define DMA1_REQ_OSPI1_RX ( 119U ) +#define DMA1_REQ_OSPI1_TX ( 120U ) +#define DMA1_REQ_OSPI2_RX ( 121U ) +#define DMA1_REQ_OSPI2_TX ( 122U ) +#define DMA1_REQ_I2C3_TX ( 123U ) +#define DMA1_REQ_I2C3_RX ( 124U ) +#define DMA1_REQ_I2C4_TX ( 125U ) +#define DMA1_REQ_I2C4_RX ( 126U ) +#define DMA1_REQ_USART5_TX ( 127U ) +#define DMA1_REQ_USART5_RX ( 128U ) +#define DMA1_REQ_USART6_TX ( 129U ) +#define DMA1_REQ_USART6_RX ( 130U ) +#define DMA1_REQ_USART7_TX ( 131U ) +#define DMA1_REQ_USART7_RX ( 132U ) +#define DMA1_REQ_USART8_TX ( 133U ) +#define DMA1_REQ_USART8_RX ( 134U ) +#define DMA1_REQ_USART9_TX ( 135U ) +#define DMA1_REQ_USART9_RX ( 136U ) +#define DMA1_REQ_USART10_TX ( 137U ) +#define DMA1_REQ_USART10_RX ( 138U ) +#define DMA1_REQ_FDCAN1_TX ( 139U ) +#define DMA1_REQ_FDCAN1_RX ( 140U ) +#define DMA1_REQ_FDCAN2_TX ( 141U ) +#define DMA1_REQ_FDCAN2_RX ( 142U ) +#define DMA1_REQ_FDCAN3_TX ( 143U ) +#define DMA1_REQ_FDCAN3_RX ( 144U ) +#define DMA1_REQ_SPI6_RX ( 145U ) +#define DMA1_REQ_SPI6_TX ( 146U ) +#define DMA1_REQ_MAX ( 147U ) + +/** + * @} + */ + +/** @defgroup DMA2_ReqID + * @{ + */ + +#define DMA2_REQ_M2M ( 0U ) +#define DMA2_REQ_ADC1 ( 0U ) +#define DMA2_REQ_SPI1_TX ( 1U ) +#define DMA2_REQ_SPI1_RX ( 2U ) +#define DMA2_REQ_SPI2_TX ( 3U ) +#define DMA2_REQ_SPI2_RX ( 4U ) +#define DMA2_REQ_USART1_TX ( 5U ) +#define DMA2_REQ_USART1_RX ( 6U ) +#define DMA2_REQ_USART2_TX ( 7U ) +#define DMA2_REQ_USART2_RX ( 8U ) +#define DMA2_REQ_I2C1_TX ( 9U ) +#define DMA2_REQ_I2C1_RX ( 10U ) +#define DMA2_REQ_I2C2_TX ( 11U ) +#define DMA2_REQ_I2C2_RX ( 12U ) +#define DMA2_REQ_TIM8_CH1 ( 13U ) +#define DMA2_REQ_TIM8_CH2 ( 14U ) +#define DMA2_REQ_TIM8_CH3 ( 15U ) +#define DMA2_REQ_TIM8_CH4 ( 16U ) +#define DMA2_REQ_TIM8_UP ( 17U ) +#define DMA2_REQ_TIM8_TRIG ( 18U ) +#define DMA2_REQ_TIM8_COM ( 19U ) +#define DMA2_REQ_TIM3_CH1 ( 20U ) +#define DMA2_REQ_TIM3_CH2 ( 21U ) +#define DMA2_REQ_TIM3_CH3 ( 22U ) +#define DMA2_REQ_TIM3_CH4 ( 23U ) +#define DMA2_REQ_TIM3_UP ( 24U ) +#define DMA2_REQ_TIM3_TRIG ( 25U ) +#define DMA2_REQ_ADC2 ( 26U ) +#define DMA2_REQ_ADC3 ( 27U ) +#define DMA2_REQ_USART3_TX ( 28U ) +#define DMA2_REQ_USART3_RX ( 29U ) +#define DMA2_REQ_LPUART_TX ( 30U ) +#define DMA2_REQ_LPUART_RX ( 31U ) +#define DMA2_REQ_TIM16_CH1 ( 32U ) +#define DMA2_REQ_TIM16_UP ( 33U ) +#define DMA2_REQ_TIM17_CH1 ( 34U ) +#define DMA2_REQ_TIM17_UP ( 35U ) +#define DMA2_REQ_TIM6_UP ( 36U ) +#define DMA2_REQ_I2S1_TX ( 37U ) +#define DMA2_REQ_I2S1_RX ( 38U ) +#define DMA2_REQ_DAC1_CH1 ( 39U ) +#define DMA2_REQ_DAC1_CH2 ( 40U ) +#define DMA2_REQ_I2S2_TX ( 41U ) +#define DMA2_REQ_I2S2_RX ( 42U ) +#define DMA2_REQ_I2S3_TX ( 43U ) +#define DMA2_REQ_I2S3_RX ( 44U ) +#define DMA2_REQ_USART4_TX ( 45U ) +#define DMA2_REQ_USART4_RX ( 46U ) +#define DMA2_REQ_SPI3_TX ( 47U ) +#define DMA2_REQ_SPI3_RX ( 48U ) +#define DMA2_REQ_TIM7_UP ( 49U ) +#define DMA2_REQ_NDL ( 55U ) +#define DMA2_REQ_STM1_PWM ( 56U ) +#define DMA2_REQ_STM2_PWM ( 57U ) +#define DMA2_REQ_DCMI ( 58U ) +#define DMA2_REQ_SPI7_RX ( 59U ) +#define DMA2_REQ_SPI7_TX ( 60U ) +#define DMA2_REQ_SPI8_RX ( 61U ) +#define DMA2_REQ_SPI8_TX ( 62U ) +#define DMA2_REQ_STM3_PWM ( 63U ) +#define DMA2_REQ_STM4_PWM ( 64U ) +#define DMA2_REQ_STM5_PWM ( 65U ) +#define DMA2_REQ_STM6_PWM ( 66U ) +#define DMA2_REQ_LPT ( 67U ) +#define DMA2_REQ_TIM5_UP ( 68U ) +#define DMA2_REQ_TIM5_CH1 ( 69U ) +#define DMA2_REQ_TIM5_CH2 ( 70U ) +#define DMA2_REQ_TIM5_CH3 ( 71U ) +#define DMA2_REQ_TIM5_CH4 ( 72U ) +#define DMA2_REQ_TIM5_TRIG ( 73U ) +#define DMA2_REQ_TIM5_COM ( 74U ) +#define DMA2_REQ_TIM25_UP ( 75U ) +#define DMA2_REQ_TIM25_CH1 ( 76U ) +#define DMA2_REQ_TIM25_CH2 ( 77U ) +#define DMA2_REQ_TIM25_TRIG ( 78U ) +#define DMA2_REQ_TIM25_COM ( 79U ) +#define DMA2_REQ_TIM20_UP ( 80U ) +#define DMA2_REQ_TIM20_CH1 ( 81U ) +#define DMA2_REQ_TIM20_CH2 ( 82U ) +#define DMA2_REQ_TIM20_CH3 ( 83U ) +#define DMA2_REQ_TIM20_CH4 ( 84U ) +#define DMA2_REQ_TIM20_CH5 ( 85U ) +#define DMA2_REQ_TIM20_CH6 ( 86U ) +#define DMA2_REQ_TIM20_TRIG ( 87U ) +#define DMA2_REQ_TIM20_COM ( 88U ) +#define DMA2_REQ_TIM18_UP ( 89U ) +#define DMA2_REQ_TIM18_CH1 ( 90U ) +#define DMA2_REQ_TIM18_TRIG ( 91U ) +#define DMA2_REQ_TIM18_COM ( 92U ) +#define DMA2_REQ_TIM19_UP ( 93U ) +#define DMA2_REQ_TIM19_CH1 ( 94U ) +#define DMA2_REQ_TIM19_TRIG ( 95U ) +#define DMA2_REQ_TIM19_COM ( 96U ) +#define DMA2_REQ_TIM21_UP ( 97U ) +#define DMA2_REQ_TIM22_UP ( 98U ) +#define DMA2_REQ_TIM23_UP ( 99U ) +#define DMA2_REQ_TIM23_CH1 ( 100U ) +#define DMA2_REQ_TIM23_CH2 ( 101U ) +#define DMA2_REQ_TIM23_CH3 ( 102U ) +#define DMA2_REQ_TIM23_CH4 ( 103U ) +#define DMA2_REQ_TIM23_TRIG ( 104U ) +#define DMA2_REQ_TIM23_COM ( 105U ) +#define DMA2_REQ_TIM24_UP ( 106U ) +#define DMA2_REQ_TIM24_CH1 ( 107U ) +#define DMA2_REQ_TIM24_CH2 ( 108U ) +#define DMA2_REQ_TIM24_CH3 ( 109U ) +#define DMA2_REQ_TIM24_CH4 ( 110U ) +#define DMA2_REQ_TIM24_TRIG ( 111U ) +#define DMA2_REQ_TIM24_COM ( 112U ) +#define DMA2_REQ_SPI4_RX ( 113U ) +#define DMA2_REQ_SPI4_TX ( 114U ) +#define DMA2_REQ_SPI5_RX ( 115U ) +#define DMA2_REQ_SPI5_TX ( 116U ) +#define DMA2_REQ_DAC2_CH1 ( 117U ) +#define DMA2_REQ_DAC2_CH2 ( 118U ) +#define DMA2_REQ_OSPI1_RX ( 119U ) +#define DMA2_REQ_OSPI1_TX ( 120U ) +#define DMA2_REQ_OSPI2_RX ( 121U ) +#define DMA2_REQ_OSPI2_TX ( 122U ) +#define DMA2_REQ_I2C3_TX ( 123U ) +#define DMA2_REQ_I2C3_RX ( 124U ) +#define DMA2_REQ_I2C4_TX ( 125U ) +#define DMA2_REQ_I2C4_RX ( 126U ) +#define DMA2_REQ_USART5_TX ( 127U ) +#define DMA2_REQ_USART5_RX ( 128U ) +#define DMA2_REQ_USART6_TX ( 129U ) +#define DMA2_REQ_USART6_RX ( 130U ) +#define DMA2_REQ_USART7_TX ( 131U ) +#define DMA2_REQ_USART7_RX ( 132U ) +#define DMA2_REQ_USART8_TX ( 133U ) +#define DMA2_REQ_USART8_RX ( 134U ) +#define DMA2_REQ_USART9_TX ( 135U ) +#define DMA2_REQ_USART9_RX ( 136U ) +#define DMA2_REQ_USART10_TX ( 137U ) +#define DMA2_REQ_USART10_RX ( 138U ) +#define DMA2_REQ_FDCAN1_TX ( 139U ) +#define DMA2_REQ_FDCAN1_RX ( 140U ) +#define DMA2_REQ_FDCAN2_TX ( 141U ) +#define DMA2_REQ_FDCAN2_RX ( 142U ) +#define DMA2_REQ_FDCAN3_TX ( 143U ) +#define DMA2_REQ_FDCAN3_RX ( 144U ) +#define DMA2_REQ_SPI6_RX ( 145U ) +#define DMA2_REQ_SPI6_TX ( 146U ) +#define DMA2_REQ_MAX ( 147U ) + +/** + * @} + */ + +/** + * @brief DMA_XfeCallbackID + */ + +#define DMA_CALLBACKID_CPLT ( 0U ) +#define DMA_CALLBACKID_HALFCPLT ( 1U ) +#define DMA_CALLBACKID_ERROR ( 2U ) +#define DMA_CALLBACKID_ABORT ( 3U ) +#define DMA_CALLBACKID_MAX ( 4U ) + +/** + * @} + */ + +/** @defgroup DMA_Flag + * @{ + */ +#define DMA_FLAG_TC ( 0x01U ) /*!< Flag, indicating transmission completion interrupt occur */ +#define DMA_FLAG_HTC ( 0x02U ) /*!< Flag, indicating half transmission completion interrupt occur */ +#define DMA_FLAG_ERR ( 0x04U ) /*!< Flag, indicating error interrupt occur */ +#define DMA_FLAG_RTC ( 0x08U ) /*!< Flag, indicating raw transmission completion interrupt occur */ +#define DMA_FLAG_RHTC ( 0x10U ) /*!< Flag, indicating raw half transmission completion interrupt occur */ +#define DMA_FLAG_RERR ( 0x20U ) /*!< Flag, indicating raw error interrupt occur */ + +/** + * @} + */ + +/** + * @brief DMA FLAG mask for assert test + */ + +#define DMA_FLAG_MASK ( DMA_FLAG_TC | DMA_FLAG_HTC | DMA_FLAG_ERR | DMA_FLAG_RTC | DMA_FLAG_RHTC | DMA_FLAG_RERR ) + + +/** @defgroup DMA_IT + * @{ + */ +#define DMA_IT_TC ( DMA_CXCONFIG_ITC ) /*!< transmission completion interrupt */ +#define DMA_IT_HTC ( DMA_CXCONFIG_IHFTC ) /*!< indicating half transmission completion interrupt */ +#define DMA_IT_ERR ( DMA_CXCONFIG_IE ) /*!< error interrupt */ + +/** + * @} + */ + +/** + * @brief DMA IT mask for assert test + */ + +#define DMA_IT_MASK ( DMA_IT_TC | DMA_IT_HTC | DMA_IT_ERR ) + +/** + * @brief DMA TIMEOUT + */ + +#define DMA_ABORT_TIMEOUT ( 0xFFFFU ) + + +/* Exported functions --------------------------------------------------------*/ + +#define __HAL_LINK_DMA(_HANDLE_, _DMA_LINK_, _DMA_HANDLE_) (_HANDLE_._DMA_LINK_ = &_DMA_HANDLE_) + +#define __HAL_DMA_ENABLE(__HANDLE__) ((__HANDLE__)->DMA->CONFIG |= DMA_CONFIG_EN) + +#define __HAL_DMA_DISABLE(__HANDLE__) ((__HANDLE__)->DMA->CONFIG &= ~DMA_CONFIG_EN) + +#define __HAL_DMA_MASTER1_BIG_ENDIAN(__HANDLE__) ((__HANDLE__)->DMA->CONFIG |= DMA_CONFIG_M1ENDIAN) + +#define __HAL_DMA_MASTER1_LITTLE_ENDIAN(__HANDLE__) ((__HANDLE__)->DMA->CONFIG &= ~DMA_CONFIG_M1ENDIAN) + +#define __HAL_DMA_MASTER2_BIG_ENDIAN(__HANDLE__) ((__HANDLE__)->DMA->CONFIG |= DMA_CONFIG_M2ENDIAN) + +#define __HAL_DMA_MASTER2_LITTLE_ENDIAN(__HANDLE__) ((__HANDLE__)->DMA->CONFIG &= ~DMA_CONFIG_M2ENDIAN) + +#define __HAL_DMA_RAWINT_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CXCTRL |= DMA_CXCTRL_RITEN) + +#define __HAL_DMA_RAWINT_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CXCTRL &= ~DMA_CXCTRL_RITEN) + +#define __HAL_DMA_LOCK_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CXCONFIG |= DMA_CXCONFIG_LOCK) + +#define __HAL_DMA_LOCK_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CXCONFIG &= ~DMA_CXCONFIG_LOCK) + +#define __HAL_DMA_GET_HFTC_IT_SOURCE(__HANDLE__) ((__HANDLE__)->Instance->CXCONFIG & DMA_CXCONFIG_IHFTC) + +#define __HAL_DMA_GET_TC_IT_SOURCE(__HANDLE__) ((__HANDLE__)->Instance->CXCONFIG & DMA_CXCONFIG_ITC) + +#define __HAL_DMA_GET_ERR_IT_SOURCE(__HANDLE__) ((__HANDLE__)->Instance->CXCONFIG & DMA_CXCONFIG_IE) + +#define __HAL_DMA_GET_TRANSFER_SIZE(__HANDLE__) ((__HANDLE__)->Instance->CXCTRL & 0xFFFFU) + +#define __HAL_DMA_GET_LINK(__HANDLE__) ((__HANDLE__)->Instance->CXLLI & DMA_CXLLI_LLI) + + + +/** @defgroup DMA Private Macros + * @{ + */ +#define IS_DMA_HANDLE(__HANDLE__) ((__HANDLE__) != NULL) + +#define IS_DMA_ALL_INSTANCE(__INSTANCE__) (((__INSTANCE__) == DMA1_Channel0) || \ + ((__INSTANCE__) == DMA1_Channel1) || \ + ((__INSTANCE__) == DMA1_Channel2) || \ + ((__INSTANCE__) == DMA1_Channel3) || \ + ((__INSTANCE__) == DMA1_Channel4) || \ + ((__INSTANCE__) == DMA1_Channel5) || \ + ((__INSTANCE__) == DMA1_Channel6) || \ + ((__INSTANCE__) == DMA1_Channel7) || \ + ((__INSTANCE__) == DMA2_Channel0) || \ + ((__INSTANCE__) == DMA2_Channel1) || \ + ((__INSTANCE__) == DMA2_Channel2) || \ + ((__INSTANCE__) == DMA2_Channel3) || \ + ((__INSTANCE__) == DMA2_Channel4) || \ + ((__INSTANCE__) == DMA2_Channel5) || \ + ((__INSTANCE__) == DMA2_Channel6) || \ + ((__INSTANCE__) == DMA2_Channel7)) + +#define IS_DMA_MODE(__MODE__) (((__MODE__) == DMA_MODE_NORMAL ) || \ + ((__MODE__) == DMA_MODE_CIRCULAR)) + +#define IS_DMA_DATAFLOW(__DATAFLOW__) (((__DATAFLOW__) == DMA_DATAFLOW_M2M) || \ + ((__DATAFLOW__) == DMA_DATAFLOW_M2P) || \ + ((__DATAFLOW__) == DMA_DATAFLOW_P2M)) + +#define IS_DMA_REQ1ID(__DATAFLOW__, __REQID__) ((__DATAFLOW__ == DMA_DATAFLOW_M2M) ? SET : \ + ((__REQID__) < DMA1_REQ_MAX)) + +#define IS_DMA_REQ2ID(__DATAFLOW__, __REQID__) ((__DATAFLOW__ == DMA_DATAFLOW_M2M) ? SET : \ + ((__REQID__) < DMA2_REQ_MAX)) + +#define IS_DMA_SRCINCDEC(__INCDEC__) (((__INCDEC__) == DMA_SRCINCDEC_DISABLE ) || \ + ((__INCDEC__) == DMA_SRCINCDEC_INC) || \ + ((__INCDEC__) == DMA_SRCINCDEC_DEC)) + +#define IS_DMA_DESTINCDEC(__INCDEC__) (((__INCDEC__) == DMA_DESTINCDEC_DISABLE ) || \ + ((__INCDEC__) == DMA_DESTINCDEC_INC) || \ + ((__INCDEC__) == DMA_DESTINCDEC_DEC)) + +#define IS_DMA_SRCWIDTH(__WIDTH__) (((__WIDTH__) == DMA_SRCWIDTH_BYTE) || \ + ((__WIDTH__) == DMA_SRCWIDTH_HALFWORD) || \ + ((__WIDTH__) == DMA_SRCWIDTH_WORD)) + +#define IS_DMA_DESTWIDTH(__WIDTH__) (((__WIDTH__) == DMA_DESTWIDTH_BYTE) || \ + ((__WIDTH__) == DMA_DESTWIDTH_HALFWORD) || \ + ((__WIDTH__) == DMA_DESTWIDTH_WORD)) + +#define IS_DMA_SRCBURST(__BURST__) (((__BURST__) == DMA_SRCBURST_1) || \ + ((__BURST__) == DMA_SRCBURST_4) || \ + ((__BURST__) == DMA_SRCBURST_8) || \ + ((__BURST__) == DMA_SRCBURST_16) || \ + ((__BURST__) == DMA_SRCBURST_32) || \ + ((__BURST__) == DMA_SRCBURST_64) || \ + ((__BURST__) == DMA_SRCBURST_128) || \ + ((__BURST__) == DMA_SRCBURST_256)) + +#define IS_DMA_DESTBURST(__BURST__) (((__BURST__) == DMA_DESTBURST_1) || \ + ((__BURST__) == DMA_DESTBURST_4) || \ + ((__BURST__) == DMA_DESTBURST_8) || \ + ((__BURST__) == DMA_DESTBURST_16) || \ + ((__BURST__) == DMA_DESTBURST_32) || \ + ((__BURST__) == DMA_DESTBURST_64) || \ + ((__BURST__) == DMA_DESTBURST_128) || \ + ((__BURST__) == DMA_DESTBURST_256)) + +#define IS_DMA_SRCMASTER(__MASTER__) (((__MASTER__) == DMA_SRCMASTER_1) || \ + ((__MASTER__) == DMA_SRCMASTER_2)) + +#define IS_DMA_DESTMASTER(__MASTER__) (((__MASTER__) == DMA_DESTMASTER_1) || \ + ((__MASTER__) == DMA_DESTMASTER_2)) + +#define IS_DMA_MASTER1_ENDIAN(__ENDIAN__) (((__ENDIAN__) == DMA_MASTER1_ENDIAN_LITTLE) || \ + ((__ENDIAN__) == DMA_MASTER1_ENDIAN_BIG)) + +#define IS_DMA_MASTER2_ENDIAN(__ENDIAN__) (((__ENDIAN__) == DMA_MASTER2_ENDIAN_LITTLE) || \ + ((__ENDIAN__) == DMA_MASTER2_ENDIAN_BIG)) + +#define IS_DMA_NEXTMASTER(__MASTER__) (((__MASTER__) == DMA_NEXTMASTER_1) || \ + ((__MASTER__) == DMA_NEXTMASTER_2)) + +#define IS_DMA_CALLBACK(__CALLBACK__) ((__CALLBACK__) < DMA_CALLBACKID_MAX) + +#define IS_DMA_RAWIT(__RAWIT__) (((__RAWIT__) == DMA_RAWINT_DISABLE) || \ + ((__RAWIT__) == DMA_RAWINT_ENABLE)) + +#define IS_DMA_SRCADDR(__ADDR__) ( SET ) + +#define IS_DMA_DESTADDR(__ADDR__) ( SET ) + +#define IS_DMA_NEXT(__NEXT__) ((((uint32_t)(__NEXT__)) & 0x03U) == 0) + +#define IS_DMA_TRANSFERSIZE(__SIZE__) (((__SIZE__) != 0) && ((__SIZE__) <= 0xFFFFU)) + +#define IS_DMA_STATE(__FLAG__) (((__FLAG__) == DMA_FLAG_TC) || \ + ((__FLAG__) == DMA_FLAG_HTC) || \ + ((__FLAG__) == DMA_FLAG_ERR) || \ + ((__FLAG__) == DMA_FLAG_RTC) || \ + ((__FLAG__) == DMA_FLAG_RHTC) || \ + ((__FLAG__) == DMA_FLAG_RERR)) + +#define IS_DMA_FLAG(__FLAG__) ((((uint32_t)(__FLAG__) & DMA_FLAG_MASK) != 0) && \ + (((uint32_t)(__FLAG__) & ~DMA_FLAG_MASK) == 0)) + +#define IS_DMA_IT(__IT__) ((((uint32_t)(__IT__) & DMA_IT_MASK) != 0) && \ + (((uint32_t)(__IT__) & ~DMA_IT_MASK) == 0)) + +/** + * @} + */ + + + +/* Exported functions --------------------------------------------------------*/ + +/* This function handles DMA interrupt request. */ +void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma); + +/* Initialize the DMA according to the specified. */ +HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma); + +/* DeInitializes the DMA peripheral. */ +HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma); + +/* Initialize the DMA MSP. */ +void HAL_DMA_MspInit(DMA_HandleTypeDef *hdma); + +/* DeInitialize the DMA MSP. */ +void HAL_DMA_MspDeInit(DMA_HandleTypeDef *hdma); + +/* Register callbacks. */ +HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, uint32_t CallbackID, \ + void (* pCallback)(struct __DMA_HandleTypeDef * hdma)); + +/* UnRegister callbacks. */ +HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, uint32_t CallbackID); + +/* Starts the DMA Transfer. */ +HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddr, uint32_t DestAddr, uint32_t TransferSize); + +/* Start the DMA Transfer with interrupt enabled. */ +HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddr, uint32_t DestAddr, uint32_t TransferSize); + +/* Initialize linked list. */ +HAL_StatusTypeDef HAL_DMA_InitLink(DMA_LinkTypeDef *Link, DMA_LinkInitTypeDef *Link_Init); + +/* Set the next node of the linked node. */ +HAL_StatusTypeDef HAL_DMA_SetLinkNext(DMA_LinkTypeDef *Curr, DMA_LinkTypeDef *Next); + +/* DMA link transfer start. */ +HAL_StatusTypeDef HAL_DMA_Start_Link(DMA_HandleTypeDef *hdma, DMA_LinkTypeDef *Link); + +/* DMA link transfer start with interrupt enabled. */ +HAL_StatusTypeDef HAL_DMA_Start_Link_IT(DMA_HandleTypeDef *hdma, DMA_LinkTypeDef *Link); + +/* Abort the DMA Transfer. */ +HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma); + +/* Get interrupt source. */ +FunctionalState HAL_DMA_GetITSource(DMA_HandleTypeDef *hdma, uint32_t IT); + +/* Enable interrupt. */ +HAL_StatusTypeDef HAL_DMA_EnableIT(DMA_HandleTypeDef *hdma, uint32_t IT); + +/* Disable interrupt. */ +HAL_StatusTypeDef HAL_DMA_DisableIT(DMA_HandleTypeDef *hdma, uint32_t IT); + +/* Clear the DMA flag. */ +HAL_StatusTypeDef HAL_DMA_ClearFlag(DMA_HandleTypeDef *hdma, uint32_t Flag); + +/* Returns the DMA flag. */ +FlagStatus HAL_DMA_GetFlag(DMA_HandleTypeDef *hdma, uint32_t Flag); + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dma2d.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dma2d.h new file mode 100644 index 0000000000..1e8b7c0a55 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dma2d.h @@ -0,0 +1,858 @@ +/****************************************************************************** +*@file : hal_dma2d.h +*@brief : GPIO HAL module driver. +******************************************************************************/ + +#ifndef __HAL_DMA2D_H__ +#define __HAL_DMA2D_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "hal.h" + + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup DMA2D_Exported_Types DMA2D Exported Types + * @{ + */ +#define MAX_DMA2D_LAYER 2U /*!< DMA2D maximum number of layers */ + + +/******************** Bit definition for DMA2D_CR register ******************/ +#define DMA2D_CR_START_Pos (0U) +#define DMA2D_CR_START_Msk (0x1UL << DMA2D_CR_START_Pos) /*!< 0x00000001 */ +#define DMA2D_CR_START DMA2D_CR_START_Msk /*!< Start transfer */ +#define DMA2D_CR_SUSP_Pos (1U) +#define DMA2D_CR_SUSP_Msk (0x1UL << DMA2D_CR_SUSP_Pos) /*!< 0x00000002 */ +#define DMA2D_CR_SUSP DMA2D_CR_SUSP_Msk /*!< Suspend transfer */ +#define DMA2D_CR_ABORT_Pos (2U) +#define DMA2D_CR_ABORT_Msk (0x1UL << DMA2D_CR_ABORT_Pos) /*!< 0x00000004 */ +#define DMA2D_CR_ABORT DMA2D_CR_ABORT_Msk /*!< Abort transfer */ +#define DMA2D_CR_TEIE_Pos (8U) +#define DMA2D_CR_TEIE_Msk (0x1UL << DMA2D_CR_TEIE_Pos) /*!< 0x00000100 */ +#define DMA2D_CR_TEIE DMA2D_CR_TEIE_Msk /*!< Transfer Error Interrupt Enable */ +#define DMA2D_CR_TCIE_Pos (9U) +#define DMA2D_CR_TCIE_Msk (0x1UL << DMA2D_CR_TCIE_Pos) /*!< 0x00000200 */ +#define DMA2D_CR_TCIE DMA2D_CR_TCIE_Msk /*!< Transfer Complete Interrupt Enable */ +#define DMA2D_CR_TWIE_Pos (10U) +#define DMA2D_CR_TWIE_Msk (0x1UL << DMA2D_CR_TWIE_Pos) /*!< 0x00000400 */ +#define DMA2D_CR_TWIE DMA2D_CR_TWIE_Msk /*!< Transfer Watermark Interrupt Enable */ +#define DMA2D_CR_CAEIE_Pos (11U) +#define DMA2D_CR_CAEIE_Msk (0x1UL << DMA2D_CR_CAEIE_Pos) /*!< 0x00000800 */ +#define DMA2D_CR_CAEIE DMA2D_CR_CAEIE_Msk /*!< CLUT Access Error Interrupt Enable */ +#define DMA2D_CR_CTCIE_Pos (12U) +#define DMA2D_CR_CTCIE_Msk (0x1UL << DMA2D_CR_CTCIE_Pos) /*!< 0x00001000 */ +#define DMA2D_CR_CTCIE DMA2D_CR_CTCIE_Msk /*!< CLUT Transfer Complete Interrupt Enable */ +#define DMA2D_CR_CEIE_Pos (13U) +#define DMA2D_CR_CEIE_Msk (0x1UL << DMA2D_CR_CEIE_Pos) /*!< 0x00002000 */ +#define DMA2D_CR_CEIE DMA2D_CR_CEIE_Msk /*!< Configuration Error Interrupt Enable */ +#define DMA2D_CR_MODE_Pos (16U) +#define DMA2D_CR_MODE_Msk (0x3UL << DMA2D_CR_MODE_Pos) /*!< 0x00030000 */ +#define DMA2D_CR_MODE DMA2D_CR_MODE_Msk /*!< DMA2D Mode[1:0] */ +#define DMA2D_CR_MODE_0 (0x1UL << DMA2D_CR_MODE_Pos) /*!< 0x00010000 */ +#define DMA2D_CR_MODE_1 (0x2UL << DMA2D_CR_MODE_Pos) /*!< 0x00020000 */ +#define DMA2D_CR_AHB_LOCK_Pos (18U) +#define DMA2D_CR_AHB_LOCK_Msk (0x1UL << DMA2D_CR_AHB_LOCK_Pos) /*!< 0x00040000 */ +#define DMA2D_CR_AHB_LOCK DMA2D_CR_AHB_LOCK_Msk /*!< AHB lock Enable */ + + +/******************** Bit definition for DMA2D_ISR register *****************/ +#define DMA2D_ISR_TEIF_Pos (0U) +#define DMA2D_ISR_TEIF_Msk (0x1UL << DMA2D_ISR_TEIF_Pos) /*!< 0x00000001 */ +#define DMA2D_ISR_TEIF DMA2D_ISR_TEIF_Msk /*!< Transfer Error Interrupt Flag */ +#define DMA2D_ISR_TCIF_Pos (1U) +#define DMA2D_ISR_TCIF_Msk (0x1UL << DMA2D_ISR_TCIF_Pos) /*!< 0x00000002 */ +#define DMA2D_ISR_TCIF DMA2D_ISR_TCIF_Msk /*!< Transfer Complete Interrupt Flag */ +#define DMA2D_ISR_TWIF_Pos (2U) +#define DMA2D_ISR_TWIF_Msk (0x1UL << DMA2D_ISR_TWIF_Pos) /*!< 0x00000004 */ +#define DMA2D_ISR_TWIF DMA2D_ISR_TWIF_Msk /*!< Transfer Watermark Interrupt Flag */ +#define DMA2D_ISR_CAEIF_Pos (3U) +#define DMA2D_ISR_CAEIF_Msk (0x1UL << DMA2D_ISR_CAEIF_Pos) /*!< 0x00000008 */ +#define DMA2D_ISR_CAEIF DMA2D_ISR_CAEIF_Msk /*!< CLUT Access Error Interrupt Flag */ +#define DMA2D_ISR_CTCIF_Pos (4U) +#define DMA2D_ISR_CTCIF_Msk (0x1UL << DMA2D_ISR_CTCIF_Pos) /*!< 0x00000010 */ +#define DMA2D_ISR_CTCIF DMA2D_ISR_CTCIF_Msk /*!< CLUT Transfer Complete Interrupt Flag */ +#define DMA2D_ISR_CEIF_Pos (5U) +#define DMA2D_ISR_CEIF_Msk (0x1UL << DMA2D_ISR_CEIF_Pos) /*!< 0x00000020 */ +#define DMA2D_ISR_CEIF DMA2D_ISR_CEIF_Msk /*!< Configuration Error Interrupt Flag */ + +/******************** Bit definition for DMA2D_IFCR register ****************/ +#define DMA2D_IFCR_CTEIF_Pos (0U) +#define DMA2D_IFCR_CTEIF_Msk (0x1UL << DMA2D_IFCR_CTEIF_Pos) /*!< 0x00000001 */ +#define DMA2D_IFCR_CTEIF DMA2D_IFCR_CTEIF_Msk /*!< Clears Transfer Error Interrupt Flag */ +#define DMA2D_IFCR_CTCIF_Pos (1U) +#define DMA2D_IFCR_CTCIF_Msk (0x1UL << DMA2D_IFCR_CTCIF_Pos) /*!< 0x00000002 */ +#define DMA2D_IFCR_CTCIF DMA2D_IFCR_CTCIF_Msk /*!< Clears Transfer Complete Interrupt Flag */ +#define DMA2D_IFCR_CTWIF_Pos (2U) +#define DMA2D_IFCR_CTWIF_Msk (0x1UL << DMA2D_IFCR_CTWIF_Pos) /*!< 0x00000004 */ +#define DMA2D_IFCR_CTWIF DMA2D_IFCR_CTWIF_Msk /*!< Clears Transfer Watermark Interrupt Flag */ +#define DMA2D_IFCR_CAECIF_Pos (3U) +#define DMA2D_IFCR_CAECIF_Msk (0x1UL << DMA2D_IFCR_CAECIF_Pos) /*!< 0x00000008 */ +#define DMA2D_IFCR_CAECIF DMA2D_IFCR_CAECIF_Msk /*!< Clears CLUT Access Error Interrupt Flag */ +#define DMA2D_IFCR_CCTCIF_Pos (4U) +#define DMA2D_IFCR_CCTCIF_Msk (0x1UL << DMA2D_IFCR_CCTCIF_Pos) /*!< 0x00000010 */ +#define DMA2D_IFCR_CCTCIF DMA2D_IFCR_CCTCIF_Msk /*!< Clears CLUT Transfer Complete Interrupt Flag */ +#define DMA2D_IFCR_CCEIF_Pos (5U) +#define DMA2D_IFCR_CCEIF_Msk (0x1UL << DMA2D_IFCR_CCEIF_Pos) /*!< 0x00000020 */ +#define DMA2D_IFCR_CCEIF DMA2D_IFCR_CCEIF_Msk /*!< Clears Configuration Error Interrupt Flag */ + +/******************** Bit definition for DMA2D_FGMAR register ***************/ +#define DMA2D_FGMAR_MA_Pos (0U) +#define DMA2D_FGMAR_MA_Msk (0xFFFFFFFFUL << DMA2D_FGMAR_MA_Pos) /*!< 0xFFFFFFFF */ +#define DMA2D_FGMAR_MA DMA2D_FGMAR_MA_Msk /*!< Foreground Memory Address */ + +/******************** Bit definition for DMA2D_FGOR register ****************/ +#define DMA2D_FGOR_LO_Pos (0U) +#define DMA2D_FGOR_LO_Msk (0x3FFFUL << DMA2D_FGOR_LO_Pos) /*!< 0x00003FFF */ +#define DMA2D_FGOR_LO DMA2D_FGOR_LO_Msk /*!< Line Offset */ + +/******************** Bit definition for DMA2D_BGMAR register ***************/ +#define DMA2D_BGMAR_MA_Pos (0U) +#define DMA2D_BGMAR_MA_Msk (0xFFFFFFFFUL << DMA2D_BGMAR_MA_Pos) /*!< 0xFFFFFFFF */ +#define DMA2D_BGMAR_MA DMA2D_BGMAR_MA_Msk /*!< Background Memory Address */ + +/******************** Bit definition for DMA2D_BGOR register ****************/ +#define DMA2D_BGOR_LO_Pos (0U) +#define DMA2D_BGOR_LO_Msk (0x3FFFUL << DMA2D_BGOR_LO_Pos) /*!< 0x00003FFF */ +#define DMA2D_BGOR_LO DMA2D_BGOR_LO_Msk /*!< Line Offset */ + +/******************** Bit definition for DMA2D_FGPFCCR register *************/ +#define DMA2D_FGPFCCR_CM_Pos (0U) +#define DMA2D_FGPFCCR_CM_Msk (0xFUL << DMA2D_FGPFCCR_CM_Pos) /*!< 0x0000000F */ +#define DMA2D_FGPFCCR_CM DMA2D_FGPFCCR_CM_Msk /*!< Input color mode CM[3:0] */ +#define DMA2D_FGPFCCR_CM_0 (0x1UL << DMA2D_FGPFCCR_CM_Pos) /*!< 0x00000001 */ +#define DMA2D_FGPFCCR_CM_1 (0x2UL << DMA2D_FGPFCCR_CM_Pos) /*!< 0x00000002 */ +#define DMA2D_FGPFCCR_CM_2 (0x4UL << DMA2D_FGPFCCR_CM_Pos) /*!< 0x00000004 */ +#define DMA2D_FGPFCCR_CM_3 (0x8UL << DMA2D_FGPFCCR_CM_Pos) /*!< 0x00000008 */ +#define DMA2D_FGPFCCR_CCM_Pos (4U) +#define DMA2D_FGPFCCR_CCM_Msk (0x1UL << DMA2D_FGPFCCR_CCM_Pos) /*!< 0x00000010 */ +#define DMA2D_FGPFCCR_CCM DMA2D_FGPFCCR_CCM_Msk /*!< CLUT Color mode */ +#define DMA2D_FGPFCCR_START_Pos (5U) +#define DMA2D_FGPFCCR_START_Msk (0x1UL << DMA2D_FGPFCCR_START_Pos) /*!< 0x00000020 */ +#define DMA2D_FGPFCCR_START DMA2D_FGPFCCR_START_Msk /*!< Start */ +#define DMA2D_FGPFCCR_CS_Pos (8U) +#define DMA2D_FGPFCCR_CS_Msk (0xFFUL << DMA2D_FGPFCCR_CS_Pos) /*!< 0x0000FF00 */ +#define DMA2D_FGPFCCR_CS DMA2D_FGPFCCR_CS_Msk /*!< CLUT size */ +#define DMA2D_FGPFCCR_AM_Pos (16U) +#define DMA2D_FGPFCCR_AM_Msk (0x3UL << DMA2D_FGPFCCR_AM_Pos) /*!< 0x00030000 */ +#define DMA2D_FGPFCCR_AM DMA2D_FGPFCCR_AM_Msk /*!< Alpha mode AM[1:0] */ +#define DMA2D_FGPFCCR_AM_0 (0x1UL << DMA2D_FGPFCCR_AM_Pos) /*!< 0x00010000 */ +#define DMA2D_FGPFCCR_AM_1 (0x2UL << DMA2D_FGPFCCR_AM_Pos) /*!< 0x00020000 */ +#define DMA2D_FGPFCCR_CSS_Pos (18U) +#define DMA2D_FGPFCCR_CSS_Msk (0x3UL << DMA2D_FGPFCCR_CSS_Pos) /*!< 0x000C0000 */ +#define DMA2D_FGPFCCR_CSS DMA2D_FGPFCCR_CSS_Msk /* !< Chroma Sub-Sampling */ +#define DMA2D_FGPFCCR_CSS_0 (0x1UL << DMA2D_FGPFCCR_CSS_Pos) /*!< 0x00040000 */ +#define DMA2D_FGPFCCR_CSS_1 (0x2UL << DMA2D_FGPFCCR_CSS_Pos) /*!< 0x00080000 */ +#define DMA2D_FGPFCCR_AI_Pos (20U) +#define DMA2D_FGPFCCR_AI_Msk (0x1UL << DMA2D_FGPFCCR_AI_Pos) /*!< 0x00100000 */ +#define DMA2D_FGPFCCR_AI DMA2D_FGPFCCR_AI_Msk /*!< Foreground Input Alpha Inverted */ +#define DMA2D_FGPFCCR_RBS_Pos (21U) +#define DMA2D_FGPFCCR_RBS_Msk (0x1UL << DMA2D_FGPFCCR_RBS_Pos) /*!< 0x00200000 */ +#define DMA2D_FGPFCCR_RBS DMA2D_FGPFCCR_RBS_Msk /*!< Foreground Input Red Blue Swap */ +#define DMA2D_FGPFCCR_ALPHA_Pos (24U) +#define DMA2D_FGPFCCR_ALPHA_Msk (0xFFUL << DMA2D_FGPFCCR_ALPHA_Pos) /*!< 0xFF000000 */ +#define DMA2D_FGPFCCR_ALPHA DMA2D_FGPFCCR_ALPHA_Msk /*!< Alpha value */ + +/******************** Bit definition for DMA2D_FGCOLR register **************/ +#define DMA2D_FGCOLR_BLUE_Pos (0U) +#define DMA2D_FGCOLR_BLUE_Msk (0xFFUL << DMA2D_FGCOLR_BLUE_Pos) /*!< 0x000000FF */ +#define DMA2D_FGCOLR_BLUE DMA2D_FGCOLR_BLUE_Msk /*!< Foreground Blue Value */ +#define DMA2D_FGCOLR_GREEN_Pos (8U) +#define DMA2D_FGCOLR_GREEN_Msk (0xFFUL << DMA2D_FGCOLR_GREEN_Pos) /*!< 0x0000FF00 */ +#define DMA2D_FGCOLR_GREEN DMA2D_FGCOLR_GREEN_Msk /*!< Foreground Green Value */ +#define DMA2D_FGCOLR_RED_Pos (16U) +#define DMA2D_FGCOLR_RED_Msk (0xFFUL << DMA2D_FGCOLR_RED_Pos) /*!< 0x00FF0000 */ +#define DMA2D_FGCOLR_RED DMA2D_FGCOLR_RED_Msk /*!< Foreground Red Value */ + +/******************** Bit definition for DMA2D_BGPFCCR register *************/ +#define DMA2D_BGPFCCR_CM_Pos (0U) +#define DMA2D_BGPFCCR_CM_Msk (0xFUL << DMA2D_BGPFCCR_CM_Pos) /*!< 0x0000000F */ +#define DMA2D_BGPFCCR_CM DMA2D_BGPFCCR_CM_Msk /*!< Input color mode CM[3:0] */ +#define DMA2D_BGPFCCR_CM_0 (0x1UL << DMA2D_BGPFCCR_CM_Pos) /*!< 0x00000001 */ +#define DMA2D_BGPFCCR_CM_1 (0x2UL << DMA2D_BGPFCCR_CM_Pos) /*!< 0x00000002 */ +#define DMA2D_BGPFCCR_CM_2 (0x4UL << DMA2D_BGPFCCR_CM_Pos) /*!< 0x00000004 */ +#define DMA2D_BGPFCCR_CM_3 (0x8UL << DMA2D_BGPFCCR_CM_Pos) /*!< 0x00000008 */ +#define DMA2D_BGPFCCR_CCM_Pos (4U) +#define DMA2D_BGPFCCR_CCM_Msk (0x1UL << DMA2D_BGPFCCR_CCM_Pos) /*!< 0x00000010 */ +#define DMA2D_BGPFCCR_CCM DMA2D_BGPFCCR_CCM_Msk /*!< CLUT Color mode */ +#define DMA2D_BGPFCCR_START_Pos (5U) +#define DMA2D_BGPFCCR_START_Msk (0x1UL << DMA2D_BGPFCCR_START_Pos) /*!< 0x00000020 */ +#define DMA2D_BGPFCCR_START DMA2D_BGPFCCR_START_Msk /*!< Start */ +#define DMA2D_BGPFCCR_CS_Pos (8U) +#define DMA2D_BGPFCCR_CS_Msk (0xFFUL << DMA2D_BGPFCCR_CS_Pos) /*!< 0x0000FF00 */ +#define DMA2D_BGPFCCR_CS DMA2D_BGPFCCR_CS_Msk /*!< CLUT size */ +#define DMA2D_BGPFCCR_AM_Pos (16U) +#define DMA2D_BGPFCCR_AM_Msk (0x3UL << DMA2D_BGPFCCR_AM_Pos) /*!< 0x00030000 */ +#define DMA2D_BGPFCCR_AM DMA2D_BGPFCCR_AM_Msk /*!< Alpha mode AM[1:0] */ +#define DMA2D_BGPFCCR_AM_0 (0x1UL << DMA2D_BGPFCCR_AM_Pos) /*!< 0x00010000 */ +#define DMA2D_BGPFCCR_AM_1 (0x2UL << DMA2D_BGPFCCR_AM_Pos) /*!< 0x00020000 */ +#define DMA2D_BGPFCCR_AI_Pos (20U) +#define DMA2D_BGPFCCR_AI_Msk (0x1UL << DMA2D_BGPFCCR_AI_Pos) /*!< 0x00100000 */ +#define DMA2D_BGPFCCR_AI DMA2D_BGPFCCR_AI_Msk /*!< background Input Alpha Inverted */ +#define DMA2D_BGPFCCR_RBS_Pos (21U) +#define DMA2D_BGPFCCR_RBS_Msk (0x1UL << DMA2D_BGPFCCR_RBS_Pos) /*!< 0x00200000 */ +#define DMA2D_BGPFCCR_RBS DMA2D_BGPFCCR_RBS_Msk /*!< Background Input Red Blue Swap */ +#define DMA2D_BGPFCCR_ALPHA_Pos (24U) +#define DMA2D_BGPFCCR_ALPHA_Msk (0xFFUL << DMA2D_BGPFCCR_ALPHA_Pos) /*!< 0xFF000000 */ +#define DMA2D_BGPFCCR_ALPHA DMA2D_BGPFCCR_ALPHA_Msk /*!< background Input Alpha value */ + +/******************** Bit definition for DMA2D_BGCOLR register **************/ +#define DMA2D_BGCOLR_BLUE_Pos (0U) +#define DMA2D_BGCOLR_BLUE_Msk (0xFFUL << DMA2D_BGCOLR_BLUE_Pos) /*!< 0x000000FF */ +#define DMA2D_BGCOLR_BLUE DMA2D_BGCOLR_BLUE_Msk /*!< Background Blue Value */ +#define DMA2D_BGCOLR_GREEN_Pos (8U) +#define DMA2D_BGCOLR_GREEN_Msk (0xFFUL << DMA2D_BGCOLR_GREEN_Pos) /*!< 0x0000FF00 */ +#define DMA2D_BGCOLR_GREEN DMA2D_BGCOLR_GREEN_Msk /*!< Background Green Value */ +#define DMA2D_BGCOLR_RED_Pos (16U) +#define DMA2D_BGCOLR_RED_Msk (0xFFUL << DMA2D_BGCOLR_RED_Pos) /*!< 0x00FF0000 */ +#define DMA2D_BGCOLR_RED DMA2D_BGCOLR_RED_Msk /*!< Background Red Value */ + +/******************** Bit definition for DMA2D_FGCMAR register **************/ +#define DMA2D_FGCMAR_MA_Pos (0U) +#define DMA2D_FGCMAR_MA_Msk (0xFFFFFFFFUL << DMA2D_FGCMAR_MA_Pos) /*!< 0xFFFFFFFF */ +#define DMA2D_FGCMAR_MA DMA2D_FGCMAR_MA_Msk /*!< Foreground CLUT Memory Address */ + +/******************** Bit definition for DMA2D_BGCMAR register **************/ +#define DMA2D_BGCMAR_MA_Pos (0U) +#define DMA2D_BGCMAR_MA_Msk (0xFFFFFFFFUL << DMA2D_BGCMAR_MA_Pos) /*!< 0xFFFFFFFF */ +#define DMA2D_BGCMAR_MA DMA2D_BGCMAR_MA_Msk /*!< Background CLUT Memory Address */ + +/******************** Bit definition for DMA2D_OPFCCR register **************/ +#define DMA2D_OPFCCR_CM_Pos (0U) +#define DMA2D_OPFCCR_CM_Msk (0x7UL << DMA2D_OPFCCR_CM_Pos) /*!< 0x00000007 */ +#define DMA2D_OPFCCR_CM DMA2D_OPFCCR_CM_Msk /*!< Output Color mode CM[2:0] */ +#define DMA2D_OPFCCR_CM_0 (0x1UL << DMA2D_OPFCCR_CM_Pos) /*!< 0x00000001 */ +#define DMA2D_OPFCCR_CM_1 (0x2UL << DMA2D_OPFCCR_CM_Pos) /*!< 0x00000002 */ +#define DMA2D_OPFCCR_CM_2 (0x4UL << DMA2D_OPFCCR_CM_Pos) /*!< 0x00000004 */ +#define DMA2D_OPFCCR_AI_Pos (20U) +#define DMA2D_OPFCCR_AI_Msk (0x1UL << DMA2D_OPFCCR_AI_Pos) /*!< 0x00100000 */ +#define DMA2D_OPFCCR_AI DMA2D_OPFCCR_AI_Msk /*!< Output Alpha Inverted */ +#define DMA2D_OPFCCR_RBS_Pos (21U) +#define DMA2D_OPFCCR_RBS_Msk (0x1UL << DMA2D_OPFCCR_RBS_Pos) /*!< 0x00200000 */ +#define DMA2D_OPFCCR_RBS DMA2D_OPFCCR_RBS_Msk /*!< Output Red Blue Swap */ + +/******************** Bit definition for DMA2D_OCOLR register ***************/ +/*!State = HAL_DMA2D_STATE_RESET) + +/** + * @brief Enable the DMA2D. + * @param __HANDLE__: DMA2D handle + * @retval None. + */ +#define __HAL_DMA2D_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DMA2D_CR_START) + + +/* Interrupt & Flag management */ +/** + * @brief Get the DMA2D pending flags. + * @param __HANDLE__: DMA2D handle + * @param __FLAG__: flag to check. + * This parameter can be any combination of the following values: + * @arg DMA2D_FLAG_CE: Configuration error flag + * @arg DMA2D_FLAG_CTC: CLUT transfer complete flag + * @arg DMA2D_FLAG_CAE: CLUT access error flag + * @arg DMA2D_FLAG_TW: Transfer Watermark flag + * @arg DMA2D_FLAG_TC: Transfer complete flag + * @arg DMA2D_FLAG_TE: Transfer error flag + * @retval The state of FLAG. + */ +#define __HAL_DMA2D_GET_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ISR & (__FLAG__)) + +/** + * @brief Clear the DMA2D pending flags. + * @param __HANDLE__: DMA2D handle + * @param __FLAG__: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg DMA2D_FLAG_CE: Configuration error flag + * @arg DMA2D_FLAG_CTC: CLUT transfer complete flag + * @arg DMA2D_FLAG_CAE: CLUT access error flag + * @arg DMA2D_FLAG_TW: Transfer Watermark flag + * @arg DMA2D_FLAG_TC: Transfer complete flag + * @arg DMA2D_FLAG_TE: Transfer error flag + * @retval None + */ +#define __HAL_DMA2D_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->IFCR = (__FLAG__)) + +/** + * @brief Enable the specified DMA2D interrupts. + * @param __HANDLE__: DMA2D handle + * @param __INTERRUPT__: specifies the DMA2D interrupt sources to be enabled. + * This parameter can be any combination of the following values: + * @arg DMA2D_IT_CE: Configuration error interrupt mask + * @arg DMA2D_IT_CTC: CLUT transfer complete interrupt mask + * @arg DMA2D_IT_CAE: CLUT access error interrupt mask + * @arg DMA2D_IT_TW: Transfer Watermark interrupt mask + * @arg DMA2D_IT_TC: Transfer complete interrupt mask + * @arg DMA2D_IT_TE: Transfer error interrupt mask + * @retval None + */ +#define __HAL_DMA2D_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR |= (__INTERRUPT__)) + +/** + * @brief Disable the specified DMA2D interrupts. + * @param __HANDLE__: DMA2D handle + * @param __INTERRUPT__: specifies the DMA2D interrupt sources to be disabled. + * This parameter can be any combination of the following values: + * @arg DMA2D_IT_CE: Configuration error interrupt mask + * @arg DMA2D_IT_CTC: CLUT transfer complete interrupt mask + * @arg DMA2D_IT_CAE: CLUT access error interrupt mask + * @arg DMA2D_IT_TW: Transfer Watermark interrupt mask + * @arg DMA2D_IT_TC: Transfer complete interrupt mask + * @arg DMA2D_IT_TE: Transfer error interrupt mask + * @retval None + */ +#define __HAL_DMA2D_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR &= ~(__INTERRUPT__)) + +/** + * @brief Check whether the specified DMA2D interrupt source is enabled or not. + * @param __HANDLE__: DMA2D handle + * @param __INTERRUPT__: specifies the DMA2D interrupt source to check. + * This parameter can be one of the following values: + * @arg DMA2D_IT_CE: Configuration error interrupt mask + * @arg DMA2D_IT_CTC: CLUT transfer complete interrupt mask + * @arg DMA2D_IT_CAE: CLUT access error interrupt mask + * @arg DMA2D_IT_TW: Transfer Watermark interrupt mask + * @arg DMA2D_IT_TC: Transfer complete interrupt mask + * @arg DMA2D_IT_TE: Transfer error interrupt mask + * @retval The state of INTERRUPT source. + */ +#define __HAL_DMA2D_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR & (__INTERRUPT__)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup DMA2D_Exported_Functions DMA2D Exported Functions + * @{ + */ + +/** @addtogroup DMA2D_Exported_Functions_Group1 Initialization and de-initialization functions + * @{ + */ + +/* Initialization and de-initialization functions *******************************/ +HAL_StatusTypeDef HAL_DMA2D_Init(DMA2D_HandleTypeDef *hdma2d); +HAL_StatusTypeDef HAL_DMA2D_DeInit (DMA2D_HandleTypeDef *hdma2d); +void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef* hdma2d); +void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef* hdma2d); + +/** + * @} + */ + + +/** @addtogroup DMA2D_Exported_Functions_Group2 IO operation functions + * @{ + */ + +/* IO operation functions *******************************************************/ +HAL_StatusTypeDef HAL_DMA2D_Start(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width, uint32_t Height); +HAL_StatusTypeDef HAL_DMA2D_BlendingStart(DMA2D_HandleTypeDef *hdma2d, uint32_t SrcAddress1, uint32_t SrcAddress2, uint32_t DstAddress, uint32_t Width, uint32_t Height); +HAL_StatusTypeDef HAL_DMA2D_Start_IT(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width, uint32_t Height); +HAL_StatusTypeDef HAL_DMA2D_BlendingStart_IT(DMA2D_HandleTypeDef *hdma2d, uint32_t SrcAddress1, uint32_t SrcAddress2, uint32_t DstAddress, uint32_t Width, uint32_t Height); +HAL_StatusTypeDef HAL_DMA2D_Suspend(DMA2D_HandleTypeDef *hdma2d); +HAL_StatusTypeDef HAL_DMA2D_Resume(DMA2D_HandleTypeDef *hdma2d); +HAL_StatusTypeDef HAL_DMA2D_Abort(DMA2D_HandleTypeDef *hdma2d); +HAL_StatusTypeDef HAL_DMA2D_EnableCLUT(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_DMA2D_CLUTLoad(DMA2D_HandleTypeDef *hdma2d, DMA2D_CLUTCfgTypeDef CLUTCfg, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_DMA2D_CLUTLoad_IT(DMA2D_HandleTypeDef *hdma2d, DMA2D_CLUTCfgTypeDef CLUTCfg, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_DMA2D_CLUTLoading_Abort(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_DMA2D_CLUTLoading_Suspend(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_DMA2D_CLUTLoading_Resume(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_DMA2D_PollForTransfer(DMA2D_HandleTypeDef *hdma2d, uint32_t Timeout); +void HAL_DMA2D_IRQHandler(DMA2D_HandleTypeDef *hdma2d); +void HAL_DMA2D_LineEventCallback(DMA2D_HandleTypeDef *hdma2d); +void HAL_DMA2D_CLUTLoadingCpltCallback(DMA2D_HandleTypeDef *hdma2d); + +/** + * @} + */ + +/** @addtogroup DMA2D_Exported_Functions_Group3 Peripheral Control functions + * @{ + */ + +/* Peripheral Control functions *************************************************/ +HAL_StatusTypeDef HAL_DMA2D_ConfigLayer(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_DMA2D_ConfigCLUT(DMA2D_HandleTypeDef *hdma2d, DMA2D_CLUTCfgTypeDef CLUTCfg, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_DMA2D_ProgramLineEvent(DMA2D_HandleTypeDef *hdma2d, uint32_t Line); +HAL_StatusTypeDef HAL_DMA2D_EnableDeadTime(DMA2D_HandleTypeDef *hdma2d); +HAL_StatusTypeDef HAL_DMA2D_DisableDeadTime(DMA2D_HandleTypeDef *hdma2d); +HAL_StatusTypeDef HAL_DMA2D_ConfigDeadTime(DMA2D_HandleTypeDef *hdma2d, uint8_t DeadTime); + +/** + * @} + */ + +/** @addtogroup DMA2D_Exported_Functions_Group4 Peripheral State and Error functions + * @{ + */ + +/* Peripheral State functions ***************************************************/ +HAL_DMA2D_StateTypeDef HAL_DMA2D_GetState(DMA2D_HandleTypeDef *hdma2d); +uint32_t HAL_DMA2D_GetError(DMA2D_HandleTypeDef *hdma2d); + +/** + * @} + */ + +/** + * @} + */ + +/* Private constants ---------------------------------------------------------*/ + +/** @addtogroup DMA2D_Private_Constants DMA2D Private Constants + * @{ + */ + +/** @defgroup DMA2D_Maximum_Line_WaterMark DMA2D Maximum Line Watermark + * @{ + */ +#define DMA2D_LINE_WATERMARK_MAX DMA2D_LWR_LW /*!< DMA2D maximum line watermark */ +/** + * @} + */ + +/** @defgroup DMA2D_Color_Value DMA2D Color Value + * @{ + */ +#define DMA2D_COLOR_VALUE ((uint32_t)0x000000FFU) /*!< Color value mask */ +/** + * @} + */ + +/** @defgroup DMA2D_Offset DMA2D Offset + * @{ + */ +#define DMA2D_OFFSET DMA2D_FGOR_LO /*!< maximum Line Offset */ +/** + * @} + */ + +/** @defgroup DMA2D_Size DMA2D Size + * @{ + */ +#define DMA2D_PIXEL (DMA2D_NLR_PL >> 16U) /*!< DMA2D maximum number of pixels per line */ +#define DMA2D_LINE DMA2D_NLR_NL /*!< DMA2D maximum number of lines */ +/** + * @} + */ + +/** @defgroup DMA2D_CLUT_Size DMA2D CLUT Size + * @{ + */ +#define DMA2D_CLUT_SIZE (DMA2D_FGPFCCR_CS >> 8) /*!< DMA2D maximum CLUT size */ +/** + * @} + */ + +/** + * @} + */ + + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup DMA2D_Private_Macros DMA2D Private Macros + * @{ + */ +#define IS_DMA2D_ALL_INSTANCE(__INSTANCE__) ((__INSTANCE__) == DMA2D) +#define IS_DMA2D_LAYER(LAYER) ((LAYER) <= MAX_DMA2D_LAYER) +#define IS_DMA2D_MODE(MODE) (((MODE) == DMA2D_M2M) || ((MODE) == DMA2D_M2M_PFC) || \ + ((MODE) == DMA2D_M2M_BLEND) || ((MODE) == DMA2D_R2M)) +#define IS_DMA2D_CMODE(MODE_ARGB) (((MODE_ARGB) == DMA2D_OUTPUT_ARGB8888) || ((MODE_ARGB) == DMA2D_OUTPUT_RGB888) || \ + ((MODE_ARGB) == DMA2D_OUTPUT_RGB565) || ((MODE_ARGB) == DMA2D_OUTPUT_ARGB1555) || \ + ((MODE_ARGB) == DMA2D_OUTPUT_ARGB4444)) +#define IS_DMA2D_COLOR(COLOR) ((COLOR) <= DMA2D_COLOR_VALUE) +#define IS_DMA2D_LINE(LINE) ((LINE) <= DMA2D_LINE) +#define IS_DMA2D_PIXEL(PIXEL) ((PIXEL) <= DMA2D_PIXEL) +#define IS_DMA2D_OFFSET(OOFFSET) ((OOFFSET) <= DMA2D_OFFSET) +#define IS_DMA2D_INPUT_COLOR_MODE(INPUT_CM) (((INPUT_CM) == DMA2D_INPUT_ARGB8888) || ((INPUT_CM) == DMA2D_INPUT_RGB888) || \ + ((INPUT_CM) == DMA2D_INPUT_RGB565) || ((INPUT_CM) == DMA2D_INPUT_ARGB1555) || \ + ((INPUT_CM) == DMA2D_INPUT_ARGB4444) || ((INPUT_CM) == DMA2D_INPUT_L8) || \ + ((INPUT_CM) == DMA2D_INPUT_AL44) || ((INPUT_CM) == DMA2D_INPUT_AL88) || \ + ((INPUT_CM) == DMA2D_INPUT_L4) || ((INPUT_CM) == DMA2D_INPUT_A8) || \ + ((INPUT_CM) == DMA2D_INPUT_A4)) +#define IS_DMA2D_ALPHA_MODE(AlphaMode) (((AlphaMode) == DMA2D_NO_MODIF_ALPHA) || \ + ((AlphaMode) == DMA2D_REPLACE_ALPHA) || \ + ((AlphaMode) == DMA2D_COMBINE_ALPHA)) + +#define IS_DMA2D_ALPHA_INVERTED(Alpha_Inverted) (((Alpha_Inverted) == DMA2D_REGULAR_ALPHA) || \ + ((Alpha_Inverted) == DMA2D_INVERTED_ALPHA)) + +#define IS_DMA2D_RB_SWAP(RB_Swap) (((RB_Swap) == DMA2D_RB_REGULAR) || \ + ((RB_Swap) == DMA2D_RB_SWAP)) + +#define IS_DMA2D_CHROMA_SUB_SAMPLING (CSS) (((CSS) == DMA2D_NO_CSS) || \ + ((CSS) == DMA2D_CSS_422) || \ + ((CSS) == DMA2D_CSS_420)) + +#define IS_DMA2D_CLUT_CM(CLUT_CM) (((CLUT_CM) == DMA2D_CCM_ARGB8888) || ((CLUT_CM) == DMA2D_CCM_RGB888)) +#define IS_DMA2D_CLUT_SIZE(CLUT_SIZE) ((CLUT_SIZE) <= DMA2D_CLUT_SIZE) +#define IS_DMA2D_LINEWATERMARK(LineWatermark) ((LineWatermark) <= DMA2D_LINE_WATERMARK_MAX) +#define IS_DMA2D_IT(IT) (((IT) == DMA2D_IT_CTC) || ((IT) == DMA2D_IT_CAE) || \ + ((IT) == DMA2D_IT_TW) || ((IT) == DMA2D_IT_TC) || \ + ((IT) == DMA2D_IT_TE) || ((IT) == DMA2D_IT_CE)) +#define IS_DMA2D_GET_FLAG(FLAG) (((FLAG) == DMA2D_FLAG_CTC) || ((FLAG) == DMA2D_FLAG_CAE) || \ + ((FLAG) == DMA2D_FLAG_TW) || ((FLAG) == DMA2D_FLAG_TC) || \ + ((FLAG) == DMA2D_FLAG_TE) || ((FLAG) == DMA2D_FLAG_CE)) +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif //#ifdef __HAL_DMA2D_H__ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dwt.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dwt.h new file mode 100644 index 0000000000..78b15bc51a --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_dwt.h @@ -0,0 +1,36 @@ +/****************************************************************************** +*@file : hal_dwt.h +*@brief : header file +******************************************************************************/ +#ifndef __HAL_DWT_H__ +#define __HAL_DWT_H__ + +#include "hal.h" + +extern uint32_t HAL_DWT_clkPerUs, HAL_DWT_clkPerMs; + +#define _HAL_DWT_GET_CLK_TICK() (DWT->CYCCNT) +#define _HAL_DWT_GET_CLK_DELAY(startClkTick) (DWT->CYCCNT - (startClkTick)) +#define _HAL_DWT_DELAY_CLKS(startClkTick,clks) while(DWT->CYCCNT - (startClkTick) < (clks)) + +void HAL_DWT_Init(void); + + +__STATIC_FORCEINLINE uint32_t HAL_DWT_GetClkTick(void) +{ + return DWT->CYCCNT; +} + +uint32_t HAL_DWT_GetClkDelay(uint32_t startClkTick); + +uint32_t HAL_DWT_GetUsDelay(uint32_t startClkTick); + +uint32_t HAL_DWT_GetMsDelay(uint32_t startClkTick); + +void HAL_DWT_DelayClks(uint32_t clks); + +void HAL_DWT_DelayUs(uint32_t us); + +void HAL_DWT_DelayMs(uint32_t ms); + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_efuse.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_efuse.h new file mode 100644 index 0000000000..1400c99f1f --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_efuse.h @@ -0,0 +1,84 @@ +/****************************************************************************** +*@file : hal_efuse.h +*@brief : Header file of EFUSE HAL module. +******************************************************************************/ + +#ifndef __HAL_EFUSE_H__ +#define __HAL_EFUSE_H__ + +#include "hal.h" + +#define EFUSE_1US_TIMES 1000 + +/** @defgroup EFUSE FLAG + * @{ + */ + +#define EFUSE_PREREAD_FLAG EFUSE_SR_PREREAD_DONE +#define EFUSE_UNPG_FLAG EFUSE_SR_UNPG +#define EFUSE_DONE_FLAG EFUSE_SR_DONE + +/** + * @} + */ + +/** @defgroup EFUSE MODE + * @{ + */ + + +#define EFUSE_RBYTE (0U << EFUSE_CTRL_MODE_Pos) +#define EFUSE_WBYTE (1U << EFUSE_CTRL_MODE_Pos) + +/** + * @} + */ + + +/** @defgroup EFUSE Private Macros + * @{ + */ + +#define IS_EFUSE_ALL_INSTANCE(__INSTANCE__) (((__INSTANCE__) == EFUSE1) || ((__INSTANCE__) == EFUSE2)) + +#define IS_EFUSE_BYTE_ADDR(__ADDR__) ((__ADDR__ )< 0x100) + +#define IS_EFUSE_BIT_ADDR(__ADDR__) ((__ADDR__)<0x800) + +#define IS_EFUSE_FLAG(__FLAG__) ((__FLAG__) == EFUSE_PREREAD_FLAG || \ + (__FLAG__) == EFUSE_UNPG_FLAG || \ + (__FLAG__) == EFUSE_DONE_FLAG ) + +#define IS_EFUSE_CLR_FLAG(__FLAG__) ((__FLAG__) == EFUSE_UNPG_FLAG || \ + (__FLAG__) == EFUSE_DONE_FLAG ) +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ + +/* HAL_EFUSE_Init */ +HAL_StatusTypeDef HAL_EFUSE_Init(EFUSE_TypeDef *EFUSEx); + +/* HAL_EFUSE_DeInit */ +void HAL_EFUSE_DeInit(EFUSE_TypeDef *EFUSEx); + +HAL_StatusTypeDef HAL_EFUSE_ReadByte(EFUSE_TypeDef *EFUSEx,uint16_t byteaddr,uint8_t* data,uint32_t timeout); +HAL_StatusTypeDef HAL_EFUSE_ReadBytes(EFUSE_TypeDef *EFUSEx,uint16_t byteaddr,uint8_t* data,uint32_t len,uint32_t timeout); +HAL_StatusTypeDef HAL_EFUSE_WriteByte(EFUSE_TypeDef *EFUSEx,uint16_t byteaddr,uint8_t data,uint32_t timeout); +HAL_StatusTypeDef HAL_EFUSE_WriteBytes(EFUSE_TypeDef *EFUSEx,uint16_t byteaddr,uint8_t* data,uint32_t len,uint32_t timeout); + +void HAL_EFUSE_ReadDsr(EFUSE_TypeDef *EFUSEx,uint8_t str_addr,uint8_t len,uint8_t* data); +void HAL_EFUSE_RpEnable(EFUSE_TypeDef *EFUSEx); +void HAL_EFUSE_ByteWpEnable(EFUSE_TypeDef *EFUSEx); +void HAL_EFUSE_WpEnable(EFUSE_TypeDef *EFUSEx); + +FlagStatus HAL_EFUSE_GetState(EFUSE_TypeDef *EFUSEx, uint32_t flag); +void HAL_EFUSE_ClrState(EFUSE_TypeDef *EFUSEx, uint32_t flag); + +void HAL_EFUSE_PowerUpSpTimeCfg(EFUSE_TypeDef *EFUSEx, uint32_t us); +void HAL_EFUSE_PowerDownHdCfg(EFUSE_TypeDef *EFUSEx, uint32_t us); +void HAL_EFUSE_ProWaitTimeCfg(EFUSE_TypeDef *EFUSEx, uint32_t us); +void HAL_EFUSE_ProTimeCfg(EFUSE_TypeDef *EFUSEx, uint32_t us); +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_eth.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_eth.h new file mode 100644 index 0000000000..f526e026e2 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_eth.h @@ -0,0 +1,1593 @@ +/****************************************************************************** +*@file : hal_ethmac.h +*@brief : Header file of RCC HAL module. +******************************************************************************/ + + +#ifndef __HAL_ETH_H__ +#define __HAL_ETH_H__ + +#include "acm32h5xx_hal_conf.h" + + +/** @defgroup ETH_Buffs_setting ETH Buffs setting + * @{ + */ +#define ETH_MAX_PACKET_SIZE 1536U /*!< ETH_HEADER + ETH_EXTRA + ETH_VLAN_TAG + ETH_MAX_ETH_PAYLOAD + ETH_CRC */ +#define ETH_HEADER 14U /*!< 6 byte Dest addr, 6 byte Src addr, 2 byte length/type */ +#define ETH_CRC 4U /*!< Ethernet CRC */ +#define ETH_EXTRA 2U /*!< Extra bytes in some cases */ +#define ETH_VLAN_TAG 4U /*!< optional 802.1q VLAN Tag */ +#define ETH_MIN_ETH_PAYLOAD 46U /*!< Minimum Ethernet payload size */ +#define ETH_MAX_ETH_PAYLOAD 1500U /*!< Maximum Ethernet payload size */ +#define ETH_JUMBO_FRAME_PAYLOAD 9000U /*!< Jumbo frame payload size */ + + +#define ETH_PTP_TIMEOUT 0xffffu +/** + * @brief HAL State structures definition + */ +typedef enum +{ + HAL_ETH_STATE_RESET = 0x00U, /*!< Peripheral not yet Initialized or disabled */ + HAL_ETH_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ + HAL_ETH_STATE_BUSY = 0x02U, /*!< an internal process is ongoing */ + HAL_ETH_STATE_BUSY_TX = 0x12U, /*!< Data Transmission process is ongoing */ + HAL_ETH_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing */ + HAL_ETH_STATE_BUSY_TX_RX = 0x32U, /*!< Data Transmission and Reception process is ongoing */ + HAL_ETH_STATE_BUSY_WR = 0x42U, /*!< Write process is ongoing */ + HAL_ETH_STATE_BUSY_RD = 0x82U, /*!< Read process is ongoing */ + HAL_ETH_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ + HAL_ETH_STATE_ERROR = 0x04U /*!< Reception process is ongoing */ +}HAL_ETH_StateTypeDef; + + /** + * @} + */ + +/** @defgroup ETH_Error_Code ETH Error Code + * @{ + */ +#define HAL_ETH_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ +#define HAL_ETH_ERROR_PARAM ((uint32_t)0x00000001U) /*!< Busy error */ +#define HAL_ETH_ERROR_BUSY ((uint32_t)0x00000002U) /*!< Parameter error */ +#define HAL_ETH_ERROR_TIMEOUT ((uint32_t)0x00000004U) /*!< Timeout error */ +#define HAL_ETH_ERROR_DMA ((uint32_t)0x00000008U) /*!< DMA transfer error */ +#define HAL_ETH_ERROR_MAC ((uint32_t)0x00000010U) /*!< MAC transfer error */ + +/** + * @} + */ + +typedef enum +{ + ETH_MEDIA_INTERFACE_MII = 0, // MII + ETH_MEDIA_INTERFACE_RMII // RMII +}ETH_MediaInterfaceTypeDef; + +typedef enum +{ + ETH_SPEED_100M = 0, // 100M + ETH_SPEED_10M // 10M +}ETH_SpeedTypeDef; + +typedef enum +{ + ETH_MODE_FULL_DUPLEX = 0, // ȫ˫ + ETH_MODE_HALF_DUPLEX // ˫ +}ETH_ModeTypeDef; + +typedef enum +{ + ETH_DESC_LIST_MODE_RING = 0, // νṹ + ETH_DESC_LIST_MODE_LIST // ӽṹ +}ETH_DescListModeTypeDef; + +#define ETH_TX_MODE_DATA_COPY BIT0 +#define ETH_TX_MODE_TIMESTAMP BIT1 +#define ETH_TX_MODE_WAIT_TX_COMPLETE BIT2 + +/** + * + */ + +typedef struct __ETH_BufferTypeDef +{ + uint8_t *Buff; + uint32_t Len; + struct __ETH_BufferTypeDef *next; +} __attribute__((aligned(4))) ETH_BuffTypeDef; + +/** + * @brief ETH DMA Descriptors data structure definition + */ + +typedef struct +{ + __IO uint32_t DESC0; + __IO uint32_t DESC1; + __IO uint32_t DESC2; + __IO uint32_t DESC3; + __IO uint32_t DESC4; + __IO uint32_t DESC5; + __IO uint32_t DESC6; + __IO uint32_t DESC7; + __IO uint32_t Buff1; + __IO uint32_t Buff2; +} __attribute__((aligned(4))) ETH_DMADescTypeDef; + + +/** + * @brief DMA Transmit Descriptors Wrapper structure definition + */ +typedef struct +{ + ETH_DMADescTypeDef *TxDescTab; /*Instance->MACIMR |= (__INTERRUPT__)) + +/** + * @brief Disables the specified ETHERNET MAC interrupts. + * @param __HANDLE__ ETH Handle + * @param __INTERRUPT__ specifies the ETHERNET MAC interrupt sources to be + * enabled or disabled. + * This parameter can be any combination of the following values: + * @arg ETH_MAC_IT_TST : Time stamp trigger interrupt + * @arg ETH_MAC_IT_PMT : PMT interrupt + * @retval None + */ +#define __HAL_ETH_MAC_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->MACIMR &= ~(__INTERRUPT__)) +#define __HAL_ETH_MAC_GET_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->MACIMR &( __INTERRUPT__)) == ( __INTERRUPT__)) + +/** + * @brief Checks whether the specified ETHERNET MAC flag is set or not. + * @param __HANDLE__ ETH Handle + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_MAC_FLAG_TST : Time stamp trigger flag + * @arg ETH_MAC_FLAG_MMCT : MMC transmit flag + * @arg ETH_MAC_FLAG_MMCR : MMC receive flag + * @arg ETH_MAC_FLAG_MMC : MMC flag + * @arg ETH_MAC_FLAG_PMT : PMT flag + * @retval The state of ETHERNET MAC flag. + */ +#define __HAL_ETH_MAC_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->MACSR &( __FLAG__)) == ( __FLAG__)) + +/** + * @brief Enables the specified ETHERNET DMA interrupts. + * @param __HANDLE__ ETH Handle + * @param __INTERRUPT__ specifies the ETHERNET DMA interrupt sources to be + * enabled @ref ETH_DMA_Interrupts + * @retval None + */ +#define __HAL_ETH_DMA_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DMAIER |= (__INTERRUPT__)) + +/** + * @brief Disables the specified ETHERNET DMA interrupts. + * @param __HANDLE__ ETH Handle + * @param __INTERRUPT__ specifies the ETHERNET DMA interrupt sources to be + * disabled. @ref ETH_DMA_Interrupts + * @retval None + */ +#define __HAL_ETH_DMA_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DMAIER &= ~(__INTERRUPT__)) + +#define __HAL_ETH_DMA_GET_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->DMAIER & (__INTERRUPT__)) == (__INTERRUPT__)) + +/** + * @brief Clears the ETHERNET DMA IT pending bit. + * @param __HANDLE__ ETH Handle + * @param __INTERRUPT__ specifies the interrupt pending bit to clear. @ref ETH_DMA_Interrupts + * @retval None + */ +//#define __HAL_ETH_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->DMASR =(__FLAG__)) + +/** + * @brief Checks whether the specified ETHERNET DMA flag is set or not. +* @param __HANDLE__ ETH Handle + * @param __FLAG__ specifies the flag to check. @ref ETH_DMA_Flags + * @retval The new state of ETH_DMA_FLAG (SET or RESET). + */ +#define __HAL_ETH_DMA_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->DMASR &( __FLAG__)) == ( __FLAG__)) + +/** + * @brief Checks whether the specified ETHERNET DMA flag is set or not. + * @param __HANDLE__ ETH Handle + * @param __FLAG__ specifies the flag to clear. @ref ETH_DMA_Flags + * @retval The new state of ETH_DMA_FLAG (SET or RESET). + */ +#define __HAL_ETH_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->DMASR = (__FLAG__)) + + + + + +#define IS_ETH_SOURCE_ADDR_CONTROL(para) (((para) == ETH_SOURCE_ADDRESS_DISABLE) || \ + ((para) == ETH_SOURCE_ADDRESS_INSERT_ADDR0) || \ + ((para) == ETH_SOURCE_ADDRESS_INSERT_ADDR1) || \ + ((para) == ETH_SOURCE_ADDRESS_REPLACE_ADDR0) || \ + ((para) == ETH_SOURCE_ADDRESS_REPLACE_ADDR1)) + +#define IS_ETH_INTERFRAME_GAP(para) (((para) == ETH_INTERFRAME_GAP_96BIT) || \ + ((para) == ETH_INTERFRAME_GAP_88BIT) || \ + ((para) == ETH_INTERFRAME_GAP_80BIT) || \ + ((para) == ETH_INTERFRAME_GAP_72BIT) || \ + ((para) == ETH_INTERFRAME_GAP_64BIT) || \ + ((para) == ETH_INTERFRAME_GAP_56BIT) || \ + ((para) == ETH_INTERFRAME_GAP_48BIT) || \ + ((para) == ETH_INTERFRAME_GAP_40BIT)) + +#define IS_ETH_SPEED(para) (((para) == ETH_SPEED_10M) || \ + ((para) == ETH_SPEED_100M)) + +#define IS_ETH_DUPLEX_MODE(para) (((para) == ETH_MODE_FULL_DUPLEX) || \ + ((para) == ETH_MODE_HALF_DUPLEX)) + +#define IS_ETH_MAC_SPEED(para) (((para) == ETH_MAC_SPEED_10M) || \ + ((para) == ETH_MAC_SPEED_100M)) + +#define IS_ETH_MODE(para) (((para) == ETH_MODE_HALF_DUPLEX) || \ + ((para) == ETH_MODE_FULL_DUPLEX)) + +#define IS_ETH_BACK_OFF_LIMIT(para) (((para) == ETH_BACK_OFF_LIMIT_10) || \ + ((para) == ETH_BACK_OFF_LIMIT_8) || \ + ((para) == ETH_BACK_OFF_LIMIT_4) || \ + ((para) == ETH_BACK_OFF_LIMIT_1)) + +#define IS_ETH_PREAMBLE_LEN(para) (((para) == ETH_PREAMBLE_LEN_7B) || \ + ((para) == ETH_PREAMBLE_LEN_5B) || \ + ((para) == ETH_PREAMBLE_LEN_3B)) + +#define IS_ETH_PASS_CONTROL_PACKETS(para) (((para) == ETH_PASS_CONTROL_BLOCK_ALL) || \ + ((para) == ETH_PASS_CONTROL_FORWARD_ALL_EXCEPT_PAUSE_FRAME) || \ + ((para) == ETH_PASS_CONTROL_FORWARD_ALL) || \ + ((para) == ETH_PASS_CONTROL_FORWARD_PASSED_ADDR_FILTER)) + +#define IS_ETH_PAUSE_TIME(para) ((para) <= 0xFFFFUL) + +#define IS_ETH_PAUSE_LOW_THRESHOLD(para) (((para) == ETH_PAUSE_LOW_THRESHOLD_MINUS_4) || \ + ((para) == ETH_PAUSE_LOW_THRESHOLD_MINUS_28) || \ + ((para) == ETH_PAUSE_LOW_THRESHOLD_MINUS_144) || \ + ((para) == ETH_PAUSE_LOW_THRESHOLD_MINUS_256)) + +#define IS_ETH_VLAN_TAG(para) ((para) <= 0x0000FFFFUL) + + +#define IS_ETH_TRANSMIT_THRESHOLD_CONTROL(para) (((para) == ETH_TRANSMIT_THRESHOLD_CONTROL_64BYTES) || \ + ((para) == ETH_TRANSMIT_THRESHOLD_CONTROL_128BYTES) || \ + ((para) == ETH_TRANSMIT_THRESHOLD_CONTROL_192BYTES) || \ + ((para) == ETH_TRANSMIT_THRESHOLD_CONTROL_256BYTES) || \ + ((para) == ETH_TRANSMIT_THRESHOLD_CONTROL_40BYTES) || \ + ((para) == ETH_TRANSMIT_THRESHOLD_CONTROL_32BYTES) || \ + ((para) == ETH_TRANSMIT_THRESHOLD_CONTROL_24BYTES) || \ + ((para) == ETH_TRANSMIT_THRESHOLD_CONTROL_16BYTES)) + +#define IS_ETH_RECEIVED_THRESHOLD_CONTROL(para) (((para) == ETH_RECEIVED_THRESHOLD_CONTROL_64BYTES) || \ + ((para) == ETH_RECEIVED_THRESHOLD_CONTROL_32BYTES) || \ + ((para) == ETH_RECEIVED_THRESHOLD_CONTROL_96BYTES) || \ + ((para) == ETH_RECEIVED_THRESHOLD_CONTROL_128BYTES)) + +#define IS_ETH_RX_DMA_BURST_LEN(para) (((para) == ETH_RX_DMA_BURST_LEN_1BEAT) || \ + ((para) == ETH_RX_DMA_BURST_LEN_2BEAT) || \ + ((para) == ETH_RX_DMA_BURST_LEN_4BEAT) || \ + ((para) == ETH_RX_DMA_BURST_LEN_8BEAT) || \ + ((para) == ETH_RX_DMA_BURST_LEN_16BEAT) || \ + ((para) == ETH_RX_DMA_BURST_LEN_32BEAT)) + +#define IS_ETH_RX_TX_PRIORITY_RATIO(para) (((para) == ETH_RX_TX_PRIORITY_RATIO_1_1) || \ + ((para) == ETH_RX_TX_PRIORITY_RATIO_2_1) || \ + ((para) == ETH_RX_TX_PRIORITY_RATIO_3_1) || \ + ((para) == ETH_RX_TX_PRIORITY_RATIO_4_1)) + +#define IS_ETH_TX_DMA_BURST_LEN(para) (((para) == ETH_TX_DMA_BURST_LEN_1BEAT) || \ + ((para) == ETH_TX_DMA_BURST_LEN_2BEAT) || \ + ((para) == ETH_TX_DMA_BURST_LEN_4BEAT) || \ + ((para) == ETH_TX_DMA_BURST_LEN_8BEAT) || \ + ((para) == ETH_TX_DMA_BURST_LEN_16BEAT) || \ + ((para) == ETH_TX_DMA_BURST_LEN_32BEAT)) + +#define IS_ETH_DESCRIPTOR_SKIP_LEN(para) ((para) <= 31U) + +#define IS_ETH_DMA_ARBITRATION(para) (((para) == ETH_DMA_ARBITRATION_ROUNDROBIN) || \ + ((para) == ETH_DMA_ARBITRATION_RX_PRIOR_TX)) + + + + + +#define IS_ETH_ADDR_FILTER_GROUP_MASK(para) (((para) & ~(ETH_MACA1HR_MBC >> ETH_MACA1HR_MBC_Pos)) == 0) + +#define IS_ETH_VLAN_HASH_TABLE(para) ((para) <= 0xFFFFU) + +#define IS_ETH_VLAN_MODE(para) (((para) == ETH_VLAN_MODE_NONE) || \ + ((para) == ETH_VLAN_MODE_DELETE) || \ + ((para) == ETH_VLAN_MODE_INSERT) || \ + ((para) == ETH_VLAN_MODE_REPLACE)) + +#define IS_ETH_IPV6_ADDR_MASK(para) ((para) <= 127U) + +#define IS_ETH_IPV4_SOUR_ADDR_MASK(para) ((para) <= 31U) + +#define IS_ETH_IPV4_DEST_ADDR_MASK(para) ((para) <= 31U) + +#define IS_ETH_SOUR_PORT(para) ((para) <= 0xFFFFU) + +#define IS_ETH_DEST_PORT(para) ((para) <= 0xFFFFU) + + + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +HAL_StatusTypeDef HAL_ETH_Init(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_DeInit(ETH_HandleTypeDef *heth); +void HAL_ETH_MspInit(ETH_HandleTypeDef *heth); +void HAL_ETH_MspDeInit(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitDefaultParamter(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitSpeedDefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetSpeedConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetSpeedConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetSpeedDefaultConfig(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitDuplexModeDefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetDuplexModeConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetDuplexModeConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetDuplexModeDefaultConfig(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitMACAddrDefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetMACAddrConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetMACAddrConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetMACAddrDefaultConfig(ETH_HandleTypeDef *heth); + + +void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth); +void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth); +void HAL_ETH_DMAErrorCallback(ETH_HandleTypeDef *heth); +void HAL_ETH_IRQHandler(ETH_HandleTypeDef *heth); +void HAL_ETH_WakeupIRQHandler(ETH_HandleTypeDef *heth); +void HAL_ETH_LPISendEntryCallback(ETH_HandleTypeDef *heth); +void HAL_ETH_LPISendExitCallback(ETH_HandleTypeDef *heth); +void HAL_ETH_LPIRecvEntryCallback(ETH_HandleTypeDef *heth); +void HAL_ETH_LPIRecvExitCallback(ETH_HandleTypeDef *heth); +void HAL_ETH_WakeupCallback(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_GetTxBuff(ETH_HandleTypeDef *heth, ETH_BuffTypeDef **buff); +HAL_StatusTypeDef HAL_ETH_Transmit(ETH_HandleTypeDef *heth, ETH_BuffTypeDef *buff, uint32_t mode, ETH_TxStatusTypeDef *pStatus); +HAL_StatusTypeDef HAL_ETH_Receive(ETH_HandleTypeDef *heth, ETH_BuffTypeDef **buff, ETH_RxStatusTypeDef *pStatus); +HAL_StatusTypeDef HAL_ETH_ReleaseRxDescriptors(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_Start(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_Stop(ETH_HandleTypeDef *heth); +HAL_ETH_StateTypeDef HAL_ETH_GetState(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitAddrFilterDefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetAddrFilterConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetAddrFilterConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetAddrFilterDefaultConfig(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitVLANFilterDefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetVLANFilterConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetVLANFilterConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetVLANFilterDefaultConfig(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitL3L4FilterDefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetL3L4FilterConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetL3L4FilterConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetL3L4FilterDefaultConfig(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitFilterDefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetFilterConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetFilterConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetFilterDefaultConfig(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitVLANDefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetVLANConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetVLANConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetVLANDefaultConfig(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitMACDefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetMACConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetMACConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetMACDefaultConfig(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitDMADefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetDMAConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetDMAConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetDMADefaultConfig(ETH_HandleTypeDef *heth); + +uint32_t HAL_ETH_GetFlowCtrlStatus(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_RecvFlowCtrlEnable(ETH_HandleTypeDef *heth, uint32_t pausetime); +HAL_StatusTypeDef HAL_ETH_RecvFlowCtrlDisable(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SendFlowCtrlEnable(ETH_HandleTypeDef *heth, uint32_t unicast_pause_frame_detect); +HAL_StatusTypeDef HAL_ETH_SendFlowCtrlDisable(ETH_HandleTypeDef *heth); +uint32_t HAL_ETH_GetBackPressureStatus(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_BackPressureEnable(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_BackPressureDisable(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitMMCDefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetMMCCounter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetMMCConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetMMCConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetMMCDefaultConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_MMCFreezeCounter(ETH_HandleTypeDef *heth, FunctionalState cmd); +HAL_StatusTypeDef HAL_ETH_MMCResetCounter(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitLPIDefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetLPIConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetLPIConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetLPIDefaultConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_EnterLPIMode(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_ExitLPIMode(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_InitPMTDefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetPMTConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetPMTConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetPMTDefaultConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_EnterPowerDownMode(ETH_HandleTypeDef *heth, uint32_t WakeupMode, uint32_t WakeupFrameEnable, uint32_t MagicPacketEnable); + +HAL_StatusTypeDef HAL_ETH_InitPTPDefaultParamter(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_GetPTPConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetPTPConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_SetPTPDefaultConfig(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_PTPStart(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp); +HAL_StatusTypeDef HAL_ETH_PTPStop(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_PTPAdjFreq(ETH_HandleTypeDef *heth, int32_t freq); +HAL_StatusTypeDef HAL_ETH_PTPUpdateOffset(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp); +HAL_StatusTypeDef HAL_ETH_PTPTimeSetTime(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp); +HAL_StatusTypeDef HAL_ETH_PTPGetSystemTime(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp); +HAL_StatusTypeDef HAL_ETH_PTPGetTargetTime(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp); +HAL_StatusTypeDef HAL_ETH_PTPSetTargetTime(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp); +HAL_StatusTypeDef HAL_ETH_PTPGetAuxiliaryTime(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp); +uint32_t HAL_ETH_PTPGetAuxiTimeStatus(ETH_HandleTypeDef *heth, ETH_PTPAuxiTimeStatusTypeDef *status); + + + +HAL_StatusTypeDef HAL_ETH_ConfigSMI(ETH_HandleTypeDef *heth); +HAL_StatusTypeDef HAL_ETH_ReadPHYRegister(ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg, uint32_t *RegValue); +HAL_StatusTypeDef HAL_ETH_WritePHYRegister(ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg, uint32_t RegValue); + +HAL_StatusTypeDef HAL_ETH_RxClockDelayConfig(ETH_HandleTypeDef *heth, uint32_t uint, uint32_t len); + + +#endif + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_exti.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_exti.h new file mode 100644 index 0000000000..81e8655ce5 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_exti.h @@ -0,0 +1,174 @@ +/****************************************************************************** +*@file : hal_exti.h +*@brief : Header file of EXTI HAL module. +******************************************************************************/ + +#ifndef __HAL_EXTI_H__ +#define __HAL_EXTI_H__ + +#include "hal.h" +#include "hal_gpio.h" + + +/** @defgroup EXTI_Line + * @brief When line is 0-15, its definition is the same as GPIO_pins + * @{ + */ + +#define EXTI_LINE_0 ( 0U ) +#define EXTI_LINE_1 ( 1U ) +#define EXTI_LINE_2 ( 2U ) +#define EXTI_LINE_3 ( 3U ) +#define EXTI_LINE_4 ( 4U ) +#define EXTI_LINE_5 ( 5U ) +#define EXTI_LINE_6 ( 6U ) +#define EXTI_LINE_7 ( 7U ) +#define EXTI_LINE_8 ( 8U ) +#define EXTI_LINE_9 ( 9U ) +#define EXTI_LINE_10 ( 10U ) +#define EXTI_LINE_11 ( 11U ) +#define EXTI_LINE_12 ( 12U ) +#define EXTI_LINE_13 ( 13U ) +#define EXTI_LINE_14 ( 14U ) +#define EXTI_LINE_15 ( 15U ) +#define EXTI_LINE_LVD ( 16U ) +#define EXTI_LINE_RTC ( 17U ) +#define EXTI_LINE_IWDT ( 18U ) +#define EXTI_LINE_COMP1 ( 19U ) +#define EXTI_LINE_COMP2 ( 20U ) +#define EXTI_LINE_COMP3 ( 21U ) +#define EXTI_LINE_COMP4 ( 22U ) +#define EXTI_LINE_USB1 ( 23U ) +#define EXTI_LINE_USB2 ( 24U ) +#define EXTI_LINE_LPTIM1 ( 25U ) +#define EXTI_LINE_LPTIM2 ( 26U ) +#define EXTI_LINE_LPTIM3 ( 27U ) +#define EXTI_LINE_LPTIM4 ( 28U ) +#define EXTI_LINE_LPTIM5 ( 29U ) +#define EXTI_LINE_LPTIM6 ( 30U ) +#define EXTI_LINE_LPUART1 ( 31U ) +#define EXTI_LINE_LPUART2 ( 32U ) +#define EXTI_LINE_ETH_WAKEUP ( 33U ) +#define EXTI_LINE_TKEY ( 34U ) + + +/** + * @} + */ + +/** @brief PIN mask for assert test + */ + +#define EXTI_ALL_LINE_MASK ( 0x003FFFFFU ) /* PIN mask for assert test */ +#define EXTI_GPIO_LINE_MASK ( 0x0000FFFFU ) /* PIN mask */ +#define EXTI_GPIOA_LINE_MASK ( 0x0000FF3FU ) /* PIN mask for assert test */ +#define EXTI_GPIOB_LINE_MASK ( 0x000000FFU ) /* PIN mask for assert test */ +#define EXTI_GPIOC_LINE_MASK ( 0x0000E1FFU ) /* PIN mask for assert test */ + +/** @defgroup EXTI_Mode + * @brief its definition is the same as that of GPIO_MODE_IT_RISINGGPIO_MODE_IT_FALLING + * GPIO_MODE_IT_RISING_FALLINGGPIO_MODE_EVT_RISINGGPIO_MODE_EVT_RISING + * GPIO_MODE_EVT_RISING in GPIO_Mode + * @{ + */ + +#define EXTI_MODE_IT_RISING ( 0x10110000U ) /*!< External Interrupt Mode with Rising edge trigger detection */ +#define EXTI_MODE_IT_FALLING ( 0x10210000U ) /*!< External Interrupt Mode with Falling edge trigger detection */ +#define EXTI_MODE_IT_RISING_FALLING ( 0x10310000U ) /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ +#define EXTI_MODE_EVT_RISING ( 0x10120000U ) /*!< External Event Mode with Rising edge trigger detection */ +#define EXTI_MODE_EVT_FALLING ( 0x10220000U ) /*!< External Event Mode with Falling edge trigger detection */ +#define EXTI_MODE_EVT_RISING_FALLING ( 0x10320000U ) /*!< External Event Mode with Rising/Falling edge trigger detection */ + +/** + * @} + */ + +/** @defgroup EXTI_GPIOSel EXTI GPIOSel + * @brief + * @{ + */ + +#define EXTI_GPIOA ( 0U ) +#define EXTI_GPIOB ( 1U ) +#define EXTI_GPIOC ( 2U ) +#define EXTI_GPIOD ( 3U ) +#define EXTI_GPIOE ( 4U ) +#define EXTI_GPIOF ( 5U ) +#define EXTI_GPIOG ( 6U ) +#define EXTI_GPIOH ( 7U ) +#define EXTI_GPIOI ( 8U ) +#define EXTI_GPIOJ ( 9U ) +#define EXTI_GPIOK ( 10U ) +#define EXTI_GPIOL ( 11U ) +#define EXTI_GPIOM ( 12U ) +#define EXTI_GPION ( 13U ) +#define EXTI_GPIOO ( 14U ) +#define EXTI_GPIOP ( 15U ) +#define EXTI_GPIOQ ( 16U ) + +/** + * @} + */ + + + +/** + * @brief EXTI Configuration structure definition + */ +typedef struct +{ + uint32_t u32_Line; /*!< The Exti line to be configured. This parameter + can be a value of @ref EXTI_Line */ + uint32_t u32_Mode; /*!< The Exit Mode to be configured for a core. + This parameter can be a combination of @ref EXTI_Mode */ + uint32_t u32_GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. + This parameter is only possible for line 0 to 15. It + can be a value of @ref EXTI_GPIOSel */ +}EXTI_HandleTypeDef; + + +/** @defgroup EXTI Private Macros + * @{ + */ + +#define IS_EXTI_GPIO(__GPIO__) (((__GPIO__) == GPIOA) || ((__GPIO__) == GPIOB) || \ + ((__GPIO__) == GPIOC) || ((__GPIO__) == GPIOD) || \ + ((__GPIO__) == GPIOE) || ((__GPIO__) == GPIOF) || \ + ((__GPIO__) == GPIOG) || ((__GPIO__) == GPIOH) || \ + ((__GPIO__) == GPIOI) || ((__GPIO__) == GPIOJ) || \ + ((__GPIO__) == GPIOK) || ((__GPIO__) == GPIOL) || \ + ((__GPIO__) == GPIOM) || ((__GPIO__) == GPION) || \ + ((__GPIO__) == GPIOO) || ((__GPIO__) == GPIOP) || \ + ((__GPIO__) == GPIOQ)) + +#define IS_EXTI_SINGLE_GPIO_LINE(__LINE__) ((__LINE__) <= EXTI_LINE_15) + +#define IS_EXTI_SINGLE_LINE(__LINE__) ((__LINE__) <= EXTI_LINE_TKEY) + +#define IS_EXTI_MODE(__MODE__) (((__MODE__) == EXTI_MODE_IT_RISING) || \ + ((__MODE__) == EXTI_MODE_IT_FALLING) || \ + ((__MODE__) == EXTI_MODE_IT_RISING_FALLING) || \ + ((__MODE__) == EXTI_MODE_EVT_RISING) || \ + ((__MODE__) == EXTI_MODE_EVT_FALLING) || \ + ((__MODE__) == EXTI_MODE_EVT_RISING_FALLING)) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +void HAL_EXTI_IRQHandler(uint32_t Line); +void HAL_EXTI_LineCallback(uint32_t Line); +HAL_StatusTypeDef HAL_EXTI_SetConfigLine(GPIO_TypeDef *GPIOx, uint32_t Line, uint32_t Mode); +HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(uint32_t Line); +FunctionalState HAL_EXTI_IsConfigLine(GPIO_TypeDef *GPIOx, uint32_t Line); +void HAL_EXTI_GenerateSWI(uint32_t Line); +FlagStatus HAL_EXTI_GetPending(uint32_t Line); +void HAL_EXTI_ClearPending(uint32_t Line); +void HAL_EXTI_ClearAllPending(void); + + + +#endif + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_fdcan.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_fdcan.h new file mode 100644 index 0000000000..ad19ebeb7a --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_fdcan.h @@ -0,0 +1,930 @@ +#ifndef __HAL_FDCAN_H__ +#define __HAL_FDCAN_H__ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "acm32h5xx_hal_conf.h" + +typedef enum +{ + HAL_FDCAN_STATE_RESET = 0x00U, /*!< FDCAN not yet initialized or disabled */ + HAL_FDCAN_STATE_READY = 0x01U, /*!< FDCAN initialized and ready for use */ + HAL_FDCAN_STATE_BUSY = 0x02U, /*!< FDCAN process is ongoing */ + HAL_FDCAN_STATE_ERROR = 0x03U /*!< FDCAN error state */ +} HAL_FDCAN_StateTypeDef; + +/** + * @brief FDCAN Init structure definition + */ +typedef struct +{ + uint32_t Mode; /*!< Specifies the FDCAN mode. + This parameter can be a value of @ref FDCAN_operating_mode */ + + uint32_t FrameISOType; /*!< Specifies the FDCAN frame ISO Type. + This parameter can be a value of @ref FDCAN_frame_ISOType */ + + uint32_t RxBufOverFlowMode; /*!< Specifies the FDCAN Receive buffer Overflow Mode. + This parameter can be a value of @ref FDCAN_Rx_FIFO_operation_mode. */ + FunctionalState AutoRetransmission; /*!< Enable or disable the automatic retransmission mode. + This parameter can be set to ENABLE or DISABLE */ + + uint32_t NominalPrescaler; /*!< Specifies the value by which the oscillator frequency is + divided for generating the nominal bit time quanta. */ + + uint32_t NominalSyncJumpWidth; /*!< Specifies the maximum number of time quanta the FDCAN + hardware is allowed to lengthen or shorten a bit to perform + resynchronization. */ + + uint32_t NominalTimeSeg1; /*!< Specifies the number of time quanta in Bit Segment 1. */ + + uint32_t NominalTimeSeg2; /*!< Specifies the number of time quanta in Bit Segment 2. */ + + uint32_t DataPrescaler; /*!< Specifies the value by which the oscillator frequency is + divided for generating the data bit time quanta. */ + + uint32_t DataSyncJumpWidth; /*!< Specifies the maximum number of time quanta the FDCAN + hardware is allowed to lengthen or shorten a data bit to + perform resynchronization. */ + + uint32_t DataTimeSeg1; /*!< Specifies the number of time quanta in Data Bit Segment 1. */ + + uint32_t DataTimeSeg2; /*!< Specifies the number of time quanta in Data Bit Segment 2. */ + +} FDCAN_InitTypeDef; + + +/** + * @brief FDCAN filter structure definition + */ +typedef struct +{ + uint32_t IdType; /*!< Specifies the identifier type. + This parameter can be a value of @ref FDCAN_id_type */ + uint32_t FilterIndex; /*!< Specifies the filter which will be initialized. + This parameter must be a number less than NR_OF_ACF - 1 */ + uint32_t FilerMask; + + uint32_t FilerCode; + + uint32_t FilterType; /*!< Specifies the filter type. + This parameter can be a value of @ref FDCAN_filter_type. + The value FDCAN_EXT_FILTER_RANGE_NO_EIDM is permitted + only when IdType is FDCAN_EXTENDED_ID. + This parameter is ignored if FilterConfig is set to + FDCAN_FILTER_TO_RXBUFFER */ +} FDCAN_FilterTypeDef; + + +typedef enum +{ + FDCAN_FILTER_TYPE0 = 0, + FDCAN_FILTER_TYPE1, + FDCAN_FILTER_TYPE2, + FDCAN_FILTER_TYPE3, +}FDCAN_Filter_enum; + +typedef union +{ + struct + { + uint32_t r0:1; + uint32_t RTR:1; + uint32_t IDE:1; + uint32_t EXTID0_17:18; + uint32_t id:11; + }b; + + struct + { + uint32_t r0:1; + uint32_t RTR:1; + uint32_t IDE:1; + uint32_t id:29; + }ext; + + uint32_t w; +}FDCAN_Filter32_Map_u; + +typedef union +{ + struct + { + uint16_t EXTID15_17:3; + uint16_t IDE:1; + uint16_t RTR:1; + uint16_t id:11; + }b; + uint16_t hw; +}FDCAN_Filter16_Map_u; + +typedef union +{ + struct + { + FDCAN_Filter32_Map_u code32; //acode; + FDCAN_Filter32_Map_u mask32; //amask; + }type0; + + struct + { + FDCAN_Filter32_Map_u code32; + FDCAN_Filter32_Map_u code32_2; + }type1; + + struct + { + FDCAN_Filter16_Map_u code16; + FDCAN_Filter16_Map_u mask16; + FDCAN_Filter16_Map_u code16_2; + FDCAN_Filter16_Map_u mask16_2; + }type2; + + struct + { + FDCAN_Filter16_Map_u code16; + FDCAN_Filter16_Map_u code16_2; + FDCAN_Filter16_Map_u code16_3; + FDCAN_Filter16_Map_u code16_4; + }type3; + +}FDCAN_Filter_u; + +typedef struct +{ + uint32_t FilterIndex; + FDCAN_Filter_enum FilterType; + FDCAN_Filter_u Filter; + +}FDCAN_NewFilterTypeDef; + + +typedef union +{ + struct{ + __IO uint32_t ID:29; + __IO uint32_t RSV:2; + __IO uint32_t TTSEN:1; + }b; + __IO uint32_t w; +}FDCAN_TX_ID_u; + +typedef union +{ + struct{ + __IO uint32_t DLC:4; + __IO uint32_t BRS:1; + __IO uint32_t FDF:1; + __IO uint32_t RTR:1; + __IO uint32_t IDE:1; + __IO uint32_t RSV0:8; + __IO uint32_t RSV1:8; + __IO uint32_t RSV2:8; + + }b; + __IO uint32_t w; +}FDCAN_TX_FrameInfo_u; + + +typedef union +{ + struct{ + __IO uint32_t ID:29; + __IO uint32_t RSV:2; + __IO uint32_t ESI:1; //error state indicator + }b; + __IO uint32_t w; +}FDCAN_RX_ID_u; + + +typedef union +{ + struct{ + __IO uint32_t DLC:4; + __IO uint32_t BRS:1; + __IO uint32_t FDF:1; + __IO uint32_t RTR:1; + __IO uint32_t IDE:1; + __IO uint32_t RSV0:4; + __IO uint32_t TX:1; + __IO uint32_t KOER:3; + __IO uint32_t CycleTime:16; + }b; + __IO uint32_t w; +}FDCAN_RX_FrameInfo_u; + + +typedef fdcan_ecc_u FDCAN_ErrorInfo_u; + +/** + * @brief FDCAN Tx header structure definition + */ +typedef struct +{ + FDCAN_TX_ID_u ID; + + FDCAN_TX_FrameInfo_u FrameInfo; + +} FDCAN_TxHeaderTypeDef; + +/** + * @brief FDCAN Rx header structure definition + */ +typedef struct +{ + FDCAN_RX_ID_u ID; + + FDCAN_RX_FrameInfo_u FrameInfo; + + uint32_t RxTimestampLow; + + uint32_t RxTimestampHigh; + +} FDCAN_RxHeaderTypeDef; + + +typedef struct{ + uint32_t tts_h; + uint32_t tts_l; +}FDCAN_TTSTypeDef; + +/** + * @brief FDCAN Trigger structure definition + */ +typedef struct +{ +// uint32_t TriggerIndex; /*!< Specifies the trigger which will be configured. +// This parameter must be a number between 0 and 63 */ + + uint32_t TimeMark; /*!< Specifies the cycle time for which the trigger becomes active. + This parameter must be a number between 0 and 0xFFFF */ + + uint32_t RepeatFactor; /*!< Specifies the trigger repeat factor. + This parameter can be a value of @ref FDCAN_TT_Repeat_Factor */ + + uint32_t StartCycle; /*!< Specifies the index of the first cycle in which the trigger becomes active. + This parameter is ignored if RepeatFactor is set to FDCAN_TT_REPEAT_EVERY_CYCLE. + This parameter must be a number between 0 and RepeatFactor */ + + uint32_t TriggerType; /*!< Specifies the trigger type. + This parameter can be a value of @ref FDCAN_TT_Trigger_Type */ + + uint32_t TTPtr; /*!< Specifies the index of the Tx buffer for which the trigger is valid. + This parameter can be a value of @ref FDCAN_Tx_location. + This parameter is taken in consideration only if the trigger is configured for + transmission. */ + + uint32_t FilterIndex; /*!< Specifies the filter for which the trigger is valid. + This parameter is taken in consideration only if the trigger is configured for + reception. + This parameter must be a number between: + - 0 and 127, if FilterType is FDCAN_STANDARD_ID + - 0 and 63, if FilterType is FDCAN_EXTENDED_ID */ + + uint32_t TxEnWindow; /* transmit enalbe window */ + +} FDCAN_TriggerTypeDef; + + +/** + * @brief FDCAN handle structure definition + */ +typedef struct __FDCAN_HandleTypeDef +{ + FDCAN_GlobalTypeDef *Instance; /*!< Register base address */ + +// TTCAN_TypeDef *ttcan; /*!< TT register base address */ + + FDCAN_InitTypeDef Init; /*!< FDCAN required parameters */ + +// FDCAN_MsgRamAddressTypeDef msgRam; /*!< FDCAN Message RAM blocks */ + + uint32_t LatestTxFifoQRequest; /*!< FDCAN Tx buffer index + of latest Tx FIFO/Queue request */ + + __IO HAL_FDCAN_StateTypeDef State; /*!< FDCAN communication state */ + + HAL_LockTypeDef Lock; /*!< FDCAN locking object */ + + __IO uint32_t ErrorCode; /*!< FDCAN Error code */ + + __IO FDCAN_ErrorInfo_u CANErrorInfo; + +#if USE_HAL_FDCAN_REGISTER_CALLBACKS == 1 + void (* ClockCalibrationCallback)(struct __FDCAN_HandleTypeDef *hfdcan, uint32_t ClkCalibrationITs); /*!< FDCAN Clock Calibration callback */ + void (* TxEventFifoCallback)(struct __FDCAN_HandleTypeDef *hfdcan, uint32_t TxEventFifoITs); /*!< FDCAN Tx Event Fifo callback */ + void (* RxFifo0Callback)(struct __FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs); /*!< FDCAN Rx Fifo 0 callback */ + void (* RxFifo1Callback)(struct __FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo1ITs); /*!< FDCAN Rx Fifo 1 callback */ + void (* TxFifoEmptyCallback)(struct __FDCAN_HandleTypeDef *hfdcan); /*!< FDCAN Tx Fifo Empty callback */ + void (* TxBufferCompleteCallback)(struct __FDCAN_HandleTypeDef *hfdcan, uint32_t BufferIndexes); /*!< FDCAN Tx Buffer complete callback */ + void (* TxBufferAbortCallback)(struct __FDCAN_HandleTypeDef *hfdcan, uint32_t BufferIndexes); /*!< FDCAN Tx Buffer abort callback */ + void (* RxBufferNewMessageCallback)(struct __FDCAN_HandleTypeDef *hfdcan); /*!< FDCAN Rx Buffer New Message callback */ + void (* HighPriorityMessageCallback)(struct __FDCAN_HandleTypeDef *hfdcan); /*!< FDCAN High priority message callback */ + void (* TimestampWraparoundCallback)(struct __FDCAN_HandleTypeDef *hfdcan); /*!< FDCAN Timestamp wraparound callback */ + void (* TimeoutOccurredCallback)(struct __FDCAN_HandleTypeDef *hfdcan); /*!< FDCAN Timeout occurred callback */ + void (* ErrorCallback)(struct __FDCAN_HandleTypeDef *hfdcan); /*!< FDCAN Error callback */ + void (* ErrorStatusCallback)(struct __FDCAN_HandleTypeDef *hfdcan, uint32_t ErrorStatusITs); /*!< FDCAN Error status callback */ + void (* TT_ScheduleSyncCallback)(struct __FDCAN_HandleTypeDef *hfdcan, uint32_t TTSchedSyncITs); /*!< FDCAN T Schedule Synchronization callback */ + void (* TT_TimeMarkCallback)(struct __FDCAN_HandleTypeDef *hfdcan, uint32_t TTTimeMarkITs); /*!< FDCAN TT Time Mark callback */ + void (* TT_StopWatchCallback)(struct __FDCAN_HandleTypeDef *hfdcan, uint32_t SWTime, uint32_t SWCycleCount); /*!< FDCAN TT Stop Watch callback */ + void (* TT_GlobalTimeCallback)(struct __FDCAN_HandleTypeDef *hfdcan, uint32_t TTGlobTimeITs); /*!< FDCAN TT Global Time callback */ + + void (* MspInitCallback)(struct __FDCAN_HandleTypeDef *hfdcan); /*!< FDCAN Msp Init callback */ + void (* MspDeInitCallback)(struct __FDCAN_HandleTypeDef *hfdcan); /*!< FDCAN Msp DeInit callback */ +#endif /* USE_HAL_FDCAN_REGISTER_CALLBACKS */ + +#ifdef HAL_DMA_MODULE_ENABLED + DMA_HandleTypeDef *HDMA_Rx; /* SPI Rx DMA handle parameters */ + DMA_HandleTypeDef *HDMA_Tx; /* SPI Tx DMA handle parameters */ +#endif + +} FDCAN_HandleTypeDef; + + +/* Transmition buffer type enum */ +typedef enum { + FDCAN_TRANSMIT_PTB = 0, + FDCAN_TRANSMIT_STB_ONE = 1, + FDCAN_TRANSMIT_STB_ALL = 2 +}TransmitType_enum; + +typedef enum { + FDCAN_ABORT_PTB = 0, + FDCAN_ABORT_STB = 1, +}TransmitAbortType_enum; + + +typedef enum { + FDCAN_RXBUF_EMPTY = 0, + FDCAN_RXBUF_LESS_AFWL = 1, + FDCAN_RXBUF_AFWL = 2, + FDCAN_RXBUF_FULL = 3, + FDCAN_RXBUF_OV, +}FDCAN_RXBUF_FILL_STATE_enum; + +typedef enum { + FDCAN_TXBUF_EMPTY = 0, + FDCAN_TXBUF_HALF_LESSHF = 1, + FDCAN_TXBUF_MORE_HALF = 2, + FDCAN_TXBUF_FULL = 3, +}FDCAN_TXBUF_FILL_STATE_enum; + +typedef enum +{ + FDCAN_MAC_NONE_ERR = 0, + FDCAN_MAC_BIT_ERR, + FDCAN_MAC_FORM_ERR, + FDCAN_MAC_STUFF_ERR, + FDCAN_MAC_ACK_ERR, + FDCAN_MAC_CRC_ERR, + FDCAN_MAC_OTHER_ERRS +}FDCAN_MAC_ERR_enum; + + +#if USE_HAL_FDCAN_REGISTER_CALLBACKS == 1 +/** + * @brief HAL FDCAN common Callback ID enumeration definition + */ +typedef enum +{ + HAL_FDCAN_TX_FIFO_EMPTY_CB_ID = 0x00U, /*!< FDCAN Tx Fifo Empty callback ID */ + HAL_FDCAN_RX_BUFFER_NEW_MSG_CB_ID = 0x01U, /*!< FDCAN Rx buffer new message callback ID */ + HAL_FDCAN_HIGH_PRIO_MESSAGE_CB_ID = 0x02U, /*!< FDCAN High priority message callback ID */ + HAL_FDCAN_TIMESTAMP_WRAPAROUND_CB_ID = 0x03U, /*!< FDCAN Timestamp wraparound callback ID */ + HAL_FDCAN_TIMEOUT_OCCURRED_CB_ID = 0x04U, /*!< FDCAN Timeout occurred callback ID */ + HAL_FDCAN_ERROR_CALLBACK_CB_ID = 0x05U, /*!< FDCAN Error callback ID */ + + HAL_FDCAN_MSPINIT_CB_ID = 0x06U, /*!< FDCAN MspInit callback ID */ + HAL_FDCAN_MSPDEINIT_CB_ID = 0x07U, /*!< FDCAN MspDeInit callback ID */ + +} HAL_FDCAN_CallbackIDTypeDef; + +/** + * @brief HAL FDCAN Callback pointer definition + */ +typedef void (*pFDCAN_CallbackTypeDef)(FDCAN_HandleTypeDef *hfdcan); /*!< pointer to a common FDCAN callback function */ +typedef void (*pFDCAN_ClockCalibrationCallbackTypeDef)(FDCAN_HandleTypeDef *hfdcan, uint32_t ClkCalibrationITs); /*!< pointer to Clock Calibration FDCAN callback function */ +typedef void (*pFDCAN_TxEventFifoCallbackTypeDef)(FDCAN_HandleTypeDef *hfdcan, uint32_t TxEventFifoITs); /*!< pointer to Tx event Fifo FDCAN callback function */ +typedef void (*pFDCAN_RxFifo0CallbackTypeDef)(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs); /*!< pointer to Rx Fifo 0 FDCAN callback function */ +typedef void (*pFDCAN_RxFifo1CallbackTypeDef)(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo1ITs); /*!< pointer to Rx Fifo 1 FDCAN callback function */ +typedef void (*pFDCAN_TxBufferCompleteCallbackTypeDef)(FDCAN_HandleTypeDef *hfdcan, uint32_t BufferIndexes); /*!< pointer to Tx Buffer complete FDCAN callback function */ +typedef void (*pFDCAN_TxBufferAbortCallbackTypeDef)(FDCAN_HandleTypeDef *hfdcan, uint32_t BufferIndexes); /*!< pointer to Tx Buffer abort FDCAN callback function */ +typedef void (*pFDCAN_ErrorStatusCallbackTypeDef)(FDCAN_HandleTypeDef *hfdcan, uint32_t ErrorStatusITs); /*!< pointer to Error Status callback function */ +typedef void (*pFDCAN_TT_ScheduleSyncCallbackTypeDef)(FDCAN_HandleTypeDef *hfdcan, uint32_t TTSchedSyncITs); /*!< pointer to TT Schedule Synchronization FDCAN callback function */ +typedef void (*pFDCAN_TT_TimeMarkCallbackTypeDef)(FDCAN_HandleTypeDef *hfdcan, uint32_t TTTimeMarkITs); /*!< pointer to TT Time Mark FDCAN callback function */ +typedef void (*pFDCAN_TT_StopWatchCallbackTypeDef)(FDCAN_HandleTypeDef *hfdcan, uint32_t SWTime, uint32_t SWCycleCount); /*!< pointer to TT Stop Watch FDCAN callback function */ +typedef void (*pFDCAN_TT_GlobalTimeCallbackTypeDef)(FDCAN_HandleTypeDef *hfdcan, uint32_t TTGlobTimeITs); /*!< pointer to TT Global Time FDCAN callback function */ +#endif /* USE_HAL_FDCAN_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup FDCAN_Exported_Constants FDCAN Exported Constants + * @{ + */ + +#define NR_OF_ACF (16) + +/** @defgroup HAL_FDCAN_Error_Code HAL FDCAN Error Code + * @{ + */ +#define ERR_FDCAN_NONE ((uint32_t)0x00000000U) /*!< No error */ +#define HAL_FDCAN_ERROR_TIMEOUT ((uint32_t)0x00000001U) /*!< Timeout error */ +#define HAL_FDCAN_ERROR_NOT_INITIALIZED ((uint32_t)0x00000002U) /*!< Peripheral not initialized */ +#define HAL_FDCAN_ERROR_NOT_READY ((uint32_t)0x00000004U) /*!< Peripheral not ready */ +#define HAL_FDCAN_ERROR_NOT_STARTED ((uint32_t)0x00000008U) /*!< Peripheral not started */ +#define HAL_FDCAN_ERROR_NOT_SUPPORTED ((uint32_t)0x00000010U) /*!< Mode not supported */ +#define HAL_FDCAN_ERROR_PARAM ((uint32_t)0x00000020U) /*!< Parameter error */ +#define HAL_FDCAN_ERROR_PENDING ((uint32_t)0x00000040U) /*!< Pending operation */ +#define HAL_FDCAN_ERROR_RAM_ACCESS ((uint32_t)0x00000080U) /*!< Message RAM Access Failure */ +#define ERR_FDCAN_RXBUF_EMPTY ((uint32_t)0x00000100U) /*!< Put element in full FIFO */ +#define ERR_FDCAN_TXBUF_FULL ((uint32_t)0x00000200U) /*!< Get element from empty FIFO */ +#define ERR_FDCAN_TBSLOT_FULL ((uint32_t)0x00000200U) /*!< Get element from empty FIFO */ +#define ERR_FDCAN_PTB_LOCKED ((uint32_t)0x00000400U) +#define HAL_FDCAN_ERROR_LOG_OVERFLOW FDCAN_IR_ELO /*!< Overflow of CAN Error Logging Counter */ +#define HAL_FDCAN_ERROR_RAM_WDG FDCAN_IR_WDI /*!< Message RAM Watchdog event occurred */ +#define HAL_FDCAN_ERROR_PROTOCOL_ARBT FDCAN_IR_PEA /*!< Protocol Error in Arbitration Phase (Nominal Bit Time is used) */ +#define HAL_FDCAN_ERROR_PROTOCOL_DATA FDCAN_IR_PED /*!< Protocol Error in Data Phase (Data Bit Time is used) */ +#define HAL_FDCAN_ERROR_RESERVED_AREA FDCAN_IR_ARA /*!< Access to Reserved Address */ +#define HAL_FDCAN_ERROR_TT_GLOBAL_TIME FDCAN_TTIR_GTE /*!< Global Time Error : Synchronization deviation exceeded limit */ +#define HAL_FDCAN_ERROR_TT_TX_UNDERFLOW FDCAN_TTIR_TXU /*!< Tx Count Underflow : Less Tx trigger than expected in one matrix cycle */ +#define HAL_FDCAN_ERROR_TT_TX_OVERFLOW FDCAN_TTIR_TXO /*!< Tx Count Overflow : More Tx trigger than expected in one matrix cycle */ +#define HAL_FDCAN_ERROR_TT_SCHEDULE1 FDCAN_TTIR_SE1 /*!< Scheduling error 1 */ +#define HAL_FDCAN_ERROR_TT_SCHEDULE2 FDCAN_TTIR_SE2 /*!< Scheduling error 2 */ +#define HAL_FDCAN_ERROR_TT_NO_INIT_REF FDCAN_TTIR_IWT /*!< No system startup due to missing reference message */ +#define HAL_FDCAN_ERROR_TT_NO_REF FDCAN_TTIR_WT /*!< Missing reference message */ +#define HAL_FDCAN_ERROR_TT_APPL_WDG FDCAN_TTIR_AW /*!< Application watchdog not served in time */ +#define HAL_FDCAN_ERROR_TT_CONFIG FDCAN_TTIR_CER /*!< Error found in trigger list */ + +#if USE_HAL_FDCAN_REGISTER_CALLBACKS == 1 +#define HAL_FDCAN_ERROR_INVALID_CALLBACK ((uint32_t)0x00000100U) /*!< Invalid Callback error */ +#endif /* USE_HAL_FDCAN_REGISTER_CALLBACKS */ +/** + * @} + */ + +/** @defgroup FDCAN_frame_format FDCAN Frame Format + * @{ + */ +#define FDCAN_FRAME_CLASSIC ((uint32_t)0x00000000U) /*!< Classic mode */ +#define FDCAN_FRAME_FD_NO_BRS ((uint32_t)FDCAN_CCCR_FDOE) /*!< FD mode without BitRate Switching */ +#define FDCAN_FRAME_FD_BRS ((uint32_t)(FDCAN_CCCR_FDOE | FDCAN_CCCR_BRSE)) /*!< FD mode with BitRate Switching */ +/** + * @} + */ + +/** @defgroup FDCAN_frame_ISOType FDCAN Frame ISO Type + * @{ + */ +#define FDCAN_FRAME_ISO (FDCAN_CR_FD_ISO) +#define FDCAN_FRAME_NONISO (0) +/** + * @} + */ + +#define FDCAN_TIMESTAMP_DISABLE (0) +#define FDCAN_TIMESTAMP_ENABLE (1) + + +/** @defgroup FDCAN_operating_mode FDCAN Operating Mode + * @{ + */ + +#define FDCAN_MODE_NORMAL (0) /*!< Normal mode */ +#define FDCAN_MODE_LOM (FDCAN_CR_LOM) /*!< Listen only Mode. same as bus monitoring mode */ +#define FDCAN_MODE_LBMI (FDCAN_CR_LBMI) /*!< LoopBack mode internal */ +#define FDCAN_MODE_LBME (FDCAN_CR_LBME) /*!< LoopBack mode External */ +#define FDCAN_MODE_LBME_SACK (FDCAN_CR_LBME | FDCAN_CR_SACK) /*!< LoopBack mode External with self-ACK */ +#define FDCAN_MODE_LOM_LBME (FDCAN_CR_LOM | FDCAN_CR_LBME) /*!< Listen only mode combined LBME */ +#define FDCAN_MODE_LOM_LBME_SACK (FDCAN_CR_LOM | FDCAN_MODE_LBME_SACK) /*!< Listen only mode combined LBME with self-ACK */ + + +/** + * @} + */ + + +/** @defgroup FDCAN_id_type FDCAN ID Type + * @{ + */ +#define FDCAN_STANDARD_ID ((uint32_t)0) /*!< Standard ID element */ +#define FDCAN_EXTENDED_ID ((uint32_t)1) /*!< Extended ID element */ +#define FDCAN_BOTH_ID ((uint32_t)2) /*!< Extended ID element */ +/** + * @} + */ + +/** @defgroup FDCAN_frame_type FDCAN Frame Type + * @{ + */ +#define FDCAN_DATA_FRAME ((uint32_t)0x00000000U) /*!< Data frame */ +#define FDCAN_REMOTE_FRAME ((uint32_t)0x20000000U) /*!< Remote frame */ +/** + * @} + */ + +/** @defgroup FDCAN_data_length_code FDCAN Data Length Code + * @{ + */ +#define FDCAN_DLC_BYTES_0 (0x0) /*!< 0 bytes data field */ +#define FDCAN_DLC_BYTES_1 (0x1) /*!< 1 bytes data field */ +#define FDCAN_DLC_BYTES_2 (0x2) /*!< 2 bytes data field */ +#define FDCAN_DLC_BYTES_3 (0x3) /*!< 3 bytes data field */ +#define FDCAN_DLC_BYTES_4 (0x4) /*!< 4 bytes data field */ +#define FDCAN_DLC_BYTES_5 (0x5) /*!< 5 bytes data field */ +#define FDCAN_DLC_BYTES_6 (0x6) /*!< 6 bytes data field */ +#define FDCAN_DLC_BYTES_7 (0x7) /*!< 7 bytes data field */ +#define FDCAN_DLC_BYTES_8 (0x8) /*!< 8 bytes data field */ +#define FDCAN_DLC_BYTES_12 (0x9) /*!< 12 bytes data field */ +#define FDCAN_DLC_BYTES_16 (0xA) /*!< 16 bytes data field */ +#define FDCAN_DLC_BYTES_20 (0xB) /*!< 20 bytes data field */ +#define FDCAN_DLC_BYTES_24 (0xC) /*!< 24 bytes data field */ +#define FDCAN_DLC_BYTES_32 (0xD) /*!< 32 bytes data field */ +#define FDCAN_DLC_BYTES_48 (0xE) /*!< 48 bytes data field */ +#define FDCAN_DLC_BYTES_64 (0xF) /*!< 64 bytes data field */ +/** + * @} + */ + +/** @defgroup FDCAN_error_state_indicator FDCAN Error State Indicator + * @{ + */ +#define FDCAN_ESI_ACTIVE ((uint32_t)0x00000000U) /*!< Transmitting node is error active */ +#define FDCAN_ESI_PASSIVE ((uint32_t)0x80000000U) /*!< Transmitting node is error passive */ +/** + * @} + */ + + +/** @defgroup FDCAN_protocol_error_code FDCAN protocol error code + * @{ + */ +#define FDCAN_PROTOCOL_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error occurred */ +#define FDCAN_PROTOCOL_ERROR_STUFF ((uint32_t)0x00000001U) /*!< Stuff error */ +#define FDCAN_PROTOCOL_ERROR_FORM ((uint32_t)0x00000002U) /*!< Form error */ +#define FDCAN_PROTOCOL_ERROR_ACK ((uint32_t)0x00000003U) /*!< Acknowledge error */ +#define FDCAN_PROTOCOL_ERROR_BIT1 ((uint32_t)0x00000004U) /*!< Bit 1 (recessive) error */ +#define FDCAN_PROTOCOL_ERROR_BIT0 ((uint32_t)0x00000005U) /*!< Bit 0 (dominant) error */ +#define FDCAN_PROTOCOL_ERROR_CRC ((uint32_t)0x00000006U) /*!< CRC check sum error */ +#define FDCAN_PROTOCOL_ERROR_NO_CHANGE ((uint32_t)0x00000007U) /*!< No change since last read */ +/** + * @} + */ + +/** @defgroup FDCAN_communication_state FDCAN communication state + * @{ + */ +#define FDCAN_BUS_IDLE ((uint32_t)0x00000000U) /*!< Node is synchronizing on CAN communication */ +#define FDCAN_BUS_RACTIVE ((uint32_t)0x00000004U) /*!< Node is neither receiver nor transmitter */ +#define FDCAN_BUS_TACTIVE ((uint32_t)0x00000002U) /*!< Node is operating as receiver */ +#define FDCAN_BUS_OFF ((uint32_t)0x00000001U) /*!< Node is operating as transmitter */ +/** + * @} + */ + + +/** @defgroup FDCAN_Rx_FIFO_operation_mode FDCAN FIFO operation mode + * @{ + */ +#define FDCAN_RX_BUF_BLOCKING ((uint32_t)0x00000000U) /*!< Rx FIFO blocking mode */ +#define FDCAN_RX_BUF_OVERWRITE ((uint32_t)0x80000000U) /*!< Rx FIFO overwrite mode */ +/** + * @} + */ + + +/** @defgroup tt_presc_selection TTCAN Timer PRESCaler + * @{ + */ +#define FDCAN_TT_TPRESC_1 ((uint32_t)0x00000000U) +#define FDCAN_TT_TPRESC_2 ((uint32_t)0x00000001U) +#define FDCAN_TT_TPRESC_4 ((uint32_t)0x00000002U) +#define FDCAN_TT_TPRESC_8 ((uint32_t)0x00000003U) +#define IS_FDCAN_TT_TPRESC(PRESC) (((PRESC) == FDCAN_TT_TPRESC_1) || \ + ((PRESC) == FDCAN_TT_TPRESC_2) || \ + ((PRESC) == FDCAN_TT_TPRESC_4) || \ + ((PRESC) == FDCAN_TT_TPRESC_8)) + +#define FDCAN_TT_TX_IMMEDIATE_TRIGGER ((uint32_t)0x00000000U) /*!< For immediate transmission */ +#define FDCAN_TT_RX_TIME_TRIGGER ((uint32_t)0x00000001U) /*!< For receive triggers */ +#define FDCAN_TT_TX_TRIGGER_SINGLE ((uint32_t)0x00000002U) /*!< For exclusive time windows */ +#define FDCAN_TT_TX_TRIGGER_MERGED_START ((uint32_t)0x00000003U) /*!< For merged arbitrating time windows */ +#define FDCAN_TT_TX_TRIGGER_MERGED_STOP ((uint32_t)0x00000004U) /*!< For merged arbitrating time windows */ +#define FDCAN_TT_TRIGGER_NOCATION ((uint32_t)0x00000005U) /*!< For merged arbitrating time windows */ +//#define FDCAN_TT_END_OF_LIST ((uint32_t)0x0000000AU) /*!< Illegal trigger, to be assigned to the unused triggers after a FDCAN_TT_WATCH_TRIGGER or FDCAN_TT_WATCH_TRIGGER_GAP */ +#define IS_FDCAN_TT_TRIGGER_TYPE(TYPE) (((TYPE) == FDCAN_TT_TX_IMMEDIATE_TRIGGER ) || \ + ((TYPE) == FDCAN_TT_RX_TIME_TRIGGER ) || \ + ((TYPE) == FDCAN_TT_TX_TRIGGER_SINGLE ) || \ + ((TYPE) == FDCAN_TT_TX_TRIGGER_MERGED_START ) || \ + ((TYPE) == FDCAN_TT_TX_TRIGGER_MERGED_STOP)) + +#define FDCAN_TIMESTAMP_SOF 0 +#define FDCAN_TIMESTAMP_EOF 1 +#define IS_FDCAN_TIMESTAMP_POSITION(pos) ((pos) == FDCAN_TIMESTAMP_SOF) || ((pos) == FDCAN_TIMESTAMP_EOF) + +#define FDCAN_IR_MASK (0x2A00FE) /*!< FDCAN interrupts mask */ +#define FDCAN_ERR_IR_MASK (0x2A) /*!< FDCAN error interrupts mask */ + +#define FDCAN_FLAG_RX_BUFFER_NEW_MESSAGE (FDCAN_IR_RIF ) /*!< At least one received message stored into a Rx Buffer */ +#define FDCAN_FLAG_RX_BUFFER_OVERRUN (FDCAN_IR_ROIF ) /*!< At least one received message stored into a Rx Buffer */ +#define FDCAN_FLAG_RX_BUFFER_FULL (FDCAN_IR_RFIF ) +#define FDCAN_FLAG_RX_BUFFER_ALMOSTFULL (FDCAN_IR_RAFIF ) +#define FDCAN_FLAG_TX_PTB_COMPLETE (FDCAN_IR_TPIF ) +#define FDCAN_FLAG_TX_STB_COMPLETE (FDCAN_IR_TSIF ) +#define FDCAN_FLAG_ERROR (FDCAN_IR_EIF ) +#define FDCAN_FLAG_TX_ABORT_COMPLETE (FDCAN_IR_AIF ) +#define FDCAN_FLAG_BUS_ERROR (FDCAN_IR_BEIF ) +#define FDCAN_FLAG_ARBITRATION_LOST (FDCAN_IR_ALIF ) +#define FDCAN_FLAG_ERROR_PASSIVE (FDCAN_IR_EPIF ) +#define FDCAN_FLAG_ERRPASSMD_ACTIVE (FDCAN_IR_EPASS ) +#define FDCAN_FLAG_ERRWARN_LIMIT (FDCAN_IR_EWARN ) + +#define FDCAN_IE_RX_BUFFER_NEW_MESSAGE (FDCAN_IR_RIE ) /*!< At least one received message stored into a Rx Buffer */ +#define FDCAN_IE_RX_BUFFER_OVERRUN (FDCAN_IR_ROIE ) /*!< At least one received message stored into a Rx Buffer */ +#define FDCAN_IE_RX_BUFFER_FULL (FDCAN_IR_RFIE ) +#define FDCAN_IE_RX_BUFFER_ALMOSTFULL (FDCAN_IR_RAFIE ) +#define FDCAN_IE_TX_PTB_COMPLETE (FDCAN_IR_TPIE ) +#define FDCAN_IE_TX_STB_COMPLETE (FDCAN_IR_TSIE ) +#define FDCAN_IE_ERROR (FDCAN_IR_EIE ) +#define FDCAN_IE_BUS_ERROR (FDCAN_IR_BEIE ) +#define FDCAN_IE_ARBITRATION_LOST (FDCAN_IR_ALIE ) +#define FDCAN_IE_ERROR_PASSIVE (FDCAN_IR_EPIE ) + + +#define __HAL_FDCAN_ENTER_RESET_STATE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR, FDCAN_CR_RESET) +#define __HAL_FDCAN_EXIT_RESET_STATE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR, FDCAN_CR_RESET) + +#define __HAL_FDCAN_DLC2LEN(DLC) ( DLC < 9 ? DLC : DLC < 13 ? 8 + (DLC - 8) * 4 : 32 + (DLC - 13) * 16 ) +#define __HAL_FDCAN_LEN2DLC(LEN) ( LEN < 9 ? LEN : LEN < 32 ? 8 + (LEN - 8) / 4 : 13 + (LEN - 32) / 16 ) + + +#if USE_HAL_FDCAN_REGISTER_CALLBACKS == 1 +#define __HAL_FDCAN_RESET_HANDLE_STATE(__HANDLE__) do{ \ + (__HANDLE__)->State = HAL_FDCAN_STATE_RESET; \ + (__HANDLE__)->MspInitCallback = NULL; \ + (__HANDLE__)->MspDeInitCallback = NULL; \ + } while(0) +#else +#define __HAL_FDCAN_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_FDCAN_STATE_RESET) +#endif /* USE_HAL_FDCAN_REGISTER_CALLBACKS */ + +#define __HAL_FDCAN_ENABLE_IT(__HANDLE__, __INTERRUPT__) (__HANDLE__)->Instance->IR = ((__HANDLE__)->Instance->IR & FDCAN_IR_MASK ) | (__INTERRUPT__) +#define __HAL_FDCAN_ENABLE_IT_ALL(__HANDLE__) ((__HANDLE__)->Instance->IR = FDCAN_IR_MASK) + +#define __HAL_FDCAN_DISABLE_IT(__HANDLE__, __INTERRUPT__) (__HANDLE__)->Instance->IR &= ~((__INTERRUPT__) & FDCAN_IR_MASK) +#define __HAL_FDCAN_DISABLE_IT_ALL(__HANDLE__) ((__HANDLE__)->Instance->IR = 0) + +#define __HAL_FDCAN_GET_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->IR & (__FLAG__)) +#define __HAL_FDCAN_CLEAR_FLAG(__HANDLE__, __FLAG__) \ +do{ \ + ((__HANDLE__)->Instance->IR) = (((__HANDLE__)->Instance->IR) & (FDCAN_IR_MASK) ) | (__FLAG__); \ + }while(0) + +#define __HAL_FDCAN_TT_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->TTCFG) = (((__HANDLE__)->Instance->TTCFG) & ~0x16800) | (__INTERRUPT__)) +#define __HAL_FDCAN_TT_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->TTCFG) = (((__HANDLE__)->Instance->TTCFG) & ~0x16800) & (~__INTERRUPT__)) + +#define __HAL_FDCAN_TT_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->TTCFG) & (__FLAG__)) +#define __HAL_FDCAN_TT_CLEAR_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->TTCFG) = ((__HANDLE__)->Instance->TTCFG & ~0x16800) | (__FLAG__)) + +#define __HAL_FDCAN_DISABLE_ALL_FILTERS(__HANDLE__) ((__HANDLE__)->Instance->ACFCR.b.AE = 0) + + +HAL_StatusTypeDef HAL_FDCAN_Init(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_DeInit(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef *hfdcan); +//HAL_StatusTypeDef HAL_FDCAN_EnterPowerDownMode(FDCAN_HandleTypeDef *hfdcan); +//HAL_StatusTypeDef HAL_FDCAN_ExitPowerDownMode(FDCAN_HandleTypeDef *hfdcan); + +#if USE_HAL_FDCAN_REGISTER_CALLBACKS == 1 +/* Callbacks Register/UnRegister functions ***********************************/ +HAL_StatusTypeDef HAL_FDCAN_RegisterCallback(FDCAN_HandleTypeDef *hfdcan, HAL_FDCAN_CallbackIDTypeDef CallbackID, pFDCAN_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_FDCAN_UnRegisterCallback(FDCAN_HandleTypeDef *hfdcan, HAL_FDCAN_CallbackIDTypeDef CallbackID); +HAL_StatusTypeDef HAL_FDCAN_RegisterClockCalibrationCallback(FDCAN_HandleTypeDef *hfdcan, pFDCAN_ClockCalibrationCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_FDCAN_UnRegisterClockCalibrationCallback(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_RegisterTxEventFifoCallback(FDCAN_HandleTypeDef *hfdcan, pFDCAN_TxEventFifoCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_FDCAN_UnRegisterTxEventFifoCallback(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_RegisterRxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, pFDCAN_RxFifo0CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_FDCAN_UnRegisterRxFifo0Callback(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_RegisterRxFifo1Callback(FDCAN_HandleTypeDef *hfdcan, pFDCAN_RxFifo1CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_FDCAN_UnRegisterRxFifo1Callback(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_RegisterTxBufferCompleteCallback(FDCAN_HandleTypeDef *hfdcan, pFDCAN_TxBufferCompleteCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_FDCAN_UnRegisterTxBufferCompleteCallback(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_RegisterTxBufferAbortCallback(FDCAN_HandleTypeDef *hfdcan, pFDCAN_TxBufferAbortCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_FDCAN_UnRegisterTxBufferAbortCallback(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_RegisterErrorStatusCallback(FDCAN_HandleTypeDef *hfdcan, pFDCAN_ErrorStatusCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_FDCAN_UnRegisterErrorStatusCallback(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_RegisterTTScheduleSyncCallback(FDCAN_HandleTypeDef *hfdcan, pFDCAN_TT_ScheduleSyncCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_FDCAN_UnRegisterTTScheduleSyncCallback(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_RegisterTTTimeMarkCallback(FDCAN_HandleTypeDef *hfdcan, pFDCAN_TT_TimeMarkCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_FDCAN_UnRegisterTTTimeMarkCallback(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_RegisterTTStopWatchCallback(FDCAN_HandleTypeDef *hfdcan, pFDCAN_TT_StopWatchCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_FDCAN_UnRegisterTTStopWatchCallback(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_RegisterTTGlobalTimeCallback(FDCAN_HandleTypeDef *hfdcan, pFDCAN_TT_GlobalTimeCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_FDCAN_UnRegisterTTGlobalTimeCallback(FDCAN_HandleTypeDef *hfdcan); +#endif /* USE_HAL_FDCAN_REGISTER_CALLBACKS */ + +HAL_StatusTypeDef HAL_FDCAN_ConfigFilter(FDCAN_HandleTypeDef *hfdcan, FDCAN_FilterTypeDef *sFilterConfig); +HAL_StatusTypeDef HAL_FDCAN_NewConfigFilter(FDCAN_HandleTypeDef *hfdcan, FDCAN_NewFilterTypeDef *sFilterConfig); + +HAL_StatusTypeDef HAL_FDCAN_ConfigRxBufOverwriteMode(FDCAN_HandleTypeDef *hfdcan, uint32_t OverwriteMode); +HAL_StatusTypeDef HAL_FDCAN_TransceiverEnterSTBY(FDCAN_HandleTypeDef *hfdcan); + +HAL_StatusTypeDef HAL_FDCAN_EnableTimestamp(FDCAN_HandleTypeDef *hfdcan, uint32_t ts_position); +HAL_StatusTypeDef HAL_FDCAN_DisableTimestamp(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_GetTTS(FDCAN_HandleTypeDef *hfdcan, FDCAN_TTSTypeDef *tts); + +HAL_StatusTypeDef HAL_FDCAN_TT_EnableWatchTrigger(FDCAN_HandleTypeDef *hfdcan, uint32_t cycle_time); +HAL_StatusTypeDef HAL_FDCAN_TT_DisableWatchTrigger(FDCAN_HandleTypeDef *hfdcan); + +uint16_t HAL_FDCAN_GetTimestampCounter(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_ResetTimestampCounter(FDCAN_HandleTypeDef *hfdcan); + +HAL_StatusTypeDef HAL_FDCAN_Start(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_Stop(FDCAN_HandleTypeDef *hfdcan); + +HAL_StatusTypeDef HAL_FDCAN_EnableTxBufferRequest(FDCAN_HandleTypeDef *hfdcan, TransmitType_enum type); +HAL_StatusTypeDef HAL_FDCAN_AbortTxRequest(FDCAN_HandleTypeDef *hfdcan, TransmitAbortType_enum type); + +HAL_StatusTypeDef HAL_FDCAN_GetRxMessage(FDCAN_HandleTypeDef *hfdcan, FDCAN_RxHeaderTypeDef *pRxHeader, uint8_t *pRxData); + + +bool HAL_FDCAN_GetTxReqCompleted(FDCAN_HandleTypeDef *hfdcan, TransmitType_enum type); +HAL_StatusTypeDef HAL_FDCAN_WaitTxCompleted(FDCAN_HandleTypeDef *hfdcan, TransmitType_enum type, uint32_t timeout); +uint32_t HAL_FDCAN_GetBusStatus(FDCAN_HandleTypeDef *hfdcan); + +HAL_StatusTypeDef HAL_FDCAN_ClearEntireSTB(FDCAN_HandleTypeDef *hfdcan); + +void HAL_FDCAN_PTBTranmistSingleShot(FDCAN_HandleTypeDef *hfdcan, FunctionalState state); +void HAL_FDCAN_STBTranmistSingleShot(FDCAN_HandleTypeDef *hfdcan, FunctionalState state); + + +FDCAN_RXBUF_FILL_STATE_enum HAL_FDCAN_GetRxBufFillState(FDCAN_HandleTypeDef *hfdcan); +FDCAN_TXBUF_FILL_STATE_enum HAL_FDCAN_GetTxBufFillState(FDCAN_HandleTypeDef *hfdcan); + +HAL_StatusTypeDef HAL_FDCAN_AddMessageToSTB(FDCAN_HandleTypeDef *hfdcan, FDCAN_TxHeaderTypeDef *pTxHeader, uint8_t *pTxData); +HAL_StatusTypeDef HAL_FDCAN_AddMessageToPTB(FDCAN_HandleTypeDef *hfdcan, FDCAN_TxHeaderTypeDef *pTxHeader, uint8_t *pTxData); + +HAL_StatusTypeDef HAL_FDCAN_EnableSTBPriorityMode(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_DisableSTBPriorityMode(FDCAN_HandleTypeDef *hfdcan); + +HAL_StatusTypeDef HAL_FDCAN_TransmitMessageBySTB(FDCAN_HandleTypeDef *hfdcan, FDCAN_TxHeaderTypeDef *pTxHeader, uint8_t *pTxData); +HAL_StatusTypeDef HAL_FDCAN_TransmitMessageByPTB(FDCAN_HandleTypeDef *hfdcan, FDCAN_TxHeaderTypeDef *pTxHeader, uint8_t *pTxData); + + +HAL_StatusTypeDef HAL_FDCAN_ConfigRxBufWarnningLimit(FDCAN_HandleTypeDef *hfdcan, uint8_t afwl); +uint8_t HAL_FDCAN_GetRxBufWarnningLimit(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_ConfigErrCntWarnningLimit(FDCAN_HandleTypeDef *hfdcan, uint8_t ecnt); +uint8_t HAL_FDCAN_GetErrCntWarnningLimit(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_GetErrorInfo(FDCAN_HandleTypeDef *hfdcan, FDCAN_ErrorInfo_u *errinfo); +void HAL_FDCAN_IRQHandler(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_TxFifoEmptyCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_TxBufferCompleteCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t BufferIndexes); +void HAL_FDCAN_TxBufferAbortCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t BufferIndexes); +void HAL_FDCAN_RxBufferNewMessageCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_RxBufferAFCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_RxBufferFullCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_RxBufferOVCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_TXPTBCompletedCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_TXSTBCompletedCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_TxAbortCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_ErrorCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_BusErrorCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_ErrorPassiveCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_ArbitrationLostCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_TimestampWraparoundCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_TimeoutOccurredCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_ErrorCallback(FDCAN_HandleTypeDef *hfdcan); +void HAL_FDCAN_ErrorStatusCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t ErrorStatusITs); +void HAL_FDCAN_TT_ScheduleSyncCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t TTSchedSyncITs); + + +void HAL_FDCAN_TT_TimeMarkCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t TTTimeMarkITs); +void HAL_FDCAN_TT_TimerTriggerCallback(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_TT_Config(FDCAN_HandleTypeDef *hfdcan, uint32_t TT_Presc); +HAL_StatusTypeDef HAL_FDCAN_TT_ConfigReferenceMessage(FDCAN_HandleTypeDef *hfdcan, uint32_t IdType, uint32_t Identifier, uint32_t Payload); +HAL_StatusTypeDef HAL_FDCAN_TT_ConfigTrigger(FDCAN_HandleTypeDef *hfdcan, FDCAN_TriggerTypeDef *sTriggerConfig); +void HAL_FDCAN_TT_ImmediateTrigger(FDCAN_HandleTypeDef *hfdcan, uint8_t TTPtr); +HAL_StatusTypeDef HAL_FDCAN_TT_SetNextIsGap(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_TT_SetEndOfGap(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_TT_ConfigExternalSyncPhase(FDCAN_HandleTypeDef *hfdcan, uint32_t TargetPhase); +HAL_StatusTypeDef HAL_FDCAN_TT_EnableExternalSynchronization(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_TT_DisableExternalSynchronization(FDCAN_HandleTypeDef *hfdcan); +HAL_StatusTypeDef HAL_FDCAN_TT_AddMessageByTBPtr(FDCAN_HandleTypeDef *hfdcan, FDCAN_TxHeaderTypeDef *pTxHeader, uint8_t *pTxData, uint8_t TBPtr); +HAL_StatusTypeDef HAL_FDCAN_TT_AddMessageByTBPtr_NOTBF(FDCAN_HandleTypeDef *hfdcan, FDCAN_TxHeaderTypeDef *pTxHeader, uint8_t *pTxData, uint8_t TBPtr); + + +/** + * @} + */ + +/** @addtogroup FDCAN_Exported_Functions_Group7 + * @{ + */ +/* Peripheral State functions *************************************************/ +uint32_t HAL_FDCAN_GetError(FDCAN_HandleTypeDef *hfdcan); +HAL_FDCAN_StateTypeDef HAL_FDCAN_GetState(FDCAN_HandleTypeDef *hfdcan); +/** + * @} + */ + + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup FDCAN_Private_Macros FDCAN Private Macros + * @{ + */ +#define STB_SLOTS_NUM (16) +#define IS_FDCAN_STB_SLOTS_INDEX(INDEX) ((INDEX) > 0 && INDEX <= STB_SLOTS_NUM) +#define IS_FDCAN_TT_SLOTS_INDEX(INDEX) ((INDEX) <= STB_SLOTS_NUM) + +#define IS_FDCAN_ALL_INSTANCE(__INSTANCE__) (((__INSTANCE__) == FDCAN1) || \ + ((__INSTANCE__) == FDCAN2) || \ + ((__INSTANCE__) == FDCAN3)) + +#define IS_FDCAN_AFWL(AWFL) ((AWFL) < STB_SLOTS_NUM) + +#define IS_FDCAN_TT_INSTANCE(__INSTANCE__) (((__INSTANCE__) == FDCAN1) || \ + ((__INSTANCE__) == FDCAN2) || \ + ((__INSTANCE__) == FDCAN3)) + +#define IS_FDCAN_FRAME_FORMAT(FORMAT) (((FORMAT) == FDCAN_FRAME_CLASSIC ) || \ + ((FORMAT) == FDCAN_FRAME_FD_NO_BRS) || \ + ((FORMAT) == FDCAN_FRAME_FD_BRS )) + +#define IS_FDCAN_MODE(MODE) (((MODE) == FDCAN_MODE_NORMAL ) || \ + ((MODE) == FDCAN_MODE_RESTRICTED_OPERATION) || \ + ((MODE) == FDCAN_MODE_BUS_MONITORING ) || \ + ((MODE) == FDCAN_MODE_INTERNAL_LOOPBACK ) || \ + ((MODE) == FDCAN_MODE_EXTERNAL_LOOPBACK )) + +#define IS_FDCAN_NOMINAL_PRESCALER(PRESCALER) (((PRESCALER) >= 1U) && ((PRESCALER) <= 512U)) +#define IS_FDCAN_NOMINAL_SJW(SJW) (((SJW) >= 1U) && ((SJW) <= 128U)) +#define IS_FDCAN_NOMINAL_TSEG1(TSEG1) (((TSEG1) >= 1U) && ((TSEG1) <= 256U)) +#define IS_FDCAN_NOMINAL_TSEG2(TSEG2) (((TSEG2) >= 1U) && ((TSEG2) <= 128U)) +#define IS_FDCAN_DATA_PRESCALER(PRESCALER) (((PRESCALER) >= 1U) && ((PRESCALER) <= 32U)) +#define IS_FDCAN_DATA_SJW(SJW) (((SJW) >= 1U) && ((SJW) <= 16U)) +#define IS_FDCAN_DATA_TSEG1(TSEG1) (((TSEG1) >= 1U) && ((TSEG1) <= 32U)) +#define IS_FDCAN_DATA_TSEG2(TSEG2) (((TSEG2) >= 1U) && ((TSEG2) <= 16U)) +#define IS_FDCAN_MAX_VALUE(VALUE, MAX) ((VALUE) <= (MAX)) +#define IS_FDCAN_MIN_VALUE(VALUE, MIN) ((VALUE) >= (MIN)) +#define IS_FDCAN_DATA_SIZE(SIZE) (((SIZE) == FDCAN_DATA_BYTES_8 ) || \ + ((SIZE) == FDCAN_DATA_BYTES_12) || \ + ((SIZE) == FDCAN_DATA_BYTES_16) || \ + ((SIZE) == FDCAN_DATA_BYTES_20) || \ + ((SIZE) == FDCAN_DATA_BYTES_24) || \ + ((SIZE) == FDCAN_DATA_BYTES_32) || \ + ((SIZE) == FDCAN_DATA_BYTES_48) || \ + ((SIZE) == FDCAN_DATA_BYTES_64)) + +#define IS_FDCAN_ID_TYPE(ID_TYPE) (((ID_TYPE) == FDCAN_STANDARD_ID) || \ + ((ID_TYPE) == FDCAN_EXTENDED_ID)) + +#define IS_FILTER_ID_TYPE(ID_TYPE) (((ID_TYPE) == FDCAN_STANDARD_ID) || \ + ((ID_TYPE) == FDCAN_EXTENDED_ID) || \ + ((ID_TYPE) == FDCAN_BOTH_ID)) + +#define IS_VALID_FILTER_INDEX(FILTER_INDEX) ((FILTER_INDEX) < (NR_OF_ACF) ) + +#define IS_FDCAN_RX_BUF_MODE(MODE) (((MODE) == FDCAN_RX_BUF_BLOCKING ) || \ + ((MODE) == FDCAN_RX_BUF_OVERWRITE)) + +#define IS_FDCAN_FRAME_TYPE(TYPE) (((TYPE) == FDCAN_DATA_FRAME ) || \ + ((TYPE) == FDCAN_REMOTE_FRAME)) + +#define IS_FDCAN_TRANSMIT_TYPE(TYPE) (((TYPE) == FDCAN_TRANSMIT_PTB ) || \ + ((TYPE) == FDCAN_TRANSMIT_STB_ONE ) || \ + ((TYPE) == FDCAN_TRANSMIT_STB_ALL)) + +#define IS_FDCAN_ABORT_TYPE(TYPE) (((TYPE) == FDCAN_ABORT_PTB ) || \ + ((TYPE) == FDCAN_ABORT_STB)) + +#define IS_FDCAN_DLC(DLC) (((DLC) == FDCAN_DLC_BYTES_0 ) || \ + ((DLC) == FDCAN_DLC_BYTES_1 ) || \ + ((DLC) == FDCAN_DLC_BYTES_2 ) || \ + ((DLC) == FDCAN_DLC_BYTES_3 ) || \ + ((DLC) == FDCAN_DLC_BYTES_4 ) || \ + ((DLC) == FDCAN_DLC_BYTES_5 ) || \ + ((DLC) == FDCAN_DLC_BYTES_6 ) || \ + ((DLC) == FDCAN_DLC_BYTES_7 ) || \ + ((DLC) == FDCAN_DLC_BYTES_8 ) || \ + ((DLC) == FDCAN_DLC_BYTES_12) || \ + ((DLC) == FDCAN_DLC_BYTES_16) || \ + ((DLC) == FDCAN_DLC_BYTES_20) || \ + ((DLC) == FDCAN_DLC_BYTES_24) || \ + ((DLC) == FDCAN_DLC_BYTES_32) || \ + ((DLC) == FDCAN_DLC_BYTES_48) || \ + ((DLC) == FDCAN_DLC_BYTES_64)) + +#ifdef __cplusplus +} +#endif + + +#endif /* __HAL_FDCAN_H__ */ + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_fmc.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_fmc.h new file mode 100644 index 0000000000..e66b18a05f --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_fmc.h @@ -0,0 +1,755 @@ +/* + ****************************************************************************** + * @file HAL_FMC.h + * @version V1.0.0 + * @date 2022 + * @brief Header file of FMC HAL module. + ****************************************************************************** +*/ +#ifndef __HAL_FMC_H__ +#define __HAL_FMC_H__ + +#include "hal.h" + + +/** + * @brief FMC NORSRAM Timing parameters structure definition + */ +typedef struct +{ + uint32_t AddressSetupTime; /*!< Defines the number of HCLK cycles to configure + the duration of the address setup time. */ + + uint32_t AddressHoldTime; /*!< Defines the number of HCLK cycles to configure + the duration of the address hold time. */ + + uint32_t DataSetupTime; /*!< Defines the number of HCLK cycles to configure + the duration of the data setup time. */ + + uint32_t BusTurnAroundDuration; /*!< Defines the number of HCLK cycles to configure + the duration of the bus turnaround. */ + + uint32_t CLKDivision; /*!< Defines the period of CLK clock output signal, + expressed in number of HCLK cycles. */ + + uint32_t DataLatency; /*!< Defines the number of memory clock cycles to issue + to the memory before getting the first data. */ + + uint32_t AccessMode; /*!< Specifies the asynchronous access mode. */ + +}FMC_NORSRAMTimingInitTypeDef; +/** + * @} + */ + + +/** + * @brief FMC NORSRAM Configuration Structure definition + */ +typedef struct +{ + uint32_t NSBank; /*!< Specifies the NOR/SRAM memory bank that will be used. */ + + uint32_t DataAddressMux; /*!< Specifies whether the address and data values are + multiplexed on the data bus or not. */ + + uint32_t MemoryType; /*!< Specifies the type of external memory attached to + the corresponding memory bank. */ + + uint32_t MemoryDataWidth; /*!< Specifies the external memory device width. */ + + uint32_t BurstAccessMode; /*!< Enables or disables the burst access mode for Flash memory, + valid only with synchronous burst Flash memories. */ + + uint32_t WaitSignalPolarity; /*!< Specifies the wait signal polarity, valid only when accessing + the Flash memory in burst mode. */ + + uint32_t WrapMode; /*!< Enables or disables the Wrapped burst access mode for Flash + memory, valid only when accessing Flash memories in burst mode. */ + + uint32_t WaitSignalActive; /*!< Specifies if the wait signal is asserted by the memory one + clock cycle before the wait state or during the wait state, + valid only when accessing memories in burst mode. */ + + uint32_t WriteOperation; /*!< Enables or disables the write operation in the selected bank by the FMC. */ + + uint32_t WaitSignal; /*!< Enables or disables the wait state insertion via wait + signal, valid for Flash memory access in burst mode. */ + + uint32_t ExtendedMode; /*!< Enables or disables the extended mode. */ + + uint32_t AsynchronousWait; /*!< Enables or disables wait signal during asynchronous transfers, + valid only with asynchronous Flash memories. */ + + uint32_t CRAMPageSize; /*!< Specifies the CRAM page size. */ + + uint32_t WriteMode; /*!< Synchronous or asynchronous write mode. */ + +}FMC_NORSRAMInitTypeDef; +/** + * @} + */ + +/** + * @brief FMC SDRAM Configuration Structure definition + */ +typedef struct +{ + uint32_t SDBank; /*!< Specifies the SDRAM memory device that will be used. */ + + uint32_t ColumnBitsNumber; /*!< Defines the number of bits of column address. */ + + uint32_t RowBitsNumber; /*!< Defines the number of bits of column address. */ + + uint32_t MemoryDataWidth; /*!< Defines the memory device width. */ + + uint32_t InternalBankNumber; /*!< Defines the number of the device's internal banks. */ + + uint32_t CASLatency; /*!< Defines the SDRAM CAS latency in number of memory clock cycles. */ + + uint32_t WriteProtection; /*!< Enables the SDRAM device to be accessed in write mode. */ + + uint32_t SDClockPeriod; /*!< Define the SDRAM Clock Period for both SDRAM devices and they allow + to disable the clock before changing frequency. */ + + uint32_t ReadBurst; /*!< This bit enable the SDRAM controller to anticipate the next read + commands during the CAS latency and stores data in the Read FIFO. */ + + uint32_t ReadPipeDelay; /*!< Define the delay in system clock cycles on read data path. */ + +}FMC_SDRAMInitTypeDef; +/** + * @} + */ + +/** + * @brief FMC SDRAM Timing parameters structure definition + */ +typedef struct +{ + uint32_t LoadToActiveDelay; /*!< Defines the delay between a Load Mode Register command and + an active or Refresh command in number of memory clock cycles. */ + + uint32_t ExitSelfRefreshDelay; /*!< Defines the delay from releasing the self refresh command to + issuing the Activate command in number of memory clock cycles. */ + + uint32_t SelfRefreshTime; /*!< Defines the minimum Self Refresh period in number of memory clock + cycles. */ + + uint32_t RowCycleDelay; /*!< Defines the delay between the Refresh command and the Activate command + and the delay between two consecutive Refresh commands in number of + memory clock cycles. */ + + uint32_t WriteRecoveryTime; /*!< Defines the Write recovery Time in number of memory clock cycles. */ + + uint32_t RPDelay; /*!< Defines the delay between a Precharge Command and an other command + in number of memory clock cycles. */ + + uint32_t RCDDelay; /*!< Defines the delay between the Activate Command and a Read/Write + command in number of memory clock cycles. */ +}FMC_SDRAMTimingInitTypeDef; +/** + * @} + */ + +/** +* @brief SDRAM command parameters structure definition +*/ +typedef struct +{ + uint32_t CommandMode; /*!< Defines the command issued to the SDRAM device. */ + + uint32_t CommandTarget; /*!< Defines which device (1 or 2) the command will be issued to. */ + + uint32_t AutoRefreshNumber; /*!< Defines the number of consecutive auto refresh command issued + in auto refresh mode. */ + uint32_t ModeRegisterDefinition; /*!< Defines the SDRAM Mode register content */ + +}FMC_SDRAMCommandTypeDef; +/** + * @} + */ + +/** @defgroup FMC NOR/SRAM Bank + * @{ + */ +#define FMC_NORSRAM_BANK1 (0x00000000U) +#define FMC_NORSRAM_BANK2 (0x00000002U) +#define FMC_NORSRAM_BANK3 (0x00000004U) +#define FMC_NORSRAM_BANK4 (0x00000006U) +#define IS_FMC_NORSRAM_BANK(BANK) (((BANK) == FMC_NORSRAM_BANK1) || \ + ((BANK) == FMC_NORSRAM_BANK2) || \ + ((BANK) == FMC_NORSRAM_BANK3) || \ + ((BANK) == FMC_NORSRAM_BANK4)) +/** + * @} + */ + + +/** @defgroup FMC Data Address Bus Multiplexing + * @{ + */ +#define FMC_DATA_ADDRESS_MUX_DISABLE (0x00000000U) +#define FMC_DATA_ADDRESS_MUX_ENABLE (0x00000002U) +#define IS_FMC_MUX(MUX) (((MUX) == FMC_DATA_ADDRESS_MUX_DISABLE) || \ + ((MUX) == FMC_DATA_ADDRESS_MUX_ENABLE)) +/** + * @} + */ + +/** @defgroup FMC Memory Type + * @{ + */ +#define FMC_MEMORY_TYPE_SRAM (0x00000000U) +#define FMC_MEMORY_TYPE_PSRAM (0x00000004U) +#define FMC_MEMORY_TYPE_NOR (0x00000008U) +#define IS_FMC_MEMORY(MEMORY) (((MEMORY) == FMC_MEMORY_TYPE_SRAM) || \ + ((MEMORY) == FMC_MEMORY_TYPE_PSRAM)|| \ + ((MEMORY) == FMC_MEMORY_TYPE_NOR)) +/** + * @} + */ + +/** @defgroup FMC NORSRAM Data Width + * @{ + */ +#define FMC_NORSRAM_MEM_BUS_WIDTH_8 (0x00000000U) +#define FMC_NORSRAM_MEM_BUS_WIDTH_16 (0x00000010U) +#define FMC_NORSRAM_MEM_BUS_WIDTH_32 (0x00000020U) +#define IS_FMC_MEMORY_WIDTH(WIDTH) (((WIDTH) == FMC_NORSRAM_MEM_BUS_WIDTH_8) || \ + ((WIDTH) == FMC_NORSRAM_MEM_BUS_WIDTH_16) || \ + ((WIDTH) == FMC_NORSRAM_MEM_BUS_WIDTH_32)) +/** + * @} + */ + +/** @defgroup FMC NOR/SRAM Flash Access + * @{ + */ +#define FMC_NORSRAM_FLASH_ACCESS_DISABLE (0x00000000U) +#define FMC_NORSRAM_FLASH_ACCESS_ENABLE (0x00000040U) +/** + * @} + */ + + +/** @defgroup FMC Burst Access Mode + * @{ + */ +#define FMC_BURST_ACCESS_MODE_DISABLE (0x00000000U) +#define FMC_BURST_ACCESS_MODE_ENABLE (0x00000100U) +#define IS_FMC_BURSTMODE(STATE) (((STATE) == FMC_BURST_ACCESS_MODE_DISABLE) || \ + ((STATE) == FMC_BURST_ACCESS_MODE_ENABLE)) +/** + * @} + */ + +/** @defgroup FMC Wait Signal Polarity + * @{ + */ +#define FMC_WAIT_SIGNAL_POLARITY_LOW (0x00000000U) +#define FMC_WAIT_SIGNAL_POLARITY_HIGH (0x00000200U) +#define IS_FMC_WAIT_POLARITY(POLARITY) (((POLARITY) == FMC_WAIT_SIGNAL_POLARITY_LOW) || \ + ((POLARITY) == FMC_WAIT_SIGNAL_POLARITY_HIGH)) +/** + * @} + */ + +/** @defgroup FMC Wrap Mode + * @{ + */ +#define FMC_WRAP_MODE_DISABLE (0x00000000U) +#define FMC_WRAP_MODE_ENABLE (0x00000400U) +#define IS_FMC_WRAP_MODE(MODE) (((MODE) == FMC_WRAP_MODE_DISABLE) || \ + ((MODE) == FMC_WRAP_MODE_ENABLE)) +/** + * @} + */ + +/** @defgroup FMC Wait Timing + * @{ + */ +#define FMC_WAITSIGNALACTIVE_BEFOREWAITSTATE (0x00000000U) +#define FMC_WAITSIGNALACTIVE_DURINGWAITSTATE (0x00000800U) +#define IS_FMC_WAIT_SIGNAL_ACTIVE(ACTIVE) (((ACTIVE) == FMC_WAITSIGNALACTIVE_BEFOREWAITSTATE) || \ + ((ACTIVE) == FMC_WAITSIGNALACTIVE_DURINGWAITSTATE)) +/** + * @} + */ + +/** @defgroup FMC Write Operation + * @{ + */ +#define FMC_WRITEOPERATION_DISABLE (0x00000000U) +#define FMC_WRITEOPERATION_ENABLE (0x00001000U) +#define IS_FMC_WRITE_OPERATION(OPERATION) (((OPERATION) == FMC_WRITEOPERATION_DISABLE) || \ + ((OPERATION) == FMC_WRITEOPERATION_ENABLE)) +/** + * @} + */ + +/** @defgroup FMC Wait Signal + * @{ + */ +#define FMC_WAIT_SIGNAL_DISABLE (0x00000000U) +#define FMC_WAIT_SIGNAL_ENABLE (0x00002000U) +#define IS_FMC_WAITE_SIGNAL(SIGNAL) (((SIGNAL) == FMC_WAIT_SIGNAL_DISABLE) || \ + ((SIGNAL) == FMC_WAIT_SIGNAL_ENABLE)) +/** + * @} + */ + +/** @defgroup FMC Extended Mode + * @{ + */ +#define FMC_EXTENDED_MODE_DISABLE (0x00000000U) +#define FMC_EXTENDED_MODE_ENABLE (0x00004000U) +#define IS_FMC_EXTENDED_MODE(MODE) (((MODE) == FMC_EXTENDED_MODE_DISABLE) || \ + ((MODE) == FMC_EXTENDED_MODE_ENABLE)) +/** + * @} + */ + +/** @defgroup FMC Asynchronous Wait + * @{ + */ +#define FMC_ASYNCHRONOUS_WAIT_DISABLE (0x00000000U) +#define FMC_ASYNCHRONOUS_WAIT_ENABLE (0x00008000U) +#define IS_FMC_ASYNWAIT(STATE) (((STATE) == FMC_ASYNCHRONOUS_WAIT_DISABLE) || \ + ((STATE) == FMC_ASYNCHRONOUS_WAIT_ENABLE)) +/** + * @} + */ + +/** @defgroup FMC CRAM Page Size + * @{ + */ +#define FMC_CRAMPAGE_SIZE_AUTO (0x00000000U) +#define FMC_CRAMPPAGE_SIZE_128 (0x00010000U) +#define FMC_CRAMPPAGE_SIZE_256 (0x00020000U) +#define FMC_CRAMPPAGE_SIZE_512 (0x00030000U) +#define FMC_CRAMPPAGE_SIZE_1024 (0x00040000U) +#define IS_FMC_CRAMPPAGE_SIZE(SIZE) (((SIZE) == FMC_CRAMPAGE_SIZE_AUTO) || \ + ((SIZE) == FMC_CRAMPPAGE_SIZE_128) || \ + ((SIZE) == FMC_CRAMPPAGE_SIZE_256) || \ + ((SIZE) == FMC_CRAMPPAGE_SIZE_512) || \ + ((SIZE) == FMC_CRAMPPAGE_SIZE_1024)) +/** + * @} + */ + +/** @defgroup FMC Write Mode + * @{ + */ +#define FMC_WRITE_ASY_MODE (0x00000000U) +#define FMC_WRITE_SY_MODE (0x00080000U) +#define IS_FMC_WRITE_MODE(MODE) (((MODE) == FMC_WRITE_ASY_MODE) || \ + ((MODE) == FMC_WRITE_SY_MODE)) +/** + * @} + */ + +/** @defgroup FMC Address Setup Time + * @{ + */ +#define IS_FMC_ADDRESS_SETUP_TIME(TIME) ((TIME) <= 0xF) +/** + * @} + */ + +/** @defgroup FMC Address Hold Time + * @{ + */ +#define IS_FMC_ADDRESS_HOLD_TIME(TIME) ((TIME) <= 0xF) +/** + * @} + */ + +/** @defgroup FMC Data Setup Time + * @{ + */ +#define IS_FMC_DATASETUP_TIME(TIME) ((TIME) <= 0xFF) +/** + * @} + */ + +/** @defgroup FMC Bus Turn around Duration + * @{ + */ +#define IS_FMC_TURNAROUND_TIME(TIME) ((TIME) <= 0xF) +/** + * @} + */ + +/** @defgroup FMC CLK Division + * @{ + */ +#define IS_FMC_CLK_DIV(DIV) ((DIV) <= 0xF) +/** + * @} + */ + +/** @defgroup FMC Data Latency + * @{ + */ +#define IS_FMC_DATA_LATENCY(LATENCY) ((LATENCY) <= 0xF) +/** + * @} + */ + +/** @defgroup FMC_Access_Mode FMC Access Mode +* @{ +*/ +#define FMC_ACCESS_MODE_A (0x00000000U) +#define FMC_ACCESS_MODE_B (0x10000000U) +#define FMC_ACCESS_MODE_C (0x20000000U) +#define FMC_ACCESS_MODE_D (0x30000000U) +#define IS_FMC_ACCESS_MODE(MODE) (((MODE) == FMC_ACCESS_MODE_A) || \ + ((MODE) == FMC_ACCESS_MODE_B) || \ + ((MODE) == FMC_ACCESS_MODE_C) || \ + ((MODE) == FMC_ACCESS_MODE_D)) +/** +* @} +*/ + + + +/** @defgroup FMC SDRAM Bank + * @{ + */ +#define FMC_SDRAM_BANK1 ((uint32_t)0x00000000U) +#define FMC_SDRAM_BANK2 ((uint32_t)0x00000001U) +#define IS_FMC_SDRAM_BANK(BANK) (((BANK) == FMC_SDRAM_BANK1) || \ + ((BANK) == FMC_SDRAM_BANK2)) +/** + * @} + */ + + /** @defgroup FMC SDRAM Column Bits number + * @{ + */ +#define FMC_SDRAM_COLUMN_BITS_NUM_8 ((uint32_t)0x00000000U) +#define FMC_SDRAM_COLUMN_BITS_NUM_9 ((uint32_t)0x00000001U) +#define FMC_SDRAM_COLUMN_BITS_NUM_10 ((uint32_t)0x00000002U) +#define FMC_SDRAM_COLUMN_BITS_NUM_11 ((uint32_t)0x00000003U) +#define IS_FMC_COLUMNBITS_NUMBER(COLUMN) (((COLUMN) == FMC_SDRAM_COLUMN_BITS_NUM_8) || \ + ((COLUMN) == FMC_SDRAM_COLUMN_BITS_NUM_9) || \ + ((COLUMN) == FMC_SDRAM_COLUMN_BITS_NUM_10) || \ + ((COLUMN) == FMC_SDRAM_COLUMN_BITS_NUM_11)) +/** + * @} + */ + +/** @defgroup FMC SDRAM Row Bits number + * @{ + */ +#define FMC_SDRAM_ROW_BITS_NUM_11 ((uint32_t)0x00000000U) +#define FMC_SDRAM_ROW_BITS_NUM_12 ((uint32_t)0x00000004U) +#define FMC_SDRAM_ROW_BITS_NUM_13 ((uint32_t)0x00000008U) +#define IS_FMC_ROWBITS_NUMBER(ROW) (((ROW) == FMC_SDRAM_ROW_BITS_NUM_11) || \ + ((ROW) == FMC_SDRAM_ROW_BITS_NUM_12) || \ + ((ROW) == FMC_SDRAM_ROW_BITS_NUM_13)) +/** + * @} + */ + +/** @defgroup FMC SDRAM Memory Bus Width + * @{ + */ +#define FMC_SDRAM_MEM_BUS_WIDTH_8 ((uint32_t)0x00000000U) +#define FMC_SDRAM_MEM_BUS_WIDTH_16 ((uint32_t)0x00000010U) +#define FMC_SDRAM_MEM_BUS_WIDTH_32 ((uint32_t)0x00000020U) +#define IS_FMC_SDMEMORY_WIDTH(WIDTH) (((WIDTH) == FMC_SDRAM_MEM_BUS_WIDTH_8) || \ + ((WIDTH) == FMC_SDRAM_MEM_BUS_WIDTH_16) || \ + ((WIDTH) == FMC_SDRAM_MEM_BUS_WIDTH_32)) +/** + * @} + */ + +/** @defgroup FMC SDRAM Internal Banks Number + * @{ + */ +#define FMC_SDRAM_INTERN_BANKS_NUM_2 ((uint32_t)0x00000000U) +#define FMC_SDRAM_INTERN_BANKS_NUM_4 ((uint32_t)0x00000040U) +#define IS_FMC_INTERNALBANK_NUMBER(NUMBER) (((NUMBER) == FMC_SDRAM_INTERN_BANKS_NUM_2) || \ + ((NUMBER) == FMC_SDRAM_INTERN_BANKS_NUM_4)) +/** + * @} + */ + +/** @defgroup FMC SDRAM CAS Latency + * @{ + */ +#define FMC_SDRAM_CAS_LATENCY_1 ((uint32_t)0x00000080U) +#define FMC_SDRAM_CAS_LATENCY_2 ((uint32_t)0x00000100U) +#define FMC_SDRAM_CAS_LATENCY_3 ((uint32_t)0x00000180U) +#define IS_FMC_CAS_LATENCY(LATENCY) (((LATENCY) == FMC_SDRAM_CAS_LATENCY_1) || \ + ((LATENCY) == FMC_SDRAM_CAS_LATENCY_2) || \ + ((LATENCY) == FMC_SDRAM_CAS_LATENCY_3)) +/** + * @} + */ + +/** @defgroup FMC SDRAM Write Protection + * @{ + */ +#define FMC_SDRAM_WRITE_PROTECTION_DISABLE ((uint32_t)0x00000000U) +#define FMC_SDRAM_WRITE_PROTECTION_ENABLE ((uint32_t)0x00000200U) +#define IS_FMC_WRITE_PROTECTION(__WRITE__) (((__WRITE__) == FMC_SDRAM_WRITE_PROTECTION_DISABLE) || \ + ((__WRITE__) == FMC_SDRAM_WRITE_PROTECTION_ENABLE)) +/** + * @} + */ + +/** @defgroup FMC SDRAM Clock Period + * @{ + */ +#define FMC_SDRAM_CLOCK_DISABLE ((uint32_t)0x00000000U) +#define FMC_SDRAM_CLOCK_PERIOD_2 ((uint32_t)0x00000800U) +#define FMC_SDRAM_CLOCK_PERIOD_3 ((uint32_t)0x00000C00U) +#define FMC_SDRAM_CLOCK_PERIOD_4 ((uint32_t)0x00000400U) +#define IS_FMC_SDCLOCK_PERIOD(__PERIOD__) (((__PERIOD__) == FMC_SDRAM_CLOCK_DISABLE) || \ + ((__PERIOD__) == FMC_SDRAM_CLOCK_PERIOD_2) || \ + ((__PERIOD__) == FMC_SDRAM_CLOCK_PERIOD_3) || \ + ((__PERIOD__) == FMC_SDRAM_CLOCK_PERIOD_4)) +/** + * @} + */ + +/** @defgroup FMC SDRAM Read Burst + * @{ + */ +#define FMC_SDRAM_RBURST_DISABLE ((uint32_t)0x00000000U) +#define FMC_SDRAM_RBURST_ENABLE ((uint32_t)0x00001000U) +#define IS_FMC_READ_BURST(__RBURST__) (((__RBURST__) == FMC_SDRAM_RBURST_DISABLE) || \ + ((__RBURST__) == FMC_SDRAM_RBURST_ENABLE)) +/** + * @} + */ + +/** @defgroup FMC SDRAM Read Pipe Delay + * @{ + */ +#define FMC_SDRAM_RPIPE_DELAY_0 ((uint32_t)0x00000000U) +#define FMC_SDRAM_RPIPE_DELAY_1 ((uint32_t)0x00002000U) +#define FMC_SDRAM_RPIPE_DELAY_2 ((uint32_t)0x00004000U) +#define IS_FMC_READPIPE_DELAY(__DELAY__) (((__DELAY__) == FMC_SDRAM_RPIPE_DELAY_0) || \ + ((__DELAY__) == FMC_SDRAM_RPIPE_DELAY_1) || \ + ((__DELAY__) == FMC_SDRAM_RPIPE_DELAY_2)) +/** + * @} + */ + +/** @defgroup FMC SDRAM write to read delay + * @{ + */ +#define FMC_SDRAM_W2R_DELAY_0 ((uint32_t)0x00000000U) +#define FMC_SDRAM_W2R_DELAY_HALF_SDCLK ((uint32_t)0x00008000U) +#define IS_FMC_W2R_DELAY(__DELAY__) (((__DELAY__) == FMC_SDRAM_W2R_DELAY_0) || \ + ((__DELAY__) == FMC_SDRAM_W2R_DELAY_HALF_SDCLK)) +/** + * @} + */ + +/** @defgroup FMC SDRAM burst read fifo length + * @{ + */ +#define FMC_SDRAM_BURST_READ_FIFO_LEN_0 ((uint32_t)0x00000000U) +#define FMC_SDRAM_BURST_READ_FIFO_LEN_1 ((uint32_t)0x00010000U) +#define FMC_SDRAM_BURST_READ_FIFO_LEN_2 ((uint32_t)0x00020000U) +#define FMC_SDRAM_BURST_READ_FIFO_LEN_3 ((uint32_t)0x00030000U) +#define FMC_SDRAM_BURST_READ_FIFO_LEN_4 ((uint32_t)0x00040000U) +#define FMC_SDRAM_BURST_READ_FIFO_LEN_5 ((uint32_t)0x00050000U) +#define FMC_SDRAM_BURST_READ_FIFO_LEN_6 ((uint32_t)0x00060000U) +#define FMC_SDRAM_BURST_READ_FIFO_LEN_7 ((uint32_t)0x00070000U) +#define IS_FMC_BURST_READ_FIFO_LEN(__LEN__) (((__LEN__) == FMC_SDRAM_BURST_READ_FIFO_LEN_0) || \ + ((__LEN__) == FMC_SDRAM_BURST_READ_FIFO_LEN_1) || \ + ((__LEN__) == FMC_SDRAM_BURST_READ_FIFO_LEN_2) || \ + ((__LEN__) == FMC_SDRAM_BURST_READ_FIFO_LEN_3) || \ + ((__LEN__) == FMC_SDRAM_BURST_READ_FIFO_LEN_4) || \ + ((__LEN__) == FMC_SDRAM_BURST_READ_FIFO_LEN_5) || \ + ((__LEN__) == FMC_SDRAM_BURST_READ_FIFO_LEN_6) || \ + ((__LEN__) == FMC_SDRAM_BURST_READ_FIFO_LEN_7)) +/** + * @} + */ + + +/** @defgroup FMC SDRAM Command Mode + * @{ + */ +#define FMC_SDRAM_CMD_NORMAL_MODE ((uint32_t)0x00000000U) +#define FMC_SDRAM_CMD_CLK_ENABLE ((uint32_t)0x00000001U) +#define FMC_SDRAM_CMD_PALL ((uint32_t)0x00000002U) +#define FMC_SDRAM_CMD_AUTOREFRESH_MODE ((uint32_t)0x00000003U) +#define FMC_SDRAM_CMD_LOAD_MODE ((uint32_t)0x00000004U) +#define FMC_SDRAM_CMD_SELFREFRESH_MODE ((uint32_t)0x00000005U) +#define FMC_SDRAM_CMD_POWERDOWN_MODE ((uint32_t)0x00000006U) +#define IS_FMC_COMMAND_MODE(__COMMAND__) (((__COMMAND__) == FMC_SDRAM_CMD_NORMAL_MODE) || \ + ((__COMMAND__) == FMC_SDRAM_CMD_CLK_ENABLE) || \ + ((__COMMAND__) == FMC_SDRAM_CMD_PALL) || \ + ((__COMMAND__) == FMC_SDRAM_CMD_AUTOREFRESH_MODE) || \ + ((__COMMAND__) == FMC_SDRAM_CMD_LOAD_MODE) || \ + ((__COMMAND__) == FMC_SDRAM_CMD_SELFREFRESH_MODE) || \ + ((__COMMAND__) == FMC_SDRAM_CMD_POWERDOWN_MODE)) +/** + * @} + */ + +/** + * @brief FMC SDRAM Load Mode Register + */ +#define FMC_SDRAM_LOAD_MODE_BURST_LENGTH_1 ((uint16_t)0x0000) +#define FMC_SDRAM_LOAD_MODE_BURST_LENGTH_2 ((uint16_t)0x0001) +#define FMC_SDRAM_LOAD_MODE_BURST_LENGTH_4 ((uint16_t)0x0002) +#define FMC_SDRAM_LOAD_MODE_BURST_LENGTH_8 ((uint16_t)0x0004) +#define FMC_SDRAM_LOAD_MODE_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000) +#define FMC_SDRAM_LOAD_MODE_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008) +#define FMC_SDRAM_LOAD_MODE_CAS_LATENCY_2 ((uint16_t)0x0020) +#define FMC_SDRAM_LOAD_MODE_CAS_LATENCY_3 ((uint16_t)0x0030) +#define FMC_SDRAM_LOAD_MODE_OPERATING_MODE_STANDARD ((uint16_t)0x0000) +#define FMC_SDRAM_LOAD_MODE_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000) +#define FMC_SDRAM_LOAD_MODE_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200) +/** + * @} + */ + +/** @defgroup FMC SDRAM Command Target + * @{ + */ +#define FMC_SDRAM_CMD_TARGET_BANK2 FMC_SDRCMD_CTD2 +#define FMC_SDRAM_CMD_TARGET_BANK1 FMC_SDRCMD_CTD1 +#define FMC_SDRAM_CMD_TARGET_BANK1_2 ((uint32_t)0x00000018U) +#define IS_FMC_COMMAND_TARGET(__TARGET__) (((__TARGET__) == FMC_SDRAM_CMD_TARGET_BANK1) || \ + ((__TARGET__) == FMC_SDRAM_CMD_TARGET_BANK2) || \ + ((__TARGET__) == FMC_SDRAM_CMD_TARGET_BANK1_2)) +/** + * @} + */ + +/** @defgroup FMC SDRAM Mode Status + * @{ + */ +#define FMC_SDRAM_NORMAL_MODE ((uint32_t)0x00000000U) +#define FMC_SDRAM_SELF_REFRESH_MODE ((uint32_t)0x00000001U) +#define FMC_SDRAM_POWER_DOWN_MODE ((uint32_t)0x00000002U) + + +/** @defgroup FMC SDRAM LoadToActive Delay + * @{ + */ +#define IS_FMC_LOADTOACTIVE_DELAY(__DELAY__) (((__DELAY__) > 0) && ((__DELAY__) <= 16)) +/** + * @} + */ + +/** @defgroup FMC SDRAM ExitSelfRefresh Delay + * @{ + */ +#define IS_FMC_EXITSELFREFRESH_DELAY(__DELAY__) (((__DELAY__) > 0) && ((__DELAY__) <= 16)) +/** + * @} + */ + +/** @defgroup FMC SDRAM SelfRefresh Time + * @{ + */ +#define IS_FMC_SELFREFRESH_TIME(__TIME__) (((__TIME__) > 0) && ((__TIME__) <= 16)) +/** + * @} + */ + +/** @defgroup FMC SDRAM RowCycle Delay + * @{ + */ +#define IS_FMC_ROWCYCLE_DELAY(__DELAY__) (((__DELAY__) > 0) && ((__DELAY__) <= 16)) +/** + * @} + */ + +/** @defgroup FMC SDRAM Write Recovery Time + * @{ + */ +#define IS_FMC_WRITE_RECOVERY_TIME(__TIME__) (((__TIME__) > 0) && ((__TIME__) <= 16)) +/** + * @} + */ + +/** @defgroup FMC SDRAM RP Delay + * @{ + */ +#define IS_FMC_RP_DELAY(__DELAY__) (((__DELAY__) > 0) && ((__DELAY__) <= 16)) +/** + * @} + */ + +/** @defgroup FMC SDRAM RCD Delay + * @{ + */ +#define IS_FMC_RCD_DELAY(__DELAY__) (((__DELAY__) > 0) && ((__DELAY__) <= 16)) +/** + * @} + */ + +/** @defgroup FMC SDRAM AutoRefresh Number + * @{ + */ +#define IS_FMC_AUTOREFRESH_NUMBER(__NUMBER__) (((__NUMBER__) > 0) && ((__NUMBER__) <= 16)) +/** + * @} + */ + +/** @defgroup FMC SDRAM ModeRegister Definition + * @{ + */ +#define IS_FMC_MODE_REGISTER(__CONTENT__) ((__CONTENT__) <= 8191) +/** + * @} + */ + +/** @defgroup FMC SDRAM Refresh rate + * @{ + */ +#define IS_FMC_REFRESH_RATE(__RATE__) ((__RATE__) <= 8191) +/** + * @} + */ + + + + +HAL_StatusTypeDef HAL_FMC_NORSRAM_Init(FMC_NORSRAMInitTypeDef *hFMC); + +HAL_StatusTypeDef HAL_FMC_NORSRAM_DeInit(FMC_NORSRAMInitTypeDef *hFMC); + +HAL_StatusTypeDef HAL_FMC_NORSRAM_Timing_Init(FMC_NORSRAMTimingInitTypeDef *Timing, uint32_t Bank); + +HAL_StatusTypeDef HAL_FMC_NORSRAM_Extended_Timing_Init(FMC_NORSRAMTimingInitTypeDef *Timing, uint32_t Bank, uint32_t ExtendedMode); + +HAL_StatusTypeDef HAL_FMC_SDRAM_Init(FMC_SDRAMInitTypeDef *Init); + +HAL_StatusTypeDef HAL_FMC_SDRAM_Timing_Init(FMC_SDRAMTimingInitTypeDef *Timing, uint32_t Bank); + +HAL_StatusTypeDef HAL_FMC_SDRAM_DeInit(uint32_t Bank); + +HAL_StatusTypeDef HAL_FMC_SDRAM_SendCommand(FMC_SDRAMCommandTypeDef *Command, uint32_t Timeout); + +HAL_StatusTypeDef HAL_FMC_SDRAM_ProgramRefreshRate(uint32_t RefreshRate); + +HAL_StatusTypeDef HAL_FMC_SDRAM_SetAutoRefreshNumber(uint32_t AutoRefreshNumber); + +uint32_t HAL_FMC_SDRAM_GetBankModeStatus(uint32_t Bank); + +uint32_t HAL_FMC_SDRAM_GetStatus(void); + +void HAL_FMC_SDRAM_ITConfig(FunctionalState NewState); + +FlagStatus HAL_FMC_SDRAM_GetITStatus(void); + +void HAL_FMC_SDRAM_ClearITPendingBit(void); + +void HAL_FMC_SDRAM_BurstReadFifoLength(uint32_t FifoLen, uint32_t Bank); + +void HAL_FMC_SDRAM_W2RDelay(uint32_t W2RDelay, uint32_t Bank); + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_gpio.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_gpio.h new file mode 100644 index 0000000000..08f759b7a6 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_gpio.h @@ -0,0 +1,289 @@ +/****************************************************************************** +*@file : hal_gpio.h +*@brief : Header file of GPIO HAL module. +******************************************************************************/ + +#ifndef __HAL_GPIO_H__ +#define __HAL_GPIO_H__ + +#include "hal.h" + + +/** + * @brief GPIO Init structure definition + */ + +typedef struct +{ + uint32_t Pin; /*!< Specifies the GPIO pins to be configured. + This parameter can be any value of @ref GPIO_pins */ + + uint32_t Mode; /*!< Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIO_mode */ + + uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. + This parameter can be a value of @ref GPIO_pull */ + + uint32_t Drive; /*!< Specifies the Output drive capability for the selected pins. + This parameter can be a value of @ref GPIO_drive */ + + uint32_t Alternate; /*!< Peripheral to be connected to the selected pins + This parameter can be a value of @ref GPIOEx_function_selection */ +} GPIO_InitTypeDef; + +/** + * @} + */ + + +/** @defgroup GPIO_PORT Index + * @{ + */ +typedef enum +{ + GPIO_PORTA, + GPIO_PORTB, + GPIO_PORTC, + GPIO_PORTD, + GPIO_PORTE, + GPIO_PORTF, + GPIO_PORTG, + GPIO_PORTH, + GPIO_PORTI, + GPIO_PORTJ, + GPIO_PORTK, + GPIO_PORTL, + GPIO_PORTM, + GPIO_PORTN, + GPIO_PORTO, + GPIO_PORTP, + GPIO_PORTQ, +}enum_GPIOx_t; +/** + * @} + */ + + +typedef enum +{ + GPIO_PIN_RESET = 0, + GPIO_PIN_SET +}GPIO_PinState; + + +/** @defgroup GPIO_pins GPIO pins + * @{ + */ + +#define GPIO_PIN_0 ( (uint16_t)0x0001 ) /* Pin 0 selected */ +#define GPIO_PIN_1 ( (uint16_t)0x0002 ) /* Pin 1 selected */ +#define GPIO_PIN_2 ( (uint16_t)0x0004 ) /* Pin 2 selected */ +#define GPIO_PIN_3 ( (uint16_t)0x0008 ) /* Pin 3 selected */ +#define GPIO_PIN_4 ( (uint16_t)0x0010 ) /* Pin 4 selected */ +#define GPIO_PIN_5 ( (uint16_t)0x0020 ) /* Pin 5 selected */ +#define GPIO_PIN_6 ( (uint16_t)0x0040 ) /* Pin 6 selected */ +#define GPIO_PIN_7 ( (uint16_t)0x0080 ) /* Pin 7 selected */ +#define GPIO_PIN_8 ( (uint16_t)0x0100 ) /* Pin 8 selected */ +#define GPIO_PIN_9 ( (uint16_t)0x0200 ) /* Pin 9 selected */ +#define GPIO_PIN_10 ( (uint16_t)0x0400 ) /* Pin 10 selected */ +#define GPIO_PIN_11 ( (uint16_t)0x0800 ) /* Pin 11 selected */ +#define GPIO_PIN_12 ( (uint16_t)0x1000 ) /* Pin 12 selected */ +#define GPIO_PIN_13 ( (uint16_t)0x2000 ) /* Pin 13 selected */ +#define GPIO_PIN_14 ( (uint16_t)0x4000 ) /* Pin 14 selected */ +#define GPIO_PIN_15 ( (uint16_t)0x8000 ) /* Pin 15 selected */ + +/** + * @} + */ + +/** @brief PIN mask for assert test + */ + +#define GPIO_ALL_PIN_MASK ( 0x0000FFFFU ) /* PIN mask for assert test */ + +/** @defgroup GPIO_mode + * @{ + */ +#define GPIO_MODE_INPUT ( 0x00000000U ) /*!< Input Floating Mode */ +#define GPIO_MODE_OUTPUT_PP ( 0x00000001U ) /*!< Output Push Pull Mode */ +#define GPIO_MODE_OUTPUT_OD ( 0x00000011U ) /*!< Output Open Drain Mode */ +#define GPIO_MODE_AF_PP ( 0x00000002U ) /*!< Alternate Function Push Pull Mode */ +#define GPIO_MODE_AF_OD ( 0x00000012U ) /*!< Alternate Function Open Drain Mode */ +#define GPIO_MODE_ANALOG_SWITCH_OFF ( 0x00000003U ) /*!< Analog Mode */ +#define GPIO_MODE_ANALOG_SWITCH_ON ( 0x00000013U ) /*!< Analog Mode */ +#define GPIO_MODE_IT_RISING ( 0x10110000U ) /*!< External Interrupt Mode with Rising edge trigger detection */ +#define GPIO_MODE_IT_FALLING ( 0x10210000U ) /*!< External Interrupt Mode with Falling edge trigger detection */ +#define GPIO_MODE_IT_RISING_FALLING ( 0x10310000U ) /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ +#define GPIO_MODE_EVT_RISING ( 0x10120000U ) /*!< External Event Mode with Rising edge trigger detection */ +#define GPIO_MODE_EVT_FALLING ( 0x10220000U ) /*!< External Event Mode with Falling edge trigger detection */ +#define GPIO_MODE_EVT_RISING_FALLING ( 0x10320000U ) /*!< External Event Mode with Rising/Falling edge trigger detection */ + +#define GPIO_MODE_GPIO_MASK ( 0x00000003u ) /*!< GPIO interrupt Mask */ +#define GPIO_MODE_GPIO_OUTPUT_TYPE_MASK ( 0x00000010u ) /*!< GPIO interrupt Mask */ +#define GPIO_MODE_EXTI_MASK ( 0x10000000u ) /*!< GPIO interrupt Mask */ + +/** + * @} + */ + +/** @defgroup GPIO_drive + * @brief GPIO Output drive capability + * @{ + */ +#define GPIO_DRIVE_LEVEL0 ( 0x00000000U ) /*!< Output drive capability up to 2mA, please refer to the product datasheet */ +#define GPIO_DRIVE_LEVEL1 ( 0x00000001U ) /*!< Output drive capability up to 4mA, please refer to the product datasheet */ +#define GPIO_DRIVE_LEVEL2 ( 0x00000002U ) /*!< Output drive capability up to 6mA, please refer to the product datasheet */ +#define GPIO_DRIVE_LEVEL3 ( 0x00000003U ) /*!< Output drive capability up to 8mA, please refer to the product datasheet */ +#define GPIO_DRIVE_LEVEL4 ( 0x00000004U ) /*!< Output drive capability up to 8mA, please refer to the product datasheet */ +#define GPIO_DRIVE_LEVEL5 ( 0x00000005U ) /*!< Output drive capability up to 8mA, please refer to the product datasheet */ +#define GPIO_DRIVE_LEVEL6 ( 0x00000006U ) /*!< Output drive capability up to 8mA, please refer to the product datasheet */ +#define GPIO_DRIVE_LEVEL7 ( 0x00000007U ) /*!< Output drive capability up to 8mA, please refer to the product datasheet */ + +/** + * @} + */ + +/** @defgroup GPIO_pull + * @brief GPIO Pull-Up or Pull-Down Activation + * @{ + */ +#define GPIO_NOPULL ( 0x00000000U ) /*!< No Pull-up or Pull-down activation */ +#define GPIO_PULLUP ( 0x00000001U ) /*!< Pull-up activation */ +#define GPIO_PULLDOWN ( 0x00000002U ) /*!< Pull-down activation */ + +/** + * @} + */ + + +/** @defgroup GPIOEx_function_selection + * @{ + */ +#define GPIO_FUNCTION_0 ( 0x00000000U ) +#define GPIO_FUNCTION_1 ( 0x00000001U ) +#define GPIO_FUNCTION_2 ( 0x00000002U ) +#define GPIO_FUNCTION_3 ( 0x00000003U ) +#define GPIO_FUNCTION_4 ( 0x00000004U ) +#define GPIO_FUNCTION_5 ( 0x00000005U ) +#define GPIO_FUNCTION_6 ( 0x00000006U ) +#define GPIO_FUNCTION_7 ( 0x00000007U ) +#define GPIO_FUNCTION_8 ( 0x00000008U ) +#define GPIO_FUNCTION_9 ( 0x00000009U ) +#define GPIO_FUNCTION_10 ( 0x0000000AU ) +#define GPIO_FUNCTION_11 ( 0x0000000BU ) +#define GPIO_FUNCTION_12 ( 0x0000000CU ) +#define GPIO_FUNCTION_13 ( 0x0000000DU ) +#define GPIO_FUNCTION_14 ( 0x0000000EU ) +#define GPIO_FUNCTION_15 ( 0x0000000FU ) + +/** + * @} + */ + +/** @defgroup GPIO Private Macros + * @{ + */ + +#define IS_GPIO_ALL_INSTANCE(__INSTANCE__) (((__INSTANCE__) == GPIOA) || ((__INSTANCE__) == GPIOB) || \ + ((__INSTANCE__) == GPIOC) || ((__INSTANCE__) == GPIOD) || \ + ((__INSTANCE__) == GPIOE) || ((__INSTANCE__) == GPIOF) || \ + ((__INSTANCE__) == GPIOG) || ((__INSTANCE__) == GPIOH) || \ + ((__INSTANCE__) == GPIOI) || ((__INSTANCE__) == GPIOJ) || \ + ((__INSTANCE__) == GPIOK) || ((__INSTANCE__) == GPIOL) || \ + ((__INSTANCE__) == GPIOM) || ((__INSTANCE__) == GPION) || \ + ((__INSTANCE__) == GPIOO) || ((__INSTANCE__) == GPIOP) || \ + ((__INSTANCE__) == GPIOQ)) + +#define IS_GPIO_ALL_PIN(__PIN__) ((((uint32_t)(__PIN__) & GPIO_ALL_PIN_MASK) != 0) && \ + (((uint32_t)(__PIN__) & ~GPIO_ALL_PIN_MASK) == 0)) + +#define IS_GPIO_SINGLE_PIN(__PIN__) (((__PIN__) == GPIO_PIN_0) ||\ + ((__PIN__) == GPIO_PIN_1) ||\ + ((__PIN__) == GPIO_PIN_2) ||\ + ((__PIN__) == GPIO_PIN_3) ||\ + ((__PIN__) == GPIO_PIN_4) ||\ + ((__PIN__) == GPIO_PIN_5) ||\ + ((__PIN__) == GPIO_PIN_6) ||\ + ((__PIN__) == GPIO_PIN_7) ||\ + ((__PIN__) == GPIO_PIN_8) ||\ + ((__PIN__) == GPIO_PIN_9) ||\ + ((__PIN__) == GPIO_PIN_10) ||\ + ((__PIN__) == GPIO_PIN_11) ||\ + ((__PIN__) == GPIO_PIN_12) ||\ + ((__PIN__) == GPIO_PIN_13) ||\ + ((__PIN__) == GPIO_PIN_14) ||\ + ((__PIN__) == GPIO_PIN_15)) + +#define IS_GPIO_MODE(__GPIO__, __MODE__) (((__MODE__) == GPIO_MODE_INPUT) ||\ + ((__MODE__) == GPIO_MODE_OUTPUT_PP) ||\ + ((__MODE__) == GPIO_MODE_OUTPUT_OD) ||\ + ((__MODE__) == GPIO_MODE_AF_PP) ||\ + ((__MODE__) == GPIO_MODE_AF_OD) ||\ + ((__MODE__) == GPIO_MODE_IT_RISING) ||\ + ((__MODE__) == GPIO_MODE_IT_FALLING) ||\ + ((__MODE__) == GPIO_MODE_IT_RISING_FALLING) ||\ + ((__MODE__) == GPIO_MODE_EVT_RISING) ||\ + ((__MODE__) == GPIO_MODE_EVT_FALLING) ||\ + ((__MODE__) == GPIO_MODE_EVT_RISING_FALLING) ||\ + ((__MODE__) == GPIO_MODE_ANALOG_SWITCH_OFF) ||\ + ((__MODE__) == GPIO_MODE_ANALOG_SWITCH_ON)) + + +#define IS_GPIO_PULL(__PULL__) (((__PULL__) == GPIO_NOPULL) ||\ + ((__PULL__) == GPIO_PULLUP) ||\ + ((__PULL__) == GPIO_PULLDOWN)) + +#define IS_GPIO_DRIVE(__DRIVE__) (((__DRIVE__) == GPIO_DRIVE_LEVEL0) ||\ + ((__DRIVE__) == GPIO_DRIVE_LEVEL1) ||\ + ((__DRIVE__) == GPIO_DRIVE_LEVEL2) ||\ + ((__DRIVE__) == GPIO_DRIVE_LEVEL3) ||\ + ((__DRIVE__) == GPIO_DRIVE_LEVEL4) ||\ + ((__DRIVE__) == GPIO_DRIVE_LEVEL5) ||\ + ((__DRIVE__) == GPIO_DRIVE_LEVEL6) ||\ + ((__DRIVE__) == GPIO_DRIVE_LEVEL7)) + +#define IS_GPIO_PIN_ACTION(__ACTION__) (((__ACTION__) == GPIO_PIN_RESET) || \ + ((__ACTION__) == GPIO_PIN_SET)) + +#define IS_GPIO_FUNCTION(__FUNCTION__) (((__FUNCTION__) == GPIO_FUNCTION_0) ||\ + ((__FUNCTION__) == GPIO_FUNCTION_1) ||\ + ((__FUNCTION__) == GPIO_FUNCTION_2) ||\ + ((__FUNCTION__) == GPIO_FUNCTION_3) ||\ + ((__FUNCTION__) == GPIO_FUNCTION_4) ||\ + ((__FUNCTION__) == GPIO_FUNCTION_5) ||\ + ((__FUNCTION__) == GPIO_FUNCTION_6) ||\ + ((__FUNCTION__) == GPIO_FUNCTION_7) ||\ + ((__FUNCTION__) == GPIO_FUNCTION_8) ||\ + ((__FUNCTION__) == GPIO_FUNCTION_9) ||\ + ((__FUNCTION__) == GPIO_FUNCTION_10)||\ + ((__FUNCTION__) == GPIO_FUNCTION_11)||\ + ((__FUNCTION__) == GPIO_FUNCTION_12)||\ + ((__FUNCTION__) == GPIO_FUNCTION_13)||\ + ((__FUNCTION__) == GPIO_FUNCTION_14)||\ + ((__FUNCTION__) == GPIO_FUNCTION_15)) + +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ + +/* HAL_GPIO_Init */ +void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); + +/* HAL_GPIO_DeInit */ +void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); + +/* HAL_GPIO_WritePin */ +void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin, GPIO_PinState PinState); + +/* HAL_GPIO_ReadPin */ +GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); + +/* HAL_GPIO_TogglePin */ +void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); + +HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_hrng.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_hrng.h new file mode 100644 index 0000000000..9af91144a1 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_hrng.h @@ -0,0 +1,54 @@ +/****************************************************************************** +*@file : hal_hrng.h +*@brief : HRNG module driver header file. +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ + +#ifndef __HRNG_H__ +#define __HRNG_H__ + +#include "hal.h" + +/****************************************************************************** +*@brief : Initialize the hrng module +* +*@return: None +******************************************************************************/ +void HAL_HRNG_Init(void); + +/****************************************************************************** +*@brief : DeInitializes the hrng module +* +*@return: None +******************************************************************************/ +void HAL_HRNG_DeInit(void); + +/****************************************************************************** +*@brief : get 8bit random number +* +*@return: 8 bit random number +******************************************************************************/ +uint8_t HAL_HRNG_GetHrng_8(void); + +/****************************************************************************** +*@brief : get 32bit random number +* +*@return: 32 bit random number +******************************************************************************/ +uint32_t HAL_HRNG_GetHrng_32(void); + +/****************************************************************************** +*@brief : get random number +* +*@param : hdata : the start address of random number +*@param : byte_len the byte length of random number +*@return: 0 : hrng data is ok +* 1 : hrng data is bad +******************************************************************************/ +uint8_t HAL_HRNG_GetHrng(uint8_t *hdata, uint32_t byte_len); + +#endif + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_i2c.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_i2c.h new file mode 100644 index 0000000000..6e5143fb1a --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_i2c.h @@ -0,0 +1,208 @@ +/****************************************************************************** +*@file : hal_i2c.h +*@brief : Header file of I2C HAL module. +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ + +#ifndef __HAL_I2C_H__ +#define __HAL_I2C_H__ + +#include "acm32h5xx_hal_conf.h" + +/** @defgroup I2C_MODE + * @{ + */ +#define I2C_MODE_SLAVE (0U) +#define I2C_MODE_MASTER (1U) +/** + * @} + */ + +/** @defgroup CLOCK_SPEED + * @{ + */ +#define CLOCK_SPEED_STANDARD (100000U) +#define CLOCK_SPEED_FAST (400000U) +#define CLOCK_SPEED_FAST_PLUS (1000000U) +/** + * @} + */ + + +/** @defgroup TX_AUTO_EN + * @{ + */ +#define TX_AUTO_DISABLE (0U) +#define TX_AUTO_ENABLE (1U) +/** + * @} + */ + + +/** @defgroup STRETCH_MODE + * @{ + */ +#define STRETCH_MODE_ENABLE (0U) +#define STRETCH_MODE_DISABLE (1U) +/** + * @} + */ + +/** @defgroup FILTER_ALGO_ENABLE + * @{ + */ +#define FILTER_ALGO_DISABLE (0U) +#define FILTER_ALGO_ENABLE (1U) +/** + * @} + */ + +/** @defgroup SLAVE State machine + * @{ + */ +#define I2C_STATE_IDLE (0U) +#define I2C_STATE_TX_DATA (1U) +#define I2C_STATE_RX_DATA (2U) +#define I2C_STATE_REQ_ADDR (3U) +#define I2C_STATE_RX_ADDR (4U) +/** + * @} + */ + + /** @defgroup I2C_Memory_Address_Size I2C Memory Address Size + * @{ + */ +#define I2C_MEMADD_SIZE_8BIT (0U) +#define I2C_MEMADD_SIZE_16BIT (1U) +/** + * @} + */ + + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup I2C_Private_Macros I2C Private Macros + * @{ + */ +#define I2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0xFF00)) >> 8))) +#define I2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF))) + +/** + * @brief I2C Configuration Structure definition + */ + +#define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) (((((__HANDLE__)->Instance->SR) & (__FLAG__)) == (__FLAG__) ) ? 1 : 0) + + +typedef struct +{ + uint32_t I2C_Mode; /* This parameter can be a value of @ref I2C_MODE */ + + uint32_t Tx_Auto_En; /* This parameter can be a value of @ref TX_AUTO_EN */ + + uint32_t Stretch_Mode; /* This parameter can be a value of @ref STRETCH_MODE */ + + uint32_t Own_Address; /* This parameter can be a 7-bit address */ + + uint32_t Clock_Speed; /* This parameter can be a value of @ref CLOCK_SPEED */ + + uint32_t filter_enable; /* This parameter can be a value of @ref FILTER_ALGO_DISABLE */ +} I2C_InitTypeDef; + +/******************************** Check I2C Parameter *******************************/ +#define IS_I2C_ALL_INSTANCE(INSTANCE) (((INSTANCE) == I2C1) || \ + ((INSTANCE) == I2C2) || \ + ((INSTANCE) == I2C3) || \ + ((INSTANCE) == I2C4) ) + +#define IS_I2C_ALL_MODE(I2C_MODE) (((I2C_MODE) == I2C_MODE_SLAVE) || \ + ((I2C_MODE) == I2C_MODE_MASTER)) + +#define IS_I2C_CLOCK_SPEED(CLOCK_SPEED) (((CLOCK_SPEED) > 0U) && ((CLOCK_SPEED) <=1000000U)) + +#define IS_I2C_TX_AUTO_EN(TX_AUTO_EN) (((TX_AUTO_EN) == TX_AUTO_DISABLE) || \ + ((TX_AUTO_EN) == TX_AUTO_ENABLE)) + +#define IS_I2C_STRETCH_EN(STRETCH_EN) (((STRETCH_EN) == STRETCH_MODE_ENABLE) || \ + ((STRETCH_EN) == STRETCH_MODE_DISABLE)) + +/** + * @brief I2C handle Structure definition + */ +typedef struct _I2C_HandleTypeDef +{ + I2C_TypeDef *Instance; /* I2C registers base address */ + + I2C_InitTypeDef Init; /* I2C communication parameters */ + + volatile uint32_t state; /* the I2C state machine */ + + uint8_t *Rx_Buffer; /* I2C Rx Buffer */ + uint8_t *Tx_Buffer; /* I2C Tx Buffer */ + + uint32_t Rx_Size; /* I2C Rx Size */ + uint32_t Tx_Size; /* I2C Tx Size */ + + uint32_t Rx_Count; /* I2C Rx Count */ + uint32_t Tx_Count; /* I2C Tx Count */ +#ifdef HAL_DMA_MODULE_ENABLED + DMA_HandleTypeDef *HDMA_Rx; /* I2C Rx DMA handle parameters */ + DMA_HandleTypeDef *HDMA_Tx; /* I2C Tx DMA handle parameters */ +#endif + void (*I2C_STOPF_Callback)(struct _I2C_HandleTypeDef* hi2c); /* I2C STOP flag interrupt callback */ + +}I2C_HandleTypeDef; + +/* Function : HAL_I2C_IRQHandler */ +void HAL_I2C_IRQHandler(I2C_HandleTypeDef *hi2c); + +/* Function : HAL_I2C_MspInit */ +void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c); + +/* Function : HAL_I2C_MspDeInit */ +void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c); + +/* Function : HAL_I2C_Init */ +HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c); + +/* Function : HAL_I2C_DeInit */ +HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c); + +/* Function : HAL_I2C_Master_Transmit */ +HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); + +/* Function : HAL_I2C_Master_Receive */ +HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); + +/* Function : HAL_I2C_Slave_Transmit */ +HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint32_t Size, uint32_t Timeout); + +/* Function : HAL_I2C_Slave_Receive */ +HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint32_t Size, uint32_t Timeout); + +HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint32_t Size); + + +/* Function : HAL_I2C_Slave_Receive_IT */ +HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint32_t Size); +HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); + +#ifdef HAL_DMA_MODULE_ENABLED +HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint32_t Size); +HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint32_t Size); +#endif + +/* Function : HAL_I2C_Mem_Write */ +HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); + +/* Function : HAL_I2C_Mem_Read */ +HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); + +/* Function : HAL_I2C_GetSlaveRxState */ +uint8_t HAL_I2C_GetSlaveRxState(I2C_HandleTypeDef *hi2c); + +/* Function : HAL_I2C_GetSlaveTxState */ +uint8_t HAL_I2C_GetSlaveTxState(I2C_HandleTypeDef *hi2c); + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_i2s.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_i2s.h new file mode 100644 index 0000000000..71d8c3f38b --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_i2s.h @@ -0,0 +1,487 @@ + +/****************************************************************************** +*@file : hal_i2s.h +*@brief : Header file of I2S HAL module. +******************************************************************************/ + +#ifndef __HAL_I2S_H__ +#define __HAL_I2S_H__ + +#include "hal.h" + +/** + * @brief I2S Init structure definition + */ + +typedef struct +{ + uint32_t Mode; /*!< Specifies the I2S operating mode. + This parameter can be a value of @ref I2S_Mode */ + + uint32_t Standard; /*!< Specifies the standard used for the I2S communication. + This parameter can be a value of @ref I2S_Standard */ + + uint32_t DataFormat; /*!< Specifies the data format for the I2S communication. + This parameter can be a value of @ref I2S_DataFormat */ + + uint32_t MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. + This parameter can be a value of @ref I2S_MCLK_Output */ + + uint32_t ClockPolarity; /*!< Specifies the idle state of the I2S clock. + This parameter can be a value of @ref I2S_ClockPolarity */ + + uint32_t IOSwitch; /*!< Specifies the idle state of the I2S clock. + This parameter can be a value of @ref I2S_IOSwitch */ + + uint32_t AudioFreq; /*!< Specifies the frequency selected for the I2S communication. */ + +}I2S_InitTypeDef; + + + +/** + * @brief I2S handle Structure definition + */ +typedef struct __I2S_HandleTypeDef +{ + I2S_TypeDef *Instance; /*!< I2S registers base address */ + I2S_InitTypeDef Init; /*!< I2S communication parameters */ + + DMA_HandleTypeDef *hdmactx; /*!< Tx DMA Handle parameters */ + DMA_HandleTypeDef *hdmacrx; /*!< Rx DMA Handle parameters */ + + uint32_t State; /*!< Tx state */ + uint32_t Error; /*!< Tx Error */ + uint32_t Abort; /*!< Tx abort flag in blocking mode */ + uint32_t *pTxBuf; /*!< Tx buffer pointer */ + uint32_t TxCount; /*!< Tx size not transfer */ + uint32_t *pRxBuf; /*!< Rx buffer pointer */ + uint32_t RxCount; /*!< Rx size not transfer */ + + uint32_t (*TxCpltCallback)(struct __I2S_HandleTypeDef *); /* send complete callback */ + uint32_t (*RxCpltCallback)(struct __I2S_HandleTypeDef *); /* send complete callback */ + uint32_t (*TxEmptyCallback)(struct __I2S_HandleTypeDef *); /* send complete callback */ + uint32_t (*MsuspCallback)(struct __I2S_HandleTypeDef *); /* send complete callback */ + uint32_t (*SvtcCallback)(struct __I2S_HandleTypeDef *); /* send complete callback */ + uint32_t (*DMATxCpltCallback)(struct __I2S_HandleTypeDef *); /* send complete callback */ + uint32_t (*DMATxHalfCpltCallback)(struct __I2S_HandleTypeDef *); /* send half complete callback in DMA mode */ + uint32_t (*DMARxCpltCallback)(struct __I2S_HandleTypeDef *); /* recv complete callback */ + uint32_t (*DMARxHalfCpltCallback)(struct __I2S_HandleTypeDef *); /* recv half complete callback in DMA mode */ + uint32_t (*ErrorCallback)(struct __I2S_HandleTypeDef *); /* error callback */ + +}I2S_HandleTypeDef; + + +/** + * @brief HAL I2S Callback pointer definition + */ + +typedef uint32_t (*pI2S_CallbackTypeDef)(I2S_HandleTypeDef *hlpuart); /*!< pointer to the I2S callback function */ + + +/** @defgroup I2S_Mode + * @{ + */ + +#define I2S_MODE_MASTER ( I2S_CR_MODE ) +#define I2S_MODE_SLAVE ( 0U ) + +/** + * @} + */ + + +/** @defgroup I2S_Standard + * @{ + */ + +#define I2S_STANDARD_PHILIPS ( 0U ) +#define I2S_STANDARD_MSB ( I2S_CR_STD_0 ) +#define I2S_STANDARD_LSB ( I2S_CR_STD_1 ) +#define I2S_STANDARD_PCM_SHORT ( I2S_CR_STD_1 | I2S_CR_STD_0 ) +#define I2S_STANDARD_PCM_LONG ( I2S_CR_PCMMODE | I2S_CR_STD_1 | I2S_CR_STD_0 ) + +/** + * @} + */ + + +/** @defgroup I2S_DataFormat + * @{ + */ + +#define I2S_DATA_FORMAT_16B_EXTENDED_TO_16B ( 0U ) +#define I2S_DATA_FORMAT_16B_EXTENDED_TO_32B ( I2S_CR_CHLEN ) +#define I2S_DATA_FORMAT_24B_EXTENDED_TO_32B ( I2S_CR_CHLEN | I2S_CR_DLEN_0 ) +#define I2S_DATA_FORMAT_32B_EXTENDED_TO_32B ( I2S_CR_CHLEN | I2S_CR_DLEN_1 ) +/** + * @} + */ + + +/** @defgroup I2S_MCLKOut + * @{ + */ +#define I2S_MCLKOUT_ENABLE ( I2S_PR_MCKOE ) +#define I2S_MCLKOUT_DISABLE ( 0U ) +/** + * @} + */ + + +/** @defgroup I2S_ClockPolarity + * @{ + */ + +#define I2S_CLOCK_POLARITY_LOW ( 0U ) +#define I2S_CLOCK_POLARITY_HIGH ( I2S_CR_CKPL ) + +/** + * @} + */ + + +/** @defgroup I2S_IOSwitch + * @{ + */ + +#define I2S_IO_SWITCH_ENABLE ( I2S_CR_IOSWP ) +#define I2S_IO_SWITCH_DISABLE ( 0U ) + +/** + * @} + */ + +/** @defgroup I2S_CallbackID + * @{ + */ + +#define I2S_CALLBACKID_TX_CPLT ( 0U ) +#define I2S_CALLBACKID_RX_CPLT ( 1U ) +#define I2S_CALLBACKID_TX_EMPTY ( 2U ) +#define I2S_CALLBACKID_MSUSP ( 3U ) +#define I2S_CALLBACKID_SVTC ( 4U ) +#define I2S_CALLBACKID_DMA_TX_CPLT ( 5U ) +#define I2S_CALLBACKID_DMA_TX_HALF_CPLT ( 6U ) +#define I2S_CALLBACKID_DMA_RX_CPLT ( 7U ) +#define I2S_CALLBACKID_DMA_RX_HALF_CPLT ( 8U ) +#define I2S_CALLBACKID_ERROR ( 9U ) +#define I2S_CALLBACKID_MAX ( 10U ) + +/** + * @} + */ + +/** @defgroup I2S_IT + * @{ + */ +#define I2S_IT_TXE ( I2S_DIER_TXEIE ) +#define I2S_IT_RXNE ( I2S_DIER_RXNEIE ) +#define I2S_IT_ERR ( I2S_DIER_ERRIE ) +#define I2S_IT_MSUSP ( I2S_DIER_MSUSPIE ) +#define I2S_IT_SVTC ( I2S_DIER_SVTCIE ) + +/** + * @} + */ + +/** + * @brief + */ + +#define I2S_IT_MASK ( I2S_IT_TXE | I2S_IT_RXNE | I2S_IT_ERR | I2S_IT_MSUSP | I2S_IT_SVTC ) + +/** @defgroup I2S_Flags + * @{ + */ + +#define I2S_FLAG_SVTC ( I2S_SR_SVTC ) +#define I2S_FLAG_MSUSP ( I2S_SR_MSUSP ) +#define I2S_FLAG_FE ( I2S_SR_FE ) +#define I2S_FLAG_OVR ( I2S_SR_OVR ) +#define I2S_FLAG_UDR ( I2S_SR_UDR ) +#define I2S_FLAG_CH ( I2S_SR_CH ) +#define I2S_FLAG_TXE ( I2S_SR_TXE ) +#define I2S_FLAG_RXNE ( I2S_SR_RXNE ) + +/** + * @} + */ + +/** + * @brief + */ + +#define I2S_FLAG_MASK ( I2S_FLAG_SVTC | I2S_FLAG_MSUSP | I2S_FLAG_FE | I2S_FLAG_OVR | \ + I2S_FLAG_UDR | I2S_FLAG_CH | I2S_FLAG_TXE | I2S_FLAG_RXNE ) + + +/** + * @brief I2S_State + */ + +#define I2S_STATE_READY ( 0U ) +#define I2S_STATE_BUSY ( 1U ) +#define I2S_STATE_BUSY_IT ( 2U ) +#define I2S_STATE_BUSY_DMA ( 3U ) +#define I2S_STATE_BUSY_DMA_LINK ( 4U ) + +/** + * @brief I2S DMA error + */ + +#define I2S_DMA_ERROR ( 1U << 31 ) +#define I2S_DMA_TX_ERROR ( 1U << 31 ) +#define I2S_DMA_RX_ERROR ( 1U << 31 ) + + + + +/* Exported macros -----------------------------------------------------------*/ +/** @defgroup I2S_Exported_Macros + * @{ + */ + +/** + * @brief Enable the I2S peripheral. + * @param __HANDLE__ I2S handle + * @retval None + */ + +#define __HAL_I2S_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= I2S_CR_EN) + +/** + * @brief Disable the I2S peripheral. + * @param __HANDLE__ I2S handle + * @retval None + */ + +#define __HAL_I2S_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~(I2S_CR_EN)) + +#define __HAL_I2S_TX_RX_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= I2S_CR_TEN | I2S_CR_REN) + +#define __HAL_I2S_TX_RX_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~(I2S_CR_TEN | I2S_CR_REN)) + +#define __HAL_I2S_TX_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= I2S_CR_TEN) + +#define __HAL_I2S_TX_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~(I2S_CR_TEN)) + +#define __HAL_I2S_RX_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= I2S_CR_REN) + +#define __HAL_I2S_RX_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~(I2S_CR_REN)) + +#define __HAL_I2S_START_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= I2S_CR_START) + +#define __HAL_I2S_START_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~(I2S_CR_START)) + +#define __HAL_I2S_STOP_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= I2S_CR_STOP) + +#define __HAL_I2S_STOP_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~(I2S_CR_STOP)) + +#define __HAL_I2S_WRITE_DATA(__HANDLE__, __DATA__) ((__HANDLE__)->Instance->TXDR = (__DATA__)) + +#define __HAL_I2S_READ_DATA(__HANDLE__) ((__HANDLE__)->Instance->RXDR) + +/** + * @brief Enable the TX DMA. + * @param __HANDLE__ I2S handle + * @retval None + */ + +#define __HAL_I2S_TX_DMA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= I2S_CR_TXDMAEN) + +/** + * @brief Disable the TX DMA. + * @param __HANDLE__ I2S handle + * @retval None + */ + +#define __HAL_I2S_TX_DMA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~(I2S_CR_TXDMAEN)) + + +/** + * @brief Enable the RX DMA. + * @param __HANDLE__ I2S handle + * @retval None + */ + +#define __HAL_I2S_RX_DMA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= I2S_CR_RXDMAEN) + +/** + * @brief Disable the RX DMA. + * @param __HANDLE__ I2S handle + * @retval None + */ + +#define __HAL_I2S_RX_DMA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~(I2S_CR_RXDMAEN)) + +/** + * @brief Enable the TX RX DMA. + * @param __HANDLE__ I2S handle + * @retval None + */ + +#define __HAL_I2S_TX_RX_DMA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= I2S_CR_TXDMAEN | I2S_CR_RXDMAEN) + +/** + * @brief Disable the TX RX DMA. + * @param __HANDLE__ I2S handle + * @retval None + */ + +#define __HAL_I2S_TX_RX_DMA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~(I2S_CR_TXDMAEN | I2S_CR_RXDMAEN)) + + +/** + * @brief Enable the specified I2S interrupt. + * @param __HANDLE__ I2S handle. + * @param __INTERRUPT__ I2S interrupt to set. + * This parameter can be a combination of: + * @arg I2S_IT_TXE : Tx buffer empty Interrupt. + * @arg I2S_IT_RXNE : Rx buffer non empty Interrupt. + * @arg I2S_IT_ERR : Error Interrupt. + * @retval None. + */ + +#define __HAL_I2S_IT_ENABLE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__)) + +/** + * @brief Disable the specified I2S interrupt. + * @param __HANDLE__ I2S handle. + * @param __INTERRUPT__ I2S interrupt to set. + * This parameter can be a combination of: + * @arg I2S_IT_TXE : Tx buffer empty Interrupt. + * @arg I2S_IT_RXNE : Rx buffer non empty Interrupt. + * @arg I2S_IT_ERR : Error Interrupt. + * @retval None. + */ + +#define __HAL_I2S_IT_DISABLE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER &= (~(__INTERRUPT__))) + +/** + * @brief Check whether the specified I2S flag is set or not. + * @param __HANDLE__ I2S handle + * @param __FLAG__ I2S flag to check + * This parameter can be a value of: + * @arg I2S_FLAG_FE : frame error flag. + * @arg I2S_FLAG_BUSY : busy flag. + * @arg I2S_FLAG_RXOVE : rx buffer overflow flag. + * @arg I2S_FLAG_TXUDE : rx buffer uderflow flag. + * @arg I2S_FLAG_CHF : which channel data is the next data. + * @arg I2S_FLAGR_TXE : tx buffer empty flag. + * @arg I2S_FLAG_RXNE : rx buffer non empty flag. + * @retval The state of the specified flag (SET or RESET). + */ + +#define __HAL_I2S_GET_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR & (__FLAG__)) + + +#define __HAL_I2S_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = 0xffffffff & ~(__FLAG__)) + + +/** + * @brief Check whether the specified I2S interrupt source is enabled or not. + * @param __HANDLE__ I2S handle. + * @param __INTERRUPT__ I2S interrupt to check. + * This parameter can be a value of: + * @arg I2S_IT_TXE : Tx buffer empty Interrupt. + * @arg I2S_IT_RXNE : Rx buffer non empty Interrupt. + * @arg I2S_IT_ERR : Error Interrupt. + * @retval Interrupt status. + */ + +#define __HAL_I2S_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) + +/** + * @} + */ + + +/** @defgroup I2S Private Macros + * @{ + */ + +#define IS_I2S_HANDLE(__HANDLE__) ((__HANDLE__) != NULL) + +#define IS_I2S_INSTANCE(__INSTANCE__) (((__INSTANCE__) == I2S1) || \ + ((__INSTANCE__) == I2S2) || \ + ((__INSTANCE__) == I2S3)) + +#define IS_I2S_MODE(__MODE__) (((__MODE__) == I2S_MODE_MASTER) || \ + ((__MODE__) == I2S_MODE_SLAVE)) + +#define IS_I2S_STANDARD(__STANDARD__) (((__STANDARD__) == I2S_STANDARD_PHILIPS) || \ + ((__STANDARD__) == I2S_STANDARD_MSB) || \ + ((__STANDARD__) == I2S_STANDARD_LSB) || \ + ((__STANDARD__) == I2S_STANDARD_PCM_SHORT) || \ + ((__STANDARD__) == I2S_STANDARD_PCM_LONG)) + +#define IS_I2S_DATAFORMAT(__DATAFORMAT__) (((__DATAFORMAT__) == I2S_DATA_FORMAT_16B_EXTENDED_TO_16B) || \ + ((__DATAFORMAT__) == I2S_DATA_FORMAT_16B_EXTENDED_TO_32B) || \ + ((__DATAFORMAT__) == I2S_DATA_FORMAT_24B_EXTENDED_TO_32B) || \ + ((__DATAFORMAT__) == I2S_DATA_FORMAT_32B_EXTENDED_TO_32B)) + + +#define IS_I2S_MCLKOUTPUT(__OUTPUT__) (((__OUTPUT__) == I2S_MCLKOUT_ENABLE) || \ + ((__OUTPUT__) == I2S_MCLKOUT_DISABLE)) + +#define IS_I2S_CLOCKPOLARITY(__POLARITY__) (((__POLARITY__) == I2S_CLOCK_POLARITY_LOW) || \ + ((__POLARITY__) == I2S_CLOCK_POLARITY_HIGH)) + +#define IS_I2S_IOSWITCH(__SWITCH__) (((__SWITCH__) == I2S_IO_SWITCH_ENABLE) || \ + ((__SWITCH__) == I2S_IO_SWITCH_DISABLE)) + + +#define IS_I2S_CALLBACKID(__CALLBACKID__) ((__CALLBACKID__) < I2S_CALLBACKID_MAX) + + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +void HAL_I2S_IRQHander(I2S_HandleTypeDef *hi2s); +HAL_StatusTypeDef HAL_I2S_Init(I2S_HandleTypeDef *hi2s); +HAL_StatusTypeDef HAL_I2S_DeInit(I2S_HandleTypeDef *hi2s); +void HAL_I2S_MspInit(I2S_HandleTypeDef *hi2s); +void HAL_I2S_MspDeInit(I2S_HandleTypeDef *hi2s); +HAL_StatusTypeDef HAL_I2S_RegisterCallback(I2S_HandleTypeDef *hi2s, uint32_t id, pI2S_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_I2S_UnRegisterCallback(I2S_HandleTypeDef *hi2s, uint32_t id); + +HAL_StatusTypeDef HAL_I2S_TxData(I2S_HandleTypeDef *hi2s, uint32_t Data); +HAL_StatusTypeDef HAL_I2S_RxData(I2S_HandleTypeDef *hi2s, uint32_t *pdata); + +HAL_StatusTypeDef HAL_I2S_Transmit(I2S_HandleTypeDef *hi2s, uint32_t *pdata, uint32_t size, uint32_t timeout); +HAL_StatusTypeDef HAL_I2S_Receive(I2S_HandleTypeDef *hi2s, uint32_t *pdata, uint32_t size, uint32_t timeout); +HAL_StatusTypeDef HAL_I2S_Transmit_Receive(I2S_HandleTypeDef *hi2s, uint32_t *prxdata, uint32_t *ptxdata, uint32_t size, uint32_t timeout); + +HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint32_t *pdata, uint32_t size); +HAL_StatusTypeDef HAL_I2S_Receive_IT(I2S_HandleTypeDef *hi2s, uint32_t *pdata, uint32_t size); +HAL_StatusTypeDef HAL_I2S_Transmit_Receive_IT(I2S_HandleTypeDef *hi2s, uint32_t *prxdata, uint32_t *ptxdata, uint32_t size); + +HAL_StatusTypeDef HAL_I2S_Transmit_DMA(I2S_HandleTypeDef *hi2s, uint32_t *pdata, uint16_t size); +HAL_StatusTypeDef HAL_I2S_Receive_DMA(I2S_HandleTypeDef *hi2s, uint32_t *pdata, uint16_t size); +HAL_StatusTypeDef HAL_I2S_Transmit_Receive_DMA(I2S_HandleTypeDef *hi2s, uint32_t *prxdata, uint32_t *ptxdata, uint16_t size); + +HAL_StatusTypeDef HAL_I2S_Abort(I2S_HandleTypeDef *hi2s); +uint32_t HAL_I2S_GetState(I2S_HandleTypeDef *hi2s); + +void HAL_I2S_TxEmptyCallback(I2S_HandleTypeDef *hi2s); +void HAL_I2S_TxCompleteCallback(I2S_HandleTypeDef *hi2s); +void HAL_I2S_MsuspCallback(I2S_HandleTypeDef *hi2s); +void HAL_I2S_SvtcCallback(I2S_HandleTypeDef *hi2s); +void HAL_I2S_RxNonEmptyCallback(I2S_HandleTypeDef *hi2s); +void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s); + +void HAL_I2S_DMATxCpltCallback(DMA_HandleTypeDef *hdmac); +void HAL_I2S_DMATxHalfCpltCallback(DMA_HandleTypeDef *hdmac); +void HAL_I2S_DMARxCpltCallback(DMA_HandleTypeDef *hdmac); +void HAL_I2S_DMARxHalfCpltCallback(DMA_HandleTypeDef *hdmac); +void HAL_I2S_DMAErrorCallback(DMA_HandleTypeDef *hdmac); + + + + +#endif + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_iwdt.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_iwdt.h new file mode 100644 index 0000000000..7a1fba4261 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_iwdt.h @@ -0,0 +1,180 @@ + +/****************************************************************************** +*@file : hal_iwdt.h +*@brief : Header file of IWDT HAL module. +******************************************************************************/ + +#ifndef __HAL_IWDT_H__ +#define __HAL_IWDT_H__ + +#include "hal.h" + + +/** + * @brief IWDT Init structure definition + */ + +typedef struct +{ + uint32_t Prescaler; /*!< Select the prescaler of the IWDT. + This parameter can be any value of @ref IWDT_Clock_Prescaler */ + + uint32_t Reload; /*!< Specifies the IWDT down-counter reload value. + This parameter must be a number between Min_Data = 0 and Max_Data = 0x0FFF */ + + uint32_t Window; /*!< Specifies the window value to be compared to the down-counter. + This parameter must be a number between Min_Data = 0 and Max_Data = 0x0FFF */ + + uint32_t Wakeup; /*!< Specifies the wakeup value to be compared to the down-counter. + This parameter must be a number between Min_Data = 0 and Max_Data = 0x0FFF */ + + uint32_t WakeupMode; /*!< Configure the wake-up mode of IWDT. + This parameter can be any value of @ref IWDT_Wakeup_Mode */ + +} IWDT_InitTypeDef; + +/** + * @brief IWDT Handle Structure definition + */ + +typedef struct +{ + IWDT_TypeDef *Instance; /*!< Register base address */ + + IWDT_InitTypeDef Init; /*!< IWDT required parameters */ + +} IWDT_HandleTypeDef; + + +/** @defgroup IWDT_Cmd + * @{ + */ + +#define IWDT_CMD_ENABLE ( 0xCCCCU ) +#define IWDT_CMD_WRITE_ENABLE ( 0x5555U ) +#define IWDT_CMD_WAKEUP_ENABLE ( 0x6666U ) +#define IWDT_CMD_WAKEUP_DISABLE ( 0x9999U ) +#define IWDT_CMD_RELOAD ( 0xAAAAU ) +#define IWDT_CMD_DISABLE ( 0xEF01ABCDU ) + +/** + * @} + */ +/** @defgroup IWDT_Clock_Prescaler + * @{ + */ + +#define IWDT_CLOCK_PRESCALER_4 ( 0U ) +#define IWDT_CLOCK_PRESCALER_8 ( 1U ) +#define IWDT_CLOCK_PRESCALER_16 ( 2U ) +#define IWDT_CLOCK_PRESCALER_32 ( 3U ) +#define IWDT_CLOCK_PRESCALER_64 ( 4U ) +#define IWDT_CLOCK_PRESCALER_128 ( 5U ) +#define IWDT_CLOCK_PRESCALER_256 ( 6U ) +#define IWDT_CLOCK_PRESCALER_256_1 ( 7U ) + +/** + * @} + */ + +/** @defgroup IWDT_Wakeup_Mode + * @{ + */ + +#define IWDT_WAKEUP_MODE_IT ( EXTI_MODE_IT_RISING ) +#define IWDT_WAKEUP_MODE_EVENT ( EXTI_MODE_EVT_RISING ) + +/** + * @} + */ + +/** @defgroup IWDT_Flag + * @{ + */ + +#define IWDT_FLAG_PVU ( IWDT_SR_PVU ) +#define IWDT_FLAG_RVU ( IWDT_SR_RVU ) +#define IWDT_FLAG_WVU ( IWDT_SR_WVU ) +#define IWDT_FLAG_WTU ( IWDT_SR_WTU ) +#define IWDT_FLAG_RLF ( IWDT_SR_RLF ) + +/** + * @} + */ + +/** + * @brief IWDT EXTI Line number + */ + +#define IWDT_EXTI_LINE ( EXTI_LINE_IWDT ) + +/** + * @brief IWDT down-counter reload max value + */ + +#define IWDT_RELOAD_MAX_VALUE ( 0x0FFFU ) + + +/** @defgroup IWDT_TIMEOUT + * @{ + */ + +#define IWDT_PVU_TIMEOUT ( 30U ) +#define IWDT_RVU_TIMEOUT ( 30U ) +#define IWDT_WVU_TIMEOUT ( 30U ) +#define IWDT_WTU_TIMEOUT ( 30U ) +#define IWDT_RLF_TIMEOUT ( 30U ) + +/** + * @} + */ + + +/** @defgroup IWDT Private Macros + * @{ + */ + +#define IS_IWDT_HANDLE(__HANDLE__) ((__HANDLE__) != NULL) +#define IS_IWDT_ALL_INSTANCE(__INSTANCE__) ((__INSTANCE__) == IWDT) + +#define IS_IWDT_PRESCALER(__PRESCALER__) (((__PRESCALER__) == IWDT_CLOCK_PRESCALER_4) || \ + ((__PRESCALER__) == IWDT_CLOCK_PRESCALER_8) || \ + ((__PRESCALER__) == IWDT_CLOCK_PRESCALER_16) || \ + ((__PRESCALER__) == IWDT_CLOCK_PRESCALER_32) || \ + ((__PRESCALER__) == IWDT_CLOCK_PRESCALER_64) || \ + ((__PRESCALER__) == IWDT_CLOCK_PRESCALER_128)|| \ + ((__PRESCALER__) == IWDT_CLOCK_PRESCALER_256)|| \ + ((__PRESCALER__) == IWDT_CLOCK_PRESCALER_256_1)) + +#define IS_IWDT_WAKEUPMODE(__MODE__) (((__MODE__) == IWDT_WAKEUP_MODE_IT) || \ + ((__MODE__) == IWDT_WAKEUP_MODE_EVENT)) + +#define IS_IWDT_RELOAD(__RELOAD__) ((__RELOAD__) <= IWDT_RELOAD_MAX_VALUE) + +#define IS_IWDT_WINDOW(__WINDOW__) ((__WINDOW__) <= IWDT_RELOAD_MAX_VALUE) + +#define IS_IWDT_WAKEUP(__WAKEUP__) ((__WAKEUP__) <= IWDT_RELOAD_MAX_VALUE) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +void HAL_IWDT_IRQHandler(IWDT_HandleTypeDef *hiwdt); + +void HAL_IWDT_Callback(IWDT_HandleTypeDef *hiwdt); + +HAL_StatusTypeDef HAL_IWDT_Init(IWDT_HandleTypeDef * hidt); + +void HAL_IWDT_MspInit(IWDT_HandleTypeDef * hiwdt); + +HAL_StatusTypeDef HAL_IWDT_Refresh(IWDT_HandleTypeDef *hiwdt); + +FlagStatus HAL_IWDT_GetPending(void); + +void HAL_IWDT_ClearPending(void); + + + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_lptim.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_lptim.h new file mode 100644 index 0000000000..309d24097b --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_lptim.h @@ -0,0 +1,755 @@ +/* + ****************************************************************************** + * @file hal_lptim.h + * @version V1.0.0 + * @date 2020 + * @brief Header file of LPTIM HAL module. + ****************************************************************************** +*/ + +#ifndef __HAL_LPTIM_H__ +#define __HAL_LPTIM_H__ + +#include "hal.h" + +/** + * @brief LPTIM Initialization Structure definition + */ + +typedef struct +{ + uint32_t ClockSource; /*!< Selects the clock source. + This parameter can be a value of @ref LPTIM_ClockSource */ + + uint32_t ClockPrescaler; /*!< Specifies the counter clock Prescaler. + Note: This parameter is invalid when the internal clock source is + selected and the external input1 is selected as the count signal. + Note: This parameter is invalid when encoder mode is selected. + This parameter can be a value of @ref LPTIM_ClockPrescaler */ + + + uint32_t TriggerSource; /*!< Selects the Trigger source. + This parameter can be a value of @ref LPTIM_TriggerSource */ + + + uint32_t TriggerFilter; /*!< Selects the trigger sampling time to configure the clock glitch filter. + Note: This parameter is used only when the internal clock source is + selected and an external trigger is used. + This parameter can be a value of @ref LPTIM_TriggerFilter */ + + + uint32_t TriggerPolarity; /*!< Selects the Trigger active edge. + Note: This parameter is used only when the internal clock source is + selected and an external trigger is used. + This parameter can be a value of @ref LPTIM_TriggerPolarity */ + + uint32_t CounterSource; /*!< Specifies whether the counter is incremented each internal event + or each external event. + Note: When external clock source is selected, this parameter is invalid, + and external events are forced to be selected + This parameter can be a value of @ref LPTIM_CounterSource */ + + uint32_t CounterFilter; /*!< Selects the clock sampling time to configure the clock glitch filter. + Note: This parameter is only used when the internal clock source is + selected and the external input1 is selected as the count signal. + This parameter can be a value of @ref LPTIM_CounterFilter */ + + + uint32_t CounterPolarity; /*!< Selects the polarity of the active edge for the counter unit + if the external input1 is selected. + Note: This parameter is used in two cases: one is to select an internal + clock source and external input1 as the count signal, and the + other is to select an external clock source. The 'both edge' is + only available in the first case. + This parameter can be a value of @ref LPTIM_CounterPolarity */ + + uint32_t Input1Source; /*!< Specifies source selected for input1. + This parameter can be a value of @ref LPTIM_Input1Source */ + + uint32_t Input2Source; /*!< Specifies source selected for input2. + Note: This parameter is used only for encoder feature. + This parameter can be a value of @ref LPTIM_Input2Source */ + + uint32_t UpdateMode; /*!< Specifies whether the update of the autoreload and the compare values and + repetition counter values is done immediately or after the end of current period. + This parameter can be a value of @ref LPTIM_UpdatingMode */ + + uint32_t WaveformPolarity; /*!< Specifies the Output polarity. + This parameter can be a value of @ref LPTIM_WaveformPolarity */ + +} LPTIM_InitTypeDef; + + + +/** + * @brief LPTIM handle Structure definition + */ + +typedef struct __LPTIM_HandleTypeDef +{ + LPTIM_TypeDef *Instance; /*!< Register base address */ + uint32_t WakeUpLine; + LPTIM_InitTypeDef Init; /*!< LPTIM required parameters */ + + void (* CompareMatchCallback)(struct __LPTIM_HandleTypeDef *hlptim); /*!< Compare match Callback */ + void (* AutoReloadMatchCallback)(struct __LPTIM_HandleTypeDef *hlptim); /*!< Auto-reload match Callback */ + void (* TriggerCallback)(struct __LPTIM_HandleTypeDef *hlptim); /*!< External trigger event detection Callback */ + void (* CompareWriteCallback)(struct __LPTIM_HandleTypeDef *hlptim); /*!< Compare register write complete Callback */ + void (* AutoReloadWriteCallback)(struct __LPTIM_HandleTypeDef *hlptim); /*!< Auto-reload register write complete Callback */ + void (* DirectionUpCallback)(struct __LPTIM_HandleTypeDef *hlptim); /*!< Up-counting direction change Callback */ + void (* DirectionDownCallback)(struct __LPTIM_HandleTypeDef *hlptim); /*!< Down-counting direction change Callback */ + void (* RepetitionUpdateCallback)(struct __LPTIM_HandleTypeDef *hlptim); /*!< Repetition counter Update event occurs Callback */ + void (* RepetitionWriteCallback)(struct __LPTIM_HandleTypeDef *hlptim); /*!< Repetition counter register write complete Callback */ + + uint32_t RepetitionCounter; + uint32_t AutoReload; + uint32_t Compare; +} LPTIM_HandleTypeDef; + +/** + * @defgroup LPTIM_CallbackID + * @{ + */ + +#define LPTIM_CALLBACKID_COMPARE_MATCH ( 0U ) /*!< Compare match Callback ID */ +#define LPTIM_CALLBACKID_AUTORELOAD_MATCH ( 1U ) /*!< Auto-reload match Callback ID */ +#define LPTIM_CALLBACKID_TRIGGER ( 2U ) /*!< External trigger event detection Callback ID */ +#define LPTIM_CALLBACKID_COMPARE_WRITE ( 3U ) /*!< Compare register write complete Callback ID */ +#define LPTIM_CALLBACKID_AUTORELOAD_WRITE ( 4U ) /*!< Auto-reload register write complete Callback ID */ +#define LPTIM_CALLBACKID_DIRECTION_UP ( 5U ) /*!< Up-counting direction change Callback ID */ +#define LPTIM_CALLBACKID_DIRECTION_DOWN ( 6U ) /*!< Down-counting direction change Callback ID */ +#define LPTIM_CALLBACKID_REPETITION_UPDATE ( 7U ) /*!< Update event occurs Callback ID */ +#define LPTIM_CALLBACKID_REPETITION_WRITE ( 8U ) /*!< Repeat register write complete Callback ID */ + +/** + * @} + */ + +/** + * @brief HAL TIM Callback pointer definition + */ + +typedef void (*pLPTIM_CallbackTypeDef)(LPTIM_HandleTypeDef *hlptim); /*!< pointer to the LPTIM callback function */ + + +/** + * @defgroup LPTIM_State + * @{ + */ + +#define HAL_LPTIM_STATE_READY ( 0U ) +#define HAL_LPTIM_STATE_BUSY ( 1U ) + +/** + * @} + */ + + + + + +/** @defgroup LPTIM_ClockSource + * @{ + */ + +#define LPTIM_CLOCKSOURCE_INTERNAL_PCLK ( 0 ) +#define LPTIM_CLOCKSOURCE_INTERNAL_RCL ( 1 ) +#define LPTIM_CLOCKSOURCE_INTERNAL_RCH ( 2 ) +#define LPTIM_CLOCKSOURCE_INTERNAL_XTL ( 3 ) +#define LPTIM_CLOCKSOURCE_EXTERNAL_INPUT1 ( 4 ) + +/** + * @} + */ + +/** @defgroup LPTIM_ClockPrescaler + * @{ + */ + +#define LPTIM_CLOCKPRESCALER_DIV1 ( 0U ) +#define LPTIM_CLOCKPRESCALER_DIV2 ( LPTIM_CFGR1_PRESC_0 ) +#define LPTIM_CLOCKPRESCALER_DIV4 ( LPTIM_CFGR1_PRESC_1 ) +#define LPTIM_CLOCKPRESCALER_DIV8 ( LPTIM_CFGR1_PRESC_0 | LPTIM_CFGR1_PRESC_1 ) +#define LPTIM_CLOCKPRESCALER_DIV16 ( LPTIM_CFGR1_PRESC_2 ) +#define LPTIM_CLOCKPRESCALER_DIV32 ( LPTIM_CFGR1_PRESC_0 | LPTIM_CFGR1_PRESC_2 ) +#define LPTIM_CLOCKPRESCALER_DIV64 ( LPTIM_CFGR1_PRESC_1 | LPTIM_CFGR1_PRESC_2 ) +#define LPTIM_CLOCKPRESCALER_DIV128 ( LPTIM_CFGR1_PRESC ) + +/** + * @} + */ + +/** @defgroup LPTIM_CounterPolarity + * @{ + */ + +#define LPTIM_COUNTERPOLARITY_RISING ( 0U ) +#define LPTIM_COUNTERPOLARITY_FALLING ( LPTIM_CFGR1_CKPOL_0 ) +#define LPTIM_COUNTERPOLARITY_RISING_FALLING ( LPTIM_CFGR1_CKPOL_1 ) + +/** + * @} + */ + +/** @defgroup LPTIM_CounterFilter + * @{ + */ + +#define LPTIM_COUNTERFILTER_DISABLE ( 0U ) +#define LPTIM_COUNTERFILTER_CLK2 ( LPTIM_CFGR1_CKFLT_0 ) +#define LPTIM_COUNTERFILTER_CLK4 ( LPTIM_CFGR1_CKFLT_1 ) +#define LPTIM_COUNTERFILTER_CLK8 ( LPTIM_CFGR1_CKFLT ) + +/** + * @} + */ + +/** @defgroup LPTIM_TriggerSource + * @{ + */ + +#define LPTIM_TRIGSOURCE_SOFTWARE ( 0x0000FFFFU ) +#define LPTIM_TRIGSOURCE_0 ( 0U ) +#define LPTIM_TRIGSOURCE_1 ( LPTIM_CFGR1_TRIGSEL_0 ) +#define LPTIM_TRIGSOURCE_2 ( LPTIM_CFGR1_TRIGSEL_1 ) +#define LPTIM_TRIGSOURCE_3 ( LPTIM_CFGR1_TRIGSEL_1 | LPTIM_CFGR1_TRIGSEL_0 ) + +#define LPTIM_TRIGSOURCE_4 ( LPTIM_CFGR1_TRIGSEL_2 ) +#define LPTIM_TRIGSOURCE_5 ( LPTIM_CFGR1_TRIGSEL_2 | LPTIM_CFGR1_TRIGSEL_0 ) +#define LPTIM_TRIGSOURCE_6 ( LPTIM_CFGR1_TRIGSEL_2 | LPTIM_CFGR1_TRIGSEL_1 ) +#define LPTIM_TRIGSOURCE_7 ( LPTIM_CFGR1_TRIGSEL_2 | LPTIM_CFGR1_TRIGSEL_1 | LPTIM_CFGR1_TRIGSEL_0 ) + +#define LPTIM_TRIGSOURCE_8 ( LPTIM_CFGR1_TRIGSEL_3 ) +#define LPTIM_TRIGSOURCE_9 ( LPTIM_CFGR1_TRIGSEL_3 | LPTIM_CFGR1_TRIGSEL_0 ) +#define LPTIM_TRIGSOURCE_10 ( LPTIM_CFGR1_TRIGSEL_3 | LPTIM_CFGR1_TRIGSEL_1 ) +#define LPTIM_TRIGSOURCE_11 ( LPTIM_CFGR1_TRIGSEL_3 | LPTIM_CFGR1_TRIGSEL_1 | LPTIM_CFGR1_TRIGSEL_0 ) +#define LPTIM_TRIGSOURCE_12 ( LPTIM_CFGR1_TRIGSEL_3 | LPTIM_CFGR1_TRIGSEL_2 ) +#define LPTIM_TRIGSOURCE_13 ( LPTIM_CFGR1_TRIGSEL_3 | LPTIM_CFGR1_TRIGSEL_2 |LPTIM_CFGR1_TRIGSEL_0) +#define LPTIM_TRIGSOURCE_14 ( LPTIM_CFGR1_TRIGSEL_3 | LPTIM_CFGR1_TRIGSEL_2 |LPTIM_CFGR1_TRIGSEL_1) +#define LPTIM_TRIGSOURCE_15 ( LPTIM_CFGR1_TRIGSEL_3 | LPTIM_CFGR1_TRIGSEL_2 |LPTIM_CFGR1_TRIGSEL_1|LPTIM_CFGR1_TRIGSEL_0) + + +/** + * @} + */ + +/** @defgroup LPTIM_TriggerPolarity + * @{ + */ + +#define LPTIM_TRIGPOLARITY_RISING ( LPTIM_CFGR1_TRIGEN_0 ) +#define LPTIM_TRIGPOLARITY_FALLING ( LPTIM_CFGR1_TRIGEN_1 ) +#define LPTIM_TRIGPOLARITY_RISING_FALLING ( LPTIM_CFGR1_TRIGEN_1 | LPTIM_CFGR1_TRIGEN_0 ) + +/** + * @} + */ + +/** @defgroup LPTIM_TriggerFilter + * @{ + */ + +#define LPTIM_TRIGFILTER_DISABLE ( 0U ) +#define LPTIM_TRIGFILTER_2CLK ( LPTIM_CFGR1_TRGFLT_0 ) +#define LPTIM_TRIGFILTER_4CLK ( LPTIM_CFGR1_TRGFLT_1 ) +#define LPTIM_TRIGFILTER_8CLK ( LPTIM_CFGR1_TRGFLT_1 | LPTIM_CFGR1_TRGFLT_0 ) + +/** + * @} + */ + + +/** @defgroup LPTIM_WaveformPolarity + * @{ + */ + +#define LPTIM_WAVEFORMPOLARITY_HIGH ( 0U ) +#define LPTIM_WAVEFORMPOLARITY_LOW ( LPTIM_CFGR1_WAVPOL ) + +/** + * @} + */ + +/** @defgroup LPTIM_UpdatingMode + * @{ + */ + +#define LPTIM_UPDATE_IMMEDIATE ( 0U ) +#define LPTIM_UPDATE_ENDOFPERIOD ( LPTIM_CFGR1_PRELOAD ) + +/** + * @} + */ + +/** @defgroup LPTIM_CounterSource + * @{ + */ + +#define LPTIM_COUNTERSOURCE_INTERNAL ( 0U ) +#define LPTIM_COUNTERSOURCE_EXTERNAL ( LPTIM_CFGR1_COUNTMODE ) + +/** + * @} + */ + +/** @defgroup LPTIM_Input1_Source LPTIM Input1 Source + * @{ + */ + +#define LPTIM_INPUT1SOURCE_0 ( 0U ) +#define LPTIM_INPUT1SOURCE_1 ( LPTIM_CFGR2_IN1SEL_0 ) +#define LPTIM_INPUT1SOURCE_2 ( LPTIM_CFGR2_IN1SEL_1 ) +#define LPTIM_INPUT1SOURCE_3 ( LPTIM_CFGR2_IN1SEL_1 | LPTIM_CFGR2_IN1SEL_0 ) + +#define LPTIM_INPUT1SOURCE_4 ( LPTIM_CFGR2_IN1SEL_2 ) +#define LPTIM_INPUT1SOURCE_5 ( LPTIM_CFGR2_IN1SEL_2 | LPTIM_CFGR2_IN1SEL_0 ) +#define LPTIM_INPUT1SOURCE_6 ( LPTIM_CFGR2_IN1SEL_2 | LPTIM_CFGR2_IN1SEL_1 ) +#define LPTIM_INPUT1SOURCE_7 ( LPTIM_CFGR2_IN1SEL_2 | LPTIM_CFGR2_IN1SEL_1 | LPTIM_CFGR2_IN1SEL_0 ) + +#define LPTIM_INPUT1SOURCE_8 ( LPTIM_CFGR2_IN1SEL_3 ) +#define LPTIM_INPUT1SOURCE_9 ( LPTIM_CFGR2_IN1SEL_3 | LPTIM_CFGR2_IN1SEL_0 ) +#define LPTIM_INPUT1SOURCE_10 ( LPTIM_CFGR2_IN1SEL_3 | LPTIM_CFGR2_IN1SEL_1 ) +#define LPTIM_INPUT1SOURCE_11 ( LPTIM_CFGR2_IN1SEL_3 | LPTIM_CFGR2_IN1SEL_1 | LPTIM_CFGR2_IN1SEL_0 ) +#define LPTIM_INPUT1SOURCE_12 ( LPTIM_CFGR2_IN1SEL_3 | LPTIM_CFGR2_IN1SEL_2 ) +#define LPTIM_INPUT1SOURCE_13 ( LPTIM_CFGR2_IN1SEL_3 | LPTIM_CFGR2_IN1SEL_2 | LPTIM_CFGR2_IN1SEL_0 ) +#define LPTIM_INPUT1SOURCE_14 ( LPTIM_CFGR2_IN1SEL_3 | LPTIM_CFGR2_IN1SEL_2 | LPTIM_CFGR2_IN1SEL_1 ) +#define LPTIM_INPUT1SOURCE_15 ( LPTIM_CFGR2_IN1SEL_3 | LPTIM_CFGR2_IN1SEL_2 | LPTIM_CFGR2_IN1SEL_1 | LPTIM_CFGR2_IN1SEL_0 ) + +/** + * @} + */ + +/** @defgroup LPTIM_Input2_Source LPTIM Input2 Source + * @{ + */ + +#define LPTIM_INPUT2SOURCE_0 ( 0U ) +#define LPTIM_INPUT2SOURCE_1 ( LPTIM_CFGR2_IN2SEL_0 ) +#define LPTIM_INPUT2SOURCE_2 ( LPTIM_CFGR2_IN2SEL_1 ) +#define LPTIM_INPUT2SOURCE_3 ( LPTIM_CFGR2_IN2SEL_1 | LPTIM_CFGR2_IN2SEL_0 ) + +#define LPTIM_INPUT2SOURCE_4 ( LPTIM_CFGR2_IN2SEL_2 ) +#define LPTIM_INPUT2SOURCE_5 ( LPTIM_CFGR2_IN2SEL_2 | LPTIM_CFGR2_IN2SEL_0 ) +#define LPTIM_INPUT2SOURCE_6 ( LPTIM_CFGR2_IN2SEL_2 | LPTIM_CFGR2_IN2SEL_1 ) +#define LPTIM_INPUT2SOURCE_7 ( LPTIM_CFGR2_IN2SEL_2 | LPTIM_CFGR2_IN2SEL_1 | LPTIM_CFGR2_IN2SEL_0 ) + +#define LPTIM_INPUT2SOURCE_8 ( LPTIM_CFGR2_IN2SEL_3 ) +#define LPTIM_INPUT2SOURCE_9 ( LPTIM_CFGR2_IN2SEL_3 | LPTIM_CFGR2_IN2SEL_0 ) +#define LPTIM_INPUT2SOURCE_10 ( LPTIM_CFGR2_IN2SEL_3 | LPTIM_CFGR2_IN2SEL_1 ) +#define LPTIM_INPUT2SOURCE_11 ( LPTIM_CFGR2_IN2SEL_3 | LPTIM_CFGR2_IN2SEL_1 | LPTIM_CFGR2_IN2SEL_0 ) +#define LPTIM_INPUT2SOURCE_12 ( LPTIM_CFGR2_IN2SEL_3 | LPTIM_CFGR2_IN2SEL_2 ) +#define LPTIM_INPUT2SOURCE_13 ( LPTIM_CFGR2_IN2SEL_3 | LPTIM_CFGR2_IN2SEL_2 | LPTIM_CFGR2_IN2SEL_0 ) +#define LPTIM_INPUT2SOURCE_14 ( LPTIM_CFGR2_IN2SEL_3 | LPTIM_CFGR2_IN2SEL_2 | LPTIM_CFGR2_IN2SEL_1 ) +#define LPTIM_INPUT2SOURCE_15 ( LPTIM_CFGR2_IN2SEL_3 | LPTIM_CFGR2_IN2SEL_2 | LPTIM_CFGR2_IN2SEL_1 | LPTIM_CFGR2_IN2SEL_0 ) + + +/** + * @} + */ + + +/** @defgroup LPTIM_Flags + * @{ + */ + +#define LPTIM_FLAG_REPOK ( LPTIM_ISR_REPOK ) +#define LPTIM_FLAG_REPUE ( LPTIM_ISR_REPUE ) +#define LPTIM_FLAG_DOWN ( LPTIM_ISR_DOWN ) +#define LPTIM_FLAG_UP ( LPTIM_ISR_UP ) +#define LPTIM_FLAG_ARROK ( LPTIM_ISR_ARROK ) +#define LPTIM_FLAG_CMPOK ( LPTIM_ISR_CMPOK ) +#define LPTIM_FLAG_EXTTRIG ( LPTIM_ISR_EXTTRIG ) +#define LPTIM_FLAG_ARRM ( LPTIM_ISR_ARRM ) +#define LPTIM_FLAG_CMPM ( LPTIM_ISR_CMPM ) + +/** + * @} + */ + +/** @defgroup LPTIM_IT + * @{ + */ + +#define LPTIM_IT_REPOK ( LPTIM_IER_REPOKIE ) +#define LPTIM_IT_REPUE ( LPTIM_IER_REPUEIE ) +#define LPTIM_IT_DOWN ( LPTIM_IER_DOWNIE ) +#define LPTIM_IT_UP ( LPTIM_IER_UPIE ) +#define LPTIM_IT_ARROK ( LPTIM_IER_ARROKIE ) +#define LPTIM_IT_CMPOK ( LPTIM_IER_CMPOKIE ) +#define LPTIM_IT_EXTTRIG ( LPTIM_IER_EXTTRIGIE ) +#define LPTIM_IT_ARRM ( LPTIM_IER_ARRMIE ) +#define LPTIM_IT_CMPM ( LPTIM_IER_CMPMIE ) + +/** + * @} + */ + +/** @brief IT mask for assert test + */ +#define LPTIM_IT_MASK ( LPTIM_IT_REPOK | LPTIM_IT_REPUE | LPTIM_IT_DOWN | \ + LPTIM_IT_UP | LPTIM_IT_ARROK | LPTIM_IT_CMPOK | \ + LPTIM_IT_EXTTRIG | LPTIM_IT_ARRM | LPTIM_IT_CMPM ) + + + +/* Exported macros -----------------------------------------------------------*/ +/** @defgroup LPTIM_Exported_Macros LPTIM Exported Macros + * @{ + */ + +/** + * @brief Enable the LPTIM peripheral. + * @param __HANDLE__ LPTIM handle + * @retval None + */ + +#define __HAL_LPTIM_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= (LPTIM_CR_ENABLE)) + +/** + * @brief Disable the LPTIM peripheral. + * @param __HANDLE__ LPTIM handle. + * @retval None + */ + +#define __HAL_LPTIM_DISABLE(__HANDLE__) LPTIM_Disable(__HANDLE__) + +/** + * @brief Start the LPTIM peripheral in Continuous mode. + * @param __HANDLE__ LPTIM handle + * @retval None + */ + +#define __HAL_LPTIM_START_CONTINUOUS(__HANDLE__) ((__HANDLE__)->Instance->CR |= LPTIM_CR_CNTSTRT) + +/** + * @brief Start the LPTIM peripheral in single mode. + * @param __HANDLE__ LPTIM handle + * @retval None + */ + +#define __HAL_LPTIM_START_SINGLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= LPTIM_CR_SNGSTRT) + +/** + * @brief Reset the LPTIM Counter register in synchronous mode. + * @param __HANDLE__ LPTIM handle + * @retval None + */ + +#define __HAL_LPTIM_RESET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CR |= LPTIM_CR_COUNTRST) + +/** + * @brief Enable Reset after read of the LPTIM Counter register in asynchronous mode. + * @param __HANDLE__ LPTIM handle + * @retval None + */ + +#define __HAL_LPTIM_RESET_COUNTER_AFTER_READ_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= LPTIM_CR_RSTARE) + +/** + * @brief Disable Reset after read of the LPTIM Counter register in asynchronous mode. + * @param __HANDLE__ LPTIM handle + * @retval None + */ + +#define __HAL_LPTIM_RESET_COUNTER_AFTER_READ_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~LPTIM_CR_RSTARE) + +/** + * @brief Return the current Autoreload (Period) value. + * @param __HANDLE__ LPTIM handle + * @retval Autoreload value + */ + +#define __HAL_LPTIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) + +/** + * @brief Write the passed parameter in the Autoreload register. + * @param __HANDLE__ LPTIM handle + * @param __VALUE__ Autoreload value + * @retval None + * @note The ARR register can only be modified when the LPTIM instance is enabled. + */ + +#define __HAL_LPTIM_SET_AUTORELOAD(__HANDLE__ , __VALUE__) ((__HANDLE__)->Instance->ARR = (__VALUE__)) + +/** + * @brief Return the current Compare (Pulse/Timeout) value. + * @param __HANDLE__ LPTIM handle + * @retval Compare value + * @note The CMP register can only be modified when the LPTIM instance is enabled. + */ + +#define __HAL_LPTIM_GET_COMPARE(__HANDLE__) ((__HANDLE__)->Instance->CMP) + +/** + * @brief Write the passed parameter in the Compare register. + * @param __HANDLE__ LPTIM handle + * @param __VALUE__ Compare value + * @retval None + * @note The CMP register can only be modified when the LPTIM instance is enabled. + */ + +#define __HAL_LPTIM_SET_COMPARE(__HANDLE__ , __VALUE__) ((__HANDLE__)->Instance->CMP = (__VALUE__)) + +/** + * @brief Return the current Repetition Counter value. + * @param __HANDLE__ LPTIM handle + * @retval Repetition Counter value + */ + +#define __HAL_LPTIM_GET_REPETITION_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->RCR) + +/** + * @brief Write the passed parameter in the repetition counter register. + * @param __HANDLE__ LPTIM handle + * @param __VALUE__ Repetition counter value + * @retval None + * @note The RCR register can only be modified when the LPTIM instance is enabled. + */ + +#define __HAL_LPTIM_SET_REPETITION_COUNTER(__HANDLE__ , __VALUE__) ((__HANDLE__)->Instance->RCR = (__VALUE__)) + +/** + * @brief Return the current Counter value. + * @param __HANDLE__ LPTIM handle + * @retval Counter value + */ + +#define __HAL_LPTIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->RCR) + +/** + * @brief Check whether the specified LPTIM flag is set or not. + * @param __HANDLE__ LPTIM handle + * @param __FLAG__ LPTIM flag to check + * This parameter can be a value of: + * @arg LPTIM_FLAG_REPOK : Repeat register update OK up Flag. + * @arg LPTIM_FLAG_REPUE : Update events occurs up Flag. + * @arg LPTIM_FLAG_DOWN : Counter direction change up Flag. + * @arg LPTIM_FLAG_UP : Counter direction change down to up Flag. + * @arg LPTIM_FLAG_ARROK : Autoreload register update OK Flag. + * @arg LPTIM_FLAG_CMPOK : Compare register update OK Flag. + * @arg LPTIM_FLAG_EXTTRIG : External trigger edge event Flag. + * @arg LPTIM_FLAG_ARRM : Autoreload match Flag. + * @arg LPTIM_FLAG_CMPM : Compare match Flag. + * @retval The state of the specified flag (SET or RESET). + */ + +#define __HAL_LPTIM_GET_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ISR &(__FLAG__)) + +/** + * @brief Clear the specified LPTIM flag. + * @param __HANDLE__ LPTIM handle. + * @param __FLAG__ LPTIM flag to clear. + * This parameter can be a combination of: + * @arg LPTIM_FLAG_REPOK : Repeat register update OK up Flag. + * @arg LPTIM_FLAG_REPUE : Update events occurs up Flag. + * @arg LPTIM_FLAG_DOWN : Counter direction change up Flag. + * @arg LPTIM_FLAG_UP : Counter direction change down to up Flag. + * @arg LPTIM_FLAG_ARROK : Autoreload register update OK Flag. + * @arg LPTIM_FLAG_CMPOK : Compare register update OK Flag. + * @arg LPTIM_FLAG_EXTTRIG : External trigger edge event Flag. + * @arg LPTIM_FLAG_ARRM : Autoreload match Flag. + * @arg LPTIM_FLAG_CMPM : Compare match Flag. + * @retval None. + */ + +#define __HAL_LPTIM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ICR = (__FLAG__)) + +/** + * @brief Enable the specified LPTIM interrupt. + * @param __HANDLE__ LPTIM handle. + * @param __INTERRUPT__ LPTIM interrupt to set. + * This parameter can be a combination of: + * @arg LPTIM_IT_REPOK : Repeat register update OK up Interrupt. + * @arg LPTIM_IT_REPUE : Update events occurs up Interrupt. + * @arg LPTIM_IT_DOWN : Counter direction change up Interrupt. + * @arg LPTIM_IT_UP : Counter direction change down to up Interrupt. + * @arg LPTIM_IT_ARROK : Autoreload register update OK Interrupt. + * @arg LPTIM_IT_CMPOK : Compare register update OK Interrupt. + * @arg LPTIM_IT_EXTTRIG : External trigger edge event Interrupt. + * @arg LPTIM_IT_ARRM : Autoreload match Interrupt. + * @arg LPTIM_IT_CMPM : Compare match Interrupt. + * @retval None. + * @note The LPTIM interrupts can only be enabled when the LPTIM instance is disabled. + */ + +#define __HAL_LPTIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER |= (__INTERRUPT__)) + +/** + * @brief Disable the specified LPTIM interrupt. + * @param __HANDLE__ LPTIM handle. + * @param __INTERRUPT__ LPTIM interrupt to set. + * This parameter can be a combination of: + * @arg LPTIM_IT_REPOK : Repeat register update OK up Interrupt. + * @arg LPTIM_IT_REPUE : Update events occurs up Interrupt. + * @arg LPTIM_IT_DOWN : Counter direction change up Interrupt. + * @arg LPTIM_IT_UP : Counter direction change down to up Interrupt. + * @arg LPTIM_IT_ARROK : Autoreload register update OK Interrupt. + * @arg LPTIM_IT_CMPOK : Compare register update OK Interrupt. + * @arg LPTIM_IT_EXTTRIG : External trigger edge event Interrupt. + * @arg LPTIM_IT_ARRM : Autoreload match Interrupt. + * @arg LPTIM_IT_CMPM : Compare match Interrupt. + * @retval None. + * @note The LPTIM interrupts can only be disabled when the LPTIM instance is disabled. + */ + +#define __HAL_LPTIM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER &= (~(__INTERRUPT__))) + +/** + * @brief Check whether the specified LPTIM interrupt source is enabled or not. + * @param __HANDLE__ LPTIM handle. + * @param __INTERRUPT__ LPTIM interrupt to check. + * This parameter can be a value of: + * @arg LPTIM_IT_REPOK : Repeat register update OK up Interrupt. + * @arg LPTIM_IT_REPUE : Update events occurs up Interrupt. + * @arg LPTIM_IT_DOWN : Counter direction change up Interrupt. + * @arg LPTIM_IT_UP : Counter direction change down to up Interrupt. + * @arg LPTIM_IT_ARROK : Autoreload register update OK Interrupt. + * @arg LPTIM_IT_CMPOK : Compare register update OK Interrupt. + * @arg LPTIM_IT_EXTTRIG : External trigger edge event Interrupt. + * @arg LPTIM_IT_ARRM : Autoreload match Interrupt. + * @arg LPTIM_IT_CMPM : Compare match Interrupt. + * @retval Interrupt status. + */ + +#define __HAL_LPTIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER & (__INTERRUPT__)) + +/** + * @} + */ + + + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup LPTIM_Private_Macros LPTIM Private Macros + * @{ + */ + +#define IS_LPTIM_INSTANCE(__INSTANCE__) ((__INSTANCE__) == LPTIM1||\ + (__INSTANCE__) == LPTIM2||\ + (__INSTANCE__) == LPTIM3||\ + (__INSTANCE__) == LPTIM4||\ + (__INSTANCE__) == LPTIM5||\ + (__INSTANCE__) == LPTIM6) + +#define IS_LPTIM_CLOCK_SOURCE(__SOURCE__) (((__SOURCE__) == LPTIM_CLOCKSOURCE_INTERNAL_PCLK) || \ + ((__SOURCE__) == LPTIM_CLOCKSOURCE_INTERNAL_RCL) || \ + ((__SOURCE__) == LPTIM_CLOCKSOURCE_INTERNAL_RCH) || \ + ((__SOURCE__) == LPTIM_CLOCKSOURCE_INTERNAL_XTL) || \ + ((__SOURCE__) == LPTIM_CLOCKSOURCE_EXTERNAL_INPUT1)) + +#define IS_LPTIM_CLOCK_PRESCALER(__PRESCALER__) (((__PRESCALER__) == LPTIM_CLOCKPRESCALER_DIV1) || \ + ((__PRESCALER__) == LPTIM_CLOCKPRESCALER_DIV2) || \ + ((__PRESCALER__) == LPTIM_CLOCKPRESCALER_DIV4) || \ + ((__PRESCALER__) == LPTIM_CLOCKPRESCALER_DIV8) || \ + ((__PRESCALER__) == LPTIM_CLOCKPRESCALER_DIV16) || \ + ((__PRESCALER__) == LPTIM_CLOCKPRESCALER_DIV32) || \ + ((__PRESCALER__) == LPTIM_CLOCKPRESCALER_DIV64) || \ + ((__PRESCALER__) == LPTIM_CLOCKPRESCALER_DIV128)) + +#define IS_LPTIM_TRIG_SOURCE(__TRIG__) (((__TRIG__) == LPTIM_TRIGSOURCE_SOFTWARE) || \ + ((__TRIG__) >= LPTIM_TRIGSOURCE_0) && \ + ((__TRIG__) <= LPTIM_TRIGSOURCE_15)) + + +#define IS_LPTIM_TRIG_POLARITY(__POLARITY__) (((__POLARITY__) == LPTIM_TRIGPOLARITY_RISING) || \ + ((__POLARITY__) == LPTIM_TRIGPOLARITY_FALLING) || \ + ((__POLARITY__) == LPTIM_TRIGPOLARITY_RISING_FALLING)) + + +#define IS_LPTIM_TRIG_FILTER(__FILTER__) (((__FILTER__) == LPTIM_TRIGFILTER_DISABLE) || \ + ((__FILTER__) == LPTIM_TRIGFILTER_2CLK) || \ + ((__FILTER__) == LPTIM_TRIGFILTER_4CLK) || \ + ((__FILTER__) == LPTIM_TRIGFILTER_8CLK)) + +#define IS_LPTIM_COUNTER_SOURCE(__SOURCE__) (((__SOURCE__) == LPTIM_COUNTERSOURCE_INTERNAL) || \ + ((__SOURCE__) == LPTIM_COUNTERSOURCE_EXTERNAL)) + + +#define IS_LPTIM_COUNTER_POLARITY(__POLARITY__) (((__POLARITY__) == LPTIM_COUNTERPOLARITY_RISING) || \ + ((__POLARITY__) == LPTIM_COUNTERPOLARITY_FALLING) || \ + ((__POLARITY__) == LPTIM_COUNTERPOLARITY_RISING_FALLING)) + + + +#define IS_LPTIM_COUNTER_FILTER(__FILTER__) (((__FILTER__) == LPTIM_COUNTERFILTER_DISABLE) || \ + ((__FILTER__) == LPTIM_COUNTERFILTER_CLK2) || \ + ((__FILTER__) == LPTIM_COUNTERFILTER_CLK4) || \ + ((__FILTER__) == LPTIM_COUNTERFILTER_CLK8)) + +#define IS_LPTIM_WAVEFORM_POLARITY(__POLARITY__) (((__POLARITY__) == LPTIM_WAVEFORMPOLARITY_LOW) || \ + ((__POLARITY__) == LPTIM_WAVEFORMPOLARITY_HIGH)) + + +#define IS_LPTIM_UPDATE_MODE(__MODE__) (((__MODE__) == LPTIM_UPDATE_IMMEDIATE) || \ + ((__MODE__) == LPTIM_UPDATE_ENDOFPERIOD)) + +#define IS_LPTIM_AUTORELOAD(__AUTORELOAD__) (((__AUTORELOAD__) <= 0x0000FFFFUL) && ((__AUTORELOAD__) != 0UL)) + +#define IS_LPTIM_COMPARE(__COMPARE__) ((__COMPARE__) < 0x0000FFFFUL) + +#define IS_LPTIM_PERIOD(__PERIOD__) IS_LPTIM_AUTORELOAD(__PERIOD__) + +#define IS_LPTIM_PULSE(__PULSE__) IS_LPTIM_COMPARE(__PULSE__) + +#define IS_LPTIM_TIMEOUT(__TIMEOUT__) IS_LPTIM_COMPARE(__TIMEOUT__) + +#define IS_LPTIM_REPETITION_COUNTER(__COUNTER__) ((__COUNTER__) <= 0xFFUL) + +#define IS_LPTIM_INPUT1_SOURCE(__SOURCE__) (((__SOURCE__) >= LPTIM_INPUT1SOURCE_0) || \ + ((__SOURCE__) <= LPTIM_INPUT1SOURCE_15)) + + +#define IS_LPTIM_INPUT2_SOURCE(__SOURCE__) (((__SOURCE__) >= LPTIM_INPUT2SOURCE_0) && \ + ((__SOURCE__) <= LPTIM_INPUT2SOURCE_15)) + +#define IS_LPTIM_IT(__IT__) ((((uint32_t)(__IT__) & LPTIM_IT_MASK) != 0x00u) && \ + (((uint32_t)(__IT__) & ~LPTIM_IT_MASK) == 0x00u)) + + +#define IS_LPTIM_CALLBACKID(__CALLBACKID__) (((__CALLBACKID__) == HAL_LPTIM_COMPARE_MATCH_CB_ID) ||\ + ((__CALLBACKID__) == HAL_LPTIM_AUTORELOAD_MATCH_CB_ID) ||\ + ((__CALLBACKID__) == HAL_LPTIM_TRIGGER_CB_ID) ||\ + ((__CALLBACKID__) == HAL_LPTIM_COMPARE_WRITE_CB_ID) ||\ + ((__CALLBACKID__) == HAL_LPTIM_AUTORELOAD_WRITE_CB_ID) ||\ + ((__CALLBACKID__) == HAL_LPTIM_DIRECTION_UP_CB_ID) ||\ + ((__CALLBACKID__) == HAL_LPTIM_DIRECTION_DOWN_CB_ID) ||\ + ((__CALLBACKID__) == HAL_LPTIM_REPETITION_UPDATE_CB_ID) ||\ + ((__CALLBACKID__) == HAL_LPTIM_REPETITION_WRITE_CB_ID)) + + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +void HAL_LPTIM_IRQHandler(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_Init(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_DeInit(LPTIM_HandleTypeDef *hlptim); +void HAL_LPTIM_MspInit(LPTIM_HandleTypeDef *hlptim); +void HAL_LPTIM_MspDeInit(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_ConfigCountValue(LPTIM_HandleTypeDef *hlptim, uint8_t RepetitionCounter, \ + uint16_t Period, uint16_t PulseOrTimeout); +HAL_StatusTypeDef HAL_LPTIM_EnableIT(LPTIM_HandleTypeDef *hlptim, uint32_t IT); +HAL_StatusTypeDef HAL_LPTIM_DisableIT(LPTIM_HandleTypeDef *hlptim, uint32_t IT); +HAL_StatusTypeDef HAL_LPTIM_PWM_Start(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_PWM_Stop(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_OnePulse_Start(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_OnePulse_Stop(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_SetOnce_Start(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_SetOnce_Stop(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_Encoder_Start(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_Encoder_Stop(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_Timeout_Start(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_Timeout_Stop(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_Counter_Start(LPTIM_HandleTypeDef *hlptim); +HAL_StatusTypeDef HAL_LPTIM_Counter_Stop(LPTIM_HandleTypeDef *hlptim); + +HAL_StatusTypeDef HAL_LPTIM_RegisterCallback(LPTIM_HandleTypeDef *hlptim, + uint32_t CallbackID, + pLPTIM_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_LPTIM_UnRegisterCallback(LPTIM_HandleTypeDef *hlptim, + uint32_t CallbackID); + + +#endif // #ifndef __HAL_LPTIM_H__ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_lpuart.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_lpuart.h new file mode 100644 index 0000000000..f874db08fc --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_lpuart.h @@ -0,0 +1,412 @@ + +/****************************************************************************** +*@file : hal_lpuart.h +*@brief : Header file of LPUART HAL module. +******************************************************************************/ + +#ifndef __HAL_LPUART_H__ +#define __HAL_LPUART_H__ + +#include "hal.h" + +/** + * @brief LPUART Init structure definition + */ +typedef struct +{ + uint32_t BaudRate; /*!< This member configures the UART communication baud rate. + This parameter can be a value of @ref LPUART_BaudRate. */ + + uint32_t WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. + This parameter can be a value of @ref LPUART_WordLength. */ + + uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. + This parameter can be a value of @ref LPUART_StopBits. */ + + uint32_t Parity; /*!< Specifies the parity mode. + This parameter can be a value of @ref LPUART_Parity*/ + + uint32_t Mode; /*!< Specifies whether the Receive or Transmit mode is enabled or disabled. + This parameter can be a value of @ref LPUART_Mode. */ + + uint32_t ClockSource; /*!< Specifies the clock source of LPUART. + This parameter can be a value of @ref LPUART_ClockSource. */ + + uint32_t WakeupMode; /*!< Specifies the wakeup Mode. + This parameter can be a value of @ref LPUART_WakeupMode. */ + + uint32_t WakeupAddr; /*!< Specifies the address of the wakeup matching. + This parameter can be a value of @ref LPUART_WakeupAddr. */ + +} LPUART_InitTypeDef; + + +/** + * @brief LPUART handle structure definition + */ + +typedef struct __LPUART_HandleTypeDef +{ + LPUART_TypeDef *Instance; /*!< Register base address */ + LPUART_InitTypeDef Init; /*!< communication parameters */ + DMA_HandleTypeDef *hdmatx; /*!< Tx DMA Handle parameters */ + DMA_HandleTypeDef *hdmarx; /*!< Rx DMA Handle parameters */ + + uint32_t TxState; /*!< Tx state */ + uint32_t TxError; /*!< Tx Error flag */ + uint8_t *pTxBuf; /*!< Tx buffer pointer */ + uint32_t TxCount; /*!< Tx size not transfer */ + uint32_t TxAbort; /*!< Tx abort flag in block mode*/ + + uint32_t RxState; /*!< Rx state */ + uint32_t RxError; /*!< Rx Error flag */ + uint8_t *pRxBuf; /*!< Rx buffer pointer */ + uint32_t RxCount; /*!< Rx size not transfer */ + uint32_t RxAbort; /*!< Rx abort flag in block mode*/ + + void (*TxCpltCallback)(struct __LPUART_HandleTypeDef *); /* tx complete callback */ + void (*TxHalfCpltCallback)(struct __LPUART_HandleTypeDef *); /* tx complete callback */ + void (*TxErrorCallback)(struct __LPUART_HandleTypeDef *); /* error callback */ + void (*RxCpltCallback)(struct __LPUART_HandleTypeDef *); /* rx recv complete callback */ + void (*RxHalfCpltCallback)(struct __LPUART_HandleTypeDef *); /* rx recv complete callback */ + void (*RxErrorCallback)(struct __LPUART_HandleTypeDef *); /* error callback */ + void (*WakeupCallback)(struct __LPUART_HandleTypeDef *); /* wakeup callback */ + void (*BcntCallback)(struct __LPUART_HandleTypeDef *); /* bit count callback */ + void (*IdleCallback)(struct __LPUART_HandleTypeDef *); /* idle callback */ + +}LPUART_HandleTypeDef; + + +/** + * @brief HAL LPUART Callback pointer definition + */ + +typedef void (*pLPUART_CallbackTypeDef)(LPUART_HandleTypeDef *hlpuart); /*!< pointer to the LPUART callback function */ + +/****************************************************************************** +*@brief : LPUART receive mode enum +* +*@note : the enum is used in receive function: HAL_LPUART_Receive_To_Idle_BCNT +******************************************************************************/ +typedef enum +{ + LPUART_RECEIVE_TOIDLE, /*!< end of receiving data by idle line checked */ + LPUART_RECEIVE_TOBCNT, /*!< end of receiving data by bit count value reached */ +}LPUART_Receive_Mode_Enum; + + +/** @defgroup LPUART_WordLength + * @{ + */ + +#define LPUART_WORDLENGTH_7B ( LPUART_LCR_WLEN ) +#define LPUART_WORDLENGTH_8B ( 0U ) + +/** + * @} + */ + +/** @defgroup LPUART_StopBits + * @{ + */ + +#define LPUART_STOPBITS_1B ( 0U ) +#define LPUART_STOPBITS_2B ( LPUART_LCR_STP2 ) + +/** + * @} + */ + +/** @defgroup LPUART_Parity + * @{ + */ + +#define LPUART_PARITY_NONE ( 0U ) +#define LPUART_PARITY_ODD ( LPUART_LCR_PEN ) +#define LPUART_PARITY_EVEN ( LPUART_LCR_PEN | LPUART_LCR_EPS ) +#define LPUART_PARITY_0 ( LPUART_LCR_PEN | LPUART_LCR_SPS | LPUART_LCR_EPS) +#define LPUART_PARITY_1 ( LPUART_LCR_PEN | LPUART_LCR_SPS ) + +/** + * @} + */ + +/** @defgroup LPUART_ClockSource + * @{ + */ + +#define LPUART_CLOCKSOURCE_RCL ( RCC_LPUART1_CLK_SOURCE_RCL ) +#define LPUART_CLOCKSOURCE_XTL ( RCC_LPUART1_CLK_SOURCE_XTL ) +#define LPUART_CLOCKSOURCE_PCLK_DIV4 ( RCC_LPUART1_CLK_SOURCE_PCLK1_DIV4) +#define LPUART_CLOCKSOURCE_PCLK_DIV8 ( RCC_LPUART1_CLK_SOURCE_PCLK1_DIV8) +#define LPUART_CLOCKSOURCE_PCLK_DIV16 ( RCC_LPUART1_CLK_SOURCE_PCLK1_DIV16) +#define LPUART_CLOCKSOURCE_PCLK_DIV32 ( RCC_LPUART1_CLK_SOURCE_PCLK1_DIV32) + +/** + * @} + */ + +/** @defgroup LPUART_Mode + * @{ + */ + +#define LPUART_MODE_TX ( LPUART_CR_TX_EN ) +#define LPUART_MODE_RX ( LPUART_CR_RX_EN ) +#define LPUART_MODE_TXRX ( LPUART_CR_TX_EN | LPUART_CR_RX_EN ) + +/** + * @} + */ + +/** @defgroup LPUART_WakeupMode + * @{ + */ + +#define LPUART_WAKEUPMODE_NONE ( LPUART_LCR_RXWKS ) +#define LPUART_WAKEUPMODE_STARTBIT ( 0U ) +#define LPUART_WAKEUPMODE_ONEBYTENOCHECK ( LPUART_LCR_RXWKS_0 ) +#define LPUART_WAKEUPMODE_ONEBYTECHECK ( LPUART_LCR_RXWKS_0 | LPUART_LCR_WKCK ) +#define LPUART_WAKEUPMODE_ADDRNOCHECK ( LPUART_LCR_RXWKS_1 ) +#define LPUART_WAKEUPMODE_ADDRCHECK ( LPUART_LCR_RXWKS_1 | LPUART_LCR_WKCK) + +/** + * @} + */ + +/** @defgroup LPUART_CallbackID + * @{ + */ + +#define LPUART_CALLBACKID_TXCPLT ( 0U ) +#define LPUART_CALLBACKID_TXHALFCPLT ( 1U ) +#define LPUART_CALLBACKID_TXERROR ( 2U ) +#define LPUART_CALLBACKID_RXCPLT ( 3U ) +#define LPUART_CALLBACKID_RXHALFCPLT ( 4U ) +#define LPUART_CALLBACKID_RXERROR ( 5U ) +#define LPUART_CALLBACKID_WAKEUP ( 6U ) +#define LPUART_CALLBACKID_BCNT ( 7U ) +#define LPUART_CALLBACKID_IDLE ( 8U ) + +/** + * @} + */ + +/** @defgroup LPUART_IT + * @{ + */ + +#define LPUART_IT_START ( LPUART_IE_STARTIE ) +#define LPUART_IT_MATCH ( LPUART_IE_MATCHIE ) +#define LPUART_IT_RXOV ( LPUART_IE_RXOVIE ) +#define LPUART_IT_FE ( LPUART_IE_FEIE ) +#define LPUART_IT_PE ( LPUART_IE_PEIE ) +#define LPUART_IT_TXE ( LPUART_IE_TXEIE ) +#define LPUART_IT_TC ( LPUART_IE_TCIE ) +#define LPUART_IT_RX ( LPUART_IE_RXIE ) +#define LPUART_IT_IDLE ( LPUART_IE_IDLEIE ) +#define LPUART_IT_BCNT ( LPUART_IE_BCNTIE ) +/** + * @} + */ + +/** + * @brief + */ + +#define LPUART_IT_MASK ( LPUART_IT_START | LPUART_IT_MATCH | \ + LPUART_IT_RXOV | LPUART_IT_FE | \ + LPUART_IT_PE | LPUART_IT_TXE | \ + LPUART_IT_TC | LPUART_IT_RX | \ + LPUART_IE_BCNTIE | LPUART_IE_IDLEIE) + +/** @defgroup LPUART_Flags + * @{ + */ + +#define LPUART_FLAG_TXE ( LPUART_SR_TXE ) +#define LPUART_FLAG_STARTIF ( LPUART_SR_STARTIF ) +#define LPUART_FLAG_MATCHIF ( LPUART_SR_MATCHIF ) +#define LPUART_FLAG_TXOVF ( LPUART_SR_TXOVF ) +#define LPUART_FLAG_RXF ( LPUART_SR_RXF ) +#define LPUART_FLAG_RXOVIF ( LPUART_SR_RXOVIF ) +#define LPUART_FLAG_FEIF ( LPUART_SR_FEIF ) +#define LPUART_FLAG_PEIF ( LPUART_SR_PEIF ) +#define LPUART_FLAG_TXEIF ( LPUART_SR_TXEIF ) +#define LPUART_FLAG_TCIF ( LPUART_SR_TCIF ) +#define LPUART_FLAG_RXIF ( LPUART_SR_RXIF ) +#define LPUART_FLAG_IDLEIF ( LPUART_SR_IDLEIF ) +#define LPUART_FLAG_BCNTIF ( LPUART_SR_BCNTIF ) +/** + * @} + */ + +/** + * @brief + */ + +#define LPUART_IT_FLAG_MASK ( LPUART_FLAG_STARTIF | LPUART_FLAG_MATCHIF | \ + LPUART_FLAG_RXOVIF | LPUART_FLAG_FEIF | \ + LPUART_FLAG_PEIF | LPUART_FLAG_TXEIF | \ + LPUART_FLAG_TCIF | LPUART_FLAG_RXIF |\ + LPUART_FLAG_IDLEIF | LPUART_FLAG_BCNTIF) + +#define LPUART_FLAG_MASK ( LPUART_FLAG_TXE | LPUART_FLAG_TXOVF | \ + LPUART_FLAG_RXF | LPUART_IT_FLAG_MASK) + +#define LPUART_CLEAR_FLAG_MASK ( LPUART_FLAG_STARTIF | LPUART_FLAG_MATCHIF | \ + LPUART_FLAG_TXOVF | LPUART_FLAG_RXOVIF | \ + LPUART_FLAG_FEIF | LPUART_FLAG_PEIF | \ + LPUART_FLAG_TCIF | LPUART_FLAG_RXIF |\ + LPUART_FLAG_IDLEIF | LPUART_FLAG_BCNTIF) + +/** + * @brief LPUART_State + */ + +#define LPUART_STATE_READY ( 0U ) +#define LPUART_STATE_BUSY ( 1U ) +#define LPUART_STATE_BUSY_IT ( 2U ) +#define LPUART_STATE_BUSY_DMA ( 3U ) + +/** + * @brief LPUART DMA error + */ + +#define LPUART_DMA_TX_ERROR ( 1U << 31 ) +#define LPUART_DMA_RX_ERROR ( 1U << 31 ) + + + + +/** @defgroup LPUART Private Macros + * @{ + */ + +#define __HAL_LPUART_WRITE_TXDATA(__HANDLE__, __TXDATA__) ((__HANDLE__)->Instance->TXDR = __TXDATA__) + +#define __HAL_LPUART_READ_RXDATA(__HANDLE__, __RXDATA__) ((__HANDLE__)->Instance->RXDR) + +#define __HAL_LPUART_ENABLE_DMA(__HANDLE__) ((__HANDLE__)->Instance->CR |= LPUART_CR_DMA_EN) + +#define __HAL_LPUART_DISABLE_DMA(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~LPUART_CR_DMA_EN) + +#define __HAL_LPUART_ENABLE_TX(__HANDLE__) ((__HANDLE__)->Instance->CR |= LPUART_CR_TX_EN) + +#define __HAL_LPUART_DISABLE_TX(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~LPUART_CR_TX_EN) + +#define __HAL_LPUART_ENABLE_RX(__HANDLE__) ((__HANDLE__)->Instance->CR |= LPUART_CR_RX_EN) + +#define __HAL_LPUART_DISABLE_RX(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~LPUART_CR_RX_EN) + +#define __HAL_LPUART_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IE |= (__INTERRUPT__) & LPUART_IT_MASK) + +#define __HAL_LPUART_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IE &= ~((__INTERRUPT__) & LPUART_IT_MASK)) + +#define __HAL_LPUART_GET_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR & ((__FLAG__) & LPUART_FLAG_MASK)) + +#define __HAL_LPUART_GET_IT_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR & ((__FLAG__) & LPUART_IT_FLAG_MASK)) + +#define __HAL_LPUART_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IE & ((__INTERRUPT__) & LPUART_IT_MASK)) + +#define __HAL_LPUART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ((__FLAG__) & LPUART_CLEAR_FLAG_MASK)) + + +/** @defgroup LPUART Private Macros + * @{ + */ + +#define IS_LPUART_HANDLE(__HANDLE__) ((__HANDLE__) != NULL) + +#define IS_LPUART_INSTANCE(__INSTANCE__) ((__INSTANCE__) == LPUART1) + +#define IS_LPUART_WORDLENGTH(__WORDLENGTH__) (((__WORDLENGTH__) == LPUART_WORDLENGTH_7B) ||\ + ((__WORDLENGTH__) == LPUART_WORDLENGTH_8B)) + +#define IS_LPUART_STOPBITS(__STOPBITS__) (((__STOPBITS__) == LPUART_STOPBITS_1B) ||\ + ((__STOPBITS__) == LPUART_STOPBITS_2B)) + +#define IS_LPUART_PARITY(__PARITY__) (((__PARITY__) == LPUART_PARITY_NONE) ||\ + ((__PARITY__) == LPUART_PARITY_ODD) ||\ + ((__PARITY__) == LPUART_PARITY_EVEN) ||\ + ((__PARITY__) == LPUART_PARITY_0) ||\ + ((__PARITY__) == LPUART_PARITY_1)) + +#define IS_LPUART_MODE(__MODE__) (((__MODE__) == LPUART_MODE_TX) ||\ + ((__MODE__) == LPUART_MODE_RX) ||\ + ((__MODE__) == LPUART_MODE_TXRX)) + +#define IS_LPUART_WAKEUPMODE(__WAKEUPMODE__) (((__WAKEUPMODE__) == LPUART_WAKEUPMODE_NONE) ||\ + ((__WAKEUPMODE__) == LPUART_WAKEUPMODE_STARTBIT) ||\ + ((__WAKEUPMODE__) == LPUART_WAKEUPMODE_ONEBYTENOCHECK) ||\ + ((__WAKEUPMODE__) == LPUART_WAKEUPMODE_ONEBYTECHECK) ||\ + ((__WAKEUPMODE__) == LPUART_WAKEUPMODE_ADDRNOCHECK) ||\ + ((__WAKEUPMODE__) == LPUART_WAKEUPMODE_ADDRCHECK)) + +#define IS_LPUART_CALLBACKID(__CALLBACKID__) (((__CALLBACKID__) == LPUART_CALLBACKID_TXCPLT) ||\ + ((__CALLBACKID__) == LPUART_CALLBACKID_TXHALFCPLT) ||\ + ((__CALLBACKID__) == LPUART_CALLBACKID_TXERROR) ||\ + ((__CALLBACKID__) == LPUART_CALLBACKID_RXCPLT) ||\ + ((__CALLBACKID__) == LPUART_CALLBACKID_RXHALFCPLT) ||\ + ((__CALLBACKID__) == LPUART_CALLBACKID_RXERROR) ||\ + ((__CALLBACKID__) == LPUART_CALLBACKID_WAKEUP) ||\ + ((__CALLBACKID__) == LPUART_CALLBACKID_BCNT) ||\ + ((__CALLBACKID__) == LPUART_CALLBACKID_IDLE)) + +#define IS_LPUART_CLOCKSOURCE(__CLOCKSOURCE__) (((__CLOCKSOURCE__) == LPUART_CLOCKSOURCE_XTL) || \ + ((__CLOCKSOURCE__) == LPUART_CLOCKSOURCE_RCL) || \ + ((__CLOCKSOURCE__) == LPUART_CLOCKSOURCE_PCLK_DIV4) || \ + ((__CLOCKSOURCE__) == LPUART_CLOCKSOURCE_PCLK_DIV8) || \ + ((__CLOCKSOURCE__) == LPUART_CLOCKSOURCE_PCLK_DIV16) || \ + ((__CLOCKSOURCE__) == LPUART_CLOCKSOURCE_PCLK_DIV32)) + + + +#define IS_LPUART_WAKEUPADDR(__WAKEUPADDR__) ((__WAKEUPADDR__) <= 0xFFU) + +#define IS_LPUART_DMASIZE(__DMASIZE__) ((__DMASIZE__) <= 0xFFFFU) + +#define IS_LPUART_BAUDRATE(__BAUDRATE__) (((__BAUDRATE__) >= 2U) && ((__BAUDRATE__) <= 254U)) + + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +void HAL_LPUART_IRQHander(LPUART_HandleTypeDef *hlpuart); +HAL_StatusTypeDef HAL_LPUART_Init(LPUART_HandleTypeDef *hlpuart); +HAL_StatusTypeDef HAL_LPUART_DeInit(LPUART_HandleTypeDef *hlpuart); +void HAL_LPUART_MspInit(LPUART_HandleTypeDef *hlpuart); +void HAL_LPUART_MspDeInit(LPUART_HandleTypeDef *hlpuart); +HAL_StatusTypeDef HAL_LPUART_SetBaudRate(LPUART_HandleTypeDef *hlpuart, uint32_t baudRate); +HAL_StatusTypeDef HAL_LPUART_RegisterCallback(LPUART_HandleTypeDef *hlpuart, uint32_t id, pLPUART_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_LPUART_UnRegisterCallback(LPUART_HandleTypeDef *hlpuart, uint32_t id); +HAL_StatusTypeDef HAL_LPUART_Transmit(LPUART_HandleTypeDef *hlpuart, uint8_t *pdata, uint32_t size, uint32_t timeout); +HAL_StatusTypeDef HAL_LPUART_Receive(LPUART_HandleTypeDef *hlpuart, uint8_t *pdata, uint32_t size, uint32_t timeout); +HAL_StatusTypeDef HAL_LPUART_Transmit_IT(LPUART_HandleTypeDef *hlpuart, uint8_t *pdata, uint32_t size); +HAL_StatusTypeDef HAL_LPUART_Receive_IT(LPUART_HandleTypeDef *hlpuart, uint8_t *pdata, uint32_t size); +HAL_StatusTypeDef HAL_LPUART_Transmit_DMA(LPUART_HandleTypeDef *hlpuart, uint8_t *pdata, uint32_t size); +HAL_StatusTypeDef HAL_LPUART_Receive_DMA(LPUART_HandleTypeDef *hlpuart, uint8_t *pdata, uint32_t size); +HAL_StatusTypeDef HAL_LPUART_AbortTransmit(LPUART_HandleTypeDef *hlpuart); +HAL_StatusTypeDef HAL_LPUART_AbortReceive(LPUART_HandleTypeDef *hlpuart); +uint32_t HAL_LPUART_GetTxState(LPUART_HandleTypeDef *hlpuart); +uint32_t HAL_LPUART_GetRxState(LPUART_HandleTypeDef *hlpuart); +HAL_StatusTypeDef HAL_LPUART_Receive_To_IDLEorBCNT(LPUART_HandleTypeDef *hlpuart, uint8_t *buf, uint32_t size, + LPUART_Receive_Mode_Enum rece_mode, uint32_t timeout); + + +void HAL_LPUART_TxEmptyCallback(LPUART_HandleTypeDef *hlpuart); +void HAL_LPUART_TxCompleteCallback(LPUART_HandleTypeDef *hlpuart); +void HAL_LPUART_RxCompleteCallback(LPUART_HandleTypeDef *hlpuart); +void HAL_LPUART_WakeupCallback(LPUART_HandleTypeDef *hlpuart); +void HAL_LPUART_DMATxCpltCallback(DMA_HandleTypeDef *hdma); +void HAL_LPUART_DMATxHalfCpltCallback(DMA_HandleTypeDef *hdma); +void HAL_LPUART_DMATxErrorCallback(DMA_HandleTypeDef *hdma); +void HAL_LPUART_DMARxCpltCallback(DMA_HandleTypeDef *hdma); +void HAL_LPUART_DMARxHalfCpltCallback(DMA_HandleTypeDef *hdma); +void HAL_LPUART_DMARxErrorCallback(DMA_HandleTypeDef *hdma); +void HAL_LPUART_IdleCallback(LPUART_HandleTypeDef *hlpuart); +void HAL_LPUART_BcntCallback(LPUART_HandleTypeDef *hlpuart); + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_ltdc.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_ltdc.h new file mode 100644 index 0000000000..4235817596 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_ltdc.h @@ -0,0 +1,925 @@ +/****************************************************************************** +*@file : hal_ltdc.h +*@brief : GPIO HAL module driver. +******************************************************************************/ + +#ifndef __HAL_LTDC_H__ +#define __HAL_LTDC_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +#include "hal.h" + + + +/** @addtogroup LTDC LTDC + * @brief LTDC HAL module driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup LTDC_Exported_Types LTDC Exported Types + * @{ + */ +#define MAX_LAYER 2U + + +/******************** Bit definition for LTDC_SSCR register *****************/ +#define LTDC_SSCR_VSH_Pos (0U) +#define LTDC_SSCR_VSH_Msk (0x7FFUL << LTDC_SSCR_VSH_Pos) /*!< 0x000007FF */ +#define LTDC_SSCR_VSH LTDC_SSCR_VSH_Msk /*!< Vertical Synchronization Height */ +#define LTDC_SSCR_HSW_Pos (16U) +#define LTDC_SSCR_HSW_Msk (0xFFFUL << LTDC_SSCR_HSW_Pos) /*!< 0x0FFF0000 */ +#define LTDC_SSCR_HSW LTDC_SSCR_HSW_Msk /*!< Horizontal Synchronization Width */ + +/******************** Bit definition for LTDC_BPCR register *****************/ +#define LTDC_BPCR_AVBP_Pos (0U) +#define LTDC_BPCR_AVBP_Msk (0x7FFUL << LTDC_BPCR_AVBP_Pos) /*!< 0x000007FF */ +#define LTDC_BPCR_AVBP LTDC_BPCR_AVBP_Msk /*!< Accumulated Vertical Back Porch */ +#define LTDC_BPCR_AHBP_Pos (16U) +#define LTDC_BPCR_AHBP_Msk (0xFFFUL << LTDC_BPCR_AHBP_Pos) /*!< 0x0FFF0000 */ +#define LTDC_BPCR_AHBP LTDC_BPCR_AHBP_Msk /*!< Accumulated Horizontal Back Porch */ + +/******************** Bit definition for LTDC_AWCR register *****************/ +#define LTDC_AWCR_AAH_Pos (0U) +#define LTDC_AWCR_AAH_Msk (0x7FFUL << LTDC_AWCR_AAH_Pos) /*!< 0x000007FF */ +#define LTDC_AWCR_AAH LTDC_AWCR_AAH_Msk /*!< Accumulated Active heigh */ +#define LTDC_AWCR_AAW_Pos (16U) +#define LTDC_AWCR_AAW_Msk (0xFFFUL << LTDC_AWCR_AAW_Pos) /*!< 0x0FFF0000 */ +#define LTDC_AWCR_AAW LTDC_AWCR_AAW_Msk /*!< Accumulated Active Width */ + +/******************** Bit definition for LTDC_TWCR register *****************/ +#define LTDC_TWCR_TOTALH_Pos (0U) +#define LTDC_TWCR_TOTALH_Msk (0x7FFUL << LTDC_TWCR_TOTALH_Pos) /*!< 0x000007FF */ +#define LTDC_TWCR_TOTALH LTDC_TWCR_TOTALH_Msk /*!< Total Heigh */ +#define LTDC_TWCR_TOTALW_Pos (16U) +#define LTDC_TWCR_TOTALW_Msk (0xFFFUL << LTDC_TWCR_TOTALW_Pos) /*!< 0x0FFF0000 */ +#define LTDC_TWCR_TOTALW LTDC_TWCR_TOTALW_Msk /*!< Total Width */ + +/******************** Bit definition for LTDC_GCR register ******************/ +#define LTDC_GCR_LTDCEN_Pos (0U) +#define LTDC_GCR_LTDCEN_Msk (0x1UL << LTDC_GCR_LTDCEN_Pos) /*!< 0x00000001 */ +#define LTDC_GCR_LTDCEN LTDC_GCR_LTDCEN_Msk /*!< LCD-TFT controller enable bit */ +#define LTDC_GCR_DBW_Pos (4U) +#define LTDC_GCR_DBW_Msk (0x7UL << LTDC_GCR_DBW_Pos) /*!< 0x00000070 */ +#define LTDC_GCR_DBW LTDC_GCR_DBW_Msk /*!< Dither Blue Width */ +#define LTDC_GCR_DGW_Pos (8U) +#define LTDC_GCR_DGW_Msk (0x7UL << LTDC_GCR_DGW_Pos) /*!< 0x00000700 */ +#define LTDC_GCR_DGW LTDC_GCR_DGW_Msk /*!< Dither Green Width */ +#define LTDC_GCR_DRW_Pos (12U) +#define LTDC_GCR_DRW_Msk (0x7UL << LTDC_GCR_DRW_Pos) /*!< 0x00007000 */ +#define LTDC_GCR_DRW LTDC_GCR_DRW_Msk /*!< Dither Red Width */ +#define LTDC_GCR_DEN_Pos (16U) +#define LTDC_GCR_DEN_Msk (0x1UL << LTDC_GCR_DEN_Pos) /*!< 0x00010000 */ +#define LTDC_GCR_DEN LTDC_GCR_DEN_Msk /*!< Dither Enable */ +#define LTDC_GCR_AHB_LOCK_Pos (17U) +#define LTDC_GCR_AHB_LOCK_Msk (0x1UL << LTDC_GCR_AHB_LOCK_Pos) /*!< 0x00020000 */ +#define LTDC_GCR_AHB_LOCK LTDC_GCR_AHB_LOCK_Msk /*!< AHB lock Enable */ +#define LTDC_GCR_PCPOL_Pos (28U) +#define LTDC_GCR_PCPOL_Msk (0x1UL << LTDC_GCR_PCPOL_Pos) /*!< 0x10000000 */ +#define LTDC_GCR_PCPOL LTDC_GCR_PCPOL_Msk /*!< Pixel Clock Polarity */ +#define LTDC_GCR_DEPOL_Pos (29U) +#define LTDC_GCR_DEPOL_Msk (0x1UL << LTDC_GCR_DEPOL_Pos) /*!< 0x20000000 */ +#define LTDC_GCR_DEPOL LTDC_GCR_DEPOL_Msk /*!< Data Enable Polarity */ +#define LTDC_GCR_VSPOL_Pos (30U) +#define LTDC_GCR_VSPOL_Msk (0x1UL << LTDC_GCR_VSPOL_Pos) /*!< 0x40000000 */ +#define LTDC_GCR_VSPOL LTDC_GCR_VSPOL_Msk /*!< Vertical Synchronization Polarity */ +#define LTDC_GCR_HSPOL_Pos (31U) +#define LTDC_GCR_HSPOL_Msk (0x1UL << LTDC_GCR_HSPOL_Pos) /*!< 0x80000000 */ +#define LTDC_GCR_HSPOL LTDC_GCR_HSPOL_Msk /*!< Horizontal Synchronization Polarity */ + +/******************** Bit definition for LTDC_SRCR register *****************/ +#define LTDC_SRCR_IMR_Pos (0U) +#define LTDC_SRCR_IMR_Msk (0x1UL << LTDC_SRCR_IMR_Pos) /*!< 0x00000001 */ +#define LTDC_SRCR_IMR LTDC_SRCR_IMR_Msk /*!< Immediate Reload */ +#define LTDC_SRCR_VBR_Pos (1U) +#define LTDC_SRCR_VBR_Msk (0x1UL << LTDC_SRCR_VBR_Pos) /*!< 0x00000002 */ +#define LTDC_SRCR_VBR LTDC_SRCR_VBR_Msk /*!< Vertical Blanking Reload */ + +/******************** Bit definition for LTDC_BCCR register *****************/ +#define LTDC_BCCR_BCBLUE_Pos (0U) +#define LTDC_BCCR_BCBLUE_Msk (0xFFUL << LTDC_BCCR_BCBLUE_Pos) /*!< 0x000000FF */ +#define LTDC_BCCR_BCBLUE LTDC_BCCR_BCBLUE_Msk /*!< Background Blue value */ +#define LTDC_BCCR_BCGREEN_Pos (8U) +#define LTDC_BCCR_BCGREEN_Msk (0xFFUL << LTDC_BCCR_BCGREEN_Pos) /*!< 0x0000FF00 */ +#define LTDC_BCCR_BCGREEN LTDC_BCCR_BCGREEN_Msk /*!< Background Green value */ +#define LTDC_BCCR_BCRED_Pos (16U) +#define LTDC_BCCR_BCRED_Msk (0xFFUL << LTDC_BCCR_BCRED_Pos) /*!< 0x00FF0000 */ +#define LTDC_BCCR_BCRED LTDC_BCCR_BCRED_Msk /*!< Background Red value */ + +/******************** Bit definition for LTDC_IER register ******************/ +#define LTDC_IER_LIE_Pos (0U) +#define LTDC_IER_LIE_Msk (0x1UL << LTDC_IER_LIE_Pos) /*!< 0x00000001 */ +#define LTDC_IER_LIE LTDC_IER_LIE_Msk /*!< Line Interrupt Enable */ +#define LTDC_IER_FUIE_Pos (1U) +#define LTDC_IER_FUIE_Msk (0x1UL << LTDC_IER_FUIE_Pos) /*!< 0x00000002 */ +#define LTDC_IER_FUIE LTDC_IER_FUIE_Msk /*!< FIFO Underrun Interrupt Enable */ +#define LTDC_IER_TERRIE_Pos (2U) +#define LTDC_IER_TERRIE_Msk (0x1UL << LTDC_IER_TERRIE_Pos) /*!< 0x00000004 */ +#define LTDC_IER_TERRIE LTDC_IER_TERRIE_Msk /*!< Transfer Error Interrupt Enable */ +#define LTDC_IER_RRIE_Pos (3U) +#define LTDC_IER_RRIE_Msk (0x1UL << LTDC_IER_RRIE_Pos) /*!< 0x00000008 */ +#define LTDC_IER_RRIE LTDC_IER_RRIE_Msk /*!< Register Reload interrupt enable */ + +/******************** Bit definition for LTDC_ISR register ******************/ +#define LTDC_ISR_LIF_Pos (0U) +#define LTDC_ISR_LIF_Msk (0x1UL << LTDC_ISR_LIF_Pos) /*!< 0x00000001 */ +#define LTDC_ISR_LIF LTDC_ISR_LIF_Msk /*!< Line Interrupt Flag */ +#define LTDC_ISR_FUIF_Pos (1U) +#define LTDC_ISR_FUIF_Msk (0x1UL << LTDC_ISR_FUIF_Pos) /*!< 0x00000002 */ +#define LTDC_ISR_FUIF LTDC_ISR_FUIF_Msk /*!< FIFO Underrun Interrupt Flag */ +#define LTDC_ISR_TERRIF_Pos (2U) +#define LTDC_ISR_TERRIF_Msk (0x1UL << LTDC_ISR_TERRIF_Pos) /*!< 0x00000004 */ +#define LTDC_ISR_TERRIF LTDC_ISR_TERRIF_Msk /*!< Transfer Error Interrupt Flag */ +#define LTDC_ISR_RRIF_Pos (3U) +#define LTDC_ISR_RRIF_Msk (0x1UL << LTDC_ISR_RRIF_Pos) /*!< 0x00000008 */ +#define LTDC_ISR_RRIF LTDC_ISR_RRIF_Msk /*!< Register Reload interrupt Flag */ + +/******************** Bit definition for LTDC_ICR register ******************/ +#define LTDC_ICR_CLIF_Pos (0U) +#define LTDC_ICR_CLIF_Msk (0x1UL << LTDC_ICR_CLIF_Pos) /*!< 0x00000001 */ +#define LTDC_ICR_CLIF LTDC_ICR_CLIF_Msk /*!< Clears the Line Interrupt Flag */ +#define LTDC_ICR_CFUIF_Pos (1U) +#define LTDC_ICR_CFUIF_Msk (0x1UL << LTDC_ICR_CFUIF_Pos) /*!< 0x00000002 */ +#define LTDC_ICR_CFUIF LTDC_ICR_CFUIF_Msk /*!< Clears the FIFO Underrun Interrupt Flag */ +#define LTDC_ICR_CTERRIF_Pos (2U) +#define LTDC_ICR_CTERRIF_Msk (0x1UL << LTDC_ICR_CTERRIF_Pos) /*!< 0x00000004 */ +#define LTDC_ICR_CTERRIF LTDC_ICR_CTERRIF_Msk /*!< Clears the Transfer Error Interrupt Flag */ +#define LTDC_ICR_CRRIF_Pos (3U) +#define LTDC_ICR_CRRIF_Msk (0x1UL << LTDC_ICR_CRRIF_Pos) /*!< 0x00000008 */ +#define LTDC_ICR_CRRIF LTDC_ICR_CRRIF_Msk /*!< Clears Register Reload interrupt Flag */ + +/******************** Bit definition for LTDC_LIPCR register ****************/ +#define LTDC_LIPCR_LIPOS_Pos (0U) +#define LTDC_LIPCR_LIPOS_Msk (0x7FFUL << LTDC_LIPCR_LIPOS_Pos) /*!< 0x000007FF */ +#define LTDC_LIPCR_LIPOS LTDC_LIPCR_LIPOS_Msk /*!< Line Interrupt Position */ + +/******************** Bit definition for LTDC_CPSR register *****************/ +#define LTDC_CPSR_CYPOS_Pos (0U) +#define LTDC_CPSR_CYPOS_Msk (0xFFFFUL << LTDC_CPSR_CYPOS_Pos) /*!< 0x0000FFFF */ +#define LTDC_CPSR_CYPOS LTDC_CPSR_CYPOS_Msk /*!< Current Y Position */ +#define LTDC_CPSR_CXPOS_Pos (16U) +#define LTDC_CPSR_CXPOS_Msk (0xFFFFUL << LTDC_CPSR_CXPOS_Pos) /*!< 0xFFFF0000 */ +#define LTDC_CPSR_CXPOS LTDC_CPSR_CXPOS_Msk /*!< Current X Position */ + +/******************** Bit definition for LTDC_CDSR register *****************/ +#define LTDC_CDSR_VDES_Pos (0U) +#define LTDC_CDSR_VDES_Msk (0x1UL << LTDC_CDSR_VDES_Pos) /*!< 0x00000001 */ +#define LTDC_CDSR_VDES LTDC_CDSR_VDES_Msk /*!< Vertical Data Enable Status */ +#define LTDC_CDSR_HDES_Pos (1U) +#define LTDC_CDSR_HDES_Msk (0x1UL << LTDC_CDSR_HDES_Pos) /*!< 0x00000002 */ +#define LTDC_CDSR_HDES LTDC_CDSR_HDES_Msk /*!< Horizontal Data Enable Status */ +#define LTDC_CDSR_VSYNCS_Pos (2U) +#define LTDC_CDSR_VSYNCS_Msk (0x1UL << LTDC_CDSR_VSYNCS_Pos) /*!< 0x00000004 */ +#define LTDC_CDSR_VSYNCS LTDC_CDSR_VSYNCS_Msk /*!< Vertical Synchronization Status */ +#define LTDC_CDSR_HSYNCS_Pos (3U) +#define LTDC_CDSR_HSYNCS_Msk (0x1UL << LTDC_CDSR_HSYNCS_Pos) /*!< 0x00000008 */ +#define LTDC_CDSR_HSYNCS LTDC_CDSR_HSYNCS_Msk /*!< Horizontal Synchronization Status */ + +/******************** Bit definition for LTDC_LxCR register *****************/ +#define LTDC_LxCR_LEN_Pos (0U) +#define LTDC_LxCR_LEN_Msk (0x1UL << LTDC_LxCR_LEN_Pos) /*!< 0x00000001 */ +#define LTDC_LxCR_LEN LTDC_LxCR_LEN_Msk /*!< Layer Enable */ +#define LTDC_LxCR_COLKEN_Pos (1U) +#define LTDC_LxCR_COLKEN_Msk (0x1UL << LTDC_LxCR_COLKEN_Pos) /*!< 0x00000002 */ +#define LTDC_LxCR_COLKEN LTDC_LxCR_COLKEN_Msk /*!< Color Keying Enable */ +#define LTDC_LxCR_CLUTEN_Pos (4U) +#define LTDC_LxCR_CLUTEN_Msk (0x1UL << LTDC_LxCR_CLUTEN_Pos) /*!< 0x00000010 */ +#define LTDC_LxCR_CLUTEN LTDC_LxCR_CLUTEN_Msk /*!< Color Lockup Table Enable */ + +/******************** Bit definition for LTDC_LxWHPCR register **************/ +#define LTDC_LxWHPCR_WHSTPOS_Pos (0U) +#define LTDC_LxWHPCR_WHSTPOS_Msk (0xFFFUL << LTDC_LxWHPCR_WHSTPOS_Pos) /*!< 0x00000FFF */ +#define LTDC_LxWHPCR_WHSTPOS LTDC_LxWHPCR_WHSTPOS_Msk /*!< Window Horizontal Start Position */ +#define LTDC_LxWHPCR_WHSPPOS_Pos (16U) +#define LTDC_LxWHPCR_WHSPPOS_Msk (0xFFFFUL << LTDC_LxWHPCR_WHSPPOS_Pos) /*!< 0xFFFF0000 */ +#define LTDC_LxWHPCR_WHSPPOS LTDC_LxWHPCR_WHSPPOS_Msk /*!< Window Horizontal Stop Position */ + +/******************** Bit definition for LTDC_LxWVPCR register **************/ +#define LTDC_LxWVPCR_WVSTPOS_Pos (0U) +#define LTDC_LxWVPCR_WVSTPOS_Msk (0xFFFUL << LTDC_LxWVPCR_WVSTPOS_Pos) /*!< 0x00000FFF */ +#define LTDC_LxWVPCR_WVSTPOS LTDC_LxWVPCR_WVSTPOS_Msk /*!< Window Vertical Start Position */ +#define LTDC_LxWVPCR_WVSPPOS_Pos (16U) +#define LTDC_LxWVPCR_WVSPPOS_Msk (0xFFFFUL << LTDC_LxWVPCR_WVSPPOS_Pos) /*!< 0xFFFF0000 */ +#define LTDC_LxWVPCR_WVSPPOS LTDC_LxWVPCR_WVSPPOS_Msk /*!< Window Vertical Stop Position */ + +/******************** Bit definition for LTDC_LxCKCR register ***************/ +#define LTDC_LxCKCR_CKBLUE_Pos (0U) +#define LTDC_LxCKCR_CKBLUE_Msk (0xFFUL << LTDC_LxCKCR_CKBLUE_Pos) /*!< 0x000000FF */ +#define LTDC_LxCKCR_CKBLUE LTDC_LxCKCR_CKBLUE_Msk /*!< Color Key Blue value */ +#define LTDC_LxCKCR_CKGREEN_Pos (8U) +#define LTDC_LxCKCR_CKGREEN_Msk (0xFFUL << LTDC_LxCKCR_CKGREEN_Pos) /*!< 0x0000FF00 */ +#define LTDC_LxCKCR_CKGREEN LTDC_LxCKCR_CKGREEN_Msk /*!< Color Key Green value */ +#define LTDC_LxCKCR_CKRED_Pos (16U) +#define LTDC_LxCKCR_CKRED_Msk (0xFFUL << LTDC_LxCKCR_CKRED_Pos) /*!< 0x00FF0000 */ +#define LTDC_LxCKCR_CKRED LTDC_LxCKCR_CKRED_Msk /*!< Color Key Red value */ + +/******************** Bit definition for LTDC_LxPFCR register ***************/ +#define LTDC_LxPFCR_PF_Pos (0U) +#define LTDC_LxPFCR_PF_Msk (0x7UL << LTDC_LxPFCR_PF_Pos) /*!< 0x00000007 */ +#define LTDC_LxPFCR_PF LTDC_LxPFCR_PF_Msk /*!< Pixel Format */ + +/******************** Bit definition for LTDC_LxCACR register ***************/ +#define LTDC_LxCACR_CONSTA_Pos (0U) +#define LTDC_LxCACR_CONSTA_Msk (0xFFUL << LTDC_LxCACR_CONSTA_Pos) /*!< 0x000000FF */ +#define LTDC_LxCACR_CONSTA LTDC_LxCACR_CONSTA_Msk /*!< Constant Alpha */ + +/******************** Bit definition for LTDC_LxDCCR register ***************/ +#define LTDC_LxDCCR_DCBLUE_Pos (0U) +#define LTDC_LxDCCR_DCBLUE_Msk (0xFFUL << LTDC_LxDCCR_DCBLUE_Pos) /*!< 0x000000FF */ +#define LTDC_LxDCCR_DCBLUE LTDC_LxDCCR_DCBLUE_Msk /*!< Default Color Blue */ +#define LTDC_LxDCCR_DCGREEN_Pos (8U) +#define LTDC_LxDCCR_DCGREEN_Msk (0xFFUL << LTDC_LxDCCR_DCGREEN_Pos) /*!< 0x0000FF00 */ +#define LTDC_LxDCCR_DCGREEN LTDC_LxDCCR_DCGREEN_Msk /*!< Default Color Green */ +#define LTDC_LxDCCR_DCRED_Pos (16U) +#define LTDC_LxDCCR_DCRED_Msk (0xFFUL << LTDC_LxDCCR_DCRED_Pos) /*!< 0x00FF0000 */ +#define LTDC_LxDCCR_DCRED LTDC_LxDCCR_DCRED_Msk /*!< Default Color Red */ +#define LTDC_LxDCCR_DCALPHA_Pos (24U) +#define LTDC_LxDCCR_DCALPHA_Msk (0xFFUL << LTDC_LxDCCR_DCALPHA_Pos) /*!< 0xFF000000 */ +#define LTDC_LxDCCR_DCALPHA LTDC_LxDCCR_DCALPHA_Msk /*!< Default Color Alpha */ + +/******************** Bit definition for LTDC_LxBFCR register ***************/ +#define LTDC_LxBFCR_BF2_Pos (0U) +#define LTDC_LxBFCR_BF2_Msk (0x7UL << LTDC_LxBFCR_BF2_Pos) /*!< 0x00000007 */ +#define LTDC_LxBFCR_BF2 LTDC_LxBFCR_BF2_Msk /*!< Blending Factor 2 */ +#define LTDC_LxBFCR_BF1_Pos (8U) +#define LTDC_LxBFCR_BF1_Msk (0x7UL << LTDC_LxBFCR_BF1_Pos) /*!< 0x00000700 */ +#define LTDC_LxBFCR_BF1 LTDC_LxBFCR_BF1_Msk /*!< Blending Factor 1 */ + +/******************** Bit definition for LTDC_LxCFBAR register **************/ +#define LTDC_LxCFBAR_CFBADD_Pos (0U) +#define LTDC_LxCFBAR_CFBADD_Msk (0xFFFFFFFFUL << LTDC_LxCFBAR_CFBADD_Pos) /*!< 0xFFFFFFFF */ +#define LTDC_LxCFBAR_CFBADD LTDC_LxCFBAR_CFBADD_Msk /*!< Color Frame Buffer Start Address */ + +/******************** Bit definition for LTDC_LxCFBLR register **************/ +#define LTDC_LxCFBLR_CFBLL_Pos (0U) +#define LTDC_LxCFBLR_CFBLL_Msk (0x1FFFUL << LTDC_LxCFBLR_CFBLL_Pos) /*!< 0x00001FFF */ +#define LTDC_LxCFBLR_CFBLL LTDC_LxCFBLR_CFBLL_Msk /*!< Color Frame Buffer Line Length */ +#define LTDC_LxCFBLR_CFBP_Pos (16U) +#define LTDC_LxCFBLR_CFBP_Msk (0x1FFFUL << LTDC_LxCFBLR_CFBP_Pos) /*!< 0x1FFF0000 */ +#define LTDC_LxCFBLR_CFBP LTDC_LxCFBLR_CFBP_Msk /*!< Color Frame Buffer Pitch in bytes */ + +/******************** Bit definition for LTDC_LxCFBLNR register *************/ +#define LTDC_LxCFBLNR_CFBLNBR_Pos (0U) +#define LTDC_LxCFBLNR_CFBLNBR_Msk (0x7FFUL << LTDC_LxCFBLNR_CFBLNBR_Pos) /*!< 0x000007FF */ +#define LTDC_LxCFBLNR_CFBLNBR LTDC_LxCFBLNR_CFBLNBR_Msk /*!< Frame Buffer Line Number */ + +/******************** Bit definition for LTDC_LxCLUTWR register *************/ +#define LTDC_LxCLUTWR_BLUE_Pos (0U) +#define LTDC_LxCLUTWR_BLUE_Msk (0xFFUL << LTDC_LxCLUTWR_BLUE_Pos) /*!< 0x000000FF */ +#define LTDC_LxCLUTWR_BLUE LTDC_LxCLUTWR_BLUE_Msk /*!< Blue value */ +#define LTDC_LxCLUTWR_GREEN_Pos (8U) +#define LTDC_LxCLUTWR_GREEN_Msk (0xFFUL << LTDC_LxCLUTWR_GREEN_Pos) /*!< 0x0000FF00 */ +#define LTDC_LxCLUTWR_GREEN LTDC_LxCLUTWR_GREEN_Msk /*!< Green value */ +#define LTDC_LxCLUTWR_RED_Pos (16U) +#define LTDC_LxCLUTWR_RED_Msk (0xFFUL << LTDC_LxCLUTWR_RED_Pos) /*!< 0x00FF0000 */ +#define LTDC_LxCLUTWR_RED LTDC_LxCLUTWR_RED_Msk /*!< Red value */ +#define LTDC_LxCLUTWR_CLUTADD_Pos (24U) +#define LTDC_LxCLUTWR_CLUTADD_Msk (0xFFUL << LTDC_LxCLUTWR_CLUTADD_Pos) /*!< 0xFF000000 */ +#define LTDC_LxCLUTWR_CLUTADD LTDC_LxCLUTWR_CLUTADD_Msk /*!< CLUT address */ + + +/******************** Bit definition for RCC_PLL2CFR register *************/ +#define RCC_PLL2CR_Q_DIV_1 1 +#define RCC_PLL2CR_Q_DIV_2 2 +#define RCC_PLL2CR_Q_DIV_3 3 +#define RCC_PLL2CR_Q_DIV_4 4 +#define RCC_PLL2CR_Q_DIV_5 5 +#define RCC_PLL2CR_Q_DIV_6 6 +#define RCC_PLL2CR_Q_DIV_7 7 +#define RCC_PLL2CR_Q_DIV_8 8 +#define RCC_PLL2CR_Q_DIV_9 9 +#define RCC_PLL2CR_Q_DIV_10 10 +#define RCC_PLL2CR_Q_DIV_11 11 +#define RCC_PLL2CR_Q_DIV_12 12 +#define RCC_PLL2CR_Q_DIV_13 13 +#define RCC_PLL2CR_Q_DIV_14 14 +#define RCC_PLL2CR_Q_DIV_15 15 + + +/******************** Bit definition for RCC_DCKCFG register *************/ +#define RCC_DCKCFG_DIV_2 2 +#define RCC_DCKCFG_DIV_4 4 +#define RCC_DCKCFG_DIV_8 8 +#define RCC_DCKCFG_DIV_16 16 + + + +/** + * @brief LTDC color structure definition + */ +typedef struct +{ + uint8_t Blue; /*!< Configures the blue value. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ + + uint8_t Green; /*!< Configures the green value. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ + + uint8_t Red; /*!< Configures the red value. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ + + uint8_t Reserved; /*!< Reserved 0xFF */ +} LTDC_ColorTypeDef; + +/** + * @brief LTDC Init structure definition + */ +typedef struct +{ + uint32_t HSPolarity; /*!< configures the horizontal synchronization polarity. + This parameter can be one value of @ref LTDC_HS_POLARITY */ + + uint32_t VSPolarity; /*!< configures the vertical synchronization polarity. + This parameter can be one value of @ref LTDC_VS_POLARITY */ + + uint32_t DEPolarity; /*!< configures the data enable polarity. + This parameter can be one of value of @ref LTDC_DE_POLARITY */ + + uint32_t PCPolarity; /*!< configures the pixel clock polarity. + This parameter can be one of value of @ref LTDC_PC_POLARITY */ + + uint32_t HorizontalSync; /*!< configures the number of Horizontal synchronization width. + This parameter must be a number between Min_Data = 0x000 and Max_Data = 0xFFF. */ + + uint32_t VerticalSync; /*!< configures the number of Vertical synchronization height. + This parameter must be a number between Min_Data = 0x000 and Max_Data = 0x7FF. */ + + uint32_t AccumulatedHBP; /*!< configures the accumulated horizontal back porch width. + This parameter must be a number between Min_Data = LTDC_HorizontalSync and Max_Data = 0xFFF. */ + + uint32_t AccumulatedVBP; /*!< configures the accumulated vertical back porch height. + This parameter must be a number between Min_Data = LTDC_VerticalSync and Max_Data = 0x7FF. */ + + uint32_t AccumulatedActiveW; /*!< configures the accumulated active width. + This parameter must be a number between Min_Data = LTDC_AccumulatedHBP and Max_Data = 0xFFF. */ + + uint32_t AccumulatedActiveH; /*!< configures the accumulated active height. + This parameter must be a number between Min_Data = LTDC_AccumulatedVBP and Max_Data = 0x7FF. */ + + uint32_t TotalWidth; /*!< configures the total width. + This parameter must be a number between Min_Data = LTDC_AccumulatedActiveW and Max_Data = 0xFFF. */ + + uint32_t TotalHeigh; /*!< configures the total height. + This parameter must be a number between Min_Data = LTDC_AccumulatedActiveH and Max_Data = 0x7FF. */ + + LTDC_ColorTypeDef Backcolor; /*!< Configures the background color. */ +} LTDC_InitTypeDef; + +/** + * @brief LTDC Layer structure definition + */ +typedef struct +{ + uint32_t WindowX0; /*!< Configures the Window Horizontal Start Position. + This parameter must be a number between Min_Data = 0x000 and Max_Data = 0xFFF. */ + + uint32_t WindowX1; /*!< Configures the Window Horizontal Stop Position. + This parameter must be a number between Min_Data = 0x000 and Max_Data = 0xFFF. */ + + uint32_t WindowY0; /*!< Configures the Window vertical Start Position. + This parameter must be a number between Min_Data = 0x000 and Max_Data = 0x7FF. */ + + uint32_t WindowY1; /*!< Configures the Window vertical Stop Position. + This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0x7FF. */ + + uint32_t PixelFormat; /*!< Specifies the pixel format. + This parameter can be one of value of @ref LTDC_Pixelformat */ + + uint32_t Alpha; /*!< Specifies the constant alpha used for blending. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ + + uint32_t Alpha0; /*!< Configures the default alpha value. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. */ + + uint32_t BlendingFactor1; /*!< Select the blending factor 1. + This parameter can be one of value of @ref LTDC_BlendingFactor1 */ + + uint32_t BlendingFactor2; /*!< Select the blending factor 2. + This parameter can be one of value of @ref LTDC_BlendingFactor2 */ + + uint32_t FBStartAdress; /*!< Configures the color frame buffer address */ + + uint32_t ImageWidth; /*!< Configures the color frame buffer line length. + This parameter must be a number between Min_Data = 0x0000 and Max_Data = 0x1FFF. */ + + uint32_t ImageHeight; /*!< Specifies the number of line in frame buffer. + This parameter must be a number between Min_Data = 0x000 and Max_Data = 0x7FF. */ + + LTDC_ColorTypeDef Backcolor; /*!< Configures the layer background color. */ +} LTDC_LayerCfgTypeDef; + +/** + * @brief HAL LTDC State enumeration definition + */ +typedef enum +{ + HAL_LTDC_STATE_RESET = 0x00U, /*!< LTDC not yet initialized or disabled */ + HAL_LTDC_STATE_READY = 0x01U, /*!< LTDC initialized and ready for use */ + HAL_LTDC_STATE_BUSY = 0x02U, /*!< LTDC internal process is ongoing */ + HAL_LTDC_STATE_TIMEOUT = 0x03U, /*!< LTDC Timeout state */ + HAL_LTDC_STATE_ERROR = 0x04U /*!< LTDC state error */ +}HAL_LTDC_StateTypeDef; + +/** + * @brief LTDC handle Structure definition + */ +typedef struct +{ + LTDC_TypeDef *Instance; /*!< LTDC Register base address */ + + LTDC_InitTypeDef Init; /*!< LTDC parameters */ + + LTDC_LayerCfgTypeDef LayerCfg[MAX_LAYER]; /*!< LTDC Layers parameters */ + + HAL_LockTypeDef Lock; /*!< LTDC Lock */ + + __IO HAL_LTDC_StateTypeDef State; /*!< LTDC state */ + + __IO uint32_t ErrorCode; /*!< LTDC Error code */ + +} LTDC_HandleTypeDef; +/** + * @} + */ + +typedef struct +{ + GPIO_TypeDef *pGPIO_Port; + uint16_t GPIO_Pin; + uint16_t GPIO_Alt; +}GPIO_CfgDef; + + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup LTDC_Exported_Constants LTDC Exported Constants + * @{ + */ + +/** @defgroup LTDC_Error_Code LTDC Error Code + * @{ + */ +#define HAL_LTDC_ERROR_NONE (0x00000000U) /*!< LTDC No error */ +#define HAL_LTDC_ERROR_TE (0x00000001U) /*!< LTDC Transfer error */ +#define HAL_LTDC_ERROR_FU (0x00000002U) /*!< LTDC FIFO Underrun */ +#define HAL_LTDC_ERROR_TIMEOUT (0x00000020U) /*!< LTDC Timeout error */ +/** + * @} + */ + +/** @defgroup LTDC_Layer LTDC Layer + * @{ + */ +#define LTDC_LAYER_1 (0x00000000U) /*!< LTDC Layer 1 */ +#define LTDC_LAYER_2 (0x00000001U) /*!< LTDC Layer 2 */ +/** + * @} + */ + + +/** @defgroup LTDC_HS_POLARITY LTDC HS POLARITY + * @{ + */ +#define LTDC_HSPOLARITY_AL (0x00000000U) /*!< Horizontal Synchronization is active low. */ +#define LTDC_HSPOLARITY_AH LTDC_GCR_HSPOL /*!< Horizontal Synchronization is active high. */ +/** + * @} + */ + +/** @defgroup LTDC_VS_POLARITY LTDC VS POLARITY + * @{ + */ +#define LTDC_VSPOLARITY_AL (0x00000000U) /*!< Vertical Synchronization is active low. */ +#define LTDC_VSPOLARITY_AH LTDC_GCR_VSPOL /*!< Vertical Synchronization is active high. */ +/** + * @} + */ + +/** @defgroup LTDC_DE_POLARITY LTDC DE POLARITY + * @{ + */ +#define LTDC_DEPOLARITY_AL (0x00000000U) /*!< Data Enable, is active low. */ +#define LTDC_DEPOLARITY_AH LTDC_GCR_DEPOL /*!< Data Enable, is active high. */ +/** + * @} + */ + +/** @defgroup LTDC_PC_POLARITY LTDC PC POLARITY + * @{ + */ +#define LTDC_PCPOLARITY_IPC (0x00000000U) /*!< input pixel clock. */ +#define LTDC_PCPOLARITY_IIPC LTDC_GCR_PCPOL /*!< inverted input pixel clock. */ +/** + * @} + */ + +/** @defgroup LTDC_SYNC LTDC SYNC + * @{ + */ +#define LTDC_HORIZONTALSYNC (LTDC_SSCR_HSW >> 16) /*!< Horizontal synchronization width. */ +#define LTDC_VERTICALSYNC LTDC_SSCR_VSH /*!< Vertical synchronization height. */ +/** + * @} + */ + +/** @defgroup LTDC_BACK_COLOR LTDC BACK COLOR + * @{ + */ +#define LTDC_COLOR (0x000000FFU) /*!< Color mask */ +/** + * @} + */ + +/** @defgroup LTDC_BlendingFactor1 LTDC Blending Factor1 + * @{ + */ +#define LTDC_BLENDING_FACTOR1_CA (0x00000400U) /*!< Blending factor : Cte Alpha */ +#define LTDC_BLENDING_FACTOR1_PAxCA (0x00000600U) /*!< Blending factor : Cte Alpha x Pixel Alpha*/ +/** + * @} + */ + +/** @defgroup LTDC_BlendingFactor2 LTDC Blending Factor2 + * @{ + */ +#define LTDC_BLENDING_FACTOR2_CA (0x00000005U) /*!< Blending factor : Cte Alpha */ +#define LTDC_BLENDING_FACTOR2_PAxCA (0x00000007U) /*!< Blending factor : Cte Alpha x Pixel Alpha*/ +/** + * @} + */ + +/** @defgroup LTDC_Pixelformat LTDC Pixel format + * @{ + */ +#define LTDC_PIXEL_FORMAT_ARGB8888 (0x00000000U) /*!< ARGB8888 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_RGB888 (0x00000001U) /*!< RGB888 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_RGB565 (0x00000002U) /*!< RGB565 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_ARGB1555 (0x00000003U) /*!< ARGB1555 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_ARGB4444 (0x00000004U) /*!< ARGB4444 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_L8 (0x00000005U) /*!< L8 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_AL44 (0x00000006U) /*!< AL44 LTDC pixel format */ +#define LTDC_PIXEL_FORMAT_AL88 (0x00000007U) /*!< AL88 LTDC pixel format */ +/** + * @} + */ + +/** @defgroup LTDC_Alpha LTDC Alpha + * @{ + */ +#define LTDC_ALPHA LTDC_LxCACR_CONSTA /*!< LTDC Cte Alpha mask */ +/** + * @} + */ + +/** @defgroup LTDC_LAYER_Config LTDC LAYER Config + * @{ + */ +#define LTDC_STOPPOSITION (LTDC_LxWHPCR_WHSPPOS >> 16) /*!< LTDC Layer stop position */ +#define LTDC_STARTPOSITION LTDC_LxWHPCR_WHSTPOS /*!< LTDC Layer start position */ + +#define LTDC_COLOR_FRAME_BUFFER LTDC_LxCFBLR_CFBLL /*!< LTDC Layer Line length */ +#define LTDC_LINE_NUMBER LTDC_LxCFBLNR_CFBLNBR /*!< LTDC Layer Line number */ +/** + * @} + */ + +/** @defgroup LTDC_Interrupts LTDC Interrupts + * @{ + */ +#define LTDC_IT_LI LTDC_IER_LIE +#define LTDC_IT_FU LTDC_IER_FUIE +#define LTDC_IT_TE LTDC_IER_TERRIE +#define LTDC_IT_RR LTDC_IER_RRIE +/** + * @} + */ + +/** @defgroup LTDC_Flags LTDC Flags + * @{ + */ +#define LTDC_FLAG_LI LTDC_ISR_LIF +#define LTDC_FLAG_FU LTDC_ISR_FUIF +#define LTDC_FLAG_TE LTDC_ISR_TERRIF +#define LTDC_FLAG_RR LTDC_ISR_RRIF +/** + * @} + */ + +/** @defgroup LTDC_Reload_Type LTDC Reload Type + * @{ + */ +#define LTDC_RELOAD_IMMEDIATE LTDC_SRCR_IMR /*!< Immediate Reload */ +#define LTDC_RELOAD_VERTICAL_BLANKING LTDC_SRCR_VBR /*!< Vertical Blanking Reload */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup LTDC_Exported_Macros LTDC Exported Macros + * @{ + */ + +/** @brief Reset LTDC handle state. + * @param __HANDLE__ LTDC handle + * @retval None + */ +#define __HAL_LTDC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_LTDC_STATE_RESET) + +/** + * @brief Enable the LTDC. + * @param __HANDLE__: LTDC handle + * @retval None. + */ +#define __HAL_LTDC_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->GCR |= LTDC_GCR_LTDCEN) + +/** + * @brief Disable the LTDC. + * @param __HANDLE__: LTDC handle + * @retval None. + */ +#define __HAL_LTDC_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->GCR &= ~(LTDC_GCR_LTDCEN)) + +/** + * @brief Enable the LTDC Layer. + * @param __HANDLE__ LTDC handle + * @param __LAYER__ Specify the layer to be enabled. + * This parameter can be LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). + * @retval None. + */ +#define __HAL_LTDC_LAYER_ENABLE(__HANDLE__, __LAYER__) ((LTDC_LAYER((__HANDLE__), (__LAYER__)))->CR |= (uint32_t)LTDC_LxCR_LEN) + +/** + * @brief Disable the LTDC Layer. + * @param __HANDLE__ LTDC handle + * @param __LAYER__ Specify the layer to be disabled. + * This parameter can be LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). + * @retval None. + */ +#define __HAL_LTDC_LAYER_DISABLE(__HANDLE__, __LAYER__) ((LTDC_LAYER((__HANDLE__), (__LAYER__)))->CR &= ~(uint32_t)LTDC_LxCR_LEN) + +/** + * @brief Reload immediately all LTDC Layers. + * @param __HANDLE__ LTDC handle + * @retval None. + */ +#define __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(__HANDLE__) ((__HANDLE__)->Instance->SRCR |= LTDC_SRCR_IMR) + +/** + * @brief Reload during vertical blanking period all LTDC Layers. + * @param __HANDLE__ LTDC handle + * @retval None. + */ +#define __HAL_LTDC_VERTICAL_BLANKING_RELOAD_CONFIG(__HANDLE__) ((__HANDLE__)->Instance->SRCR |= LTDC_SRCR_VBR) + +/* Interrupt & Flag management */ +/** + * @brief Get the LTDC pending flags. + * @param __HANDLE__: LTDC handle + * @param __FLAG__: Get the specified flag. + * This parameter can be any combination of the following values: + * @arg LTDC_FLAG_LI: Line Interrupt flag + * @arg LTDC_FLAG_FU: FIFO Underrun Interrupt flag + * @arg LTDC_FLAG_TE: Transfer Error interrupt flag + * @arg LTDC_FLAG_RR: Register Reload Interrupt Flag + * @retval The state of FLAG (SET or RESET). + */ +#define __HAL_LTDC_GET_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ISR & (__FLAG__)) + +/** + * @brief Clears the LTDC pending flags. + * @param __HANDLE__: LTDC handle + * @param __FLAG__: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg LTDC_FLAG_LI: Line Interrupt flag + * @arg LTDC_FLAG_FU: FIFO Underrun Interrupt flag + * @arg LTDC_FLAG_TE: Transfer Error interrupt flag + * @arg LTDC_FLAG_RR: Register Reload Interrupt Flag + * @retval None + */ +#define __HAL_LTDC_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ICR = (__FLAG__)) + +/** + * @brief Enables the specified LTDC interrupts. + * @param __HANDLE__: LTDC handle + * @param __INTERRUPT__: specifies the LTDC interrupt sources to be enabled. + * This parameter can be any combination of the following values: + * @arg LTDC_IT_LI: Line Interrupt flag + * @arg LTDC_IT_FU: FIFO Underrun Interrupt flag + * @arg LTDC_IT_TE: Transfer Error interrupt flag + * @arg LTDC_IT_RR: Register Reload Interrupt Flag + * @retval None + */ +#define __HAL_LTDC_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER |= (__INTERRUPT__)) + +/** + * @brief Disables the specified LTDC interrupts. + * @param __HANDLE__: LTDC handle + * @param __INTERRUPT__: specifies the LTDC interrupt sources to be disabled. + * This parameter can be any combination of the following values: + * @arg LTDC_IT_LI: Line Interrupt flag + * @arg LTDC_IT_FU: FIFO Underrun Interrupt flag + * @arg LTDC_IT_TE: Transfer Error interrupt flag + * @arg LTDC_IT_RR: Register Reload Interrupt Flag + * @retval None + */ +#define __HAL_LTDC_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER &= ~(__INTERRUPT__)) + +/** + * @brief Checks whether the specified LTDC interrupt has occurred or not. + * @param __HANDLE__: LTDC handle + * @param __INTERRUPT__: specifies the LTDC interrupt source to check. + * This parameter can be one of the following values: + * @arg LTDC_IT_LI: Line Interrupt flag + * @arg LTDC_IT_FU: FIFO Underrun Interrupt flag + * @arg LTDC_IT_TE: Transfer Error interrupt flag + * @arg LTDC_IT_RR: Register Reload Interrupt Flag + * @retval The state of INTERRUPT (SET or RESET). + */ +#define __HAL_LTDC_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->IER & (__INTERRUPT__)) +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup LTDC_Exported_Functions + * @{ + */ +/** @addtogroup LTDC_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization functions *****************************/ +HAL_StatusTypeDef HAL_LTDC_Clk_Div(uint8_t PLL2Q, uint8_t DckCfg); +HAL_StatusTypeDef HAL_LTDC_Init(LTDC_HandleTypeDef *hltdc); +HAL_StatusTypeDef HAL_LTDC_DeInit(LTDC_HandleTypeDef *hltdc); +void HAL_LTDC_MspInit(LTDC_HandleTypeDef* hltdc); +void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* hltdc); +void HAL_LTDC_ErrorCallback(LTDC_HandleTypeDef *hltdc); +void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc); +void HAL_LTDC_ReloadEventCallback(LTDC_HandleTypeDef *hltdc); +/** + * @} + */ + +/** @addtogroup LTDC_Exported_Functions_Group2 + * @{ + */ +/* IO operation functions *****************************************************/ +void HAL_LTDC_IRQHandler(LTDC_HandleTypeDef *hltdc); +void HAL_LTDC_ERR_IRQHandler(LTDC_HandleTypeDef *hltdc); +/** + * @} + */ + +/** @addtogroup LTDC_Exported_Functions_Group3 + * @{ + */ +/* Peripheral Control functions ***********************************************/ +HAL_StatusTypeDef HAL_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_SetWindowSize(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_SetWindowPosition(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_SetPixelFormat(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_SetAlpha(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_SetAddress(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx, uint32_t ReloadType); +HAL_StatusTypeDef HAL_LTDC_SetPitch(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t RGBValue, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_ConfigCLUT(LTDC_HandleTypeDef *hltdc, uint32_t *pCLUT, uint32_t CLUTSize, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_EnableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_DisableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_EnableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_DisableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_ProgramLineEvent(LTDC_HandleTypeDef *hltdc, uint32_t Line); +HAL_StatusTypeDef HAL_LTDC_EnableDither(LTDC_HandleTypeDef *hltdc); +HAL_StatusTypeDef HAL_LTDC_DisableDither(LTDC_HandleTypeDef *hltdc); +HAL_StatusTypeDef HAL_LTDC_Reload(LTDC_HandleTypeDef *hltdc, uint32_t ReloadType); +HAL_StatusTypeDef HAL_LTDC_ConfigLayer_NoReload(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_SetWindowSize_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_SetWindowPosition_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_SetPixelFormat_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_SetAlpha_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_SetAddress_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_SetPitch_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t RGBValue, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_EnableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_DisableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_EnableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); +HAL_StatusTypeDef HAL_LTDC_DisableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx); + +/** + * @} + */ + +/** @addtogroup LTDC_Exported_Functions_Group4 + * @{ + */ +/* Peripheral State functions *************************************************/ +HAL_LTDC_StateTypeDef HAL_LTDC_GetState(LTDC_HandleTypeDef *hltdc); +uint32_t HAL_LTDC_GetError(LTDC_HandleTypeDef *hltdc); +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/** @defgroup LTDC_Private_Types LTDC Private Types + * @{ + */ + +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/** @defgroup LTDC_Private_Variables LTDC Private Variables + * @{ + */ + +/** + * @} + */ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup LTDC_Private_Constants LTDC Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup LTDC_Private_Macros LTDC Private Macros + * @{ + */ +#define IS_LTDC_ALL_INSTANCE(INSTANCE) ((INSTANCE) == LTDC) +#define LTDC_LAYER(__HANDLE__, __LAYER__) ((LTDC_Layer_TypeDef *)((uint32_t)(((uint32_t)((__HANDLE__)->Instance)) + 0x84 + (0x80*(__LAYER__))))) +#define IS_LTDC_LAYER(__LAYER__) ((__LAYER__) < MAX_LAYER) +#define IS_LTDC_HSPOL(__HSPOL__) (((__HSPOL__) == LTDC_HSPOLARITY_AL) || ((__HSPOL__) == LTDC_HSPOLARITY_AH)) +#define IS_LTDC_VSPOL(__VSPOL__) (((__VSPOL__) == LTDC_VSPOLARITY_AL) || ((__VSPOL__) == LTDC_VSPOLARITY_AH)) +#define IS_LTDC_DEPOL(__DEPOL__) (((__DEPOL__) == LTDC_DEPOLARITY_AL) || ((__DEPOL__) == LTDC_DEPOLARITY_AH)) +#define IS_LTDC_PCPOL(__PCPOL__) (((__PCPOL__) == LTDC_PCPOLARITY_IPC) || ((__PCPOL__) == LTDC_PCPOLARITY_IIPC)) +#define IS_LTDC_HSYNC(__HSYNC__) ((__HSYNC__) <= LTDC_HORIZONTALSYNC) +#define IS_LTDC_VSYNC(__VSYNC__) ((__VSYNC__) <= LTDC_VERTICALSYNC) +#define IS_LTDC_AHBP(__AHBP__) ((__AHBP__) <= LTDC_HORIZONTALSYNC) +#define IS_LTDC_AVBP(__AVBP__) ((__AVBP__) <= LTDC_VERTICALSYNC) +#define IS_LTDC_AAW(__AAW__) ((__AAW__) <= LTDC_HORIZONTALSYNC) +#define IS_LTDC_AAH(__AAH__) ((__AAH__) <= LTDC_VERTICALSYNC) +#define IS_LTDC_TOTALW(__TOTALW__) ((__TOTALW__) <= LTDC_HORIZONTALSYNC) +#define IS_LTDC_TOTALH(__TOTALH__) ((__TOTALH__) <= LTDC_VERTICALSYNC) +#define IS_LTDC_BLUEVALUE(__BBLUE__) ((__BBLUE__) <= LTDC_COLOR) +#define IS_LTDC_GREENVALUE(__BGREEN__) ((__BGREEN__) <= LTDC_COLOR) +#define IS_LTDC_REDVALUE(__BRED__) ((__BRED__) <= LTDC_COLOR) +#define IS_LTDC_BLENDING_FACTOR1(__BLENDING_FACTOR1__) (((__BLENDING_FACTOR1__) == LTDC_BLENDING_FACTOR1_CA) || \ + ((__BLENDING_FACTOR1__) == LTDC_BLENDING_FACTOR1_PAxCA)) +#define IS_LTDC_BLENDING_FACTOR2(__BLENDING_FACTOR2__) (((__BLENDING_FACTOR2__) == LTDC_BLENDING_FACTOR2_CA) || \ + ((__BLENDING_FACTOR2__) == LTDC_BLENDING_FACTOR2_PAxCA)) + +#define IS_LTDC_PIXEL_FORMAT(__PIXEL_FORMAT__) (((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_ARGB8888) || ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_RGB888) || \ + ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_RGB565) || ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_ARGB1555) || \ + ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_ARGB4444) || ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_L8) || \ + ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_AL44) || ((__PIXEL_FORMAT__) == LTDC_PIXEL_FORMAT_AL88)) + +#define IS_LTDC_ALPHA(__ALPHA__) ((__ALPHA__) <= LTDC_ALPHA) +#define IS_LTDC_HCONFIGST(__HCONFIGST__) ((__HCONFIGST__) <= LTDC_STARTPOSITION) +#define IS_LTDC_HCONFIGSP(__HCONFIGSP__) ((__HCONFIGSP__) <= LTDC_STOPPOSITION) +#define IS_LTDC_VCONFIGST(__VCONFIGST__) ((__VCONFIGST__) <= LTDC_STARTPOSITION) +#define IS_LTDC_VCONFIGSP(__VCONFIGSP__) ((__VCONFIGSP__) <= LTDC_STOPPOSITION) +#define IS_LTDC_CFBP(__CFBP__) ((__CFBP__) <= LTDC_COLOR_FRAME_BUFFER) +#define IS_LTDC_CFBLL(__CFBLL__) ((__CFBLL__) <= LTDC_COLOR_FRAME_BUFFER) +#define IS_LTDC_CFBLNBR(__CFBLNBR__) ((__CFBLNBR__) <= LTDC_LINE_NUMBER) +#define IS_LTDC_LIPOS(__LIPOS__) ((__LIPOS__) <= 0x7FFU) +#define IS_LTDC_RELOAD(__RELOADTYPE__) (((__RELOADTYPE__) == LTDC_RELOAD_IMMEDIATE) || ((__RELOADTYPE__) == LTDC_RELOAD_VERTICAL_BLANKING)) +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup LTDC_Private_Functions LTDC Private Functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif //#ifdef __HAL_LTDC_H__ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_mdac.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_mdac.h new file mode 100644 index 0000000000..23f7acaf8d --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_mdac.h @@ -0,0 +1,126 @@ +/* + ****************************************************************************** + * @file HAL_DAC.h + * @version V1.0.0 + * @date 2020 + * @brief Header file of DAC HAL module. + ****************************************************************************** +*/ +#ifndef __HAL_DAC_H__ +#define __HAL_DAC_H__ + +#include "acm32h5xx_hal_conf.h" + + +/** + * @brief DAC Configuration regular Channel structure definition + */ +typedef struct +{ + FunctionalState SelfCalibrateEn; + + FunctionalState SampleEn; /*!< Specifies voltage DAC sample and hold mode. + This parameter can be ENABLE or DISABLE */ +//use the trimvalue in NVR +// uint32_t TrimValue; /*!< Specifies the offset trimming value +// This parameter must be a number between Min_Data = 1 and Max_Data = 31 */ + + uint32_t BufferMode; /*!< Specifies if voltage DAC output buffer is enabled or not. + This parameter can be MDAC_VDAC_BUFFER_ENABLE or MDAC_VDAC_BUFFER_DISABLE */ + +}VDAC_ChannelConfigTypeDef; + +/** + * @brief DAC Configuration regular Channel structure definition + */ +typedef struct +{ + uint32_t ITurn; + +}IDAC_ChannelConfigTypeDef; + + +/** + * @brief MDAC handle Structure definition + */ +typedef struct +{ + MDAC_TypeDef *Instance; /*!< Register base address */ +}MDAC_HandleTypeDef; + + +#define MDAC_VDAC_BUFFER_ENABLE (0) +#define MDAC_VDAC_BUFFER_DISABLE (2) + +#define IS_MDAC_INSTANCE(INSTANCE) ((INSTANCE) == MDAC) + +#define IS_VDAC_CHANNEL_NUM(CH) ((CH) < 12) + +#define IS_VDAC_BUFFER_MODE(MODE) (((MODE) == MDAC_VDAC_BUFFER_ENABLE) || \ + (MODE) == MDAC_VDAC_BUFFER_DISABLE) + +#define IS_VDAC_TRIM_VALUE(VAL) ((VAL) < 31) + +#define IS_IDAC_CHANNEL_NUM(CH) ((CH) < 4) + +#define ITURN_FACTORY (32) + +#define IS_IDAC_ITURN(T) ((T) <= ITURN_FACTORY) + +#define MDAC_MAX_V_CHANNEL_NUM (12) +#define MDAC_MAX_I_CHANNEL_NUM (4) + + + + + /** @defgroup DAC_UserTrimming DAC User Trimming +* @{ +*/ + +#define DAC_TRIMMING_FACTORY 0x00000000U /*!< Factory trimming */ +#define DAC_TRIMMING_USER 0x00000001U /*!< User trimming */ +#define IS_DAC_TRIMMING(TRIMMING) (((TRIMMING) == DAC_TRIMMING_FACTORY) || \ + ((TRIMMING) == DAC_TRIMMING_USER)) +#define IS_DAC_TRIMMINGVALUE(TRIMMINGVALUE) ((TRIMMINGVALUE) <= 0x1FU) +/** + * @} + */ + + /** @defgroup DAC_Calibration + * @{ + */ + +#define DAC_Calibration_Disable 0x00000000U +#define DAC_Calibration_Enable 0x00000001U +#define IS_DAC_Calibration(Calibration) (((Calibration) == DAC_Calibration_Disable) || \ + ((Calibration) == DAC_Calibration_Enable)) + +#define IS_DAC_Calibration_TRIM(TRIM) ((TRIM) <= 0x1FU) +/** + * @} + */ + +/** + * @} + */ + + +void HAL_MDAC_MspInit(MDAC_HandleTypeDef *hMDAC); +__weak void HAL_MDAC_MspDeInit(MDAC_HandleTypeDef* hMDAC); + +HAL_StatusTypeDef HAL_MDAC_Init(MDAC_HandleTypeDef *hMDAC); +HAL_StatusTypeDef HAL_MDAC_DeInit(MDAC_HandleTypeDef *hMDAC); + +HAL_StatusTypeDef HAL_MDAC_ConfigVoltageChannel(MDAC_HandleTypeDef* hmdac, uint32_t Channel, VDAC_ChannelConfigTypeDef* Config); +HAL_StatusTypeDef HAL_MDAC_SetVoltageValue(MDAC_HandleTypeDef *hMDAC, uint32_t Channel, uint32_t Data); +uint32_t HAL_MDAC_GetVoltageValue(MDAC_HandleTypeDef* hMDAC, uint32_t Channel); + +HAL_StatusTypeDef HAL_MDAC_ConfigCurrentChannel(MDAC_HandleTypeDef* hmdac, uint32_t Channel, IDAC_ChannelConfigTypeDef* Config); +HAL_StatusTypeDef HAL_MDAC_SetCurrentValue(MDAC_HandleTypeDef *hMDAC, uint32_t Channel, uint32_t Data); +uint32_t HAL_MDAC_GetCurrentValue(MDAC_HandleTypeDef* hMDAC, uint32_t Channel); + +HAL_StatusTypeDef HAL_MDAC_SetVoltageTrim(MDAC_HandleTypeDef *hmdac, uint32_t Channel, uint32_t TrimVal); +uint32_t HAL_MDAC_GetVoltageTrimValue(MDAC_HandleTypeDef *hmdac, uint32_t Channel); + +HAL_StatusTypeDef HAL_MDAC_VoltageSelfcalibrate(MDAC_HandleTypeDef *hmdac, uint32_t Channel); +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_nand.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_nand.h new file mode 100644 index 0000000000..16e2a715af --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_nand.h @@ -0,0 +1,630 @@ + +/****************************************************************************** +*@file : hal_nand.h +*@brief : Header file for Nand module. +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ + +#ifndef __HAL_NAND_H__ +#define __HAL_NAND_H__ + +#include "hal.h" + +/** @defgroup GPIO PORT + * @{ + */ + +/*Data Ports*/ +#define FMC_NAND_D0_GPIO_PORT GPIOD +#define FMC_NAND_D0_GPIO_PIN GPIO_PIN_14 + +#define FMC_NAND_D1_GPIO_PORT GPIOD +#define FMC_NAND_D1_GPIO_PIN GPIO_PIN_15 + +#define FMC_NAND_D2_GPIO_PORT GPIOD +#define FMC_NAND_D2_GPIO_PIN GPIO_PIN_0 + +#define FMC_NAND_D3_GPIO_PORT GPIOD +#define FMC_NAND_D3_GPIO_PIN GPIO_PIN_1 + +#define FMC_NAND_D4_GPIO_PORT GPIOE +#define FMC_NAND_D4_GPIO_PIN GPIO_PIN_7 + +#define FMC_NAND_D5_GPIO_PORT GPIOE +#define FMC_NAND_D5_GPIO_PIN GPIO_PIN_8 + +#define FMC_NAND_D6_GPIO_PORT GPIOE +#define FMC_NAND_D6_GPIO_PIN GPIO_PIN_9 + +#define FMC_NAND_D7_GPIO_PORT GPIOE +#define FMC_NAND_D7_GPIO_PIN GPIO_PIN_10 + +/*Control Ports*/ +#define FMC_NAND_CEN_GPIO_PORT GPIOG +#define FMC_NAND_CEN_GPIO_PIN GPIO_PIN_9 + +#define FMC_NAND_WEN_GPIO_PORT GPIOD +#define FMC_NAND_WEN_GPIO_PIN GPIO_PIN_5 + +#define FMC_NAND_REN_GPIO_PORT GPIOD +#define FMC_NAND_REN_GPIO_PIN GPIO_PIN_4 + +#define FMC_NAND_CLE_GPIO_PORT GPIOD +#define FMC_NAND_CLE_GPIO_PIN GPIO_PIN_11 + +#define FMC_NAND_ALE_GPIO_PORT GPIOD +#define FMC_NAND_ALE_GPIO_PIN GPIO_PIN_12 + +#define FMC_NAND_RBN_GPIO_PORT GPIOG +#define FMC_NAND_RBN_GPIO_PIN GPIO_PIN_7 +/** + * @} + */ + +/** @defgroup FMC_NAND CMD + * @{ + */ + +#define FMC_NAND_CMD_READ1 0x00 +#define FMC_NAND_CMD_READ2 0x30 +#define FMC_NAND_CMD_ID 0x90 +#define FMC_NAND_CMD_STATUS 0x70 +#define FMC_NAND_CMD_RESET 0xFF +#define FMC_NAND_CMD_PROGRAM1 0x80 +#define FMC_NAND_CMD_PROGRAM2 0x10 +#define FMC_NAND_CMD_ERASE1 0x60 +#define FMC_NAND_CMD_ERASE2 0xD0 +#define FMC_NAND_CMD_RANDOMINPUT 0x85 +#define FMC_NAND_CMD_RANDOMOUTPUT1 0x05 +#define FMC_NAND_CMD_RANDOMOUTPUT2 0xE0 +#define FMC_NAND_CMD_FEATURE 0xEF +/** + * @} + */ + +/** @defgroup FMC_NAND Private Macros + * @{ + */ + +#define IS_FMC_NAND_ALL_INSTANCE(__INSTANCE__) ((__INSTANCE__) == FMC_NAND) + +/** + * @} + */ + +/** @defgroup FMC_NAND EDO_EN + * @{ + */ + #define FMC_NAND_EDO_EN (0x00000080U) /*!< EDO Enable */ + #define FMC_NAND_EDO_DIS (0x00000000U) /*!< EDO Disable */ + #define IS_FMC_NAND_EDO_EN(EN) (((EN) == FMC_NAND_EDO_EN || \ + ((EN) <= FMC_NAND_EDO_DIS))) +/** + * @} + */ + +/** @defgroup FMC_NAND RBN_INT EN + * @{ + */ + #define FMC_NAND_RBN_INT_EN (0x00000040U) /*!< RBN INT Enable */ + #define FMC_NAND_RBN_INT_DIS (0x00000000U) /*!< RBN INT Disable */ + #define IS_FMC_NAND_RBNINT_EN(EN) (((EN) == FMC_NAND_RBN_INT_EN || \ + ((EN) <= FMC_NAND_RBN_INT_DIS))) +/** + * @} + */ + +/** @defgroup FMC_NAND ENDIAN + * @{ + */ + #define FMC_NAND_ENDIAN_BIG (0x00000020U) /*!< Big Endian */ + #define FMC_NAND_ENDIAN_LITTLE (0x00000000U) /*!< Little Endian */ + #define IS_FMC_NAND_ENDIAN_EN(ENDIAN) (((ENDIAN) == FMC_NAND_ENDIAN_BIG || \ + ((ENDIAN) <= FMC_NAND_ENDIAN_LITTLE))) +/** + * @} + */ + +/** @defgroup FMC_NAND FWP + * @{ + */ + #define FMC_NAND_FWP_EN (0x00000000U) /*!< FWP Enable */ + #define FMC_NAND_FWP_DIS (0x00000010U) /*!< FWP Disable */ + #define IS_FMC_NAND_FWP_EN(FWP) (((FWP) == FMC_NAND_FWP_EN || \ + ((FWP) <= FMC_NAND_FWP_DIS))) +/** + * @} + */ + +/** @defgroup FMC_NAND FCE + * @{ + */ + #define FMC_NAND_FCE_EN (0x0000000eU) /*!< FCE Enable */ + #define FMC_NAND_FCE_DIS (0x0000000fU) /*!< FCE Disable */ + #define IS_FMC_NAND_FCE_EN(FCE) (((FCE) == FMC_NAND_FCE_EN || \ + ((FCE) <= FMC_NAND_FCE_DIS))) +/** + * @} + */ + +/** @defgroup tADL_Clock + * @{ + */ +#define FMC_NAND_TADL_NONE (0U) +#define FMC_NAND_TADL_1CLOCK (FMC_NAND_WST_TADL_0) +#define FMC_NAND_TADL_2CLOCK (FMC_NAND_WST_TADL_1) +#define FMC_NAND_TADL_3CLOCK (FMC_NAND_WST_TADL_0 | FMC_NAND_WST_TADL_1) +#define FMC_NAND_TADL_4CLOCK (FMC_NAND_WST_TADL_2) +#define FMC_NAND_TADL_5CLOCK (FMC_NAND_WST_TADL_0 | FMC_NAND_WST_TADL2) +#define FMC_NAND_TADL_6CLOCK (FMC_NAND_WST_TADL_1 | FMC_NAND_WST_TADL2) +#define FMC_NAND_TADL_7CLOCK (FMC_NAND_WST_TADL_0 | FMC_NAND_WST_TADL1 | FMC_NAND_WST_TADL2) +#define FMC_NAND_TADL_8CLOCK (FMC_NAND_WST_TADL_3) +#define FMC_NAND_TADL_9CLOCK (FMC_NAND_WST_TADL_0 | FMC_NAND_WST_TADL_3) +#define FMC_NAND_TADL_10CLOCK (FMC_NAND_WST_TADL_1 | FMC_NAND_WST_TADL_3) +#define FMC_NAND_TADL_11CLOCK (FMC_NAND_WST_TADL_0 | FMC_NAND_WST_TADL_1 | FMC_NAND_WST_TADL_3) +#define FMC_NAND_TADL_12CLOCK (FMC_NAND_WST_TADL_2 | FMC_NAND_WST_TADL_3) +#define FMC_NAND_TADL_13CLOCK (FMC_NAND_WST_TADL_0 | FMC_NAND_WST_TADL_2 | FMC_NAND_WST_TADL_3) +#define FMC_NAND_TADL_14CLOCK (FMC_NAND_WST_TADL_1 | FMC_NAND_WST_TADL_2 | FMC_NAND_WST_TADL_3) +#define FMC_NAND_TADL_15CLOCK (FMC_NAND_WST_TADL_0 | FMC_NAND_WST_TADL_1 | FMC_NAND_WST_TADL_2 | FMC_NAND_WST_TADL_3) + +#define IS_FMC_NAND_TADL_CLOCK(CLOCK) (((CLOCK) == FMC_NAND_TADL_NONE || \ + ((CLOCK) == FMC_NAND_TADL_1CLOCK) || \ + ((CLOCK) == FMC_NAND_TADL_2CLOCK) || \ + ((CLOCK) == FMC_NAND_TADL_3CLOCK) || \ + ((CLOCK) == FMC_NAND_TADL_4CLOCK) || \ + ((CLOCK) == FMC_NAND_TADL_5CLOCK) || \ + ((CLOCK) == FMC_NAND_TADL_6CLOCK) || \ + ((CLOCK) == FMC_NAND_TADL_7CLOCK) || \ + ((CLOCK) == FMC_NAND_TADL_8CLOCK) || \ + ((CLOCK) == FMC_NAND_TADL_9CLOCK) || \ + ((CLOCK) == FMC_NAND_TADL_10CLOCK) || \ + ((CLOCK) == FMC_NAND_TADL_11CLOCK) || \ + ((CLOCK) == FMC_NAND_TADL_12CLOCK) || \ + ((CLOCK) == FMC_NAND_TADL_13CLOCK) || \ + ((CLOCK) == FMC_NAND_TADL_14CLOCK) || \ + ((CLOCK) <= FMC_NAND_TADL_15CLOCK))) +/** + * @} + */ + +/** @defgroup tRHW_Clock + * @{ + */ +#define FMC_NAND_TRHW_NONE (0U) +#define FMC_NAND_TRHW_1CLOCK (FMC_NAND_WST_TRHW_0) +#define FMC_NAND_TRHW_2CLOCK (FMC_NAND_WST_TRHW_1) +#define FMC_NAND_TRHW_3CLOCK (FMC_NAND_WST_TRHW_0 | FMC_NAND_WST_TRHW_1) +#define FMC_NAND_TRHW_4CLOCK (FMC_NAND_WST_TRHW_2) +#define FMC_NAND_TRHW_5CLOCK (FMC_NAND_WST_TRHW_0 | FMC_NAND_WST_TRHW_2) +#define FMC_NAND_TRHW_6CLOCK (FMC_NAND_WST_TRHW_1 | FMC_NAND_WST_TRHW_2) +#define FMC_NAND_TRHW_7CLOCK (FMC_NAND_WST_TRHW_0 | FMC_NAND_WST_TRHW_1 | FMC_NAND_WST_TRHW_2) +#define FMC_NAND_TRHW_8CLOCK (FMC_NAND_WST_TRHW_3) +#define FMC_NAND_TRHW_9CLOCK (FMC_NAND_WST_TRHW_0 | FMC_NAND_WST_TRHW_3) +#define FMC_NAND_TRHW_10CLOCK (FMC_NAND_WST_TRHW_1 | FMC_NAND_WST_TRHW_3) +#define FMC_NAND_TRHW_11CLOCK (FMC_NAND_WST_TRHW_0 | FMC_NAND_WST_TRHW_1 | FMC_NAND_WST_TRHW_3) +#define FMC_NAND_TRHW_12CLOCK (FMC_NAND_WST_TRHW_2 | FMC_NAND_WST_TRHW_3) +#define FMC_NAND_TRHW_13CLOCK (FMC_NAND_WST_TRHW_0 | FMC_NAND_WST_TRHW_2 | FMC_NAND_WST_TRHW_3) +#define FMC_NAND_TRHW_14CLOCK (FMC_NAND_WST_TRHW_1 | FMC_NAND_WST_TRHW_2 | FMC_NAND_WST_TRHW_3) +#define FMC_NAND_TRHW_15CLOCK (FMC_NAND_WST_TRHW_0 | FMC_NAND_WST_TRHW_1 | FMC_NAND_WST_TRHW_2 | FMC_NAND_WST_TRHW_3) + +#define IS_FMC_NAND_TRHW_CLOCK(CLOCK) (((CLOCK) == FMC_NAND_TRHW_NONE || \ + ((CLOCK) == FMC_NAND_TRHW_1CLOCK) || \ + ((CLOCK) == FMC_NAND_TRHW_2CLOCK) || \ + ((CLOCK) == FMC_NAND_TRHW_3CLOCK) || \ + ((CLOCK) == FMC_NAND_TRHW_4CLOCK) || \ + ((CLOCK) == FMC_NAND_TRHW_5CLOCK) || \ + ((CLOCK) == FMC_NAND_TRHW_6CLOCK) || \ + ((CLOCK) == FMC_NAND_TRHW_7CLOCK) || \ + ((CLOCK) == FMC_NAND_TRHW_8CLOCK) || \ + ((CLOCK) == FMC_NAND_TRHW_9CLOCK) || \ + ((CLOCK) == FMC_NAND_TRHW_10CLOCK) || \ + ((CLOCK) == FMC_NAND_TRHW_11CLOCK) || \ + ((CLOCK) == FMC_NAND_TRHW_12CLOCK) || \ + ((CLOCK) == FMC_NAND_TRHW_13CLOCK) || \ + ((CLOCK) == FMC_NAND_TRHW_14CLOCK) || \ + ((CLOCK) <= FMC_NAND_TRHW_15CLOCK))) +/** + * @} + */ + +/** @defgroup tWHR_Clock + * @{ + */ +#define FMC_NAND_TWHR_NONE (0U) +#define FMC_NAND_TWHR_1CLOCK (FMC_NAND_WST_TWHR_0) +#define FMC_NAND_TWHR_2CLOCK (FMC_NAND_WST_TWHR_1) +#define FMC_NAND_TWHR_3CLOCK (FMC_NAND_WST_TWHR_0 | FMC_NAND_WST_TWHR_1) +#define FMC_NAND_TWHR_4CLOCK (FMC_NAND_WST_TWHR_2) +#define FMC_NAND_TWHR_5CLOCK (FMC_NAND_WST_TWHR_0 | FMC_NAND_WST_TWHR_2) +#define FMC_NAND_TWHR_6CLOCK (FMC_NAND_WST_TWHR_1 | FMC_NAND_WST_TWHR_2) +#define FMC_NAND_TWHR_7CLOCK (FMC_NAND_WST_TWHR_0 | FMC_NAND_WST_TWHR_1 | FMC_NAND_WST_TWHR_2) +#define FMC_NAND_TWHR_8CLOCK (FMC_NAND_WST_TWHR_3) +#define FMC_NAND_TWHR_9CLOCK (FMC_NAND_WST_TWHR_0 | FMC_NAND_WST_TWHR_3) +#define FMC_NAND_TWHR_10CLOCK (FMC_NAND_WST_TWHR_1 | FMC_NAND_WST_TWHR_3) +#define FMC_NAND_TWHR_11CLOCK (FMC_NAND_WST_TWHR_0 | FMC_NAND_WST_TWHR_1 | FMC_NAND_WST_TWHR_3) +#define FMC_NAND_TWHR_12CLOCK (FMC_NAND_WST_TWHR_2 | FMC_NAND_WST_TWHR_3) +#define FMC_NAND_TWHR_13CLOCK (FMC_NAND_WST_TWHR_0 | FMC_NAND_WST_TWHR_2 | FMC_NAND_WST_TWHR_3) +#define FMC_NAND_TWHR_14CLOCK (FMC_NAND_WST_TWHR_1 | FMC_NAND_WST_TWHR_2 | FMC_NAND_WST_TWHR_3) +#define FMC_NAND_TWHR_15CLOCK (FMC_NAND_WST_TWHR_0 | FMC_NAND_WST_TWHR_1 | FMC_NAND_WST_TWHR_2 | FMC_NAND_WST_TWHR_3) + +#define IS_FMC_NAND_TWHR_CLOCK(CLOCK) (((CLOCK) == FMC_NAND_TWHR_NONE || \ + ((CLOCK) == FMC_NAND_TWHR_1CLOCK) || \ + ((CLOCK) == FMC_NAND_TWHR_2CLOCK) || \ + ((CLOCK) == FMC_NAND_TWHR_3CLOCK) || \ + ((CLOCK) == FMC_NAND_TWHR_4CLOCK) || \ + ((CLOCK) == FMC_NAND_TWHR_5CLOCK) || \ + ((CLOCK) == FMC_NAND_TWHR_6CLOCK) || \ + ((CLOCK) == FMC_NAND_TWHR_7CLOCK) || \ + ((CLOCK) == FMC_NAND_TWHR_8CLOCK) || \ + ((CLOCK) == FMC_NAND_TWHR_9CLOCK) || \ + ((CLOCK) == FMC_NAND_TWHR_10CLOCK) || \ + ((CLOCK) == FMC_NAND_TWHR_11CLOCK) || \ + ((CLOCK) == FMC_NAND_TWHR_12CLOCK) || \ + ((CLOCK) == FMC_NAND_TWHR_13CLOCK) || \ + ((CLOCK) == FMC_NAND_TWHR_14CLOCK) || \ + ((CLOCK) <= FMC_NAND_TWHR_15CLOCK))) +/** + * @} + */ + + +/** @defgroup tREH_Clock + * @{ + */ +#define FMC_NAND_TREH_NONE (0U) +#define FMC_NAND_TREH_1CLOCK (FMC_NAND_WST_TREH_0) +#define FMC_NAND_TREH_2CLOCK (FMC_NAND_WST_TREH_1) +#define FMC_NAND_TREH_3CLOCK (FMC_NAND_WST_TREH_0 | FMC_NAND_WST_TREH_1) +#define FMC_NAND_TREH_4CLOCK (FMC_NAND_WST_TREH_2) +#define FMC_NAND_TREH_5CLOCK (FMC_NAND_WST_TREH_0 | FMC_NAND_WST_TREH_2) +#define FMC_NAND_TREH_6CLOCK (FMC_NAND_WST_TREH_1 | FMC_NAND_WST_TREH_2) +#define FMC_NAND_TREH_7CLOCK (FMC_NAND_WST_TREH_0 | FMC_NAND_WST_TREH_1 | FMC_NAND_WST_TREH_2) +#define FMC_NAND_TREH_8CLOCK (FMC_NAND_WST_TREH_3) +#define FMC_NAND_TREH_9CLOCK (FMC_NAND_WST_TREH_0 | FMC_NAND_WST_TREH_3) +#define FMC_NAND_TREH_10CLOCK (FMC_NAND_WST_TREH_1 | FMC_NAND_WST_TREH_3) +#define FMC_NAND_TREH_11CLOCK (FMC_NAND_WST_TREH_0 | FMC_NAND_WST_TREH_1 | FMC_NAND_WST_TREH_3) +#define FMC_NAND_TREH_12CLOCK (FMC_NAND_WST_TREH_2 | FMC_NAND_WST_TREH_3) +#define FMC_NAND_TREH_13CLOCK (FMC_NAND_WST_TREH_0 | FMC_NAND_WST_TREH_2 | FMC_NAND_WST_TREH_3) +#define FMC_NAND_TREH_14CLOCK (FMC_NAND_WST_TREH_1 | FMC_NAND_WST_TREH_2 | FMC_NAND_WST_TREH_3) +#define FMC_NAND_TREH_15CLOCK (FMC_NAND_WST_TREH_0 | FMC_NAND_WST_TREH_1 | FMC_NAND_WST_TREH_2 | FMC_NAND_WST_TREH_3) + +#define IS_FMC_NAND_TREH_CLOCK(CLOCK) (((CLOCK) == FMC_NAND_TREH_NONE || \ + ((CLOCK) == FMC_NAND_TREH_1CLOCK) || \ + ((CLOCK) == FMC_NAND_TREH_2CLOCK) || \ + ((CLOCK) == FMC_NAND_TREH_3CLOCK) || \ + ((CLOCK) == FMC_NAND_TREH_4CLOCK) || \ + ((CLOCK) == FMC_NAND_TREH_5CLOCK) || \ + ((CLOCK) == FMC_NAND_TREH_6CLOCK) || \ + ((CLOCK) == FMC_NAND_TREH_7CLOCK) || \ + ((CLOCK) == FMC_NAND_TREH_8CLOCK) || \ + ((CLOCK) == FMC_NAND_TREH_9CLOCK) || \ + ((CLOCK) == FMC_NAND_TREH_10CLOCK) || \ + ((CLOCK) == FMC_NAND_TREH_11CLOCK) || \ + ((CLOCK) == FMC_NAND_TREH_12CLOCK) || \ + ((CLOCK) == FMC_NAND_TREH_13CLOCK) || \ + ((CLOCK) == FMC_NAND_TREH_14CLOCK) || \ + ((CLOCK) <= FMC_NAND_TREH_15CLOCK))) +/** + * @} + */ + + +/** @defgroup tRP_Clock + * @{ + */ +#define FMC_NAND_TRP_NONE (0U) +#define FMC_NAND_TRP_1CLOCK (FMC_NAND_WST_TRP_0) +#define FMC_NAND_TRP_2CLOCK (FMC_NAND_WST_TRP_1) +#define FMC_NAND_TRP_3CLOCK (FMC_NAND_WST_TRP_0 | FMC_NAND_WST_TRP_1) +#define FMC_NAND_TRP_4CLOCK (FMC_NAND_WST_TRP_2) +#define FMC_NAND_TRP_5CLOCK (FMC_NAND_WST_TRP_0 | FMC_NAND_WST_TRP_2) +#define FMC_NAND_TRP_6CLOCK (FMC_NAND_WST_TRP_1 | FMC_NAND_WST_TRP_2) +#define FMC_NAND_TRP_7CLOCK (FMC_NAND_WST_TRP_0 | FMC_NAND_WST_TRP_1 | FMC_NAND_WST_TRP_2) +#define FMC_NAND_TRP_8CLOCK (FMC_NAND_WST_TRP_3) +#define FMC_NAND_TRP_9CLOCK (FMC_NAND_WST_TRP_0 | FMC_NAND_WST_TRP_3) +#define FMC_NAND_TRP_10CLOCK (FMC_NAND_WST_TRP_1 | FMC_NAND_WST_TRP_3) +#define FMC_NAND_TRP_11CLOCK (FMC_NAND_WST_TRP_0 | FMC_NAND_WST_TRP_1 | FMC_NAND_WST_TRP_3) +#define FMC_NAND_TRP_12CLOCK (FMC_NAND_WST_TRP_2 | FMC_NAND_WST_TRP_3) +#define FMC_NAND_TRP_13CLOCK (FMC_NAND_WST_TRP_0 | FMC_NAND_WST_TRP_2 | FMC_NAND_WST_TRP_3) +#define FMC_NAND_TRP_14CLOCK (FMC_NAND_WST_TRP_1 | FMC_NAND_WST_TRP_2 | FMC_NAND_WST_TRP_3) +#define FMC_NAND_TRP_15CLOCK (FMC_NAND_WST_TRP_0 | FMC_NAND_WST_TRP_1 | FMC_NAND_WST_TRP_2 | FMC_NAND_WST_TRP_3) + +#define IS_FMC_NAND_TRP_CLOCK(CLOCK) (((CLOCK) == FMC_NAND_TRP_NONE || \ + ((CLOCK) == FMC_NAND_TRP_1CLOCK) || \ + ((CLOCK) == FMC_NAND_TRP_2CLOCK) || \ + ((CLOCK) == FMC_NAND_TRP_3CLOCK) || \ + ((CLOCK) == FMC_NAND_TRP_4CLOCK) || \ + ((CLOCK) == FMC_NAND_TRP_5CLOCK) || \ + ((CLOCK) == FMC_NAND_TRP_6CLOCK) || \ + ((CLOCK) == FMC_NAND_TRP_7CLOCK) || \ + ((CLOCK) == FMC_NAND_TRP_8CLOCK) || \ + ((CLOCK) == FMC_NAND_TRP_9CLOCK) || \ + ((CLOCK) == FMC_NAND_TRP_10CLOCK) || \ + ((CLOCK) == FMC_NAND_TRP_11CLOCK) || \ + ((CLOCK) == FMC_NAND_TRP_12CLOCK) || \ + ((CLOCK) == FMC_NAND_TRP_13CLOCK) || \ + ((CLOCK) == FMC_NAND_TRP_14CLOCK) || \ + ((CLOCK) <= FMC_NAND_TRP_15CLOCK))) +/** + * @} + */ + +/** @defgroup tWH_Clock + * @{ + */ +#define FMC_NAND_TWH_NONE (0U) +#define FMC_NAND_TWH_1CLOCK (FMC_NAND_WST_TWH_0) +#define FMC_NAND_TWH_2CLOCK (FMC_NAND_WST_TWH_1) +#define FMC_NAND_TWH_3CLOCK (FMC_NAND_WST_TWH_0 | FMC_NAND_WST_TWH_1) +#define FMC_NAND_TWH_4CLOCK (FMC_NAND_WST_TWH_2) +#define FMC_NAND_TWH_5CLOCK (FMC_NAND_WST_TWH_0 | FMC_NAND_WST_TWH_2) +#define FMC_NAND_TWH_6CLOCK (FMC_NAND_WST_TWH_1 | FMC_NAND_WST_TWH_2) +#define FMC_NAND_TWH_7CLOCK (FMC_NAND_WST_TWH_0 | FMC_NAND_WST_TWH_1 | FMC_NAND_WST_TWH_2) +#define FMC_NAND_TWH_8CLOCK (FMC_NAND_WST_TWH_3) +#define FMC_NAND_TWH_9CLOCK (FMC_NAND_WST_TWH_0 | FMC_NAND_WST_TWH_3) +#define FMC_NAND_TWH_10CLOCK (FMC_NAND_WST_TWH_1 | FMC_NAND_WST_TWH_3) +#define FMC_NAND_TWH_11CLOCK (FMC_NAND_WST_TWH_0 | FMC_NAND_WST_TWH_1 | FMC_NAND_WST_TWH_3) +#define FMC_NAND_TWH_12CLOCK (FMC_NAND_WST_TWH_2 | FMC_NAND_WST_TWH_3) +#define FMC_NAND_TWH_13CLOCK (FMC_NAND_WST_TWH_0 | FMC_NAND_WST_TWH_2 | FMC_NAND_WST_TWH_3) +#define FMC_NAND_TWH_14CLOCK (FMC_NAND_WST_TWH_1 | FMC_NAND_WST_TWH_2 | FMC_NAND_WST_TWH_3) +#define FMC_NAND_TWH_15CLOCK (FMC_NAND_WST_TWH_0 | FMC_NAND_WST_TWH_1 | FMC_NAND_WST_TWH_2 | FMC_NAND_WST_TWH_3) + +#define IS_FMC_NAND_TWH_CLOCK(CLOCK) (((CLOCK) == FMC_NAND_TWH_NONE || \ + ((CLOCK) == FMC_NAND_TWH_1CLOCK) || \ + ((CLOCK) == FMC_NAND_TWH_2CLOCK) || \ + ((CLOCK) == FMC_NAND_TWH_3CLOCK) || \ + ((CLOCK) == FMC_NAND_TWH_4CLOCK) || \ + ((CLOCK) == FMC_NAND_TWH_5CLOCK) || \ + ((CLOCK) == FMC_NAND_TWH_6CLOCK) || \ + ((CLOCK) == FMC_NAND_TWH_7CLOCK) || \ + ((CLOCK) == FMC_NAND_TWH_8CLOCK) || \ + ((CLOCK) == FMC_NAND_TWH_9CLOCK) || \ + ((CLOCK) == FMC_NAND_TWH_10CLOCK) || \ + ((CLOCK) == FMC_NAND_TWH_11CLOCK) || \ + ((CLOCK) == FMC_NAND_TWH_12CLOCK) || \ + ((CLOCK) == FMC_NAND_TWH_13CLOCK) || \ + ((CLOCK) == FMC_NAND_TWH_14CLOCK) || \ + ((CLOCK) <= FMC_NAND_TWH_15CLOCK))) +/** + * @} + */ + +/** @defgroup tWP_Clock + * @{ + */ +#define FMC_NAND_TWP_NONE (0U) +#define FMC_NAND_TWP_1CLOCK (FMC_NAND_WST_TWP_0) +#define FMC_NAND_TWP_2CLOCK (FMC_NAND_WST_TWP_1) +#define FMC_NAND_TWP_3CLOCK (FMC_NAND_WST_TWP_0 | FMC_NAND_WST_TWP_1) +#define FMC_NAND_TWP_4CLOCK (FMC_NAND_WST_TWP_2) +#define FMC_NAND_TWP_5CLOCK (FMC_NAND_WST_TWP_0 | FMC_NAND_WST_TWP_2) +#define FMC_NAND_TWP_6CLOCK (FMC_NAND_WST_TWP_1 | FMC_NAND_WST_TWP_2) +#define FMC_NAND_TWP_7CLOCK (FMC_NAND_WST_TWP_0 | FMC_NAND_WST_TWP_1 | FMC_NAND_WST_TWP_2) +#define FMC_NAND_TWP_8CLOCK (FMC_NAND_WST_TWP_3) +#define FMC_NAND_TWP_9CLOCK (FMC_NAND_WST_TWP_0 | FMC_NAND_WST_TWP_3) +#define FMC_NAND_TWP_10CLOCK (FMC_NAND_WST_TWP_1 | FMC_NAND_WST_TWP_3) +#define FMC_NAND_TWP_11CLOCK (FMC_NAND_WST_TWP_0 | FMC_NAND_WST_TWP_1 | FMC_NAND_WST_TWP_3) +#define FMC_NAND_TWP_12CLOCK (FMC_NAND_WST_TWP_2 | FMC_NAND_WST_TWP_3) +#define FMC_NAND_TWP_13CLOCK (FMC_NAND_WST_TWP_0 | FMC_NAND_WST_TWP_2 | FMC_NAND_WST_TWP_3) +#define FMC_NAND_TWP_14CLOCK (FMC_NAND_WST_TWP_1 | FMC_NAND_WST_TWP_2 | FMC_NAND_WST_TWP_3) +#define FMC_NAND_TWP_15CLOCK (FMC_NAND_WST_TWP_0 | FMC_NAND_WST_TWP_1 | FMC_NAND_WST_TWP_2 | FMC_NAND_WST_TWP_3) + +#define IS_FMC_NAND_TWP_CLOCK(CLOCK) (((CLOCK) == FMC_NAND_TWP_NONE || \ + ((CLOCK) == FMC_NAND_TWP_1CLOCK) || \ + ((CLOCK) == FMC_NAND_TWP_2CLOCK) || \ + ((CLOCK) == FMC_NAND_TWP_3CLOCK) || \ + ((CLOCK) == FMC_NAND_TWP_4CLOCK) || \ + ((CLOCK) == FMC_NAND_TWP_5CLOCK) || \ + ((CLOCK) == FMC_NAND_TWP_6CLOCK) || \ + ((CLOCK) == FMC_NAND_TWP_7CLOCK) || \ + ((CLOCK) == FMC_NAND_TWP_8CLOCK) || \ + ((CLOCK) == FMC_NAND_TWP_9CLOCK) || \ + ((CLOCK) == FMC_NAND_TWP_10CLOCK) || \ + ((CLOCK) == FMC_NAND_TWP_11CLOCK) || \ + ((CLOCK) == FMC_NAND_TWP_12CLOCK) || \ + ((CLOCK) == FMC_NAND_TWP_13CLOCK) || \ + ((CLOCK) == FMC_NAND_TWP_14CLOCK) || \ + ((CLOCK) <= FMC_NAND_TWP_15CLOCK))) +/** + * @} + */ + +/** @defgroup FMC_NAND CMD + * @{ + */ + +#define FMC_NAND_CMD_READ1 0x00 +#define FMC_NAND_CMD_READ2 0x30 +#define FMC_NAND_CMD_ID 0x90 +#define FMC_NAND_CMD_STATUS 0x70 +#define FMC_NAND_CMD_RESET 0xFF +#define FMC_NAND_CMD_PROGRAM1 0x80 +#define FMC_NAND_CMD_PROGRAM2 0x10 +#define FMC_NAND_CMD_ERASE1 0x60 +#define FMC_NAND_CMD_ERASE2 0xD0 +#define FMC_NAND_CMD_RANDOMINPUT 0x85 +#define FMC_NAND_CMD_RANDOMOUTPUT1 0x05 +#define FMC_NAND_CMD_RANDOMOUTPUT2 0xE0 +#define FMC_NAND_CMD_FEATURE 0xEF + +/** + * @} + */ + + +/** @defgroup BCH DATA LEN + * @{ + */ + +#define BCH_SECTOR_SIZE 0x200 +#define BCH_INF_SIZE 0x3 +#define BCH_ECC_SIZE 0xD + +/** + * @} + */ + +/** @defgroup BCH ECC MODE + * @{ + */ + +#define BCH_ECC_MODE_EN 0x1 +#define BCH_ECC_MODE_DIS 0x0 + +/** + * @} + */ + +/** @defgroup BCH CHANNEL RST + * @{ + */ + +#define BCH_CHANNEL_RST 0x1 + +/** + * @} + */ + + +/* + * @brief UART Init Structure definition + */ +typedef struct +{ + uint32_t EDO_EN; /*!< This member controls the EDO mode. */ + + uint32_t RBN_INTEN; /*!< This member controls the RBN INT. */ + + uint32_t ENDIAN; /*!< This member controls Big/Little endian. */ + + uint32_t FWP; /*!< This member controls the FWP mode. */ + + uint32_t FCE; /*!< This member controls the FCE mode. */ + + uint32_t TADL; /*!< Specifies the tADL value*/ + + uint32_t TRHW; /*!< Specifies the tRHW value*/ + + uint32_t TWHR; /*!< Specifies the tWHR value*/ + + uint32_t TREH; /*!< Specifies the tREH value*/ + + uint32_t TRP; /*!< Specifies the tRP value*/ + + uint32_t TWH; /*!< Specifies the tTWH value*/ + + uint32_t TWP; /*!< Specifies the tWP value*/ + +}FMC_NAND_InitTypeDef; + +/* + * @brief UART handle Structure definition + */ +typedef struct +{ + FMC_NAND_TypeDef *Instance; /*!< FMA Nand registers base address */ + + FMC_NAND_InitTypeDef Init; /*!< FMA Nand parameters */ + + void* FMC_NAND_Data_Buff; /*!< FMA Nand databuff base address */ + + uint32_t FMC_NAND_Data_Len; /*!< amount of CRC data to be calculated */ + +}FMC_NAND_HandleTypeDef; + +/****************************************************************************** +*@brief : Initialize nand MSP: CLK, GPIO, NVIC +* +*@param : hnand: handle with nand parameters. +*@return: None +******************************************************************************/ +void HAL_FMC_NAND_MspInit(FMC_NAND_HandleTypeDef *hnand); + +/****************************************************************************** +*@brief : Initialize nandaccording to the specified parameters in hnand. +* +*@param : hnand: handle with nand parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_Init(FMC_NAND_HandleTypeDef *hnand); + +/****************************************************************************** +*@brief : Reset Nand Flash +* +*@param : hnand: handle with nand Nand parameters. +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_FlashReset(FMC_NAND_HandleTypeDef *hnand); + +/****************************************************************************** +*@brief : Read ID from Nand Flash +* +*@param : hnand: handle with nand parameters. +*@param : rdata: start address to store ID +*@param : lenth: ID length +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_FlashGetID(FMC_NAND_HandleTypeDef *hnand, uint8_t rdata[], uint8_t lenth); + +/****************************************************************************** +*@brief : Erase a block +* +*@param : hnand: handle with nand parameters. +*@param : BlockAddr: start address of the block to erase +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_FlashErase(FMC_NAND_HandleTypeDef *hnand, uint32_t PageAddr); + +/****************************************************************************** +*@brief : Program one sector(512 bytes) +* +*@param : hnand: handle with nand parameters. +*@param : RowAddr: row start address +*@param : ColumnAddr: column start address +*@param : wdata: start address of data to program +*@param : ecc_en:select the mode of program + BCH_ECC_MODE_EN : program with ecc mode + BCH_ECC_MODE_DIS: progran with no ecc mode +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_Flash_Program(FMC_NAND_HandleTypeDef *hnand, uint32_t RowAddr, uint16_t ColumnAddr, uint8_t wdata[], uint8_t ecc_en); + +/****************************************************************************** +*@brief : Program one sector(512 bytes) using necc channel and ecc data +* +*@param : hnand: handle with nand parameters. +*@param : RowAddr: row start address +*@param : ColumnAddr: column start address +*@param : wdata: start address of data to program +*@param : pEccByte: input ecc data +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_Flash_Program_NECC_with_ECC_CODE(FMC_NAND_HandleTypeDef *hnand, uint32_t RowAddr, uint16_t ColumnAddr, uint8_t wdata[], uint8_t pEccByte[]); + +/****************************************************************************** +*@brief : Read one sector(512 bytes) +* +*@param : hnand: handle with nand parameters. +*@param : RowAddr: row start address +*@param : ColumnAddr: column start address +*@param : rdata: start address of read data +*@param : ecc_en:select the mode of read + BCH_ECC_MODE_EN : read with ecc mode + BCH_ECC_MODE_DIS: read with no ecc mode +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_FlashRead(FMC_NAND_HandleTypeDef *hnand, uint32_t RowAddr, uint16_t ColumnAddr, uint8_t rdata[], uint8_t ecc_en); + + +/****************************************************************************** +*@brief : Reset ECC Channel +* +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_Reset_ECC_Channel(FMC_NAND_HandleTypeDef *hnand); +#endif + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_nfm.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_nfm.h new file mode 100644 index 0000000000..988cc44337 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_nfm.h @@ -0,0 +1,602 @@ + +/****************************************************************************** +*@file : hal_nfm.h +*@brief : Header file for NFM module. +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ + +#ifndef __HAL_NFM_H__ +#define __HAL_NFM_H__ + +#include "hal.h" + +/** @defgroup GPIO PORT + * @{ + */ + +/*Data Ports*/ +#define FMC_D0_GPIO_PORT GPIOD +#define FMC_D0_GPIO_PIN GPIO_PIN_14 + +#define FMC_D1_GPIO_PORT GPIOD +#define FMC_D1_GPIO_PIN GPIO_PIN_15 + +#define FMC_D2_GPIO_PORT GPIOD +#define FMC_D2_GPIO_PIN GPIO_PIN_0 + +#define FMC_D3_GPIO_PORT GPIOD +#define FMC_D3_GPIO_PIN GPIO_PIN_1 + +#define FMC_D4_GPIO_PORT GPIOE +#define FMC_D4_GPIO_PIN GPIO_PIN_7 + +#define FMC_D5_GPIO_PORT GPIOE +#define FMC_D5_GPIO_PIN GPIO_PIN_8 + +#define FMC_D6_GPIO_PORT GPIOE +#define FMC_D6_GPIO_PIN GPIO_PIN_9 + +#define FMC_D7_GPIO_PORT GPIOE +#define FMC_D7_GPIO_PIN GPIO_PIN_10 + +/*Control Ports*/ +#define FMC_CEN_GPIO_PORT GPIOG +#define FMC_CEN_GPIO_PIN GPIO_PIN_9 + +#define FMC_WEN_GPIO_PORT GPIOD +#define FMC_WEN_GPIO_PIN GPIO_PIN_5 + +#define FMC_REN_GPIO_PORT GPIOD +#define FMC_REN_GPIO_PIN GPIO_PIN_4 + +#define FMC_CLE_GPIO_PORT GPIOD +#define FMC_CLE_GPIO_PIN GPIO_PIN_11 + +#define FMC_ALE_GPIO_PORT GPIOD +#define FMC_ALE_GPIO_PIN GPIO_PIN_12 + +#define FMC_RBN_GPIO_PORT GPIOG +#define FMC_RBN_GPIO_PIN GPIO_PIN_7 +/** + * @} + */ + +/** @defgroup NFM CMD + * @{ + */ + +#define NFM_CMD_READ1 0x00 +#define NFM_CMD_READ2 0x30 +#define NFM_CMD_ID 0x90 +#define NFM_CMD_STATUS 0x70 +#define NFM_CMD_RESET 0xFF +#define NFM_CMD_PROGRAM1 0x80 +#define NFM_CMD_PROGRAM2 0x10 +#define NFM_CMD_ERASE1 0x60 +#define NFM_CMD_ERASE2 0xD0 +#define NFM_CMD_RANDOMINPUT 0x85 +#define NFM_CMD_RANDOMOUTPUT1 0x05 +#define NFM_CMD_RANDOMOUTPUT2 0xE0 +#define NFM_CMD_FEATURE 0xEF +/** + * @} + */ + +/** @defgroup NFM Private Macros + * @{ + */ + +#define IS_NFM_ALL_INSTANCE(__INSTANCE__) ((__INSTANCE__) == NFM) + +/** + * @} + */ + +/** @defgroup NFM EDO_EN + * @{ + */ + #define NFM_EDO_EN (0x00000080U) /*!< EDO Enable */ + #define NFM_EDO_DIS (0x00000000U) /*!< EDO Disable */ + #define IS_NFM_EDO_EN(EN) (((EN) == NFM_EDO_EN || \ + ((EN) <= NFM_EDO_DIS))) +/** + * @} + */ + +/** @defgroup NFM RBN_INT EN + * @{ + */ + #define NFM_RBN_INT_EN (0x00000040U) /*!< RBN INT Enable */ + #define NFM_RBN_INT_DIS (0x00000000U) /*!< RBN INT Disable */ + #define IS_NFM_RBNINT_EN(EN) (((EN) == NFM_RBN_INT_EN || \ + ((EN) <= NFM_RBN_INT_DIS))) +/** + * @} + */ + +/** @defgroup NFM ENDIAN + * @{ + */ + #define NFM_ENDIAN_BIG (0x00000020U) /*!< Big Endian */ + #define NFM_ENDIAN_LITTLE (0x00000000U) /*!< Little Endian */ + #define IS_NFM_ENDIAN_EN(ENDIAN) (((ENDIAN) == NFM_ENDIAN_BIG || \ + ((ENDIAN) <= NFM_ENDIAN_LITTLE))) +/** + * @} + */ + +/** @defgroup NFM FWP + * @{ + */ + #define NFM_FWP_EN (0x00000000U) /*!< FWP Enable */ + #define NFM_FWP_DIS (0x00000010U) /*!< FWP Disable */ + #define IS_NFM_FWP_EN(FWP) (((FWP) == NFM_FWP_EN || \ + ((FWP) <= NFM_FWP_DIS))) +/** + * @} + */ + +/** @defgroup NFM FCE + * @{ + */ + #define NFM_FCE_EN (0x0000000eU) /*!< FCE Enable */ + #define NFM_FCE_DIS (0x0000000fU) /*!< FCE Disable */ + #define IS_NFM_FCE_EN(FCE) (((FCE) == NFM_FCE_EN || \ + ((FCE) <= NFM_FCE_DIS))) +/** + * @} + */ + +/** @defgroup tADL_Clock + * @{ + */ +#define NFM_TADL_NONE (0U) +#define NFM_TADL_1CLOCK (NFM_NFMWST_TADL_0) +#define NFM_TADL_2CLOCK (NFM_NFMWST_TADL_1) +#define NFM_TADL_3CLOCK (NFM_NFMWST_TADL_0 | NFM_NFMWST_TADL_1) +#define NFM_TADL_4CLOCK (NFM_NFMWST_TADL_2) +#define NFM_TADL_5CLOCK (NFM_NFMWST_TADL_0 | NFM_NFMWST_TADL_2) +#define NFM_TADL_6CLOCK (NFM_NFMWST_TADL_1 | NFM_NFMWST_TADL_2) +#define NFM_TADL_7CLOCK (NFM_NFMWST_TADL_0 | NFM_NFMWST_TADL_1 | NFM_NFMWST_TADL_2) +#define NFM_TADL_8CLOCK (NFM_NFMWST_TADL_3) +#define NFM_TADL_9CLOCK (NFM_NFMWST_TADL_0 | NFM_NFMWST_TADL_3) +#define NFM_TADL_10CLOCK (NFM_NFMWST_TADL_1 | NFM_NFMWST_TADL_3) +#define NFM_TADL_11CLOCK (NFM_NFMWST_TADL_0 | NFM_NFMWST_TADL_1 | NFM_NFMWST_TADL_3) +#define NFM_TADL_12CLOCK (NFM_NFMWST_TADL_2 | NFM_NFMWST_TADL_3) +#define NFM_TADL_13CLOCK (NFM_NFMWST_TADL_0 | NFM_NFMWST_TADL_2 | NFM_NFMWST_TADL_3) +#define NFM_TADL_14CLOCK (NFM_NFMWST_TADL_1 | NFM_NFMWST_TADL_2 | NFM_NFMWST_TADL_3) +#define NFM_TADL_15CLOCK (NFM_NFMWST_TADL_0 | NFM_NFMWST_TADL_1 | NFM_NFMWST_TADL_2 | NFM_NFMWST_TADL_3) + +#define IS_NFM_TADL_CLOCK(CLOCK) (((CLOCK) == NFM_TADL_NONE || \ + ((CLOCK) == NFM_TADL_1CLOCK) || \ + ((CLOCK) == NFM_TADL_2CLOCK) || \ + ((CLOCK) == NFM_TADL_3CLOCK) || \ + ((CLOCK) == NFM_TADL_4CLOCK) || \ + ((CLOCK) == NFM_TADL_5CLOCK) || \ + ((CLOCK) == NFM_TADL_6CLOCK) || \ + ((CLOCK) == NFM_TADL_7CLOCK) || \ + ((CLOCK) == NFM_TADL_8CLOCK) || \ + ((CLOCK) == NFM_TADL_9CLOCK) || \ + ((CLOCK) == NFM_TADL_10CLOCK) || \ + ((CLOCK) == NFM_TADL_11CLOCK) || \ + ((CLOCK) == NFM_TADL_12CLOCK) || \ + ((CLOCK) == NFM_TADL_13CLOCK) || \ + ((CLOCK) == NFM_TADL_14CLOCK) || \ + ((CLOCK) <= NFM_TADL_15CLOCK))) +/** + * @} + */ + +/** @defgroup tRHW_Clock + * @{ + */ +#define NFM_TRHW_NONE (0U) +#define NFM_TRHW_1CLOCK (NFM_NFMWST_TRHW_0) +#define NFM_TRHW_2CLOCK (NFM_NFMWST_TRHW_1) +#define NFM_TRHW_3CLOCK (NFM_NFMWST_TRHW_0 | NFM_NFMWST_TRHW_1) +#define NFM_TRHW_4CLOCK (NFM_NFMWST_TRHW_2) +#define NFM_TRHW_5CLOCK (NFM_NFMWST_TRHW_0 | NFM_NFMWST_TRHW_2) +#define NFM_TRHW_6CLOCK (NFM_NFMWST_TRHW_1 | NFM_NFMWST_TRHW_2) +#define NFM_TRHW_7CLOCK (NFM_NFMWST_TRHW_0 | NFM_NFMWST_TRHW_1 | NFM_NFMWST_TRHW_2) +#define NFM_TRHW_8CLOCK (NFM_NFMWST_TRHW_3) +#define NFM_TRHW_9CLOCK (NFM_NFMWST_TRHW_0 | NFM_NFMWST_TRHW_3) +#define NFM_TRHW_10CLOCK (NFM_NFMWST_TRHW_1 | NFM_NFMWST_TRHW_3) +#define NFM_TRHW_11CLOCK (NFM_NFMWST_TRHW_0 | NFM_NFMWST_TRHW_1 | NFM_NFMWST_TRHW_3) +#define NFM_TRHW_12CLOCK (NFM_NFMWST_TRHW_2 | NFM_NFMWST_TRHW_3) +#define NFM_TRHW_13CLOCK (NFM_NFMWST_TRHW_0 | NFM_NFMWST_TRHW_2 | NFM_NFMWST_TRHW_3) +#define NFM_TRHW_14CLOCK (NFM_NFMWST_TRHW_1 | NFM_NFMWST_TRHW_2 | NFM_NFMWST_TRHW_3) +#define NFM_TRHW_15CLOCK (NFM_NFMWST_TRHW_0 | NFM_NFMWST_TRHW_1 | NFM_NFMWST_TRHW_2 | NFM_NFMWST_TRHW_3) + +#define IS_NFM_TRHW_CLOCK(CLOCK) (((CLOCK) == NFM_TRHW_NONE || \ + ((CLOCK) == NFM_TRHW_1CLOCK) || \ + ((CLOCK) == NFM_TRHW_2CLOCK) || \ + ((CLOCK) == NFM_TRHW_3CLOCK) || \ + ((CLOCK) == NFM_TRHW_4CLOCK) || \ + ((CLOCK) == NFM_TRHW_5CLOCK) || \ + ((CLOCK) == NFM_TRHW_6CLOCK) || \ + ((CLOCK) == NFM_TRHW_7CLOCK) || \ + ((CLOCK) == NFM_TRHW_8CLOCK) || \ + ((CLOCK) == NFM_TRHW_9CLOCK) || \ + ((CLOCK) == NFM_TRHW_10CLOCK) || \ + ((CLOCK) == NFM_TRHW_11CLOCK) || \ + ((CLOCK) == NFM_TRHW_12CLOCK) || \ + ((CLOCK) == NFM_TRHW_13CLOCK) || \ + ((CLOCK) == NFM_TRHW_14CLOCK) || \ + ((CLOCK) <= NFM_TRHW_15CLOCK))) +/** + * @} + */ + +/** @defgroup tWHR_Clock + * @{ + */ +#define NFM_TWHR_NONE (0U) +#define NFM_TWHR_1CLOCK (NFM_NFMWST_TWHR_0) +#define NFM_TWHR_2CLOCK (NFM_NFMWST_TWHR_1) +#define NFM_TWHR_3CLOCK (NFM_NFMWST_TWHR_0 | NFM_NFMWST_TWHR_1) +#define NFM_TWHR_4CLOCK (NFM_NFMWST_TWHR_2) +#define NFM_TWHR_5CLOCK (NFM_NFMWST_TWHR_0 | NFM_NFMWST_TWHR_2) +#define NFM_TWHR_6CLOCK (NFM_NFMWST_TWHR_1 | NFM_NFMWST_TWHR_2) +#define NFM_TWHR_7CLOCK (NFM_NFMWST_TWHR_0 | NFM_NFMWST_TWHR_1 | NFM_NFMWST_TWHR_2) +#define NFM_TWHR_8CLOCK (NFM_NFMWST_TWHR_3) +#define NFM_TWHR_9CLOCK (NFM_NFMWST_TWHR_0 | NFM_NFMWST_TWHR_3) +#define NFM_TWHR_10CLOCK (NFM_NFMWST_TWHR_1 | NFM_NFMWST_TWHR_3) +#define NFM_TWHR_11CLOCK (NFM_NFMWST_TWHR_0 | NFM_NFMWST_TWHR_1 | NFM_NFMWST_TWHR_3) +#define NFM_TWHR_12CLOCK (NFM_NFMWST_TWHR_2 | NFM_NFMWST_TWHR_3) +#define NFM_TWHR_13CLOCK (NFM_NFMWST_TWHR_0 | NFM_NFMWST_TWHR_2 | NFM_NFMWST_TWHR_3) +#define NFM_TWHR_14CLOCK (NFM_NFMWST_TWHR_1 | NFM_NFMWST_TWHR_2 | NFM_NFMWST_TWHR_3) +#define NFM_TWHR_15CLOCK (NFM_NFMWST_TWHR_0 | NFM_NFMWST_TWHR_1 | NFM_NFMWST_TWHR_2 | NFM_NFMWST_TWHR_3) + +#define IS_NFM_TWHR_CLOCK(CLOCK) (((CLOCK) == NFM_TWHR_NONE || \ + ((CLOCK) == NFM_TWHR_1CLOCK) || \ + ((CLOCK) == NFM_TWHR_2CLOCK) || \ + ((CLOCK) == NFM_TWHR_3CLOCK) || \ + ((CLOCK) == NFM_TWHR_4CLOCK) || \ + ((CLOCK) == NFM_TWHR_5CLOCK) || \ + ((CLOCK) == NFM_TWHR_6CLOCK) || \ + ((CLOCK) == NFM_TWHR_7CLOCK) || \ + ((CLOCK) == NFM_TWHR_8CLOCK) || \ + ((CLOCK) == NFM_TWHR_9CLOCK) || \ + ((CLOCK) == NFM_TWHR_10CLOCK) || \ + ((CLOCK) == NFM_TWHR_11CLOCK) || \ + ((CLOCK) == NFM_TWHR_12CLOCK) || \ + ((CLOCK) == NFM_TWHR_13CLOCK) || \ + ((CLOCK) == NFM_TWHR_14CLOCK) || \ + ((CLOCK) <= NFM_TWHR_15CLOCK))) +/** + * @} + */ + + +/** @defgroup tREH_Clock + * @{ + */ +#define NFM_TREH_NONE (0U) +#define NFM_TREH_1CLOCK (NFM_NFMWST_TREH_0) +#define NFM_TREH_2CLOCK (NFM_NFMWST_TREH_1) +#define NFM_TREH_3CLOCK (NFM_NFMWST_TREH_0 | NFM_NFMWST_TREH_1) +#define NFM_TREH_4CLOCK (NFM_NFMWST_TREH_2) +#define NFM_TREH_5CLOCK (NFM_NFMWST_TREH_0 | NFM_NFMWST_TREH_2) +#define NFM_TREH_6CLOCK (NFM_NFMWST_TREH_1 | NFM_NFMWST_TREH_2) +#define NFM_TREH_7CLOCK (NFM_NFMWST_TREH_0 | NFM_NFMWST_TREH_1 | NFM_NFMWST_TREH_2) +#define NFM_TREH_8CLOCK (NFM_NFMWST_TREH_3) +#define NFM_TREH_9CLOCK (NFM_NFMWST_TREH_0 | NFM_NFMWST_TREH_3) +#define NFM_TREH_10CLOCK (NFM_NFMWST_TREH_1 | NFM_NFMWST_TREH_3) +#define NFM_TREH_11CLOCK (NFM_NFMWST_TREH_0 | NFM_NFMWST_TREH_1 | NFM_NFMWST_TREH_3) +#define NFM_TREH_12CLOCK (NFM_NFMWST_TREH_2 | NFM_NFMWST_TREH_3) +#define NFM_TREH_13CLOCK (NFM_NFMWST_TREH_0 | NFM_NFMWST_TREH_2 | NFM_NFMWST_TREH_3) +#define NFM_TREH_14CLOCK (NFM_NFMWST_TREH_1 | NFM_NFMWST_TREH_2 | NFM_NFMWST_TREH_3) +#define NFM_TREH_15CLOCK (NFM_NFMWST_TREH_0 | NFM_NFMWST_TREH_1 | NFM_NFMWST_TREH_2 | NFM_NFMWST_TREH_3) + +#define IS_NFM_TREH_CLOCK(CLOCK) (((CLOCK) == NFM_TREH_NONE || \ + ((CLOCK) == NFM_TREH_1CLOCK) || \ + ((CLOCK) == NFM_TREH_2CLOCK) || \ + ((CLOCK) == NFM_TREH_3CLOCK) || \ + ((CLOCK) == NFM_TREH_4CLOCK) || \ + ((CLOCK) == NFM_TREH_5CLOCK) || \ + ((CLOCK) == NFM_TREH_6CLOCK) || \ + ((CLOCK) == NFM_TREH_7CLOCK) || \ + ((CLOCK) == NFM_TREH_8CLOCK) || \ + ((CLOCK) == NFM_TREH_9CLOCK) || \ + ((CLOCK) == NFM_TREH_10CLOCK) || \ + ((CLOCK) == NFM_TREH_11CLOCK) || \ + ((CLOCK) == NFM_TREH_12CLOCK) || \ + ((CLOCK) == NFM_TREH_13CLOCK) || \ + ((CLOCK) == NFM_TREH_14CLOCK) || \ + ((CLOCK) <= NFM_TREH_15CLOCK))) +/** + * @} + */ + + +/** @defgroup tRP_Clock + * @{ + */ +#define NFM_TRP_NONE (0U) +#define NFM_TRP_1CLOCK (NFM_NFMWST_TRP_0) +#define NFM_TRP_2CLOCK (NFM_NFMWST_TRP_1) +#define NFM_TRP_3CLOCK (NFM_NFMWST_TRP_0 | NFM_NFMWST_TRP_1) +#define NFM_TRP_4CLOCK (NFM_NFMWST_TRP_2) +#define NFM_TRP_5CLOCK (NFM_NFMWST_TRP_0 | NFM_NFMWST_TRP_2) +#define NFM_TRP_6CLOCK (NFM_NFMWST_TRP_1 | NFM_NFMWST_TRP_2) +#define NFM_TRP_7CLOCK (NFM_NFMWST_TRP_0 | NFM_NFMWST_TRP_1 | NFM_NFMWST_TRP_2) +#define NFM_TRP_8CLOCK (NFM_NFMWST_TRP_3) +#define NFM_TRP_9CLOCK (NFM_NFMWST_TRP_0 | NFM_NFMWST_TRP_3) +#define NFM_TRP_10CLOCK (NFM_NFMWST_TRP_1 | NFM_NFMWST_TRP_3) +#define NFM_TRP_11CLOCK (NFM_NFMWST_TRP_0 | NFM_NFMWST_TRP_1 | NFM_NFMWST_TRP_3) +#define NFM_TRP_12CLOCK (NFM_NFMWST_TRP_2 | NFM_NFMWST_TRP_3) +#define NFM_TRP_13CLOCK (NFM_NFMWST_TRP_0 | NFM_NFMWST_TRP_2 | NFM_NFMWST_TRP_3) +#define NFM_TRP_14CLOCK (NFM_NFMWST_TRP_1 | NFM_NFMWST_TRP_2 | NFM_NFMWST_TRP_3) +#define NFM_TRP_15CLOCK (NFM_NFMWST_TRP_0 | NFM_NFMWST_TRP_1 | NFM_NFMWST_TRP_2 | NFM_NFMWST_TRP_3) + +#define IS_NFM_TRP_CLOCK(CLOCK) (((CLOCK) == NFM_TRP_NONE || \ + ((CLOCK) == NFM_TRP_1CLOCK) || \ + ((CLOCK) == NFM_TRP_2CLOCK) || \ + ((CLOCK) == NFM_TRP_3CLOCK) || \ + ((CLOCK) == NFM_TRP_4CLOCK) || \ + ((CLOCK) == NFM_TRP_5CLOCK) || \ + ((CLOCK) == NFM_TRP_6CLOCK) || \ + ((CLOCK) == NFM_TRP_7CLOCK) || \ + ((CLOCK) == NFM_TRP_8CLOCK) || \ + ((CLOCK) == NFM_TRP_9CLOCK) || \ + ((CLOCK) == NFM_TRP_10CLOCK) || \ + ((CLOCK) == NFM_TRP_11CLOCK) || \ + ((CLOCK) == NFM_TRP_12CLOCK) || \ + ((CLOCK) == NFM_TRP_13CLOCK) || \ + ((CLOCK) == NFM_TRP_14CLOCK) || \ + ((CLOCK) <= NFM_TRP_15CLOCK))) +/** + * @} + */ + +/** @defgroup tWH_Clock + * @{ + */ +#define NFM_TWH_NONE (0U) +#define NFM_TWH_1CLOCK (NFM_NFMWST_TWH_0) +#define NFM_TWH_2CLOCK (NFM_NFMWST_TWH_1) +#define NFM_TWH_3CLOCK (NFM_NFMWST_TWH_0 | NFM_NFMWST_TWH_1) +#define NFM_TWH_4CLOCK (NFM_NFMWST_TWH_2) +#define NFM_TWH_5CLOCK (NFM_NFMWST_TWH_0 | NFM_NFMWST_TWH_2) +#define NFM_TWH_6CLOCK (NFM_NFMWST_TWH_1 | NFM_NFMWST_TWH_2) +#define NFM_TWH_7CLOCK (NFM_NFMWST_TWH_0 | NFM_NFMWST_TWH_1 | NFM_NFMWST_TWH_2) +#define NFM_TWH_8CLOCK (NFM_NFMWST_TWH_3) +#define NFM_TWH_9CLOCK (NFM_NFMWST_TWH_0 | NFM_NFMWST_TWH_3) +#define NFM_TWH_10CLOCK (NFM_NFMWST_TWH_1 | NFM_NFMWST_TWH_3) +#define NFM_TWH_11CLOCK (NFM_NFMWST_TWH_0 | NFM_NFMWST_TWH_1 | NFM_NFMWST_TWH_3) +#define NFM_TWH_12CLOCK (NFM_NFMWST_TWH_2 | NFM_NFMWST_TWH_3) +#define NFM_TWH_13CLOCK (NFM_NFMWST_TWH_0 | NFM_NFMWST_TWH_2 | NFM_NFMWST_TWH_3) +#define NFM_TWH_14CLOCK (NFM_NFMWST_TWH_1 | NFM_NFMWST_TWH_2 | NFM_NFMWST_TWH_3) +#define NFM_TWH_15CLOCK (NFM_NFMWST_TWH_0 | NFM_NFMWST_TWH_1 | NFM_NFMWST_TWH_2 | NFM_NFMWST_TWH_3) + +#define IS_NFM_TWH_CLOCK(CLOCK) (((CLOCK) == NFM_TWH_NONE || \ + ((CLOCK) == NFM_TWH_1CLOCK) || \ + ((CLOCK) == NFM_TWH_2CLOCK) || \ + ((CLOCK) == NFM_TWH_3CLOCK) || \ + ((CLOCK) == NFM_TWH_4CLOCK) || \ + ((CLOCK) == NFM_TWH_5CLOCK) || \ + ((CLOCK) == NFM_TWH_6CLOCK) || \ + ((CLOCK) == NFM_TWH_7CLOCK) || \ + ((CLOCK) == NFM_TWH_8CLOCK) || \ + ((CLOCK) == NFM_TWH_9CLOCK) || \ + ((CLOCK) == NFM_TWH_10CLOCK) || \ + ((CLOCK) == NFM_TWH_11CLOCK) || \ + ((CLOCK) == NFM_TWH_12CLOCK) || \ + ((CLOCK) == NFM_TWH_13CLOCK) || \ + ((CLOCK) == NFM_TWH_14CLOCK) || \ + ((CLOCK) <= NFM_TWH_15CLOCK))) +/** + * @} + */ + +/** @defgroup tWP_Clock + * @{ + */ +#define NFM_TWP_NONE (0U) +#define NFM_TWP_1CLOCK (NFM_NFMWST_TWP_0) +#define NFM_TWP_2CLOCK (NFM_NFMWST_TWP_1) +#define NFM_TWP_3CLOCK (NFM_NFMWST_TWP_0 | NFM_NFMWST_TWP_1) +#define NFM_TWP_4CLOCK (NFM_NFMWST_TWP_2) +#define NFM_TWP_5CLOCK (NFM_NFMWST_TWP_0 | NFM_NFMWST_TWP_2) +#define NFM_TWP_6CLOCK (NFM_NFMWST_TWP_1 | NFM_NFMWST_TWP_2) +#define NFM_TWP_7CLOCK (NFM_NFMWST_TWP_0 | NFM_NFMWST_TWP_1 | NFM_NFMWST_TWP_2) +#define NFM_TWP_8CLOCK (NFM_NFMWST_TWP_3) +#define NFM_TWP_9CLOCK (NFM_NFMWST_TWP_0 | NFM_NFMWST_TWP_3) +#define NFM_TWP_10CLOCK (NFM_NFMWST_TWP_1 | NFM_NFMWST_TWP_3) +#define NFM_TWP_11CLOCK (NFM_NFMWST_TWP_0 | NFM_NFMWST_TWP_1 | NFM_NFMWST_TWP_3) +#define NFM_TWP_12CLOCK (NFM_NFMWST_TWP_2 | NFM_NFMWST_TWP_3) +#define NFM_TWP_13CLOCK (NFM_NFMWST_TWP_0 | NFM_NFMWST_TWP_2 | NFM_NFMWST_TWP_3) +#define NFM_TWP_14CLOCK (NFM_NFMWST_TWP_1 | NFM_NFMWST_TWP_2 | NFM_NFMWST_TWP_3) +#define NFM_TWP_15CLOCK (NFM_NFMWST_TWP_0 | NFM_NFMWST_TWP_1 | NFM_NFMWST_TWP_2 | NFM_NFMWST_TWP_3) + +#define IS_NFM_TWP_CLOCK(CLOCK) (((CLOCK) == NFM_TWP_NONE || \ + ((CLOCK) == NFM_TWP_1CLOCK) || \ + ((CLOCK) == NFM_TWP_2CLOCK) || \ + ((CLOCK) == NFM_TWP_3CLOCK) || \ + ((CLOCK) == NFM_TWP_4CLOCK) || \ + ((CLOCK) == NFM_TWP_5CLOCK) || \ + ((CLOCK) == NFM_TWP_6CLOCK) || \ + ((CLOCK) == NFM_TWP_7CLOCK) || \ + ((CLOCK) == NFM_TWP_8CLOCK) || \ + ((CLOCK) == NFM_TWP_9CLOCK) || \ + ((CLOCK) == NFM_TWP_10CLOCK) || \ + ((CLOCK) == NFM_TWP_11CLOCK) || \ + ((CLOCK) == NFM_TWP_12CLOCK) || \ + ((CLOCK) == NFM_TWP_13CLOCK) || \ + ((CLOCK) == NFM_TWP_14CLOCK) || \ + ((CLOCK) <= NFM_TWP_15CLOCK))) +/** + * @} + */ + +/** @defgroup NFM CMD + * @{ + */ + +#define NFM_CMD_READ1 0x00 +#define NFM_CMD_READ2 0x30 +#define NFM_CMD_ID 0x90 +#define NFM_CMD_STATUS 0x70 +#define NFM_CMD_RESET 0xFF +#define NFM_CMD_PROGRAM1 0x80 +#define NFM_CMD_PROGRAM2 0x10 +#define NFM_CMD_ERASE1 0x60 +#define NFM_CMD_ERASE2 0xD0 +#define NFM_CMD_RANDOMINPUT 0x85 +#define NFM_CMD_RANDOMOUTPUT1 0x05 +#define NFM_CMD_RANDOMOUTPUT2 0xE0 +#define NFM_CMD_FEATURE 0xEF + +/** + * @} + */ + + +/** @defgroup BCH DATA LEN + * @{ + */ + +#define BCH_SECTOR_SIZE 0x200 +#define BCH_INF_SIZE 0x3 +#define BCH_ECC_SIZE 0xD + +/** + * @} + */ + +/** @defgroup BCH ECC MODE + * @{ + */ + +#define BCH_ECC_MODE_EN 0x1 +#define BCH_ECC_MODE_DIS 0x0 + +/** + * @} + */ + + +/* + * @brief UART Init Structure definition + */ +typedef struct +{ + uint32_t EDO_EN; /*!< This member controls the EDO mode. */ + + uint32_t RBN_INTEN; /*!< This member controls the RBN INT. */ + + uint32_t ENDIAN; /*!< This member controls Big/Little endian. */ + + uint32_t FWP; /*!< This member controls the FWP mode. */ + + uint32_t FCE; /*!< This member controls the FCE mode. */ + + uint32_t TADL; /*!< Specifies the tADL value*/ + + uint32_t TRHW; /*!< Specifies the tRHW value*/ + + uint32_t TWHR; /*!< Specifies the tWHR value*/ + + uint32_t TREH; /*!< Specifies the tREH value*/ + + uint32_t TRP; /*!< Specifies the tRP value*/ + + uint32_t TWH; /*!< Specifies the tTWH value*/ + + uint32_t TWP; /*!< Specifies the tWP value*/ + +}NFM_InitTypeDef; + +/* + * @brief UART handle Structure definition + */ +typedef struct +{ + FMC_NAND_TypeDef *Instance; /*!< NFM registers base address */ + + NFM_InitTypeDef Init; /*!< NFM parameters */ + + void* NFM_Data_Buff; /*!< NFM databuff base address */ + + uint32_t NFM_Data_Len; /*!< amount of CRC data to be calculated */ + +}NFM_HandleTypeDef; + +/****************************************************************************** +*@brief : Initialize the NFM MSP: CLK, GPIO, NVIC +* +*@param : hnfm: nfm handle with NFM parameters. +*@return: None +******************************************************************************/ +void HAL_NFM_MspInit(NFM_HandleTypeDef *hnfm); + +/****************************************************************************** +*@brief : Initialize the NFM according to the specified parameters in hnfm. +* +*@param : hnfm: nfm handle with NFM parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_NFM_Init(NFM_HandleTypeDef *hnfm); + +/****************************************************************************** +*@brief : Reset Nand Flash +* +*@param : hnfm: nfm handle with NFM parameters. +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_NFM_FlashReset(NFM_HandleTypeDef *hnfm); + +/****************************************************************************** +*@brief : Read ID from Nand Flash +* +*@param : hnfm: nfm handle with NFM parameters. +*@param : rdata: start address to store ID +*@param : lenth: ID length +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_NFM_FlashGetID(NFM_HandleTypeDef *hnfm, uint8_t rdata[], uint8_t lenth); + +/****************************************************************************** +*@brief : Erase a block +* +*@param : hnfm: nfm handle with NFM parameters. +*@param : BlockAddr: start address of the block to erase +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_NFM_FlashErase(NFM_HandleTypeDef *hnfm, uint32_t PageAddr); + +/****************************************************************************** +*@brief : Program one sector(512 bytes) +* +*@param : hnfm: nfm handle with NFM parameters. +*@param : RowAddr: row start address +*@param : ColumnAddr: column start address +*@param : wdata: start address of data to program +*@param : ecc_en:select the mode of program + BCH_ECC_MODE_EN : program with ecc mode + BCH_ECC_MODE_DIS: progran with no ecc mode +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_NFM_Flash_Program(NFM_HandleTypeDef *hnfm, uint32_t RowAddr, uint16_t ColumnAddr, uint8_t wdata[], uint8_t ecc_en); + +/****************************************************************************** +*@brief : Read one sector(512 bytes) +* +*@param : hnfm: nfm handle with NFM parameters. +*@param : RowAddr: row start address +*@param : ColumnAddr: column start address +*@param : rdata: start address of read data +*@param : ecc_en:select the mode of read + BCH_ECC_MODE_EN : read with ecc mode + BCH_ECC_MODE_DIS: read with no ecc mode +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_NFM_FlashRead(NFM_HandleTypeDef *hnfm, uint32_t RowAddr, uint16_t ColumnAddr, uint8_t rdata[], uint8_t ecc_en); + + +#endif + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_norflash.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_norflash.h new file mode 100644 index 0000000000..671bfbe1ac --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_norflash.h @@ -0,0 +1,199 @@ +/***************************************************************** +Copyright(C) 2008 - 2021, Shanghai AisinoChip Co.,Ltd. +@ļ: hal_norflash.h +@: norFlash header file +@Ա: bobzhang +@: 2021.1.18 +@ǰ汾: 1.0 +@޸ļ¼: +޸ ޸ ޸˵ + +******************************************************************/ + +/***************************************************************** +ע⣺ʹHAL_NORFLASH_ModifyDataҪջ6KBϡ +ΪHAL_NORFLASH_ModifyDataڲʹ4KBջռ䣬ݡ +******************************************************************/ + +#ifndef _HAL_NORFLASH_H +#define _HAL_NORFLASH_H + +#include "acm32h5xx_hal_conf.h" + + + +typedef enum +{ + SPI_CMD_ID_NOT_CARE = 0x00, + + SPI_READ_REGISTER_1S0S1S = 0x01, + + SPI_WRITE_REGISTER1_1S1S1S, + + SPI_WRITE_REGISTER2_1S1S1S, + + SPI_WRITE_REGISTER3_1S1S1S, + + SPI_READ_ID_1S0S1S, + + SPI_READ_DATA_1S1S1S_24, // 0x03, STR, xSPI + SPI_READ_DATA_1S1S1S_32, // 0x13, STR, xSPI + + SPI_READ_DATA_1S1S4S_24, // 0x6B, STR, xSPI + SPI_READ_DATA_1S4S4S_24, // 0xEB, STR, xSPI + + SPI_ERASE_SECTOR_1S1S_24, // 0x20, STR, xSPI + SPI_ERASE_SECTOR_1S1S_32, // 0x21, STR, xSPI + + + SPI_ERASE_BLOCK1_1S1S_24, // 0x52, STR, xSPI + SPI_ERASE_BLOCK1_1S1S_32, // 0x5C, STR, xSPI + + SPI_ERASE_BLOCK2_1S1S_24, // 0xD8, STR, xSPI + SPI_ERASE_BLOCK2_1S1S_32, // 0xDC, STR, xSPI + + + SPI_PROG_DATA_1S1S1S_24, // 0x02, STR, xSPI + SPI_PROG_DATA_1S1S1S_32, // 0x12, STR, xSPI + SPI_PROG_DATA_1S1S4S_24, // 0x32, STR, xSPI + + SPI_ENTER_ADDR_32_1S, // 0xB7, STR, xSPI + + SPI_EXIT_ADDR_32_1S, // 0xE9, STR, xSPI + + SPI_READ_UNIQUE_ID = 0x4B, + +}SPI_READ_CMD; + +typedef struct +{ + uint32_t SPI_Instance; + + uint8_t Command; //must + uint8_t Delay; //must + uint8_t Cont_MID; //must + uint8_t Dummy_clks; //must + + uint32_t Addr; //must + uint32_t Operation_length; //must + uint32_t Input_data_Addr; //must + uint32_t Output_data_Addr; //must + +}SPI_Flash_Parameter; + +typedef uint8_t (*SPI_Nor_Func)(SPI_Flash_Parameter *); + +#define SPI_NORFLASH_FUNC_ADDR 0x1FF07FD0 +#define SPI_Nor_Read_MID_DID (((SPI_Nor_Func *)SPI_NORFLASH_FUNC_ADDR)[0]) +#define SPI_Nor_Read_Unique_ID (((SPI_Nor_Func *)SPI_NORFLASH_FUNC_ADDR)[1]) +#define SPI_Nor_WriteRegister (((SPI_Nor_Func *)SPI_NORFLASH_FUNC_ADDR)[2]) +#define SPI_Nor_ReadRegister (((SPI_Nor_Func *)SPI_NORFLASH_FUNC_ADDR)[3]) +#define SPI_Nor_Read (((SPI_Nor_Func *)SPI_NORFLASH_FUNC_ADDR)[4]) +#define SPI_Nor_PageProgram (((SPI_Nor_Func *)SPI_NORFLASH_FUNC_ADDR)[5]) +#define SPI_Nor_Erase (((SPI_Nor_Func *)SPI_NORFLASH_FUNC_ADDR)[6]) +#define SPI_SwitchToFIFOMode (((SPI_Nor_Func *)SPI_NORFLASH_FUNC_ADDR)[8]) +#define SPI_SwitchToXIPMode (((SPI_Nor_Func *)SPI_NORFLASH_FUNC_ADDR)[9]) +#define SPI_Nor_ModifyValue (((SPI_Nor_Func *)SPI_NORFLASH_FUNC_ADDR)[10]) +#define SPI_SetEncrytionKey (((SPI_Nor_Func *)SPI_NORFLASH_FUNC_ADDR)[11]) + +#define SPI_Nor_Encrypt_Data ((SPI_Nor_Func )0x1FF07C01) + +#define READ_DATA (0x03) //1-1-1 +#define READ_DATA_FAST (0x0B) //1-1-1 +#define DUAL_OUTPUT_FAST_READ (0x3B) //1-1-2 +#define QUAD_OUTPUT_FAST_READ (0x6B) //1-1-4 +#define DUAL_IO_FAST_READ (0xBB) //1-2-2 +#define QUAD_IO_FAST_READ (0xEB) //1-4-4 + +#define SET_BURST_WITH_WRAP (0x77) + +#define PAGE_PROGARM (0x02) //1-1-1 +#define DUAL_PAGE_PROGARM (0xA2) //1-1-2 +#define EXT_DUAL_PAGE_PROGARM (0xD2) //1-2-2 +#define QUAD_PAGE_PROGRAM (0x32) //1-1-4 +#define EXT_QUAD_PAGE_PROGRAM (0x38) //1-4-4 + + +#define SECTOR_ERASE (0x20) +#define BLOCK_ERASE_32K (0x52) +#define BLOCK_ERASE_64K (0xd8) +#define CHIP_ERASE (0xC7) + +#define READ_DEVICE_ID (0x90) +#define READ_ID (0x9F) +#define READ_UNIQUE_ID (0x4B) + + +#define SPI_SHIFT_ZERO 0 +#define SPI_SHIFT_1HCLK 1 +#define SPI_SHIFT_1P5HCLK 2 +#define SPI_SHIFT_2HCLK 3 +#define SPI_SHIFT_2P5HCLK 4 +#define SPI_SHIFT_3HCLK 5 + +typedef struct +{ + uint32_t chipSize; + uint8_t readCmd; + uint8_t readDummyBytes; + uint8_t programCmd; +}NORFLASH_ParamTypeDef; + + +#define NORFLASH_PAGE_SIZE (256) +#define NORFLASH_PAGE_SIZE_MASK (NORFLASH_PAGE_SIZE-1) + +#define NORFLASH_SECTOR_SIZE (4096) +#define NORFLASH_SECTOR_SIZE_MASK (NORFLASH_SECTOR_SIZE-1) + +#define NORFLASH_BLOCK_32K_SIZE (32*1024) +#define NORFLASH_BLOCK_32K_SIZE_MASK (NORFLASH_BLOCK_32K_SIZE-1) + +#define NORFLASH_BLOCK_64K_SIZE (64*1024) +#define NORFLASH_BLOCK_64K_SIZE_MASK (NORFLASH_BLOCK_64K_SIZE-1) + + +void HAL_NORFLASH_CfgSpiShift1_Insram(void); +void HAL_NORFLASH_CfgSpiDiv4Shift0_Insram(void); +void HAL_NORFLASH_XipPlainReadBytes_Insram(uint32_t addr, void *buff, uint32_t bytelen); +void HAL_NORFLASH_XipPlainReadWords_Insram(uint32_t addr, void *buff, uint32_t wordlen); + + +uint32_t HAL_NORFLASH_EnterCritical(void); +void HAL_NORFLASH_ExitCritical(uint32_t sr); + + +//uint8_t HAL_NORFLASH_Init(void); + +uint8_t HAL_NORFLASH_ReadUniqueID(uint8_t *buff,uint32_t len); + +//ֽڵManufacture ID Device ID +uint8_t HAL_NORFLASH_ReadID(uint8_t *buff); + +//ݣֿ֧ +uint8_t HAL_NORFLASH_Erase(uint32_t addr, uint32_t len); + +//ֽڶֿ֧ҳ +uint8_t HAL_NORFLASH_Read(uint32_t addr, uint8_t *buff, uint32_t len); + +//ݣֿ֧ҳ +uint8_t HAL_NORFLASH_Program(uint32_t addr, uint8_t *buff, uint32_t len); + +//дֽݡʱԶдδʱԶݲдڲʹ4KBջռ䣬ݡ +uint8_t HAL_NORFLASH_ModifyData(uint32_t addr, uint8_t *buff, uint32_t len); + +uint8_t HAL_NORFLASH_EraseBootFlag(void); + +uint8_t HAL_NORFLASH_SetEncryptionKey(uint8_t * key_input); +uint8_t HAL_NORFLASH_EncryptProgram(uint32_t addr, uint32_t *data_in, uint32_t len, uint32_t *data_out); + +uint8_t HAL_NORFLASH_ModifySPIControllerParam(uint32_t write_addr, uint32_t * p_value, uint32_t len); + +uint8_t HAL_NORFLASH_SetLowPowerMode(uint8_t mode); +void HAL_NORFLASH_ResetMcu(void); + +uint8_t HAL_NORFLASH_ModifyDivShift(uint32_t div, uint32_t shift_clk); + +#endif + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_ospi.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_ospi.h new file mode 100644 index 0000000000..2661b5bd1f --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_ospi.h @@ -0,0 +1,902 @@ +/****************************************************************************** +*@file : hal_ospi.h +*@brief : Header file of OSPI HAL module. +*@ver : 1.0.0 +*@date : 2023.06.16 +******************************************************************************/ + +#ifndef __HAL_OSPI_H__ +#define __HAL_OSPI_H__ + +#include "hal.h" + + +/** @defgroup OSPI State machine + * @{ + */ +#define OSPI_RX_STATE_IDLE (0U) +#define OSPI_RX_STATE_RECEIVING (1U) +#define OSPI_TX_STATE_IDLE (0U) +#define OSPI_TX_STATE_SENDING (1U) +/** + * @} + */ + +/** @defgroup OSPI_Instances + * @{ + */ +#define IS_OSPI_ALL_INSTANCE(__INSTANCE__) (((__INSTANCE__) == OSPI1) || ((__INSTANCE__) == OSPI2)) +/** + * @} + */ + +/** @defgroup OSPI_WORK_MODE + * @{ + */ +#define OSPI_WORK_MODE_0 (0U) +#define OSPI_WORK_MODE_1 (OSPI_CTL_CPHA) +#define OSPI_WORK_MODE_2 (OSPI_CTL_CPOL) +#define OSPI_WORK_MODE_3 (OSPI_CTL_CPHA | OSPI_CTL_CPOL) +#define IS_OSPI_WORK_MODE(__WORKMODE__) (((__WORKMODE__) == OSPI_WORK_MODE_0) || \ + ((__WORKMODE__) == OSPI_WORK_MODE_1) || \ + ((__WORKMODE__) == OSPI_WORK_MODE_2) || \ + ((__WORKMODE__) == OSPI_WORK_MODE_3)) +/** + * @} + */ + + +/** @defgroup OSPI_X_MODE + * @{ + */ +#define OSPI_1X_MODE (0U) +#define OSPI_2X_MODE (OSPI_CTL_X_MODE_0) +#define OSPI_4X_MODE (OSPI_CTL_X_MODE_1) +#define OSPI_8X_MODE (OSPI_CTL_X_MODE_0 | OSPI_CTL_X_MODE_1) +#define IS_OSPI_X_MODE(__XMODE__) (((__XMODE__) == OSPI_1X_MODE) || \ + ((__XMODE__) == OSPI_2X_MODE) || \ + ((__XMODE__) == OSPI_4X_MODE) || \ + ((__XMODE__) == OSPI_8X_MODE)) +/** + * @} + */ + + +/** @defgroup OSPI_MSB_LSB_FIRST + * @{ + */ +#define OSPI_FIRSTBIT_MSB (0U) +#define OSPI_FIRSTBIT_LSB (OSPI_CTL_LSB_FIRST) +#define IS_OSPI_FIRST_BIT(__FIRSTBIT__) (((__FIRSTBIT__) == OSPI_FIRSTBIT_MSB) || \ + ((__FIRSTBIT__) == OSPI_FIRSTBIT_LSB)) +/** + * @} + */ + + +/** @defgroup OSPI_BAUDRATE_PRESCALER + * @{ + */ +#define OSPI_BAUDRATE_PRESCALER_2 (2U) +#define OSPI_BAUDRATE_PRESCALER_4 (4U) +#define OSPI_BAUDRATE_PRESCALER_8 (8U) +#define OSPI_BAUDRATE_PRESCALER_16 (16U) +#define OSPI_BAUDRATE_PRESCALER_28 (28U) +#define OSPI_BAUDRATE_PRESCALER_32 (32U) +#define OSPI_BAUDRATE_PRESCALER_64 (64U) +#define OSPI_BAUDRATE_PRESCALER_128 (128U) +#define OSPI_BAUDRATE_PRESCALER_254 (254U) +#define IS_OSPI_BAUDRATE_PRESCALER(__BAUDRATE__) (((__BAUDRATE__) == OSPI_BAUDRATE_PRESCALER_2) || \ + ((__BAUDRATE__) == OSPI_BAUDRATE_PRESCALER_4) || \ + ((__BAUDRATE__) == OSPI_BAUDRATE_PRESCALER_8) || \ + ((__BAUDRATE__) == OSPI_BAUDRATE_PRESCALER_16) || \ + ((__BAUDRATE__) == OSPI_BAUDRATE_PRESCALER_28) || \ + ((__BAUDRATE__) == OSPI_BAUDRATE_PRESCALER_32) || \ + ((__BAUDRATE__) == OSPI_BAUDRATE_PRESCALER_64) || \ + ((__BAUDRATE__) == OSPI_BAUDRATE_PRESCALER_128) || \ + ((__BAUDRATE__) <= OSPI_BAUDRATE_PRESCALER_254)) +/** + * @} + */ + + +/** @defgroup OSPI_MASTER_SAMPLE_SHIFT + * @{ + */ +#define OSPI_SAMPLE_SHIFT_NONE (0U) +#define OSPI_SAMPLE_SHIFT_1HCLK (1U) +#define OSPI_SAMPLE_SHIFT_1_5HCLK (2U) +#define OSPI_SAMPLE_SHIFT_2HCLK (3U) +#define OSPI_SAMPLE_SHIFT_2_5HCLK (4U) +#define OSPI_SAMPLE_SHIFT_3HCLK (5U) +#define OSPI_SAMPLE_SHIFT_3_5HCLK (6U) +#define OSPI_SAMPLE_SHIFT_4HCLK (7U) +#define OSPI_SAMPLE_SHIFT_4_5HCLK (8U) +#define OSPI_SAMPLE_SHIFT_5HCLK (9U) +#define OSPI_SAMPLE_SHIFT_5_5HCLK (10U) +#define OSPI_SAMPLE_SHIFT_6HCLK (11U) +#define OSPI_SAMPLE_SHIFT_6_5HCLK (12U) +#define OSPI_SAMPLE_SHIFT_7HCLK (13U) +#define IS_OSPI_SAMPLE_SHIFT(__SHIFT__) ((__SHIFT__) < 14) +/** + * @} + */ + +/** @defgroup OSPI_FIFO_Mode + * @{ + */ +#define OSPI_FIFO_BYTE (0U) +#define OSPI_FIFO_HALFWORD (1U) +#define OSPI_FIFO_WORD (2U) +#define IS_OSPI_FIFO_MODE(__FIFOMODE__) (((__FIFOMODE__) == OSPI_FIFO_BYTE) || \ + ((__FIFOMODE__) == OSPI_FIFO_HALFWORD) || \ + ((__FIFOMODE__) == OSPI_FIFO_WORD)) +/** + * @} + */ + +/** @defgroup OSPI_CS + * @{ + */ +#define OSPI_CS_0 (OSPI_CS_CS_0) +#define OSPI_CS_1 (OSPI_CS_CS_1) +#define OSPI_CS_2 (OSPI_CS_CS_2) +#define IS_OSPI_CS_SEL(__CSX__) (((__CSX__) == OSPI_CS_0) || \ + ((__CSX__) == OSPI_CS_1) || \ + ((__CSX__) == OSPI_CS_2)) +/** + * @} + */ + +/** @defgroup OSPI_DTR_STR + * @{ + */ +#define OSPI_DTRM_STR (0U) +#define OSPI_DTRM_DTR (OSPI_CTL_DTRM) +#define IS_OSPI_DTRM(__DTRM__) (((__DTRM__) == OSPI_DTRM_STR) || \ + ((__DTRM__) == OSPI_DTRM_DTR)) +/** + * @} + */ + +/** @defgroup OSPI_DQS_Output + * @{ + */ +#define OSPI_DQSOE_DISABLE (0U) +#define OSPI_DQSOE_ENABLE (OSPI_CTL_DQSOE) +#define IS_OSPI_DQSOE(__DQSOE__) (((__DQSOE__) == OSPI_DQSOE_DISABLE) || \ + ((__DQSOE__) == OSPI_DQSOE_ENABLE)) +/** + * @} + */ + +/** @defgroup OSPI_Data_Mask_Mode + * @{ + */ +#define OSPI_DM_DISABLE (0U) +#define OSPI_DM_ENABLE (OSPI_CTL_DM_EN) +#define IS_OSPI_DM(__DM_EN__) (((__DM_EN__) == OSPI_DM_DISABLE) || \ + ((__DM_EN__) == OSPI_DM_ENABLE)) +/** + * @} + */ + +/** @defgroup OSPI_DataMask_Ctrl + * @{ + */ +#define OSPI_DMCTRL_ODD_ADDR (0U) +#define OSPI_DMCTRL_EVEN_ADDR (OSPI_CTL_DMCTRL) +#define IS_OSPI_DMCTRL_ADDR(__MASK__) (((__MASK__) == OSPI_DMCTRL_ODD_ADDR) || \ + ((__MASK__) == OSPI_DMCTRL_EVEN_ADDR)) +/** + * @} + */ + +/** @defgroup OSPI_Memory_Type + * @{ + */ +#define OSPI_MEM_XCCELA_OPI (0U) +#define OSPI_MEM_APM_OPI (OSPI_CTL_MEM_MODE_0) +#define OSPI_MEM_HYPERBUS (OSPI_CTL_MEM_MODE_1) +#define OSPI_MEM_XSPI (OSPI_CTL_MEM_MODE_0 | OSPI_CTL_MEM_MODE_1) +#define IS_OSPI_MEMORY_TYPE(__TYPE__) (((__TYPE__) == OSPI_MEM_XCCELA_OPI) || \ + ((__TYPE__) == OSPI_MEM_APM_OPI) || \ + ((__TYPE__) == OSPI_MEM_HYPERBUS) || \ + ((__TYPE__) == OSPI_MEM_XSPI)) +/** + * @} + */ + +/** @defgroup OSPI_APM_Dummy_Clock + * @{ + */ +#define OSPI_APM_DUMMY_NONE (0U) +#define OSPI_APM_DUMMY_1CLOCK (OSPI_CTL_APMD_CLK_0) +#define OSPI_APM_DUMMY_2CLOCK (OSPI_CTL_APMD_CLK_1) +#define OSPI_APM_DUMMY_3CLOCK (OSPI_CTL_APMD_CLK_0 | OSPI_CTL_APMD_CLK_1) +#define OSPI_APM_DUMMY_4CLOCK (OSPI_CTL_APMD_CLK_2) +#define OSPI_APM_DUMMY_5CLOCK (OSPI_CTL_APMD_CLK_0 | OSPI_CTL_APMD_CLK_2) +#define OSPI_APM_DUMMY_6CLOCK (OSPI_CTL_APMD_CLK_1 | OSPI_CTL_APMD_CLK_2) +#define OSPI_APM_DUMMY_7CLOCK (OSPI_CTL_APMD_CLK_0 | OSPI_CTL_APMD_CLK_1 | OSPI_CTL_APMD_CLK_2) +#define IS_OSPI_APM_DUMMY_CLOCK(__CLOCK__) (((__CLOCK__) == OSPI_APM_DUMMY_NONE || \ + ((__CLOCK__) == OSPI_APM_DUMMY_1CLOCK) || \ + ((__CLOCK__) == OSPI_APM_DUMMY_2CLOCK) || \ + ((__CLOCK__) == OSPI_APM_DUMMY_3CLOCK) || \ + ((__CLOCK__) == OSPI_APM_DUMMY_4CLOCK) || \ + ((__CLOCK__) == OSPI_APM_DUMMY_5CLOCK) || \ + ((__CLOCK__) == OSPI_APM_DUMMY_6CLOCK) || \ + ((__CLOCK__) <= OSPI_APM_DUMMY_7CLOCK))) +/** + * @} + */ + + +/** @defgroup OSPI_TX_OUT_Delay + * @{ + */ +#define OSPI_TX_OUT_DELAY_NONE (0U) +#define OSPI_TX_OUT_DELAY_HALF_HCLK (OSPI_TX_CTL_OUTDLY_0) +#define OSPI_TX_OUT_DELAY_1HCLK (OSPI_TX_CTL_OUTDLY_1) +#define OSPI_TX_OUT_DELAY_2HCLK (OSPI_TX_CTL_OUTDLY_0 | OSPI_TX_CTL_OUTDLY_1) +#define IS_OSPI_TX_OUT_DELAY(__DELAY__) (((__DELAY__) == OSPI_TX_OUT_DELAY_NONE) || \ + ((__DELAY__) == OSPI_TX_OUT_DELAY_HALF_HCLK) || \ + ((__DELAY__) == OSPI_TX_OUT_DELAY_1HCLK) || \ + ((__DELAY__) == OSPI_TX_OUT_DELAY_2HCLK)) +/** + * @} + */ + + /** @defgroup OSPI_DQS_Smaple + * @{ + */ +#define OSPI_DQS_SAMPLE_DISABLE (0U) +#define OSPI_DQS_SAMPLE_ENABLE (OSPI_RX_CTL_DQS_SAMP_EN) +#define IS_OSPI_DQS_SAMPLE(__DQS_SAMP__) (((__DQS_SAMP__) == OSPI_DQS_SAMPLE_DISABLE) || \ + ((__DQS_SAMP__) == OSPI_DQS_SAMPLE_ENABLE)) +/** + * @} + */ + + +/** @defgroup OSPI_Dummy_Data + * @{ + */ +#define IS_OSPI_DUMMY_DATA(__DUMMMY__) ((__DUMMMY__) <= 0xff) +/** + * @} + */ + + /** @defgroup OSPI_CSTimeout_Val + * @{ + */ +#define IS_OSPI_CS_TIMEOUT_VAL(__VAL__) ((__VAL__) <= 0xffff) +/** + * @} + */ + +/** @defgroup OSPI_Burst_Type + * @{ + */ +#define MEMOACC1_BURST_WRAPPED (0U) +#define MEMOACC1_BURST_LINEAR (OSPI_MEMO_ACC1_HYPER_BT) +#define IS_OSPI_BURST_TYPE(__BURST__) (((__BURST__) == MEMOACC1_BURST_WRAPPED) || \ + ((__BURST__) == MEMOACC1_BURST_LINEAR)) +/** + * @} + */ + +/** @defgroup OSPI_Data_Mode + * @{ + */ +#define MEMOACC1_DATA_MODE_x1 (0U) +#define MEMOACC1_DATA_MODE_x2 (OSPI_MEMO_ACC1_DATA_MODE_0) +#define MEMOACC1_DATA_MODE_x4 (OSPI_MEMO_ACC1_DATA_MODE_1) +#define IS_OSPI_DATA_MODE(__DATAMODE__) (((__DATAMODE__) == MEMOACC1_DATA_MODE_x1) || \ + ((__DATAMODE__) == MEMOACC1_DATA_MODE_x2) || \ + ((__DATAMODE__) == MEMOACC1_DATA_MODE_x4)) +/** + * @} + */ + +/** @defgroup OSPI_Alter_Byte_Mode + * @{ + */ +#define MEMOACC1_ALTER_BYTE_MODE_x1 (0U) +#define MEMOACC1_ALTER_BYTE_MODE_x2 (OSPI_MEMO_ACC1_ALTER_BYTE_MODE_0) +#define MEMOACC1_ALTER_BYTE_MODE_x4 (OSPI_MEMO_ACC1_ALTER_BYTE_MODE_1) +#define IS_OSPI_ALTER_BYTE_MODE(__ALTERMODE__) (((__ALTERMODE__) == MEMOACC1_ALTER_BYTE_MODE_x1) || \ + ((__ALTERMODE__) == MEMOACC1_ALTER_BYTE_MODE_x2) || \ + ((__ALTERMODE__) == MEMOACC1_ALTER_BYTE_MODE_x4)) +/** + * @} + */ + +/** @defgroup OSPI_Addr_Mode + * @{ + */ +#define MEMOACC1_ADDR_MODE_x1 (0U) +#define MEMOACC1_ADDR_MODE_x2 (OSPI_MEMO_ACC1_ADDR_MODE_0) +#define MEMOACC1_ADDR_MODE_x4 (OSPI_MEMO_ACC1_ADDR_MODE_1) +#define IS_OSPI_ADDR_MODE(__ADDRMODE__) (((__ADDRMODE__) == MEMOACC1_ADDR_MODE_x1) || \ + ((__ADDRMODE__) == MEMOACC1_ADDR_MODE_x2) || \ + ((__ADDRMODE__) == MEMOACC1_ADDR_MODE_x4)) +/** + * @} + */ + +/** @defgroup OSPI_Instr_Mode + * @{ + */ +#define MEMOACC1_INSTR_MODE_x1 (0U) +#define MEMOACC1_INSTR_MODE_x2 (OSPI_MEMO_ACC1_INSTR_MODE_0) +#define MEMOACC1_INSTR_MODE_x4 (OSPI_MEMO_ACC1_INSTR_MODE_1) +#define IS_OSPI_INSRT_MODE(__INSTRMODE__) (((__INSTRMODE__) == MEMOACC1_INSTR_MODE_x1) || \ + ((__INSTRMODE__) == MEMOACC1_INSTR_MODE_x2) || \ + ((__INSTRMODE__) == MEMOACC1_INSTR_MODE_x4)) +/** + * @} + */ + +/** @defgroup OSPI_Addr_Width + * @{ + */ +#define MEMOACC1_ADDR_WIDTH_8 (0U) +#define MEMOACC1_ADDR_WIDTH_16 (OSPI_MEMO_ACC1_ADDR_WIDTH_0) +#define MEMOACC1_ADDR_WIDTH_24 (OSPI_MEMO_ACC1_ADDR_WIDTH_1) +#define MEMOACC1_ADDR_WIDTH_32 (OSPI_MEMO_ACC1_ADDR_WIDTH_0 | OSPI_MEMO_ACC1_ADDR_WIDTH_1) +#define IS_OSPI_ADDR_WIDTH(__ADDRWIDTH__) (((__ADDRWIDTH__) == MEMOACC1_ADDR_WIDTH_8) || \ + ((__ADDRWIDTH__) == MEMOACC1_ADDR_WIDTH_16) || \ + ((__ADDRWIDTH__) == MEMOACC1_ADDR_WIDTH_24) || \ + ((__ADDRWIDTH__) == MEMOACC1_ADDR_WIDTH_32)) +/** + * @} + */ + +/** @defgroup OSPI_Dummy_Cycle + * @{ + */ +#define MEMOACC1_DUMMY_CYCLE_1 (0U) +#define MEMOACC1_DUMMY_CYCLE_2 (1U) +#define MEMOACC1_DUMMY_CYCLE_3 (2U) +#define MEMOACC1_DUMMY_CYCLE_4 (3U) +#define MEMOACC1_DUMMY_CYCLE_5 (4U) +#define MEMOACC1_DUMMY_CYCLE_6 (5U) +#define MEMOACC1_DUMMY_CYCLE_7 (6U) +#define MEMOACC1_DUMMY_CYCLE_8 (7U) +#define MEMOACC1_DUMMY_CYCLE_9 (8U) +#define MEMOACC1_DUMMY_CYCLE_10 (9U) +#define MEMOACC1_DUMMY_CYCLE_11 (10U) +#define MEMOACC1_DUMMY_CYCLE_12 (11U) +#define MEMOACC1_DUMMY_CYCLE_13 (12U) +#define MEMOACC1_DUMMY_CYCLE_14 (13U) +#define MEMOACC1_DUMMY_CYCLE_15 (14U) +#define MEMOACC1_DUMMY_CYCLE_16 (15U) +#define MEMOACC1_DUMMY_CYCLE_17 (16U) +#define MEMOACC1_DUMMY_CYCLE_18 (17U) +#define MEMOACC1_DUMMY_CYCLE_19 (18U) +#define MEMOACC1_DUMMY_CYCLE_20 (19U) +#define MEMOACC1_DUMMY_CYCLE_21 (20U) +#define MEMOACC1_DUMMY_CYCLE_22 (21U) +#define MEMOACC1_DUMMY_CYCLE_23 (22U) +#define MEMOACC1_DUMMY_CYCLE_24 (23U) +#define MEMOACC1_DUMMY_CYCLE_25 (24U) +#define MEMOACC1_DUMMY_CYCLE_26 (25U) +#define MEMOACC1_DUMMY_CYCLE_27 (26U) +#define MEMOACC1_DUMMY_CYCLE_28 (27U) +#define MEMOACC1_DUMMY_CYCLE_29 (28U) +#define MEMOACC1_DUMMY_CYCLE_30 (29U) +#define MEMOACC1_DUMMY_CYCLE_31 (30U) +#define MEMOACC1_DUMMY_CYCLE_32 (31U) +#define IS_OSPI_DUMMY_CYCLE(__CYCLE__) ((__CYCLE__) < 32) +/** + * @} + */ + +/** @defgroup OSPI_Read_Dummy_State + * @{ + */ +#define MEMOACC1_READ_DUMMY_DISABLE (0U) +#define MEMOACC1_READ_DUMMY_ENABLE (OSPI_MEMO_ACC1_RD_DB_EN) +#define IS_OSPI_READ_DUMMY_STATE(__STATE__) (((__STATE__) == MEMOACC1_READ_DUMMY_DISABLE) || \ + ((__STATE__) == MEMOACC1_READ_DUMMY_ENABLE)) +/** + * @} + */ + +/** @defgroup OSPI_Write_Dummy_State + * @{ + */ +#define MEMOACC1_WRITE_DUMMY_DISABLE (0U) +#define MEMOACC1_WRITE_DUMMY_ENABLE (OSPI_MEMO_ACC1_WR_DB_EN) +#define IS_OSPI_WRITE_DUMMY_STATE(__STATE__) (((__STATE__) == MEMOACC1_WRITE_DUMMY_DISABLE) || \ + ((__STATE__) == MEMOACC1_WRITE_DUMMY_ENABLE)) +/** + * @} + */ + +/** @defgroup OSPI_Alter_Byte_Size + * @{ + */ +#define MEMOACC1_ALTER_BYTE_SIZE_8 (0U) +#define MEMOACC1_ALTER_BYTE_SIZE_16 (OSPI_MEMO_ACC1_ALTER_BYTE_SIZE_0) +#define MEMOACC1_ALTER_BYTE_SIZE_24 (OSPI_MEMO_ACC1_ALTER_BYTE_SIZE_1) +#define MEMOACC1_ALTER_BYTE_SIZE_32 (OSPI_MEMO_ACC1_ALTER_BYTE_SIZE_0 | OSPI_MEMO_ACC1_ALTER_BYTE_SIZE_1) +#define IS_OSPI_ALTER_BYTE_SIZE(__ALTERSIZE__) (((__ALTERSIZE__) == MEMOACC1_ALTER_BYTE_SIZE_8) || \ + ((__ALTERSIZE__) == MEMOACC1_ALTER_BYTE_SIZE_16) || \ + ((__ALTERSIZE__) == MEMOACC1_ALTER_BYTE_SIZE_24) || \ + ((__ALTERSIZE__) == MEMOACC1_ALTER_BYTE_SIZE_32)) +/** + * @} + */ + +/** @defgroup OSPI_Read_Alter_State + * @{ + */ +#define MEMOACC1_READ_ALTER_DISABLE (0U) +#define MEMOACC1_READ_ALTER_ENABLE (OSPI_MEMO_ACC1_RD_AB_EN) +#define IS_OSPI_READ_ALTER_STATE(__STATE__) (((__STATE__) == MEMOACC1_READ_ALTER_DISABLE) || \ + ((__STATE__) == MEMOACC1_READ_ALTER_ENABLE)) +/** + * @} + */ + +/** @defgroup OSPI_Write_Alte_State + * @{ + */ +#define MEMOACC1_WRITE_ALTER_DISABLE (0U) +#define MEMOACC1_WRITE_ALTER_ENABLE (OSPI_MEMO_ACC1_WR_AB_EN) +#define IS_OSPI_WRITE_ALTER_STATE(__STATE__) (((__STATE__) == MEMOACC1_WRITE_ALTER_DISABLE) || \ + ((__STATE__) == MEMOACC1_WRITE_ALTER_ENABLE)) +/** + * @} + */ + +/** @defgroup OSPI_CMD_Send_State + * @{ + */ +#define MEMOACC1_CMD_SEND_ONCE_DISABLE (0U) +#define MEMOACC1_CMD_SEND_ONCE_ENABLE (OSPI_MEMO_ACC1_SEND_INSTR_ONCE_EN) +#define IS_OSPI_CMD_SEND_STATE(__STATE__) (((__STATE__) == MEMOACC1_CMD_SEND_ONCE_DISABLE) || \ + ((__STATE__) == MEMOACC1_CMD_SEND_ONCE_ENABLE)) +/** + * @} + */ + +/** @defgroup OSPI_Continuous_State + * @{ + */ +#define MEMOACC1_CON_DISABLE (0U) +#define MEMOACC1_CON_ENABLE (OSPI_MEMO_ACC1_CON_MODE_EN) +#define IS_OSPI_CONTINUOUS_STATE(__STATE__) (((__STATE__) == MEMOACC1_CON_DISABLE) || \ + ((__STATE__) == MEMOACC1_CON_ENABLE)) +/** + * @} + */ + +/** @defgroup OSPI_Cs_Timeout_State + * @{ + */ +#define MEMOACC1_CS_TIMEOUT_DISABLE (0U) +#define MEMOACC1_CS_TIMEOUT_ENABLE (OSPI_MEMO_ACC1_CS_TIMEOUT_EN) +#define IS_OSPI_CS_TIMEOUT_STATE(__STATE__) (((__STATE__) == MEMOACC1_CS_TIMEOUT_DISABLE) || \ + ((__STATE__) == MEMOACC1_CS_TIMEOUT_ENABLE)) +/** + * @} + */ + +/** @defgroup OSPI_Memory_State + * @{ + */ +#define MEMOACC1_MEMORY_DISABLE (0U) +#define MEMOACC1_MEMORY_ENABLE (OSPI_MEMO_ACC1_ACC_EN) +#define IS_OSPI_MEMORY_STATE(__STATE__) (((__STATE__) == MEMOACC1_MEMORY_DISABLE) || \ + ((__STATE__) == MEMOACC1_MEMORY_ENABLE)) +/** + * @} + */ + +/** @defgroup OSPI_Wrap_Size + * @{ + */ +#define MEMOACC2_WRAP_SIZE_0 (0U) +#define MEMOACC2_WRAP_SIZE_16 (OSPI_MEMO_ACC2_WRPS_1) +#define MEMOACC2_WRAP_SIZE_32 (OSPI_MEMO_ACC2_WRPS_0 | OSPI_MEMO_ACC2_WRPS_1) +#define MEMOACC2_WRAP_SIZE_64 (OSPI_MEMO_ACC2_WRPS_2) +#define IS_OSPI_WRAP_SIZE(__WRAPSIZE__) (((__WRAPSIZE__) == MEMOACC2_WRAP_SIZE_0) || \ + ((__WRAPSIZE__) == MEMOACC2_WRAP_SIZE_16) || \ + ((__WRAPSIZE__) == MEMOACC2_WRAP_SIZE_32) || \ + ((__WRAPSIZE__) == MEMOACC2_WRAP_SIZE_64)) +/** + * @} + */ + +/** @defgroup OSPI_Burst_Length + * @{ + */ +#define MEMOACC2_BURST_LEN_0 (0U) +#define MEMOACC2_BURST_LEN_16 (OSPI_MEMO_ACC2_BL_0) +#define MEMOACC2_BURST_LEN_32 (OSPI_MEMO_ACC2_BL_1) +#define MEMOACC2_BURST_LEN_64 (OSPI_MEMO_ACC2_BL_0 | OSPI_MEMO_ACC2_BL_1) +#define MEMOACC2_BURST_LEN_128 (OSPI_MEMO_ACC2_BL_2) +#define MEMOACC2_BURST_LEN_256 (OSPI_MEMO_ACC2_BL_0 | OSPI_MEMO_ACC2_BL_2) +#define MEMOACC2_BURST_LEN_512 (OSPI_MEMO_ACC2_BL_1 | OSPI_MEMO_ACC2_BL_2) +#define MEMOACC2_BURST_LEN_1024 (OSPI_MEMO_ACC2_BL_0 | OSPI_MEMO_ACC2_BL_1 | OSPI_MEMO_ACC2_BL_2) +#define IS_OSPI_BURST_LEN(__LEN__) (((__LEN__) == MEMOACC2_BURST_LEN_0) || \ + ((__LEN__) == MEMOACC2_BURST_LEN_16) || \ + ((__LEN__) == MEMOACC2_BURST_LEN_32) || \ + ((__LEN__) == MEMOACC2_BURST_LEN_64) || \ + ((__LEN__) == MEMOACC2_BURST_LEN_128) || \ + ((__LEN__) == MEMOACC2_BURST_LEN_256) || \ + ((__LEN__) == MEMOACC2_BURST_LEN_512) || \ + ((__LEN__) == MEMOACC2_BURST_LEN_1024)) +/** + * @} + */ + +/** @defgroup OSPI_Latency1_Cycles + * @{ + */ +#define MEMOACC2_LATENCY1_1 (0U) +#define MEMOACC2_LATENCY1_2 (1U) +#define MEMOACC2_LATENCY1_3 (2U) +#define MEMOACC2_LATENCY1_4 (3U) +#define MEMOACC2_LATENCY1_5 (4U) +#define MEMOACC2_LATENCY1_6 (5U) +#define MEMOACC2_LATENCY1_7 (6U) +#define MEMOACC2_LATENCY1_8 (7U) +#define MEMOACC2_LATENCY1_9 (8U) +#define MEMOACC2_LATENCY1_10 (9U) +#define MEMOACC2_LATENCY1_11 (10U) +#define MEMOACC2_LATENCY1_12 (11U) +#define MEMOACC2_LATENCY1_13 (12U) +#define MEMOACC2_LATENCY1_14 (13U) +#define MEMOACC2_LATENCY1_15 (14U) +#define MEMOACC2_LATENCY1_16 (15U) +#define IS_OSPI_LATENCY1_CYCLE(__CYCLE__) ((__CYCLE__) < 16) +/** + * @} + */ + +/** @defgroup OSPI_Latency0_Cycles + * @{ + */ +#define MEMOACC2_LATENCY0_1 (0U) +#define MEMOACC2_LATENCY0_2 (1U) +#define MEMOACC2_LATENCY0_3 (2U) +#define MEMOACC2_LATENCY0_4 (3U) +#define MEMOACC2_LATENCY0_5 (4U) +#define MEMOACC2_LATENCY0_6 (5U) +#define MEMOACC2_LATENCY0_7 (6U) +#define MEMOACC2_LATENCY0_8 (7U) +#define MEMOACC2_LATENCY0_9 (8U) +#define MEMOACC2_LATENCY0_10 (9U) +#define MEMOACC2_LATENCY0_11 (10U) +#define MEMOACC2_LATENCY0_12 (11U) +#define MEMOACC2_LATENCY0_13 (12U) +#define MEMOACC2_LATENCY0_14 (13U) +#define MEMOACC2_LATENCY0_15 (14U) +#define MEMOACC2_LATENCY0_16 (15U) +#define IS_OSPI_LATENCY0_CYCLE(__CYCLE__) ((__CYCLE__) < 16) + +/** + * @} + */ + +/** @defgroup OSPI_DLYB Exported Constants +* @{ +*/ +#define OSPI_DLYB_MAX_UNIT ((uint32_t)0x00000080U) /*!< Max UNIT value (128) */ +#define OSPI_DLYB_MAX_SELECT ((uint32_t)0x0000000CU) /*!< Max SELECT value (12) */ +#define OSPI_DLYB_FLAG_LENF (DLYB_CFGR_LENF) +#define OSPI_DLYB_LNG_10_0_MASK (0x07FF0000U) +#define OSPI_DLYB_LNG_11_10_MASK (0x0C000000U) +/** + * @} + */ + +/** @defgroup OSPI_DLYB_Instances + * @{ + */ +#define IS_OSPI_DLYB_ALL_INSTANCE(__INSTANCE__) (((__INSTANCE__) == OSPI1_DLYB) || ((__INSTANCE__) == OSPI2_DLYB)) +/** + * @} + */ + +/** + * @brief OSPI Configuration Structure definition + */ +typedef struct +{ + uint32_t WorkMode; /* OSPI working mode selection. + This parameter can be a value of @ref OSPI_WORK_MODE */ + + uint32_t XMode; /* OSPI multi line mode selection. + This parameter can be a value of @ref OSPI_X_MODE */ + + uint32_t FirstBit; /* MSB/LSB selects the bits first. + This parameter can be a value of @ref SPI_MSB_LSB_FIRST */ + + uint32_t BaudRatePrescaler; /* OSPI BaudRate Prescaler. + This parameter can be a value of @ref OSPI_BAUDRATE_PRESCALER */ + + uint32_t SampleShifting; /* The master delay n hclk to sample data. + This parameter can be a value of @ref OSPI_MASTER_SAMPLE_SHIFT */ + + uint32_t FWMode; /* FIFO Byte/Half Word/Word Write Mode Selection. + This parameter can be a value of @ref OSPI_FIFO_Mode */ + + uint32_t FRMode; /* FIFO Byte/Half Word/Word Read Mode Selection. + This parameter can be a value of @ref OSPI_FIFO_Mode */ + +}OSPI_InitTypeDef; +/** + * @} + */ + +/** + * @brief OSPI handle Structure definition + */ +typedef struct +{ + OSPI_TypeDef *Instance; /* OSPI registers base address. + This parameter can be a value of @ref OSPI_Instances */ + + OSPI_InitTypeDef Init; /* OSPI communication parameters */ + + uint32_t CSx; /* OSPI chip selection signal. + This parameter can be a value of @ref OSPI_CS */ + + uint32_t RxState; /* OSPI state machine */ + uint32_t TxState; /* OSPI state machine */ + + uint8_t *Rx_Buffer; /* OSPI Rx Buffer */ + uint8_t *Tx_Buffer; /* OSPI Tx Buffer */ + + uint32_t Rx_Size; /* OSPI Rx Size */ + uint32_t Tx_Size; /* OSPI Tx Size */ + + uint32_t Rx_Count; /* OSPI RX Count */ + uint32_t Tx_Count; /* OSPI TX Count */ + +#ifdef HAL_DMA_MODULE_ENABLED + DMA_HandleTypeDef *HDMA_Rx; /* OSPI Rx DMA handle parameters */ + DMA_HandleTypeDef *HDMA_Tx; /* OSPI Tx DMA handle parameters */ +#endif + +}OSPI_HandleTypeDef; +/** + * @} + */ + +/** + * @brief OSPI Octal communication Configuration Structure definition + */ +typedef struct +{ + uint32_t DTRMode; /* Single/double transmission rate mode. + This parameter can be a value of @ref OSPI_DTR_STR*/ + + uint32_t DQSMode; /* It enables or not the data strobe management. + This parameter can be a value of @ref OSPI_Data_Strobe*/ + + uint32_t MemoryType; /* It indicates the external device type connected to the OSPI. + This parameter can be a value of @ref OSPI_Memory_Type */ + + uint32_t OutDelay; /* Output delay in DTR mode. + This parameter can be a value of @ref OSPI_TX_OUT_Delay */ + + uint32_t DQSSample; /* It enables or not DQS is used as a clock for sampling. + This parameter can be a value of @ref OSPI_DQS_Smaple*/ + + +}OSPI_OctalInitTypeDef; +/** + * @} + */ + +/** + * @brief OSPI Memory Configuration Structure definition + */ +typedef struct +{ + uint8_t ReadCmd; /* Memory read instruction. */ + uint8_t WriteCmd; /* Memory write instruction. */ + uint32_t AlterByte; /* Alter byte */ + uint32_t CsTimeoutVal; /* The time from CS lowering to forced raising */ + uint32_t HyperBurstType; /* Hyperbus burst type + This parameter can be a value of @ref OSPI_Burst_Type */ + uint32_t DataMode; /* Data mode + This parameter can be a value of @ref OSPI_Data_Mode */ + uint32_t AlterByteMode; /* Alter byte mode + This parameter can be a value of @ref OSPI_Alter_Byte_Mode */ + uint32_t AddrMode; /* Address mode + This parameter can be a value of @ref OSPI_Addr_Mode */ + uint32_t InstrMode; /* Instruction mode + This parameter can be a value of @ref OSPI_Instr_Mode */ + uint32_t AddrWidth; /* Address width + This parameter can be a value of @ref OSPI_Addr_Width */ + uint32_t DummyCycleSize; /* Dummy cycle size + This parameter can be a value of @ref OSPI_Dummy_Cycle */ + uint32_t ReadDummyByteEnable; /* Read dummy byte enable or disable + This parameter can be a value of @ref OSPI_Read_Dummy_State */ + uint32_t WriteummyByteEnable; /* Write dummy byte enable or disable + This parameter can be a value of @ref OSPI_Write_Dummy_State */ + uint32_t AlterByteSize; /* Alter byte size + This parameter can be a value of @ref OSPI_Alter_Byte_Size */ + uint32_t ReadAlterByteEnable; /* Read alter byte enable or disable + This parameter can be a value of @ref OSPI_Read_Alter_State */ + uint32_t WriteAlterByteEnable; /* Write alter byte enable or disable + This parameter can be a value of @ref OSPI_Write_Alte_State */ + uint32_t SendInstrOnce; /* Send command once or not + This parameter can be a value of @ref OSPI_CMD_Send_State */ + uint32_t ContinuousModeEnable; /* Continuous mode enable or disable + This parameter can be a value of @ref OSPI_Continuous_State */ + uint32_t CsTimeoutEnable; /* Cs timeout enable or disable + This parameter can be a value of @ref OSPI_Cs_Timeout_State */ + uint32_t WrapSize; /* Wrap size + This parameter can be a value of @ref OSPI_Wrap_Size */ + uint32_t BurstLen; /* Burst length + This parameter can be a value of @ref OSPI_Burst_Length */ + uint32_t HyperXspiLC1; /* The number of Latency cycles with RWDS being one + This parameter can be a value of @ref OSPI_Latency1_Cycles */ + uint32_t HyperXspiLc0; /* The number of Latency cycles with RWDS being zero + This parameter can be a value of @ref OSPI_Latency0_Cycles */ +}OSPI_MemoryInitTypeDef; + +/** + * @} + */ + +/** + * @brief DLYB Configuration Structure definition + */ + +typedef struct +{ + uint32_t Units; /*!< Specifies the Delay of a unit delay cell. + This parameter can be a value between 0 and DLYB_MAX_UNIT */ + + uint32_t PhaseSel; /*!< Specifies the Phase for the output clock. + This parameter can be a value between 0 and DLYB_MAX_SELECT */ +}OSPI_DLYB_CfgTypeDef; +/** + * @} + */ + +/* HAL_OSPI_Init */ +HAL_StatusTypeDef HAL_OSPI_Init(OSPI_HandleTypeDef *hospi); + +/* HAL_OSPI_DeInit */ +HAL_StatusTypeDef HAL_OSPI_DeInit(OSPI_HandleTypeDef *hospi); + +/* HAL_OSPI_OctalInit */ +HAL_StatusTypeDef HAL_OSPI_OctalInit(OSPI_HandleTypeDef *hospi, OSPI_OctalInitTypeDef *Octal); + +/* HAL_OSPI_MemoryInit */ +HAL_StatusTypeDef HAL_OSPI_MemoryInit(OSPI_HandleTypeDef *hospi, OSPI_MemoryInitTypeDef *Memory); + +/* HAL_OSPI_CS_Select */ +void HAL_OSPI_CS_Select(OSPI_HandleTypeDef *hospi); + +/* HAL_OSPI_CS_Release */ +void HAL_OSPI_CS_Release(OSPI_HandleTypeDef *hospi); + +/* HAL_OSPI_Transmit */ +HAL_StatusTypeDef HAL_OSPI_Transmit(OSPI_HandleTypeDef *hospi, uint8_t *pData, \ + uint32_t Size, uint32_t Timeout); + +/* HAL_OSPI_TransmitKeepCS */ +HAL_StatusTypeDef HAL_OSPI_TransmitKeepCS(OSPI_HandleTypeDef *hospi, uint8_t *pData, \ + uint32_t Size, uint32_t Timeout); + +/* HAL_OSPI_Receive */ +HAL_StatusTypeDef HAL_OSPI_Receive(OSPI_HandleTypeDef *hospi, uint8_t *pData, \ + uint32_t Size, uint32_t Timeout); + +/* HAL_OSPI_ReceiveKeepCS */ +HAL_StatusTypeDef HAL_OSPI_ReceiveKeepCS(OSPI_HandleTypeDef *hospi, uint8_t *pData, \ + uint32_t Size, uint32_t Timeout); + +/* HAL_OSPI_Transmit_IT */ +HAL_StatusTypeDef HAL_OSPI_Transmit_IT(OSPI_HandleTypeDef *hospi, uint8_t *pData, uint32_t Size); + +/* HAL_OSPI_Receive_IT */ +HAL_StatusTypeDef HAL_OSPI_Receive_IT(OSPI_HandleTypeDef *hospi, uint8_t *pData, uint32_t Size); + +/* HAL_OSPI_Transmit_DMA */ +HAL_StatusTypeDef HAL_OSPI_Transmit_DMA(OSPI_HandleTypeDef *hospi, uint8_t *pData, uint32_t Size); + +/* HAL_OSPI_Receive_DMA */ +HAL_StatusTypeDef HAL_OSPI_Receive_DMA(OSPI_HandleTypeDef *hospi, uint8_t *pData, uint32_t Size); + +/* HAL_OSPI_SimultTransmitReceive */ +HAL_StatusTypeDef HAL_OSPI_SimultTransmitReceive(OSPI_HandleTypeDef *hospi, uint8_t *pTxData, \ + uint8_t *pRxData, uint32_t Size, uint32_t Timeout); + + +/* HAL_OSPI_TransmitByHalfWord */ +HAL_StatusTypeDef HAL_OSPI_TransmitByHalfWord(OSPI_HandleTypeDef *hospi, uint16_t *pData, \ + uint32_t Size, uint32_t Timeout); + +/* HAL_OSPI_TransmitByWord */ +HAL_StatusTypeDef HAL_OSPI_TransmitByWord(OSPI_HandleTypeDef *hospi, uint32_t *pData, \ + uint32_t Size, uint32_t Timeout); + + +/* HAL_OSPI_ReceiveByHalfWord */ +HAL_StatusTypeDef HAL_OSPI_ReceiveByHalfWord(OSPI_HandleTypeDef *hospi, uint16_t *pData, \ + uint32_t Size, uint32_t Timeout); + +/* HAL_OSPI_ReceiveByWord */ +HAL_StatusTypeDef HAL_OSPI_ReceiveByWord(OSPI_HandleTypeDef *hospi, uint32_t *pData, \ + uint32_t Size, uint32_t Timeout); + +/* HAL_OSPI_Transmit_Recieve_ByByte */ +HAL_StatusTypeDef HAL_OSPI_Transmit_Recieve_ByByte(OSPI_HandleTypeDef *hospi, uint8_t *pTxData, uint32_t TXSize, \ + uint8_t *pRxData, uint32_t RXSize, uint32_t Timeout); + +/* HAL_OSPI_Transmit_Recieve_ByHalfWord */ +HAL_StatusTypeDef HAL_OSPI_Transmit_Recieve_ByHalfWord(OSPI_HandleTypeDef *hospi, uint16_t *pTxData, uint32_t TXSize, \ + uint16_t *pRxData, uint32_t RXSize, uint32_t Timeout); + +/* HAL_OSPI_Transmit_Recieve_ByWord */ +HAL_StatusTypeDef HAL_OSPI_Transmit_Recieve_ByWord(OSPI_HandleTypeDef *hospi, uint32_t *pTxData, uint32_t TXSize, \ + uint32_t *pRxData, uint32_t RXSize, uint32_t Timeout); + +/* HAL_OSPI_GetTxState */ +uint8_t HAL_OSPI_GetTxState(OSPI_HandleTypeDef *hospi); +/* HAL_OSPI_GetRxState */ +uint8_t HAL_OSPI_GetRxState(OSPI_HandleTypeDef *hospi); + +/* HAL_OSPI_WireConfig */ +HAL_StatusTypeDef HAL_OSPI_WireConfig(OSPI_HandleTypeDef *hospi, uint32_t X_Mode); + +/* HAL_OSPI_TransmitRateMode */ +HAL_StatusTypeDef HAL_OSPI_TransmitRateMode(OSPI_HandleTypeDef *hospi, uint32_t mode); + +/* HAL_OSPI_FifoWriteMode */ +HAL_StatusTypeDef HAL_OSPI_FifoWriteMode(OSPI_HandleTypeDef *hospi, uint32_t mode); + +/* HAL_OSPI_FifoReadMode */ +HAL_StatusTypeDef HAL_OSPI_FifoReadMode(OSPI_HandleTypeDef *hospi, uint32_t mode); + +/* HAL_OSPI_APMDummyClock */ +HAL_StatusTypeDef HAL_OSPI_APMDummyClock(OSPI_HandleTypeDef *hospi, uint32_t APMClock); + +/* HAL_OSPI_TxOutDelay */ +HAL_StatusTypeDef HAL_OSPI_TxOutDelay(OSPI_HandleTypeDef *hospi, uint32_t Outdelay); + +/* HAL_OSPI_RxSampleDelay */ +HAL_StatusTypeDef HAL_OSPI_RxSampleDelay(OSPI_HandleTypeDef *hospi, uint32_t Sampledelay); + +/* HAL_OSPI_MemoryEnableDisable */ +HAL_StatusTypeDef HAL_OSPI_MemoryEnableDisable(OSPI_HandleTypeDef *hospi, uint32_t state); + +/* HAL_OSPI_DQSOutputEnableDisable */ +HAL_StatusTypeDef HAL_OSPI_DQSOutputEnableDisable(OSPI_HandleTypeDef *hospi, uint32_t state); + +/* HAL_OSPI_DQSSampleEnableDisable */ +HAL_StatusTypeDef HAL_OSPI_DQSSampleEnableDisable(OSPI_HandleTypeDef *hospi, uint32_t state); + +/* HAL_OSPI_DataMaskConfig */ +HAL_StatusTypeDef HAL_OSPI_DataMaskConfig(OSPI_HandleTypeDef *hospi, uint32_t DataMaskMode, uint32_t DataMaskCtrl); + + + +#endif + + + + + + + + + + + + + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_pmu.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_pmu.h new file mode 100644 index 0000000000..e733a3d428 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_pmu.h @@ -0,0 +1,325 @@ +/* + ****************************************************************************** + * @file HAL_PMU.h + * @version V1.0.0 + * @date 2022 + * @brief Header file of PMU HAL module. + ****************************************************************************** +*/ + +#ifndef __HAL_PMU_H__ +#define __HAL_PMU_H__ + +#include "hal.h" + + + + + + + +/** + * @brief IO wake-up source + */ +typedef enum +{ + PMU_WAKEUP1 = 0x00000001, //PA0 + PMU_WAKEUP2 = 0x00000002, //PA2 + PMU_WAKEUP3 = 0x00000004, //PI8 + PMU_WAKEUP4 = 0x00000008, //PC13 + PMU_WAKEUP5 = 0x00000010, //PI11 +}PMU_WakeUpIo_t; + +/** + * @brief RTC wake-up source + */ +typedef enum +{ + STANDBY_WAKEUP_WUTIE = RTC_IE_WUTIE, + STANDBY_WAKEUP_STAMP2 = (RTC_IE_STP2RIE | RTC_IE_STP2FIE), + STANDBY_WAKEUP_STAMP1 = (RTC_IE_STP1RIE | RTC_IE_STP1FIE), + STANDBY_WAKEUP_32S = RTC_IE_ADJ32_IE, + STANDBY_WAKEUP_ALARM = RTC_IE_ALM_IE, + STANDBY_WAKEUP_1KHZ = RTC_IE_1KHZ_IE, + STANDBY_WAKEUP_256HZ = RTC_IE_256HZ_IE, + STANDBY_WAKEUP_64HZ = RTC_IE_64HZ_IE , + STANDBY_WAKEUP_16HZ = RTC_IE_16HZ_IE , + STANDBY_WAKEUP_8HZ = RTC_IE_8HZ_IE , + STANDBY_WAKEUP_4HZ = RTC_IE_4HZ_IE , + STANDBY_WAKEUP_2HZ = RTC_IE_2HZ_IE , + STANDBY_WAKEUP_SEC = RTC_IE_SEC_IE , + STANDBY_WAKEUP_MIN = RTC_IE_MIN_IE , + STANDBY_WAKEUP_HOUR = RTC_IE_HOUR_IE , + STANDBY_WAKEUP_DATE = RTC_IE_DATE_IE , +}PMU_WakeUpRtc_t; + + +/** + * @brief Wakeup Polarity Configuration + */ +typedef enum +{ + PMU_WAKEUP_HIGH = 0x00000000, + PMU_WAKEUP_LOW = 0x00000001, +}PMU_WakeUpPolarity_t; + + +/** + * @brief Wakeup flag + */ +#define PMU_FLAG_WAKEUP1 ( PMU_SR_WUPFX_0 ) +#define PMU_FLAG_WAKEUP2 ( PMU_SR_WUPFX_1 ) +#define PMU_FLAG_WAKEUP3 ( PMU_SR_WUPFX_2 ) +#define PMU_FLAG_WAKEUP4 ( PMU_SR_WUPFX_3 ) +#define PMU_FLAG_WAKEUP5 ( PMU_SR_WUPFX_4 ) +//#define PMU_FLAG_WAKEUP6 ( PMU_SR_WUPFX_5 ) +#define PMU_FLAG_STANDBY ( PMU_SR_SBF ) +#define PMU_FLAG_RTC ( PMU_SR_RTCWUF ) +#define PMU_FLAG_RSET ( PMU_SR_RSTWUF ) +#define PMU_FLAG_IWDT ( PMU_SR_IWDTWUF ) +#define PMU_FLAG_BOR ( PMU_SR_BORWUF ) + + + +/** + * @brief Wait for an interrupt or event + */ + +#define WAIT_FOR_INT 0x00000000 +#define WAIT_FOR_EVENT 0x00000001 + +/** + * @brief Lowpower mode + */ +#define PMU_CTRL0_LPMS_STOP ( 0x0U << PMU_CTRL0_LPMS_Pos ) +#define PMU_CTRL0_LPMS_STANDBY ( 0x1U << PMU_CTRL0_LPMS_Pos ) + +/** + * @brief LVD Voltage + */ +#define PMU_LVD_1V71 ( 0x0U << PMU_CTRL1_LVDSEL_Pos) +#define PMU_LVD_2V01 ( 0x1U << PMU_CTRL1_LVDSEL_Pos) +#define PMU_LVD_2V23 ( 0x2U << PMU_CTRL1_LVDSEL_Pos) +#define PMU_LVD_2V43 ( 0x3U << PMU_CTRL1_LVDSEL_Pos) +#define PMU_LVD_2V51 ( 0x4U << PMU_CTRL1_LVDSEL_Pos) +#define PMU_LVD_2V73 ( 0x5U << PMU_CTRL1_LVDSEL_Pos) +#define PMU_LVD_2V80 ( 0x6U << PMU_CTRL1_LVDSEL_Pos) +#define PMU_LVD_2V90 ( 0x7U << PMU_CTRL1_LVDSEL_Pos) +#define IS_PMU_LVD_VOLTAGE(VOLTAGE) (((VOLTAGE) == PMU_LVD_1V71) || ((VOLTAGE) == PMU_LVD_2V01)|| \ + ((VOLTAGE) == PMU_LVD_2V23) || ((VOLTAGE) == PMU_LVD_2V43)|| \ + ((VOLTAGE) == PMU_LVD_2V51) || ((VOLTAGE) == PMU_LVD_2V73)|| \ + ((VOLTAGE) == PMU_LVD_2V80) || ((VOLTAGE) == PMU_LVD_2V90)) + +/** + * @brief LVD Filter + */ +#define PMU_LVD_FILTER_1 ( 0x0U << PMU_CTRL1_FLTTIME_Pos) +#define PMU_LVD_FILTER_2 ( 0x1U << PMU_CTRL1_FLTTIME_Pos) +#define PMU_LVD_FILTER_4 ( 0x2U << PMU_CTRL1_FLTTIME_Pos) +#define PMU_LVD_FILTER_16 ( 0x3U << PMU_CTRL1_FLTTIME_Pos) +#define PMU_LVD_FILTER_64 ( 0x4U << PMU_CTRL1_FLTTIME_Pos) +#define PMU_LVD_FILTER_256 ( 0x5U << PMU_CTRL1_FLTTIME_Pos) +#define PMU_LVD_FILTER_1024 ( 0x6U << PMU_CTRL1_FLTTIME_Pos) +#define PMU_LVD_FILTER_4095 ( 0x7U << PMU_CTRL1_FLTTIME_Pos) +#define IS_PMU_LVD_FILTER(FILTER) (((FILTER) == PMU_LVD_FILTER_1) || \ + ((FILTER) == PMU_LVD_FILTER_2) || \ + ((FILTER) == PMU_LVD_FILTER_4) || \ + ((FILTER) == PMU_LVD_FILTER_16) || \ + ((FILTER) == PMU_LVD_FILTER_64) || \ + ((FILTER) == PMU_LVD_FILTER_256) || \ + ((FILTER) == PMU_LVD_FILTER_1024) || \ + ((FILTER) == PMU_LVD_FILTER_4095)) + +/** + * @brief BOR Voltage + */ +#define PMU_BOR_2V0_2V1 ( 0x0U << PMU_CTRL2_BORCFG_Pos) +#define PMU_BOR_2V2_2V3 ( 0x1U << PMU_CTRL2_BORCFG_Pos) +#define PMU_BOR_2V49_2V61 ( 0x2U << PMU_CTRL2_BORCFG_Pos) +#define PMU_BOR_2V77_2V90 ( 0x3U << PMU_CTRL2_BORCFG_Pos) +#define IS_PMU_BOR_VOLTAGE(VOLTAGE) (((VOLTAGE) == PMU_BOR_2V0_2V1) || \ + ((VOLTAGE) == PMU_BOR_2V2_2V3) || \ + ((VOLTAGE) == PMU_BOR_2V49_2V61) || \ + ((VOLTAGE) == PMU_BOR_2V77_2V90)) + +/** @defgroup STANDBY mode wake-up waiting time + * @{ + */ +#define IS_PMU_STANDBY_WAKE_WAIT(WAIT) ((WAIT) <= 0xFU) + + +/** @defgroup PMU STOP wakeup wait time + * @{ + */ +#define IS_PMU_STOP_WAKE_WAIT(WAIT) ((WAIT) <= 0xFFFU) + + +/** @defgroup STANDBY domain IO + * @{ + */ +#define PMU_PIN_PC13 (0x00U) +#define PMU_PIN_PC14 (0x01U) +#define PMU_PIN_PC15 (0x02U) +#define PMU_PIN_PI8 (0x03U) +#define IS_PMU_PIN(PIN) (((PIN) == PMU_PIN_PC13) || ((PIN) == PMU_PIN_PC14) || \ + ((PIN) == PMU_PIN_PC15) || ((PIN) == PMU_PIN_PI8)) + +/** @defgroup STANDBY domain IO function selection + * @{ + */ +#define PMU_PIN_FUNCTION_GPIO (0U) +#define PMU_PIN_FUNCTION_PC14_VALUE (1U) +#define PMU_PIN_FUNCTION_PC15_VALUE (1U) +#define PMU_PIN_FUNCTION_PI8_VALUE (1U) +#define PMU_PIN_FUNCTION_PC13_RTC_SIGNAL (1U) +#define PMU_PIN_FUNCTION_TAMPER (2U) +#define PMU_PIN_FUNCTION_PC13_VALUE (3U) +#define IS_PMU_PIN_FUNCTION(__FUNC__) (((__FUNC__) == PMU_PIN_FUNCTION_GPIO) || \ + ((__FUNC__) == PMU_PIN_FUNCTION_PC14_VALUE) || \ + ((__FUNC__) == PMU_PIN_FUNCTION_PC15_VALUE) || \ + ((__FUNC__) == PMU_PIN_FUNCTION_PI8_VALUE) || \ + ((__FUNC__) == PMU_PIN_FUNCTION_PC13_RTC_SIGNAL) || \ + ((__FUNC__) == PMU_PIN_FUNCTION_TAMPER) || \ + ((__FUNC__) == PMU_PIN_FUNCTION_PC13_VALUE)) +/** + * @} + */ + +/** @defgroup STANDBY domain IO Pin Value + * @{ + */ +#define PMU_PIN_VALUE_0 (0x00U) +#define PMU_PIN_VALUE_1 (0x01U) +#define IS_PMU_PIN_VALUE(VALUE) (((VALUE) == PMU_PIN_VALUE_0) || ((VALUE) == PMU_PIN_VALUE_1)) + + +/** @defgroup PMU domain IO Pin (PC13) output mode + * @{ + */ +#define PMU_PIN_PC13_OD (0U) +#define PMU_PIN_PC13_PP (1U) +#define IS_PMU_PIN_PC13_OUTPUT(__MODE__) (((__MODE__) == PMU_PIN_PC13_OD) || \ + ((__MODE__) == PMU_PIN_PC13_PP)) +/** + * @} + */ + + +/** + * @brief Clear all wake-up status + */ +#define ALL_WANKEUP_STATUS (0xFFFFFFFF) + + +/** + * @brief RTC module write enable or diasble + */ +#define __HAL_PMU_RTC_WRITE_ENABLE (PMU->CTRL0 |= PMU_CTRL0_RTC_WE) +#define __HAL_PMU_RTC_WRITE_DISABLE (PMU->CTRL0 &= ~PMU_CTRL0_RTC_WE) + +/** + * @brief Tamper Pin + */ +#define PMU_IOSEL_PC13_SEL_RTC_TAMPER (0x2U) +#define PMU_IOSEL_PI8_SEL_RTC_TAMPER (0x2U) + +/** @brief PC13 function select + * @param __FUNC__: PC13 function select. + * This parameter can be 0: GPIO1RTC Fout2RTC tamper 3PC13 Value + */ +#define __HAL_PMU_PC13_SEL(__FUNC__) (PMU->IOSEL |= (PMU->IOSEL & ~(PMU_IOSEL_PC13SEL_Msk)) | (__FUNC__ << PMU_IOSEL_PC13SEL_Pos)) + +/** @brief PC14 function select + * @param __FUNC__: PC14 function select. + * This parameter can be 0: GPIO1PC14 Value + */ +#define __HAL_PMU_PC14_SEL(__FUNC__) (PMU->IOSEL |= (PMU->IOSEL & ~(PMU_IOSEL_PC14SEL_Msk)) | (__FUNC__ << PMU_IOSEL_PC14SEL_Pos)) + +/** @brief PC15 function select + * @param __FUNC__: PC15 function select. + * This parameter can be 0: GPIO1PC15 Value + */ +#define __HAL_PMU_PC15_SEL(__FUNC__) (PMU->IOSEL |= (PMU->IOSEL & ~(PMU_IOSEL_PC15SEL_Msk)) | (__FUNC__ << PMU_IOSEL_PC15SEL_Pos)) + +/** @brief PI8 function select + * @param __FUNC__: PI8 function select. + * This parameter can be 0: GPIO1PI8 Value2RTC tamper + */ +#define __HAL_PMU_PI8_SEL(__FUNC__) (PMU->IOSEL |= (PMU->IOSEL & ~(PMU_IOSEL_PI8SEL_Msk)) | (__FUNC__ << PMU_IOSEL_PI8SEL_Pos)) + + +/** @brief PC13 Value set + * @param __FUNC__: PC13 Value set. + * This parameter can be 0: set1claer + */ +#define __HAL_PMU_PC13_VALUE(__VALUE__) (PMU->IOSEL |= (PMU->IOSEL & ~(PMU_IOSEL_PC13VALUE_Msk)) | (__VALUE__ << PMU_IOSEL_PC13VALUE_Pos)) + +/** @brief PC14 Value set + * @param __FUNC__: PC14 Value set. + * This parameter can be 0: set1claer + */ +#define __HAL_PMU_PC14_VALUE(__VALUE__) (PMU->IOSEL |= (PMU->IOSEL & ~(PMU_IOSEL_PC14VALUE_Msk)) | (__VALUE__ << PMU_IOSEL_PC14VALUE_Pos)) + +/** @brief PC15 Value set + * @param __FUNC__: PC15 Value set. + * This parameter can be 0: set1claer + */ +#define __HAL_PMU_PC15_VALUE(__VALUE__) (PMU->IOSEL |= (PMU->IOSEL & ~(PMU_IOSEL_PC15VALUE_Msk)) | (__VALUE__ << PMU_IOSEL_PC15VALUE_Pos)) + +/** @brief PI8 Value set + * @param __FUNC__: PI8 Value set. + * This parameter can be 0: set1claer + */ +#define __HAL_PMU_PI8_VALUE(__VALUE__) (PMU->IOSEL |= (PMU->IOSEL & ~(PMU_IOSEL_PI8VALUE_Msk)) | (__VALUE__ << PMU_IOSEL_PI8VALUE_Pos)) + +void HAL_PMU_Init(void); + +void HAL_PMU_EnterSleep(uint32_t mode); + +void HAL_PMU_EnterStop(uint32_t mode); + +void HAL_PMU_EnterStandbyMode(uint32_t mode); + +void HAL_PMU_WakeupIOInit(PMU_WakeUpIo_t wakeup_io, PMU_WakeUpPolarity_t polarity); + +void HAL_PMU_WakeupIODeInit(PMU_WakeUpIo_t wakeup_io); + +void HAL_PMU_StandbyWakeupRTCConfig(PMU_WakeUpRtc_t wakeup_rtc); + +void HAL_PMU_StandbyWakeupRTCRelease(PMU_WakeUpRtc_t wakeup_rtc); + +bool HAL_PMU_CheckStandbyStatus(void); + +bool HAL_PMU_CheckDeepSleepStatus(void); + +uint32_t HAL_PMU_GetWakeupSource(void); + +void HAL_PMU_ClearWakeupStatus(uint32_t status); + +void HAL_PMU_LvdEnable(uint32_t voltage, uint32_t filter, uint32_t filter_en); + +void HAL_PMU_LvdDisable(void); + +void HAL_PMU_BorResetEnable(uint32_t voltage); + +void HAL_PMU_BorResetDisable(void); + +void HAL_PMU_BorIrqEnable(uint32_t voltage); + +void HAL_PMU_BorIrqtDisable(void); + +void HAL_PMU_StopWaitTime(uint32_t stopWaitTime); + +void HAL_PMU_StandbypWaitTime(uint32_t standbyWaitTime); + +void HAL_PMU_StandbyDomainPinConfig(uint32_t PMU_Pin, uint32_t PMU_Func); + +void HAL_PMU_SetStandbyDomainPinValue(uint32_t PMU_Pin, uint32_t PMU_PinValue); + +uint32_t HAL_PMU_GetStandbyDomainPinValue(uint32_t PMU_Pin); + + +#endif + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_rcc.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_rcc.h new file mode 100644 index 0000000000..60c77a5ac0 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_rcc.h @@ -0,0 +1,1986 @@ +/****************************************************************************** +*@file : hal_rcc.h +*@brief : Header file of RCC HAL module. +******************************************************************************/ + +#ifndef __HAL_RCC_H__ +#define __HAL_RCC_H__ + +#include "acm32h5xx_hal_conf.h" + + +/** + * @brief RCC PLL configuration structure definition + */ +typedef struct +{ + uint32_t PLL; /*!< The new state of the PLL. + This parameter can be a value of @ref FunctionalState */ + + uint32_t Source; /*!< RCC_PLLSource: PLL entry clock source. + This parameter must be a value of @ref RCC_PLL_Source */ + + uint32_t PLLQCLK; + + uint32_t PLLPCLK; + + uint32_t PLLQ; /*!< PLLM: Output frequency division control field. + This parameter must be a number between Min_Data = 0 and Max_Data = 15 */ + + uint32_t PLLP; /*!< PLLN: the frequency division factor of the reference frequency. + This parameter must be a number between Min_Data = 0 and Max_Data = 3 */ + + uint32_t PLLN; /*!< PLLP: the frequency multiplication factor of the reference frequency.. + This parameter must be a number between Min_Data = 0 and Max_Data = 63 */ + + uint32_t PLLF; /*!< PLLP: the frequency multiplication factor of the reference frequency.. + This parameter must be a number between Min_Data = 0 and Max_Data = 511 */ + + uint32_t SSC; + + uint32_t SSCMode; + + uint32_t SSCSpectrum; + + uint32_t SSCStep; + + +}RCC_PLLInitTypeDef; + +/** + * @brief RCC Internal/External Oscillator (RCH, RCL, XTH, and XTL) or PLL + * configuration structure definition + */ + +typedef struct +{ + uint32_t OscType; /*!< The oscillators or PLL to be configured. + This parameter can be a value of @ref RCC_Oscillator_Type */ + + uint32_t RCH; /*!< The new state of the RCH. + This parameter can be a value of @ref FunctionalState */ + + uint32_t RCHDiv16; /*!< If the system clock is RCH, the system clock will change + to 1/16 of the original after this position is ENABLE. + This parameter can be a value of @ref FunctionalState */ + + uint32_t RCL; /*!< The new state of the RCL. + This parameter can be a value of @ref FunctionalState */ + + uint32_t XTH; /*!< The new state of the XTH. + This parameter can be a value of @ref FunctionalState */ + + uint32_t XTHBypass; /*!< XTH oscillator bypass + This parameter can be a value of @ref FunctionalState */ + + uint32_t XTL; /*!< The new state of the XTL. + This parameter can be a value of @ref FunctionalState */ + + uint32_t XTLBypass; /*!< XTL oscillator bypass + This parameter can be a value of @ref FunctionalState */ + + RCC_PLLInitTypeDef PLL1; /*!< PLL1 structure parameters */ + + RCC_PLLInitTypeDef PLL2; /*!< PLL2 structure parameters */ + + RCC_PLLInitTypeDef PLL3; /*!< PLL3 structure parameters */ + +}RCC_OscInitTypeDef; + + +/** + * @brief RCC System, AHB and APB busses clock configuration structure definition + */ +typedef struct +{ + uint32_t ClockType; /*!< The system clock source. + This parameter can be a value of @ref RCC_Clock_Type */ + + uint32_t SYSCLKSource; /*!< The system clock source. + This parameter can be a value of @ref RCC_Sysclk_Source */ + + uint32_t SYSCLKDiv0; /*!< First level frequency division of system clock. + This parameter can be a value of @ref RCC_Sysclk_DIV0 */ + + uint32_t SYSCLKDiv1; /*!< Second level frequency division of system clock. + This parameter can be a value of @ref RCC_Sysclk_DIV1 */ + + uint32_t PCLK1Div; /*!< PCLK1 (the APB1 clock) divider. + This parameter can be a value of @ref RCC_PCLK1_DIV */ + + uint32_t PCLK2Div; /*!< PCLK2 (the APB2 clock) divider. + This parameter can be a value of @ref RCC_PCLK2_DIV */ + + uint32_t PCLK3Div; /*!< PCLK2 (the APB2 clock) divider. + This parameter can be a value of @ref RCC_PCLK2_DIV */ + + uint32_t PCLK4Div; /*!< PCLK2 (the APB2 clock) divider. + This parameter can be a value of @ref RCC_PCLK2_DIV */ + +}RCC_ClkInitTypeDef; + +/** + * @brief RCC MCO configuration structure definition + */ + +typedef struct +{ + uint32_t MCO; /*!< MCO output select. + This parameter can be a value of @ref RCC_MCO_Output */ + + uint32_t MCO1; /*!< The new state of the MCO1. + This parameter can be a value of @ref FunctionalState */ + + uint32_t MCO1Div; /*!< MCO11 clock divider. + This parameter must be a number between Min_Data = 0 and Max_Data = 65535 */ + + uint32_t MCO1RevPol; /*!< The new state of the MCO1 clock reverse polarity. + This parameter can be a value of @ref FunctionalState */ + + uint32_t MCO2; /*!< The new state of the MCO1. + This parameter can be a value of @ref FunctionalState */ + + uint32_t MCO2Div; /*!< MCO11 clock divider. + This parameter must be a number between Min_Data = 0 and Max_Data = 65535 */ + + uint32_t MCO2RevPol; /*!< The new state of the MCO1 clock reverse polarity. + This parameter can be a value of @ref FunctionalState */ + +}RCC_MCOInitTypeDef; + + +/** @defgroup RCC_Oscillator_Type + * @{ + */ + +#define RCC_OSC_TYPE_RCH ( 0x01U ) +#define RCC_OSC_TYPE_RCL ( 0x02U ) +#define RCC_OSC_TYPE_XTH ( 0x04U ) +#define RCC_OSC_TYPE_XTL ( 0x08U ) +#define RCC_OSC_TYPE_PLL1 ( 0x10U ) +#define RCC_OSC_TYPE_PLL2 ( 0x20U ) +#define RCC_OSC_TYPE_PLL3 ( 0x40U ) + +/** + * @} + */ + +/** @brief Oscillator type mask for assert test + * @{ + */ + +#define RCC_OSC_TYPE_MASK ( RCC_OSC_TYPE_RCH | RCC_OSC_TYPE_RCL | RCC_OSC_TYPE_XTH | RCC_OSC_TYPE_XTL | \ + RCC_OSC_TYPE_PLL1 | RCC_OSC_TYPE_PLL2 | RCC_OSC_TYPE_PLL3 ) + +/** + * @} + */ + +/** @defgroup + * @{ + */ + +#define RCC_IT_RCL_READY ( BIT0 ) +#define RCC_IT_XTL_READY ( BIT1 ) +#define RCC_IT_RCH_READY ( BIT2 ) +#define RCC_IT_XTH_READY ( BIT3 ) +#define RCC_IT_PLL1_READY ( BIT4 ) +#define RCC_IT_PLL2_READY ( BIT5 ) +#define RCC_IT_PLL3_READY ( BIT6 ) +#define RCC_IT_XTH_STOP ( BIT27 ) +#define RCC_IT_XTL_STOP ( BIT31 ) +/** + * @} + */ + +#define RCC_IT_MASK ( RCC_IT_RCL_READY | RCC_IT_XTL_READY | RCC_IT_RCH_READY | \ + RCC_IT_XTH_READY | RCC_IT_PLL1_READY | RCC_IT_PLL2_READY | \ + RCC_IT_PLL3_READY | RCC_IT_XTH_STOP | RCC_IT_XTL_STOP ) +#define RCC_IT_READY_MASK ( RCC_IT_RCL_READY | RCC_IT_XTL_READY | RCC_IT_RCH_READY | RCC_IT_XTH_READY | \ + RCC_IT_PLL1_READY | RCC_IT_PLL2_READY | RCC_IT_PLL3_READY ) +#define RCC_IT_STOP_MASK ( RCC_IT_XTH_STOP | RCC_IT_XTL_STOP ) + +#define RCC_IT_CLEAR_FLAG_MASK ( (RCC_IT_READY_MASK << 16) | (RCC_IT_STOP_MASK >> 2) ) + +/** @defgroup + * @{ + */ + +#define RCC_FLAG_RCL_RDY ( BIT0 ) +#define RCC_FLAG_XTL_RDY ( BIT1 ) +#define RCC_FLAG_RCH_RDY ( BIT2 ) +#define RCC_FLAG_XTH_RDY ( BIT3 ) +#define RCC_FLAG_PLL1_RDY ( BIT4 ) +#define RCC_FLAG_PLL2_RDY ( BIT5 ) +#define RCC_FLAG_PLL3_RDY ( BIT6 ) +#define RCC_FLAG_XTH_STOP ( BIT27 ) +#define RCC_FLAG_XTL_STOP ( BIT31 ) +/** + * @} + */ + +#define RCC_FLAG_MASK ( RCC_FLAG_RCL_RDY | RCC_FLAG_XTL_RDY | RCC_FLAG_RCH_RDY | \ + RCC_FLAG_XTH_RDY | RCC_FLAG_PLL1_RDY | RCC_FLAG_PLL2_RDY | \ + RCC_FLAG_PLL3_RDY | RCC_FLAG_XTH_STOP | RCC_FLAG_XTL_STOP ) + +/** @defgroup RCC_XTL_Drive_Capacity + * @{ + */ + +#define RCC_XTL_DRIVE_NORMAL_LEVEL0 ( 0U ) +#define RCC_XTL_DRIVE_NORMAL_LEVEL1 ( 1U ) +#define RCC_XTL_DRIVE_NORMAL_LEVEL2 ( 2U ) +#define RCC_XTL_DRIVE_NORMAL_LEVEL3 ( 3U ) +#define RCC_XTL_DRIVE_LOWPOWER_LEVEL0 ( 4U ) +#define RCC_XTL_DRIVE_LOWPOWER_LEVEL1 ( 5U ) +#define RCC_XTL_DRIVE_LOWPOWER_LEVEL2 ( 6U ) +#define RCC_XTL_DRIVE_LOWPOWER_LEVEL3 ( 7U ) +#define RCC_XTL_DRIVE_MAX ( 8U ) + +/** + * @} + */ + +/** @defgroup RCC_PLL_Source + * @{ + */ + +#define RCC_PLL_SOURCE_RCH_DIV16 ( 0U ) +#define RCC_PLL_SOURCE_XTH ( 1U ) +#define RCC_PLL_SOURCE_MAX ( 2U ) + +#define RCC_PLL_SSC_MODE_CENTER ( 0 ) +#define RCC_PLL_SSC_MODE_DOWN ( RCC_PLL1SCR_PLL1SSCMD ) + +/** @defgroup RCC_Clock_Type + * @{ + */ + +#define RCC_CLOCK_TYPE_SYSCLK ( 0x01U ) +#define RCC_CLOCK_TYPE_SYSDIV0 ( 0x02U ) +#define RCC_CLOCK_TYPE_SYSDIV1 ( 0x04U ) +#define RCC_CLOCK_TYPE_PCLK1 ( 0x08U ) +#define RCC_CLOCK_TYPE_PCLK2 ( 0x10U ) +#define RCC_CLOCK_TYPE_PCLK3 ( 0x20U ) +#define RCC_CLOCK_TYPE_PCLK4 ( 0x40U ) + +/** + * @} + */ +/** @brief System Clock type mask for assert test + * @{ + */ + +#define RCC_CLOCK_TYPE_MASK ( RCC_CLOCK_TYPE_SYSCLK | RCC_CLOCK_TYPE_SYSDIV0 | RCC_CLOCK_TYPE_SYSDIV1 | \ + RCC_CLOCK_TYPE_PCLK1 | RCC_CLOCK_TYPE_PCLK2 | RCC_CLOCK_TYPE_PCLK3 | RCC_CLOCK_TYPE_PCLK4) + +/** + * @} + */ + +/** @defgroup RCC_Sysclk_Source + * @{ + */ + +#define RCC_SYSCLK_SOURCE_RCH ( 0U ) +#define RCC_SYSCLK_SOURCE_XTH ( 1U ) +#define RCC_SYSCLK_SOURCE_PLL1PCLK ( 2U ) +#define RCC_SYSCLK_SOURCE_MAX ( 3U ) + +/** + * @} + */ + + +/** @defgroup RCC_FLT_CLK_Source + * @{ + */ + +#define RCC_FLT_CLK_SOURCE_PCLK1_DIV32 ( 0U ) +#define RCC_FLT_CLK_SOURCE_RCL ( 1U ) +#define RCC_FLT_CLK_SOURCE_MAX ( 2U ) + +/** + * @} + */ + +/** @defgroup RCC_LPUART1_CLK_Source + * @{ + */ + +#define RCC_LPUART1_CLK_SOURCE_RCL ( 0U ) +#define RCC_LPUART1_CLK_SOURCE_XTL ( 1U ) +#define RCC_LPUART1_CLK_SOURCE_PCLK1_DIV4 ( 2U ) +#define RCC_LPUART1_CLK_SOURCE_PCLK1_DIV8 ( 3U ) +#define RCC_LPUART1_CLK_SOURCE_PCLK1_DIV16 ( 4U ) +#define RCC_LPUART1_CLK_SOURCE_PCLK1_DIV32 ( 5U ) +#define RCC_LPUART1_CLK_SOURCE_MAX ( 6U ) + +/** + * @} + */ + +/** @defgroup RCC_LPTIM1_CLK_Source + * @{ + */ + +#define RCC_LPTIM1_CLK_SOURCE_PCLK1 ( 0U ) +#define RCC_LPTIM1_CLK_SOURCE_RCL ( 1U ) +#define RCC_LPTIM1_CLK_SOURCE_RCH ( 2U ) +#define RCC_LPTIM1_CLK_SOURCE_XTL ( 3U ) +#define RCC_LPTIM1_CLK_SOURCE_MAX ( 4U ) + +/** + * @} + */ + +/** @defgroup RCC_LPTIM2_CLK_Source + * @{ + */ + +#define RCC_LPTIM2_CLK_SOURCE_PCLK1 ( 0U ) +#define RCC_LPTIM2_CLK_SOURCE_RCL ( 1U ) +#define RCC_LPTIM2_CLK_SOURCE_RCH ( 2U ) +#define RCC_LPTIM2_CLK_SOURCE_XTL ( 3U ) +#define RCC_LPTIM2_CLK_SOURCE_MAX ( 4U ) + +/** + * @} + */ + +/** @defgroup RCC_LPTIM3_CLK_Source + * @{ + */ + +#define RCC_LPTIM3_CLK_SOURCE_PCLK3 ( 0U ) +#define RCC_LPTIM3_CLK_SOURCE_RCL ( 1U ) +#define RCC_LPTIM3_CLK_SOURCE_RCH ( 2U ) +#define RCC_LPTIM3_CLK_SOURCE_XTL ( 3U ) +#define RCC_LPTIM3_CLK_SOURCE_MAX ( 4U ) + +/** + * @} + */ + +/** @defgroup RCC_LPTIM345_CLK_Source + * @{ + */ + +#define RCC_LPTIM4_CLK_SOURCE_PCLK3 ( 0U ) +#define RCC_LPTIM4_CLK_SOURCE_RCL ( 1U ) +#define RCC_LPTIM4_CLK_SOURCE_RCH ( 2U ) +#define RCC_LPTIM4_CLK_SOURCE_XTL ( 3U ) +#define RCC_LPTIM4_CLK_SOURCE_MAX ( 4U ) + +/** + * @} + */ + +/** @defgroup RCC_LPTIM345_CLK_Source + * @{ + */ + +#define RCC_LPTIM5_CLK_SOURCE_PCLK3 ( 0U ) +#define RCC_LPTIM5_CLK_SOURCE_RCL ( 1U ) +#define RCC_LPTIM5_CLK_SOURCE_RCH ( 2U ) +#define RCC_LPTIM5_CLK_SOURCE_XTL ( 3U ) +#define RCC_LPTIM5_CLK_SOURCE_MAX ( 4U ) + +/** + * @} + */ + +/** @defgroup RCC_LPTIM6_CLK_Source + * @{ + */ + +#define RCC_LPTIM6_CLK_SOURCE_PCLK3 ( 0U ) +#define RCC_LPTIM6_CLK_SOURCE_RCL ( 1U ) +#define RCC_LPTIM6_CLK_SOURCE_RCH ( 2U ) +#define RCC_LPTIM6_CLK_SOURCE_XTL ( 3U ) +#define RCC_LPTIM6_CLK_SOURCE_MAX ( 4U ) + +/** + * @} + */ + +/** @defgroup RCC_SDMMC_CLK_Source + * @{ + */ + +#define RCC_SDMMC_CLK_SOURCE_SYSCLK ( 0U ) +#define RCC_SDMMC_CLK_SOURCE_PLL2PCLK ( 1U ) +#define RCC_SDMMC_CLK_SOURCE_MAX ( 2U ) + +/** + * @} + */ + +/** @defgroup RCC_SDMMC_SCLK_Source + * @{ + */ + +#define RCC_SDMMC_SCLK_SOURCE_SDMMC_CLK_DELAY ( 0U ) +#define RCC_SDMMC_SCLK_SOURCE_SDMMC1_CKIN ( 1U ) +#define RCC_SDMMC_SCLK_SOURCE_SDMMC2_CKIN ( 2U ) +#define RCC_SDMMC_SCLK_SOURCE_SDMMC_CLK_NO_DELAY ( 3U ) +#define RCC_SDMMC_SCLK_SOURCE_MAX ( 4U ) + +/** + * @} + */ + +/** @defgroup RCC_RTC_CLK_Source + * @{ + */ + +#define RCC_RTC_CLK_SOURCE_RCL ( 0U ) +#define RCC_RTC_CLK_SOURCE_XTL ( 1U ) +#define RCC_RTC_CLK_SOURCE_MAX ( 2U ) + +/** + * @} + */ + +/** @defgroup RCC_MCO_Output + * @{ + */ + +#define RCC_MCO_HCLK ( 0U ) +#define RCC_MCO_RCH ( 1U ) +#define RCC_MCO_RCL ( 2U ) +#define RCC_MCO_XTH ( 3U ) +#define RCC_MCO_XTL ( 4U ) +#define RCC_MCO_PLL1PCLK ( 5U ) +#define RCC_MCO_PLL2PCLK ( 6U ) +#define RCC_MCO_PLL2QCLK ( 7U ) +#define RCC_MCO_PLL3PCLK ( 8U ) +#define RCC_MCO_PLL3QCLK ( 9U ) +#define RCC_MCO_SYSCLK ( 10U ) +#define RCC_MCO_LPUART1_CLK ( 11U ) +#define RCC_MCO_FCLK_DIV8 ( 12U ) +#define RCC_MCO_USB1_48M ( 13U ) +#define RCC_MCO_USB2_48M ( 14U ) +#define RCC_MCO_RTC_PCLK ( 15U ) +#define RCC_MCO_SDMMC_SAMPLE_CLK ( 16U ) +#define RCC_MCO_SDMMC_DRIVE_CLK ( 17U ) +#define RCC_MCO_MAX ( 18U ) + +/** + * @} + */ + +/** @defgroup RCC_Reset_Source RCC Reset Source + * @{ + */ + +#define RCC_RESET_SOURCE_PWR ( RCC_RSR_PWRRSTF ) +#define RCC_RESET_SOURCE_POR12 ( RCC_RSR_POR12RSTF ) +#define RCC_RESET_SOURCE_SRST ( RCC_RSR_SRSTF ) +#define RCC_RESET_SOURCE_RSTN ( RCC_RSR_RSTNF ) +#define RCC_RESET_SOURCE_SYSREQ ( RCC_RSR_SYSREQRSTF ) +#define RCC_RESET_SOURCE_LOCKUP ( RCC_RSR_LOCKUPRSTF ) +#define RCC_RESET_SOURCE_IWDT ( RCC_RSR_IWDTRSTF ) +#define RCC_RESET_SOURCE_WDT ( RCC_RSR_WDTRSTF ) +#define RCC_RESET_SOURCE_LVD ( RCC_RSR_LVDRSTF ) + +/** + * @} + */ + +/** @defgroup RCC_Reset_Source RCC Reset Source + * @{ + */ + +#define RCC_RESET_SOURCE_MASK ( RCC_RESET_SOURCE_PWR | RCC_RESET_SOURCE_POR12 | RCC_RESET_SOURCE_SRST | \ + RCC_RESET_SOURCE_RSTN | RCC_RESET_SOURCE_SYSREQ | RCC_RESET_SOURCE_LOCKUP | \ + RCC_RESET_SOURCE_IWDT | RCC_RESET_SOURCE_WDT | RCC_RESET_SOURCE_LVD) + +/** + * @} + */ +#define __HAL_RCC_RTC_ENABLE() ( RCC->STDBYCTRL |= RCC_STDBYCTRL_RTCEN ) +#define __HAL_RCC_RTC_DISABLE() ( RCC->STDBYCTRL &= ~RCC_STDBYCTRL_RTCEN ) + +#define __HAL_RCC_XTH_STOP_ENABLE() ( RCC->XTHCR |= RCC_XTHCR_XTHSDEN ) +#define __HAL_RCC_XTH_STOP_DISABLE() ( RCC->XTHCR &= ~RCC_XTHCR_XTHSDEN ) + +#define __HAL_RCC_XTL_STOP_ENABLE() ( RCC->STDBYCTRL |= RCC_STDBYCTRL_XTLSDEN ) +#define __HAL_RCC_XTL_STOP_DISABLE() ( RCC->STDBYCTRL &= ~RCC_STDBYCTRL_XTLSDEN ) + +#define RCC_RCH_READY_TIMEOUT ( 0xFFFFU ) +#define RCC_RCH_UNREADY_TIMEOUT ( 0xFFFFU ) +#define RCC_RCHP_READY_TIMEOUT ( 0xFFFFU ) +#define RCC_RCHP_UNREADY_TIMEOUT ( 0xFFFFU ) +#define RCC_RCL_READY_TIMEOUT ( 0xFFFFU ) +#define RCC_RCL_UNREADY_TIMEOUT ( 0xFFFFU ) +#define RCC_XTH_READY_TIMEOUT ( 0xFFFFFU ) +#define RCC_XTH_UNREADY_TIMEOUT ( 0xFFFFFU ) +#define RCC_XTL_READY_TIMEOUT ( 0xFFFFFU ) +#define RCC_XTL_UNREADY_TIMEOUT ( 0xFFFFU ) +#define RCC_PLL1_READY_TIMEOUT ( 0xFFFFU ) +#define RCC_PLL2_READY_TIMEOUT ( 0xFFFFU ) +#define RCC_PLL3_READY_TIMEOUT ( 0xFFFFU ) + + + +#define __HAL_RCC_FDCAN2_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_FDCAN2RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_FDCAN2RST; \ + }while (0) + +#define __HAL_RCC_FDCAN1_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_FDCAN1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_FDCAN1RST; \ + }while (0) + +#define __HAL_RCC_USB2_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_USB2CRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_USB2CRST; \ + }while (0) + +#define __HAL_RCC_USB1_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_USB1CRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_USB1CRST; \ + }while (0) + +#define __HAL_RCC_SPI6_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_SPI6RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_SPI6RST; \ + }while (0) + +#define __HAL_RCC_SPI5_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_SPI5RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_SPI5RST; \ + }while (0) + +#define __HAL_RCC_SPI4_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_SPI4RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_SPI4RST; \ + }while (0) + +#define __HAL_RCC_SPI3_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_SPI3RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_SPI3RST; \ + }while (0) + +#define __HAL_RCC_SPI2_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_SPI2RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_SPI2RST; \ + }while (0) + +#define __HAL_RCC_SPI1_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_SPI1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_SPI1RST; \ + }while (0) + + +#define __HAL_RCC_DMA2D_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_DMA2DRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_DMA2DRST; \ + }while (0) + +#define __HAL_RCC_ETH_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_ETHRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_ETHRST; \ + }while (0) + +#define __HAL_RCC_CRC_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_CRCRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_CRCRST; \ + }while (0) + +#define __HAL_RCC_DMA2_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_DMA2RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_DMA2RST; \ + }while (0) + +#define __HAL_RCC_DMA1_RESET() do \ + { \ + RCC->AHB1RSTR &= ~RCC_AHB1RSTR_DMA1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB1RSTR |= RCC_AHB1RSTR_DMA1RST; \ + }while (0) + +/** @brief the AHB2 peripheral reset. + */ + +#define __HAL_RCC_THM_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_THMRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_THMRST; \ + }while (0) + +#define __HAL_RCC_FDCAN3_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_FDCAN3RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_FDCAN3RST; \ + }while (0) + +#define __HAL_RCC_UAC_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_UACRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_UACRST; \ + }while (0) + +#define __HAL_RCC_DCMI_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_DCMIRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_DCMIRST; \ + }while (0) + +#define __HAL_RCC_DAC2_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_DAC2RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_DAC2RST; \ + }while (0) + +#define __HAL_RCC_DAC1_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_DAC1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_DAC1RST; \ + }while (0) + +#define __HAL_RCC_ADC3_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_ADC3RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_ADC3RST; \ + }while (0) + +#define __HAL_RCC_ADC12_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_ADC12RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_ADC12RST; \ + }while (0) + +#define __HAL_RCC_GPIOQ_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOQRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOQRST; \ + }while (0) + +#define __HAL_RCC_GPIOP_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOPRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOPRST; \ + }while (0) + +#define __HAL_RCC_GPIOO_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOORST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOORST; \ + }while (0) + +#define __HAL_RCC_GPION_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIONRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIONRST; \ + }while (0) + +#define __HAL_RCC_GPIOM_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOMRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOMRST; \ + }while (0) + +#define __HAL_RCC_GPIOL_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOLRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOLRST; \ + }while (0) + +#define __HAL_RCC_GPIOK_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOKRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOKRST; \ + }while (0) + +#define __HAL_RCC_GPIOJ_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOJRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOJRST; \ + }while (0) + +#define __HAL_RCC_GPIOI_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOIRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOIRST; \ + }while (0) + +#define __HAL_RCC_GPIOH_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOHRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOHRST; \ + }while (0) + +#define __HAL_RCC_GPIOG_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOGRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOGRST; \ + }while (0) + +#define __HAL_RCC_GPIOF_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOFRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOFRST; \ + }while (0) + +#define __HAL_RCC_GPIOE_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOERST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOERST; \ + }while (0) + +#define __HAL_RCC_GPIOD_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIODRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIODRST; \ + }while (0) + +#define __HAL_RCC_GPIOC_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOCRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOCRST; \ + }while (0) + +#define __HAL_RCC_GPIOB_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOBRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOBRST; \ + }while (0) + +#define __HAL_RCC_GPIOA_RESET() do \ + { \ + RCC->AHB2RSTR &= ~RCC_AHB2RSTR_GPIOARST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB2RSTR |= RCC_AHB2RSTR_GPIOARST; \ + }while (0) + +/** @brief the AHB3 peripheral reset. + */ + +#define __HAL_RCC_FMC_RESET() do \ + { \ + RCC->AHB3RSTR &= ~RCC_AHB3RSTR_FMCRST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB3RSTR |= RCC_AHB3RSTR_FMCRST; \ + }while (0) + +#define __HAL_RCC_OSPI2_RESET() do \ + { \ + RCC->AHB3RSTR &= ~RCC_AHB3RSTR_OSPI2RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB3RSTR |= RCC_AHB3RSTR_OSPI2RST; \ + }while (0) + +#define __HAL_RCC_OSPI1_RESET() do \ + { \ + RCC->AHB3RSTR &= ~RCC_AHB3RSTR_OSPI1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB3RSTR |= RCC_AHB3RSTR_OSPI1RST; \ + }while (0) + +#define __HAL_RCC_SDIO_RESET() do \ + { \ + RCC->AHB3RSTR &= ~RCC_AHB3RSTR_SDIORST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB3RSTR |= RCC_AHB3RSTR_SDIORST; \ + }while (0) + +#define __HAL_RCC_SPI8_RESET() do \ + { \ + RCC->AHB3RSTR &= ~RCC_AHB3RSTR_SPI8RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB3RSTR |= RCC_AHB3RSTR_SPI8RST; \ + }while (0) + +#define __HAL_RCC_SPI7_RESET() do \ + { \ + RCC->AHB3RSTR &= ~RCC_AHB3RSTR_SPI7RST; \ + __NOP();__NOP();__NOP(); \ + RCC->AHB3RSTR |= RCC_AHB3RSTR_SPI7RST; \ + }while (0) + +/** @brief the APB1 peripheral reset. + */ + +#define __HAL_RCC_LPUART1_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_LPUART1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_LPUART1RST; \ + }while (0) + +#define __HAL_RCC_LPTIM1_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_LPTIM1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_LPTIM1RST; \ + }while (0) + +#define __HAL_RCC_PMU_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_PMURST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_PMURST; \ + }while (0) + +#define __HAL_RCC_I2C4_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_I2C4RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_I2C4RST; \ + }while (0) + +#define __HAL_RCC_I2C3_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_I2C3RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_I2C3RST; \ + }while (0) + +#define __HAL_RCC_I2C2_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_I2C2RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_I2C2RST; \ + }while (0) + +#define __HAL_RCC_I2C1_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_I2C1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_I2C1RST; \ + }while (0) + +#define __HAL_RCC_USART5_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_USART5RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_USART5RST; \ + }while (0) + +#define __HAL_RCC_USART4_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_USART4RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_USART4RST; \ + }while (0) + +#define __HAL_RCC_USART3_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_USART3RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_USART3RST; \ + }while (0) + +#define __HAL_RCC_USART2_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_USART2RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_USART2RST; \ + }while (0) + +#define __HAL_RCC_I2S3_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_I2S3RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_I2S3RST; \ + }while (0) + +#define __HAL_RCC_I2S2_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_I2S2RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_I2S2RST; \ + }while (0) + +#define __HAL_RCC_I2S1_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_I2S1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_I2S1RST; \ + }while (0) + +#define __HAL_RCC_WDT_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_WDTRST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_WDTRST; \ + }while (0) + +#define __HAL_RCC_TIM14_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_TIM14RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_TIM14RST; \ + }while (0) + +#define __HAL_RCC_TIM13_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_TIM13RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_TIM13RST; \ + }while (0) + +#define __HAL_RCC_TIM12_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_TIM12RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_TIM12RST; \ + }while (0) + +#define __HAL_RCC_TIM7_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_TIM7RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_TIM7RST; \ + }while (0) + +#define __HAL_RCC_TIM6_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_TIM6RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_TIM6RST; \ + }while (0) + +#define __HAL_RCC_TIM5_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_TIM5RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_TIM5RST; \ + }while (0) + +#define __HAL_RCC_TIM4_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_TIM4RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_TIM4RST; \ + }while (0) + +#define __HAL_RCC_TIM3_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_TIM3RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_TIM3RST; \ + }while (0) + +#define __HAL_RCC_TIM2_RESET() do \ + { \ + RCC->APB1RSTR1 &= ~RCC_APB1RSTR1_TIM2RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR1 |= RCC_APB1RSTR1_TIM2RST; \ + }while (0) + +#define __HAL_RCC_EFUSE2_RESET() do \ + { \ + RCC->APB1RSTR2 &= ~RCC_APB1RSTR2_EFUSE2RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR2 |= RCC_APB1RSTR2_EFUSE2RST; \ + }while (0) + +#define __HAL_RCC_EFUSE1_RESET() do \ + { \ + RCC->APB1RSTR2 &= ~RCC_APB1RSTR2_EFUSE1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR2 |= RCC_APB1RSTR2_EFUSE1RST; \ + }while (0) + +#define __HAL_RCC_TIM26_RESET() do \ + { \ + RCC->APB1RSTR2 &= ~RCC_APB1RSTR2_TIM26RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR2 |= RCC_APB1RSTR2_TIM26RST; \ + }while (0) + +#define __HAL_RCC_TIM25_RESET() do \ + { \ + RCC->APB1RSTR2 &= ~RCC_APB1RSTR2_TIM25RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR2 |= RCC_APB1RSTR2_TIM25RST; \ + }while (0) + +#define __HAL_RCC_USART8_RESET() do \ + { \ + RCC->APB1RSTR2 &= ~RCC_APB1RSTR2_USART8RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR2 |= RCC_APB1RSTR2_USART8RST; \ + }while (0) + +#define __HAL_RCC_USART7_RESET() do \ + { \ + RCC->APB1RSTR2 &= ~RCC_APB1RSTR2_USART7RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR2 |= RCC_APB1RSTR2_USART7RST; \ + }while (0) + +#define __HAL_RCC_LPTIM2_RESET() do \ + { \ + RCC->APB1RSTR2 &= ~RCC_APB1RSTR2_LPTIM2RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB1RSTR2 |= RCC_APB1RSTR2_LPTIM2RST; \ + }while (0) + +/** @brief the APB2 peripheral reset. + */ + +#define __HAL_RCC_USART10_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_USART10RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_USART10RST; \ + }while (0) + +#define __HAL_RCC_USART9_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_USART9RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_USART9RST; \ + }while (0) + +#define __HAL_RCC_TIM24_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM24RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM24RST; \ + }while (0) + +#define __HAL_RCC_TIM23_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM23RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM23RST; \ + }while (0) + +#define __HAL_RCC_TIM22_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM22RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM22RST; \ + }while (0) + +#define __HAL_RCC_TIM21_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM21RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM21RST; \ + }while (0) + +#define __HAL_RCC_TIM19_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM19RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM19RST; \ + }while (0) + +#define __HAL_RCC_TIM18_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM18RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM18RST; \ + }while (0) + +#define __HAL_RCC_TIM11_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM11RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM11RST; \ + }while (0) + +#define __HAL_RCC_TIM10_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM10RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM10RST; \ + }while (0) + +#define __HAL_RCC_TIM9_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM9RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM9RST; \ + }while (0) + +#define __HAL_RCC_LTDC_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_LTDCRST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_LTDCRST; \ + }while (0) + +#define __HAL_RCC_TKEY_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TKEYRST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TKEYRST; \ + }while (0) + +#define __HAL_RCC_TIM20_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM20RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM20RST; \ + }while (0) + +#define __HAL_RCC_TIM17_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM17RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM17RST; \ + }while (0) + +#define __HAL_RCC_TIM16_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM16RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM16RST; \ + }while (0) + +#define __HAL_RCC_TIM15_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM15RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM15RST; \ + }while (0) + +#define __HAL_RCC_USART6_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_USART6RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_USART6RST; \ + }while (0) + +#define __HAL_RCC_USART1_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_USART1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_USART1RST; \ + }while (0) + +#define __HAL_RCC_TIM8_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM8RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM8RST; \ + }while (0) + +#define __HAL_RCC_TIM1_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_TIM1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_TIM1RST; \ + }while (0) + +#define __HAL_RCC_EXTI_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_EXTIRST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_EXTIRST; \ + }while (0) + +#define __HAL_RCC_CMP1_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_CMP1RST_A; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_CMP1RST_A; \ + }while (0) + +#define __HAL_RCC_SYSCFG_RESET() do \ + { \ + RCC->APB2RSTR &= ~RCC_APB2RSTR_SYSCFGRST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB2RSTR |= RCC_APB2RSTR_SYSCFGRST; \ + }while (0) + +/** @brief the APB3 peripheral reset. + */ + +#define __HAL_RCC_LPTIM6_RESET() do \ + { \ + RCC->APB3RSTR &= ~RCC_APB3RSTR_LPTIM6RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB3RSTR |= RCC_APB3RSTR_LPTIM6RST; \ + }while (0) + +#define __HAL_RCC_LPTIM5_RESET() do \ + { \ + RCC->APB3RSTR &= ~RCC_APB3RSTR_LPTIM5RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB3RSTR |= RCC_APB3RSTR_LPTIM5RST; \ + }while (0) + +#define __HAL_RCC_LPTIM4_RESET() do \ + { \ + RCC->APB3RSTR &= ~RCC_APB3RSTR_LPTIM4RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB3RSTR |= RCC_APB3RSTR_LPTIM4RST; \ + }while (0) + +#define __HAL_RCC_LPTIM3_RESET() do \ + { \ + RCC->APB3RSTR &= ~RCC_APB3RSTR_LPTIM3RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB3RSTR |= RCC_APB3RSTR_LPTIM3RST; \ + }while (0) + +/** @brief the APB4 peripheral reset. + */ + +#define __HAL_RCC_DPWM6_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_DPWM6RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_DPWM6RST; \ + }while (0) + +#define __HAL_RCC_DPWM5_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_DPWM5RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_DPWM5RST; \ + }while (0) + +#define __HAL_RCC_SPWM6_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_SPWM6RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_SPWM6RST; \ + }while (0) + +#define __HAL_RCC_SPWM5_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_SPWM5RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_SPWM5RST; \ + }while (0) + +#define __HAL_RCC_SPWM4_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_SPWM4RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_SPWM4RST; \ + }while (0) + +#define __HAL_RCC_SPWM3_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_SPWM3RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_SPWM3RST; \ + }while (0) + +#define __HAL_RCC_MDAC_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_MDACRST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_MDACRST; \ + }while (0) + +#define __HAL_RCC_LPT_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_LPTRST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_LPTRST; \ + }while (0) + +#define __HAL_RCC_PNDL_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_PNDLRST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_PNDLRST; \ + }while (0) + +#define __HAL_RCC_DPWM4_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_DPWM4RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_DPWM4RST; \ + }while (0) + +#define __HAL_RCC_DPWM3_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_DPWM3RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_DPWM3RST; \ + }while (0) + +#define __HAL_RCC_DPWM2_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_DPWM2RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_DPWM2RST; \ + }while (0) + +#define __HAL_RCC_DPWM1_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_DPWM1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_DPWM1RST; \ + }while (0) + +#define __HAL_RCC_SPWM2_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_SPWM2RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_SPWM2RST; \ + }while (0) + +#define __HAL_RCC_SPWM1_RESET() do \ + { \ + RCC->APB4RSTR &= ~RCC_APB4RSTR_SPWM1RST; \ + __NOP();__NOP();__NOP(); \ + RCC->APB4RSTR |= RCC_APB4RSTR_SPWM1RST; \ + }while (0) + +/** @brief Enable or Disable the AHB1 peripheral clock. + */ + +#define __HAL_RCC_SRAM2_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_SRAM2CKEN ) +#define __HAL_RCC_SRAM2_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_SRAM2CKEN ) +#define __HAL_RCC_SRAM1_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_SRAM1CKEN ) +#define __HAL_RCC_SRAM1_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_SRAM1CKEN ) +#define __HAL_RCC_ROM_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_ROMCKEN ) +#define __HAL_RCC_ROM_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_ROMCKEN ) +#define __HAL_RCC_BKPSRAM_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_BKPSRAMCKEN ) +#define __HAL_RCC_BKPSRAM_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_BKPSRAMCKEN ) +#define __HAL_RCC_FDCAN2_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_FDCAN2CKEN ) +#define __HAL_RCC_FDCAN2_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_FDCAN2CKEN ) +#define __HAL_RCC_FDCAN1_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_FDCAN1CKEN ) +#define __HAL_RCC_FDCAN1_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_FDCAN1CKEN ) +#define __HAL_RCC_USB2_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_USB2CCKEN ) +#define __HAL_RCC_USB2_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_USB2CCKEN ) +#define __HAL_RCC_USB1_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_USB1CCKEN ) +#define __HAL_RCC_USB1_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_USB1CCKEN ) +#define __HAL_RCC_SPI6_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_SPI6CKEN ) +#define __HAL_RCC_SPI6_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_SPI6CKEN ) +#define __HAL_RCC_SPI5_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_SPI5CKEN ) +#define __HAL_RCC_SPI5_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_SPI5CKEN ) +#define __HAL_RCC_SPI4_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_SPI4CKEN ) +#define __HAL_RCC_SPI4_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_SPI4CKEN ) +#define __HAL_RCC_SPI3_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_SPI3CKEN ) +#define __HAL_RCC_SPI3_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_SPI3CKEN ) +#define __HAL_RCC_SPI2_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_SPI2CKEN ) +#define __HAL_RCC_SPI2_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_SPI2CKEN ) +#define __HAL_RCC_SPI1_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_SPI1CKEN ) +#define __HAL_RCC_SPI1_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_SPI1CKEN ) +#define __HAL_RCC_DMA2D_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_DMA2DCKEN ) +#define __HAL_RCC_DMA2D_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_DMA2DCKEN ) +#define __HAL_RCC_ETHRX_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_ETHRXCKEN ) +#define __HAL_RCC_ETHRX_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_ETHRXCKEN ) +#define __HAL_RCC_ETHTX_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_ETHTXCKEN ) +#define __HAL_RCC_ETHTX_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_ETHTXCKEN ) +#define __HAL_RCC_ETHMAC_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_ETHMACCKEN ) +#define __HAL_RCC_ETHMAC_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_ETHMACCKEN ) +#define __HAL_RCC_CRC_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_CRCCKEN ) +#define __HAL_RCC_CRC_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_CRCCKEN ) +#define __HAL_RCC_DMA2_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_DMA2CKEN ) +#define __HAL_RCC_DMA2_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_DMA2CKEN ) +#define __HAL_RCC_DMA1_CLK_ENABLE() ( RCC->AHB1CKENR |= RCC_AHB1CKENR_DMA1CKEN ) +#define __HAL_RCC_DMA1_CLK_DISABLE() ( RCC->AHB1CKENR &= ~RCC_AHB1CKENR_DMA1CKEN ) + +/** @brief Enable or Disable the AHB2 peripheral clock. + */ + +#define __HAL_RCC_THM_CLK_ENABLE() ( RCC->AHB2CKENR |= RCC_AHB2CKENR_THMCKEN ) +#define __HAL_RCC_THM_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_THMCKEN ) +#define __HAL_RCC_FDCAN3_CLK_ENABLE() ( RCC->AHB2CKENR |= RCC_AHB2CKENR_FDCAN3CKEN ) +#define __HAL_RCC_FDCAN3_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_FDCAN3CKEN ) +#define __HAL_RCC_CORDIC_CLK_ENABLE() ( RCC->AHB2CKENR |= RCC_AHB2CKENR_CORDICCKEN ) +#define __HAL_RCC_CORDIC_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_CORDICCKEN ) +#define __HAL_RCC_HRNG_CLK_ENABLE() ( RCC->AHB2CKENR |= RCC_AHB2CKENR_HRNGCKEN ) +#define __HAL_RCC_HRNG_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_HRNGCKEN ) +#define __HAL_RCC_AES_CLK_ENABLE() ( RCC->AHB2CKENR |= RCC_AHB2CKENR_AESCKEN ) +#define __HAL_RCC_AES_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_AESCKEN ) +#define __HAL_RCC_AES_SPI1_CLK_ENABLE() ( RCC->AHB2CKENR |= RCC_AHB2CKENR_AESSPI1CKEN ) +#define __HAL_RCC_AES_SPI1_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_AESSPI1CKEN ) +#define __HAL_RCC_DCMI_CLK_ENABLE() ( RCC->AHB2CKENR |= RCC_AHB2CKENR_DCMICKEN ) +#define __HAL_RCC_DCMI_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_DCMICKEN ) +#define __HAL_RCC_DAC2_CLK_ENABLE() ( RCC->AHB2CKENR |= RCC_AHB2CKENR_DAC2CKEN ) +#define __HAL_RCC_DAC2_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_DAC2CKEN ) +#define __HAL_RCC_DAC1_CLK_ENABLE() ( RCC->AHB2CKENR |= RCC_AHB2CKENR_DAC1CKEN ) +#define __HAL_RCC_DAC1_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_DAC1CKEN ) +#define __HAL_RCC_ADC3_CLK_ENABLE() ( RCC->AHB2CKENR |= RCC_AHB2CKENR_ADC3CKEN ) +#define __HAL_RCC_ADC3_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_ADC3CKEN ) +#define __HAL_RCC_ADC12_CLK_ENABLE() ( RCC->AHB2CKENR |= RCC_AHB2CKENR_ADC12CKEN ) +#define __HAL_RCC_ADC12_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_ADC12CKEN ) +#define __HAL_RCC_GPIOQ_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOQCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOQ_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOQCKEN ) +#define __HAL_RCC_GPIOP_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOPCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOP_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOPCKEN ) +#define __HAL_RCC_GPIOO_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOOCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOO_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOOCKEN ) +#define __HAL_RCC_GPION_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIONCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPION_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIONCKEN ) +#define __HAL_RCC_GPIOM_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOMCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOM_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOMCKEN ) +#define __HAL_RCC_GPIOL_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOLCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOL_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOLCKEN ) +#define __HAL_RCC_GPIOK_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOKCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOK_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOKCKEN ) +#define __HAL_RCC_GPIOJ_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOJCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOJ_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOJCKEN ) +#define __HAL_RCC_GPIOI_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOICKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOI_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOICKEN ) +#define __HAL_RCC_GPIOH_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOHCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOH_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOHCKEN ) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOGCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOG_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOGCKEN ) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOFCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOF_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOFCKEN ) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOECKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOE_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOECKEN ) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIODCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOD_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIODCKEN ) +#define __HAL_RCC_GPIOC_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOCCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOC_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOCCKEN ) +#define __HAL_RCC_GPIOB_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOBCKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOB_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOBCKEN ) +#define __HAL_RCC_GPIOA_CLK_ENABLE() do \ + { \ + RCC->AHB2CKENR |= RCC_AHB2CKENR_GPIOACKEN; \ + RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN; \ + } while (0) +#define __HAL_RCC_GPIOA_CLK_DISABLE() ( RCC->AHB2CKENR &= ~RCC_AHB2CKENR_GPIOACKEN ) + +/** @brief Enable or Disable the AHB3 peripheral clock. + */ + +#define __HAL_RCC_FMC_CLK_ENABLE() ( RCC->AHB3CKENR |= RCC_AHB3CKENR_FMCCKEN ) +#define __HAL_RCC_FMC_CLK_DISABLE() ( RCC->AHB3CKENR &= ~RCC_AHB3CKENR_FMCCKEN ) +#define __HAL_RCC_OSPI2_CLK_ENABLE() ( RCC->AHB3CKENR |= RCC_AHB3CKENR_OSPI2CKEN ) +#define __HAL_RCC_OSPI2_CLK_DISABLE() ( RCC->AHB3CKENR &= ~RCC_AHB3CKENR_OSPI2CKEN ) +#define __HAL_RCC_OSPI1_CLK_ENABLE() ( RCC->AHB3CKENR |= RCC_AHB3CKENR_OSPI1CKEN ) +#define __HAL_RCC_OSPI1_CLK_DISABLE() ( RCC->AHB3CKENR &= ~RCC_AHB3CKENR_OSPI1CKEN ) +#define __HAL_RCC_SDMMC_CLK_ENABLE() ( RCC->AHB3CKENR |= RCC_AHB3CKENR_SDMMCCKEN ) +#define __HAL_RCC_SDMMC_CLK_DISABLE() ( RCC->AHB3CKENR &= ~RCC_AHB3CKENR_SDMMCCKEN ) +#define __HAL_RCC_SPI7_CLK_ENABLE() ( RCC->AHB3CKENR |= RCC_AHB3CKENR_SPI7CKEN) +#define __HAL_RCC_SPI7_CLK_DISABLE() ( RCC->AHB3CKENR &= ~RCC_AHB3CKENR_SPI7CKEN) +#define __HAL_RCC_SPI8_CLK_ENABLE() ( RCC->AHB3CKENR |= RCC_AHB3CKENR_SPI8CKEN) +#define __HAL_RCC_SPI8_CLK_DISABLE() ( RCC->AHB3CKENR &= ~RCC_AHB3CKENR_SPI8CKEN) + +/** @brief Enable or Disable the APB1 peripheral clock. + */ + +#define __HAL_RCC_LPUART1_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_LPUART1CKEN ) +#define __HAL_RCC_LPUART1_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_LPUART1CKEN ) +#define __HAL_RCC_LPTIM1_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_LPTIM1CKEN ) +#define __HAL_RCC_LPTIM1_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_LPTIM1CKEN ) +#define __HAL_RCC_PMU_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_PMUCKEN ) +#define __HAL_RCC_PMU_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_PMUCKEN ) +#define __HAL_RCC_I2C4_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_I2C4CKEN ) +#define __HAL_RCC_I2C4_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_I2C4CKEN ) +#define __HAL_RCC_I2C3_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_I2C3CKEN ) +#define __HAL_RCC_I2C3_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_I2C3CKEN ) +#define __HAL_RCC_I2C2_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_I2C2CKEN ) +#define __HAL_RCC_I2C2_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_I2C2CKEN ) +#define __HAL_RCC_I2C1_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_I2C1CKEN ) +#define __HAL_RCC_I2C1_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_I2C1CKEN ) +#define __HAL_RCC_USART5_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_USART5CKEN ) +#define __HAL_RCC_USART5_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_USART5CKEN ) +#define __HAL_RCC_USART4_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_USART4CKEN ) +#define __HAL_RCC_USART4_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_USART4CKEN ) +#define __HAL_RCC_USART3_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_USART3CKEN ) +#define __HAL_RCC_USART3_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_USART3CKEN ) +#define __HAL_RCC_USART2_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_USART2CKEN ) +#define __HAL_RCC_USART2_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_USART2CKEN ) +#define __HAL_RCC_I2S3_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_I2S3CKEN ) +#define __HAL_RCC_I2S3_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_I2S3CKEN ) +#define __HAL_RCC_I2S2_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_I2S2CKEN ) +#define __HAL_RCC_I2S2_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_I2S2CKEN ) +#define __HAL_RCC_I2S1_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_I2S1CKEN ) +#define __HAL_RCC_I2S1_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_I2S1CKEN ) +#define __HAL_RCC_WDT_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_WDTCKEN ) +#define __HAL_RCC_WDT_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_WDTCKEN ) +#define __HAL_RCC_RTC_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_RTCCKEN ) +#define __HAL_RCC_RTC_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_RTCCKEN ) +#define __HAL_RCC_TIM14_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_TIM14CKEN ) +#define __HAL_RCC_TIM14_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_TIM14CKEN ) +#define __HAL_RCC_TIM13_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_TIM13CKEN ) +#define __HAL_RCC_TIM13_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_TIM13CKEN ) +#define __HAL_RCC_TIM12_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_TIM12CKEN ) +#define __HAL_RCC_TIM12_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_TIM12CKEN ) +#define __HAL_RCC_TIM7_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_TIM7CKEN ) +#define __HAL_RCC_TIM7_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_TIM7CKEN ) +#define __HAL_RCC_TIM6_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_TIM6CKEN ) +#define __HAL_RCC_TIM6_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_TIM6CKEN ) +#define __HAL_RCC_TIM5_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_TIM5CKEN ) +#define __HAL_RCC_TIM5_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_TIM5CKEN ) +#define __HAL_RCC_TIM4_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_TIM4CKEN ) +#define __HAL_RCC_TIM4_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_TIM4CKEN ) +#define __HAL_RCC_TIM3_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_TIM3CKEN ) +#define __HAL_RCC_TIM3_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_TIM3CKEN ) +#define __HAL_RCC_TIM2_CLK_ENABLE() ( RCC->APB1CKENR1 |= RCC_APB1CKENR1_TIM2CKEN ) +#define __HAL_RCC_TIM2_CLK_DISABLE() ( RCC->APB1CKENR1 &= ~RCC_APB1CKENR1_TIM2CKEN ) +#define __HAL_RCC_EFUSE2_CLK_ENABLE() ( RCC->APB1CKENR2 |= RCC_APB1CKENR2_EFUSE2CKEN ) +#define __HAL_RCC_EFUSE2_CLK_DISABLE() ( RCC->APB1CKENR2 &= ~RCC_APB1CKENR2_EFUSE2CKEN ) +#define __HAL_RCC_EFUSE1_CLK_ENABLE() ( RCC->APB1CKENR2 |= RCC_APB1CKENR2_EFUSE1CKEN ) +#define __HAL_RCC_EFUSE1_CLK_DISABLE() ( RCC->APB1CKENR2 &= ~RCC_APB1CKENR2_EFUSE1CKEN ) +#define __HAL_RCC_TIM26_CLK_ENABLE() ( RCC->APB1CKENR2 |= RCC_APB1CKENR2_TIM26CKEN ) +#define __HAL_RCC_TIM26_CLK_DISABLE() ( RCC->APB1CKENR2 &= ~RCC_APB1CKENR2_TIM26CKEN ) +#define __HAL_RCC_TIM25_CLK_ENABLE() ( RCC->APB1CKENR2 |= RCC_APB1CKENR2_TIM25CKEN ) +#define __HAL_RCC_TIM25_CLK_DISABLE() ( RCC->APB1CKENR2 &= ~RCC_APB1CKENR2_TIM25CKEN ) +#define __HAL_RCC_USART8_CLK_ENABLE() ( RCC->APB1CKENR2 |= RCC_APB1CKENR2_USART8CKEN ) +#define __HAL_RCC_USART8_CLK_DISABLE() ( RCC->APB1CKENR2 &= ~RCC_APB1CKENR2_USART8CKEN ) +#define __HAL_RCC_USART7_CLK_ENABLE() ( RCC->APB1CKENR2 |= RCC_APB1CKENR2_USART7CKEN ) +#define __HAL_RCC_USART7_CLK_DISABLE() ( RCC->APB1CKENR2 &= ~RCC_APB1CKENR2_USART7CKEN ) +#define __HAL_RCC_LPTIM2_CLK_ENABLE() ( RCC->APB1CKENR2 |= RCC_APB1CKENR2_LPTIM2CKEN ) +#define __HAL_RCC_LPTIM2_CLK_DISABLE() ( RCC->APB1CKENR2 &= ~RCC_APB1CKENR2_LPTIM2CKEN ) + +/** @brief Enable or Disable the APB2 peripheral clock. + */ + +#define __HAL_RCC_USART10_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_USART10CKEN ) +#define __HAL_RCC_USART10_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_USART10CKEN ) +#define __HAL_RCC_USART9_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_USART9CKEN ) +#define __HAL_RCC_USART9_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_USART9CKEN ) +#define __HAL_RCC_TIM24_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM24CKEN ) +#define __HAL_RCC_TIM24_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM24CKEN ) +#define __HAL_RCC_TIM23_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM23CKEN ) +#define __HAL_RCC_TIM23_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM23CKEN ) +#define __HAL_RCC_TIM22_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM22CKEN ) +#define __HAL_RCC_TIM22_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM22CKEN ) +#define __HAL_RCC_TIM21_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM21CKEN ) +#define __HAL_RCC_TIM21_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM21CKEN ) +#define __HAL_RCC_TIM19_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM19CKEN ) +#define __HAL_RCC_TIM19_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM19CKEN ) +#define __HAL_RCC_TIM18_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM18CKEN ) +#define __HAL_RCC_TIM18_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM18CKEN ) +#define __HAL_RCC_TIM11_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM11CKEN ) +#define __HAL_RCC_TIM11_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM11CKEN ) +#define __HAL_RCC_TIM10_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM10CKEN ) +#define __HAL_RCC_TIM10_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM10CKEN ) +#define __HAL_RCC_TIM9_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM9CKEN ) +#define __HAL_RCC_TIM9_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM9CKEN ) +#define __HAL_RCC_LTDC_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_LTDCCKEN ) +#define __HAL_RCC_LTDC_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_LTDCCKEN ) +#define __HAL_RCC_TKEY_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TKEYCKEN ) +#define __HAL_RCC_TKEY_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TKEYCKEN ) +#define __HAL_RCC_TIM20_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM20CKEN ) +#define __HAL_RCC_TIM20_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM20CKEN ) +#define __HAL_RCC_TIM17_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM17CKEN ) +#define __HAL_RCC_TIM17_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM17CKEN ) +#define __HAL_RCC_TIM16_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM16CKEN ) +#define __HAL_RCC_TIM16_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM16CKEN ) +#define __HAL_RCC_TIM15_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM15CKEN ) +#define __HAL_RCC_TIM15_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM15CKEN ) +#define __HAL_RCC_USART6_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_USART6CKEN ) +#define __HAL_RCC_USART6_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_USART6CKEN ) +#define __HAL_RCC_USART1_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_USART1CKEN ) +#define __HAL_RCC_USART1_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_USART1CKEN ) +#define __HAL_RCC_TIM8_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM8CKEN ) +#define __HAL_RCC_TIM8_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM8CKEN ) +#define __HAL_RCC_TIM1_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_TIM1CKEN ) +#define __HAL_RCC_TIM1_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_TIM1CKEN ) +#define __HAL_RCC_EXTI_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_EXTICKEN ) +#define __HAL_RCC_EXTI_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_EXTICKEN ) +#define __HAL_RCC_CMP1_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_CMP1CKEN_A ) +#define __HAL_RCC_CMP1_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_CMP1CKEN_A ) +#define __HAL_RCC_SYSCFG_CLK_ENABLE() ( RCC->APB2CKENR |= RCC_APB2CKENR_SYSCFGCKEN ) +#define __HAL_RCC_SYSCFG_CLK_DISABLE() ( RCC->APB2CKENR &= ~RCC_APB2CKENR_SYSCFGCKEN ) + +/** @brief Enable or Disable the APB3 peripheral clock. + */ + +#define __HAL_RCC_LPTIM6_CLK_ENABLE() ( RCC->APB3CKENR |= RCC_APB3CKENR_LPTIM6CKEN ) +#define __HAL_RCC_LPTIM6_CLK_DISABLE() ( RCC->APB3CKENR &= ~RCC_APB3CKENR_LPTIM6CKEN ) +#define __HAL_RCC_LPTIM5_CLK_ENABLE() ( RCC->APB3CKENR |= RCC_APB3CKENR_LPTIM5CKEN ) +#define __HAL_RCC_LPTIM5_CLK_DISABLE() ( RCC->APB3CKENR &= ~RCC_APB3CKENR_LPTIM5CKEN ) +#define __HAL_RCC_LPTIM4_CLK_ENABLE() ( RCC->APB3CKENR |= RCC_APB3CKENR_LPTIM4CKEN ) +#define __HAL_RCC_LPTIM4_CLK_DISABLE() ( RCC->APB3CKENR &= ~RCC_APB3CKENR_LPTIM4CKEN ) +#define __HAL_RCC_LPTIM3_CLK_ENABLE() ( RCC->APB3CKENR |= RCC_APB3CKENR_LPTIM3CKEN ) +#define __HAL_RCC_LPTIM3_CLK_DISABLE() ( RCC->APB3CKENR &= ~RCC_APB3CKENR_LPTIM3CKEN ) + +/** @brief Enable or Disable the APB4 peripheral clock. + */ + +#define __HAL_RCC_DPWM6_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_DPWM6CKEN ) +#define __HAL_RCC_DPWM6_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_DPWM6CKEN ) +#define __HAL_RCC_DPWM5_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_DPWM5CKEN ) +#define __HAL_RCC_DPWM5_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_DPWM5CKEN ) +#define __HAL_RCC_SPWM6_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_SPWM6CKEN ) +#define __HAL_RCC_SPWM6_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_SPWM6CKEN ) +#define __HAL_RCC_SPWM5_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_SPWM5CKEN ) +#define __HAL_RCC_SPWM5_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_SPWM5CKEN ) +#define __HAL_RCC_SPWM4_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_SPWM4CKEN ) +#define __HAL_RCC_SPWM4_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_SPWM4CKEN ) +#define __HAL_RCC_SPWM3_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_SPWM3CKEN ) +#define __HAL_RCC_SPWM3_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_SPWM3CKEN ) +#define __HAL_RCC_MDAC_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_MDACCKEN ) +#define __HAL_RCC_MDAC_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_MDACCKEN ) +#define __HAL_RCC_PNDL_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_PNDLCKEN ) +#define __HAL_RCC_PNDL_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_PNDLCKEN ) +#define __HAL_RCC_DPWM4_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_DPWM4CKEN ) +#define __HAL_RCC_DPWM4_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_DPWM4CKEN ) +#define __HAL_RCC_DPWM3_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_DPWM3CKEN ) +#define __HAL_RCC_DPWM3_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_DPWM3CKEN ) +#define __HAL_RCC_DPWM2_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_DPWM2CKEN ) +#define __HAL_RCC_DPWM2_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_DPWM2CKEN ) +#define __HAL_RCC_DPWM1_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_DPWM1CKEN ) +#define __HAL_RCC_DPWM1_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_DPWM1CKEN ) +#define __HAL_RCC_SPWM2_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_SPWM2CKEN ) +#define __HAL_RCC_SPWM2_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_SPWM2CKEN ) +#define __HAL_RCC_SPWM1_CLK_ENABLE() ( RCC->APB4CKENR |= RCC_APB4CKENR_SPWM1CKEN ) +#define __HAL_RCC_SPWM1_CLK_DISABLE() ( RCC->APB4CKENR &= ~RCC_APB4CKENR_SPWM1CKEN ) + +/******************************************************************************/ + +/** @defgroup RCC Private Macros + * @{ + */ + +#define IS_RCC_RESET_SOURCE(SOURCE) ((((SOURCE) & RCC_RESET_SOURCE_MASK) != 0U) && \ + (((SOURCE) & ~RCC_RESET_SOURCE_MASK) == 0U)) + +#define IS_RCC_OSC_TYPE(TYPE) ((((TYPE) & RCC_OSC_TYPE_MASK) != 0U) && \ + (((TYPE) & ~RCC_OSC_TYPE_MASK) == 0U)) + +#define IS_RCC_OSC_XTL_DRIVE(DRIVE) ((DRIVE) < RCC_XTL_DRIVE_MAX) + +#define IS_RCC_IT(IT) ((((IT) & RCC_IT_MASK) != 0U) && \ + (((IT) & ~RCC_IT_MASK) == 0U)) + +#define IS_RCC_IT_FLAG(FLAG) ((((FLAG) & RCC_FLAG_MASK) != 0U) && \ + (((FLAG) & ~RCC_FLAG_MASK) == 0U)) + +#define IS_RCC_PLL_CLOCK_SOURCE(SOURCE) ((SOURCE) < RCC_PLL_SOURCE_MAX) + +#define IS_RCC_PLL1_PLLQ(PLLQ) (((PLLQ) != 0) && ((PLLQ) <= 15)) + +#define IS_RCC_PLL1_PLLP(PLLP) (((PLLP) == 2U) || \ + ((PLLP) == 4U) || \ + ((PLLP) == 6U) || \ + ((PLLP) == 8U)) + +#define IS_RCC_PLL1_PLLN(PLLN) (((PLLN) != 0) && ((PLLN) <= 63U)) + +#define IS_RCC_PLL1_PLLF(PLLF) (((PLLF) >= 50U) && ((PLLF) <= 511U)) + +#define IS_RCC_PLL2_PLLQ(PLLQ) (((PLLQ) != 0) && ((PLLQ) <= 15)) + +#define IS_RCC_PLL2_PLLP(PLLP) (((PLLP) == 2U) || \ + ((PLLP) == 4U) || \ + ((PLLP) == 6U) || \ + ((PLLP) == 8U)) + +#define IS_RCC_PLL2_PLLN(PLLN) (((PLLN) != 0) && ((PLLN) <= 63U)) + +#define IS_RCC_PLL2_PLLF(PLLF) (((PLLF) >= 50U) && ((PLLF) <= 511U)) + +#define IS_RCC_PLL3_PLLQ(PLLQ) (((PLLQ) == 1U) || \ + ((PLLQ) == 2U) || \ + ((PLLQ) == 4U) || \ + ((PLLQ) == 8U)) + +#define IS_RCC_PLL3_PLLP(PLLP) (((PLLP) == 1U) || \ + ((PLLP) == 2U) || \ + ((PLLP) == 4U) || \ + ((PLLP) == 8U)) + +#define IS_RCC_PLL3_PLLN(PLLN) (((PLLN) != 0) && ((PLLN) <= 64U)) + +#define IS_RCC_PLL3_PLLF(PLLF) (((PLLF) != 0) && ((PLLF) <= 128U)) + +#define IS_RCC_CLOCK_TYPE(TYPE) ((((TYPE) & RCC_CLOCK_TYPE_MASK) != 0U) && \ + (((TYPE) & ~RCC_CLOCK_TYPE_MASK) == 0U)) + +#define IS_RCC_SYSCLK_SOURCE(SOURCE) ((SOURCE) < RCC_SYSCLK_SOURCE_MAX) + +#define IS_RCC_SYSCLK_DIV(DIV) (((DIV) != 0) && ((DIV) <= 16U)) + +#define IS_RCC_SYSCLK_DIV(DIV) (((DIV) != 0) && ((DIV) <= 16U)) + +#define IS_RCC_PCLK_DIV(DIV) (((DIV) == 1) || \ + ((DIV) == 2) || \ + ((DIV) == 4) || \ + ((DIV) == 8) || \ + ((DIV) == 16)) + +#define IS_RCC_HRNGS_CLK_DIV(DIV) (((DIV) != 0) && ((DIV) <= 128U)) + +#define IS_RCC_FLT_CLK_SOURCE(SOURCE) ((SOURCE) < RCC_FLT_CLK_SOURCE_MAX) + +#define IS_RCC_LPUART1_CLK_SOURCE(SOURCE) ((SOURCE) < RCC_LPUART1_CLK_SOURCE_MAX) + +#define IS_RCC_LPTIM1_CLK_SOURCE(SOURCE) ((SOURCE) < RCC_LPTIM1_CLK_SOURCE_MAX) + +#define IS_RCC_LPTIM2_CLK_SOURCE(SOURCE) ((SOURCE) < RCC_LPTIM2_CLK_SOURCE_MAX) + +#define IS_RCC_LPTIM3_CLK_SOURCE(SOURCE) ((SOURCE) < RCC_LPTIM3_CLK_SOURCE_MAX) + +#define IS_RCC_LPTIM4_CLK_SOURCE(SOURCE) ((SOURCE) < RCC_LPTIM4_CLK_SOURCE_MAX) + +#define IS_RCC_LPTIM5_CLK_SOURCE(SOURCE) ((SOURCE) < RCC_LPTIM5_CLK_SOURCE_MAX) + +#define IS_RCC_LPTIM6_CLK_SOURCE(SOURCE) ((SOURCE) < RCC_LPTIM6_CLK_SOURCE_MAX) + +#define IS_RCC_SDMMC_CLK_SOURCE(SOURCE) ((SOURCE) < RCC_SDMMC_CLK_SOURCE_MAX) + +#define IS_RCC_SDMMC_SCLK_SOURCE(SOURCE) ((SOURCE) < RCC_SDMMC_SCLK_SOURCE_MAX) + +#define IS_RCC_LCD_CLK_DIV(DIV) (((DIV) == 2) || \ + ((DIV) == 4) || \ + ((DIV) == 8) || \ + ((DIV) == 16)) + +#define IS_RCC_RTC_CLK_SOURCE(SOURCE) ((SOURCE) < RCC_RTC_CLK_SOURCE_MAX) + +#define IS_RCC_MCO(MCO) ((MCO) < RCC_MCO_MAX) + +#define IS_RCC_MCO1_DIV(DIV) (((DIV) != 0) && ((DIV) <= 65536U)) + +#define IS_RCC_MCO2_DIV(DIV) (((DIV) != 0) && ((DIV) <= 64U)) + + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +void HAL_RCC_ReadyIRQHandler(void); +void HAL_RCC_XTHStopIRQHandler(void); +void HAL_RCC_XTLStopIRQHandler(void); +void HAL_RCC_RCHReadyCallback(void); +void HAL_RCC_RCLReadyCallback(void); +void HAL_RCC_XTHReadyCallback(void); +void HAL_RCC_XTLReadyCallback(void); +void HAL_RCC_PLL1ReadyCallback(void);; +void HAL_RCC_PLL2ReadyCallback(void); +void HAL_RCC_PLL3ReadyCallback(void); +void HAL_RCC_XTHStopCallback(void); +void HAL_RCC_XTLStopCallback(void); + +HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInit); + +HAL_StatusTypeDef HAL_RCC_RCHConfig(FunctionalState RCH, FunctionalState Div16); +HAL_StatusTypeDef HAL_RCC_RCLConfig(FunctionalState RCL); +HAL_StatusTypeDef HAL_RCC_XTHConfig(FunctionalState XTH, FunctionalState Bypass); +HAL_StatusTypeDef HAL_RCC_XTLConfig(FunctionalState XTL, FunctionalState Bypass); +HAL_StatusTypeDef HAL_RCC_PLL1Config(FunctionalState PLL1, uint32_t ClockSource, \ + uint32_t PLLN, uint32_t PLLF, uint32_t PLLP, uint32_t PLLQ); +HAL_StatusTypeDef HAL_RCC_PLL1SSCConfig(FunctionalState PLL1, uint32_t ClockSource, \ + uint32_t PLLN, uint32_t PLLF, uint32_t PLLP, uint32_t PLLQ, \ + FunctionalState SSC, uint32_t Mode, uint32_t Spectrum, uint32_t Step); +HAL_StatusTypeDef HAL_RCC_PLL1PCLKConfig(FunctionalState PLL1PCLK); +HAL_StatusTypeDef HAL_RCC_PLL1QCLKConfig(FunctionalState PLL1QCLK); +HAL_StatusTypeDef HAL_RCC_PLL2Config(FunctionalState PLL2, uint32_t PLLSource, \ + uint32_t PLLN, uint32_t PLLF, uint32_t PLLP, uint32_t PLLQ); +HAL_StatusTypeDef HAL_RCC_PLL2SSCConfig(FunctionalState PLL2, uint32_t ClockSource, \ + uint32_t PLLN, uint32_t PLLF, uint32_t PLLP, uint32_t PLLQ, \ + FunctionalState SSC, uint32_t Mode, uint32_t Spectrum, uint32_t Step); +HAL_StatusTypeDef HAL_RCC_PLL2PCLKConfig(FunctionalState PLL1PCLK); +HAL_StatusTypeDef HAL_RCC_PLL2QCLKConfig(FunctionalState PLL1QCLK); +HAL_StatusTypeDef HAL_RCC_PLL3Config(FunctionalState PLL3, uint32_t ClockSource, \ + uint32_t PLLN, uint32_t PLLF, uint32_t PLLP, uint32_t PLLQ); +HAL_StatusTypeDef HAL_RCC_PLL3PCLKConfig(FunctionalState PLL1PCLK); +HAL_StatusTypeDef HAL_RCC_PLL3QCLKConfig(FunctionalState PLL1QCLK); + +HAL_StatusTypeDef HAL_RCC_ITConfig(uint32_t IT, FunctionalState NewStatus); +uint32_t HAL_RCC_GetITFlag(uint32_t IT); +HAL_StatusTypeDef HAL_RCC_ClearITFlag(uint32_t IT); + +HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInit); +HAL_StatusTypeDef HAL_RCC_SYSCLKSourceConfig(uint32_t ClockSource); +HAL_StatusTypeDef HAL_RCC_SYSCLKDiv0Config(uint32_t Div); +HAL_StatusTypeDef HAL_RCC_SYSCLKDiv1Config(uint32_t Div); +HAL_StatusTypeDef HAL_RCC_PCLK1DivConfig(uint32_t Div); +HAL_StatusTypeDef HAL_RCC_PCLK2DivConfig(uint32_t Div); +HAL_StatusTypeDef HAL_RCC_PCLK3DivConfig(uint32_t Div); +HAL_StatusTypeDef HAL_RCC_PCLK4DivConfig(uint32_t Div); +HAL_StatusTypeDef HAL_RCC_HRNGSClockDivConfig(uint32_t Div); +HAL_StatusTypeDef HAL_RCC_FLTClockSourceConfig(uint32_t ClockSource); +HAL_StatusTypeDef HAL_RCC_LPUART1ClockSourceConfig(uint32_t ClockSource); +HAL_StatusTypeDef HAL_RCC_LPTIM1ClockSourceConfig(uint32_t ClockSource); +HAL_StatusTypeDef HAL_RCC_LPTIM2ClockSourceConfig(uint32_t ClockSource); +HAL_StatusTypeDef HAL_RCC_LPTIM3ClockSourceConfig(uint32_t ClockSource); +HAL_StatusTypeDef HAL_RCC_LPTIM4ClockSourceConfig(uint32_t ClockSource); +HAL_StatusTypeDef HAL_RCC_LPTIM5ClockSourceConfig(uint32_t ClockSource); +HAL_StatusTypeDef HAL_RCC_LPTIM6ClockSourceConfig(uint32_t ClockSource); +HAL_StatusTypeDef HAL_RCC_SDMMCClockSourceConfig(uint32_t ClockSource); +HAL_StatusTypeDef HAL_RCC_SDMMCSampleClockSourceConfig(uint32_t SampleClockSource); +HAL_StatusTypeDef HAL_RCC_LCDPiexlClockDivConfig(uint32_t Div); +HAL_StatusTypeDef HAL_RCC_RTCClockSourceConfig(uint32_t ClockSource); + +HAL_StatusTypeDef HAL_RCC_GetClock(RCC_ClkInitTypeDef *RCC_ClkInit); +HAL_StatusTypeDef HAL_RCC_GetSYSCLKSource(uint32_t *pClockSource); +HAL_StatusTypeDef HAL_RCC_GetHRNGSlowClockDiv(uint32_t *pClockDiv); +HAL_StatusTypeDef HAL_RCC_GetFLTClockSource(uint32_t *pClockSource); +HAL_StatusTypeDef HAL_RCC_GetLPUART1ClockSource(uint32_t *pClockSource); +HAL_StatusTypeDef HAL_RCC_GetLPTIM1ClockSource(uint32_t *pClockSource); +HAL_StatusTypeDef HAL_RCC_GetLPTIM2ClockSource(uint32_t *pClockSource); +HAL_StatusTypeDef HAL_RCC_GetLPTIM3ClockSource(uint32_t *pClockSource); +HAL_StatusTypeDef HAL_RCC_GetLPTIM4ClockSource(uint32_t *pClockSource); +HAL_StatusTypeDef HAL_RCC_GetLPTIM5ClockSource(uint32_t *pClockSource); +HAL_StatusTypeDef HAL_RCC_GetLPTIM6ClockSource(uint32_t *pClockSource); +HAL_StatusTypeDef HAL_RCC_GetSDMMCSampleClockSource(uint32_t *pClockSource); +HAL_StatusTypeDef HAL_RCC_GetRTCClockSource(uint32_t *pClockSource); + +uint32_t HAL_RCC_GetRCHTrimFreq(void); +uint32_t HAL_RCC_GetRCLTrimFreq(void); +uint32_t HAL_RCC_GetRCHFreq(void); +uint32_t HAL_RCC_GetRCLFreq(void); +uint32_t HAL_RCC_GetXTHFreq(void); +uint32_t HAL_RCC_GetXTLFreq(void); +uint32_t HAL_RCC_GetPLL1Freq(void); +uint32_t HAL_RCC_GetPLL1PFreq(void); +uint32_t HAL_RCC_GetPLL2Freq(void); +uint32_t HAL_RCC_GetPLL2QFreq(void); +uint32_t HAL_RCC_GetPLL2PFreq(void); +uint32_t HAL_RCC_GetPLL3Freq(void); +uint32_t HAL_RCC_GetPLL3QFreq(void); +uint32_t HAL_RCC_GetPLL3PFreq(void); +uint32_t HAL_RCC_GetSYSCLKFreq(void); +uint32_t HAL_RCC_GetSysCoreClockFreq(void); +uint32_t HAL_RCC_GetFCLKFreq(void); +uint32_t HAL_RCC_GetHCLKFreq(void); +uint32_t HAL_RCC_GetPCLK1Freq(void); +uint32_t HAL_RCC_GetPCLK2Freq(void); +uint32_t HAL_RCC_GetPCLK3Freq(void); +uint32_t HAL_RCC_GetPCLK4Freq(void); +uint32_t HAL_RCC_GetHRNGSClockFreq(void); +uint32_t HAL_RCC_GetFLTClockFreq(void); +uint32_t HAL_RCC_GetLPUART1ClockFreq(void); +uint32_t HAL_RCC_GetLPTIM1ClockFreq(void); +uint32_t HAL_RCC_GetLPTIM2ClockFreq(void); +uint32_t HAL_RCC_GetLPTIM3ClockFreq(void); +uint32_t HAL_RCC_GetLPTIM4ClockFreq(void); +uint32_t HAL_RCC_GetLPTIM5ClockFreq(void); +uint32_t HAL_RCC_GetLPTIM6ClockFreq(void); +uint32_t HAL_RCC_GetSDMMCClockFreq(void); +uint32_t HAL_RCC_GetLCDPiexlClockFreq(void); +uint32_t HAL_RCC_GetRTCClockFreq(void); + +uint32_t HAL_RCC_MCOConfig(RCC_MCOInitTypeDef *MCO_InitStruct); +uint32_t HAL_RCC_MCO1Config(uint32_t MCO, uint32_t NewStatus, uint32_t Div); +uint32_t HAL_RCC_MCO2Config(uint32_t MCO, uint32_t NewStatus, uint32_t Div); + +void HAL_RCC_SoftwareReset(void); +void HAL_RCC_StandbyReset(void); + +void HAL_RCC_LockupResetConfig(FunctionalState NewState); +void HAL_RCC_IWDTResetConfig(FunctionalState NewState); +void HAL_RCC_WDTResetConfig(FunctionalState NewState); +void HAL_RCC_LVDResetConfig(FunctionalState NewState); + +uint32_t HAL_RCC_GetResetSource(void); +void HAL_RCC_ClearAllResetSource(void); + + +#endif + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_rtc.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_rtc.h new file mode 100644 index 0000000000..817a308af3 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_rtc.h @@ -0,0 +1,484 @@ +/* + ****************************************************************************** + * @file HAL_RTC.h + * @version V1.0.0 + * @date 2022 + * @brief Header file of RTC HAL module. + ****************************************************************************** +*/ + +#ifndef __HAL_RTC_H__ +#define __HAL_RTC_H__ + +#include "hal.h" + + + + + + +/** + * @brief RTC Configuration Structure definition + */ +typedef struct +{ + uint32_t ClockSource; /*!< The RTC Clock Source to be configured.*/ + + uint32_t Compensation; /*!< The RTC Clock Compensation to be configured.*/ + + uint32_t CompensationValue; /*!< The RTC Clock Compensation Value to be configured.*/ +}RTC_ConfigTypeDef; + + +/** + * @brief RTC Date structure definition + */ +typedef struct +{ + uint8_t Year; /*!< Specifies the RTC Date Year. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x99 */ + + uint8_t Month; /*!< Specifies the RTC Date Month (in BCD format).*/ + + uint8_t Date; /*!< Specifies the RTC Date. + This parameter must be a number between Min_Data = 0x01 and Max_Data = 0x31 */ + + uint8_t WeekDay; /*!< Specifies the RTC Date WeekDay.*/ +}RTC_DateTypeDef; +/* Attention: YearMonthDateWeek use BCD code */ + + +/** + * @brief RTC Time structure definition + */ +typedef struct +{ + uint8_t Hour; /*!< Specifies the RTC Time Hour. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x23 */ + + uint8_t Minute; /*!< Specifies the RTC Time Minute. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x59 */ + + uint8_t Second; /*!< Specifies the RTC Time Seconds. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x59 */ +}RTC_TimeTypeDef; +/* Attention: HourMinuteSecond use BCD code */ + + +/** + * @brief RTC Time structure definition + */ +typedef struct +{ + uint32_t u32_AlarmMode; /*!< Specifies the RTC alarm Mode.*/ + + uint32_t u32_AlarmInterrupt; /*!< Specifies the RTC alarm interrupt Enable or Disable.*/ + + uint32_t u32_DayMask; /*!< Specifies the RTC alarm Day/Week Mask.*/ + + uint32_t u32_HourMask; /*!< Specifies the RTC alarm Hour Mask.*/ + + uint32_t u32_MinMask; /*!< Specifies the RTC alarm Min Mask.*/ + + uint32_t u32_AlarmWeek; /*!< Specifies the RTC alarm week select(Select WeekMode this parameter is valid).*/ + + uint32_t u32_AlarmDay; /*!< Specifies the RTC alarm day select(Select DayMode this parameter is valid). + This parameter must be a number between Min_Data = 0x01 and Max_Data = 0x31 */ + + uint32_t u32_Hours; /*!< Specifies the RTC alarm Hour. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x23 */ + + uint32_t u32_Minutes; /*!< Specifies the RTC alarm Minute. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x59 */ + + uint32_t u32_Seconds; /*!< Specifies the RTC alarm Seconds. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x59 */ +}RTC_AlarmTypeDef; + + +/** + * @brief RTC Temper structure definition + */ +typedef struct +{ + uint32_t u32_TemperEdge; /*!< Specifies the RTC Temper edge select. */ + + uint32_t u32_InterruptEN; /*!< Specifies the RTC Temper interrupt enable.*/ + + uint32_t u32_ClearBackup; /*!< Specifies the RTC Temper clear backup register. */ + + uint32_t u32_FilterClk; /*!< Specifies the RTC Temper Filter Clock select. */ + + uint32_t u32_Filter; /*!< Specifies the RTC Temper Filter select.*/ + + uint32_t u32_FilterEn; /*!< Specifies the RTC Temper Filter enable.*/ +}RTC_TemperTypeDef; + + +/** + * @brief RTC Wakeup Timer structure definition + */ +typedef struct +{ + uint32_t u32_WuckSel; /*!< The RTC WUCKSEL Value to be configured. + This parameter can be a value of @ref WUCKSEL_1Hz */ + + uint32_t u32_InterruptEN; /*!< Specifies the RTC Temper interrupt enable. + This parameter can be a value of @ref RTC_WUTIMER Interrupt */ + uint32_t WakeUpCounter; + +}RTC_WUTimerTypeDef; + +/** + * @brief RTC Temper index definition + */ +typedef enum +{ + RTC_TEMPER_1, + RTC_TEMPER_2, +}RTC_Temper_t; + +/** @defgroup RTC write enable command + * @{ + */ +#define RTC_WRITE_PROTECT_DISABLE (0xCA53CA53) +#define RTC_WRITE_PROTECT_ENABLE (0x00000000) + +/** @defgroup ClockSource + * @{ + */ +#define RTC_CLOCK_RC32K (0x00000000) +#define RTC_CLOCK_XTL (0x00000004) +#define IS_RTC_CLOCKSRC(__CLOCKSRC__) (((__CLOCKSRC__) == RTC_CLOCK_RC32K) || \ + ((__CLOCKSRC__) == RTC_CLOCK_XTL)) + +/** @defgroup Clock Compensation + * @{ + */ +#define COMPENSATION_INCREASE (0x00000000) +#define COMPENSATION_DECREASE (0x00000200) +#define IS_RTC_COMPENSATION(__COMPENSATION__) (((__COMPENSATION__) == COMPENSATION_INCREASE) || \ + ((__COMPENSATION__) == COMPENSATION_DECREASE)) + +/** @defgroup Clock Compensation Value + * @{ + */ +#define IS_RTC_COMPENSATION_VALUE(__VALUE__) ((__VALUE__) <= 0x1ff) + +/** @defgroup RTC Date Definitions + * @{ + */ +#define RTC_MONTH_JANUARY (0x01) +#define RTC_MONTH_FEBRUARY (0x02) +#define RTC_MONTH_MARCH (0x03) +#define RTC_MONTH_APRIL (0x04) +#define RTC_MONTH_MAY (0x05) +#define RTC_MONTH_JUNE (0x06) +#define RTC_MONTH_JULY (0x07) +#define RTC_MONTH_AUGUST (0x08) +#define RTC_MONTH_SEPTEMBER (0x09) +#define RTC_MONTH_OCTOBER (0x10) +#define RTC_MONTH_NOVEMBER (0x11) +#define RTC_MONTH_DECEMBER (0x12) + +#define RTC_WEEKDAY_MONDAY (0x01) +#define RTC_WEEKDAY_TUESDAY (0x02) +#define RTC_WEEKDAY_WEDNESDAY (0x03) +#define RTC_WEEKDAY_THURSDAY (0x04) +#define RTC_WEEKDAY_FRIDAY (0x05) +#define RTC_WEEKDAY_SATURDAY (0x06) +#define RTC_WEEKDAY_SUNDAY (0x07) + +#define IS_RTC_YEAR(YEAR) (((YEAR) >= 0x00) && ((YEAR) <= 0x99)) +#define IS_RTC_MONTH(MONTH) (((MONTH) > 0x00) && ((MONTH) <= 0x12)) +#define IS_RTC_DAY(DAY) (((DAY) > 0x00) && ((DAY) <= 0x31)) +#define IS_RTC_WEEKDAY(WEEKDAY) (((WEEKDAY) > 0x00) && ((WEEKDAY) <= 0x07)) + + +/** @defgroup RTC_AlarmInterrupt Definitions + * @{ + */ +#define RTC_ALARM_INT_ENABLE (0x00000000) +#define RTC_ALARM_INT_DISABLE (0x00000001) +#define IS_RTC_ALARM_INT(__INT__) (((__INT__) == RTC_ALARM_INT_ENABLE) || \ + ((__INT__) == RTC_ALARM_INT_DISABLE)) + + +/** @defgroup RTC_DayMask Definitions + * @{ + */ +#define RTC_ALARM_DAY_MASK_ENABLE RTC_CR_ALM_MSKD +#define RTC_ALARM_DAY_MASK_DISABLE (0x00000000) +#define IS_RTC_ALARM_DAY_MASK(__MASKD__) (((__MASKD__) == RTC_ALARM_DAY_MASK_ENABLE) || \ + ((__MASKD__) == RTC_ALARM_DAY_MASK_DISABLE)) + + +/** @defgroup RTC_HourMask Definitions + * @{ + */ +#define RTC_ALARM_HOUR_MASK_ENABLE RTC_CR_ALM_MSKH +#define RTC_ALARM_HOUR_MASK_DISABLE (0x00000000) +#define IS_RTC_ALARM_HOUR_MASK(__MASKH__) (((__MASKH__) == RTC_ALARM_HOUR_MASK_ENABLE) || \ + ((__MASKH__) == RTC_ALARM_HOUR_MASK_DISABLE)) + +/** @defgroup RTC_MinMask Definitions + * @{ + */ +#define RTC_ALARM_MIN_MASK_ENABLE RTC_CR_ALM_MSKM +#define RTC_ALARM_MIN_MASK_DISABLE (0x00000000) +#define IS_RTC_ALARM_MIN_MASK(__MASKM__) (((__MASKM__) == RTC_ALARM_MIN_MASK_ENABLE) || \ + ((__MASKM__) == RTC_ALARM_MIN_MASK_DISABLE)) + + +/** @defgroup RTC_Alarm_WeekSelect Definitions + * @{ + */ +#define RTC_ALARM_WEEK_SUNDAY (0x01000000) +#define RTC_ALARM_WEEK_MONDAY (0x02000000) +#define RTC_ALARM_WEEK_TUESDAY (0x04000000) +#define RTC_ALARM_WEEK_WEDNESDAY (0x08000000) +#define RTC_ALARM_WEEK_THURSDAY (0x10000000) +#define RTC_ALARM_WEEK_FRIDAY (0x20000000) +#define RTC_ALARM_WEEK_SATURDAY (0x40000000) +#define IS_RTC_ALARM_WEEKDAY(__WEEKDAY__) (((__WEEKDAY__) == RTC_ALARM_WEEK_SUNDAY) || \ + ((__WEEKDAY__) == RTC_ALARM_WEEK_MONDAY) || \ + ((__WEEKDAY__) == RTC_ALARM_WEEK_TUESDAY) || \ + ((__WEEKDAY__) == RTC_ALARM_WEEK_WEDNESDAY) || \ + ((__WEEKDAY__) == RTC_ALARM_WEEK_THURSDAY) || \ + ((__WEEKDAY__) == RTC_ALARM_WEEK_FRIDAY) || \ + ((__WEEKDAY__) == RTC_ALARM_WEEK_SATURDAY) || \ + ((__WEEKDAY__) >= 0x01000000 && (__WEEKDAY__) <= 0x7F000000)) + +/** @defgroup RTC_Temper_edge Definitions + * @{ + */ +#define RTC_TEMP_EDGE_RISING (0x00000000) +#define RTC_TEMP_EDGE_FALLING (0x00000001) +#define IS_RTC_TEMP_EDGE(__EDGE__) (((__EDGE__) == RTC_TEMP_EDGE_RISING) || \ + ((__EDGE__) == RTC_TEMP_EDGE_FALLING)) + + + +/** @defgroup RTC_TemperInterrupt Definitions + * @{ + */ +#define RTC_TEMP_INT_DISABLE (0x00000000) +#define RTC_TEMP_INT_ENABLE (0x00000001) +#define IS_RTC_TEMP_INT(__INT__) (((__INT__) == RTC_TEMP_INT_ENABLE) || \ + ((__INT__) == RTC_TEMP_INT_DISABLE)) + + + +/** @defgroup RTC_ClearBackup Definitions + * @{ + */ +#define RTC_TEMP_CLEAR_DISABLE (0x00000000) +#define RTC_TEMP_CLEAR_ENABLE (0x00000001) +#define IS_RTC_TEMP_CLEAR_BACKUP(__CLEAR__) (((__CLEAR__) == RTC_TEMP_CLEAR_DISABLE) || \ + ((__CLEAR__) == RTC_TEMP_CLEAR_ENABLE)) + + + +/** @defgroup RTC_TemperFilter Clock Definitions + * @{ + */ +#define RTC_TEMP_FILTER_RTCCLK (0x00000000) +#define RTC_TEMP_FILTER_512_RTCCLK (RTC_CR_TAMPFLTCLK) +#define IS_RTC_TEMP_FILTER_CLK(__CLK__) (((__CLK__) == RTC_TEMP_FILTER_RTCCLK) || \ + ((__CLK__) == RTC_TEMP_FILTER_512_RTCCLK)) +/** @defgroup RTC_TemperFilter Definitions + * @{ + */ +#define RTC_TEMP_FILTER_1_RTCCLK (0x00000000) +#define RTC_TEMP_FILTER_2_RTCCLK (0x00000001) +#define RTC_TEMP_FILTER_4_RTCCLK (0x00000002) +#define RTC_TEMP_FILTER_8_RTCCLK (0x00000003) +#define IS_RTC_TEMP_FILTER(__FILTER__) (((__FILTER__) == RTC_TEMP_FILTER_1_RTCCLK) || \ + ((__FILTER__) == RTC_TEMP_FILTER_2_RTCCLK) || \ + ((__FILTER__) == RTC_TEMP_FILTER_4_RTCCLK) || \ + ((__FILTER__) == RTC_TEMP_FILTER_8_RTCCLK)) +/** @defgroup Alarm clock week/day selection + + * @{ + */ +#define RTC_ALM_ALM_WDS_DAY (0x80000000) +#define RTC_ALM_ALM_WDS_WEEK (0x00000000) +#define IS_RTC_ALARM_MODE(__MODE__) (((__MODE__) == RTC_ALM_ALM_WDS_WEEK) ||\ + ((__MODE__) == RTC_ALM_ALM_WDS_DAY)) + +/** @defgroup RTC Time Definitions + * @{ + */ +#define IS_RTC_HOUR(HOUR) (((HOUR) >= 0) && ((HOUR) <= 0x23)) +#define IS_RTC_MINUTES(MINUTES) (((MINUTES) >= 0) && ((MINUTES) <= 0x59)) +#define IS_RTC_SECONDS(SECONDS) (((SECONDS) >= 0) && ((SECONDS) <= 0x59)) + + +/** @defgroup RTC_Backup_Registers_Definitions +* @{ +*/ +#define RTC_BKP_DR0 (0) +#define RTC_BKP_DR1 (1) +#define RTC_BKP_DR2 (2) +#define RTC_BKP_DR3 (3) +#define RTC_BKP_DR4 (4) +#define RTC_BKP_DR5 (5) +#define RTC_BKP_DR6 (6) +#define RTC_BKP_DR7 (7) +#define RTC_BKP_DR8 (8) +#define RTC_BKP_DR9 (9) +#define RTC_BKP_DR10 (10) +#define RTC_BKP_DR11 (11) +#define RTC_BKP_DR12 (12) +#define RTC_BKP_DR13 (13) +#define RTC_BKP_DR14 (14) +#define RTC_BKP_DR15 (15) +#define IS_RTC_BKP(BKP) (((BKP) == RTC_BKP_DR0) || \ + ((BKP) == RTC_BKP_DR1) || \ + ((BKP) == RTC_BKP_DR2) || \ + ((BKP) == RTC_BKP_DR3) || \ + ((BKP) == RTC_BKP_DR4) || \ + ((BKP) == RTC_BKP_DR5) || \ + ((BKP) == RTC_BKP_DR6) || \ + ((BKP) == RTC_BKP_DR7) || \ + ((BKP) == RTC_BKP_DR8) || \ + ((BKP) == RTC_BKP_DR9) || \ + ((BKP) == RTC_BKP_DR10) || \ + ((BKP) == RTC_BKP_DR11) || \ + ((BKP) == RTC_BKP_DR12) || \ + ((BKP) == RTC_BKP_DR13) || \ + ((BKP) == RTC_BKP_DR14) || \ + ((BKP) == RTC_BKP_DR15)) + + /** @defgroup RTC Wakeup Timer Definitions + * @{ + */ +#define RTC_WAKEUPCLOCK_RTCCLK_DIV16 (0x00000000U) +#define RTC_WAKEUPCLOCK_RTCCLK_DIV8 (0x01000000U) +#define RTC_WAKEUPCLOCK_RTCCLK_DIV4 (0x02000000U) +#define RTC_WAKEUPCLOCK_RTCCLK_DIV2 (0x03000000U) +#define RTC_WAKEUPCLOCK_1HZ (0x04000000U) +#define RTC_WAKEUPCLOCK_0_5HZ (0x05000000U) +#define RTC_WAKEUPCLOCK_2HZ (0x06000000U) +#define IS_RTC_WAKEUP_CLOCK(CLOCK) (((CLOCK) == RTC_WAKEUPCLOCK_RTCCLK_DIV16) || \ + ((CLOCK) == RTC_WAKEUPCLOCK_RTCCLK_DIV8) || \ + ((CLOCK) == RTC_WAKEUPCLOCK_RTCCLK_DIV4) || \ + ((CLOCK) == RTC_WAKEUPCLOCK_RTCCLK_DIV2) || \ + ((CLOCK) == RTC_WAKEUPCLOCK_1HZ) || \ + ((CLOCK) == RTC_WAKEUPCLOCK_0_5HZ) || \ + ((CLOCK) == RTC_WAKEUPCLOCK_2HZ)) +#define IS_RTC_WAKEUP_COUNTER(COUNTER) ((COUNTER) <= 0xFFFF) + + +/** @defgroup RTC Interrupts Definitions + * @{ + */ +#define RTC_IT_FLAG_DATE (0x00000001UL) +#define RTC_IT_FLAG_HOUR (0x00000002UL) +#define RTC_IT_FLAG_MIN (0x00000004UL) +#define RTC_IT_FLAG_SEC (0x00000008UL) +#define RTC_IT_FLAG_2HZ (0x00000010UL) +#define RTC_IT_FLAG_4HZ (0x00000020UL) +#define RTC_IT_FLAG_8HZ (0x00000040UL) +#define RTC_IT_FLAG_16HZ (0x00000080UL) +#define RTC_IT_FLAG_64HZ (0x00000100UL) +#define RTC_IT_FLAG_256HZ (0x00000200UL) +#define RTC_IT_FLAG_1KHZ (0x00000400UL) +#define RTC_IT_FLAG_ALM (0x00000800UL) +#define RTC_IT_FLAG_32S (0x00001000UL) +#define RTC_IT_FLAG_STP1F (0x00002000UL) +#define RTC_IT_FLAG_STP1R (0x00004000UL) +#define RTC_IT_FLAG_STP2F (0x00008000UL) +#define RTC_IT_FLAG_STP2R (0x00010000UL) +#define RTC_IT_FLAG_WUT (0x00020000UL) +#define IS_RTC_IT_FLAG(FLAG) (((FLAG) == RTC_IT_FLAG_DATE) || ((FLAG) == RTC_IT_FLAG_HOUR) || \ + ((FLAG) == RTC_IT_FLAG_MIN)|| ((FLAG) == RTC_IT_FLAG_SEC) || \ + ((FLAG) == RTC_IT_FLAG_2HZ)|| ((FLAG) == RTC_IT_FLAG_4HZ) || \ + ((FLAG) == RTC_IT_FLAG_8HZ)|| ((FLAG) == RTC_IT_FLAG_16HZ) || \ + ((FLAG) == RTC_IT_FLAG_64HZ)|| ((FLAG) == RTC_IT_FLAG_256HZ) || \ + ((FLAG) == RTC_IT_FLAG_1KHZ)|| ((FLAG) == RTC_IT_FLAG_ALM) || \ + ((FLAG) == RTC_IT_FLAG_32S)|| ((FLAG) == RTC_IT_FLAG_STP1F) || \ + ((FLAG) == RTC_IT_FLAG_STP1R)|| ((FLAG) == RTC_IT_FLAG_STP2F) || \ + ((FLAG) == RTC_IT_FLAG_STP2R)|| ((FLAG) == RTC_IT_FLAG_WUT)) +/** + * @} + */ + + + +/* RTC stamp1 interrupt enabledisable */ +#define __HAL_RTC_ENABLE_STAMP1_IT (RTC->IE |= (RTC_IE_STP1RIE | RTC_IE_STP1FIE)) +#define __HAL_RTC_DISABLE_STAMP1_IT (RTC->IE &= ~(RTC_IE_STP1RIE | RTC_IE_STP1FIE)) + +/* RTC stamp2 interrupt enabledisable */ +#define __HAL_RTC_ENABLE_STAMP2_IT (RTC->IE |= (RTC_IE_STP2RIE | RTC_IE_STP2FIE)) +#define __HAL_RTC_DISABLE_STAMP2_IT (RTC->IE &= ~(RTC_IE_STP2RIE | RTC_IE_STP2FIE)) + +/* RTC 32S interrupt enabledisable */ +#define __HAL_RTC_ENABLE_32S_IT (RTC->IE |= RTC_IE_ADJ32_IE) +#define __HAL_RTC_DISABLE_32S_IT (RTC->IE &= ~RTC_IE_ADJ32_IE) + +/* RTC alarm interrupt enabledisable */ +#define __HAL_RTC_ENABLE_ALM_IT (RTC->IE |= RTC_IE_ALM_IE) +#define __HAL_RTC_DISABLE_ALM_IT (RTC->IE &= RTC_IE_ALM_IE) + +/* RTC sec interrupt enabledisable */ +#define __HAL_RTC_ENABLE_SEC_IT (RTC->IE |= RTC_IE_SEC_IE) +#define __HAL_RTC_DISABLE_SEC_IT (RTC->IE &= ~RTC_IE_SEC_IE) + +/* RTC Minute interrupt enabledisable */ +#define __HAL_RTC_ENABLE_MIN_IT (RTC->IE |= RTC_IE_MIN_IE) +#define __HAL_RTC_DISABLE_MIN_IT (RTC->IE &= ~RTC_IE_MIN_IE) + +/* RTC Hour interrupt enabledisable */ +#define __HAL_RTC_ENABLE_HOUR_IT (RTC->IE |= RTC_IE_HOUR_IE) +#define __HAL_RTC_DISABLE_HOUR_IT (RTC->IE &= ~RTC_IE_HOUR_IE) + +/* RTC Date interrupt enabledisable */ +#define __HAL_RTC_ENABLE_DATE_IT (RTC->IE |= RTC_IE_DATE_IE) +#define __HAL_RTC_DISABLE_DATE_IT (RTC->IE &= ~RTC_IE_DATE_IE) + +/* RTC Timer Wakeup interrupt enabledisable */ +#define __HAL_RTC_ENABLE_WUTIE_IT (RTC->IE |= RTC_IE_WUTIE) +#define __HAL_RTC_DISABLE_WUTIE_IT (RTC->IE &= ~RTC_IE_WUTIE) + + +HAL_StatusTypeDef HAL_RTC_Config(RTC_ConfigTypeDef *hrtc); + +void HAL_RTC_SetTime(RTC_TimeTypeDef *fp_Time); + +void HAL_RTC_GetTime(RTC_TimeTypeDef *fp_Time); + +void HAL_RTC_SetDate(RTC_DateTypeDef *fp_Date); + +void HAL_RTC_GetDate(RTC_DateTypeDef *fp_Date); + +void HAL_RTC_AlarmConfig(RTC_AlarmTypeDef *fp_Alarm); + +void HAL_RTC_AlarmEnable(void); + +void HAL_RTC_AlarmDisable(void); + +void HAL_RTC_Tamper(RTC_Temper_t fe_Temper, RTC_TemperTypeDef *fp_Temper); + +void HAL_RTC_TamperEnable(RTC_Temper_t fe_Temper); + +void HAL_RTC_TamperDisable(RTC_Temper_t fe_Temper); + +void HAL_RTC_SetWakeUpTimer(RTC_WUTimerTypeDef *hrtc); + +void HAL_RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data); + +uint32_t HAL_RTC_ReadBackupRegister(uint32_t RTC_BKP_DR); + +void HAL_RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState); + +FlagStatus HAL_RTC_GetFlagStatus(uint32_t RTC_FLAG); + +void HAL_RTC_ClearFlag(uint32_t RTC_FLAG); + +ITStatus HAL_RTC_GetITStatus(uint32_t RTC_IT); + +void HAL_RTC_ClearITPendingBit(uint32_t RTC_IT); + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_sdmmc.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_sdmmc.h new file mode 100644 index 0000000000..3d3ce857a2 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_sdmmc.h @@ -0,0 +1,400 @@ +/* + ****************************************************************************** + * @file HAL_SDMMC.h + * @version V1.0.0 + * @date 2020 + * @brief Header file of SDMMC HAL module. + ****************************************************************************** +*/ +#ifndef __HAL_SDMMC_H__ +#define __HAL_SDMMC_H__ + +#include "hal.h" + + +//#define SDMMC_INT_MODE + + +/******************************************************************************/ +/* Peripheral Registers Bits Definition */ +/******************************************************************************/ + +#define FCLK 220 + + +#define SDMMC_CH0 0 +#define SDMMC_CH1 1 + +#define EMMC_CARD 0 +#define SD_CARD 1 + +#define SDMMC_IDMA_DESC_NUM 16 + +//refer register RCC_PERCFGR +#define SDMMC_CLK_SRC_SYS_CLK (0<<11) //select SYS_CLK as SDIO source clock +#define SDMMC_CLK_SRC_PLL2_P_CLK (1<<11) //select PLL2_P_CLK as SDIO source clock +#define SDMMC_CLK_SRC_MSK (1<<11) +#define SDMMC_CLK_SRC SDMMC_CLK_SRC_SYS_CLK + +//refer register RCC_PERCFGR +#define SDMMC_SAMPLE_CLK_DELAY_BLK 0 //DLYB enable +#define SDMMC_SAMPLE_CLK_C1_FEEDBACK 1 //card1 feedback clock +#define SDMMC_SAMPLE_CLK_C2_FEEDBACK 2 //card2 feedback clock +#define SDMMC_SAMPLE_CLK_SDIO 3 //bypass DLYB + + +#define SDMMC_BUS_CLK_FREQ ((FCLK/8)*1000000) + + +#define SDMMC_CLK_SRC_DIV0 0 //clk src from DIV0 +#define SDMMC_CLK_SRC_DIV1 1 //clk src from DIV1 +#define SDMMC_CLK_SRC_DIV2 2 //clk src from DIV2 +#define SDMMC_CLK_SRC_DIV3 3 //clk src from DIV3 + +#define SDMMC_POWER_ON(x) (1<STATUS = (FLAG) + +#define __SPI_RXFIFO_RESET(SPIx) do{ \ + SET_BIT((SPIx)->RX_CTL, SPI_RX_CTL_FIFO_RESET); \ + CLEAR_BIT((SPIx)->RX_CTL, SPI_RX_CTL_FIFO_RESET); \ +}while(0); + +#define __SPI_TXFIFO_RESET(SPIx) do{ \ + SET_BIT((SPIx)->TX_CTL, SPI_TX_CTL_FIFO_RESET); \ + CLEAR_BIT((SPIx)->TX_CTL, SPI_TX_CTL_FIFO_RESET); \ +}while(0); + + +#define __HAL_SPI_TRANSSTART_CS_LOW(hspi) (hspi)->Instance->CS |= (hspi)->CSx +#define __HAL_SPI_CS_RELEASE(hspi) (hspi)->Instance->CS &= ~((hspi)->CSx) + +#define __SPI_MEMACC_ENABLE(SPIx) (SPIx)->MEMO_ACC.acc_en = 1 +#define __SPI_MEMACC_DISABLE(SPIx) (SPIx)->MEMO_ACC.acc_en = 0 + +#define __SPI_MEMACC_INSTRONCE_CLEAR(SPIx) (SPIx)->MEMO_ACC.instr_once_clr = 1 + +/** + * @brief SPI handle Structure definition + */ +typedef struct +{ + SPI_TypeDef *Instance; /* SPI registers base address */ + + SPI_InitTypeDef Init; /* SPI communication parameters */ + + uint8_t CSx; + + volatile uint32_t RxState; /* SPI state machine */ + volatile uint32_t TxState; /* SPI state machine */ + + uint8_t *Rx_Buffer; /* SPI Rx Buffer */ + uint8_t *Tx_Buffer; /* SPI Tx Buffer */ + + uint32_t Rx_Size; /* SPI Rx Size */ + uint32_t Tx_Size; /* SPI Tx Size */ + + uint32_t Rx_Count; /* SPI RX Count */ + uint32_t Tx_Count; /* SPI TX Count */ + + bool KeepCS; /* whether CS need kept at the end of transfer in IT mode. true for keeping */ +#ifdef HAL_DMA_MODULE_ENABLED + DMA_HandleTypeDef *HDMA_Rx; /* SPI Rx DMA handle parameters */ + DMA_HandleTypeDef *HDMA_Tx; /* SPI Tx DMA handle parameters */ +#endif +}SPI_HandleTypeDef; + + +void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi); + +void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi); +void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi); + +HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi); +HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi); + +HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout); + +HAL_StatusTypeDef HAL_SPI_TransmitKeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_SPI_ReceiveKeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout); + +HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size); +HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size); + +HAL_StatusTypeDef HAL_SPI_Transmit_IT_KeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size); +HAL_StatusTypeDef HAL_SPI_Receive_IT_KeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size); + +#ifdef HAL_DMA_MODULE_ENABLED +HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size); +HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size); +#endif + +HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint32_t Size, uint32_t Timeout); + +HAL_StatusTypeDef HAL_SPI_Wire_Config(SPI_HandleTypeDef *hspi, uint32_t X_Mode); + +uint8_t HAL_SPI_GetTxState(SPI_HandleTypeDef *hspi); +uint8_t HAL_SPI_GetRxState(SPI_HandleTypeDef *hspi); + +HAL_StatusTypeDef HAL_SPI_WaitTxTimeout(SPI_HandleTypeDef *hspi, uint32_t timeout); +HAL_StatusTypeDef HAL_SPI_WaitRxTimeout(SPI_HandleTypeDef *hspi, uint32_t timeout); +HAL_StatusTypeDef HAL_SPI_Switch_CS(SPI_HandleTypeDef *hspi, uint8_t CSx); + +HAL_StatusTypeDef HAL_SPI_MEMACCInit(SPI_HandleTypeDef* hspi, SPI_MemACCInitTypeDef* MemACCParam); + +HAL_StatusTypeDef HAL_SPI_TransmitNoneBatch(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_SPI_TransmitNoneBatchKeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout); + +HAL_StatusTypeDef HAL_SPI_ReceiveNoneBatch(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_SPI_ReceiveNoneBatchKeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout); +#endif + + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_timer.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_timer.h new file mode 100644 index 0000000000..1325f5f725 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_timer.h @@ -0,0 +1,694 @@ +/*********************************************************************** + * Filename : hal_timer.h + * Description : timer driver header file + * Author(s) : Eric + * version : V1.0 + * Modify date : 2016-03-24 + ***********************************************************************/ +#ifndef __HAL_TIMER_H__ +#define __HAL_TIMER_H__ + +#include "hal.h" + + +/****************** TIM Instances : supporting the break function *************/ +#define IS_TIM_BREAK_INSTANCE(INSTANCE) ( ((INSTANCE) == TIM1) || \ + ((INSTANCE) == TIM8) || \ + ((INSTANCE) == TIM15) || \ + ((INSTANCE) == TIM16) || \ + ((INSTANCE) == TIM17) || \ + ((INSTANCE) == TIM18) || \ + ((INSTANCE) == TIM19) || \ + ((INSTANCE) == TIM20) || \ + ((INSTANCE) == TIM25) \ + ) + +#define IS_TIM_BREAKSOURCE_INSTANCE ( ((INSTANCE) == TIM1) || \ + ((INSTANCE) == TIM8) || \ + ((INSTANCE) == TIM15) || \ + ((INSTANCE) == TIM16) || \ + ((INSTANCE) == TIM17) || \ + ((INSTANCE) == TIM18) || \ + ((INSTANCE) == TIM19) || \ + ((INSTANCE) == TIM20) || \ + ((INSTANCE) == TIM25) \ + ) + +/************** TIM Instances : supporting Break source selection *************/ + + + +/************* TIM Instances : at least 1 capture/compare channel *************/ +#define IS_TIM_CC1_INSTANCE(INSTANCE) ( ((INSTANCE) != TIM6) && \ + ((INSTANCE) != TIM7) && \ + ((INSTANCE) != TIM21) && \ + ((INSTANCE) != TIM22) ) + +/************ TIM Instances : at least 2 capture/compare channels *************/ +#define IS_TIM_CC2_INSTANCE(INSTANCE) (((INSTANCE) == TIM1) || \ + ((INSTANCE) == TIM2) || \ + ((INSTANCE) == TIM3) || \ + ((INSTANCE) == TIM4) || \ + ((INSTANCE) == TIM5) || \ + ((INSTANCE) == TIM8) || \ + ((INSTANCE) == TIM9) || \ + ((INSTANCE) == TIM12) || \ + ((INSTANCE) == TIM15) || \ + ((INSTANCE) == TIM20) || \ + ((INSTANCE) == TIM23) || \ + ((INSTANCE) == TIM24) || \ + ((INSTANCE) == TIM25) ) + + +/************ TIM Instances : at least 3 capture/compare channels *************/ +#define IS_TIM_CC3_INSTANCE(INSTANCE) (((INSTANCE) == TIM1) || \ + ((INSTANCE) == TIM2) || \ + ((INSTANCE) == TIM3) || \ + ((INSTANCE) == TIM4) || \ + ((INSTANCE) == TIM5) || \ + ((INSTANCE) == TIM8) || \ + ((INSTANCE) == TIM20) || \ + ((INSTANCE) == TIM23) || \ + ((INSTANCE) == TIM24) ) + +/************ TIM Instances : at least 4 capture/compare channels *************/ +#define IS_TIM_CC4_INSTANCE(INSTANCE) (((INSTANCE) == TIM1) || \ + ((INSTANCE) == TIM2) || \ + ((INSTANCE) == TIM3) || \ + ((INSTANCE) == TIM4) || \ + ((INSTANCE) == TIM5) || \ + ((INSTANCE) == TIM8) || \ + ((INSTANCE) == TIM20) || \ + ((INSTANCE) == TIM23) || \ + ((INSTANCE) == TIM24) ) + + + +/*********** TIM Instances : Slave mode available (TIMx_SMCR available )*******/ +#define IS_TIM_SLAVE_INSTANCE(INSTANCE) ( ((INSTANCE) != TIM6) && \ + ((INSTANCE) != TIM7) && \ + ((INSTANCE) != TIM21) && \ + ((INSTANCE) != TIM22) ) + +/****************** TIM Instances : supporting complementary output(s) ********/ +#define IS_TIM_CCXN_INSTANCE(INSTANCE, CHANNEL) \ + ((( (INSTANCE) == TIM1) && \ + (((CHANNEL) == TIM_CHANNEL_1) || \ + ((CHANNEL) == TIM_CHANNEL_2) || \ + ((CHANNEL) == TIM_CHANNEL_3) || \ + ((CHANNEL) == TIM_CHANNEL_4)) ) \ + || \ + (((INSTANCE) == TIM8) && \ + (((CHANNEL) == TIM_CHANNEL_1) || \ + ((CHANNEL) == TIM_CHANNEL_2) || \ + ((CHANNEL) == TIM_CHANNEL_3) || \ + ((CHANNEL) == TIM_CHANNEL_4)) ) \ + || \ + (((INSTANCE) == TIM20) && \ + (((CHANNEL) == TIM_CHANNEL_1) || \ + ((CHANNEL) == TIM_CHANNEL_2) || \ + ((CHANNEL) == TIM_CHANNEL_3) || \ + ((CHANNEL) == TIM_CHANNEL_4)) ) \ + || \ + (((INSTANCE) == TIM15) && \ + ((CHANNEL) == TIM_CHANNEL_1)) \ + || \ + (((INSTANCE) == TIM16) && \ + ((CHANNEL) == TIM_CHANNEL_1)) \ + || \ + (((INSTANCE) == TIM17) && \ + ((CHANNEL) == TIM_CHANNEL_1)) \ + || \ + (((INSTANCE) == TIM18) && \ + ((CHANNEL) == TIM_CHANNEL_1)) \ + || \ + (((INSTANCE) == TIM19) && \ + ((CHANNEL) == TIM_CHANNEL_1)) \ + || \ + (((INSTANCE) == TIM25) && \ + ((CHANNEL) == TIM_CHANNEL_1) ) ) + + + +/****** TIM Instances : supporting external clock mode 1 for ETRF input *******/ +#define IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(INSTANCE) (((INSTANCE) == TIM1) || \ + ((INSTANCE) == TIM8) || \ + ((INSTANCE) == TIM2) || \ + ((INSTANCE) == TIM3) || \ + ((INSTANCE) == TIM4) ) + +/****** TIM Instances : supporting external clock mode 2 for ETRF input *******/ +#define IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(INSTANCE) (((INSTANCE) == TIM1) || \ + ((INSTANCE) == TIM8) || \ + ((INSTANCE) == TIM2) || \ + ((INSTANCE) == TIM3) || \ + ((INSTANCE) == TIM4) ) + +/****************** TIM Instances : supporting combined 3-phase PWM mode ******/ +#define IS_TIM_COMBINED3PHASEPWM_INSTANCE(INSTANCE) (((INSTANCE) == TIM1) || \ + ((INSTANCE) == TIM8) ) + +/****************** TIM Instances : supporting commutation event generation ***/ +#define IS_TIM_COMMUTATION_EVENT_INSTANCE(INSTANCE) (((INSTANCE) == TIM1) || \ + ((INSTANCE) == TIM8) || \ + ((INSTANCE) == TIM15) || \ + ((INSTANCE) == TIM16) || \ + ((INSTANCE) == TIM17)) + +/****************** TIM Instances : supporting encoder interface **************/ +#define IS_TIM_ENCODER_INTERFACE_INSTANCE(INSTANCE) (((INSTANCE) == TIM1) || \ + ((INSTANCE) == TIM8) || \ + ((INSTANCE) == TIM2) || \ + ((INSTANCE) == TIM3) || \ + ((INSTANCE) == TIM4) ) + +/****************** TIM Instances : supporting Hall sensor interface **********/ +#define IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(INSTANCE) (((INSTANCE) == TIM1) || \ + ((INSTANCE) == TIM8) || \ + ((INSTANCE) == TIM2) || \ + ((INSTANCE) == TIM3) || \ + ((INSTANCE) == TIM4) ) + +/****************** TIM Instances : supporting repetition counter *************/ +#define IS_TIM_REPETITION_COUNTER_INSTANCE(INSTANCE) (((INSTANCE) == TIM1) || \ + ((INSTANCE) == TIM8) || \ + ((INSTANCE) == TIM9) || \ + ((INSTANCE) == TIM10) || \ + ((INSTANCE) == TIM11) || \ + ((INSTANCE) == TIM12) || \ + ((INSTANCE) == TIM13) || \ + ((INSTANCE) == TIM14) || \ + ((INSTANCE) == TIM15) || \ + ((INSTANCE) == TIM16) || \ + ((INSTANCE) == TIM17) || \ + ((INSTANCE) == TIM18) || \ + ((INSTANCE) == TIM19) || \ + ((INSTANCE) == TIM20) || \ + ((INSTANCE) == TIM25) ) + +/****************** TIM Instances : supporting repetition counter *************/ +#define IS_TIM_32_BITS_INSTANCE(INSTANCE) (((INSTANCE) == TIM2) || \ + ((INSTANCE) == TIM5) || \ + ((INSTANCE) == TIM23) || \ + ((INSTANCE) == TIM24) ) + + +/****************** TIM Instances : supporting ADC triggering through TRGO2 ***/ +#define IS_TIM_TRGO2_INSTANCE(INSTANCE) (((INSTANCE) == TIM1) || \ + ((INSTANCE) == TIM8)) + + +#define HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__)) +#define HAL_TIM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER &= ~(__INTERRUPT__)) + +#define HAL_TIM_ENABLE_IT_EX(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->DIER |= (__INTERRUPT__)) +#define HAL_TIM_DISABLE_IT_EX(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->DIER &= ~(__INTERRUPT__)) + +#define HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA_REQ__) ((__HANDLE__)->Instance->DIER |= (__DMA_REQ__)) +#define HAL_TIM_DISABLE_DMA(__HANDLE__, __DMA_REQ__) ((__HANDLE__)->Instance->DIER &= ~(__DMA_REQ__)) + +#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__)) +#define __HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) + +#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) + +#define TIM_CR2_CCPC_Pos (0U) +#define TIM_CR2_CCPC_Msk (0x1UL << TIM_CR2_CCPC_Pos) +#define TIM_CR2_CCPC TIM_CR2_CCPC_Msk +#define TIM_CR2_CCUS_Pos (2U) +#define TIM_CR2_CCUS_Msk (0x1UL << TIM_CR2_CCUS_Pos) +#define TIM_CR2_CCUS TIM_CR2_CCUS_Msk +#define TIM_CR2_CCDS_Pos (3U) +#define TIM_CR2_CCDS_Msk (0x1UL << TIM_CR2_CCDS_Pos) +#define TIM_CR2_CCDS TIM_CR2_CCDS_Msk + +#define TIM_COMMUTATION_TRGI TIM_CR2_CCUS +#define TIM_COMMUTATION_SOFTWARE 0x00000000U + +#define TIM_IT_UPDATE BIT0 +#define TIM_IT_CC1 BIT1 +#define TIM_IT_CC2 BIT2 +#define TIM_IT_CC3 BIT3 +#define TIM_IT_CC4 BIT4 +#define TIM_IT_COM BIT5 +#define TIM_IT_TRIGGER BIT6 +#define TIM_IT_BREAK BIT7 + +#define TIM_DMA_UPDATE BIT8 +#define TIM_DMA_CC1 BIT9 +#define TIM_DMA_CC2 BIT10 +#define TIM_DMA_CC3 BIT11 +#define TIM_DMA_CC4 BIT12 +#define TIM_DMA_COM BIT13 +#define TIM_DMA_TRIGGER BIT14 +#define TIM_DMA_BREAK BIT15 + + + +#define TIM_EVENTSOURCE_UPDATE BIT0 /*!< Reinitialize the counter and generates an update of the registers */ +#define TIM_EVENTSOURCE_CC1 BIT1 /*!< A capture/compare event is generated on channel 1 */ +#define TIM_EVENTSOURCE_CC2 BIT2 /*!< A capture/compare event is generated on channel 2 */ +#define TIM_EVENTSOURCE_CC3 BIT3 /*!< A capture/compare event is generated on channel 3 */ +#define TIM_EVENTSOURCE_CC4 BIT4 /*!< A capture/compare event is generated on channel 4 */ +#define TIM_EVENTSOURCE_COM BIT5 /*!< A commutation event is generated */ +#define TIM_EVENTSOURCE_TRIGGER BIT6 /*!< A trigger event is generated */ +#define TIM_EVENTSOURCE_BREAK BIT7 /*!< A break event is generated */ + +#define TIM_ARR_PRELOAD_DISABLE 0 +#define TIM_ARR_PRELOAD_ENABLE 1 + +#define TIM_COUNTERMODE_DIR_INDEX 4 +#define TIM_COUNTERMODE_UP (0 << TIM_COUNTERMODE_DIR_INDEX) +#define TIM_COUNTERMODE_DOWN (1 << TIM_COUNTERMODE_DIR_INDEX) + +#define TIM_COUNTERMODE_CMS_INDEX 5 +#define TIM_COUNTERMODE_CENTERALIGNED1 (1 << TIM_COUNTERMODE_CMS_INDEX) +#define TIM_COUNTERMODE_CENTERALIGNED2 (2 << TIM_COUNTERMODE_CMS_INDEX) +#define TIM_COUNTERMODE_CENTERALIGNED3 (3 << TIM_COUNTERMODE_CMS_INDEX) + +#define TIM_CLKCK_DIV_INDEX 8 +#define TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< Clock division: tDTS=tCK_INT */ +#define TIM_CLOCKDIVISION_DIV2 (1U << TIM_CLKCK_DIV_INDEX) /*!< Clock division: tDTS=2*tCK_INT */ +#define TIM_CLOCKDIVISION_DIV4 (2U << TIM_CLKCK_DIV_INDEX) /*!< Clock division: tDTS=4*tCK_INT */ + +/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection + * @{ + */ +#define TIM_TRGO_RESET (0U << 4) +#define TIM_TRGO_ENABLE (1U << 4) +#define TIM_TRGO_UPDATE (2U << 4) +#define TIM_TRGO_CMP_PULSE (3U << 4) +#define TIM_TRGO_OC1REF (4U << 4) +#define TIM_TRGO_OC2REF (5U << 4) +#define TIM_TRGO_OC3REF (6U << 4) +#define TIM_TRGO_OC4REF (7U << 4) +/** + * @} + */ + +/** @defgroup TIM_Master_Mode_Selection_2 TIM Master Mode Selection 2 (TRGO2) + * @{ + */ +#define TIM_TRGO2_RESET (0U << 20) +#define TIM_TRGO2_ENABLE (1U << 20) +#define TIM_TRGO2_UPDATE (2U << 20) +#define TIM_TRGO2_CMP_PULSE (3U << 20) +#define TIM_TRGO2_OC1REF (4U << 20) +#define TIM_TRGO2_OC2REF (5U << 20) +#define TIM_TRGO2_OC3REF (6U << 20) +#define TIM_TRGO2_OC4REF (7U << 20) +#define TIM_TRGO2_OC5REF (8U << 20) +#define TIM_TRGO2_OC6REF (9U << 20) +#define TIM_TRGO2_OC4REF_RISINGFALLING (10U << 20) +#define TIM_TRGO2_OC6REF_RISINGFALLING (11U << 20) +#define TIM_TRGO2_OC4REF_RISING_OC6REF_RISING (12U << 20) +#define TIM_TRGO2_OC4REF_RISING_OC6REF_FALLING (13U << 20) +#define TIM_TRGO2_OC5REF_RISING_OC6REF_RISING (14U << 20) +#define TIM_TRGO2_OC5REF_RISING_OC6REF_FALLING (15U << 20) +/** + * @} + */ + +#define TIM_MASTERSLAVEMODE_DISABLE 0 +#define TIM_MASTERSLAVEMODE_ENABLE BIT7 + + +#define TIM_SLAVE_MODE_INDEX 0 +#define TIM_SLAVE_MODE_DIS (0U << TIM_SLAVE_MODE_INDEX) +#define TIM_SLAVE_MODE_ENC1 (1U << TIM_SLAVE_MODE_INDEX) +#define TIM_SLAVE_MODE_ENC2 (2U << TIM_SLAVE_MODE_INDEX) +#define TIM_SLAVE_MODE_ENC3 (3U << TIM_SLAVE_MODE_INDEX) +#define TIM_SLAVE_MODE_RST (4U << TIM_SLAVE_MODE_INDEX) +#define TIM_SLAVE_MODE_GATE (5U << TIM_SLAVE_MODE_INDEX) +#define TIM_SLAVE_MODE_TRIG (6U << TIM_SLAVE_MODE_INDEX) +#define TIM_SLAVE_MODE_EXT1 (7U << TIM_SLAVE_MODE_INDEX) + +#define TIM_SMCR_OCCS_Pos (3U) +#define TIM_SMCR_OCCS_Msk (0x1UL << TIM_SMCR_OCCS_Pos) /*!< 0x00000008 */ +#define TIM_SMCR_OCCS TIM_SMCR_OCCS_Msk /*!< OCREF clear selection */ + +#define TIM_SMCR_TS_Pos (4U) +#define TIM_SMCR_TS_Msk (0x30007UL << TIM_SMCR_TS_Pos) /*!< 0x00300070 */ +#define TIM_SMCR_TS TIM_SMCR_TS_Msk /*!Instance->CR1 |= UART_CR1_UARTEN) +/** + * @} + */ + +/** @brief Disable UART + * @param __HANDLE__ specifies the UART Handle. + * @retval None + */ +#define __HAL_UART_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~UART_CR1_UARTEN) +/** + * @} + */ + + +#define CLEAR_STATUS(reg, flag) WRITE_REG(reg, flag) + + +#define __HAL_UART_TXI_FIFO_LEVEL_SET(uartx, fifo_level) MODIFY_REG(uartx->CR3, UART_CR3_TXIFLSEL_Msk, fifo_level); + +#define __HAL_UART_RXI_FIFO_LEVEL_SET(uartx, fifo_level) MODIFY_REG(uartx->CR3, UART_CR3_RXIFLSEL_Msk, fifo_level); + + +/** @brief Resume receiving data in IT mode. + * @param __HANDLE__ specifies the UART Handle. + * @retval None + * @note This macro is currently only used in idle call back function @HAL_UART_IdleCallback. +*/ +#define __HAL_UART_Resume_Receive_IT(__HANDLE__) do {\ + (__HANDLE__)->RxBusy = true; \ + (__HANDLE__)->Instance->IE |= UART_IE_OEI | UART_IE_BEI | UART_IE_PEI | UART_IE_FEI | UART_IE_RXI | UART_IE_IDLEI;\ +}while(0); +/** + * @} + */ + + +/** @brief Clear data in UART FIFO. + * @param __HANDLE__ specifies the UART Handle. + * @retval None + * @note __HAL_UART_FIFO_FLUSH will keep the UART FIFO in enabled state. +*/ +#define __HAL_UART_FIFO_FLUSH(__HANDLE__) do{\ + CLEAR_BIT((__HANDLE__)->Instance->CR3, UART_CR3_FEN); \ + SET_BIT((__HANDLE__)->Instance->CR3, UART_CR3_FEN); \ +}while(0); +/** + * @} + */ + +void HAL_UART_IRQHandler(UART_HandleTypeDef *huart); + +void HAL_UART_MspInit(UART_HandleTypeDef *huart); + +HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart); + +HAL_StatusTypeDef HAL_UART_RS485_Init(UART_HandleTypeDef *huart, UART_RS485_DE_POL_Enum de_polarity, uint8_t deat_time, uint8_t dedt_time); + +HAL_StatusTypeDef HAL_UART_IRDA_Init(UART_HandleTypeDef *huart, bool is_lowpwr); + +HAL_StatusTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart); + +uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart); + +HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size, uint32_t timeout); +HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size, uint32_t timeout); +HAL_StatusTypeDef HAL_UART_Receive_To_IDLEorBCNT(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size, + UART_Receive_Mode_Enum rece_mode, uint32_t timeout); + +HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size); +HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size); + +#ifdef HAL_DMA_MODULE_ENABLED +HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size); +HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size); +HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart); +#endif + +HAL_StatusTypeDef HAL_UART_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t addr, UART_WakeupMode_Enum wakeupMode); +HAL_StatusTypeDef HAL_UART_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart); + +void HAL_UART_SetDebugUart(UART_TypeDef *UARTx); + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_uart_7816m.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_uart_7816m.h new file mode 100644 index 0000000000..c590646ef9 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_uart_7816m.h @@ -0,0 +1,17 @@ +/****************************************************************************** +* @file : hal_uart_7816m.h +* @brief : header file +* @ver : V1.0.0 +* @date : 2020 +******************************************************************************/ +#ifndef __HAL_UART_7816M_H__ +#define __HAL_UART_7816M_H__ + +#include "acm32h5xx_hal_conf.h" + + +HAL_StatusTypeDef HAL_UART_7816M_Init(UART_HandleTypeDef *huart, uint32_t clk_psc, uint32_t guard_time); +HAL_StatusTypeDef HAL_UART_7816M_Receive(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size, uint32_t timeout); +HAL_StatusTypeDef HAL_UART_7816M_Transmit(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size); + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_uart_ex.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_uart_ex.h new file mode 100644 index 0000000000..8c06dcfccd --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_uart_ex.h @@ -0,0 +1,22 @@ +/****************************************************************************** +*@file : hal_uart_ex.h +*@brief : Header file of UART EX HAL module. +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ +#ifndef __HAL_UART_EX_H__ +#define __HAL_UART_EX_H__ + +#include "acm32h5xx_hal_conf.h" + +/**************** Definition of LIN BUS VERSION ***********************/ +#define UART_LIN_V1D3 0 //Lin bus version 1.3 +#define UART_LIN_V2DX 1 //Lin bus version 2.0/2.1/2.2 + +#define HAL_UART_LIN_Init HAL_UART_Init +void HAL_UART_LIN_Master_Transmit(UART_HandleTypeDef *huart, uint8_t Lin_Version, uint8_t Lin_Id, uint8_t *pData, uint8_t Size); +void HAL_UART_LIN_Slave_Transmit(UART_HandleTypeDef *huart, uint8_t Lin_Version, uint8_t Lin_Id, uint8_t *pData, uint8_t Size); +uint8_t HAL_UART_LIN_Master_Receive(UART_HandleTypeDef *huart, uint8_t Lin_Version, uint8_t Lin_Id, uint8_t *pData, uint32_t Timeout); +uint8_t HAL_UART_LIN_Slave_Receive(UART_HandleTypeDef *huart, uint8_t Lin_Version, uint8_t *pData, uint32_t Timeout); + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_usart.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_usart.h new file mode 100644 index 0000000000..20c7ef4c4b --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_usart.h @@ -0,0 +1,353 @@ +/****************************************************************************** +* @file hal_usart.h + +* @brief Header file of USART HAL module. +* @version V1.0.0 +* @date 2020 +******************************************************************************/ +#ifndef __HAL_USART_H__ +#define __HAL_USART_H__ + +#include "acm32h5xx_hal_conf.h" + + +/** @defgroup USARTEx_Word_Length USARTEx Word Length + * @{ + */ +#define USART_WORDLENGTH_5B (0x00000000U) /*!< 5-bit Word Length */ +#define USART_WORDLENGTH_6B (USART_CR3_WLEN_0) /*!< 6-bit Word Length */ +#define USART_WORDLENGTH_7B (USART_CR3_WLEN_1) /*!< 7-bit Word Length */ +#define USART_WORDLENGTH_8B (USART_CR3_WLEN_0 | USART_CR3_WLEN_1) /*!< 8-bit Word Length */ +#define USART_WORDLENGTH_9B (USART_CR3_WLEN_2) /*!< 9-bit Word Length */ +/** + * @} + */ + + +/** @defgroup USART_Parity USART Parity + * @{ + */ +#define USART_PARITY_NONE (0x00000000U) /*!< No parity */ +#define USART_PARITY_EVEN (USART_CR3_PEN | USART_CR3_EPS) /*!< Even parity */ +#define USART_PARITY_ODD (USART_CR3_PEN) /*!< Odd parity */ +#define USART_PARITY_0 (USART_CR3_SPS | USART_CR3_PEN | USART_CR3_EPS) /*!< 0 parity */ +#define USART_PARITY_1 (USART_CR3_SPS | USART_CR3_PEN) /*!< 1 parity */ +/** + * @} + */ + + +/** @defgroup USART_Stop_Bits USART Number of Stop Bits + * @{ + */ +#define USART_STOPBITS_1 (0x00000000U) /*!< USART frame with 1 stop bit */ +#define USART_STOPBITS_2 (USART_CR3_STP2) /*!< USART frame with 2 stop bits */ +/** + * @} + */ + +#if 0 +/** @defgroup USART_Hardware_Flow_Control USART Hardware Flow Control + * @{ + */ +#define USART_HWCONTROL_NONE (0x00000000U) /*!< No hardware control */ +#define USART_HWCONTROL_CTS (0x00008000U) /*!< Clear To Send */ +#define USART_HWCONTROL_RTS (0x00004000U) /*!< Request To Send */ +#define USART_HWCONTROL_CTS_RTS (USART_HWCONTROL_CTS | USART_HWCONTROL_RTS) /*!< Request and Clear To Send */ +/** + * @} + */ +#endif + +/** @defgroup USART_Mode USART Transfer Mode + * @{ + */ +#define USART_MODE_RX (USART_CR1_RXE) /*!< RX mode */ +#define USART_MODE_TX (USART_CR1_TXE) /*!< TX mode */ +#define USART_MODE_TX_RX (USART_CR1_TXE | USART_CR1_RXE) /*!< RX and TX mode */ +/** + * @} + */ + +/** @defgroup USART_Clock USART Clock + * @{ + */ +#define USART_CLOCK_DISABLE (0x00000000U) +#define USART_CLOCK_ENABLE (USART_CR2_CLKEN) /*! 0x00000080 */ +/** + * @} + */ + +/** @defgroup USART_Clock_Polarity USART Clock Polarity + * @{ + */ +#define USART_POLARITY_LOW (0x00000000U) +#define USART_POLARITY_HIGH (USART_CR2_CPOL) /*! 0x00000400 */ +/** + * @} + */ + +/** @defgroup USART_Clock_Phase USART Clock Phase + * @{ + */ +#define USART_PHASE_1EDGE (0x00000000U) +#define USART_PHASE_2EDGE (USART_CR2_CPHA) /*! 0x00000200 */ +/** + * @} + */ + +/** @defgroup USART_Last_Bit USART Last Bit + * @{ + */ +#define USART_LASTBIT_DISABLE (0x00000000U) +#define USART_LASTBIT_ENABLE (USART_CR2_LBCL) /*! 0x00000100 */ +/** + * @} + */ + +/** @defgroup USART_NACK_State USART NACK State + * @{ + */ +#define USART_NACK_ENABLE (USART_CR2_NACK) /*! 0x00000040 */ +#define USART_NACK_DISABLE (0x00000000U) +/** + * @} + */ + +/** @defgroup FIFO interrupt Config + * @{ + */ +#define USART_TX_FIFO_1_16 (USART_CR3_TXIFLSEL_2 | USART_CR3_TXIFLSEL_0) /*!< Transfer 1 Data */ +#define USART_TX_FIFO_1_8 (0x00000000) /*!< Transfer 2 Data */ +#define USART_TX_FIFO_1_4 (USART_CR3_TXIFLSEL_0) /*!< Transfer 4 Data */ +#define USART_TX_FIFO_1_2 (USART_CR3_TXIFLSEL_1) /*!< Transfer 8 Data */ +#define USART_TX_FIFO_3_4 (USART_CR3_TXIFLSEL_1 | USART_CR3_TXIFLSEL_0) /*!< Transfer 12 Data */ +#define USART_TX_FIFO_7_8 (USART_CR3_TXIFLSEL_2) /*!< Transfer 14 Data */ + +#define USART_RX_FIFO_1_16 (USART_CR3_RXIFLSEL_2 | USART_CR3_RXIFLSEL_0) /*!< Receive 1 Data */ +#define USART_RX_FIFO_1_8 (0x00000000) /*!< Receive 2 Data */ +#define USART_RX_FIFO_1_4 (USART_CR3_RXIFLSEL_0) /*!< Receive 4 Data */ +#define USART_RX_FIFO_1_2 (USART_CR3_RXIFLSEL_1) /*!< Receive 8 Data */ +#define USART_RX_FIFO_3_4 (USART_CR3_RXIFLSEL_1 | USART_CR3_RXIFLSEL_0) /*!< Receive 12 Data */ +#define USART_RX_FIFO_7_8 (USART_CR3_RXIFLSEL_2) /*!< Receive 14 Data */ +/** + * @} + */ + +/** @defgroup USART_Error_Code USART Error Code + * @{ + */ +#define HAL_USART_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_USART_ERROR_PE 0x00000001U /*!< Parity error */ +#define HAL_USART_ERROR_NE 0x00000002U /*!< Noise error */ +#define HAL_USART_ERROR_FE 0x00000004U /*!< Frame error */ +#define HAL_USART_ERROR_ORE 0x00000008U /*!< Overrun error */ +#define HAL_USART_ERROR_DMA 0x00000010U /*!< DMA transfer error */ +/** + * @} + */ + + +/* + * @brief USART Init Structure definition + */ +typedef struct +{ + uint32_t BaudRate; /*!< This member configures the USART communication baud rate. */ + + uint32_t WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. + This parameter can be a value of @ref USARTEx_Word_Length. */ + + uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. + This parameter can be a value of @ref USART_Stop_Bits. */ + + uint32_t Parity; /*!< Specifies the parity mode. + This parameter can be a value of @ref USART_Parity. */ + + uint32_t Mode; /*!< Specifies whether the Receive or Transmit mode is enabled or disabled. + This parameter can be a value of @ref USART_Mode. */ +#if 0 + uint32_t HwFlowCtl; /*!< Specifies whether the hardware flow control mode is enabled or disabled. + This parameter can be a value of @ref USART_Hardware_Flow_Control. */ +#endif + uint32_t CLKPolarity; /*!< Specifies the steady state of the serial clock. + This parameter can be a value of @ref USART_Clock_Polarity. */ + + uint32_t CLKPhase; /*!< Specifies the clock transition on which the bit capture is made. + This parameter can be a value of @ref USART_Clock_Phase. */ + + uint32_t CLKLastBit; /*!< Specifies whether the clock pulse corresponding to the last transmitted + data bit (MSB) has to be output on the SCLK pin in synchronous mode. + This parameter can be a value of @ref USART_Last_Bit. */ +//ljg checkhere +#if 0 + uint32_t ClockPrescaler; /*!< Specifies the prescaler value used to divide the USART clock source. + This parameter can be a value of @ref USART_ClockPrescaler. */ +#endif +}USART_InitTypeDef; + +/* + * @brief USART handle Structure definition + */ +typedef struct +{ + USART_TypeDef *Instance; /*!< USART registers base address */ + + USART_InitTypeDef Init; /*!< USART communication parameters */ + + uint32_t TxSize; /*!< USART Transmit parameters in interrupt */ + __IO uint32_t TxCount; + uint8_t *TxData; + + uint32_t RxSize; /*!< USART Receive parameters in interrupt */ + __IO uint32_t RxCount; + uint8_t *RxData; + + + __IO uint8_t TxBusy; + __IO uint8_t RxBusy; +#ifdef HAL_DMA_MODULE_ENABLED + DMA_HandleTypeDef *HDMA_Tx; /*!< USART Tx DMA handle parameters */ + DMA_HandleTypeDef *HDMA_Rx; /*!< USART Rx DMA handle parameters */ +#endif + __IO uint32_t ErrorCode; /*!Instance->CR1 |= USART_CR1_USARTEN) + +/** @brief Disable USART + * @param __HANDLE__ specifies the USART Handle. + * @retval None + */ +#define __HAL_USART_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~USART_CR1_USARTEN) + + +#define __HAL_USART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->ISR & (__FLAG__)) == (__FLAG__)) + + + +#define CLEAR_STATUS(reg, flag) WRITE_REG(reg, flag) + + +#define __USART_TXI_FIFO_LEVEL_SET(fifo_level) MODIFY_REG(husart->Instance->CR3, USART_CR3_TXIFLSEL_Msk, fifo_level); + +#define __USART_RXI_FIFO_LEVEL_SET(fifo_level) MODIFY_REG(husart->Instance->CR3, USART_CR3_RXIFLSEL_Msk, fifo_level); +/** + * @} + */ + +/* HAL_USART_IRQHandler */ +void HAL_USART_IRQHandler(USART_HandleTypeDef *huart); + +/* HAL_USART_MspInit */ +void HAL_USART_MspInit(USART_HandleTypeDef *huart); + +/* HAL_USART_Init */ +HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *huart); + +/* HAL_USART_DeInit */ +HAL_StatusTypeDef HAL_USART_DeInit(USART_HandleTypeDef *huart); + +/* HAL_USART_GetState */ +HAL_StatusTypeDef HAL_USART_GetState(USART_HandleTypeDef *huart); + +/* HAL_USART_GetError*/ +uint32_t HAL_USART_GetError(USART_HandleTypeDef *huart); + +/* HAL_USART_Abort*/ +HAL_StatusTypeDef HAL_USART_Abort(USART_HandleTypeDef *huart); + +/* HAL_USART_DMAPause */ +HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *huart); + +/* HAL_USART_DMAResume */ +HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *huart); + + +HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *huart); + +/* HAL_USART_Transmit */ +HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *huart, uint8_t *buf, uint32_t size, uint32_t timeout); + +/* HAL_USART_Receive */ +HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *huart, uint8_t *buf, uint32_t size, uint32_t timeout); + +/* HAL_USART_Transmit_IT */ +HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *huart, uint8_t *buf, uint32_t size); + +/* HAL_USART_Receive_IT */ +HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *huart, uint8_t *buf, uint32_t size); + +/* HAL_USART_Transmit_DMA */ +HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *huart, uint8_t *buf, uint32_t size); + +/* HAL_USART_Receive_DMA */ +HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *huart, uint8_t *buf, uint32_t size); + +void HAL_USART_SetDebugUart(USART_TypeDef *USARTx); + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_wdt.h b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_wdt.h new file mode 100644 index 0000000000..c78c366772 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Inc/hal_wdt.h @@ -0,0 +1,140 @@ + +/****************************************************************************** +*@file : hal_wdt.h +*@brief : Header file of WDT HAL module. +******************************************************************************/ + +#ifndef __HAL_WDT_H__ +#define __HAL_WDT_H__ + +#include "hal.h" + + +/** + * @brief WDT Init structure definition + */ + +typedef struct +{ + uint32_t Prescaler; /*!< Select the prescaler of the WDT. + This parameter can be any value of @ref WDT_Clock_Prescaler */ + + uint32_t Mode; /*!< Specifies whether WDT mode is reset or interrupted. + This parameter can be any value of @ref WDT_Mode */ + + uint32_t Load; /*!< Specifies the WDT reload values. + This parameter must be a number between Min_Data = 0x00000000 + and Max_Data = 0xFFFFFFFF */ + + uint32_t IntClrTime; /*!< Specifies the wakeup value to be compared to the down-counter. + This parameter must be a number between Min_Data = 0x0000 + and Max_Data = 0xFFFF */ + +} WDT_InitTypeDef; + +/** + * @brief WDT Handle Structure definition + */ + +typedef struct +{ + WDT_TypeDef *Instance; /*!< Register base address */ + + WDT_InitTypeDef Init; /*!< WDT required parameters */ + +} WDT_HandleTypeDef; + + +/** @defgroup WDT_Cmd + * @{ + */ + +#define WDT_CMD_FEED_WATCHDOG ( 0xAA55A55AU ) + +/** + * @} + */ +/** @defgroup WDT_Clock_Prescaler + * @{ + */ + +#define WDT_CLOCK_PRESCALER_1 ( 0U ) +#define WDT_CLOCK_PRESCALER_2 ( WDT_CTRL_DIVISOR_0 ) +#define WDT_CLOCK_PRESCALER_4 ( WDT_CTRL_DIVISOR_1 ) +#define WDT_CLOCK_PRESCALER_8 ( WDT_CTRL_DIVISOR_1 | WDT_CTRL_DIVISOR_0 ) +#define WDT_CLOCK_PRESCALER_16 ( WDT_CTRL_DIVISOR_2 ) +#define WDT_CLOCK_PRESCALER_32 ( WDT_CTRL_DIVISOR_2 | WDT_CTRL_DIVISOR_0 ) +#define WDT_CLOCK_PRESCALER_64 ( WDT_CTRL_DIVISOR_2 | WDT_CTRL_DIVISOR_1 ) +#define WDT_CLOCK_PRESCALER_128 ( WDT_CTRL_DIVISOR_2 | WDT_CTRL_DIVISOR_1 | WDT_CTRL_DIVISOR_0 ) + +/** + * @} + */ + +/** @defgroup WDT_Mode + * @{ + */ + +#define WDT_MODE_RESET ( 0U ) +#define WDT_MODE_INTERRUPT ( WDT_CTRL_MODE ) + +/** + * @} + */ + + +/** + * @brief + */ + +#define WDT_GET_IT_ENABLE(__HWDT__) ( (__HWDT__)->Instance->CTRL |= WDT_CTRL_INTEN ) + +#define WDT_GET_IT_DISABLE(__HWDT__) ( (__HWDT__)->Instance->CTRL &= ~WDT_CTRL_INTEN ) + +#define WDT_GET_RIS(__HWDT__) ( ((__HWDT__)->Instance->RIS & WDT_RIS_WDTRIS) ? SET : RESET ) + + + +/** @defgroup EXTI Private Macros + * @{ + */ + +#define IS_WDT_ALL_INSTANCE(__INSTANCE__) ((__INSTANCE__) == WDT) + +#define IS_WDT_PRESCALER(__PRESCALER__) (((__PRESCALER__) == WDT_CLOCK_PRESCALER_1) || \ + ((__PRESCALER__) == WDT_CLOCK_PRESCALER_2) || \ + ((__PRESCALER__) == WDT_CLOCK_PRESCALER_4) || \ + ((__PRESCALER__) == WDT_CLOCK_PRESCALER_8) || \ + ((__PRESCALER__) == WDT_CLOCK_PRESCALER_16) || \ + ((__PRESCALER__) == WDT_CLOCK_PRESCALER_32)|| \ + ((__PRESCALER__) == WDT_CLOCK_PRESCALER_64)|| \ + ((__PRESCALER__) == WDT_CLOCK_PRESCALER_128)) + +#define IS_WDT_MODE(__MODE__) (((__MODE__) == WDT_MODE_RESET) || \ + ((__MODE__) == WDT_MODE_INTERRUPT)) + +#define IS_WDT_INTCLRTIME(__TIME__) ((__TIME__) <= 0xFFFFU) + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +void HAL_WDT_IRQHandler(WDT_HandleTypeDef *hiwdt); + +void HAL_WDT_Callback(WDT_HandleTypeDef *hiwdt); + +HAL_StatusTypeDef HAL_WDT_Init(WDT_HandleTypeDef * hidt); + +void HAL_WDT_MspInit(WDT_HandleTypeDef * hiwdt); + +HAL_StatusTypeDef HAL_WDT_Refresh(WDT_HandleTypeDef *hiwdt); + +FlagStatus HAL_WDT_GetPending(void); + +void HAL_WDT_ClearPending(void); + + + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/HAL_HCD.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/HAL_HCD.c new file mode 100644 index 0000000000..07c5a7f4b9 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/HAL_HCD.c @@ -0,0 +1,1736 @@ +/** + ****************************************************************************** + * @file hal_hcd.c + * @author MCD Application Team + * @brief HCD HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the USB Peripheral Controller: + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral Control functions + * + Peripheral State functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + (#)Declare a HCD_HandleTypeDef handle structure, for example: + HCD_HandleTypeDef hhcd; + + (#)Fill parameters of Init structure in HCD handle + + (#)Call HAL_HCD_Init() API to initialize the HCD peripheral (Core, Host core, ...) + + (#)Initialize the HCD low level resources through the HAL_HCD_MspInit() API: + (##) Enable the HCD/USB Low Level interface clock using the following macros + (+++) __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); + (+++) __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); (For High Speed Mode) + (+++) __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE(); (For High Speed Mode) + + (##) Initialize the related GPIO clocks + (##) Configure HCD pin-out + (##) Configure HCD NVIC interrupt + + (#)Associate the Upper USB Host stack to the HAL HCD Driver: + (##) hhcd.pData = phost; + + (#)Enable HCD transmission and reception: + (##) HAL_HCD_Start(); + + @endverbatim + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2024 STMicroelectronics. + * All rights reserved. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "hal.h" + + + +#ifdef HAL_HCD_MODULE_ENABLED + +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) + +/** @defgroup HCD HCD + * @brief HCD HAL module driver + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup HCD_Private_Functions HCD Private Functions + * @{ + */ +static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum); +static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum); +static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd); +static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup HCD_Exported_Functions HCD Exported Functions + * @{ + */ + +/** @defgroup HCD_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] This section provides functions allowing to: + +@endverbatim + * @{ + */ + +/** + * @brief Initialize the host driver. + * @param hhcd HCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HCD_Init(HCD_HandleTypeDef *hhcd) +{ + USB_OTG_GlobalTypeDef *USBx; + + /* Check the HCD handle allocation */ + if (hhcd == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_HCD_ALL_INSTANCE(hhcd->Instance)); + + USBx = hhcd->Instance; + + if (hhcd->State == HAL_HCD_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hhcd->Lock = HAL_UNLOCKED; + +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) + hhcd->SOFCallback = HAL_HCD_SOF_Callback; + hhcd->ConnectCallback = HAL_HCD_Connect_Callback; + hhcd->DisconnectCallback = HAL_HCD_Disconnect_Callback; + hhcd->PortEnabledCallback = HAL_HCD_PortEnabled_Callback; + hhcd->PortDisabledCallback = HAL_HCD_PortDisabled_Callback; + hhcd->HC_NotifyURBChangeCallback = HAL_HCD_HC_NotifyURBChange_Callback; + + if (hhcd->MspInitCallback == NULL) + { + hhcd->MspInitCallback = HAL_HCD_MspInit; + } + + /* Init the low level hardware */ + hhcd->MspInitCallback(hhcd); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC... */ + HAL_HCD_MspInit(hhcd); +#endif /* (USE_HAL_HCD_REGISTER_CALLBACKS) */ + } + + hhcd->State = HAL_HCD_STATE_BUSY; + + + /* Disable the Interrupts */ + __HAL_HCD_DISABLE(hhcd); + + /* Init the Core (common init.) */ + (void)USB_CoreInit(hhcd->Instance, hhcd->Init); + + /* Force Host Mode*/ + (void)USB_SetCurrentMode(hhcd->Instance, USB_HOST_MODE); + + /* Init Host */ + (void)USB_HostInit(hhcd->Instance, hhcd->Init); + + hhcd->State = HAL_HCD_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Initialize a host channel. + * @param hhcd HCD handle + * @param ch_num Channel number. + * This parameter can be a value from 1 to 15 + * @param epnum Endpoint number. + * This parameter can be a value from 1 to 15 + * @param dev_address Current device address + * This parameter can be a value from 0 to 255 + * @param speed Current device speed. + * This parameter can be one of these values: + * HCD_SPEED_HIGH: High speed mode, + * HCD_SPEED_FULL: Full speed mode, + * HCD_SPEED_LOW: Low speed mode + * @param ep_type Endpoint Type. + * This parameter can be one of these values: + * EP_TYPE_CTRL: Control type, + * EP_TYPE_ISOC: Isochronous type, + * EP_TYPE_BULK: Bulk type, + * EP_TYPE_INTR: Interrupt type + * @param mps Max Packet Size. + * This parameter can be a value from 0 to32K + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd, + uint8_t ch_num, + uint8_t epnum, + uint8_t dev_address, + uint8_t speed, + uint8_t ep_type, + uint16_t mps) +{ + HAL_StatusTypeDef status; + + __HAL_LOCK(hhcd); + hhcd->hc[ch_num].do_ping = 0U; + hhcd->hc[ch_num].dev_addr = dev_address; + hhcd->hc[ch_num].max_packet = mps; + hhcd->hc[ch_num].ch_num = ch_num; + hhcd->hc[ch_num].ep_type = ep_type; + hhcd->hc[ch_num].ep_num = epnum & 0x7FU; + + if ((epnum & 0x80U) == 0x80U) + { + hhcd->hc[ch_num].ep_is_in = 1U; + } + else + { + hhcd->hc[ch_num].ep_is_in = 0U; + } + + hhcd->hc[ch_num].speed = speed; + + status = USB_HC_Init(hhcd->Instance, + ch_num, + epnum, + dev_address, + speed, + ep_type, + mps); + __HAL_UNLOCK(hhcd); + + return status; +} + +/** + * @brief Halt a host channel. + * @param hhcd HCD handle + * @param ch_num Channel number. + * This parameter can be a value from 1 to 15 + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HCD_HC_Halt(HCD_HandleTypeDef *hhcd, uint8_t ch_num) +{ + HAL_StatusTypeDef status = HAL_OK; + + __HAL_LOCK(hhcd); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + __HAL_UNLOCK(hhcd); + + return status; +} + +/** + * @brief DeInitialize the host driver. + * @param hhcd HCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HCD_DeInit(HCD_HandleTypeDef *hhcd) +{ + /* Check the HCD handle allocation */ + if (hhcd == NULL) + { + return HAL_ERROR; + } + + hhcd->State = HAL_HCD_STATE_BUSY; + +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) + if (hhcd->MspDeInitCallback == NULL) + { + hhcd->MspDeInitCallback = HAL_HCD_MspDeInit; /* Legacy weak MspDeInit */ + } + + /* DeInit the low level hardware */ + hhcd->MspDeInitCallback(hhcd); +#else + /* DeInit the low level hardware: CLOCK, NVIC.*/ + HAL_HCD_MspDeInit(hhcd); +#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ + + __HAL_HCD_DISABLE(hhcd); + + hhcd->State = HAL_HCD_STATE_RESET; + + return HAL_OK; +} + +/** + * @brief Initialize the HCD MSP. + * @param hhcd HCD handle + * @retval None + */ +__weak void HAL_HCD_MspInit(HCD_HandleTypeDef *hhcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hhcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_HCD_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitialize the HCD MSP. + * @param hhcd HCD handle + * @retval None + */ +__weak void HAL_HCD_MspDeInit(HCD_HandleTypeDef *hhcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hhcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_HCD_MspDeInit could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup HCD_Exported_Functions_Group2 Input and Output operation functions + * @brief HCD IO operation functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] This subsection provides a set of functions allowing to manage the USB Host Data + Transfer + +@endverbatim + * @{ + */ + +/** + * @brief Submit a new URB for processing. + * @param hhcd HCD handle + * @param ch_num Channel number. + * This parameter can be a value from 1 to 15 + * @param direction Channel number. + * This parameter can be one of these values: + * 0 : Output / 1 : Input + * @param ep_type Endpoint Type. + * This parameter can be one of these values: + * EP_TYPE_CTRL: Control type/ + * EP_TYPE_ISOC: Isochronous type/ + * EP_TYPE_BULK: Bulk type/ + * EP_TYPE_INTR: Interrupt type/ + * @param token Endpoint Type. + * This parameter can be one of these values: + * 0: HC_PID_SETUP / 1: HC_PID_DATA1 + * @param pbuff pointer to URB data + * @param length Length of URB data + * @param do_ping activate do ping protocol (for high speed only). + * This parameter can be one of these values: + * 0 : do ping inactive / 1 : do ping active + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, + uint8_t ch_num, + uint8_t direction, + uint8_t ep_type, + uint8_t token, + uint8_t *pbuff, + uint16_t length, + uint8_t do_ping) +{ + hhcd->hc[ch_num].ep_is_in = direction; + hhcd->hc[ch_num].ep_type = ep_type; + + if (token == 0U) + { + hhcd->hc[ch_num].data_pid = HC_PID_SETUP; + hhcd->hc[ch_num].do_ping = do_ping; + } + else + { + hhcd->hc[ch_num].data_pid = HC_PID_DATA1; + } + + /* Manage Data Toggle */ + switch (ep_type) + { + case EP_TYPE_CTRL: + if ((token == 1U) && (direction == 0U)) /*send data */ + { + if (length == 0U) + { + /* For Status OUT stage, Length==0, Status Out PID = 1 */ + hhcd->hc[ch_num].toggle_out = 1U; + } + + /* Set the Data Toggle bit as per the Flag */ + if (hhcd->hc[ch_num].toggle_out == 0U) + { + /* Put the PID 0 */ + hhcd->hc[ch_num].data_pid = HC_PID_DATA0; + } + else + { + /* Put the PID 1 */ + hhcd->hc[ch_num].data_pid = HC_PID_DATA1; + } + } + break; + + case EP_TYPE_BULK: + if (direction == 0U) + { + /* Set the Data Toggle bit as per the Flag */ + if (hhcd->hc[ch_num].toggle_out == 0U) + { + /* Put the PID 0 */ + hhcd->hc[ch_num].data_pid = HC_PID_DATA0; + } + else + { + /* Put the PID 1 */ + hhcd->hc[ch_num].data_pid = HC_PID_DATA1; + } + } + else + { + if (hhcd->hc[ch_num].toggle_in == 0U) + { + hhcd->hc[ch_num].data_pid = HC_PID_DATA0; + } + else + { + hhcd->hc[ch_num].data_pid = HC_PID_DATA1; + } + } + + break; + case EP_TYPE_INTR: + if (direction == 0U) + { + /* Set the Data Toggle bit as per the Flag */ + if (hhcd->hc[ch_num].toggle_out == 0U) + { + /* Put the PID 0 */ + hhcd->hc[ch_num].data_pid = HC_PID_DATA0; + } + else + { + /* Put the PID 1 */ + hhcd->hc[ch_num].data_pid = HC_PID_DATA1; + } + } + else + { + if (hhcd->hc[ch_num].toggle_in == 0U) + { + hhcd->hc[ch_num].data_pid = HC_PID_DATA0; + } + else + { + hhcd->hc[ch_num].data_pid = HC_PID_DATA1; + } + } + break; + + case EP_TYPE_ISOC: + hhcd->hc[ch_num].data_pid = HC_PID_DATA0; + break; + + default: + break; + } + + hhcd->hc[ch_num].xfer_buff = pbuff; + hhcd->hc[ch_num].xfer_len = length; + hhcd->hc[ch_num].urb_state = URB_IDLE; + hhcd->hc[ch_num].xfer_count = 0U; + hhcd->hc[ch_num].last_xfer_count = 0; + hhcd->hc[ch_num].ch_num = ch_num; + hhcd->hc[ch_num].state = HC_IDLE; + + return USB_HC_StartXfer(hhcd->Instance, &hhcd->hc[ch_num], (uint8_t)hhcd->Init.dma_enable); +} + +/** + * @brief Handle HCD interrupt request. + * @param hhcd HCD handle + * @retval None + */ +void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd) +{ + +#if 1 + USB_OTG_GlobalTypeDef *USBx = hhcd->Instance; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t i, interrupt; + + /* Ensure that we are in device mode */ + if (USB_GetMode(hhcd->Instance) == USB_OTG_MODE_HOST) + { + /* Avoid spurious interrupt */ + if (__HAL_HCD_IS_INVALID_INTERRUPT(hhcd)) + { + return; + } + + if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT)) + { + /* Incorrect mode, acknowledge the interrupt */ + __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT); + } + + if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR)) + { + /* Incorrect mode, acknowledge the interrupt */ + __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR); + } + + if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE)) + { + /* Incorrect mode, acknowledge the interrupt */ + __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE); + } + + if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_MMIS)) + { + /* Incorrect mode, acknowledge the interrupt */ + __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_MMIS); + } + + /* Handle Host Disconnect Interrupts */ + if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT)) + { + __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT); + + if ((USBx_HPRT0 & USB_OTG_HPRT_PCSTS) == 0U) + { + /* Handle Host Port Disconnect Interrupt */ +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) + hhcd->DisconnectCallback(hhcd); +#else + HAL_HCD_Disconnect_Callback(hhcd); +#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ + + (void)USB_InitFSLSPClkSel(hhcd->Instance, HCFG_48_MHZ); + } + } + +#if 1 + /* Handle Connection event Interrupt */ + if (__HAL_PCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_SRQINT)) + { +// hhcd->ConnectCallback(hhcd); +// USBH_PWR_ON(); + + __HAL_PCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_SRQINT); + } +#endif + + /* Handle Host Port Interrupts */ + if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HPRTINT)) + { + HCD_Port_IRQHandler(hhcd); + } + + /* Handle Host SOF Interrupt */ + if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_SOF)) + { +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) + hhcd->SOFCallback(hhcd); +#else + HAL_HCD_SOF_Callback(hhcd); +#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ + + __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_SOF); + } + + /* Handle Host channel Interrupt */ + if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HCINT)) + { + interrupt = USB_HC_ReadInterrupt(hhcd->Instance); + for (i = 0U; i < hhcd->Init.Host_channels; i++) + { +#if 1 + if(interrupt&0x01) + { + if((USBx_HC(i)->HCCHAR & USB_OTG_HCCHAR_EPDIR) == USB_OTG_HCCHAR_EPDIR) + { + HCD_HC_IN_IRQHandler(hhcd, (uint8_t)i); + } + else + { + HCD_HC_OUT_IRQHandler(hhcd, (uint8_t)i); + } + } + + interrupt >>= 1; + + if(0==interrupt) + { + break; + } + +#else + if((interrupt & (1UL << (i & 0xFU))) != 0U) + { + if ((USBx_HC(i)->HCCHAR & USB_OTG_HCCHAR_EPDIR) == USB_OTG_HCCHAR_EPDIR) + { + HCD_HC_IN_IRQHandler(hhcd, (uint8_t)i); + } + else + { + HCD_HC_OUT_IRQHandler(hhcd, (uint8_t)i); + } + } +#endif + } + __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_HCINT); + } + + /* Handle Rx Queue Level Interrupts */ + if ((__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_RXFLVL)) != 0U) + { + USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL); + + HCD_RXQLVL_IRQHandler(hhcd); + + USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL); + } + } + + #endif +} + +/** + * @brief SOF callback. + * @param hhcd HCD handle + * @retval None + */ +__weak void HAL_HCD_SOF_Callback(HCD_HandleTypeDef *hhcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hhcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_HCD_SOF_Callback could be implemented in the user file + */ +} + +/** + * @brief Connection Event callback. + * @param hhcd HCD handle + * @retval None + */ +__weak void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hhcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_HCD_Connect_Callback could be implemented in the user file + */ +} + +/** + * @brief Disconnection Event callback. + * @param hhcd HCD handle + * @retval None + */ +__weak void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef *hhcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hhcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_HCD_Disconnect_Callback could be implemented in the user file + */ +} + +/** + * @brief Port Enabled Event callback. + * @param hhcd HCD handle + * @retval None + */ +__weak void HAL_HCD_PortEnabled_Callback(HCD_HandleTypeDef *hhcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hhcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_HCD_Disconnect_Callback could be implemented in the user file + */ +} + +/** + * @brief Port Disabled Event callback. + * @param hhcd HCD handle + * @retval None + */ +__weak void HAL_HCD_PortDisabled_Callback(HCD_HandleTypeDef *hhcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hhcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_HCD_Disconnect_Callback could be implemented in the user file + */ +} + +/** + * @brief Notify URB state change callback. + * @param hhcd HCD handle + * @param chnum Channel number. + * This parameter can be a value from 1 to 15 + * @param urb_state: + * This parameter can be one of these values: + * URB_IDLE/ + * URB_DONE/ + * URB_NOTREADY/ + * URB_NYET/ + * URB_ERROR/ + * URB_STALL/ + * @retval None + */ +__weak void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, uint8_t chnum, HCD_URBStateTypeDef urb_state) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hhcd); + UNUSED(chnum); + UNUSED(urb_state); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_HCD_HC_NotifyURBChange_Callback could be implemented in the user file + */ +} + +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) +/** + * @brief Register a User USB HCD Callback + * To be used instead of the weak predefined callback + * @param hhcd USB HCD handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_HCD_SOF_CB_ID USB HCD SOF callback ID + * @arg @ref HAL_HCD_CONNECT_CB_ID USB HCD Connect callback ID + * @arg @ref HAL_HCD_DISCONNECT_CB_ID OTG HCD Disconnect callback ID + * @arg @ref HAL_HCD_PORT_ENABLED_CB_ID USB HCD Port Enable callback ID + * @arg @ref HAL_HCD_PORT_DISABLED_CB_ID USB HCD Port Disable callback ID + * @arg @ref HAL_HCD_MSPINIT_CB_ID MspDeInit callback ID + * @arg @ref HAL_HCD_MSPDEINIT_CB_ID MspDeInit callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HCD_RegisterCallback(HCD_HandleTypeDef *hhcd, HAL_HCD_CallbackIDTypeDef CallbackID, pHCD_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK; + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(hhcd); + + if (hhcd->State == HAL_HCD_STATE_READY) + { + switch (CallbackID) + { + case HAL_HCD_SOF_CB_ID : + hhcd->SOFCallback = pCallback; + break; + + case HAL_HCD_CONNECT_CB_ID : + hhcd->ConnectCallback = pCallback; + break; + + case HAL_HCD_DISCONNECT_CB_ID : + hhcd->DisconnectCallback = pCallback; + break; + + case HAL_HCD_PORT_ENABLED_CB_ID : + hhcd->PortEnabledCallback = pCallback; + break; + + case HAL_HCD_PORT_DISABLED_CB_ID : + hhcd->PortDisabledCallback = pCallback; + break; + + case HAL_HCD_MSPINIT_CB_ID : + hhcd->MspInitCallback = pCallback; + break; + + case HAL_HCD_MSPDEINIT_CB_ID : + hhcd->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (hhcd->State == HAL_HCD_STATE_RESET) + { + switch (CallbackID) + { + case HAL_HCD_MSPINIT_CB_ID : + hhcd->MspInitCallback = pCallback; + break; + + case HAL_HCD_MSPDEINIT_CB_ID : + hhcd->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hhcd); + return status; +} + +/** + * @brief Unregister an USB HCD Callback + * USB HCD callabck is redirected to the weak predefined callback + * @param hhcd USB HCD handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_HCD_SOF_CB_ID USB HCD SOF callback ID + * @arg @ref HAL_HCD_CONNECT_CB_ID USB HCD Connect callback ID + * @arg @ref HAL_HCD_DISCONNECT_CB_ID OTG HCD Disconnect callback ID + * @arg @ref HAL_HCD_PORT_ENABLED_CB_ID USB HCD Port Enabled callback ID + * @arg @ref HAL_HCD_PORT_DISABLED_CB_ID USB HCD Port Disabled callback ID + * @arg @ref HAL_HCD_MSPINIT_CB_ID MspDeInit callback ID + * @arg @ref HAL_HCD_MSPDEINIT_CB_ID MspDeInit callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HCD_UnRegisterCallback(HCD_HandleTypeDef *hhcd, HAL_HCD_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hhcd); + + /* Setup Legacy weak Callbacks */ + if (hhcd->State == HAL_HCD_STATE_READY) + { + switch (CallbackID) + { + case HAL_HCD_SOF_CB_ID : + hhcd->SOFCallback = HAL_HCD_SOF_Callback; + break; + + case HAL_HCD_CONNECT_CB_ID : + hhcd->ConnectCallback = HAL_HCD_Connect_Callback; + break; + + case HAL_HCD_DISCONNECT_CB_ID : + hhcd->DisconnectCallback = HAL_HCD_Disconnect_Callback; + break; + + case HAL_HCD_PORT_ENABLED_CB_ID : + hhcd->PortEnabledCallback = HAL_HCD_PortEnabled_Callback; + break; + + case HAL_HCD_PORT_DISABLED_CB_ID : + hhcd->PortDisabledCallback = HAL_HCD_PortDisabled_Callback; + break; + + case HAL_HCD_MSPINIT_CB_ID : + hhcd->MspInitCallback = HAL_HCD_MspInit; + break; + + case HAL_HCD_MSPDEINIT_CB_ID : + hhcd->MspDeInitCallback = HAL_HCD_MspDeInit; + break; + + default : + /* Update the error code */ + hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (hhcd->State == HAL_HCD_STATE_RESET) + { + switch (CallbackID) + { + case HAL_HCD_MSPINIT_CB_ID : + hhcd->MspInitCallback = HAL_HCD_MspInit; + break; + + case HAL_HCD_MSPDEINIT_CB_ID : + hhcd->MspDeInitCallback = HAL_HCD_MspDeInit; + break; + + default : + /* Update the error code */ + hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hhcd); + return status; +} + +/** + * @brief Register USB HCD Host Channel Notify URB Change Callback + * To be used instead of the weak HAL_HCD_HC_NotifyURBChange_Callback() predefined callback + * @param hhcd HCD handle + * @param pCallback pointer to the USB HCD Host Channel Notify URB Change Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HCD_RegisterHC_NotifyURBChangeCallback(HCD_HandleTypeDef *hhcd, pHCD_HC_NotifyURBChangeCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hhcd); + + if (hhcd->State == HAL_HCD_STATE_READY) + { + hhcd->HC_NotifyURBChangeCallback = pCallback; + } + else + { + /* Update the error code */ + hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hhcd); + + return status; +} + +/** + * @brief UnRegister the USB HCD Host Channel Notify URB Change Callback + * USB HCD Host Channel Notify URB Change Callback is redirected to the weak HAL_HCD_HC_NotifyURBChange_Callback() predefined callback + * @param hhcd HCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HCD_UnRegisterHC_NotifyURBChangeCallback(HCD_HandleTypeDef *hhcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hhcd); + + if (hhcd->State == HAL_HCD_STATE_READY) + { + hhcd->HC_NotifyURBChangeCallback = HAL_HCD_HC_NotifyURBChange_Callback; /* Legacy weak DataOutStageCallback */ + } + else + { + /* Update the error code */ + hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hhcd); + + return status; +} +#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup HCD_Exported_Functions_Group3 Peripheral Control functions + * @brief Management functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the HCD data + transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Start the host driver. + * @param hhcd HCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HCD_Start(HCD_HandleTypeDef *hhcd) +{ + __HAL_LOCK(hhcd); + __HAL_HCD_ENABLE(hhcd); + (void)USB_DriveVbus(hhcd->Instance, 1U); + __HAL_UNLOCK(hhcd); + + return HAL_OK; +} + +/** + * @brief Stop the host driver. + * @param hhcd HCD handle + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_HCD_Stop(HCD_HandleTypeDef *hhcd) +{ + __HAL_LOCK(hhcd); + (void)USB_StopHost(hhcd->Instance); + __HAL_UNLOCK(hhcd); + + return HAL_OK; +} + +/** + * @brief Reset the host port. + * @param hhcd HCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HCD_ResetPort(HCD_HandleTypeDef *hhcd) +{ + return (USB_ResetPort(hhcd->Instance)); +} + +/** + * @brief Set port into suspend mode. + * @param hhcd HCD handle + * @retval HAL status + */ +HAL_StatusTypeDef USB_SuspPort(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef HAL_HCD_SuspPort(HCD_HandleTypeDef *hhcd) +{ + return (USB_SuspPort(hhcd->Instance)); +} + +/** + * @brief host enable HNP. + * @param hhcd HCD handle + * @retval HAL status + */ +HAL_StatusTypeDef USB_HstEnHnp(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef HAL_HCD_EnHnp(HCD_HandleTypeDef *hhcd) +{ + return (USB_HstEnHnp(hhcd->Instance)); +} + +/** + * @} + */ + +/** @defgroup HCD_Exported_Functions_Group4 Peripheral State functions + * @brief Peripheral State functions + * +@verbatim + =============================================================================== + ##### Peripheral State functions ##### + =============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the HCD handle state. + * @param hhcd HCD handle + * @retval HAL state + */ +HCD_StateTypeDef HAL_HCD_GetState(HCD_HandleTypeDef *hhcd) +{ + return hhcd->State; +} + +/** + * @brief Return URB state for a channel. + * @param hhcd HCD handle + * @param chnum Channel number. + * This parameter can be a value from 1 to 15 + * @retval URB state. + * This parameter can be one of these values: + * URB_IDLE/ + * URB_DONE/ + * URB_NOTREADY/ + * URB_NYET/ + * URB_ERROR/ + * URB_STALL + */ +HCD_URBStateTypeDef HAL_HCD_HC_GetURBState(HCD_HandleTypeDef *hhcd, uint8_t chnum) +{ + return hhcd->hc[chnum].urb_state; +} + + +/** + * @brief Return the last host transfer size. + * @param hhcd HCD handle + * @param chnum Channel number. + * This parameter can be a value from 1 to 15 + * @retval last transfer size in byte + */ +uint32_t HAL_HCD_HC_GetXferCount(HCD_HandleTypeDef *hhcd, uint8_t chnum) +{ + return hhcd->hc[chnum].xfer_count; +} + +/** + * @brief Return the Host Channel state. + * @param hhcd HCD handle + * @param chnum Channel number. + * This parameter can be a value from 1 to 15 + * @retval Host channel state + * This parameter can be one of these values: + * HC_IDLE/ + * HC_XFRC/ + * HC_HALTED/ + * HC_NYET/ + * HC_NAK/ + * HC_STALL/ + * HC_XACTERR/ + * HC_BBLERR/ + * HC_DATATGLERR + */ +HCD_HCStateTypeDef HAL_HCD_HC_GetState(HCD_HandleTypeDef *hhcd, uint8_t chnum) +{ + return hhcd->hc[chnum].state; +} + +/** + * @brief Return the current Host frame number. + * @param hhcd HCD handle + * @retval Current Host frame number + */ +uint32_t HAL_HCD_GetCurrentFrame(HCD_HandleTypeDef *hhcd) +{ + return (USB_GetCurrentFrame(hhcd->Instance)); +} + +/** + * @brief Return the Host enumeration speed. + * @param hhcd HCD handle + * @retval Enumeration speed + */ +uint32_t HAL_HCD_GetCurrentSpeed(HCD_HandleTypeDef *hhcd) +{ + return (USB_GetHostSpeed(hhcd->Instance)); +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup HCD_Private_Functions + * @{ + */ +/** + * @brief Handle Host Channel IN interrupt requests. + * @param hhcd HCD handle + * @param chnum Channel number. + * This parameter can be a value from 1 to 15 + * @retval none + */ +static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum) +{ + USB_OTG_GlobalTypeDef *USBx = hhcd->Instance; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t ch_num = (uint32_t)chnum; + + uint32_t tmpreg; + + if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_AHBERR) == USB_OTG_HCINT_AHBERR) + { + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_AHBERR); + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_BBERR) == USB_OTG_HCINT_BBERR) + { + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_BBERR); + hhcd->hc[ch_num].state = HC_BBLERR; + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_ACK) == USB_OTG_HCINT_ACK) + { + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_ACK); + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_STALL) == USB_OTG_HCINT_STALL) + { + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + hhcd->hc[ch_num].state = HC_STALL; + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK); + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_STALL); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_DTERR) == USB_OTG_HCINT_DTERR) + { + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK); + hhcd->hc[ch_num].state = HC_DATATGLERR; + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_DTERR); + } + else + { + /* ... */ + } + + if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_FRMOR) == USB_OTG_HCINT_FRMOR) + { + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_FRMOR); + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_XFRC) == USB_OTG_HCINT_XFRC) + { + if (hhcd->Init.dma_enable != 0U) + { + hhcd->hc[ch_num].xfer_count = hhcd->hc[ch_num].xfer_len - \ + (USBx_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_XFRSIZ); + } + + hhcd->hc[ch_num].state = HC_XFRC; + hhcd->hc[ch_num].ErrCnt = 0U; +// __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_XFRC); + __HAL_HCD_CLEAR_HC_INT(ch_num, (USB_OTG_HCINT_XFRC | USB_OTG_HCINT_ACK)); + + if ((hhcd->hc[ch_num].ep_type == EP_TYPE_CTRL) || + (hhcd->hc[ch_num].ep_type == EP_TYPE_BULK)) + { + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK); + } + else if (hhcd->hc[ch_num].ep_type == EP_TYPE_INTR) + { + USBx_HC(ch_num)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM; + hhcd->hc[ch_num].urb_state = URB_DONE; + +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) + hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state); +#else + HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state); +#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ + } + else if (hhcd->hc[ch_num].ep_type == EP_TYPE_ISOC) + { + hhcd->hc[ch_num].urb_state = URB_DONE; + hhcd->hc[ch_num].toggle_in ^= 1U; + +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) + hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state); +#else + HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state); +#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ + } + else + { + /* ... */ + } + hhcd->hc[ch_num].toggle_in ^= 1U; + + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_CHH) == USB_OTG_HCINT_CHH) + { + __HAL_HCD_MASK_HALT_HC_INT(ch_num); + + if (hhcd->hc[ch_num].state == HC_XFRC) + { + hhcd->hc[ch_num].urb_state = URB_DONE; + } + else if (hhcd->hc[ch_num].state == HC_STALL) + { + hhcd->hc[ch_num].urb_state = URB_STALL; + } + else if ((hhcd->hc[ch_num].state == HC_XACTERR) || + (hhcd->hc[ch_num].state == HC_DATATGLERR)) + { + hhcd->hc[ch_num].ErrCnt++; + if (hhcd->hc[ch_num].ErrCnt > 3U) + { + hhcd->hc[ch_num].ErrCnt = 0U; + hhcd->hc[ch_num].urb_state = URB_ERROR; + } + else + { + hhcd->hc[ch_num].urb_state = URB_NOTREADY; + } + + /* re-activate the channel */ + tmpreg = USBx_HC(ch_num)->HCCHAR; + tmpreg &= ~USB_OTG_HCCHAR_CHDIS; + tmpreg |= USB_OTG_HCCHAR_CHENA; + USBx_HC(ch_num)->HCCHAR = tmpreg; + } + else if (hhcd->hc[ch_num].state == HC_NAK) + { + hhcd->hc[ch_num].urb_state = URB_NOTREADY; + /* re-activate the channel */ + tmpreg = USBx_HC(ch_num)->HCCHAR; + tmpreg &= ~USB_OTG_HCCHAR_CHDIS; + tmpreg |= USB_OTG_HCCHAR_CHENA; + USBx_HC(ch_num)->HCCHAR = tmpreg; + } + else if (hhcd->hc[ch_num].state == HC_BBLERR) + { + hhcd->hc[ch_num].ErrCnt++; + hhcd->hc[ch_num].urb_state = URB_ERROR; + } + else + { + /* ... */ + } + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_CHH); + HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state); + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_TXERR) == USB_OTG_HCINT_TXERR) + { + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + hhcd->hc[ch_num].ErrCnt++; + hhcd->hc[ch_num].state = HC_XACTERR; + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_TXERR); + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_NAK) == USB_OTG_HCINT_NAK) + { + if (hhcd->hc[ch_num].ep_type == EP_TYPE_INTR) + { + hhcd->hc[ch_num].ErrCnt = 0U; + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + } + else if ((hhcd->hc[ch_num].ep_type == EP_TYPE_CTRL) || + (hhcd->hc[ch_num].ep_type == EP_TYPE_BULK)) + { + hhcd->hc[ch_num].ErrCnt = 0U; + + if (hhcd->Init.dma_enable == 0U) + { + hhcd->hc[ch_num].state = HC_NAK; + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + } + } + else + { + /* ... */ + } + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK); + } + else + { + /* ... */ + } +} + +/** + * @brief Handle Host Channel OUT interrupt requests. + * @param hhcd HCD handle + * @param chnum Channel number. + * This parameter can be a value from 1 to 15 + * @retval none + */ +static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum) +{ + USB_OTG_GlobalTypeDef *USBx = hhcd->Instance; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t ch_num = (uint32_t)chnum; + uint32_t tmpreg; + + if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_AHBERR) == USB_OTG_HCINT_AHBERR) + { + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_AHBERR); + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_ACK) == USB_OTG_HCINT_ACK) + { + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_ACK); + + if (hhcd->hc[ch_num].do_ping == 1U) + { + hhcd->hc[ch_num].do_ping = 0U; + hhcd->hc[ch_num].urb_state = URB_NOTREADY; + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + } + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_NYET) == USB_OTG_HCINT_NYET) + { + hhcd->hc[ch_num].state = HC_NYET; + hhcd->hc[ch_num].do_ping = 1U; + hhcd->hc[ch_num].ErrCnt = 0U; + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NYET); + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_FRMOR) == USB_OTG_HCINT_FRMOR) + { + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_FRMOR); + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_XFRC) == USB_OTG_HCINT_XFRC) + { + hhcd->hc[ch_num].ErrCnt = 0U; + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_XFRC); + hhcd->hc[ch_num].state = HC_XFRC; + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_STALL) == USB_OTG_HCINT_STALL) + { + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_STALL); + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + hhcd->hc[ch_num].state = HC_STALL; + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_NAK) == USB_OTG_HCINT_NAK) + { + hhcd->hc[ch_num].ErrCnt = 0U; + hhcd->hc[ch_num].state = HC_NAK; + + if (hhcd->hc[ch_num].do_ping == 0U) + { + if (hhcd->hc[ch_num].speed == HCD_SPEED_HIGH) + { + hhcd->hc[ch_num].do_ping = 1U; + } + } + + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK); + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_TXERR) == USB_OTG_HCINT_TXERR) + { + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + hhcd->hc[ch_num].state = HC_XACTERR; + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_TXERR); + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_DTERR) == USB_OTG_HCINT_DTERR) + { + __HAL_HCD_UNMASK_HALT_HC_INT(ch_num); + (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num); + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK); + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_DTERR); + hhcd->hc[ch_num].state = HC_DATATGLERR; + } + else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_CHH) == USB_OTG_HCINT_CHH) + { + __HAL_HCD_MASK_HALT_HC_INT(ch_num); + + if (hhcd->hc[ch_num].state == HC_XFRC) + { + hhcd->hc[ch_num].urb_state = URB_DONE; + if ((hhcd->hc[ch_num].ep_type == EP_TYPE_BULK) || + (hhcd->hc[ch_num].ep_type == EP_TYPE_INTR)) + { + hhcd->hc[ch_num].toggle_out ^= 1U; + } + } + else if (hhcd->hc[ch_num].state == HC_NAK) + { + hhcd->hc[ch_num].urb_state = URB_NOTREADY; + } + else if (hhcd->hc[ch_num].state == HC_NYET) + { + hhcd->hc[ch_num].urb_state = URB_NOTREADY; + } + else if (hhcd->hc[ch_num].state == HC_STALL) + { + hhcd->hc[ch_num].urb_state = URB_STALL; + } + else if ((hhcd->hc[ch_num].state == HC_XACTERR) || + (hhcd->hc[ch_num].state == HC_DATATGLERR)) + { + hhcd->hc[ch_num].ErrCnt++; + if (hhcd->hc[ch_num].ErrCnt > 3U) + { + hhcd->hc[ch_num].ErrCnt = 0U; + hhcd->hc[ch_num].urb_state = URB_ERROR; + } + else + { + hhcd->hc[ch_num].urb_state = URB_NOTREADY; + } + + /* re-activate the channel */ + tmpreg = USBx_HC(ch_num)->HCCHAR; + tmpreg &= ~USB_OTG_HCCHAR_CHDIS; + tmpreg |= USB_OTG_HCCHAR_CHENA; + USBx_HC(ch_num)->HCCHAR = tmpreg; + } + else + { + /* ... */ + } + + __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_CHH); + HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state); + } + else + { + /* ... */ + } +} + +/** + * @brief Handle Rx Queue Level interrupt requests. + * @param hhcd HCD handle + * @retval none + */ +static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd) +{ + USB_OTG_GlobalTypeDef *USBx = hhcd->Instance; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t pktsts; + uint32_t pktcnt; + uint32_t temp; + uint32_t tmpreg; + uint32_t ch_num; + + temp = hhcd->Instance->GRXSTSP; + ch_num = temp & USB_OTG_GRXSTSP_EPNUM; + pktsts = (temp & USB_OTG_GRXSTSP_PKTSTS) >> 17; + pktcnt = (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + + switch (pktsts) + { + case GRXSTS_PKTSTS_IN: + +// uart_printf("PacketIn==%x %x %x %08x\r\n", ch_num, pktsts, pktcnt, temp); + /* Read the data into the host buffer. */ + if ((pktcnt > 0U) && (hhcd->hc[ch_num].xfer_buff != (void *)0)) + { + (void)USB_ReadPacket(hhcd->Instance, hhcd->hc[ch_num].xfer_buff, (uint16_t)pktcnt); + + /*manage multiple Xfer */ + hhcd->hc[ch_num].xfer_buff += pktcnt; + hhcd->hc[ch_num].xfer_count += pktcnt; + hhcd->hc[ch_num].last_xfer_count = pktcnt; + + if ((USBx_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) > 0U) + { + /* re-activate the channel when more packets are expected */ + tmpreg = USBx_HC(ch_num)->HCCHAR; + tmpreg &= ~USB_OTG_HCCHAR_CHDIS; + tmpreg |= USB_OTG_HCCHAR_CHENA; + USBx_HC(ch_num)->HCCHAR = tmpreg; + hhcd->hc[ch_num].toggle_in ^= 1U; + } + } + break; + + case GRXSTS_PKTSTS_DATA_TOGGLE_ERR: + break; + + case GRXSTS_PKTSTS_IN_XFER_COMP: + case GRXSTS_PKTSTS_CH_HALTED: + default: + break; + } +} + +/** + * @brief Handle Host Port interrupt requests. + * @param hhcd HCD handle + * @retval None + */ +static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd) +{ + +#if 1 + + USB_OTG_GlobalTypeDef *USBx = hhcd->Instance; + uint32_t USBx_BASE = (uint32_t)USBx; + __IO uint32_t hprt0, hprt0_dup; + + /* Handle Host Port Interrupts */ + hprt0 = USBx_HPRT0; + hprt0_dup = USBx_HPRT0; + + hprt0_dup &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | \ + USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG); + + /* Check whether Port Connect detected */ + if ((hprt0 & USB_OTG_HPRT_PCDET) == USB_OTG_HPRT_PCDET) + { + if ((hprt0 & USB_OTG_HPRT_PCSTS) == USB_OTG_HPRT_PCSTS) + { +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) + hhcd->ConnectCallback(hhcd); +#else + HAL_HCD_Connect_Callback(hhcd); +#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ + } + hprt0_dup |= USB_OTG_HPRT_PCDET; + } + + /* Check whether Port Enable Changed */ + if ((hprt0 & USB_OTG_HPRT_PENCHNG) == USB_OTG_HPRT_PENCHNG) + { + hprt0_dup |= USB_OTG_HPRT_PENCHNG; + + if ((hprt0 & USB_OTG_HPRT_PENA) == USB_OTG_HPRT_PENA) + { + if (hhcd->Init.phy_itface == USB_OTG_EMBEDDED_PHY) + { + if ((hprt0 & USB_OTG_HPRT_PSPD) == (HPRT0_PRTSPD_LOW_SPEED << 17)) + { + (void)USB_InitFSLSPClkSel(hhcd->Instance, HCFG_6_MHZ); + } + else + { + (void)USB_InitFSLSPClkSel(hhcd->Instance, HCFG_48_MHZ); + } + } + else + { + if (hhcd->Init.speed == HCD_SPEED_FULL) + { + USBx_HOST->HFIR = 30000U|BIT16; // Use 30MHz + } + } +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) + hhcd->PortEnabledCallback(hhcd); +#else + HAL_HCD_PortEnabled_Callback(hhcd); +#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ + + } + else + { +#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U) + hhcd->PortDisabledCallback(hhcd); +#else + HAL_HCD_PortDisabled_Callback(hhcd); +#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */ + } + } + + /* Check for an overcurrent */ + if ((hprt0 & USB_OTG_HPRT_POCCHNG) == USB_OTG_HPRT_POCCHNG) + { + hprt0_dup |= USB_OTG_HPRT_POCCHNG; + } + + /* Clear Port Interrupts */ + USBx_HPRT0 = hprt0_dup; + +#endif + +} + + +HAL_StatusTypeDef HAL_HCD_UnmaskSofInt(HCD_HandleTypeDef *hhcd) +{ + USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTMSK_SOFM); + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_HCD_MaskSofInt(HCD_HandleTypeDef *hhcd) +{ + USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTMSK_SOFM); + + return HAL_OK; +} + + + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ +#endif /* HAL_HCD_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/HAL_PCD.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/HAL_PCD.c new file mode 100644 index 0000000000..c3e93b3496 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/HAL_PCD.c @@ -0,0 +1,1870 @@ +/** + ****************************************************************************** + * @file ACM32H5xx_hal_pcd.c + * @author MCD Application Team + * @brief PCD HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the USB Peripheral Controller: + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral Control functions + * + Peripheral State functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The PCD HAL driver can be used as follows: + + (#) Declare a PCD_HandleTypeDef handle structure, for example: + PCD_HandleTypeDef hpcd; + + (#) Fill parameters of Init structure in HCD handle + + (#) Call HAL_PCD_Init() API to initialize the PCD peripheral (Core, Device core, ...) + + (#) Initialize the PCD low level resources through the HAL_PCD_MspInit() API: + (##) Enable the PCD/USB Low Level interface clock using + (+++) __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); + (+++) __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); (For High Speed Mode) + + (##) Initialize the related GPIO clocks + (##) Configure PCD pin-out + (##) Configure PCD NVIC interrupt + + (#)Associate the Upper USB device stack to the HAL PCD Driver: + (##) hpcd.pData = pdev; + + (#)Enable PCD transmission and reception: + (##) HAL_PCD_Start(); + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

+ * + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "hal.h" + +/** @addtogroup ACM32H5xx_HAL_Driver + * @{ + */ + +/** @defgroup PCD PCD + * @brief PCD HAL module driver + * @{ + */ + +#ifdef HAL_PCD_MODULE_ENABLED + +#include "usbd_def.h" + +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @defgroup PCD_Private_Macros PCD Private Macros + * @{ + */ +#define PCD_MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define PCD_MAX(a, b) (((a) > (b)) ? (a) : (b)) +/** + * @} + */ + +/* Private functions prototypes ----------------------------------------------*/ +/** @defgroup PCD_Private_Functions PCD Private Functions + * @{ + */ +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) + HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum); + HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum); + HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum); + extern HAL_StatusTypeDef USB_PHY_8BIT_16BIT_Select(USB_OTG_GlobalTypeDef *USBx, uint32_t Phy_cfg); +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup PCD_Exported_Functions PCD Exported Functions + * @{ + */ + +/** @defgroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] This section provides functions allowing to: + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the PCD according to the specified + * parameters in the PCD_InitTypeDef and initialize the associated handle. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) +{ + USB_OTG_GlobalTypeDef *USBx; + uint8_t i; + + /* Check the PCD handle allocation */ + if (hpcd == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance)); + + USBx = hpcd->Instance; + + if (hpcd->State == HAL_PCD_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hpcd->Lock = HAL_UNLOCKED; + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->SOFCallback = HAL_PCD_SOFCallback; + hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback; + hpcd->ResetCallback = HAL_PCD_ResetCallback; + hpcd->SuspendCallback = HAL_PCD_SuspendCallback; + hpcd->ResumeCallback = HAL_PCD_ResumeCallback; + hpcd->ConnectCallback = HAL_PCD_ConnectCallback; + hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback; + hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback; + hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback; + hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback; + hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback; + + if (hpcd->MspInitCallback == NULL) + { + hpcd->MspInitCallback = HAL_PCD_MspInit; + } + + /* Init the low level hardware */ + hpcd->MspInitCallback(hpcd); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC... */ + HAL_PCD_MspInit(hpcd); +#endif /* (USE_HAL_PCD_REGISTER_CALLBACKS) */ + } + + hpcd->State = HAL_PCD_STATE_BUSY; + + /* Disable DMA mode for FS instance */ +// if ((USBx->CID & (0x1U << 8)) == 0U) +// { +// hpcd->Init.dma_enable = 0U; +// } + + /* Disable the Interrupts */ + __HAL_PCD_DISABLE(hpcd); + + /*Init the Core (common init.) */ + if (USB_CoreInit(hpcd->Instance, hpcd->Init) != HAL_OK) + { + hpcd->State = HAL_PCD_STATE_ERROR; + return HAL_ERROR; + } + + if ( (USB_OTG_ULPI_PHY == hpcd->Init.phy_itface) && (HCFG_30_MHZ == hpcd->Init.phy_cfg) ) + { + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET); + HAL_SimpleDelay(1000); + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET); + HAL_SimpleDelay(50000); + } // reset ULPI PHY USB3300 + + + /* Force Device Mode*/ + (void)USB_SetCurrentMode(hpcd->Instance, USB_DEVICE_MODE); + + /* Init endpoints structures */ + for (i = 0U; i < hpcd->Init.dev_endpoints; i++) + { + /* Init ep structure */ + hpcd->IN_ep[i].is_in = 1U; + hpcd->IN_ep[i].num = i; + hpcd->IN_ep[i].tx_fifo_num = i; + /* Control until ep is activated */ + hpcd->IN_ep[i].type = EP_TYPE_CTRL; + hpcd->IN_ep[i].maxpacket = 0U; + hpcd->IN_ep[i].xfer_buff = 0U; + hpcd->IN_ep[i].xfer_len = 0U; + } + + for (i = 0U; i < hpcd->Init.dev_endpoints; i++) + { + hpcd->OUT_ep[i].is_in = 0U; + hpcd->OUT_ep[i].num = i; + /* Control until ep is activated */ + hpcd->OUT_ep[i].type = EP_TYPE_CTRL; + hpcd->OUT_ep[i].maxpacket = 0U; + hpcd->OUT_ep[i].xfer_buff = 0U; + hpcd->OUT_ep[i].xfer_len = 0U; + } + + /* Init Device */ + if (USB_DevInit(hpcd->Instance, hpcd->Init) != HAL_OK) + { + hpcd->State = HAL_PCD_STATE_ERROR; + return HAL_ERROR; + } + + hpcd->USB_Address = 0U; + hpcd->State = HAL_PCD_STATE_READY; + + /* Activate LPM */ + if (hpcd->Init.lpm_enable == 1U) + { + (void)HAL_PCDEx_ActivateLPM(hpcd); + } + + + (void)USB_DevDisconnect(hpcd->Instance); + + return HAL_OK; +} + +/** + * @brief DeInitializes the PCD peripheral. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd) +{ + /* Check the PCD handle allocation */ + if (hpcd == NULL) + { + return HAL_ERROR; + } + + hpcd->State = HAL_PCD_STATE_BUSY; + + /* Stop Device */ + (void)HAL_PCD_Stop(hpcd); + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + if (hpcd->MspDeInitCallback == NULL) + { + hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; /* Legacy weak MspDeInit */ + } + + /* DeInit the low level hardware */ + hpcd->MspDeInitCallback(hpcd); +#else + /* DeInit the low level hardware: CLOCK, NVIC.*/ + HAL_PCD_MspDeInit(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + hpcd->State = HAL_PCD_STATE_RESET; + + return HAL_OK; +} + +/** + * @brief Initializes the PCD MSP. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes PCD MSP. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_MspDeInit could be implemented in the user file + */ +} + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +/** + * @brief Register a User USB PCD Callback + * To be used instead of the weak predefined callback + * @param hpcd USB PCD handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_PCD_SOF_CB_ID USB PCD SOF callback ID + * @arg @ref HAL_PCD_SETUPSTAGE_CB_ID USB PCD Setup callback ID + * @arg @ref HAL_PCD_RESET_CB_ID USB PCD Reset callback ID + * @arg @ref HAL_PCD_SUSPEND_CB_ID USB PCD Suspend callback ID + * @arg @ref HAL_PCD_RESUME_CB_ID USB PCD Resume callback ID + * @arg @ref HAL_PCD_CONNECT_CB_ID USB PCD Connect callback ID + * @arg @ref HAL_PCD_DISCONNECT_CB_ID OTG PCD Disconnect callback ID + * @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID + * @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID, pPCD_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + switch (CallbackID) + { + case HAL_PCD_SOF_CB_ID : + hpcd->SOFCallback = pCallback; + break; + + case HAL_PCD_SETUPSTAGE_CB_ID : + hpcd->SetupStageCallback = pCallback; + break; + + case HAL_PCD_RESET_CB_ID : + hpcd->ResetCallback = pCallback; + break; + + case HAL_PCD_SUSPEND_CB_ID : + hpcd->SuspendCallback = pCallback; + break; + + case HAL_PCD_RESUME_CB_ID : + hpcd->ResumeCallback = pCallback; + break; + + case HAL_PCD_CONNECT_CB_ID : + hpcd->ConnectCallback = pCallback; + break; + + case HAL_PCD_DISCONNECT_CB_ID : + hpcd->DisconnectCallback = pCallback; + break; + + case HAL_PCD_MSPINIT_CB_ID : + hpcd->MspInitCallback = pCallback; + break; + + case HAL_PCD_MSPDEINIT_CB_ID : + hpcd->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (hpcd->State == HAL_PCD_STATE_RESET) + { + switch (CallbackID) + { + case HAL_PCD_MSPINIT_CB_ID : + hpcd->MspInitCallback = pCallback; + break; + + case HAL_PCD_MSPDEINIT_CB_ID : + hpcd->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + return status; +} + +/** + * @brief Unregister an USB PCD Callback + * USB PCD callabck is redirected to the weak predefined callback + * @param hpcd USB PCD handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_PCD_SOF_CB_ID USB PCD SOF callback ID + * @arg @ref HAL_PCD_SETUPSTAGE_CB_ID USB PCD Setup callback ID + * @arg @ref HAL_PCD_RESET_CB_ID USB PCD Reset callback ID + * @arg @ref HAL_PCD_SUSPEND_CB_ID USB PCD Suspend callback ID + * @arg @ref HAL_PCD_RESUME_CB_ID USB PCD Resume callback ID + * @arg @ref HAL_PCD_CONNECT_CB_ID USB PCD Connect callback ID + * @arg @ref HAL_PCD_DISCONNECT_CB_ID OTG PCD Disconnect callback ID + * @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID + * @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + /* Setup Legacy weak Callbacks */ + if (hpcd->State == HAL_PCD_STATE_READY) + { + switch (CallbackID) + { + case HAL_PCD_SOF_CB_ID : + hpcd->SOFCallback = HAL_PCD_SOFCallback; + break; + + case HAL_PCD_SETUPSTAGE_CB_ID : + hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback; + break; + + case HAL_PCD_RESET_CB_ID : + hpcd->ResetCallback = HAL_PCD_ResetCallback; + break; + + case HAL_PCD_SUSPEND_CB_ID : + hpcd->SuspendCallback = HAL_PCD_SuspendCallback; + break; + + case HAL_PCD_RESUME_CB_ID : + hpcd->ResumeCallback = HAL_PCD_ResumeCallback; + break; + + case HAL_PCD_CONNECT_CB_ID : + hpcd->ConnectCallback = HAL_PCD_ConnectCallback; + break; + + case HAL_PCD_DISCONNECT_CB_ID : + hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback; + break; + + case HAL_PCD_MSPINIT_CB_ID : + hpcd->MspInitCallback = HAL_PCD_MspInit; + break; + + case HAL_PCD_MSPDEINIT_CB_ID : + hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; + break; + + default : + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (hpcd->State == HAL_PCD_STATE_RESET) + { + switch (CallbackID) + { + case HAL_PCD_MSPINIT_CB_ID : + hpcd->MspInitCallback = HAL_PCD_MspInit; + break; + + case HAL_PCD_MSPDEINIT_CB_ID : + hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; + break; + + default : + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + return status; +} + +/** + * @brief Register USB PCD Data OUT Stage Callback + * To be used instead of the weak HAL_PCD_DataOutStageCallback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD Data OUT Stage Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, pPCD_DataOutStageCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->DataOutStageCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief UnRegister the USB PCD Data OUT Stage Callback + * USB PCD Data OUT Stage Callback is redirected to the weak HAL_PCD_DataOutStageCallback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback; /* Legacy weak DataOutStageCallback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Register USB PCD Data IN Stage Callback + * To be used instead of the weak HAL_PCD_DataInStageCallback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD Data IN Stage Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, pPCD_DataInStageCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->DataInStageCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief UnRegister the USB PCD Data IN Stage Callback + * USB PCD Data OUT Stage Callback is redirected to the weak HAL_PCD_DataInStageCallback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback; /* Legacy weak DataInStageCallback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Register USB PCD Iso OUT incomplete Callback + * To be used instead of the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD Iso OUT incomplete Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, pPCD_IsoOutIncpltCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->ISOOUTIncompleteCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief UnRegister the USB PCD Iso OUT incomplete Callback + * USB PCD Iso OUT incomplete Callback is redirected to the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback; /* Legacy weak ISOOUTIncompleteCallback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Register USB PCD Iso IN incomplete Callback + * To be used instead of the weak HAL_PCD_ISOINIncompleteCallback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD Iso IN incomplete Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, pPCD_IsoInIncpltCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->ISOINIncompleteCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief UnRegister the USB PCD Iso IN incomplete Callback + * USB PCD Iso IN incomplete Callback is redirected to the weak HAL_PCD_ISOINIncompleteCallback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback; /* Legacy weak ISOINIncompleteCallback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Register USB PCD LPM Callback + * To be used instead of the weak HAL_PCDEx_LPM_Callback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD LPM Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->LPMCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief UnRegister the USB PCD LPM Callback + * USB LPM Callback is redirected to the weak HAL_PCDEx_LPM_Callback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->LPMCallback = HAL_PCDEx_LPM_Callback; /* Legacy weak HAL_PCDEx_LPM_Callback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup PCD_Exported_Functions_Group2 Input and Output operation functions + * @brief Data transfers functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the PCD data + transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Start the USB device + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd) +{ + __HAL_LOCK(hpcd); + (void)USB_DevConnect(hpcd->Instance); + __HAL_PCD_ENABLE(hpcd); + __HAL_UNLOCK(hpcd); + return HAL_OK; +} + +/** + * @brief Stop the USB device. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd) +{ + __HAL_LOCK(hpcd); + __HAL_PCD_DISABLE(hpcd); + + if (USB_StopDevice(hpcd->Instance) != HAL_OK) + { + __HAL_UNLOCK(hpcd); + return HAL_ERROR; + } + + (void)USB_DevDisconnect(hpcd->Instance); + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +/** + * @brief Handles PCD interrupt request. + * @param hpcd PCD handle + * @retval HAL status + */ + + +void USBD_Setup_Process(PCD_HandleTypeDef *p_pcd ); + +void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) +{ + USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t i, ep_intr, epint, epnum; + uint32_t fifoemptymsk, temp; + USB_OTG_EPTypeDef *ep; + + /* ensure that we are in device mode */ + if (USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE) + { + /* avoid spurious interrupt */ + if (__HAL_PCD_IS_INVALID_INTERRUPT(hpcd)) + { + return; + } + + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL)) + { + if (hpcd->Instance->GRXSTSR) + { + temp = hpcd->Instance->GRXSTSP; + ep = &(hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM]); + + if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT) + { + + if ((temp & USB_OTG_GRXSTSP_BCNT) != 0U) + { + (void)USB_ReadPacket(hpcd->Instance, ep->xfer_buff, + (uint16_t)((temp & USB_OTG_GRXSTSP_BCNT) >> 4)); + + ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + } + } + else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT) + { + (void)USB_ReadPacket(hpcd->Instance, (uint8_t *)hpcd->Setup, 8U); + ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + } + + else + { + /* ... */ + } + + } + } + + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT)) + { + epnum = 0U; + + /* Read in the device interrupt bits */ + ep_intr = USB_ReadDevAllOutEpInterrupt(hpcd->Instance); + + while (ep_intr != 0U) + { + if ((ep_intr & 0x1U) != 0U) + { + epint = USB_ReadDevOutEPInterrupt(hpcd->Instance, (uint8_t)epnum); + + if ((epint & USB_OTG_DOEPINT_XFRC) == USB_OTG_DOEPINT_XFRC) + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_XFRC); + (void)PCD_EP_OutXfrComplete_int(hpcd, epnum); // for EP0, it is normally received zero length byte + } + + if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) // setup completely + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); + CLEAR_OUT_EP_INTR(0, USB_OTG_DOEPINT_STPKTRX); + USBD_Setup_Process(hpcd); + } + + if ((epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS) + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPDIS); + } + + /* Clear Status Phase Received interrupt */ + if ((epint & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR); + } + + /* Clear OUT NAK interrupt */ + if ((epint & USB_OTG_DOEPINT_NAK) == USB_OTG_DOEPINT_NAK) + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_NAK); + } + } + epnum++; + ep_intr >>= 1U; + } + } + + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IEPINT) ) + { + uint32_t epint, ep_intr, epnum; + + epnum = 0U; + + ep_intr = USB_ReadDevAllInEpInterrupt(hpcd->Instance); + + while (ep_intr != 0U) + { + if ((ep_intr & 0x1U) != 0U) /* In ITR */ + { + epint = USB_ReadDevInEPInterrupt(hpcd->Instance, (uint8_t)epnum); + + if ((epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC) + { + if (0 != epnum) + { + ( (USBD_HandleTypeDef*)(hpcd->pData))->pClass->DataIn(hpcd->pData, epnum); + } + CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_XFRC); + } + + if ((epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC) + { + CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_TOC); + } + if ((epint & USB_OTG_DIEPINT_ITTXFE) == USB_OTG_DIEPINT_ITTXFE) + { + CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_ITTXFE); + } + if ((epint & USB_OTG_DIEPINT_INEPNE) == USB_OTG_DIEPINT_INEPNE) + { + CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_INEPNE); + } + if ((epint & USB_OTG_DIEPINT_EPDISD) == USB_OTG_DIEPINT_EPDISD) + { + CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_EPDISD); + } + + } + epnum++; + ep_intr >>= 1U; + } + + } // process all IN EP events + + + /* Handle Resume Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT)) + { + /* Clear the Remote Wake-up Signaling */ + USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG; + __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT); + } + + /* Handle Suspend Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP)) + { + __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP); + } + + /* Handle Reset Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBRST)) + { + USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG; + (void)USB_FlushTxFifo(hpcd->Instance, 0x10U); // fifo num = 16 means all fifo + + for (i = 0U; i < hpcd->Init.dev_endpoints; i++) + { + USBx_INEP(i)->DIEPINT = 0x0009U; // completely and timeout interrupt enabled, TX empty interrupt enable will set in transfer function + USBx_INEP(i)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; + USBx_INEP(i)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + + USBx_OUTEP(i)->DOEPINT = 0x000EU; // transfer completely and setup phase done 0xFB7FU + USBx_OUTEP(i)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; + USBx_OUTEP(i)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + } + + USBx_DEVICE->DAINTMSK |= 0x10001U; // IN EP0 and Out EP0, for device EP inerrupt mask + + /* Set Default Address to 0 */ + USBx_DEVICE->DCFG &= ~USB_OTG_DCFG_DAD; + + USBx_DEVICE->DOEPMSK = USB_OTG_DOEPMSK_STUPM | + USB_OTG_DOEPMSK_XFRCM | + USB_OTG_DOEPMSK_OTEPSPRM ; //transfer completely, EP disabled, setup phase end, status phase received, NAK + + USBx_DEVICE->DIEPMSK = USB_OTG_DIEPMSK_XFRCM | USB_OTG_DIEPMSK_TOM; //transfer completely, EP disabled, timeout ? + + if (hpcd->Init.dma_enable == 1U) + { + USBx_OUTEP(0U)->DOEPDMA = (uint32_t)hpcd->Setup; + /* EP enable */ + USBx_OUTEP(0U)->DOEPCTL |= USB_OTG_DOEPCTL_EPENA | USB_OTG_DOEPCTL_USBAEP; + } + __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBRST); + } + + /* Handle Enumeration done Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE)) + { + (void)USB_ActivateSetup(hpcd->Instance); + hpcd->Init.speed = USB_GetDevSpeed(hpcd->Instance); + + /* Set USB Turnaround time */ + (void)USB_SetTurnaroundTime(hpcd->Instance, + HAL_RCC_GetHCLKFreq(), + (uint8_t)hpcd->Init.speed); + + HAL_PCD_ResetCallback(hpcd); + + __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE); + } + + } +} +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + + +/** + * @brief Data OUT stage callback. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval None + */ +__weak void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(epnum); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_DataOutStageCallback could be implemented in the user file + */ +} + +/** + * @brief Data IN stage callback + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval None + */ +__weak void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(epnum); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_DataInStageCallback could be implemented in the user file + */ +} +/** + * @brief Setup stage callback + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_SetupStageCallback could be implemented in the user file + */ +} + +/** + * @brief USB Start Of Frame callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_SOFCallback could be implemented in the user file + */ +} + +/** + * @brief USB Reset callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ResetCallback could be implemented in the user file + */ +} + +/** + * @brief Suspend event callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_SuspendCallback could be implemented in the user file + */ +} + +/** + * @brief Resume event callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ResumeCallback could be implemented in the user file + */ +} + +/** + * @brief Incomplete ISO OUT callback. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval None + */ +__weak void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(epnum); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ISOOUTIncompleteCallback could be implemented in the user file + */ +} + +/** + * @brief Incomplete ISO IN callback. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval None + */ +__weak void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(epnum); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ISOINIncompleteCallback could be implemented in the user file + */ +} + +/** + * @brief Connection event callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ConnectCallback could be implemented in the user file + */ +} + +/** + * @brief Disconnection event callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_DisconnectCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup PCD_Exported_Functions_Group3 Peripheral Control functions + * @brief management functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the PCD data + transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Connect the USB device + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd) +{ + __HAL_LOCK(hpcd); + (void)USB_DevConnect(hpcd->Instance); + __HAL_UNLOCK(hpcd); + return HAL_OK; +} + +/** + * @brief Disconnect the USB device. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd) +{ + __HAL_LOCK(hpcd); + (void)USB_DevDisconnect(hpcd->Instance); + __HAL_UNLOCK(hpcd); + return HAL_OK; +} + +/** + * @brief Set the USB Device address. + * @param hpcd PCD handle + * @param address new device address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address) +{ + __HAL_LOCK(hpcd); + hpcd->USB_Address = address; + (void)USB_SetDevAddress(hpcd->Instance, address); + __HAL_UNLOCK(hpcd); + return HAL_OK; +} +/** + * @brief Open and configure an endpoint. + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @param ep_mps endpoint max packet size + * @param ep_type endpoint type + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type) +{ + HAL_StatusTypeDef ret = HAL_OK; + PCD_EPTypeDef *ep; + + if ((ep_addr & 0x80U) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 1U; + } + else + { + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 0U; + } + + ep->num = ep_addr & EP_ADDR_MSK; + ep->maxpacket = ep_mps; + ep->type = ep_type; + + if (ep->is_in != 0U) + { + /* Assign a Tx FIFO */ + ep->tx_fifo_num = ep->num; + } + /* Set initial data PID. */ + if (ep_type == EP_TYPE_BULK) + { + ep->data_pid_start = 0U; + } + + __HAL_LOCK(hpcd); + (void)USB_ActivateEndpoint(hpcd->Instance, ep); + __HAL_UNLOCK(hpcd); + + return ret; +} + +/** + * @brief Deactivate an endpoint. + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + PCD_EPTypeDef *ep; + + if ((ep_addr & 0x80U) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 1U; + } + else + { + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 0U; + } + ep->num = ep_addr & EP_ADDR_MSK; + + __HAL_LOCK(hpcd); + (void)USB_DeactivateEndpoint(hpcd->Instance, ep); + __HAL_UNLOCK(hpcd); + return HAL_OK; +} + + +/** + * @brief Receive an amount of data. + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @param pBuf pointer to the reception buffer + * @param len amount of data to be received + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) +{ + PCD_EPTypeDef *ep; + + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + + /*setup and start the Xfer */ + ep->xfer_buff = pBuf; + ep->xfer_len = len; + ep->xfer_count = 0U; + ep->is_in = 0U; + ep->num = ep_addr & EP_ADDR_MSK; + + if (hpcd->Init.dma_enable == 1U) + { + ep->dma_addr = (uint32_t)pBuf; + } + + if ((ep_addr & EP_ADDR_MSK) == 0U) + { + (void)USB_EP0StartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable); + } + else + { + (void)USB_EPStartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable); + } + + return HAL_OK; +} + +/** + * @brief Get Received Data Size + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval Data Size + */ +uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + return hpcd->OUT_ep[ep_addr & EP_ADDR_MSK].xfer_count; +} +/** + * @brief Send an amount of data + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @param pBuf pointer to the transmission buffer + * @param len amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) +{ + PCD_EPTypeDef *ep; + + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + + /*setup and start the Xfer */ + ep->xfer_buff = pBuf; + ep->xfer_len = len; + ep->xfer_count = 0U; + ep->is_in = 1U; + ep->num = ep_addr & EP_ADDR_MSK; + + if (hpcd->Init.dma_enable == 1U) + { + ep->dma_addr = (uint32_t)pBuf; + } + + if ((ep_addr & EP_ADDR_MSK) == 0U) + { + (void)USB_EP0StartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable); + } + else + { + (void)USB_EPStartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable); + } + + return HAL_OK; +} + +/** + * @brief Set a STALL condition over an endpoint + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + PCD_EPTypeDef *ep; + + if (((uint32_t)ep_addr & EP_ADDR_MSK) > hpcd->Init.dev_endpoints) + { + return HAL_ERROR; + } + + if ((0x80U & ep_addr) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 1U; + } + else + { + ep = &hpcd->OUT_ep[ep_addr]; + ep->is_in = 0U; + } + + ep->is_stall = 1U; + ep->num = ep_addr & EP_ADDR_MSK; + + __HAL_LOCK(hpcd); + + (void)USB_EPSetStall(hpcd->Instance, ep); + if ((ep_addr & EP_ADDR_MSK) == 0U) + { + (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t)hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup); + } + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Clear a STALL condition over in an endpoint + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + PCD_EPTypeDef *ep; + + if (((uint32_t)ep_addr & 0x0FU) > hpcd->Init.dev_endpoints) + { + return HAL_ERROR; + } + + if ((0x80U & ep_addr) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 1U; + } + else + { + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 0U; + } + + ep->is_stall = 0U; + ep->num = ep_addr & EP_ADDR_MSK; + + __HAL_LOCK(hpcd); + (void)USB_EPClearStall(hpcd->Instance, ep); + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Flush an endpoint + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + __HAL_LOCK(hpcd); + + if ((ep_addr & 0x80U) == 0x80U) + { + (void)USB_FlushTxFifo(hpcd->Instance, (uint32_t)ep_addr & EP_ADDR_MSK); + } + else + { + (void)USB_FlushRxFifo(hpcd->Instance); + } + + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Activate remote wakeup signalling + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd) +{ + return (USB_ActivateRemoteWakeup(hpcd->Instance)); +} + +/** + * @brief De-activate remote wakeup signalling. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd) +{ + return (USB_DeActivateRemoteWakeup(hpcd->Instance)); +} + +/** + * @} + */ + +/** @defgroup PCD_Exported_Functions_Group4 Peripheral State functions + * @brief Peripheral State functions + * +@verbatim + =============================================================================== + ##### Peripheral State functions ##### + =============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the PCD handle state. + * @param hpcd PCD handle + * @retval HAL state + */ +PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd) +{ + return hpcd->State; +} + +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @addtogroup PCD_Private_Functions + * @{ + */ +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +/** + * @brief Check FIFO for the next packet to be loaded. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval HAL status + */ + HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum) +{ + USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; + uint32_t USBx_BASE = (uint32_t)USBx; + USB_OTG_EPTypeDef *ep; + uint32_t len; + uint32_t len32b; + uint32_t fifoemptymsk; + + ep = &hpcd->IN_ep[epnum]; + + if (ep->xfer_count > ep->xfer_len) + { + return HAL_ERROR; + } + + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + + len32b = (len + 3U) / 4U; + + while (((USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b) && + (ep->xfer_count < ep->xfer_len) && (ep->xfer_len != 0U)) + { + /* Write the FIFO */ + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + len32b = (len + 3U) / 4U; + + (void)USB_WritePacket(USBx, ep->xfer_buff, (uint8_t)epnum, (uint16_t)len, + (uint8_t)hpcd->Init.dma_enable); + + ep->xfer_buff += len; + ep->xfer_count += len; + } + + if (ep->xfer_len <= ep->xfer_count) + { + fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK)); + USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk; + } + + return HAL_OK; +} + + +/** + * @brief process EP OUT transfer complete interrupt. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval HAL status + */ + HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum) +{ + + if (hpcd->Init.dma_enable == 1U) + { + USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; + uint32_t USBx_BASE = (uint32_t)USBx; + + if (0 == epnum) + { + USBx_OUTEP(epnum)->DOEPDMA = (uint32_t)hpcd->Setup; + /* EP enable */ + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPENA | USB_OTG_DOEPCTL_USBAEP; + } + else + { + HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); + } + } + else + { + HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); + } + + return HAL_OK; +} + + +/** + * @brief process EP OUT setup packet received interrupt. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval HAL status + */ + HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum) +{ + USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t gSNPSiD = *(__IO uint32_t *)(&USBx->CID + 0x1U); + uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT; + + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); + } + + /* Inform the upper layer that a setup packet is available */ + HAL_PCD_SetupStageCallback(hpcd); + + return HAL_OK; +} +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + + +/** + * @} + */ +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ +#endif /* HAL_PCD_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT Aisinochip *****END OF FILE****/ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/HAL_PCD_EX.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/HAL_PCD_EX.c new file mode 100644 index 0000000000..28bcc53236 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/HAL_PCD_EX.c @@ -0,0 +1,203 @@ +/** + ****************************************************************************** + * @file ACM32H5xx_hal_pcd_ex.c + * @author MCD Application Team + * @brief PCD Extended HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the USB Peripheral Controller: + * + Extended features functions + * + ****************************************************************************** + * @attention + * + *

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

+ * + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "hal.h" + +/** @addtogroup ACM32H5xx_HAL_Driver + * @{ + */ + +/** @defgroup PCDEx PCDEx + * @brief PCD Extended HAL module driver + * @{ + */ + +#ifdef HAL_PCD_MODULE_ENABLED + +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup PCDEx_Exported_Functions PCDEx Exported Functions + * @{ + */ + +/** @defgroup PCDEx_Exported_Functions_Group1 Peripheral Control functions + * @brief PCDEx control functions + * +@verbatim + =============================================================================== + ##### Extended features functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Update FIFO configuration + +@endverbatim + * @{ + */ +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +/** + * @brief Set Tx FIFO + * @param hpcd PCD handle + * @param fifo The number of Tx fifo + * @param size Fifo size + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size) +{ + uint8_t i; + uint32_t Tx_Offset; + + /* TXn min size = 16 words. (n : Transmit FIFO index) + When a TxFIFO is not used, the Configuration should be as follows: + case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes) + --> Txm can use the space allocated for Txn. + case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes) + --> Txn should be configured with the minimum space of 16 words + The FIFO is used optimally when used TxFIFOs are allocated in the top + of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones. + When DMA is used 3n * FIFO locations should be reserved for internal DMA registers */ + + Tx_Offset = hpcd->Instance->GRXFSIZ; + + if (fifo == 0U) + { + hpcd->Instance->DIEPTXF0_HNPTXFSIZ = ((uint32_t)size << 16) | Tx_Offset; + } + else + { + Tx_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16; + for (i = 0U; i < (fifo - 1U); i++) + { + Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16); + } + + /* Multiply Tx_Size by 2 to get higher performance */ + hpcd->Instance->DIEPTXF[fifo - 1U] = ((uint32_t)size << 16) | Tx_Offset; + } + + return HAL_OK; +} + +/** + * @brief Set Rx FIFO + * @param hpcd PCD handle + * @param size Size of Rx fifo + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size) +{ + hpcd->Instance->GRXFSIZ = size; + + return HAL_OK; +} + +/** + * @brief Activate LPM feature. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd) +{ + USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; + + hpcd->lpm_active = 1U; + hpcd->LPM_State = LPM_L0; + USBx->GINTMSK |= USB_OTG_GINTMSK_LPMINTM; + USBx->GLPMCFG |= (USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL); + + return HAL_OK; +} + +/** + * @brief Deactivate LPM feature. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd) +{ + USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; + + hpcd->lpm_active = 0U; + USBx->GINTMSK &= ~USB_OTG_GINTMSK_LPMINTM; + USBx->GLPMCFG &= ~(USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL); + + return HAL_OK; +} + +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ + +/** + * @brief Send LPM message to user layer callback. + * @param hpcd PCD handle + * @param msg LPM message + * @retval HAL status + */ +__weak void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(msg); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCDEx_LPM_Callback could be implemented in the user file + */ +} + +/** + * @brief Send BatteryCharging message to user layer callback. + * @param hpcd PCD handle + * @param msg LPM message + * @retval HAL status + */ +__weak void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(msg); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCDEx_BCD_Callback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ +#endif /* HAL_PCD_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT Aisinochip *****END OF FILE****/ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/LL_USB.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/LL_USB.c new file mode 100644 index 0000000000..245c2b0980 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/LL_USB.c @@ -0,0 +1,2776 @@ +/** + ****************************************************************************** + * @file LL_usb.c + * @author MCD Application Team + * @brief USB Low Layer HAL module driver. + * + * This file provides firmware functions to manage the following + * functionalities of the USB Peripheral Controller: + * + Initialization/de-initialization functions + * + I/O operation functions + * + Peripheral Control functions + * + Peripheral State functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Fill parameters of Init structure in USB_OTG_CfgTypeDef structure. + + (#) Call USB_CoreInit() API to initialize the USB Core peripheral. + + (#) The upper HAL HCD/PCD driver will call the right routines for its internal processes. + + @endverbatim + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2024 Aisinochip. + * All rights reserved. + * + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "hal.h" + +/** @addtogroup ACM32H5xx_LL_USB_DRIVER + * @{ + */ + +#if defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +#if defined (USB_OTG_HS1) || defined (USB_OTG_HS2) +static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx); + +#ifdef USB_HS_PHYC +static HAL_StatusTypeDef USB_HS_PHYCInit(USB_OTG_GlobalTypeDef *USBx); +#endif + + +uint32_t Send_Array_32Align[256]; // 1024 bytes + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup USB_LL_Exported_Functions USB Low Layer Exported Functions + * @{ + */ + +/** @defgroup USB_LL_Exported_Functions_Group1 Initialization/de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization/de-initialization functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + + +/** + * @brief Initializes the USB Core + * @param USBx USB Instance + * @param cfg pointer to a USB_OTG_CfgTypeDef structure that contains + * the configuration information for the specified USBx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) +{ + HAL_StatusTypeDef ret; + uint32_t USBx_BASE = (uint32_t)USBx; + + if (cfg.phy_itface == USB_OTG_ULPI_PHY) + { + /* Init The ULPI Interface */ + USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL); + + USBx->GUSBCFG |= USB_OTG_GUSBCFG_ULPI_UTMI_SEL; + + USBx_DEVICE->DCFG |= BIT14; //XCVRDLY + + /* Select vbus source */ + USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); + if (cfg.use_external_vbus == 1U) + { + USBx->GUSBCFG |= USB_OTG_GUSBCFG_ULPIEVBUSD; + } + /* Reset after a PHY select */ + ret = USB_CoreReset(USBx); + + ret = HAL_OK; + } + + else if (cfg.phy_itface == USB_OTG_HS_EMBEDDED_PHY) + { + /* Init The UTMI Interface */ + USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL); //BIT6, 0 = USB 2.0 PHY, 1 = USB 1.1 PHY + + /* Select vbus source */ + USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); + + /* Select UTMI Interace */ + USBx->GUSBCFG &= ~USB_OTG_GUSBCFG_ULPI_UTMI_SEL; // BIT4, 0 = select UTMI, 1 = ULPI + + if(HCFG_60_MHZ == cfg.phy_cfg) // 8BIT-60M + { + USBx->GUSBCFG &= (~USB_OTG_GUSBCFG_PHYIF); // select 8BIT 60M PHY interface + } + else + { + USBx->GUSBCFG |= USB_OTG_GUSBCFG_PHYIF; // select 16BIT 30M PHY interface + } + + /* Reset after a PHY select */ + ret = USB_CoreReset(USBx); + + HAL_Delay(2U); // delay at least 1ms + if (cfg.dma_enable == 1U) + { + USBx->GAHBCFG |= USB_OTG_GAHBCFG_HBSTLEN_2; + USBx->GAHBCFG |= USB_OTG_GAHBCFG_DMAEN; + } + ret = HAL_OK; + } + else if (cfg.phy_itface == USB_OTG_EMBEDDED_PHY) + { + /* Init The UTMI Interface */ + USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL); //BIT6, 0 = USB 2.0 PHY, 1 = USB 1.1 PHY + + /* Select vbus source */ + USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); + + /* Select UTMI Interace */ + USBx->GUSBCFG &= ~USB_OTG_GUSBCFG_ULPI_UTMI_SEL; // BIT4, 0 = select UTMI, 1 = ULPI + + USBx->GUSBCFG |= USB_OTG_GUSBCFG_PHYSEL; // USB 1.1 PHY + + if(HCFG_60_MHZ == cfg.phy_cfg) // 8BIT-60M + { + USBx->GUSBCFG &= (~USB_OTG_GUSBCFG_PHYIF); // select 8BIT 60M PHY interface + } + else + { + USBx->GUSBCFG |= USB_OTG_GUSBCFG_PHYIF; // select 16BIT 30M PHY interface + } + + /* Reset after a PHY select */ + ret = USB_CoreReset(USBx); + + HAL_Delay(2U); // delay at least 1ms + ret = HAL_OK; + + } + else + { + ret = HAL_ERROR; + } + + if (cfg.dma_enable == 1U) + { + USBx->GAHBCFG |= USB_OTG_GAHBCFG_HBSTLEN_2; + USBx->GAHBCFG |= USB_OTG_GAHBCFG_DMAEN; + } + + return ret; +} + + + +/** + * @brief Set the USB turnaround time + * @param USBx USB Instance + * @param hclk: AHB clock frequency + * @retval USB turnaround time In PHY Clocks number + */ +HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, + uint32_t hclk, uint8_t speed) +{ + uint32_t UsbTrd; + + /* The USBTRD is configured according to the tables below, depending on AHB frequency + used by application. In the low AHB frequency range it is used to stretch enough the USB response + time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access + latency to the Data FIFO */ + if (speed == USBD_FS_SPEED) + { + UsbTrd = 0x08; // about 500ns, should < 625ns + } + else if (speed == USBD_HS_SPEED) + { + if (USBx->GUSBCFG & BIT3) + { + UsbTrd = USBD_HS_TRDT_VALUE_16BIT; // about 351ns, should < 400ns for device + } + else + { + UsbTrd = USBD_HS_TRDT_VALUE_8BIT; + } + + } + else + { + UsbTrd = USBD_DEFAULT_TRDT_VALUE; + } + + USBx->GUSBCFG &= ~USB_OTG_GUSBCFG_TRDT; + USBx->GUSBCFG |= (uint32_t)((UsbTrd << 10) & USB_OTG_GUSBCFG_TRDT); + + return HAL_OK; +} + +/** + * @brief USB_EnableGlobalInt + * Enables the controller's Global Int in the AHB Config reg + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx) +{ + USBx->GAHBCFG |= USB_OTG_GAHBCFG_GINT; + return HAL_OK; +} + +/** + * @brief USB_DisableGlobalInt + * Disable the controller's Global Int in the AHB Config reg + * @param USBx Selected device + * @retval HAL status +*/ +HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx) +{ + USBx->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT; + return HAL_OK; +} + +/** + * @brief USB_DisableGlobalInt + * Disable the controller's Global Int in the AHB Config reg + * @param USBx Selected device + * @retval HAL status +*/ +UINT32 USB_ReadRegGotgint(USB_OTG_GlobalTypeDef *USBx) +{ + return USBx->GOTGINT; +} + + +/** + * @brief USB_SetCurrentMode : Set functional mode + * @param USBx Selected device + * @param mode current core mode + * This parameter can be one of these values: + * @arg USB_DEVICE_MODE: Peripheral mode + * @arg USB_HOST_MODE: Host mode + * @arg USB_DRD_MODE: Dual Role Device mode + * @retval HAL status + */ +HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx, USB_OTG_ModeTypeDef mode) +{ + USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_FHMOD | USB_OTG_GUSBCFG_FDMOD); + + if (mode == USB_HOST_MODE) + { + if(USBx->GOTGCTL & USB_OTG_GOTGCTL_CURR_MODE) // Host Mode already + { + USBx->GUSBCFG |= USB_OTG_GUSBCFG_FHMOD; + } + else + { + USBx->GUSBCFG |= USB_OTG_GUSBCFG_FHMOD; + HAL_Delay(35U); // At least 25ms, set 35ms here + } + + } + else if (mode == USB_DEVICE_MODE) + { + if(USBx->GOTGCTL & USB_OTG_GOTGCTL_CURR_MODE) // Host Mode + { + USBx->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD; + HAL_Delay(35U); // At least 25ms, set 35ms here + } + else + { + USBx->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD; + } + + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @brief USB_DevInit : Initializes the USB_OTG controller registers + * for device mode + * @param USBx Selected device + * @param cfg pointer to a USB_OTG_CfgTypeDef structure that contains + * the configuration information for the specified USBx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) +{ + HAL_StatusTypeDef ret = HAL_OK; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t i; + + for (i = 0U; i < 15U; i++) + { + USBx->DIEPTXF[i] = 0U; + } + + /* VBUS Sensing setup */ + if (cfg.vbus_sensing_enable == 0U) + { + USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS; + + /* Deactivate VBUS Sensing B */ +// USBx->GCCFG &= ~USB_OTG_GCCFG_VBDEN; + + /* B-peripheral session valid override enable */ +// USBx->GOTGCTL |= USB_OTG_GOTGCTL_BVALOEN; +// USBx->GOTGCTL |= USB_OTG_GOTGCTL_BVALOVAL; + } + else + { + /* Enable HW VBUS sensing */ +// USBx->GCCFG |= USB_OTG_GCCFG_VBDEN; + } + + /* Device mode configuration */ + USBx_DEVICE->DCFG |= DCFG_FRAME_INTERVAL_80; + + if (cfg.phy_itface == USB_OTG_ULPI_PHY) + { + if (cfg.speed == USBD_HS_SPEED) + { + /* Set Core speed to High speed mode */ + (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH); + } + else + { + /* Set Core speed to Full speed mode */ + (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH_IN_FULL); + } + } + else if (cfg.phy_itface == USB_OTG_HS_EMBEDDED_PHY) + { + if (cfg.speed == USBD_HS_SPEED) + { + /* Set Core speed to High speed mode */ + (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH); + } + else + { + /* Set Core speed to Full speed mode */ + (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH_IN_FULL); + } + } + else + { + /* Set Core speed to Full speed mode */ + (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_FULL); + } + + /* Flush the FIFOs */ + if (USB_FlushTxFifo(USBx, 0x10U) != HAL_OK) /* all Tx FIFOs */ + { + ret = HAL_ERROR; + } + + if (USB_FlushRxFifo(USBx) != HAL_OK) + { + ret = HAL_ERROR; + } + + /* Clear all pending Device Interrupts */ + USBx_DEVICE->DIEPMSK = 0U; + USBx_DEVICE->DOEPMSK = 0U; + USBx_DEVICE->DAINTMSK = 0U; + + for (i = 0U; i < cfg.dev_endpoints; i++) + { + if ((USBx_INEP(i)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + if (i == 0U) + { + USBx_INEP(i)->DIEPCTL = USB_OTG_DIEPCTL_SNAK; + } + else + { + USBx_INEP(i)->DIEPCTL = USB_OTG_DIEPCTL_EPDIS | USB_OTG_DIEPCTL_SNAK; + } + } + else + { + USBx_INEP(i)->DIEPCTL = 0U; + } + + USBx_INEP(i)->DIEPTSIZ = 0U; + USBx_INEP(i)->DIEPINT = 0xFB7FU; + } + + for (i = 0U; i < cfg.dev_endpoints; i++) + { + if ((USBx_OUTEP(i)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + if (i == 0U) + { + USBx_OUTEP(i)->DOEPCTL = USB_OTG_DOEPCTL_SNAK; + } + else + { + USBx_OUTEP(i)->DOEPCTL = USB_OTG_DOEPCTL_EPDIS | USB_OTG_DOEPCTL_SNAK; + } + } + else + { + USBx_OUTEP(i)->DOEPCTL = 0U; + } + + USBx_OUTEP(i)->DOEPTSIZ = 0U; + USBx_OUTEP(i)->DOEPINT = 0xFB7FU; + } + + USBx_OUTEP(0U)->DOEPTSIZ = 0U; + USBx_OUTEP(0U)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); + USBx_OUTEP(0U)->DOEPTSIZ |= (1U * 8U); + USBx_OUTEP(0U)->DOEPTSIZ |= (1 << 29); + + /* Disable all interrupts. */ + USBx->GINTMSK = 0U; + + /* Clear any pending interrupts */ + USBx->GINTSTS = 0xBFFFFFFFU; + + + if (cfg.dma_enable == 0U) + { + USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM; // enable RX FIFO not empty interrupt + } + + /* Enable interrupts matching to the Device mode ONLY */ + USBx->GINTMSK |= USB_OTG_GINTMSK_USBRST | + USB_OTG_GINTMSK_ENUMDNEM | USB_OTG_GINTMSK_IEPINT | + USB_OTG_GINTMSK_OEPINT; //enable reset/enum done/out ep/in ep/rx fifo not empty + + if (cfg.vbus_sensing_enable == 1U) + { + USBx->GINTMSK |= (USB_OTG_GINTMSK_SRQIM | USB_OTG_GINTMSK_OTGINT); + } + + return ret; +} + +/** + * @brief USB_OTG_FlushTxFifo : Flush a Tx FIFO + * @param USBx Selected device + * @param num FIFO number + * This parameter can be a value from 1 to 15 + 15 means Flush all Tx FIFOs + * @retval HAL status + */ +HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num) +{ + uint32_t count = 0U; + + USBx->GRSTCTL = (USB_OTG_GRSTCTL_TXFFLSH | (num << 6)); + + do + { + if (++count > 200000U) + { + return HAL_TIMEOUT; + } + } + while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH); + + return HAL_OK; +} + +/** + * @brief USB_FlushRxFifo : Flush Rx FIFO + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t count = 0; + + USBx->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH; + + do + { + if (++count > 200000U) + { + return HAL_TIMEOUT; + } + } + while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH); + + return HAL_OK; +} + +/** + * @brief USB_SetDevSpeed Initializes the DevSpd field of DCFG register + * depending the PHY type and the enumeration speed of the device. + * @param USBx Selected device + * @param speed device speed + * This parameter can be one of these values: + * @arg USB_OTG_SPEED_HIGH: High speed mode + * @arg USB_OTG_SPEED_HIGH_IN_FULL: High speed core in Full Speed mode + * @arg USB_OTG_SPEED_FULL: Full speed mode + * @retval Hal status + */ +HAL_StatusTypeDef USB_SetDevSpeed(USB_OTG_GlobalTypeDef *USBx, uint8_t speed) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + USBx_DEVICE->DCFG |= speed; + return HAL_OK; +} + +/** + * @brief USB_GetDevSpeed Return the Dev Speed + * @param USBx Selected device + * @retval speed device speed + * This parameter can be one of these values: + * @arg PCD_SPEED_HIGH: High speed mode + * @arg PCD_SPEED_FULL: Full speed mode + */ +uint8_t USB_GetDevSpeed(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint8_t speed; + uint32_t DevEnumSpeed = USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD; + + if (DevEnumSpeed == DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ) + { + speed = USBD_HS_SPEED; + } + else if ((DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ) || + (DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_48MHZ)) + { + speed = USBD_FS_SPEED; + } + else + { + speed = 0xFU; + } + + return speed; +} + +/** + * @brief Activate and configure an endpoint + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_ActivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + + if (ep->is_in == 1U) + { + USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK)); + + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_USBAEP) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= (ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ) | + ((uint32_t)ep->type << 18) | (epnum << 22) | + USB_OTG_DIEPCTL_SD0PID_SEVNFRM | + USB_OTG_DIEPCTL_USBAEP; + } + } + else + { + USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16); + + if (((USBx_OUTEP(epnum)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0U) + { + USBx_OUTEP(epnum)->DOEPCTL |= (ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ) | + ((uint32_t)ep->type << 18) | + USB_OTG_DIEPCTL_SD0PID_SEVNFRM | + USB_OTG_DOEPCTL_USBAEP; + } + } + return HAL_OK; +} + +/** + * @brief Activate and configure a dedicated endpoint + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + + /* Read DEPCTLn register */ + if (ep->is_in == 1U) + { + if (((USBx_INEP(epnum)->DIEPCTL) & USB_OTG_DIEPCTL_USBAEP) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= (ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ) | + ((uint32_t)ep->type << 18) | (epnum << 22) | + USB_OTG_DIEPCTL_SD0PID_SEVNFRM | + USB_OTG_DIEPCTL_USBAEP; + } + + USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK)); + } + else + { + if (((USBx_OUTEP(epnum)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0U) + { + USBx_OUTEP(epnum)->DOEPCTL |= (ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ) | + ((uint32_t)ep->type << 18) | (epnum << 22) | + USB_OTG_DOEPCTL_USBAEP; + } + + USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16); + } + + return HAL_OK; +} + +/** + * @brief De-activate and de-initialize an endpoint + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + + /* Read DEPCTLn register */ + if (ep->is_in == 1U) + { + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; + } + + USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); + USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); + USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_USBAEP | + USB_OTG_DIEPCTL_MPSIZ | + USB_OTG_DIEPCTL_TXFNUM | + USB_OTG_DIEPCTL_SD0PID_SEVNFRM | + USB_OTG_DIEPCTL_EPTYP); + } + else + { + if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; + } + + USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); + USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); + USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_USBAEP | + USB_OTG_DOEPCTL_MPSIZ | + USB_OTG_DOEPCTL_SD0PID_SEVNFRM | + USB_OTG_DOEPCTL_EPTYP); + } + + return HAL_OK; +} + +/** + * @brief De-activate and de-initialize a dedicated endpoint + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + + /* Read DEPCTLn register */ + if (ep->is_in == 1U) + { + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; + } + + USBx_INEP(epnum)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP; + USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); + } + else + { + if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; + } + + USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; + USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); + } + + return HAL_OK; +} + + +HAL_StatusTypeDef USB_EPIntEnable(USB_OTG_GlobalTypeDef *USBx, uint8_t ep_addr) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint8_t ep_num=(ep_addr&EP_ADDR_MSK); + + if (ep_addr&(1<<7)) //ep in + { + USBx_DEVICE->DAINTMSK |= (1<DAINTMSK |= (1<<(16+ep_num)); + } + + return HAL_OK; +} + + +HAL_StatusTypeDef USB_EPIntDisable(USB_OTG_GlobalTypeDef *USBx, uint8_t ep_addr) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint8_t ep_num=(ep_addr&EP_ADDR_MSK); + + if (ep_addr&(1<<7)) //ep in + { + USBx_DEVICE->DAINTMSK &= ~(1<DAINTMSK &= ~(1<<(16+ep_num)); + } + + return HAL_OK; +} + + +/** + * @brief USB_EPStartXfer : setup and starts a transfer over an EP + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @param dma USB dma enabled or disabled + * This parameter can be one of these values: + * 0 : DMA feature not used + * 1 : DMA feature used + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep, uint8_t dma) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + uint16_t pktcnt; + + /* IN endpoint */ + if (ep->is_in == 1U) + { + /* Zero Length Packet? */ + if (ep->xfer_len == 0U) + { + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); + USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); + } + else + { + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet + * exist ? 1 : 0) + */ + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); + USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (((ep->xfer_len + ep->maxpacket - 1U) / ep->maxpacket) << 19)); + USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len); + + if (ep->type == EP_TYPE_ISOC) + { + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_MULCNT); + USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & (1U << 29)); + } + } + + if (dma == 1U) + { + if ((uint32_t)ep->dma_addr != 0U) + { + USBx_INEP(epnum)->DIEPDMA = (uint32_t)(ep->dma_addr); + } + + if (ep->type == EP_TYPE_ISOC) + { + if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; + } + else + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + } + } + + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + } + else + { + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + + if (ep->type != EP_TYPE_ISOC) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0U) + { + USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK); + } + } + else + { + if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; + } + else + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + } + + (void)USB_WritePacket(USBx, ep->xfer_buff, ep->num, (uint16_t)ep->xfer_len, dma); + } + } + } + else /* OUT endpoint */ + { + /* Program the transfer size and packet count as follows: + * pktcnt = N + * xfersize = N * maxpacket + */ + USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ); + USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT); + + if (ep->xfer_len == 0U) + { + USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & ep->maxpacket); + USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); + } + else + { + pktcnt = (uint16_t)((ep->xfer_len + ep->maxpacket - 1U) / ep->maxpacket); + USBx_OUTEP(epnum)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_PKTCNT & ((uint32_t)pktcnt << 19); + USBx_OUTEP(epnum)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_XFRSIZ & (ep->maxpacket * pktcnt); + } + + if (dma == 1U) + { + if ((uint32_t)ep->xfer_buff != 0U) + { + USBx_OUTEP(epnum)->DOEPDMA = (uint32_t)(ep->xfer_buff); + } + } + + if (ep->type == EP_TYPE_ISOC) + { + if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SODDFRM; + } + else + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; + } + } + /* EP enable */ + USBx_OUTEP(epnum)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA); + } + + return HAL_OK; +} + +/** + * @brief USB_EP0StartXfer : setup and starts a transfer over the EP 0 + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @param dma USB dma enabled or disabled + * This parameter can be one of these values: + * 0 : DMA feature not used + * 1 : DMA feature used + * @retval HAL status + */ +HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep, uint8_t dma) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + + /* IN endpoint */ + if (ep->is_in == 1U) + { + /* Zero Length Packet? */ + if (ep->xfer_len == 0U) + { + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); + USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); + } + else + { + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet + * exist ? 1 : 0) + */ + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); + + if (ep->xfer_len > ep->maxpacket) + { + ep->xfer_len = ep->maxpacket; + } + USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); + USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len); + } + + { + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + + + + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0U) + { + USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK); + } + } + } + else /* OUT endpoint */ + { + /* Program the transfer size and packet count as follows: + * pktcnt = N + * xfersize = N * maxpacket + */ + USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ); + USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT); + + if (ep->xfer_len > 0U) + { + ep->xfer_len = ep->maxpacket; + } + + USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); + USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & (ep->maxpacket)); + + /* EP enable */ + USBx_OUTEP(epnum)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA); + } + + return HAL_OK; +} + +/** + * @brief USB_WritePacket : Writes a packet into the Tx FIFO associated + * with the EP/channel + * @param USBx Selected device + * @param src pointer to source buffer + * @param ch_ep_num endpoint or host channel number + * @param len Number of bytes to write + * @param dma USB dma enabled or disabled + * This parameter can be one of these values: + * 0 : DMA feature not used + * 1 : DMA feature used + * @retval HAL status + */ +HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uint8_t ch_ep_num, uint16_t len, uint8_t dma) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t *pSrc = (uint32_t *)src; + uint32_t count32b, i; + + if (dma == 0U) + { + count32b = ((uint32_t)len + 3U) / 4U; + for (i = 0U; i < count32b; i++) + { + USBx_DFIFO((uint32_t)ch_ep_num) = __UNALIGNED_UINT32_READ(pSrc); + pSrc++; + } + } + + return HAL_OK; +} + +/** + * @brief USB_ReadPacket : read a packet from the RX FIFO + * @param USBx Selected device + * @param dest source pointer + * @param len Number of bytes to read + * @retval pointer to destination buffer + */ +void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t *pDest = (uint32_t *)dest; + uint32_t i; + uint32_t count32b = ((uint32_t)len + 3U) / 4U; + + for (i = 0U; i < count32b; i++) + { + __UNALIGNED_UINT32_WRITE(pDest, USBx_DFIFO(0U)); + pDest++; + } + + return ((void *)pDest); +} + +/** + * @brief USB_EPSetStall : set a stall condition over an EP + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPSetStall(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + + if (ep->is_in == 1U) + { + if (((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == 0U) && (epnum != 0U)) + { + USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_EPDIS); + } + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_STALL; + } + else + { + if (((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == 0U) && (epnum != 0U)) + { + USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_EPDIS); + } + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_STALL; + } + + return HAL_OK; +} + +/** + * @brief USB_EPClearStall : Clear a stall condition over an EP + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPClearStall(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + + if (ep->is_in == 1U) + { + USBx_INEP(epnum)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; + if ((ep->type == EP_TYPE_INTR) || (ep->type == EP_TYPE_BULK)) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; /* DATA0 */ + } + } + else + { + USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; + if ((ep->type == EP_TYPE_INTR) || (ep->type == EP_TYPE_BULK)) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; /* DATA0 */ + } + } + return HAL_OK; +} + +/** + * @brief USB_StopDevice : Stop the usb device mode + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx) +{ + HAL_StatusTypeDef ret; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t i; + + /* Clear Pending interrupt */ + for (i = 0U; i < 15U; i++) + { + USBx_INEP(i)->DIEPINT = 0xFB7FU; + USBx_OUTEP(i)->DOEPINT = 0xFB7FU; + } + + /* Clear interrupt masks */ + USBx_DEVICE->DIEPMSK = 0U; + USBx_DEVICE->DOEPMSK = 0U; + USBx_DEVICE->DAINTMSK = 0U; + + /* Flush the FIFO */ + ret = USB_FlushRxFifo(USBx); + if (ret != HAL_OK) + { + return ret; + } + + ret = USB_FlushTxFifo(USBx, 0x10U); + if (ret != HAL_OK) + { + return ret; + } + + return ret; +} + +/** + * @brief USB_SetDevAddress : Stop the usb device mode + * @param USBx Selected device + * @param address new device address to be assigned + * This parameter can be a value from 0 to 255 + * @retval HAL status + */ +HAL_StatusTypeDef USB_SetDevAddress(USB_OTG_GlobalTypeDef *USBx, uint8_t address) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + USBx_DEVICE->DCFG &= ~(USB_OTG_DCFG_DAD); + USBx_DEVICE->DCFG |= ((uint32_t)address << 4) & USB_OTG_DCFG_DAD; + + return HAL_OK; +} + + +/** + * @brief USB_SetTestMode : Set Test mode, used in eye pattern test in HS Mode + * @param USBx Selected device + * @param register value + * @retval HAL status + */ +HAL_StatusTypeDef USB_SetTestMode(USB_OTG_GlobalTypeDef *USBx, uint32_t value) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + USBx_DEVICE->DCTL = value; + + return HAL_OK; +} + +/** + * @brief USB_DevConnect : Connect the USB device by enabling the pull-up/pull-down + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DevConnect(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_SDIS; +// HAL_Delay(3U); + + HAL_SimpleDelay(100); + + return HAL_OK; +} + +/** + * @brief USB_DevDisconnect : Disconnect the USB device by disabling the pull-up/pull-down + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DevDisconnect(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS; +// HAL_Delay(3U); + HAL_SimpleDelay(1000); + + return HAL_OK; +} + +/** + * @brief USB_ReadInterrupts: return the global USB interrupt status + * @param USBx Selected device + * @retval HAL status + */ +uint32_t USB_ReadInterrupts(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t tmpreg; + + tmpreg = USBx->GINTSTS; + tmpreg &= USBx->GINTMSK; + + return tmpreg; +} +/** + * @brief USB_ReadInterrupts: return the global USB interrupt status + * @param USBx Selected device + * @retval HAL status + */ +uint32_t USB_ReadIntSts(USB_OTG_GlobalTypeDef *USBx) +{ + return USBx->GINTSTS; +} + + +/** + * @brief USB_ReadDevAllOutEpInterrupt: return the USB device OUT endpoints interrupt status + * @param USBx Selected device + * @retval HAL status + */ +uint32_t USB_ReadDevDctl(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + return USBx_DEVICE->DCTL; +} + + + +/** + * @brief USB_ReadDevAllOutEpInterrupt: return the USB device OUT endpoints interrupt status + * @param USBx Selected device + * @retval HAL status + */ +uint32_t USB_ReadDevAllOutEpInterrupt(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t tmpreg; + + tmpreg = USBx_DEVICE->DAINT; + tmpreg &= USBx_DEVICE->DAINTMSK; + + return ((tmpreg & 0xffff0000U) >> 16); +} + +/** + * @brief USB_ReadDevAllInEpInterrupt: return the USB device IN endpoints interrupt status + * @param USBx Selected device + * @retval HAL status + */ +uint32_t USB_ReadDevAllInEpInterrupt(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t tmpreg; + + tmpreg = USBx_DEVICE->DAINT; + tmpreg &= USBx_DEVICE->DAINTMSK; + + return ((tmpreg & 0xFFFFU)); +} + + +/** + * @brief Returns Device OUT EP Interrupt register + * @param USBx Selected device + * @param epnum endpoint number + * This parameter can be a value from 0 to 15 + * @retval Device OUT EP Interrupt register + */ +uint32_t USB_ReadDevOutEPInterrupt(USB_OTG_GlobalTypeDef *USBx, uint8_t epnum) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t tmpreg; + + tmpreg = USBx_OUTEP((uint32_t)epnum)->DOEPINT; +// tmpreg &= USBx_DEVICE->DOEPMSK; + + return tmpreg; +} + +/** + * @brief Returns Device IN EP Interrupt register + * @param USBx Selected device + * @param epnum endpoint number + * This parameter can be a value from 0 to 15 + * @retval Device IN EP Interrupt register + */ +uint32_t USB_ReadDevInEPInterrupt(USB_OTG_GlobalTypeDef *USBx, uint8_t epnum) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t tmpreg, msk, emp; + +// msk = USBx_DEVICE->DIEPMSK; +// emp = USBx_DEVICE->DIEPEMPMSK; +// msk |= ((emp >> (epnum & EP_ADDR_MSK)) & 0x1U) << 7; +// tmpreg = USBx_INEP((uint32_t)epnum)->DIEPINT & msk; + + tmpreg = USBx_INEP((uint32_t)epnum)->DIEPINT; + return tmpreg; +} + +/** + * @brief USB_ClearInterrupts: clear a USB interrupt + * @param USBx Selected device + * @param interrupt interrupt flag + * @retval None + */ +void USB_ClearInterrupts(USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt) +{ + USBx->GINTSTS |= interrupt; +} + +/** + * @brief Returns USB core mode + * @param USBx Selected device + * @retval return core mode : Host or Device + * This parameter can be one of these values: + * 0 : Host + * 1 : Device + */ +uint32_t USB_GetMode(USB_OTG_GlobalTypeDef *USBx) +{ + return ((USBx->GINTSTS) & 0x1U); +} + +/** + * @brief Activate EP0 for Setup transactions + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_ActivateSetup(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + /* Set the MPS of the IN EP0 to 64 bytes */ + USBx_INEP(0U)->DIEPCTL &= ~USB_OTG_DIEPCTL_MPSIZ; + + USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGINAK; + + return HAL_OK; +} + +/** + * @brief Prepare the EP0 to start the first control setup + * @param USBx Selected device + * @param dma USB dma enabled or disabled + * This parameter can be one of these values: + * 0 : DMA feature not used + * 1 : DMA feature used + * @param psetup pointer to setup packet + * @retval HAL status + */ +HAL_StatusTypeDef USB_EP0_OutStart(USB_OTG_GlobalTypeDef *USBx, uint8_t dma, uint8_t *psetup) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + return HAL_OK; +} + +/** + * @brief Reset the USB Core (needed after USB clock settings change) + * @param USBx Selected device + * @retval HAL status + */ +static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t count = 0U; + + /* Wait for AHB master IDLE state. */ + do + { + if (++count > 200000U) + { + return HAL_TIMEOUT; + } + } + while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); + + /* Core Soft Reset */ + count = 0U; + USBx->GRSTCTL |= USB_OTG_GRSTCTL_CSRST; + + do + { + if (++count > 200000U) + { + return HAL_TIMEOUT; + } + } + while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST); + + return HAL_OK; +} + +#ifdef USB_HS_PHYC +/** + * @brief Enables control of a High Speed USB PHY’s + * Init the low level hardware : GPIO, CLOCK, NVIC... + * @param USBx Selected device + * @retval HAL status + */ +static HAL_StatusTypeDef USB_HS_PHYCInit(USB_OTG_GlobalTypeDef *USBx) +{ + UNUSED(USBx); + uint32_t count = 0U; + + /* Enable LDO */ + USB_HS_PHYC->USB_HS_PHYC_LDO |= USB_HS_PHYC_LDO_ENABLE; + + /* wait for LDO Ready */ + while ((USB_HS_PHYC->USB_HS_PHYC_LDO & USB_HS_PHYC_LDO_STATUS) == 0U) + { + if (++count > 200000U) + { + return HAL_TIMEOUT; + } + } + + /* Controls PHY frequency operation selection */ + if (HSE_VALUE == 12000000U) /* HSE = 12MHz */ + { + USB_HS_PHYC->USB_HS_PHYC_PLL = (0x0U << 1); + } + else if (HSE_VALUE == 12500000U) /* HSE = 12.5MHz */ + { + USB_HS_PHYC->USB_HS_PHYC_PLL = (0x2U << 1); + } + else if (HSE_VALUE == 16000000U) /* HSE = 16MHz */ + { + USB_HS_PHYC->USB_HS_PHYC_PLL = (0x3U << 1); + } + else if (HSE_VALUE == 24000000U) /* HSE = 24MHz */ + { + USB_HS_PHYC->USB_HS_PHYC_PLL = (0x4U << 1); + } + else if (HSE_VALUE == 25000000U) /* HSE = 25MHz */ + { + USB_HS_PHYC->USB_HS_PHYC_PLL = (0x5U << 1); + } + else if (HSE_VALUE == 32000000U) /* HSE = 32MHz */ + { + USB_HS_PHYC->USB_HS_PHYC_PLL = (0x7U << 1); + } + else + { + /* ... */ + } + + /* Control the tuning interface of the High Speed PHY */ + USB_HS_PHYC->USB_HS_PHYC_TUNE |= USB_HS_PHYC_TUNE_VALUE; + + /* Enable PLL internal PHY */ + USB_HS_PHYC->USB_HS_PHYC_PLL |= USB_HS_PHYC_PLL_PLLEN; + + /* 2ms Delay required to get internal phy clock stable */ + HAL_Delay(2U); + + return HAL_OK; +} + +#endif /* USB_HS_PHYC */ +/** + * @brief USB_HostInit : Initializes the USB OTG controller registers + * for Host mode + * @param USBx Selected device + * @param cfg pointer to a USB_OTG_CfgTypeDef structure that contains + * the configuration information for the specified USBx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t i; + + /* Restart the Phy Clock */ + USBx_PCGCCTL = 0U; + + if (cfg.speed == USBH_FSLS_SPEED) + { + /* Force Device Enumeration to FS/LS mode only */ + USBx_HOST->HCFG |= USB_OTG_HCFG_FSLSS; + } + else + { + /* Set default Max speed support */ + USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSS); + } + +// uart_printf("HCFG:0x%x\n", USBx_HOST->HCFG ); + + /* Make sure the FIFOs are flushed. */ + (void)USB_FlushTxFifo(USBx, 0x10U); /* all Tx FIFOs */ + (void)USB_FlushRxFifo(USBx); + + /* Clear all pending HC Interrupts */ + for (i = 0U; i < cfg.Host_channels; i++) + { + USBx_HC(i)->HCINT = 0xFFFFFFFFU; + USBx_HC(i)->HCINTMSK = 0U; + } + + + /* Enable VBUS driving */ + (void)USB_DriveVbus(USBx, 1U); + + HAL_Delay(200U); + + /* Disable all interrupts. */ + USBx->GINTMSK = 0U; + + /* Clear any pending interrupts */ + USBx->GINTSTS = 0xFFFFFFFFU; + + { + /* set Rx FIFO size */ + USBx->GRXFSIZ = 0x200U; + USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t)(((0x100U << 16) & USB_OTG_NPTXFD) | 0x200U); + USBx->HPTXFSIZ = (uint32_t)(((0xE0U << 16) & USB_OTG_HPTXFSIZ_PTXFD) | 0x300U); + } + + /* Enable the common interrupts */ + if (cfg.dma_enable == 0U) + { + USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM; + } + +#if 0 + /* Enable interrupts matching to the Host mode ONLY */ + USBx->GINTMSK |= (USB_OTG_GINTMSK_PRTIM | USB_OTG_GINTMSK_HCIM | \ + USB_OTG_GINTSTS_DISCINT | \ + USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM); +#else + /* Enable interrupts matching to the Host mode ONLY */ + USBx->GINTMSK |= (USB_OTG_GINTMSK_PRTIM | USB_OTG_GINTMSK_HCIM | \ + USB_OTG_GINTMSK_SOFM | USB_OTG_GINTSTS_DISCINT | \ + USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM); +#endif + + return HAL_OK; +} + +/** + * @brief USB_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the + * HCFG register on the PHY type and set the right frame interval + * @param USBx Selected device + * @param freq clock frequency + * This parameter can be one of these values: + * HCFG_48_MHZ : Full Speed 48 MHz Clock + * HCFG_6_MHZ : Low Speed 6 MHz Clock + * @retval HAL status + */ +HAL_StatusTypeDef USB_InitFSLSPClkSel(USB_OTG_GlobalTypeDef *USBx, uint8_t freq) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSPCS); + USBx_HOST->HCFG |= (uint32_t)freq & USB_OTG_HCFG_FSLSPCS; + + if (freq == HCFG_48_MHZ) + { + USBx_HOST->HFIR = 48000U | (1<<16); + } + else if (freq == HCFG_6_MHZ) + { + USBx_HOST->HFIR = 6000U; + } + else + { + /* ... */ + } + + return HAL_OK; +} + +/** +* @brief USB_OTG_ResetPort : Reset Host Port + * @param USBx Selected device + * @retval HAL status + * @note (1)The application must wait at least 10 ms + * before clearing the reset bit. + */ +HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + __IO uint32_t hprt0 = 0U; + + hprt0 = USBx_HPRT0; + + hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | + USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG); + + USBx_HPRT0 = (USB_OTG_HPRT_PRST | hprt0); + HAL_Delay(100U); /* See Note #1 */ + USBx_HPRT0 = ((~USB_OTG_HPRT_PRST) & hprt0); + HAL_Delay(10U); + + return HAL_OK; +} + +/** +* @brief USB_SuspPort : Suspend Host Port + * @param USBx Selected device + * @retval HAL status + * @note (1) Set the host port enter suspend mode, host will stop send + * sof/keep-alive + */ +HAL_StatusTypeDef USB_SuspPort(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + __IO uint32_t hprt0 = 0U; + + hprt0 = USBx_HPRT0; + + hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | + USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG); + + USBx_HPRT0 = (USB_OTG_HPRT_PSUSP | hprt0); + + return HAL_OK; +} + +/** +* @brief device request HNP + * @param USBx Selected device + * @retval HAL status + * @note (1) + * + */ +HAL_StatusTypeDef USB_DevReqHnp(USB_OTG_GlobalTypeDef *USBx) +{ + USBx->GOTGCTL |= USB_OTG_GOTGCTL_HNPRQ; + + return HAL_OK; +} + +/** +* @brief device request SRP + * @param USBx Selected device + * @retval HAL status + * @note (1) + * + */ +HAL_StatusTypeDef USB_DevReqSrp(USB_OTG_GlobalTypeDef *USBx) +{ + USBx->GUSBCFG |= USB_OTG_GUSBCFG_SRPCAP; + USBx->GOTGCTL |= USB_OTG_GOTGCTL_SRQ; + + return HAL_OK; +} + +/** +* @brief Host enable HNP + * @param USBx Selected device + * @retval HAL status + * @note (1) + * + */ +HAL_StatusTypeDef USB_HstEnHnp(USB_OTG_GlobalTypeDef *USBx) +{ + USBx->GUSBCFG |= USB_OTG_GUSBCFG_HNPCAP; + USBx->GOTGCTL |= USB_OTG_GOTGCTL_HSHNPEN; + + return HAL_OK; +} + +/** +* @brief Host enable HNP + * @param USBx Selected device + * @retval HAL status + * @note (1) + * + */ +HAL_StatusTypeDef USB_DevEnHnp(USB_OTG_GlobalTypeDef *USBx) +{ + USBx->GUSBCFG |= USB_OTG_GUSBCFG_HNPCAP; + USBx->GOTGCTL |= USB_OTG_GOTGCTL_DHNPEN; + + return HAL_OK; +} + +/** + * @brief USB_DriveVbus : activate or de-activate vbus + * @param state VBUS state + * This parameter can be one of these values: + * 0 : VBUS Active + * 1 : VBUS Inactive + * @retval HAL status +*/ +HAL_StatusTypeDef USB_DriveVbus(USB_OTG_GlobalTypeDef *USBx, uint8_t state) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + __IO uint32_t hprt0 = 0U; + + hprt0 = USBx_HPRT0; + + hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | + USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG); + + if (((hprt0 & USB_OTG_HPRT_PPWR) == 0U) && (state == 1U)) + { + USBx_HPRT0 = (USB_OTG_HPRT_PPWR | hprt0); + } + if (((hprt0 & USB_OTG_HPRT_PPWR) == USB_OTG_HPRT_PPWR) && (state == 0U)) + { + USBx_HPRT0 = ((~USB_OTG_HPRT_PPWR) & hprt0); + } + return HAL_OK; +} + +/** + * @brief Return Host Core speed + * @param USBx Selected device + * @retval speed : Host speed + * This parameter can be one of these values: + * @arg HCD_SPEED_HIGH: High speed mode + * @arg HCD_SPEED_FULL: Full speed mode + * @arg HCD_SPEED_LOW: Low speed mode + */ +uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + __IO uint32_t hprt0 = 0U; + + hprt0 = USBx_HPRT0; + return ((hprt0 & USB_OTG_HPRT_PSPD) >> 17); +} + +/** + * @brief Return Host Current Frame number + * @param USBx Selected device + * @retval current frame number +*/ +uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + return (USBx_HOST->HFNUM & USB_OTG_HFNUM_FRNUM); +} + +/** + * @brief Initialize a host channel + * @param USBx Selected device + * @param ch_num Channel number + * This parameter can be a value from 1 to 15 + * @param epnum Endpoint number + * This parameter can be a value from 1 to 15 + * @param dev_address Current device address + * This parameter can be a value from 0 to 255 + * @param speed Current device speed + * This parameter can be one of these values: + * @arg USB_OTG_SPEED_HIGH: High speed mode + * @arg USB_OTG_SPEED_FULL: Full speed mode + * @arg USB_OTG_SPEED_LOW: Low speed mode + * @param ep_type Endpoint Type + * This parameter can be one of these values: + * @arg EP_TYPE_CTRL: Control type + * @arg EP_TYPE_ISOC: Isochronous type + * @arg EP_TYPE_BULK: Bulk type + * @arg EP_TYPE_INTR: Interrupt type + * @param mps Max Packet Size + * This parameter can be a value from 0 to32K + * @retval HAL state + */ +HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, + uint8_t ch_num, + uint8_t epnum, + uint8_t dev_address, + uint8_t speed, + uint8_t ep_type, + uint16_t mps) +{ + HAL_StatusTypeDef ret = HAL_OK; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t HCcharEpDir, HCcharLowSpeed; + + /* Clear old interrupt conditions for this host channel. */ + USBx_HC((uint32_t)ch_num)->HCINT = 0xFFFFFFFFU; + + /* Enable channel interrupts required for this transfer. */ + switch (ep_type) + { + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM | + USB_OTG_HCINTMSK_STALLM | + USB_OTG_HCINTMSK_TXERRM | + USB_OTG_HCINTMSK_DTERRM | + USB_OTG_HCINTMSK_AHBERR | + USB_OTG_HCINTMSK_NAKM; + + if ((epnum & 0x80U) == 0x80U) + { + USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM; + } + else + { +// if ((USBx->CID & (0x1U << 8)) != 0U) + { + USBx_HC((uint32_t)ch_num)->HCINTMSK |= (USB_OTG_HCINTMSK_NYET | USB_OTG_HCINTMSK_ACKM); + } + } + break; + + case EP_TYPE_INTR: + USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM | + USB_OTG_HCINTMSK_STALLM | + USB_OTG_HCINTMSK_TXERRM | + USB_OTG_HCINTMSK_DTERRM | + USB_OTG_HCINTMSK_NAKM | + USB_OTG_HCINTMSK_AHBERR | + USB_OTG_HCINTMSK_FRMORM; + + if ((epnum & 0x80U) == 0x80U) + { + USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM; + } + + break; + + case EP_TYPE_ISOC: + USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM | + USB_OTG_HCINTMSK_ACKM | + USB_OTG_HCINTMSK_AHBERR | + USB_OTG_HCINTMSK_FRMORM; + + if ((epnum & 0x80U) == 0x80U) + { + USBx_HC((uint32_t)ch_num)->HCINTMSK |= (USB_OTG_HCINTMSK_TXERRM | USB_OTG_HCINTMSK_BBERRM); + } + break; + + default: + ret = HAL_ERROR; + break; + } + + /* Enable the top level host channel interrupt. */ + USBx_HOST->HAINTMSK |= 1UL << (ch_num & 0xFU); + + /* Make sure host channel interrupts are enabled. */ + USBx->GINTMSK |= USB_OTG_GINTMSK_HCIM; + + /* Program the HCCHAR register */ + if ((epnum & 0x80U) == 0x80U) + { + HCcharEpDir = (0x1U << 15) & USB_OTG_HCCHAR_EPDIR; + } + else + { + HCcharEpDir = 0U; + } + + if (speed == HPRT0_PRTSPD_LOW_SPEED) + { + HCcharLowSpeed = (0x1U << 17) & USB_OTG_HCCHAR_LSDEV; + } + else + { + HCcharLowSpeed = 0U; + } + + USBx_HC((uint32_t)ch_num)->HCCHAR = (((uint32_t)dev_address << 22) & USB_OTG_HCCHAR_DAD) | + ((((uint32_t)epnum & 0x7FU) << 11) & USB_OTG_HCCHAR_EPNUM) | + (((uint32_t)ep_type << 18) & USB_OTG_HCCHAR_EPTYP) | + ((uint32_t)mps & USB_OTG_HCCHAR_MPSIZ) | HCcharEpDir | HCcharLowSpeed; + + if (ep_type == EP_TYPE_INTR) + { + USBx_HC((uint32_t)ch_num)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM ; + } + + return ret; +} + +/** + * @brief Start a transfer over a host channel + * @param USBx Selected device + * @param hc pointer to host channel structure + * @param dma USB dma enabled or disabled + * This parameter can be one of these values: + * 0 : DMA feature not used + * 1 : DMA feature used + * @retval HAL state + */ +HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t ch_num = (uint32_t)hc->ch_num; + static __IO uint32_t tmpreg = 0U; + uint8_t is_oddframe; + uint16_t len_words; + uint16_t num_packets; + uint16_t max_hc_pkt_count = 256U; + + + if (hc->speed == USBH_HS_SPEED) +// if (((USBx->CID & (0x1U << 8)) != 0U) && (hc->speed == USBH_HS_SPEED)) + { + if ((dma == 0U) && (hc->do_ping == 1U)) + { + + (void)USB_DoPing(USBx, hc->ch_num); + return HAL_OK; + } + else if (dma == 1U) + { + USBx_HC(ch_num)->HCINTMSK &= ~(USB_OTG_HCINTMSK_NYET | USB_OTG_HCINTMSK_ACKM); + hc->do_ping = 0U; + } + else + { + /* ... */ + } + } + + /* Compute the expected number of packets associated to the transfer */ + if (hc->xfer_len > 0U) + { + num_packets = (uint16_t)((hc->xfer_len + hc->max_packet - 1U) / hc->max_packet); + + if (num_packets > max_hc_pkt_count) + { + num_packets = max_hc_pkt_count; + hc->xfer_len = (uint32_t)num_packets * hc->max_packet; + } + } + else + { + num_packets = 1U; + } + if (hc->ep_is_in != 0U) + { + hc->xfer_len = (uint32_t)num_packets * hc->max_packet; + } + + /* Initialize the HCTSIZn register */ + USBx_HC(ch_num)->HCTSIZ = (hc->xfer_len & USB_OTG_HCTSIZ_XFRSIZ) | + (((uint32_t)num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) | + (((uint32_t)hc->data_pid << 29) & USB_OTG_HCTSIZ_DPID); + + if (dma != 0U) + { + /* xfer_buff MUST be 32-bits aligned */ + USBx_HC(ch_num)->HCDMA = (uint32_t)hc->xfer_buff; + } + + is_oddframe = (((uint32_t)USBx_HOST->HFNUM & 0x01U) != 0U) ? 0U : 1U; + USBx_HC(ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM; + USBx_HC(ch_num)->HCCHAR |= (uint32_t)is_oddframe << 29; + + /* Set host channel enable */ + tmpreg = USBx_HC(ch_num)->HCCHAR; + tmpreg &= ~USB_OTG_HCCHAR_CHDIS; + + /* make sure to set the correct ep direction */ + if (hc->ep_is_in != 0U) + { + tmpreg |= USB_OTG_HCCHAR_EPDIR; + } + else + { + tmpreg &= ~USB_OTG_HCCHAR_EPDIR; + } + tmpreg |= USB_OTG_HCCHAR_CHENA; + USBx_HC(ch_num)->HCCHAR = tmpreg; + + if (dma == 0U) /* Slave mode */ + { + if ((hc->ep_is_in == 0U) && (hc->xfer_len > 0U)) + { + switch (hc->ep_type) + { + /* Non periodic transfer */ + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + + len_words = (uint16_t)((hc->xfer_len + 3U) / 4U); + + /* check if there is enough space in FIFO space */ + if (len_words > (USBx->HNPTXSTS & 0xFFFFU)) + { + /* need to process data in nptxfempty interrupt */ + USBx->GINTMSK |= USB_OTG_GINTMSK_NPTXFEM; + } + break; + + /* Periodic transfer */ + case EP_TYPE_INTR: + case EP_TYPE_ISOC: + len_words = (uint16_t)((hc->xfer_len + 3U) / 4U); + /* check if there is enough space in FIFO space */ + if (len_words > (USBx_HOST->HPTXSTS & 0xFFFFU)) /* split the transfer */ + { + /* need to process data in ptxfempty interrupt */ + USBx->GINTMSK |= USB_OTG_GINTMSK_PTXFEM; + } + break; + + default: + break; + } + + /* Write packet into the Tx FIFO. */ + (void)USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, (uint16_t)hc->xfer_len, 0); + } + } + + return HAL_OK; +} + +/** + * @brief Read all host channel interrupts status + * @param USBx Selected device + * @retval HAL state + */ +uint32_t USB_HC_ReadInterrupt(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + return ((USBx_HOST->HAINT) & 0xFFFFU); +} + +/** + * @brief Halt a host channel + * @param USBx Selected device + * @param hc_num Host Channel number + * This parameter can be a value from 1 to 15 + * @retval HAL state + */ +HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t hcnum = (uint32_t)hc_num; + uint32_t count = 0U; + uint32_t HcEpType = (USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_EPTYP) >> 18; + + /* Check for space in the request queue to issue the halt. */ + if ((HcEpType == HCCHAR_CTRL) || (HcEpType == HCCHAR_BULK)) + { + USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHDIS; + + if ((USBx->HNPTXSTS & (0xFFU << 16)) == 0U) + { + USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA; + USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; + USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_EPDIR; + do + { + if (++count > 1000U) + { + break; + } + } + while ((USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); + } + else + { + USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; + } + } + else + { + USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHDIS; + + if ((USBx_HOST->HPTXSTS & (0xFFU << 16)) == 0U) + { + USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA; + USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; + USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_EPDIR; + do + { + if (++count > 1000U) + { + break; + } + } + while ((USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); + } + else + { + USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; + } + } + + return HAL_OK; +} + +/** + * @brief Initiate Do Ping protocol + * @param USBx Selected device + * @param hc_num Host Channel number + * This parameter can be a value from 1 to 15 + * @retval HAL state + */ +HAL_StatusTypeDef USB_DoPing(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t chnum = (uint32_t)ch_num; + uint32_t num_packets = 1U; + uint32_t tmpreg; + +// uart_printf("do ping\n"); + + USBx_HC(chnum)->HCTSIZ = ((num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) | + USB_OTG_HCTSIZ_DOPING; + + /* Set host channel enable */ + tmpreg = USBx_HC(chnum)->HCCHAR; + tmpreg &= ~USB_OTG_HCCHAR_CHDIS; + tmpreg |= USB_OTG_HCCHAR_CHENA; + USBx_HC(chnum)->HCCHAR = tmpreg; + + return HAL_OK; +} + +/** + * @brief Stop Host Core + * @param USBx Selected device + * @retval HAL state + */ +HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t count = 0U; + uint32_t value; + uint32_t i; + + (void)USB_DisableGlobalInt(USBx); + + /* Flush FIFO */ + (void)USB_FlushTxFifo(USBx, 0x10U); + (void)USB_FlushRxFifo(USBx); + + /* Flush out any leftover queued requests. */ + for (i = 0U; i <= 15U; i++) + { + value = USBx_HC(i)->HCCHAR; + value |= USB_OTG_HCCHAR_CHDIS; + value &= ~USB_OTG_HCCHAR_CHENA; + value &= ~USB_OTG_HCCHAR_EPDIR; + USBx_HC(i)->HCCHAR = value; + } + + /* Halt all channels to put them into a known state. */ + for (i = 0U; i <= 15U; i++) + { + value = USBx_HC(i)->HCCHAR; + value |= USB_OTG_HCCHAR_CHDIS; + value |= USB_OTG_HCCHAR_CHENA; + value &= ~USB_OTG_HCCHAR_EPDIR; + USBx_HC(i)->HCCHAR = value; + + do + { + if (++count > 1000U) + { + break; + } + } + while ((USBx_HC(i)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); + } + + /* Clear any pending Host interrupts */ + USBx_HOST->HAINT = 0xFFFFFFFFU; + USBx->GINTSTS = 0xFFFFFFFFU; + + (void)USB_EnableGlobalInt(USBx); + + return HAL_OK; +} + +/** + * @brief USB_ActivateRemoteWakeup active remote wakeup signalling + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_ActivateRemoteWakeup(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS) + { + /* active Remote wakeup signalling */ + USBx_DEVICE->DCTL |= USB_OTG_DCTL_RWUSIG; + } + + return HAL_OK; +} + +/** + * @brief USB_DeActivateRemoteWakeup de-active remote wakeup signalling + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DeActivateRemoteWakeup(USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + /* active Remote wakeup signalling */ + USBx_DEVICE->DCTL &= ~(USB_OTG_DCTL_RWUSIG); + + return HAL_OK; +} +#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ + + +HAL_StatusTypeDef USBD_EP0_Write_FIFO_And_Send(USB_OTG_GlobalTypeDef *USBx, uint32_t * pdata, uint16_t length) +{ + uint32_t USBx_BASE, i, length_words; + + length_words = length/4; + USBx_BASE = (uint32_t)USBx; + + USBx_INEP(0)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); + USBx_INEP(0)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); + + USBx_INEP(0)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); + USBx_INEP(0)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & (length) ); + + USBx_INEP(0)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + + for ( i = 0; i < length_words; i++) + { + USBx_DFIFO(0) = pdata[i]; + } + + if(length%4) + { + USBx_DFIFO(0) = pdata[i]; + } + + return HAL_OK; +} + + +HAL_StatusTypeDef USBD_EP0_Write_FIFO_And_Send_DMA(USB_OTG_GlobalTypeDef *USBx, uint32_t * pdata, uint16_t length) +{ + uint32_t USBx_BASE, i, length_words; + + length_words = length/4; + USBx_BASE = (uint32_t)USBx; + + + if(0 != length) + { + USBx_INEP(0)->DIEPDMA = (uint32_t)(pdata); + } + + USBx_INEP(0)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); + USBx_INEP(0)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); + + USBx_INEP(0)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); + USBx_INEP(0)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & (length) ); + + USBx_INEP(0)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + + + return HAL_OK; +} + +// length : calculate in bytes; when length = 0, send zero length packct + +HAL_StatusTypeDef USBD_EP0_Send_Data(void *hpcd, uint8_t * data, uint16_t length) +{ + uint32_t USBx_BASE, length_sent, epint; + uint32_t *p_Src; + USB_OTG_EPTypeDef *ep; + PCD_HandleTypeDef *p_hpcd; + + p_hpcd = (PCD_HandleTypeDef *) hpcd; + USBx_BASE = (uint32_t)((PCD_HandleTypeDef *)p_hpcd->Instance); + + if(length > 0) + { + if (0 != ( (uint32_t)data % 4) ) + { + memcpy(Send_Array_32Align, data, length); + p_Src = Send_Array_32Align; + } + else + { + p_Src = (uint32_t *)data; + } + } + + ep = &p_hpcd->IN_ep[0]; + ep->xfer_count = 0; + ep->xfer_len = length; + + // for zero length packet, USBD_EP0_Write_FIFO_And_Send will not write data to FIFO. + do + { + if (length > ep->maxpacket) + { + length_sent = ep->maxpacket; + } + else + { + length_sent = length; + } + if (p_hpcd->Init.dma_enable) + { + USBD_EP0_Write_FIFO_And_Send_DMA( (USB_OTG_GlobalTypeDef *)USBx_BASE, p_Src, length_sent); + } + else + { + USBD_EP0_Write_FIFO_And_Send( (USB_OTG_GlobalTypeDef *)USBx_BASE, p_Src, length_sent); + } + + while(1) + { + epint = USB_ReadDevInEPInterrupt( (USB_OTG_GlobalTypeDef *)USBx_BASE, 0); + + if ((epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC) + { + CLEAR_IN_EP_INTR(0, USB_OTG_DIEPINT_XFRC); + break; + } + } + ep->xfer_count += length_sent; + length = length - length_sent; + p_Src = p_Src + (length_sent + 3)/4; + + } + while(ep->xfer_count < ep->xfer_len); + + if (ep->xfer_len) // for not zero length data packet, expect to receive zero packet from host for status stage. + { + p_hpcd->OUT_ep[0].xfer_len = 0; + USBD_EPx_Receive_Zero_Packet(USBx_BASE, 0); + } + else + { +// USBx_OUTEP(0)->DOEPDMA = (uint32_t)p_hpcd->Setup; + if (p_hpcd->Init.dma_enable) + { + USBx_OUTEP(0)->DOEPCTL |= USB_OTG_DOEPCTL_EPENA | USB_OTG_DOEPCTL_USBAEP; + } + } + + return HAL_OK; +} + + + +static HAL_StatusTypeDef USBD_EPx_Write_FIFO_And_Send_OnePacket(USB_OTG_GlobalTypeDef *USBx, uint32_t ep_num, uint32_t * pdata, uint16_t length, uint16_t ep_max_words) +{ + uint32_t USBx_BASE, i, length_words; + + + length_words = length/4; + USBx_BASE = (uint32_t)(USBx); + + USBx_INEP(ep_num)->DIEPTSIZ = BIT29; + + USBx_INEP(ep_num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); + USBx_INEP(ep_num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & (length) ); + + USBx_INEP(ep_num)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + + while(1) + { + if ( (USBx_INEP(ep_num)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= ep_max_words) + { + for ( i = 0; i < length_words; i++) + { + USBx_DFIFO(ep_num) = pdata[i]; + } + + if(length%4) + { + USBx_DFIFO(ep_num) = pdata[i]; + } + break; + } + } + return HAL_OK; +} + + + +static HAL_StatusTypeDef USBD_EPx_Write_FIFO_And_Send_OnePacket_DMA(USB_OTG_GlobalTypeDef *USBx, uint32_t ep_num, uint32_t * pdata, uint16_t length, uint16_t ep_max_words) +{ + uint32_t USBx_BASE, i, length_words; + + length_words = length/4; + USBx_BASE = (uint32_t)(USBx); + + if(0 != length) + { + USBx_INEP(ep_num)->DIEPDMA = (uint32_t)(pdata); + } + USBx_INEP(ep_num)->DIEPTSIZ = BIT29; + + USBx_INEP(ep_num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); + USBx_INEP(ep_num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & (length) ); + + USBx_INEP(ep_num)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + + return HAL_OK; +} + + + +// check whether device is ready to receive data +uint32_t USBD_EPx_Has_Receive_Data_Started(void * p_hpcd, uint32_t ep_num) +{ + uint32_t USBx_BASE, epint; + + USBx_BASE = (uint32_t)( ( (PCD_HandleTypeDef *)p_hpcd)->Instance); + + return (USBx_OUTEP((uint32_t)ep_num)->DOEPCTL & BIT31); +} + +// check whether Host has sent data to out EP +uint32_t USBD_EPx_Host_Sent_Data_to_OutEP(void * p_hpcd, uint32_t ep_num) +{ + uint32_t USBx_BASE, epint; + + USBx_BASE = (uint32_t)( ( (PCD_HandleTypeDef *)p_hpcd)->Instance); + + epint = USBx_OUTEP((uint32_t)ep_num)->DOEPINT; + + return (epint & (BIT0|BIT4|BIT8|BIT13) ); +} + +// clear flags of out ep +void USBD_EPx_Clear_Received_Data(void * p_hpcd, uint32_t ep_num) +{ + uint32_t USBx_BASE, epint; + + USBx_BASE = (uint32_t)( ( (PCD_HandleTypeDef *)p_hpcd)->Instance); + + USBx_OUTEP((uint32_t)ep_num)->DOEPINT = BIT0|BIT4|BIT8|BIT13; +} + +//Get Out EP error information +uint32_t USBD_EPx_Get_Out_EP_Error(void * p_hpcd, uint32_t ep_num) +{ + uint32_t USBx_BASE, epint; + + USBx_BASE = (uint32_t)( ( (PCD_HandleTypeDef *)p_hpcd)->Instance); + + return (USBx_OUTEP((uint32_t)ep_num)->DOEPINT & (BIT2|BIT8|BIT12) ); +} + +//Clear Out EP error information +void USBD_EPx_Clear_Out_EP_Error(void * p_hpcd, uint32_t ep_num) +{ + uint32_t USBx_BASE, epint; + + USBx_BASE = (uint32_t)( ( (PCD_HandleTypeDef *)p_hpcd)->Instance); + + USBx_OUTEP((uint32_t)ep_num)->DOEPINT = (BIT2|BIT8|BIT12); +} + + +HAL_StatusTypeDef USBD_EPx_Send_Data(void *hpcd, uint32_t ep_num, uint8_t * data, uint16_t length) +{ + uint32_t USBx_BASE, length_sent, epint; + uint32_t *p_Src; + USB_OTG_EPTypeDef *ep; + PCD_HandleTypeDef *p_hpcd; + USB_OTG_GlobalTypeDef * p_OTG; + uint32_t i; + + p_hpcd = (PCD_HandleTypeDef *) hpcd; + + USBx_BASE = (uint32_t)((PCD_HandleTypeDef *)p_hpcd->Instance); + p_OTG = (USB_OTG_GlobalTypeDef * )USBx_BASE; + + if(length > 0) + { + if (0 != ( (uint32_t)data % 4) ) + { + memcpy(Send_Array_32Align, data, length); + p_Src = Send_Array_32Align; + } + else + { + p_Src = (uint32_t *)data; + } + } + + ep = &p_hpcd->IN_ep[ep_num & 0x0F]; + ep->xfer_count = 0; + ep->xfer_len = length; + + // for zero length packet, USBD_EPx_Write_FIFO_And_Send will not write data to FIFO. + do + { + if (length > ep->maxpacket) + { + length_sent = ep->maxpacket; + } + else + { + length_sent = length; + } + + CLEAR_IN_EP_INTR(ep_num & 0x0F, USB_OTG_DIEPINT_XFRC); + + if (p_hpcd->Init.dma_enable) + { + USBD_EPx_Write_FIFO_And_Send_OnePacket_DMA( (USB_OTG_GlobalTypeDef *)USBx_BASE, ep_num & 0x0F, p_Src, length_sent, ep->maxpacket/4); + } + else + { + USBD_EPx_Write_FIFO_And_Send_OnePacket( (USB_OTG_GlobalTypeDef *)USBx_BASE, ep_num & 0x0F, p_Src, length_sent, ep->maxpacket/4); + } + i = 0; + p_OTG->GINTSTS = USB_OTG_GINTSTS_SOF | USB_OTG_GINTSTS_USBRST | USB_OTG_GINTSTS_USBSUSP; + + while(1) + { + epint = USB_ReadDevInEPInterrupt( (USB_OTG_GlobalTypeDef *)USBx_BASE, ep_num & 0x0F); + + if ((epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC) + { + CLEAR_IN_EP_INTR(ep_num & 0x0F, USB_OTG_DIEPINT_XFRC); + break; + } + + if (p_OTG->GINTSTS & USB_OTG_GINTSTS_SOF) + { + p_OTG->GINTSTS = USB_OTG_GINTSTS_SOF; + i++; + + if (i >= 800) // 125us * 800 = 100ms + { + goto SEND_ERROR_TIMEOUT; + } + } + + if (p_OTG->GINTSTS & (USB_OTG_GINTSTS_USBRST|USB_OTG_GINTSTS_USBSUSP) ) + { + return HAL_ERROR; + } + } + + ep->xfer_count += length_sent; + length = length - length_sent; + p_Src = p_Src + (length_sent + 3)/4; + + } + while(ep->xfer_count < ep->xfer_len); + + return HAL_OK; + + SEND_ERROR_TIMEOUT: + CLEAR_IN_EP_INTR(ep_num & 0x0F, USB_OTG_DIEPINT_XFRC); + USBx_INEP(ep_num)->DIEPTSIZ = 0; + if (USBx_INEP(ep_num)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(ep_num)->DIEPCTL = (USBx_INEP(ep_num)->DIEPCTL | (USB_OTG_DIEPCTL_SNAK | USB_OTG_DIEPCTL_EPDIS) ) & (~BIT31); + } + else + { + USBx_INEP(ep_num)->DIEPCTL = (USBx_INEP(ep_num)->DIEPCTL | (USB_OTG_DIEPCTL_SNAK) ) & (~BIT31); + } + HAL_SimpleDelay(5); + while(USBx_INEP(ep_num)->DIEPCTL & BIT31); + + (void)USB_FlushTxFifo(p_hpcd->Instance , (uint32_t)ep_num & EP_ADDR_MSK); + + return HAL_TIMEOUT; +} + + + +static HAL_StatusTypeDef USBD_EPx_Write_FIFO_And_Send_Ex(USB_OTG_GlobalTypeDef *USBx, uint32_t ep_num, uint32_t ep_max, uint32_t * pdata, uint16_t length) +{ + uint32_t USBx_BASE, i, j, k, length_words, max_packet_size_words, packet_count; + + length_words = length/4; + if (length%4) + { + length_words += 1; + } + + USBx_BASE = (uint32_t)(USBx); + + USBx_INEP(ep_num)->DIEPTSIZ = BIT29; + + packet_count = length / ep_max; + max_packet_size_words = ep_max/4; + + if (length%ep_max) + { + packet_count += 1; + } + + k = 0; + + USBx_INEP(ep_num)->DIEPTSIZ |= (( packet_count) << 19); + USBx_INEP(ep_num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & (length) ); + + USBx_INEP(ep_num)->DIEPCTL |= (USB_OTG_DIEPCTL_EPENA|USB_OTG_DIEPCTL_CNAK); + + + for(i = 0; i < packet_count;) + { + if ( (USBx_INEP(ep_num)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= max_packet_size_words) + { + for(j = 0; j < max_packet_size_words; j++) + { + USBx_DFIFO(ep_num) = pdata[k]; + k++; + if (k == length_words) + { + return HAL_OK; + } + } + i++; + } + else + { + + } + + } + + return HAL_OK; +} + + +// the packet_count = length / ep_max should <= 8 +HAL_StatusTypeDef USBD_EPx_Send_Data_Ex(void *hpcd, uint32_t ep_num, uint32_t ep_max, uint8_t * data, uint16_t length) +{ + uint32_t USBx_BASE, length_sent, epint; + uint32_t *p_Src; + USB_OTG_EPTypeDef *ep; + PCD_HandleTypeDef *p_hpcd; + USB_OTG_GlobalTypeDef * p_OTG; + uint32_t i; + + p_hpcd = (PCD_HandleTypeDef *) hpcd; + + USBx_BASE = (uint32_t)((PCD_HandleTypeDef *)p_hpcd->Instance); + + p_OTG = (USB_OTG_GlobalTypeDef * )USBx_BASE; + + p_Src = (uint32_t *)data; + + ep = &p_hpcd->IN_ep[ep_num & 0x0F]; + ep->xfer_count = 0; + ep->xfer_len = length; + + i = 0; + CLEAR_IN_EP_INTR(ep_num & 0x0F, USB_OTG_DIEPINT_XFRC); + p_OTG->GINTSTS = USB_OTG_GINTSTS_SOF | USB_OTG_GINTSTS_USBRST | USB_OTG_GINTSTS_USBSUSP; + + USBD_EPx_Write_FIFO_And_Send_Ex( (USB_OTG_GlobalTypeDef *)USBx_BASE, ep_num & 0x0F, ep_max, p_Src, length); + + while ( ( (USBx_INEP(ep_num)->DIEPTSIZ) >> 19) & 0x3FFU ); // wait all data in txfifo has been read + + while(1) + { + epint = USB_ReadDevInEPInterrupt( (USB_OTG_GlobalTypeDef *)USBx_BASE, ep_num & 0x0F); + + if ((epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC) + { + CLEAR_IN_EP_INTR(ep_num & 0x0F, USB_OTG_DIEPINT_XFRC); + break; + } + + if (p_OTG->GINTSTS & USB_OTG_GINTSTS_SOF) + { + p_OTG->GINTSTS = USB_OTG_GINTSTS_SOF; + i++; + + if (i >= 800) // 125us * 800 = 100ms + { + goto SEND_ERROR_TIMEOUT; + } + } + + if (p_OTG->GINTSTS & (USB_OTG_GINTSTS_USBRST|USB_OTG_GINTSTS_USBSUSP) ) + { + return HAL_ERROR; + } + } + + return HAL_OK; + + SEND_ERROR_TIMEOUT: + CLEAR_IN_EP_INTR(ep_num & 0x0F, USB_OTG_DIEPINT_XFRC); + USBx_INEP(ep_num)->DIEPTSIZ = 0; + if (USBx_INEP(ep_num)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(ep_num)->DIEPCTL = (USBx_INEP(ep_num)->DIEPCTL | (USB_OTG_DIEPCTL_SNAK | USB_OTG_DIEPCTL_EPDIS) ) & (~BIT31); + } + else + { + USBx_INEP(ep_num)->DIEPCTL = (USBx_INEP(ep_num)->DIEPCTL | (USB_OTG_DIEPCTL_SNAK) ) & (~BIT31); + } + HAL_SimpleDelay(5); + while(USBx_INEP(ep_num)->DIEPCTL & BIT31); + + (void)USB_FlushTxFifo(p_hpcd->Instance , (uint32_t)ep_num & EP_ADDR_MSK); + + return HAL_TIMEOUT; +} + + + +HAL_StatusTypeDef USBD_EPx_Receive_Zero_Packet(uint32_t base_address, uint32_t epnum) +{ + uint32_t USBx_BASE, i; + + USBx_BASE = base_address; + + USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ); + USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT); + + + USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); + USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & (0)); + + /* EP enable */ + USBx_OUTEP(epnum)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA); + + return HAL_OK; +} + + + + +uint8_t USB_GetIdStatus(USB_OTG_GlobalTypeDef *USBx) +{ + return ((USBx->GOTGCTL>>USB_OTG_GOTGCTL_CIDSTS_Pos)&0x01); +} + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (USB_OTG_HS1) || defined (USB_OTG_HS2) */ +#endif /* defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT Aisinochip *****END OF FILE****/ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal.c new file mode 100644 index 0000000000..e5e11e5e9c --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal.c @@ -0,0 +1,421 @@ +/****************************************************************************** +*@file : hal.c +*@brief : This is the common part of the HAL initialization +******************************************************************************/ + +#include "hal.h" + +static __IO uint32_t g_msTick = 0; +HAL_SysTickHandleTypeDef g_systickHandle; + +/****************************************************************************** +*@brief : init hal library +*@param : none +*@return: none +******************************************************************************/ +HAL_StatusTypeDef HAL_Init(void) +{ + /* Init the low level hardware */ + HAL_MspInit(); + + /* Set Interrupt Group Priority */ + NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); + + __HAL_RCC_EFUSE1_CLK_ENABLE(); + + HAL_RCC_GetSysCoreClockFreq(); + + /* Use systick as time base source and configure 1ms tick (default clock after Reset is RCH) */ + HAL_InitTick(TICK_INT_PRIORITY, TICK_PERIOD_MS); + + #if (DATA_ACCELERATE_ENABLE == 1) + System_EnableDAccelerate(); + #endif + + /* Return function status */ + return HAL_OK; +} + + +/****************************************************************************** +*@brief : deinit hal library +*@param : none +*@return: none +******************************************************************************/ +HAL_StatusTypeDef HAL_DeInit(void) +{ + /* Reset of all peripherals */ + + /* De-Init the low level hardware */ + HAL_MspDeInit(); + + /* Return function status */ + return HAL_OK; +} + + +/****************************************************************************** +*@brief : Initialize the MSP +*@param : none +*@return: none +******************************************************************************/ +__attribute__((weak)) void HAL_MspInit(void) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_MspInit could be implemented in the user file + */ +} + + +/****************************************************************************** +*@brief : DeInitializes the MSP +*@param : none +*@return: none +******************************************************************************/ +__attribute__((weak)) void HAL_MspDeInit(void) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_MspDeInit could be implemented in the user file + */ +} + + +/****************************************************************************** +*@brief : This function configures the source of the time base. +* The time source is configured to have 1ms time base with a dedicated Tick interrupt priority. +*@note : This function is called automatically at the beginning of program after +* reset by HAL_Init() or at any time when clock is reconfigured by HAL_RCC_ClockConfig(). +*@note : In the default implementation, SysTick timer is the source of time base. +* It is used to generate interrupts at regular time intervals. +* Care must be taken if HAL_Delay() is called from a peripheral ISR process, +* The SysTick interrupt must have higher priority (numerically lower) +* than the peripheral interrupt. Otherwise the caller ISR process will be blocked. +* The function is declared as __weak to be overwritten in case of other +* implementation in user file. +*@param : TickPriority: Tick interrupt priority. +*@retval: HAL status +******************************************************************************/ +__attribute__((weak)) HAL_StatusTypeDef HAL_InitTick(uint32_t intPrio, uint32_t msPeriod) +{ + /* Configure the SysTick to have interrupt in 1ms time basis*/ + g_systickHandle.freq = SystemCoreClock; + if (HAL_SYSTICK_Config(g_systickHandle.freq / (1000U / msPeriod)) > 0U) + { + return HAL_ERROR; + } + + g_systickHandle.period = SysTick->LOAD; + g_systickHandle.clkPerUs = g_systickHandle.freq / 1000000; + g_systickHandle.clkPerMs = g_systickHandle.freq / 1000; + g_systickHandle.msPeriod = msPeriod; + g_systickHandle.usPer65536Clk = 65536 / g_systickHandle.clkPerUs; + + /* Configure the SysTick IRQ priority */ + if (intPrio >= (1UL << __NVIC_PRIO_BITS)) + { + intPrio = (1UL << __NVIC_PRIO_BITS)-1; + } + HAL_NVIC_SetPriority(SysTick_IRQn, intPrio, 0U); + g_systickHandle.intPrio = intPrio; + + /* Return function status */ + return HAL_OK; +} + +#if 0 + +/****************************************************************************** +*@brief : This function is called to increment a global variable "g_msTick" +* In the default implementation, this variable is incremented each 1ms in SysTick ISR. +* This function is declared as __weak to be overwritten in case of other implementations in user file. +*@param : none +*@return: none +******************************************************************************/ +__attribute__((weak)) void HAL_IncTick(void) +{ + g_msTick += g_systickHandle.msPeriod; +} + + +/****************************************************************************** +*@brief : Provides a tick value in millisecond +* This function is declared as __weak to be overwritten in case of other implementations in user file. +*@return: none +******************************************************************************/ +__attribute__((weak)) uint32_t HAL_GetTick(void) +{ + return (g_msTick); +} + + +/****************************************************************************** +*@brief : Set new SysTick period in ms +*@return: Status +******************************************************************************/ +HAL_StatusTypeDef HAL_SetTickMsPeriod(int msPeriod) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (g_systickHandle.msPeriod != msPeriod) + { + status = HAL_InitTick(g_systickHandle.intPrio, g_systickHandle.msPeriod); + } + + return status; +} + +/****************************************************************************** +*@brief : Return SysTick period +*@return: SysTick period in ms +******************************************************************************/ +uint32_t HAL_GetTickMsPeriod(void) +{ + return g_systickHandle.msPeriod; +} + + +/****************************************************************************** +*@brief : This function provides minimum delay (in milliseconds) based on variable incremented +* This function is declared as __weak to be overwritten in case of other implementations in user file. +*@param : Delay: specifies the delay time length, in milliseconds. +*@return: none +******************************************************************************/ +__attribute__((weak)) void HAL_Delay(uint32_t msDelay) +{ + uint32_t tickstart = HAL_GetTick(); + uint32_t wait = msDelay; + + /* Add a freq to guarantee minimum wait */ + if (wait < (HAL_MAX_DELAY- (uint32_t)(g_systickHandle.msPeriod))) + { + wait += (uint32_t)(g_systickHandle.msPeriod); + } + + while((HAL_GetTick() - tickstart) < wait) + { + } +} + +/****************************************************************************** +*@brief : Suspend Tick increment +*@param : none +*@return: none +******************************************************************************/ +__attribute__((weak)) void HAL_SuspendTick(void) +{ + SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; + SCB->ICSR = SCB_ICSR_PENDSTCLR_Msk; +} + +/****************************************************************************** +*@brief : Resume Tick increment +*@param : none +*@return: none +******************************************************************************/ +__attribute__((weak)) void HAL_ResumeTick(void) +{ + SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; +} + + +/****************************************************************************** +*@brief : SysTickʱʱʱжϹرҲɼʱ100MHzʱʱʱ32룬ʱԴơ +*@param : clks: ʱclks +*@ret : +******************************************************************************/ +void HAL_DelayClks(uint32_t clks) +{ + uint32_t clktickStart, clktickNow; + uint32_t count; + + clktickStart = SysTick->VAL; + count = 0; + while(1) + { + clktickNow = SysTick->VAL; + + if(clktickNow <= clktickStart) + count += clktickStart - clktickNow; + else + count += clktickStart + g_systickHandle.period - clktickNow; + + if(count >= clks) + return; + clktickStart = clktickNow; + } +} + +/****************************************************************************** +*@brief : ΢ʱʱжϹرҲɼʱʱ70ҡ +*@param : us: ʱ΢ +*@ret : +******************************************************************************/ +void HAL_DelayUs(uint32_t us) +{ + while(us>1000000) + { + HAL_DelayClks(g_systickHandle.freq); + us -= 1000000; + } + HAL_DelayClks(g_systickHandle.clkPerUs * us); +} + +/****************************************************************************** +*@brief : ʱʱжϹرҲɼʱʱ49ҡ +*@param : ms: ʱĺ +*@ret : +******************************************************************************/ +void HAL_DelayMs(uint32_t ms) +{ + while(ms>1000) + { + HAL_DelayClks(g_systickHandle.freq); + ms -= 1000; + } + HAL_DelayClks(g_systickHandle.clkPerMs * ms); +} + + +/****************************************************************************** +*@brief : delay񡣻ȡǰtickʼdelay handle +*@param : hdelay: delay handle +*@ret : +******************************************************************************/ +void HAL_StartDelay(HAL_DelayHandleTypeDef *hdelay) +{ + do + { + hdelay->mstickLatest = g_msTick; + hdelay->clktickLatest = SysTick->VAL; + } + while(g_msTick != hdelay->mstickLatest); + + hdelay->clkCount = 0; + hdelay->msCount = 0; +} + +/****************************************************************************** +*@brief : delay +*@param : hdelay: delay handle +*@ret : +******************************************************************************/ +void HAL_UpdateDelay(HAL_DelayHandleTypeDef *hdelay) +{ + uint32_t clktickNow, mstickNow,mstickNext; + + do + { + mstickNow = g_msTick; + clktickNow = SysTick->VAL; + } + while(g_msTick != mstickNow); + + mstickNext = hdelay->mstickLatest + g_systickHandle.msPeriod; + + if(mstickNow < mstickNext) + { + if(clktickNow <= hdelay->clktickLatest) + { + hdelay->clkCount += hdelay->clktickLatest - clktickNow; + } + else + { + hdelay->clkCount += hdelay->clktickLatest + g_systickHandle.period - clktickNow; + } + } + else + { + hdelay->clkCount += hdelay->clktickLatest + g_systickHandle.period - clktickNow; + hdelay->msCount += mstickNow - mstickNext; + } + + hdelay->clktickLatest = clktickNow; + hdelay->mstickLatest = mstickNow; + + if(hdelay->clkCount >= g_systickHandle.period) + { + hdelay->clkCount -= g_systickHandle.period; + hdelay->msCount += g_systickHandle.msPeriod; + } +} + + +/****************************************************************************** +*@brief : delayʼǰʱclkӳ١ʱ70ҡʱжϹرպҲʹá +* ʱжϹرգÿʱҪHAL_UpdateDelay߱1ϣ +* ᵼ·صʱʱʵʱƫС +* ʱжϿûơ +*@param : hdelay: delay handle +*@ret : ΢ӳ +******************************************************************************/ +uint32_t HAL_GetClkDelay(HAL_DelayHandleTypeDef *hdelay) +{ + HAL_UpdateDelay(hdelay); + + return hdelay->clkCount + hdelay->msCount * g_systickHandle.clkPerMs; +} + +/****************************************************************************** +*@brief : delayʼǰʱ΢ӳ١ʱ70ҡʱжϹرպҲʹá +* ʱжϹرգÿʱҪHAL_UpdateDelay߱1ϣ +* ᵼ·صʱʱʵʱƫС +* ʱжϿûơ +*@param : hdelay: delay handle +*@ret : ΢ӳ +******************************************************************************/ +uint32_t HAL_GetUsDelay(HAL_DelayHandleTypeDef *hdelay) +{ + uint32_t us; + HAL_UpdateDelay(hdelay); + + us = (hdelay->clkCount * g_systickHandle.usPer65536Clk ) >> 16; + us += hdelay->msCount * 1000; + return us; +} + +/****************************************************************************** +*@brief : delayʼǰʱĺӳ١ʱжϹرպҲʹá +* ʱжϹرգÿʱҪHAL_UpdateDelay߱1ϣ +* ᵼ·صʱʱʵʱƫС +* ʱжϿûơ +*@param : hdelay: delay handle +*@ret : ӳ +******************************************************************************/ +uint32_t HAL_GetMsDelay(HAL_DelayHandleTypeDef *hdelay) +{ + HAL_UpdateDelay(hdelay); + + return hdelay->msCount; +} + + +/****************************************************************************** +*@brief : Returns the unique device identifier (UID based on 128 bits) +*@param : UID: buffer of uid +*@return: none +******************************************************************************/ +void HAL_GetUID(uint32_t *UID) +{ + ; +} + + +#endif + + + +/****************************************************************************** +*@brief : ͨwhileѭʱ +*@param : delay: whileѭ +*@ret : +******************************************************************************/ +void HAL_SimpleDelay(volatile uint32_t delay) +{ + while(delay--) + { + ; + } +} + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_adc.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_adc.c new file mode 100644 index 0000000000..cbfc8b5662 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_adc.c @@ -0,0 +1,1305 @@ + +/****************************************************************************** +* @file : HAL_ADC.c +* @version : 1.0 +* @date : 2022.10.29 +* @brief : ADC HAL module driver +* +* @history : +* 2022.10.25 lwq create +* +******************************************************************************/ +#include "hal.h" + + +#ifdef HAL_ADC_MODULE_ENABLED + + + +/****************************************************************************** +* @brief : This function handles ADC interrupt request. +* @param : hadc : pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for ADC module. +* @return: none +******************************************************************************/ +__weak void HAL_ADC_IRQCallback(ADC_HandleTypeDef* hadc) +{ + +} + +/****************************************************************************** +* @brief : Handle ADC interrupt request. +* @param : hadc : pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for ADC module. +* @return: None +******************************************************************************/ +void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc) +{ + HAL_ADC_IRQCallback(hadc); +} + + +/****************************************************************************** +* @brief : Initialize the ADC MSP. +* @param : hadc : pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for ADC module. +* @return: none +******************************************************************************/ +__weak void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) +{ + /* + NOTE : This function should be modified by the user. + the HAL_ADC_MspInit can be implemented in the user file. + */ + UNUSED(hadc); +} + +/****************************************************************************** +* @brief : Deinitialize the ADC MSP. +* @param : hadc : pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for ADC module. +* @return: none +******************************************************************************/ +__weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) +{ + /* + NOTE : This function should be modified by the user. + the HAL_ADC_MspDeInit can be implemented in the user file. + */ + UNUSED(hadc); +} + + /****************************************************************************** +* @brief : Init the ADC module. +* @param : hadc : pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for ADC module. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc) +{ + ADC_Common_TypeDef *tmpADC_Common; + + /* Check the ADC handle allocation */ + if (hadc == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ConConvMode)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAMode)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.OverMode)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.OverSampMode)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.AnalogWDGEn)); + assert_param(IS_ADC_CLOCKSOURCE(hadc->Init.ClockSource)); + assert_param(IS_ADC_CLOCKDIV(hadc->Init.ClockPrescaler)); + assert_param(IS_ADC_RESOLUTION(hadc->Init.Resolution)); + assert_param(IS_ADC_DATA_ALIGN(hadc->Init.DataAlign)); + assert_param(IS_ADC_REGULAR_DISC_NUMBER(hadc->Init.NbrOfDiscConversion)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DiscontinuousConvMode)); + assert_param(IS_ADC_OVERSAMPLING_RATIO(hadc->Init.Oversampling.Ratio)); + assert_param(IS_ADC_RIGHTBITSHIFT(hadc->Init.Oversampling.RightBitShift)); + assert_param(IS_ADC_EXT_TRIG(hadc->Init.ExternalTrigConv)); + assert_param(IS_ADC_EXT_TRIG_EDGE(hadc->Init.ExternalTrigConvEdge)); + + if(hadc->Instance == ADC3) + { + tmpADC_Common = ADC3_COMMON; + } + else + { + tmpADC_Common = ADC12_COMMON; + } + + /* Init the low level hardware : GPIO, CLOCK, NVIC, DMA */ + HAL_ADC_MspInit(hadc); + + /* ADC regulator enable */ + SET_BIT(hadc->Instance->CR2,ADC_CR2_ADCVREGEN); + HAL_SimpleDelay(50000);//delay 20us + + /* Release Reset AFE */ + SET_BIT(hadc->Instance->CR2,ADC_CR2_ADCRSTN); + + /* Select clock source */ + MODIFY_REG(tmpADC_Common->CCR, ADC_CCR_CLKMODE_Msk, hadc->Init.ClockSource); + + /* Set Clock DIV */ + MODIFY_REG(tmpADC_Common->CCR, ADC_CCR_ADCDIV_Msk, ((hadc->Init.ClockPrescaler - 1) << ADC_CCR_ADCDIV_Pos)); + + + if(hadc->Init.ChannelEn & ADC_CHANNEL_VBAT_EN) + { + SET_BIT(tmpADC_Common->CCR, ADC_CCR_VBATEN);//Enable VBAT + } + else if(hadc->Init.ChannelEn & ADC_CHANNEL_VREF_EN) + { + SET_BIT(tmpADC_Common->CCR, ADC_CCR_VREFINTEN);//Enable VREF + } + else if(hadc->Init.ChannelEn & ADC_CHANNEL_TEMP_EN) + { + SET_BIT(tmpADC_Common->CCR, ADC_CCR_TSEN);//Enable TS + } + + //Resolution + hadc->Instance->CR2 &= ~(ADC_CR2_RES); + hadc->Instance->CR2 |= hadc->Init.Resolution; + + /* Set ADC data alignment */ + hadc->Instance->CR2 &= ~(ADC_CR2_ALIGN); + hadc->Instance->CR2 |= hadc->Init.DataAlign; + + //Set continued convert mode + if(hadc->Init.ConConvMode) + { + SET_BIT(hadc->Instance->CR1,ADC_CR1_CONT); + } + else + { + CLEAR_BIT(hadc->Instance->CR1,ADC_CR1_CONT); + } + //Set DMA mode + MODIFY_REG(hadc->Instance->CR1, ADC_CR1_DMA_Msk, (hadc->Init.DMAMode << ADC_CR1_DMA_Pos)); + //Set Discontinued convert mode + if(hadc->Init.DiscontinuousConvMode) + { + /* Enable the selected ADC regular discontinuous mode */ + hadc->Instance->CR1 |= (uint32_t)ADC_CR1_DISCEN; + + /* Set the number of channels to be converted in discontinuous mode */ + hadc->Instance->CR1 &= ~(ADC_CR1_DISCNUM_Msk); + hadc->Instance->CR1 |= ((hadc->Init.NbrOfDiscConversion-1) <Instance->CR1 &= ~(ADC_CR1_DISCEN); + } + + //Overflow + if(hadc->Init.OverMode) + { + SET_BIT(hadc->Instance->CR2,ADC_CR2_OVRMOD); + } + else + { + CLEAR_BIT(hadc->Instance->CR2,ADC_CR2_OVRMOD); + } + //Over Sample Set + if(hadc->Init.OverSampMode) + { + MODIFY_REG(hadc->Instance->CR2,ADC_CR2_OVSR_Msk,hadc->Init.Oversampling.Ratio<Instance->CR2,ADC_CR2_OVSS_Msk,hadc->Init.Oversampling.RightBitShift<Instance->CR2,ADC_CR2_OVSE); // Regular channel over sample en. + if(hadc->Init.Oversampling.TriggeredMode) + { + SET_BIT(hadc->Instance->CR2,ADC_CR2_TROVS); // N times sample every trig. + } + else + { + CLEAR_BIT(hadc->Instance->CR2,ADC_CR2_TROVS); // 1 time sample every trig. + } + } + + //ExTrigSel set + if(hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START) + { + /* Select external trigger to start conversion */ + hadc->Instance->CR1 &= ~(ADC_CR1_EXTSEL_Msk); + hadc->Instance->CR1 |= hadc->Init.ExternalTrigConv << ADC_CR1_EXTSEL_Pos; + + /* Select external trigger polarity */ + hadc->Instance->CR1 &= ~(ADC_CR1_EXTEN_Msk); + hadc->Instance->CR1 |= hadc->Init.ExternalTrigConvEdge << ADC_CR1_EXTEN_Pos; + } + else + { + /* Reset the external trigger */ + hadc->Instance->CR1 &= ~(ADC_CR1_EXTSEL_Msk); + hadc->Instance->CR1 &= ~(ADC_CR1_EXTEN_Msk); + } + + //Clear the sequence length. + CLEAR_BIT(hadc->Instance->SQR1,ADC_SQR1_L); //Clear the sequence length. + + return HAL_OK; +} + + +/****************************************************************************** +* @brief : DeInit the ADC module. +* @param : hadc : pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for ADC module. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef* hadc) +{ + /* Check the ADC handle allocation */ + if (hadc == NULL) + { + return HAL_ERROR; + } + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + + HAL_ADC_MspDeInit(hadc); + + hadc->ChannelNum = 0; + hadc->ConvCpltCallback = NULL; + hadc->InjectedConvCpltCallback = NULL; + hadc->LevelOutOfWindowCallback = NULL; + memset(&hadc->Init, 0, sizeof(hadc->Init)); + + return HAL_OK; +} + + +/****************************************************************************** +* @brief : Config the regular channel. +* @param : hadc : pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for ADC module. +* @param : sConfig : pointer to a ADC_ChannelConfTypeDef structure that contains +* the configuration information for ADC channel +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig) +{ + __IO uint32_t *Reg_ADC_OFR; + + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + assert_param(IS_ADC_CHANNEL(sConfig->Channel)); + assert_param(IS_ADC_SEQUENCE(sConfig->Sq)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.OverSampMode)); + assert_param(IS_FUNCTIONAL_STATE(sConfig->Diff)); + assert_param(IS_ADC_OFFSET_NUMBER(sConfig->OffsetNumber)); + assert_param(IS_ADC_OFFSET(sConfig->Offset)); + assert_param(IS_ADC_OFFSET_CALCULATE(sConfig->OffsetCalculate)); + assert_param(IS_ADC_OFFSET_SIGN(sConfig->Offsetsign)); + assert_param(IS_ADC_REGULAR_LENGTH(hadc->ChannelNum)); + assert_param(IS_ADC_SMPCLOCK(sConfig->Smp)); + + //In hardware oversampling mode, the offset compensation function is ignored + if((sConfig->OffsetNumber != ADC_OFR_NONE) && (hadc->Init.OverSampMode)) + { + return HAL_ERROR; + } + /* Differential mode set*/ + if(sConfig->Diff) + { + SET_BIT(hadc->Instance->DIFSEL, 1 << sConfig->Channel); + } + else + { + CLEAR_BIT(hadc->Instance->DIFSEL, 1 << sConfig->Channel); + } + + /* Set Rule Sequence Conversion Order */ + if((sConfig->Sq >= 1)&&(sConfig->Sq <= 5)) + { + MODIFY_REG(hadc->Instance->SQR1,(ADC_SQR1_SQ1_Msk << (5*(sConfig->Sq - 1))), \ + (sConfig->Channel << (5*sConfig->Sq))); + } + else if((sConfig->Sq >= 6)&&(sConfig->Sq <= 11)) + { + MODIFY_REG(hadc->Instance->SQR2,(ADC_SQR2_SQ6_Msk << (5*(sConfig->Sq-6))), \ + (sConfig->Channel << (5*(sConfig->Sq-6)))); + } + else if((sConfig->Sq >= 12)&&(sConfig->Sq <= 16)) + { + MODIFY_REG(hadc->Instance->SQR3,(ADC_SQR3_SQ12_Msk << (5*(sConfig->Sq-12))), \ + (sConfig->Channel << (5*(sConfig->Sq-12)))); + } + else + { + return HAL_ERROR; + } + /* Set the length of the regular channel sequence */ + MODIFY_REG(hadc->Instance->SQR1, ADC_SQR1_L_Msk, (hadc->ChannelNum-1)); + + /* Set the SMPR to every register*/ + if(sConfig->Channel <= ADC_CHANNEL_7) + { + MODIFY_REG(hadc->Instance->SMPR1,(ADC_SMPR1_SMP0_Msk << (4*sConfig->Channel )), \ + (sConfig->Smp << (4*sConfig->Channel ))); + } + else if((sConfig->Channel >= ADC_CHANNEL_8)&&(sConfig->Channel <= ADC_CHANNEL_15)) + { + MODIFY_REG(hadc->Instance->SMPR2,(ADC_SMPR2_SMP8_Msk << (4*(sConfig->Channel-8))), \ + (sConfig->Smp << (4*(sConfig->Channel-8)))); + } + else if((sConfig->Channel >= ADC_CHANNEL_16)&&(sConfig->Channel <= ADC_CHANNEL_18)) + { + MODIFY_REG(hadc->Instance->SMPR3,(ADC_SMPR3_SMP16_Msk << (4*(sConfig->Channel-16))), \ + (sConfig->Smp << (4*(sConfig->Channel-16)))); + } + else + { + return HAL_ERROR; + } + + /*set Offset */ + if (sConfig->OffsetNumber != ADC_OFR_NONE) + { + MODIFY_REG(hadc->Instance->OFR[sConfig->OffsetNumber], 0XFFFFFFFF, \ + (ADC_OFRX_OFFSETY_EN |(sConfig->Channel<OffsetCalculate |sConfig->Offsetsign |sConfig->Offset)); + } + else + { + hadc->Instance->OFR[0] &= ~ADC_OFRX_OFFSETY_EN; + hadc->Instance->OFR[1] &= ~ADC_OFRX_OFFSETY_EN; + hadc->Instance->OFR[2] &= ~ADC_OFRX_OFFSETY_EN; + hadc->Instance->OFR[3] &= ~ADC_OFRX_OFFSETY_EN; + } + return HAL_OK; +} + + +/****************************************************************************** +* @brief : Enable and start the ADC convertion. +* @param : hadc : pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for ADC module. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc) +{ + /* Check the parameters */ + if(hadc == NULL) + { + return HAL_ERROR; + } + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + assert_param(IS_ADC_EXT_TRIG(hadc->Init.ExternalTrigConv)); + + hadc->Instance->SR = (ADC_SR_AWD | ADC_SR_JEOG | ADC_SR_JEOC | ADC_SR_OVERF | ADC_SR_EOG | ADC_SR_EOC | ADC_SR_EOSMP | ADC_SR_ADRDY); + + /* Enable the ADC */ + SET_BIT(hadc->Instance->CR2, (ADC_CR2_EN)); + + /* Wait ADC ready */ + while(!(hadc->Instance->SR & ADC_SR_ADRDY)); + + if(hadc->Init.ExternalTrigConv == ADC_SOFTWARE_START) + { + /* Start covertion */ + hadc->Instance->CR1 |= ADC_CR1_SWSTART; + } + + /* Return function status */ + return HAL_OK; +} + + +/****************************************************************************** +* @brief : Stop ADC conversion of regular group (and injected channels in +* case of auto_injection mode), disable ADC peripheral. +* @param : hadc : pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for ADC module. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc) +{ + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + + if(hadc->Init.ConConvMode) + { + /* Set stop flag */ + SET_BIT(hadc->Instance->CR2, ADC_CR2_STP); + /* Waitting stop flag be cleared */ + while(READ_BIT(hadc->Instance->CR2, ADC_CR2_STP)); + } + + /* Disable the ADC peripheral */ + (CLEAR_BIT(hadc->Instance->CR2, ADC_CR2_EN)); + + /* Clear the SR register */ + hadc->Instance->SR = (ADC_SR_AWD | ADC_SR_OVERF | ADC_SR_EOG | ADC_SR_JEOC | ADC_SR_EOC | ADC_SR_ADRDY); + + /* Return function status */ + return HAL_OK; +} + + +/****************************************************************************** +* @brief : Enable ADC, start conversion of regular group with interruption. +* @param : hadc : pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for ADC module. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc) +{ + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.OverMode)); + + /* Enable the ADC */ + SET_BIT(hadc->Instance->CR2, ADC_CR2_EN); + /* Wait ADC ready */ + while(!(hadc->Instance->SR & ADC_SR_ADRDY)); + + /* Clear the SR register */ + hadc->Instance->SR = (ADC_SR_EOG | ADC_SR_EOC); + + hadc->Instance->IE |= (ADC_IE_EOCIE | ADC_IE_EOGIE); + + /* Enable ADC overrun interrupt */ + /* If hadc->Init.OverMode is set to ADC_OVERMODE_DISABLE, only then is + ADC_IE_OVERFIE enabled; otherwise data overwrite is considered as normal + behavior and no CPU time is lost for a non-processed interruption */ + if (hadc->Init.OverMode) + { + hadc->Instance->SR |= ADC_SR_OVERF; + hadc->Instance->IE |= ADC_IE_OVERFIE; + } + + if(hadc->Init.ExternalTrigConv == ADC_SOFTWARE_START) + { + /* Start covertion */ + SET_BIT(hadc->Instance->CR1,ADC_CR1_SWSTART); + } + + /* Return function status */ + return HAL_OK; +} + + +/****************************************************************************** +* @brief : Stop ADC conversion of regular group (and injected group in +* case of auto_injection mode), disable interrution of +* end-of-conversion, disable ADC peripheral. +* @param : hadc : pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for ADC module. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc) +{ + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ConConvMode)); + + if(hadc->Init.ConConvMode) + { + /* Set stop flag */ + SET_BIT(hadc->Instance->CR2, ADC_CR2_STP); + /* Waitting stop flag be cleared */ + while(READ_BIT(hadc->Instance->CR2, ADC_CR2_STP)); + } + + /* Disable the ADC peripheral */ + CLEAR_BIT(hadc->Instance->CR2, ADC_CR2_EN); + + /* Disable rehular interruptions */ + hadc->Instance->IE &= ~(ADC_IE_EOCIE | ADC_IE_EOGIE); + + /* Clear the SR register */ + hadc->Instance->SR = (ADC_SR_EOG | ADC_SR_EOC); + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +* @brief : ADC retrieve conversion value intended to be used with polling or interruption. +* @param : hadc : pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for ADC module. +* @return: the ADC covert result +******************************************************************************/ +uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc) +{ + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + + return (hadc->Instance->DR); +} + +/****************************************************************************** +* @brief : Polling to get the results of the ADC converter. +* @param : hadc : pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for ADC module. +* @param : pData : Destination Buffer address. +* @param : Length : Number of data to be transferred from ADC peripheral to memory. +* @param : Timeout : Polling timeout. +* @return: the ADC covert result +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_Polling(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length, uint32_t Timeout) +{ + uint32_t tmp_hal_status; + __IO uint32_t uiTimeout; + + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + + if(HAL_ADC_Start(hadc) != HAL_OK) + { + return HAL_ERROR; + } + if(!pData) + { + return HAL_ERROR; + } + hadc->AdcResults = pData; + uiTimeout = Timeout; + + while(Length) + { + tmp_hal_status = hadc->Instance->SR; + if(tmp_hal_status & ADC_SR_EOC) + { + *hadc->AdcResults = hadc->Instance->DR; + hadc->Instance->SR = ADC_SR_EOC; + hadc->AdcResults++; + Length--; + } + if(tmp_hal_status & ADC_SR_OVERF) + { + hadc->Instance->SR = ADC_SR_OVERF; + } + if(tmp_hal_status & ADC_SR_EOG) + { + hadc->Instance->SR = ADC_SR_EOG; + break; + } + + if(uiTimeout) + { + uiTimeout--; + if(uiTimeout == 0) + { + return HAL_TIMEOUT; + } + } + } + + HAL_ADC_Stop(hadc); + + return HAL_OK; +} + + +/****************************************************************************** +* @brief: Configures for the selected ADC injected channel its corresponding +* rank in the sequencer and its sample time. +* @param: hadc: pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for the specified ADC. +* @param: sConfigInjected: ADC configuration structure for injected channel. +* @return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef* hadc, ADC_InjectionConfTypeDef* sConfigInjected) +{ + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + assert_param(IS_FUNCTIONAL_STATE(sConfigInjected->InjecOversamplingMode)); + assert_param(IS_FUNCTIONAL_STATE(sConfigInjected->InjectedDiscontinuousConvMode)); + assert_param(IS_FUNCTIONAL_STATE(sConfigInjected->AutoInjectedConv)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DiscontinuousConvMode)); + assert_param(IS_FUNCTIONAL_STATE(sConfigInjected->InjectedDiff)); + assert_param(IS_ADC_JDR_NUMBER(sConfigInjected->InjectedOffsetNumber)); + assert_param(IS_ADC_CHANNEL(sConfigInjected->InjectedChannel)); + assert_param(IS_ADC_SMPCLOCK(sConfigInjected->InjectedSamplingTime)); + assert_param(IS_ADC_INJECTED_RANK(sConfigInjected->InjectedRank)); + assert_param(IS_ADC_INJECTED_LENGTH(sConfigInjected->InjectedNbrOfConversion)); + assert_param(IS_ADC_EXT_TRIG(sConfigInjected->ExternalTrigInjecConv)); + assert_param(IS_ADC_EXT_TRIG_EDGE(sConfigInjected->ExternalTrigInjecConvEdge)); + assert_param(IS_ADC_OFFSET(sConfigInjected->InjectedOffset)); + assert_param(IS_ADC_OFFSET_CALCULATE(sConfigInjected->InjectedOffsetCalculate)); + assert_param(IS_ADC_OFFSET_SIGN(sConfigInjected->InjectedOffsetSign)); + assert_param(IS_ADC_OVERSAMPLING_RATIO(sConfigInjected->InjecOversampling.Ratio)); + assert_param(IS_ADC_RIGHTBITSHIFT(sConfigInjected->InjecOversampling.RightBitShift)); + + //In hardware oversampling mode, the offset compensation function is ignored + if((sConfigInjected->InjectedOffsetNumber!= ADC_JDR_NONE) && (sConfigInjected->InjecOversamplingMode)) + { + return HAL_ERROR; + } + /* JDISCEN and JAUTO bits can't be set at the same time */ + if((sConfigInjected->InjectedDiscontinuousConvMode) && (sConfigInjected->AutoInjectedConv)) + { + return HAL_ERROR; + } + /* DISCEN and JAUTO bits can't be set at the same time */ + if((hadc->Init.DiscontinuousConvMode) && (sConfigInjected->AutoInjectedConv)) + { + return HAL_ERROR; + } + + /* Diff Channel COnfig */ + if(sConfigInjected->InjectedDiff) + { + SET_BIT(hadc->Instance->DIFSEL,1<InjectedChannel); + } + else + { + CLEAR_BIT(hadc->Instance->DIFSEL,1<InjectedChannel); + } + + /* Set the SMPR to every register*/ + if (sConfigInjected->InjectedChannel <= ADC_CHANNEL_7) + { + MODIFY_REG(hadc->Instance->SMPR1,(ADC_SMPR1_SMP0_Msk << (4*sConfigInjected->InjectedChannel )), \ + (sConfigInjected->InjectedSamplingTime << (4*sConfigInjected->InjectedChannel ))); + } + else if(sConfigInjected->InjectedChannel>ADC_CHANNEL_7 || sConfigInjected->InjectedChannel<=ADC_CHANNEL_15) + { + MODIFY_REG(hadc->Instance->SMPR2,(ADC_SMPR2_SMP8_Msk << (4*(sConfigInjected->InjectedChannel-8))), \ + (sConfigInjected->InjectedSamplingTime << (4*(sConfigInjected->InjectedChannel-8)))); + } + else if(sConfigInjected->InjectedChannel>ADC_CHANNEL_16 || sConfigInjected->InjectedChannel<=ADC_CHANNEL_18) + { + MODIFY_REG(hadc->Instance->SMPR3,(ADC_SMPR3_SMP16_Msk << (4*(sConfigInjected->InjectedChannel-16))), \ + (sConfigInjected->InjectedSamplingTime<< (4*(sConfigInjected->InjectedChannel-16)))); + } + else + { + return HAL_ERROR; + } + /*---------------------------- ADCx JSQR Configuration -----------------*/ + //JL configuration + hadc->Instance->JSQR &= ~(ADC_JSQR_JL); + hadc->Instance->JSQR |= (sConfigInjected->InjectedNbrOfConversion-1)<Instance->JSQR |= sConfigInjected->InjectedChannel <<(5*sConfigInjected->InjectedRank); + + /* Enable external trigger if trigger selection is different of software */ + /* start. */ + /* Note: This configuration keeps the hardware feature of parameter */ + /* ExternalTrigConvEdge "trigger edge none" equivalent to */ + /* software start. */ + if(sConfigInjected->ExternalTrigInjecConv != ADC_SOFTWARE_START) + { + /* Select external trigger to start conversion */ + hadc->Instance->JSQR &= ~(ADC_JSQR_JEXTSEL); + hadc->Instance->JSQR |= sConfigInjected->ExternalTrigInjecConv << ADC_JSQR_JEXTSEL_Pos; + + /* Select external trigger polarity */ + hadc->Instance->JSQR &= ~(ADC_JSQR_JEXTEN); + hadc->Instance->JSQR |= sConfigInjected->ExternalTrigInjecConvEdge << ADC_JSQR_JEXTEN_Pos; + } + else + { + /* Reset the external trigger */ + hadc->Instance->JSQR &= ~(ADC_JSQR_JEXTSEL); + hadc->Instance->JSQR &= ~(ADC_JSQR_JEXTEN); + } + + //JAUTO configuration + if (sConfigInjected->AutoInjectedConv) + { + /* Enable the selected ADC automatic injected group conversion */ + hadc->Instance->CR1 |= ADC_CR1_JAUTO; + } + else + { + /* Disable the selected ADC automatic injected group conversion */ + hadc->Instance->CR1 &= ~(ADC_CR1_JAUTO); + } + + //InjectedDiscontinuousConvMode + if (sConfigInjected->InjectedDiscontinuousConvMode) + { + /* Enable the selected ADC injected discontinuous mode */ + hadc->Instance->CR1 |= ADC_CR1_JDISCEN; + } + else + { + /* Disable the selected ADC injected discontinuous mode */ + hadc->Instance->CR1 &= ~(ADC_CR1_JDISCEN); + } + + /*set Offset */ + if (sConfigInjected->InjectedOffsetNumber != ADC_OFR_NONE) + { + MODIFY_REG(hadc->Instance->OFR[sConfigInjected->InjectedOffsetNumber], 0XFFFFFFFF, \ + (ADC_OFRX_OFFSETY_EN |(sConfigInjected->InjectedChannel<InjectedOffsetCalculate | sConfigInjected->InjectedOffsetSign | \ + sConfigInjected->InjectedOffset)); + } + + //Oversampling + if (sConfigInjected->InjecOversamplingMode) + { + MODIFY_REG(hadc->Instance->CR2,ADC_CR2_OVSR_Msk,sConfigInjected->InjecOversampling.Ratio<Instance->CR2,ADC_CR2_OVSS_Msk,sConfigInjected->InjecOversampling.RightBitShift<Instance->CR2,ADC_CR2_JOVSE); // Inject channel over sample en. + } + else + { + CLEAR_BIT(hadc->Instance->CR2,ADC_CR2_JOVSE); // Inject channel over sample Disable. + } + + return HAL_OK; +} + +/****************************************************************************** +* @brief: Enables the selected ADC software start conversion of the injected channels. +* @param: hadc: pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for the specified ADC. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADCEx_InjectedStart(ADC_HandleTypeDef* hadc) +{ + uint32_t tmp1 = 0U, tmp2 = 0U; + + /* Clear the SR register */ + hadc->Instance->SR = (ADC_SR_AWD | ADC_SR_JEOG | ADC_SR_JEOC | ADC_SR_OVERF | ADC_SR_EOG | ADC_SR_EOC | ADC_SR_EOSMP | ADC_SR_ADRDY); + + /* Enable the ADC */ + SET_BIT(hadc->Instance->CR2, ADC_CR2_EN); + + /* Wait ADC ready */ + while(!(hadc->Instance->SR & ADC_SR_ADRDY)); + + tmp1 = HAL_IS_BIT_CLR(hadc->Instance->JSQR, ADC_JSQR_JEXTEN); + tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO); + if(tmp1 && tmp2) + { + /* Start covertion */ + SET_BIT(hadc->Instance->CR1,ADC_CR1_JSWSTART); + } + + return HAL_OK; +} + + +/****************************************************************************** +* @brief: Stop ADC conversion of regular group (and injected channels in +* case of auto_injection mode), disable ADC peripheral. +* @param: hadc: pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for the specified ADC. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_InjectedStop(ADC_HandleTypeDef* hadc) +{ + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ConConvMode)); + + if(hadc->Init.ConConvMode) + { + /* Set stop flag */ + SET_BIT(hadc->Instance->CR2, ADC_CR2_STP); + /* Waitting stop flag be cleared */ + while(READ_BIT(hadc->Instance->CR2, ADC_CR2_STP)); + } + + /* Disable the ADC peripheral */ + CLEAR_BIT(hadc->Instance->CR2, (ADC_CR2_EN)); + + /* Clear the SR register */ + hadc->Instance->SR = (ADC_SR_AWD | ADC_SR_JEOG | ADC_SR_JEOC | ADC_SR_OVERF | ADC_SR_EOG | ADC_SR_EOC | ADC_SR_EOSMP | ADC_SR_ADRDY); + + /* Return function status */ + return HAL_OK; +} + + +/****************************************************************************** +* @brief: Enable ADC, start conversion of injected channel with interruption. +* @param: hadc: pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for the specified ADC. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_InjectedStart_IT(ADC_HandleTypeDef* hadc) +{ + uint32_t tmp1 = 0U, tmp2 = 0U; + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + + /* Enable the ADC */ + SET_BIT(hadc->Instance->CR2, (ADC_CR2_EN)); + /* Wait ADC ready */ + while(!(hadc->Instance->SR & ADC_SR_ADRDY)); + + /* Clear the SR register */ + hadc->Instance->SR = (ADC_SR_JEOC | ADC_SR_JEOG); + + hadc->Instance->IE |= (ADC_IE_JEOCIE | ADC_IE_JEOGIE); + + tmp1 = HAL_IS_BIT_CLR(hadc->Instance->JSQR, ADC_JSQR_JEXTEN); + tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO); + if(tmp1 && tmp2) + { + /* Enable the selected ADC software conversion for injected group */ + hadc->Instance->CR1 |= ADC_CR1_JSWSTART; + } + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +* @brief: Stop ADC conversion of regular group (and injected group in +* case of auto_injection mode), disable interrution of +* end-of-conversion, disable ADC peripheral. +* @param: hadc: pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for the specified ADC. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_InjectedStop_IT(ADC_HandleTypeDef* hadc) +{ + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ConConvMode)); + + if(hadc->Init.ConConvMode) + { + /* Set stop flag */ + SET_BIT(hadc->Instance->CR2, ADC_CR2_STP); + /* Waitting stop flag be cleared */ + while(READ_BIT(hadc->Instance->CR2, ADC_CR2_STP)); + } + + /* Disable the ADC peripheral */ + CLEAR_BIT(hadc->Instance->CR2, ADC_CR2_EN); + + /* Disable Inject interruptions */ + hadc->Instance->IE &= ~(ADC_IE_JEOCIE | ADC_IE_JEOGIE); + + /* Clear the SR register */ + hadc->Instance->SR = (ADC_SR_JEOG | ADC_SR_JEOC); + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +* @brief: Gets the converted value from data register of injected channel. +* @param: hadc: pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for the specified ADC. +* @param: InjectedRank: the ADC injected rank. +* This parameter can be one of the following values: +* @arg ADC_INJECTED_RANK_1: Injected Channel1 selected +* @arg ADC_INJECTED_RANK_2: Injected Channel2 selected +* @arg ADC_INJECTED_RANK_3: Injected Channel3 selected +* @arg ADC_INJECTED_RANK_4: Injected Channel4 selected +* @return: the ADC covert result +******************************************************************************/ +uint32_t HAL_ADCEx_InjectedGetValue(ADC_HandleTypeDef* hadc, uint32_t InjectedRank) +{ + __IO uint32_t tmp = 0U; + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + assert_param(IS_ADC_INJECTED_RANK(InjectedRank)); + + /* Clear injected group conversion flag to have similar behaviour as */ + /* regular group: reading data register also clears end of conversion flag. */ + hadc->Instance->SR = ADC_SR_JEOC; + + /* Return the selected ADC converted value */ + tmp = hadc->Instance->JDR[InjectedRank-1]; + + + return tmp; +} + +/****************************************************************************** +* @brief: Poll for injected conversion complete +* @param: hadc: pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for the specified ADC. +* @param: Timeout: Timeout value in millisecond. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_InjectedPolling(ADC_HandleTypeDef* hadc, uint32_t InjectedRank, uint32_t* pData, uint32_t Length, uint32_t Timeout) +{ + uint32_t tmp_hal_status; + __IO uint32_t uiTimeout; + + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + + if(HAL_ADC_Start(hadc) != HAL_OK) return HAL_ERROR; + if(!pData) return HAL_ERROR; + + hadc->AdcResults = pData; + uiTimeout = Timeout; + + while(Length) + { + tmp_hal_status = hadc->Instance->SR; + if(tmp_hal_status & ADC_SR_JEOC) + { + HAL_ADCEx_InjectedGetValue(hadc,InjectedRank); + hadc->Instance->SR = ADC_SR_JEOC; + hadc->AdcResults++; + Length--; + } + + if(tmp_hal_status & ADC_SR_OVERF) + { + hadc->Instance->SR = ADC_SR_OVERF; + } + if(tmp_hal_status & ADC_SR_JEOG) + { + hadc->Instance->SR = ADC_SR_JEOG; + break; + } + + if(uiTimeout) + { + uiTimeout--; + if(uiTimeout == 0) + { + return HAL_TIMEOUT; + } + } + } + + return HAL_OK; +} + + /****************************************************************************** +* @brief: Enable ADC, start conversion of regular group and transfer result through DMA +* @param: hadc: pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for the specified ADC. +* @param: pData : Destination Buffer address. +* @param: Length : Number of data to be transferred from ADC peripheral to memory. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length) +{ + HAL_StatusTypeDef tmp_hal_status; + + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + + /* Specific case for first call occurrence of this function (DMA transfer */ + /* not activated and ADC disabled), DMA transfer must be activated */ + /* with ADC disabled. */ + if (READ_BIT(hadc->Instance->CR1,ADC_CR1_DMA) == 0UL) + { + if(READ_BIT(hadc->Instance->CR2, ADC_CR2_EN)) + { + /* Disable ADC */ + CLEAR_BIT(hadc->Instance->CR2, ADC_CR2_EN); + } + + /* Enable ADC DMA mode */ + SET_BIT(hadc->Instance->CR1,ADC_CR1_DMA); + } + + /* Enable the ADC peripheral */ + SET_BIT(hadc->Instance->CR2, ADC_CR2_EN); + + /* Clear the SR register */ + hadc->Instance->SR = (ADC_SR_AWD | ADC_SR_JEOG | ADC_SR_JEOC | ADC_SR_OVERF | \ + ADC_SR_EOG | ADC_SR_EOC | ADC_SR_EOSMP | ADC_SR_ADRDY); + + /* Disable all interruptions before enabling the desired ones */ + hadc->Instance->IE &= ~(ADC_IE_EOSMPIE | ADC_IE_EOCIE | ADC_IE_EOGIE | ADC_IE_OVERFIE | \ + ADC_IE_JEOCIE | ADC_IE_JEOGIE | ADC_IE_AWDIE); + + /* Start the DMA channel */ + tmp_hal_status = HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length); + + /* Return function status */ + return tmp_hal_status; +} + +/****************************************************************************** +* @brief: Configures the ADC multi-mode +* @param: hadc: pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for the specified ADC. +* @param: multimode: pointer to an ADC_MultiModeTypeDef structure that contains +* the configuration information for multimode. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADCEx_MultiModeConfigChannel(ADC_HandleTypeDef* hadc, ADC_MultiModeTypeDef* multimode) +{ + ADC_Common_TypeDef *tmpADC_Common; + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + assert_param(IS_ADC_MODE(multimode->Mode)); + assert_param(IS_ADC_DMA_ACCESS_MODE(multimode->DMAAccessMode)); + assert_param(IS_ADC_SAMPLING_DELAY(multimode->TwoSamplingDelay)); + + + if(hadc->Instance == ADC3) + { + tmpADC_Common = ADC3_COMMON; + } + else + { + tmpADC_Common = ADC12_COMMON; + } + + /* Set ADC mode */ + tmpADC_Common->CCR &= ~(ADC_CCR_DUALMOD_Msk); + tmpADC_Common->CCR |= multimode->Mode << ADC_CCR_DUALMOD_Pos; + + /* Set the ADC DMA access mode */ + tmpADC_Common->CCR &= ~(ADC_CCR_DMADUAL_Msk); + tmpADC_Common->CCR |= multimode->DMAAccessMode << ADC_CCR_DMADUAL_Pos; + + /* Set delay between two sampling phases */ + tmpADC_Common->CCR &= ~(ADC_CCR_DELAY_Msk); + tmpADC_Common->CCR |= multimode->TwoSamplingDelay << ADC_CCR_DELAY_Pos; + + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +* @brief: Enables ADC DMA request after last transfer (Multi-ADC mode) and enables ADC peripheral +* This function must be used only with the ADC master. +* @param: hadc: pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for the specified ADC. +* @param: pData: Pointer to buffer in which transferred from ADC peripheral to memory will be stored. +* @param: Length: The length of data to be transferred from ADC peripheral to memory. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length) +{ + HAL_StatusTypeDef tmp_hal_status; + ADC_Common_TypeDef *tmpADC_Common; + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + + if(hadc->Instance == ADC3) + { + tmpADC_Common = ADC3_COMMON; + } + else + { + tmpADC_Common = ADC12_COMMON; + } + + /* Specific case for first call occurrence of this function (DMA transfer */ + /* not activated and ADC disabled), DMA transfer must be activated */ + /* with ADC disabled. */ + if (READ_BIT(hadc->Instance->CR1,ADC_CR1_DMA) == 0UL) + { + if(READ_BIT(hadc->Instance->CR2, ADC_CR2_EN)) + { + /* Disable ADC */ + CLEAR_BIT(hadc->Instance->CR2, ADC_CR2_EN); + } + + /* Enable ADC DMA mode */ + SET_BIT(hadc->Instance->CR1,ADC_CR1_DMA); + } + + /* Enable the ADC peripheral */ + SET_BIT(hadc->Instance->CR2, ADC_CR2_EN); + + /* Clear the SR register */ + hadc->Instance->SR = (ADC_SR_AWD | ADC_SR_JEOG | ADC_SR_JEOC | ADC_SR_OVERF | \ + ADC_SR_EOG | ADC_SR_EOC | ADC_SR_EOSMP | ADC_SR_ADRDY); + + /* Disable all interruptions before enabling the desired ones */ + hadc->Instance->IE &= ~(ADC_IE_EOSMPIE | ADC_IE_EOCIE | ADC_IE_EOGIE | \ + ADC_IE_OVERFIE | ADC_IE_JEOCIE | ADC_IE_JEOGIE | ADC_IE_AWDIE); + + /* Start the DMA channel */ + tmp_hal_status = HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&tmpADC_Common->CDR, (uint32_t)pData, Length); + + /* Return function status */ + return tmp_hal_status; + +} + + +/****************************************************************************** +* @brief: Config the analog watchdog. +* @param: hadc: pointer to a ADC_HandleTypeDef structure that contains +* the configuration information for the specified ADC. +* @param: AnalogWDGConfig : pointer to a ADC_AnalogWDGConfTypeDef structure that contains +* the configuration information for ADC analog watchdog. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef* hadc, ADC_AnalogWDGConfTypeDef* AnalogWDGConfig) +{ + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(hadc->Instance)); + assert_param(IS_FUNCTIONAL_STATE(hadc->Init.AnalogWDGEn)); + assert_param(IS_ADC_CHANNEL(AnalogWDGConfig->RegularChannel)); + assert_param(IS_ADC_CHANNEL(AnalogWDGConfig->InjectChannel)); + assert_param(IS_ADC_ANALOG_WATCHDOG(AnalogWDGConfig->WatchdogMode)); + assert_param(IS_ADC_THRESHOLD(AnalogWDGConfig->HighThreshold)); + assert_param(IS_ADC_THRESHOLD(AnalogWDGConfig->LowThreshold)); + assert_param(IS_FUNCTIONAL_STATE(AnalogWDGConfig->ITMode)); + + + if (hadc->Init.AnalogWDGEn) + { + /* Clear AWDEN, JAWDEN and AWDSGL bits */ + hadc->Instance->CR1 &= (~(ADC_CR1_AWDSGL_Msk | ADC_CR1_JAWDEN_Msk | ADC_CR1_AWDEN_Msk)); + + /* Set the analog watchdog enable mode */ + hadc->Instance->CR1 |= AnalogWDGConfig->WatchdogMode; + + /* Configure ADC analog watchdog interrupt */ + if(AnalogWDGConfig->ITMode) + { + hadc->Instance->IE |= ADC_IE_AWDIE; + } + else + { + hadc->Instance->IE &= ~ADC_IE_AWDIE; + } + + if(AnalogWDGConfig->WatchdogMode & ADC_CR1_AWDSGL) + { + /* Select the analog watchdog regular channel */ + if(AnalogWDGConfig->WatchdogMode & ADC_CR1_AWDEN) + { + /* Clear AWDCH bits */ + hadc->Instance->CR1 &= (~ADC_CR1_AWDCH_Msk); + hadc->Instance->CR1 |= AnalogWDGConfig->RegularChannel; + } + /* Select the analog watchdog inject channel */ + if(AnalogWDGConfig->WatchdogMode & ADC_CR1_JAWDEN) + { + /* Clear AWDCH bits */ + hadc->Instance->CR1 &= (~ADC_CR1_AWDJCH_Msk); + hadc->Instance->CR1 |= (AnalogWDGConfig->InjectChannel << ADC_CR1_AWDJCH_Pos); + } + } + } + + if(AnalogWDGConfig->Diff) + { + hadc->Instance->HTR = AnalogWDGConfig->HighThreshold<<16; + hadc->Instance->LTR = AnalogWDGConfig->LowThreshold<<16; + } + else + { + hadc->Instance->HTR = AnalogWDGConfig->HighThreshold; + hadc->Instance->LTR = AnalogWDGConfig->LowThreshold; + } + + /* Return function status */ + return HAL_OK; +} + + +/****************************************************************************** +* @brief: Checks whether the specified ADC flag is set or not. +* @param: ADCx: where x can be 1/2/3 to select the ADC peripheral. +* @param: ADC_FLAG: specifies the flag to check. +* @return: The new state of ADC_FLAG (SET or RESET). +******************************************************************************/ +FlagStatus HAL_ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(ADCx)); + assert_param(IS_ADC_FLAG(ADC_FLAG)); + + /* Check the status of the specified ADC flag */ + if ((ADCx->SR & ADC_FLAG) != RESET) + { + /* ADC_FLAG is set */ + bitstatus = SET; + } + else + { + /* ADC_FLAG is reset */ + bitstatus = RESET; + } + /* Return the ADC_FLAG status */ + return bitstatus; +} + +/****************************************************************************** +* @brief: Clears the ADCx's pending flags. +* @param: ADCx: where x can be 1/2/3 to select the ADC peripheral. +* @param: ADC_FLAG: specifies the flag to clear. +* @return: None +******************************************************************************/ +void HAL_ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(ADCx)); + assert_param(IS_ADC_FLAG(ADC_FLAG)); + + /* Clear the selected ADC flags */ + ADCx->SR = ADC_FLAG; +} + + +/****************************************************************************** +* @brief: Enables or disables the specified ADC interrupts. +* @param: ADCx: where x can be 1/2/3 to select the ADC peripheral. +* @param: ADC_IT: specifies the ADC interrupt sources to be enabled or disabled. +* @param: NewState: new state of the specified ADC interrupts. +* This parameter can be: ENABLE or DISABLE. +* @return: None. +******************************************************************************/ +void HAL_ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(ADCx)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_ADC_IT_FLAG(ADC_IT)); + + if (NewState != DISABLE) + { + /* Enable the selected ADC interrupts */ + ADCx->IE |= ADC_IT; + } + else + { + /* Disable the selected ADC interrupts */ + ADCx->IE &= (~ADC_IT); + } +} + +/****************************************************************************** +* @brief: Checks whether the specified ADC interrupt has occurred or not. +* @param: ADCx: where x can be 1/2/3 to select the ADC peripheral. +* @param: ADC_IT: specifies the ADC interrupt source to check. +* @return: The new state of ADC_FLAG (SET or RESET). +******************************************************************************/ +ITStatus HAL_ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(ADCx)); + assert_param(IS_ADC_IT_FLAG(ADC_IT)); + + /* Get the ADC_IT enable bit status */ + enablestatus = (ADCx->IE & ADC_IT) ; + + /* Check the status of the specified ADC interrupt */ + if (((ADCx->SR & ADC_IT) != RESET) && enablestatus) + { + /* ADC_IT is set */ + bitstatus = SET; + } + else + { + /* ADC_IT is reset */ + bitstatus = RESET; + } + /* Return the ADC_IT status */ + return bitstatus; +} + +/****************************************************************************** +* @brief: Clears the ADC's interrupt pending bits. +* @param: ADCx: where x can be 1/2/3 to select the ADC peripheral. +* @param: ADC_IT: specifies the ADC interrupt pending bit to clear. +* @return: none +******************************************************************************/ +void HAL_ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint32_t ADC_IT) +{ + /* Check the parameters */ + assert_param(IS_ADC_INSTANCE(ADCx)); + assert_param(IS_ADC_IT_FLAG(ADC_IT)); + + if((ADCx->IE & ADC_IT)!= RESET) + { + /* Clear the interrupt pending bits in the RTC_SR register */ + ADCx->SR = ADC_IT; + } +} + +#endif + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_aes_spi1.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_aes_spi1.c new file mode 100644 index 0000000000..9ddd354ee4 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_aes_spi1.c @@ -0,0 +1,1617 @@ +/****************************************************************************** +* File Name: aes.c +* Author: AisinoChip +* Data First Issued: 2020-06-17 +* Description: aes module driver +******************************************************************************/ +#include "hal.h" + +#ifdef HAL_AES_SPI1_ENABLED + +#define SWAP32(a) ((a<<24)|((a&0x0000ff00)<<8)|((a&0x00ff0000)>>8)|(a>>24)) + + +uint32_t REG_IV1,REG_IV2,REG_IV3,REG_IV4; + +//const unsigned char S[256] = { +// 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, +//202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, +//183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, +// 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, +// 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, +// 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, +//208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, +// 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, +//205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, +// 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, +//224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, +//231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, +//186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, +//112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, +//225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, +//140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22, +//}; + +//const unsigned char Si[256] = { +// 82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, +//124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, +// 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, +// 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, +//114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146, +//108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132, +//144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, +//208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107, +// 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, +//150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, +// 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, +//252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, +// 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, +// 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, +//160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, +// 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125, +//}; + +//const unsigned char Logtable[256] = { +// 0, 0, 25, 1, 50, 2, 26, 198, 75, 199, 27, 104, 51, 238, 223, 3, +//100, 4, 224, 14, 52, 141, 129, 239, 76, 113, 8, 200, 248, 105, 28, 193, +//125, 194, 29, 181, 249, 185, 39, 106, 77, 228, 166, 114, 154, 201, 9, 120, +//101, 47, 138, 5, 33, 15, 225, 36, 18, 240, 130, 69, 53, 147, 218, 142, +//150, 143, 219, 189, 54, 208, 206, 148, 19, 92, 210, 241, 64, 70, 131, 56, +//102, 221, 253, 48, 191, 6, 139, 98, 179, 37, 226, 152, 34, 136, 145, 16, +//126, 110, 72, 195, 163, 182, 30, 66, 58, 107, 40, 84, 250, 133, 61, 186, +// 43, 121, 10, 21, 155, 159, 94, 202, 78, 212, 172, 229, 243, 115, 167, 87, +//175, 88, 168, 80, 244, 234, 214, 116, 79, 174, 233, 213, 231, 230, 173, 232, +// 44, 215, 117, 122, 235, 22, 11, 245, 89, 203, 95, 176, 156, 169, 81, 160, +//127, 12, 246, 111, 23, 196, 73, 236, 216, 67, 31, 45, 164, 118, 123, 183, +//204, 187, 62, 90, 251, 96, 177, 134, 59, 82, 161, 108, 170, 85, 41, 157, +//151, 178, 135, 144, 97, 190, 220, 252, 188, 149, 207, 205, 55, 63, 91, 209, +// 83, 57, 132, 60, 65, 162, 109, 71, 20, 42, 158, 93, 86, 242, 211, 171, +// 68, 17, 146, 217, 35, 32, 46, 137, 180, 124, 184, 38, 119, 153, 227, 165, +//103, 74, 237, 222, 197, 49, 254, 24, 13, 99, 140, 128, 192, 247, 112, 7, +//}; + +//const unsigned char Alogtable[256] = { +// 1, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19, 53, +// 95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102, 170, +//229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171, 230, 49, +// 83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178, 205, +// 76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120, 136, +//131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154, +//181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163, +//254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, 96, 160, +//251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63, 65, +//195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191, 218, 117, +//159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122, 142, 137, 128, +//155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67, 197, 84, +//252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70, 202, +// 69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81, 243, 14, +// 18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242, 13, 23, +// 57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82, 246, 1, +//}; + +//const unsigned char iG[4][4] = { +//0x0e, 0x09, 0x0d, 0x0b, +//0x0b, 0x0e, 0x09, 0x0d, +//0x0d, 0x0b, 0x0e, 0x09, +//0x09, 0x0d, 0x0b, 0x0e, +//}; + +//const unsigned long rcon[30] = { +// 0x01,0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, +// 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 }; + + + +#define MAXROUNDS 14 +#define MAXKC 8 +#define BLOCK_ROW 4 +#define BLOCK_COLUMN 4 +#define BLOCK_LENGTH 16 +#define SWAP_OFFSET 241 +#define KEY_OFFSET 242 + +/************************************************************************ + * function : delay + * Description: delay for a while. + * input : + * count: count to decrease + * return: none + ************************************************************************/ +void delay(uint32_t count) +{ + volatile uint32_t delay_count; + + delay_count = count; + + while(delay_count--); +} + + +void aes_memory_copy(uint32_t *psrc, uint32_t *pdst, uint32_t len) +{ + uint32_t i; + + for (i =0; i < len; i ++) + { + *pdst ++ = *psrc ++; + } +} + +void aes_memory_copy_u8(uint8_t *psrc, uint8_t *pdst, uint32_t len) +{ + uint32_t i; + + for (i =0; i < len; i ++) + { + *pdst ++ = *psrc ++; + } +} + +/****************************************************************************** +*@brief : set key for aes +*@param : keyin : pointer to buffer of key +*@param : key_len : select length of key(AES_KEY_128/ AES_KEY_192/ AES_KEY_256) +*@param : swap_en : AES_SWAP_ENABLE, AES_SWAP_DISABLE +*@return: None +******************************************************************************/ +void HAL_AES_SPI_SetKey(uint32_t *keyin, uint8_t key_len, uint8_t swap_en) +{ + /* Enable Clock */ + __HAL_RCC_AES_SPI1_CLK_ENABLE(); + + AES->CTRL = 0x00; + if(AES_SPI_SWAP_ENABLE == swap_en) + { + AES->CTRL |= 0x10; + } + + if(AES_SPI_KEY_192 == key_len) + { + AES->CTRL |= (1 << 6); + + } + else if(AES_SPI_KEY_256 == key_len) + { + AES->CTRL |= (2 << 6); + } + + AES->KEYIN = keyin[0]; + AES->KEYIN = keyin[1]; + AES->KEYIN = keyin[2]; + AES->KEYIN = keyin[3]; + + if(AES_SPI_KEY_192 == key_len) + { + AES->KEYIN = keyin[4]; + AES->KEYIN = keyin[5]; + } + else if(AES_SPI_KEY_256 == key_len) + { + AES->KEYIN = keyin[4]; + AES->KEYIN = keyin[5]; + AES->KEYIN = keyin[6]; + AES->KEYIN = keyin[7]; + } + + AES->CTRL |= 0x02;//key setup + while((AES->STATE & 0x02) == 0); + AES->STATE = 0x02; + + __HAL_RCC_AES_SPI1_CLK_DISABLE(); +} + +void HAL_AES_SPI_SetKey_U8(uint8_t *keyin, uint8_t key_len, uint8_t swap_en) +{ + /* Enable Clock */ + __HAL_RCC_AES_SPI1_CLK_ENABLE(); + + AES->CTRL = 0x00; + + if(AES_SPI_SWAP_ENABLE == swap_en) + { + AES->CTRL |= 0x10; + } + + if(AES_SPI_KEY_192 == key_len) + { + AES->CTRL |= (1 << 6); + } + else if(AES_SPI_KEY_256 == key_len) + { + AES->CTRL |= (2 << 6); + } + + AES->KEYIN = (keyin[3] << 24) | (keyin[2] << 16) | (keyin[1] << 8) | keyin[0]; + keyin += 4; + AES->KEYIN = (keyin[3] << 24) | (keyin[2] << 16) | (keyin[1] << 8) | keyin[0]; + keyin += 4; + AES->KEYIN = (keyin[3] << 24) | (keyin[2] << 16) | (keyin[1] << 8) | keyin[0]; + keyin += 4; + AES->KEYIN = (keyin[3] << 24) | (keyin[2] << 16) | (keyin[1] << 8) | keyin[0]; + keyin += 4; + + if(AES_SPI_KEY_192 == key_len) + { + AES->KEYIN = (keyin[3] << 24) | (keyin[2] << 16) | (keyin[1] << 8) | keyin[0]; + keyin += 4; + AES->KEYIN = (keyin[3] << 24) | (keyin[2] << 16) | (keyin[1] << 8) | keyin[0]; + keyin += 4; + } + else if(AES_SPI_KEY_256 == key_len) + { + AES->KEYIN = (keyin[3] << 24) | (keyin[2] << 16) | (keyin[1] << 8) | keyin[0]; + keyin += 4; + AES->KEYIN = (keyin[3] << 24) | (keyin[2] << 16) | (keyin[1] << 8) | keyin[0]; + keyin += 4; + AES->KEYIN = (keyin[3] << 24) | (keyin[2] << 16) | (keyin[1] << 8) | keyin[0]; + keyin += 4; + AES->KEYIN = (keyin[3] << 24) | (keyin[2] << 16) | (keyin[1] << 8) | keyin[0]; + keyin += 4; + } + + AES->CTRL |= 0x02;//key setup + while((AES->STATE & 0x02) == 0); + AES->STATE = 0x02; + + __HAL_RCC_AES_SPI1_CLK_DISABLE(); +} + +void aes_func(uint32_t *indata, uint32_t * outdata, uint8_t mode) +{ + AES->DATAIN = indata[ 0 ]; + AES->DATAIN = indata[ 1 ]; + AES->DATAIN = indata[ 2 ]; + AES->DATAIN = indata[ 3 ]; + + AES->CTRL |= 0x01; + while((AES->STATE & 0x01) == 0); + AES->STATE = 0x01; + + outdata[ 0 ] = AES->DATAOUT; + outdata[ 1 ] = AES->DATAOUT; + outdata[ 2 ] = AES->DATAOUT; + outdata[ 3 ] = AES->DATAOUT; + + if(AES_SPI_CBC_MODE == mode) + { + AES->STATE |= 0x04;//clear cbc flg + } +} + + +void aes_func_u8(uint8_t *indata, uint8_t * outdata, uint8_t mode) +{ + uint32_t result; + + AES->DATAIN = (indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]; + AES->DATAIN = (indata[7] << 24) | (indata[6] << 16) | (indata[5] << 8) | indata[4]; + AES->DATAIN = (indata[11] << 24) | (indata[10] << 16) | (indata[9] << 8) | indata[8]; + AES->DATAIN = (indata[15] << 24) | (indata[14] << 16) | (indata[13] << 8) | indata[12]; + + AES->CTRL |= 0x01; + while((AES->STATE & 0x01) == 0); + AES->STATE = 0x01; + + result = AES->DATAOUT; + outdata[3] = (result >> 24) & 0xff; + outdata[2] = (result >> 16) & 0xff; + outdata[1] = (result >> 8) & 0xff; + outdata[0] = (result) & 0xff; + outdata += 4; + + result = AES->DATAOUT; + outdata[3] = (result >> 24) & 0xff; + outdata[2] = (result >> 16) & 0xff; + outdata[1] = (result >> 8) & 0xff; + outdata[0] = (result) & 0xff; + outdata += 4; + + result = AES->DATAOUT; + outdata[3] = (result >> 24) & 0xff; + outdata[2] = (result >> 16) & 0xff; + outdata[1] = (result >> 8) & 0xff; + outdata[0] = (result) & 0xff; + outdata += 4; + + result = AES->DATAOUT; + outdata[3] = (result >> 24) & 0xff; + outdata[2] = (result >> 16) & 0xff; + outdata[1] = (result >> 8) & 0xff; + outdata[0] = (result) & 0xff; + outdata += 4; + + if(AES_SPI_CBC_MODE == mode) + { + AES->STATE |= 0x04;//clear cbc flg + } +} + + +uint32_t aes_func_dfa(uint32_t *indata, uint32_t * outdata, uint8_t mode) +{ + uint8_t delay_num; + uint8_t rnd; + uint32_t temp_buffer[4]; + + //frist time + aes_func(indata, outdata, mode); + + //delay random time + HAL_HRNG_GetHrng(&rnd, 1); + delay_num = rnd & 0xf; + delay(delay_num); + + //second time + aes_func(indata, temp_buffer, mode); + + if( (outdata[0] == temp_buffer[0]) && + (outdata[1] == temp_buffer[1]) && + (outdata[2] == temp_buffer[2]) && + (outdata[3] == temp_buffer[3]) + ) + { + delay_num = (rnd >> 4) & 0xf; + delay(delay_num); + + if( (outdata[0] == temp_buffer[0]) && + (outdata[1] == temp_buffer[1]) && + (outdata[2] == temp_buffer[2]) && + (outdata[3] == temp_buffer[3]) + ) + { + return AES_SPI_PASS; + } + } + outdata[0] = 0; + outdata[1] = 0; + outdata[2] = 0; + outdata[3] = 0; + + return AES_SPI_FAIL; +} + +uint32_t aes_func_dfa_u8(uint8_t *indata, uint8_t * outdata, uint8_t mode) +{ + uint8_t delay_num; + uint8_t rnd; + uint8_t temp_buffer[16]; + uint8_t i,j; + + //frist time + aes_func_u8(indata, outdata, mode); + + //delay random time + HAL_HRNG_GetHrng(&rnd, 1); + delay_num = rnd & 0xf; + delay(delay_num); + + //second time + aes_func_u8(indata, temp_buffer, mode); + + for( i = 0; i < 16; i ++) + { + if(outdata[i] != temp_buffer[i]) + { + for ( j = 0; j < 16; j ++) + { + outdata[j] = 0; + } + return AES_SPI_FAIL; + } + } + + delay_num = (rnd >> 4) & 0xf; + delay(delay_num); + + for( i = 0; i < 16; i ++) + { + if(outdata[i] != temp_buffer[i]) + { + for ( j = 0; j < 16; j ++) + { + outdata[j] = 0; + } + return AES_SPI_FAIL; + } + } + + return AES_SPI_PASS; +} + + +void aes_cbc_mode_set(uint32_t * pdata, uint8_t mode) +{ + if(AES_SPI_CBC_MODE == mode) + { + AES->CTRL |= 0x20; + REG_IV1 = pdata[0]; + REG_IV2 = pdata[1]; + REG_IV3 = pdata[2]; + REG_IV4 = pdata[3]; + } + else + { + AES->CTRL &= (~0x20); + } +} + +uint32_t aes_crypt_security( + uint32_t *indata, + uint32_t *outdata, + uint32_t block_len, + uint8_t operation, + uint8_t mode, + uint32_t *iv +) +{ + uint32_t * pSrcData, *pDstData; + uint32_t i; + uint32_t indata_bk[4]; + uint32_t temp_iv[4]; + + __HAL_RCC_HRNG_CLK_ENABLE(); + + if(operation == AES_SPI_DECRYPTION)//decrypt + { + AES->CTRL |= 0x04; + } + else + { + AES->CTRL &= (~0x04); + } + + AES->CTRL |= ( 1 << 8); //VAES enable + AES->CTRL &= 0xffff01ff; + AES->CTRL |= (1 << 9); //4round + + pSrcData = indata; + pDstData = outdata; + + if(AES_SPI_ECB_MODE == mode) //ECB + { + aes_cbc_mode_set(iv, mode); + for ( i = 0; i < block_len; i ++) + { + aes_memory_copy(pSrcData, indata_bk, 4); + if(aes_func_dfa(indata_bk, pDstData,mode) != AES_SPI_PASS) + { + return AES_SPI_FAIL; + } + + __HAL_RCC_HRNG_CLK_ENABLE(); + + pSrcData += 4; + pDstData += 4; + } + } + else //CBC + { + if(operation == AES_SPI_ENCRYPTION) + { + aes_cbc_mode_set(iv, mode); //IV + aes_memory_copy(pSrcData, indata_bk ,4); + + indata_bk[0] = REG_IV1 ^ indata_bk[0]; + indata_bk[1] = REG_IV2 ^ indata_bk[1]; + indata_bk[2] = REG_IV3 ^ indata_bk[2]; + indata_bk[3] = REG_IV4 ^ indata_bk[3]; + + if(aes_func_dfa(indata_bk, pDstData, mode) != AES_SPI_PASS) + { + return AES_SPI_FAIL; + } + + __HAL_RCC_HRNG_CLK_ENABLE(); + + block_len -- ; + while(block_len -- ) + { + aes_cbc_mode_set(pDstData, mode); //IV + pSrcData += 4; + pDstData += 4; + aes_memory_copy(pSrcData, indata_bk ,4); + + indata_bk[0] = REG_IV1 ^ indata_bk[0]; + indata_bk[1] = REG_IV2 ^ indata_bk[1]; + indata_bk[2] = REG_IV3 ^ indata_bk[2]; + indata_bk[3] = REG_IV4 ^ indata_bk[3]; + + if( aes_func_dfa( indata_bk, pDstData, mode) != AES_SPI_PASS ) + { + return AES_SPI_FAIL; + } + + __HAL_RCC_HRNG_CLK_ENABLE(); + + } + } + else//decryption + { + aes_memory_copy(pSrcData, indata_bk ,4); + aes_cbc_mode_set(iv, mode); //IV + temp_iv[0] = indata_bk[0]; + temp_iv[1] = indata_bk[1]; + temp_iv[2] = indata_bk[2]; + temp_iv[3] = indata_bk[3]; + if( aes_func_dfa( indata_bk, pDstData,mode) != AES_SPI_PASS ) + { + return AES_SPI_FAIL; + } + + __HAL_RCC_HRNG_CLK_ENABLE(); + + + pDstData[0] = REG_IV1 ^ pDstData[0]; + pDstData[1] = REG_IV2 ^ pDstData[1]; + pDstData[2] = REG_IV3 ^ pDstData[2]; + pDstData[3] = REG_IV4 ^ pDstData[3]; + + block_len --; + + while(block_len --) + { + aes_cbc_mode_set(indata_bk, mode); + pSrcData += 4; + pDstData += 4; + aes_memory_copy(pSrcData, indata_bk ,4); + + temp_iv[0] = indata_bk[0]; + temp_iv[1] = indata_bk[1]; + temp_iv[2] = indata_bk[2]; + temp_iv[3] = indata_bk[3]; + + if( aes_func_dfa( indata_bk, pDstData, mode) != AES_SPI_PASS ) + { + return AES_SPI_FAIL; + } + + __HAL_RCC_HRNG_CLK_ENABLE(); + + + pDstData[0] = REG_IV1 ^ pDstData[0]; + pDstData[1] = REG_IV2 ^ pDstData[1]; + pDstData[2] = REG_IV3 ^ pDstData[2]; + pDstData[3] = REG_IV4 ^ pDstData[3]; + + } + } + } + + //__HAL_RCC_HRNG_CLK_DISABLE(); + return AES_SPI_PASS; +} + + + +void aes_cbc_mode_set_u8(uint8_t * pdata, uint8_t mode) +{ + if(AES_SPI_CBC_MODE == mode) + { + AES->CTRL |= 0x20; + REG_IV1 = (pdata[3] << 24) | (pdata[2] << 16) | (pdata[1] << 8) | pdata[0]; + pdata += 4; + REG_IV2 = (pdata[3] << 24) | (pdata[2] << 16) | (pdata[1] << 8) | pdata[0]; + pdata += 4; + REG_IV3 = (pdata[3] << 24) | (pdata[2] << 16) | (pdata[1] << 8) | pdata[0]; + pdata += 4; + REG_IV4 = (pdata[3] << 24) | (pdata[2] << 16) | (pdata[1] << 8) | pdata[0]; + pdata += 4; + } + else + { + AES->CTRL &= (~0x20); + } + +} + +uint32_t aes_crypt_security_u8( + uint8_t *indata, + uint8_t *outdata, + uint32_t block_len, + uint8_t operation, + uint8_t mode, + uint8_t *iv +) +{ + uint8_t * pSrcData, *pDstData; + uint32_t i; + uint8_t indata_bk[16]; +// uint32_t temp[4]; + + __HAL_RCC_HRNG_CLK_ENABLE(); + + if(operation == AES_SPI_DECRYPTION)//decrypt + { + AES->CTRL |= 0x04; + } + else + { + AES->CTRL &= (~0x04); + } + + AES->CTRL |= ( 1 << 8); //VAES enable + AES->CTRL &= 0xffff01ff; + AES->CTRL |= (1 << 9); //4round + + pSrcData = indata; + pDstData = outdata; + + if(AES_SPI_ECB_MODE == mode) + { + for ( i = 0; i < block_len; i ++) + { + aes_memory_copy_u8(pSrcData, indata_bk, 16); + if(aes_func_dfa_u8(indata_bk, pDstData, mode) != AES_SPI_PASS) + { + return AES_SPI_FAIL; + } + pSrcData += 16; + pDstData += 16; + } + } + else //CBC + { + if(operation == AES_SPI_ENCRYPTION) + { + aes_cbc_mode_set_u8(iv, mode); //ʼIV + aes_memory_copy_u8(pSrcData, indata_bk, 16); + +// temp[0] = REG_IV1 ^((indata_bk[3] << 24) | (indata_bk[2] << 16) | (indata_bk[1] << 8) | indata_bk[0]); +// temp[1] = REG_IV2 ^((indata_bk[7] << 24) | (indata_bk[6] << 16) | (indata_bk[5] << 8) | indata_bk[4]); +// temp[2] = REG_IV3 ^((indata_bk[11] << 24) | (indata_bk[10] << 16) | (indata_bk[9] << 8) | indata_bk[8]); +// temp[3] = REG_IV4 ^((indata_bk[15] << 24) | (indata_bk[14] << 16) | (indata_bk[13] << 8) | indata_bk[12]); + +// indata_bk[3] = (temp[0] >> 24) & 0xff; +// indata_bk[2] = (temp[0] >> 16) & 0xff; +// indata_bk[1] = (temp[0] >> 8) & 0xff; +// indata_bk[0] = (temp[0]) & 0xff; + +// indata_bk[7] = (temp[1] >> 24) & 0xff; +// indata_bk[6] = (temp[1] >> 16) & 0xff; +// indata_bk[5] = (temp[1] >> 8) & 0xff; +// indata_bk[4] = (temp[1]) & 0xff; +// +// indata_bk[11] = (temp[2] >> 24) & 0xff; +// indata_bk[10] = (temp[2] >> 16) & 0xff; +// indata_bk[9] = (temp[2] >> 8) & 0xff; +// indata_bk[8] = (temp[2]) & 0xff; + +// indata_bk[15] = (temp[3] >> 24) & 0xff; +// indata_bk[14] = (temp[3] >> 16) & 0xff; +// indata_bk[13] = (temp[3] >> 8) & 0xff; +// indata_bk[12] = (temp[3]) & 0xff; + + if(aes_func_dfa_u8(indata_bk, pDstData, mode) != AES_SPI_PASS) + { + return AES_SPI_FAIL; + } + block_len -- ; + while(block_len -- ) + { + aes_cbc_mode_set_u8(pDstData, mode); + pSrcData += 16; + pDstData += 16; + aes_memory_copy_u8(pSrcData, indata_bk, 16); + +// temp[0] = REG_IV1 ^ ((indata_bk[3] << 24) | (indata_bk[2] << 16) | (indata_bk[1] << 8) | indata_bk[0]); +// temp[1] = REG_IV2 ^ ((indata_bk[7] << 24) | (indata_bk[6] << 16) | (indata_bk[5] << 8) | indata_bk[4]); +// temp[2] = REG_IV3 ^ ((indata_bk[11] << 24) | (indata_bk[10] << 16) | (indata_bk[9] << 8) | indata_bk[8]); +// temp[3] = REG_IV4 ^ ((indata_bk[15] << 24) | (indata_bk[14] << 16) | (indata_bk[13] << 8) | indata_bk[12]); +// +// indata_bk[3] = (temp[0] >> 24) & 0xff; +// indata_bk[2] = (temp[0] >> 16) & 0xff; +// indata_bk[1] = (temp[0] >> 8) & 0xff; +// indata_bk[0] = (temp[0]) & 0xff; + +// indata_bk[7] = (temp[1] >> 24) & 0xff; +// indata_bk[6] = (temp[1] >> 16) & 0xff; +// indata_bk[5] = (temp[1] >> 8) & 0xff; +// indata_bk[4] = (temp[1]) & 0xff; +// +// indata_bk[11] = (temp[2] >> 24) & 0xff; +// indata_bk[10] = (temp[2] >> 16) & 0xff; +// indata_bk[9] = (temp[2] >> 8) & 0xff; +// indata_bk[8] = (temp[2]) & 0xff; + +// indata_bk[15] = (temp[3] >> 24) & 0xff; +// indata_bk[14] = (temp[3] >> 16) & 0xff; +// indata_bk[13] = (temp[3] >> 8) & 0xff; +// indata_bk[12] = (temp[3]) & 0xff; + + if( aes_func_dfa_u8( indata_bk, pDstData, mode) != AES_SPI_PASS ) + { + return AES_SPI_FAIL; + } + } + } + else//decryption + { + aes_memory_copy_u8(pSrcData, indata_bk, 16); //bufferֵindata_bk + aes_cbc_mode_set_u8(iv, mode); + + if( aes_func_dfa_u8( indata_bk, pDstData,mode) != AES_SPI_PASS ) + { + return AES_SPI_FAIL; + } + +// temp[0] = REG_IV1 ^ ((pDstData[3] << 24) | (pDstData[2] << 16) | (pDstData[1] << 8) | pDstData[0]); +// temp[1] = REG_IV2 ^ ((pDstData[7] << 24) | (pDstData[6] << 16) | (pDstData[5] << 8) | pDstData[4]); +// temp[2] = REG_IV3 ^ ((pDstData[11] << 24) | (pDstData[10] << 16) | (pDstData[9] << 8) | pDstData[8]); +// temp[3] = REG_IV4 ^ ((pDstData[15] << 24) | (pDstData[14] << 16) | (pDstData[13] << 8) | pDstData[12]); +// +// pDstData[3] = (temp[0] >> 24) & 0xff; +// pDstData[2] = (temp[0] >> 16) & 0xff; +// pDstData[1] = (temp[0] >> 8) & 0xff; +// pDstData[0] = (temp[0]) & 0xff; + +// pDstData[7] = (temp[1] >> 24) & 0xff; +// pDstData[6] = (temp[1] >> 16) & 0xff; +// pDstData[5] = (temp[1] >> 8) & 0xff; +// pDstData[4] = (temp[1]) & 0xff; +// +// pDstData[11] = (temp[2] >> 24) & 0xff; +// pDstData[10] = (temp[2] >> 16) & 0xff; +// pDstData[9] = (temp[2] >> 8) & 0xff; +// pDstData[8] = (temp[2]) & 0xff; + +// pDstData[15] = (temp[3] >> 24) & 0xff; +// pDstData[14] = (temp[3] >> 16) & 0xff; +// pDstData[13] = (temp[3] >> 8) & 0xff; +// pDstData[12] = (temp[3]) & 0xff; + + block_len --; + + while(block_len --) + { + aes_cbc_mode_set_u8(indata_bk, mode); + + pSrcData += 16; + pDstData += 16; + + aes_memory_copy_u8(pSrcData, indata_bk, 16); + + if( aes_func_dfa_u8( indata_bk, pDstData, mode) != AES_SPI_PASS ) + { + return AES_SPI_FAIL; + } + +// temp[0] = REG_IV1 ^ ((pDstData[3] << 24) | (pDstData[2] << 16) | (pDstData[1] << 8) | pDstData[0]); +// temp[1] = REG_IV2 ^ ((pDstData[7] << 24) | (pDstData[6] << 16) | (pDstData[5] << 8) | pDstData[4]); +// temp[2] = REG_IV3 ^ ((pDstData[11] << 24) | (pDstData[10] << 16) | (pDstData[9] << 8) | pDstData[8]); +// temp[3] = REG_IV4 ^ ((pDstData[15] << 24) | (pDstData[14] << 16) | (pDstData[13] << 8) | pDstData[12]); + +// pDstData[3] = (temp[0] >> 24) & 0xff; +// pDstData[2] = (temp[0] >> 16) & 0xff; +// pDstData[1] = (temp[0] >> 8) & 0xff; +// pDstData[0] = (temp[0]) & 0xff; + +// pDstData[7] = (temp[1] >> 24) & 0xff; +// pDstData[6] = (temp[1] >> 16) & 0xff; +// pDstData[5] = (temp[1] >> 8) & 0xff; +// pDstData[4] = (temp[1]) & 0xff; +// +// pDstData[11] = (temp[2] >> 24) & 0xff; +// pDstData[10] = (temp[2] >> 16) & 0xff; +// pDstData[9] = (temp[2] >> 8) & 0xff; +// pDstData[8] = (temp[2]) & 0xff; + +// pDstData[15] = (temp[3] >> 24) & 0xff; +// pDstData[14] = (temp[3] >> 16) & 0xff; +// pDstData[13] = (temp[3] >> 8) & 0xff; +// pDstData[12] = (temp[3]) & 0xff; + } + } + } + + //__HAL_RCC_HRNG_CLK_DISABLE(); //disable hrng clk + + return AES_SPI_PASS; +} + +#if 1 +void aes_crypt_normal( + uint32_t *indata, + uint32_t *outdata, + uint32_t block_len, + uint8_t operation, + uint8_t mode, + uint32_t *iv +) +{ + uint32_t i,j; + uint32_t temp_iv[4]; + uint32_t ctr_o[4]; + uint32_t cnt[4]; + + if(operation == AES_SPI_DECRYPTION)//decrypt + { + AES->CTRL |= 0x04; + } + else + { + AES->CTRL &= (~0x04); + } + + if(AES_SPI_CBC_MODE == mode) + { + AES->CTRL |= 0x20; + AES->IVIN = iv[0]; + AES->IVIN = iv[1]; + AES->IVIN = iv[2]; + AES->IVIN = iv[3]; + } + else if(AES_SPI_CTR_MODE == mode) + { +// AES->CTRL = 0x1000; //CTR mode +// AES->CTRL |= (1<<14); //addr auto en,0x4000 + AES->CTRL |= 0x5000; //CTR mode,addr auto en + AES->CTRL &= (~0x04);//encrypt + AES->STARTADDR = iv[0]; + AES->ENDADDR = iv[1]; + AES->INIDATA = iv[2]; + AES->ADDR = iv[3]; + } + else //ECB + { + AES->CTRL &= (~0x20); + } + + i = 0; + for( j = block_len; j > 0; j-- ) + { + if(AES_SPI_CTR_MODE != mode) + { + AES->DATAIN = indata[ i ]; + AES->DATAIN = indata[ i + 1 ]; + AES->DATAIN = indata[ i + 2 ]; + AES->DATAIN = indata[ i + 3 ]; + } + + AES->CTRL |= 0x01; + while( (AES->STATE & 0x01) == 0); + AES->STATE = 0x01; + + if(AES_SPI_CTR_MODE == mode) + { + ctr_o[0] = AES->DATAOUT; + ctr_o[1] = AES->DATAOUT; + ctr_o[2] = AES->DATAOUT; + ctr_o[3] = AES->DATAOUT; + +// printf("ctr_o[0] = 0x%x\n",ctr_o[0]); +// printf("ctr_o[1] = 0x%x\n",ctr_o[1]); +// printf("ctr_o[2] = 0x%x\n",ctr_o[2]); +// printf("ctr_o[3] = 0x%x\n",ctr_o[3]); +// printf("\n"); + + outdata[ i ] = ctr_o[0] ^ indata[ i ]; + outdata[ i + 1] = ctr_o[1] ^ indata[ i + 1]; + outdata[ i + 2] = ctr_o[2] ^ indata[ i + 2]; + outdata[ i + 3] = ctr_o[3] ^ indata[ i + 3]; + +// indata += 4; +// outdata += 4; + } + else + { + outdata[ i ] = AES->DATAOUT; + outdata[ i + 1] = AES->DATAOUT; + outdata[ i + 2] = AES->DATAOUT; + outdata[ i + 3] = AES->DATAOUT; + } + + i += 4; + } + + AES->STATE |= 0x04;//clear cbc flg +} + + +#endif + + +void aes_crypt_normal_u8( + uint8_t *indata, + uint8_t *outdata, + uint32_t block_len, + uint8_t operation, + uint8_t mode, + uint8_t *iv +) +{ + uint32_t j, result; + uint32_t temp_iv[4]; + + if(AES_SPI_CBC_MODE == mode) + { + AES->CTRL |= 0x20; + AES->IVIN = (iv[3] << 24) | (iv[2] << 16) | (iv[1] << 8) | iv[0]; + iv += 4; + AES->IVIN = (iv[3] << 24) | (iv[2] << 16) | (iv[1] << 8) | iv[0]; + iv += 4; + AES->IVIN = (iv[3] << 24) | (iv[2] << 16) | (iv[1] << 8) | iv[0]; + iv += 4; + AES->IVIN = (iv[3] << 24) | (iv[2] << 16) | (iv[1] << 8) | iv[0]; + iv += 4; +// if(operation == AES_DECRYPTION)//decrypt +// { +// AES->CTRL |= 0x04; //decrypt +// aes_cbc_mode_set_u8(iv,mode); //ʼIV + +// for( j = block_len; j > 0; j-- ) +// { +// temp_iv[0] = (indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]; +// indata += 4; +// temp_iv[1] = (indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]; +// indata += 4; +// temp_iv[2] = (indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]; +// indata += 4; +// temp_iv[3] = (indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]; +// indata += 4; + +// AES->DATAIN = temp_iv[0]; +// AES->DATAIN = temp_iv[1]; +// AES->DATAIN = temp_iv[2]; +// AES->DATAIN = temp_iv[3]; +// +// AES->CTRL |= 0x01; +// while((AES->STATE & 0x01) == 0); +// AES->STATE = 0x01; + +// result = REG_IV1 ^ (AES->DATAOUT); +// outdata[3] = (result >> 24) & 0xff; +// outdata[2] = (result >> 16) & 0xff; +// outdata[1] = (result >> 8) & 0xff; +// outdata[0] = (result) & 0xff; +// outdata += 4; +// +// result = REG_IV2 ^ (AES->DATAOUT); +// outdata[3] = (result >> 24) & 0xff; +// outdata[2] = (result >> 16) & 0xff; +// outdata[1] = (result >> 8) & 0xff; +// outdata[0] = (result) & 0xff; +// outdata += 4; + +// result = REG_IV3 ^ (AES->DATAOUT); +// outdata[3] = (result >> 24) & 0xff; +// outdata[2] = (result >> 16) & 0xff; +// outdata[1] = (result >> 8) & 0xff; +// outdata[0] = (result) & 0xff; +// outdata += 4; +// +// result = REG_IV4 ^ (AES->DATAOUT); +// outdata[3] = (result >> 24) & 0xff; +// outdata[2] = (result >> 16) & 0xff; +// outdata[1] = (result >> 8) & 0xff; +// outdata[0] = (result) & 0xff; +// outdata += 4; +// +// REG_IV1 = temp_iv[0]; +// REG_IV2 = temp_iv[1]; +// REG_IV3 = temp_iv[2]; +// REG_IV4 = temp_iv[3]; +// } +// } +// else //cbc, encrypt +// { +// AES->CTRL &= (~0x04); //encrypt +// aes_cbc_mode_set_u8(iv,mode); //ʼIV + +// for( j = block_len; j > 0; j-- ) +// { +// AES->DATAIN = ((indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]) ^ REG_IV1; //0x37A5AB3E +// indata += 4; +// AES->DATAIN = ((indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]) ^ REG_IV2; //0x0C32BA71 +// indata += 4; +// AES->DATAIN = ((indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]) ^ REG_IV3; //0x6F177462 +// indata += 4; +// AES->DATAIN = ((indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]) ^ REG_IV4; //0x8596B344 +// indata += 4; +// +// AES->CTRL |= 0x01; +// while((AES->STATE & 0x01) == 0); +// AES->STATE = 0x01; + +// result = AES->DATAOUT; //0x099ed143 +// outdata[3] = (result >> 24) & 0xff; +// outdata[2] = (result >> 16) & 0xff; +// outdata[1] = (result >> 8) & 0xff; +// outdata[0] = (result) & 0xff; +// REG_IV1 = result; //IV +// outdata += 4; + +// result = AES->DATAOUT; +// outdata[3] = (result >> 24) & 0xff; +// outdata[2] = (result >> 16) & 0xff; +// outdata[1] = (result >> 8) & 0xff; +// outdata[0] = (result) & 0xff; +// REG_IV2 = result; //IV +// outdata += 4; + +// result = AES->DATAOUT; +// outdata[3] = (result >> 24) & 0xff; +// outdata[2] = (result >> 16) & 0xff; +// outdata[1] = (result >> 8) & 0xff; +// outdata[0] = (result) & 0xff; +// REG_IV3 = result; //IV +// outdata += 4; +// +// result = AES->DATAOUT; +// outdata[3] = (result >> 24) & 0xff; +// outdata[2] = (result >> 16) & 0xff; +// outdata[1] = (result >> 8) & 0xff; +// outdata[0] = (result) & 0xff; +// REG_IV4 = result; //IV +// outdata += 4; +// } +// } + } + else //ECB mode + { + AES->CTRL &= (~0x20); +// if(operation == AES_DECRYPTION)//decrypt +// { +// AES->CTRL |= 0x04; +// } +// else +// { +// AES->CTRL &= (~0x04); +// } +// +// for( j = block_len; j > 0; j-- ) +// { +// AES->DATAIN = (indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]; +// indata += 4; +// AES->DATAIN = (indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]; +// indata += 4; +// AES->DATAIN = (indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]; +// indata += 4; +// AES->DATAIN = (indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]; +// indata += 4; + +// AES->CTRL |= 0x01; +// while((AES->STATE & 0x01) == 0); +// AES->STATE = 0x01; + +// result = AES->DATAOUT; +// outdata[3] = (result >> 24) & 0xff; +// outdata[2] = (result >> 16) & 0xff; +// outdata[1] = (result >> 8) & 0xff; +// outdata[0] = (result) & 0xff; +// outdata += 4; + +// result = AES->DATAOUT; +// outdata[3] = (result >> 24) & 0xff; +// outdata[2] = (result >> 16) & 0xff; +// outdata[1] = (result >> 8) & 0xff; +// outdata[0] = (result) & 0xff; +// outdata += 4; + +// result = AES->DATAOUT; +// outdata[3] = (result >> 24) & 0xff; +// outdata[2] = (result >> 16) & 0xff; +// outdata[1] = (result >> 8) & 0xff; +// outdata[0] = (result) & 0xff; +// outdata += 4; + +// result = AES->DATAOUT; +// outdata[3] = (result >> 24) & 0xff; +// outdata[2] = (result >> 16) & 0xff; +// outdata[1] = (result >> 8) & 0xff; +// outdata[0] = (result) & 0xff; +// outdata += 4; +// } + + } + + if(operation == AES_SPI_DECRYPTION)//decrypt + { + AES->CTRL |= 0x04; + } + else + { + AES->CTRL &= (~0x04); + } + + for( j = block_len; j > 0; j-- ) + { + AES->DATAIN = (indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]; + indata += 4; + AES->DATAIN = (indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]; + indata += 4; + AES->DATAIN = (indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]; + indata += 4; + AES->DATAIN = (indata[3] << 24) | (indata[2] << 16) | (indata[1] << 8) | indata[0]; + indata += 4; + + AES->CTRL |= 0x01; + while( (AES->STATE & 0x01) == 0); + AES->STATE = 0x01; + + result = AES->DATAOUT; + outdata[3] = (result >> 24) & 0xff; + outdata[2] = (result >> 16) & 0xff; + outdata[1] = (result >> 8) & 0xff; + outdata[0] = (result) & 0xff; + outdata += 4; + + result = AES->DATAOUT; + outdata[3] = (result >> 24) & 0xff; + outdata[2] = (result >> 16) & 0xff; + outdata[1] = (result >> 8) & 0xff; + outdata[0] = (result) & 0xff; + outdata += 4; + + result = AES->DATAOUT; + outdata[3] = (result >> 24) & 0xff; + outdata[2] = (result >> 16) & 0xff; + outdata[1] = (result >> 8) & 0xff; + outdata[0] = (result) & 0xff; + outdata += 4; + + result = AES->DATAOUT; + outdata[3] = (result >> 24) & 0xff; + outdata[2] = (result >> 16) & 0xff; + outdata[1] = (result >> 8) & 0xff; + outdata[0] = (result) & 0xff; + outdata += 4; + } + + AES->STATE |= 0x04;//clear cbc flg +} + + +uint32_t HAL_AES_SPI_Crypt( + uint32_t *indata, + uint32_t *outdata, + uint32_t block_len, + uint8_t operation, + uint8_t mode, + uint32_t *iv, + uint32_t security_mode +) +{ + uint32_t flag; + + /* Enable Clock */ + __HAL_RCC_AES_SPI1_CLK_ENABLE(); + + if(security_mode == AES_SPI_NORMAL_MODE) + { + aes_crypt_normal(indata, outdata, block_len, operation, mode, iv); + __HAL_RCC_AES_SPI1_CLK_DISABLE(); + return AES_SPI_PASS; + } + else + { + __HAL_RCC_HRNG_CLK_ENABLE(); + + flag = aes_crypt_security(indata, outdata, block_len, operation, mode, iv); + + __HAL_RCC_HRNG_CLK_DISABLE(); + __HAL_RCC_AES_SPI1_CLK_DISABLE(); + + return flag; + } +} + + +uint32_t HAL_AES_SPI_Crypt_U8( + uint8_t *indata, + uint8_t *outdata, + uint32_t block_len, + uint8_t operation, + uint8_t mode, + uint8_t *iv, + uint32_t security_mode +) +{ + uint32_t flag; + + /* Enable Clock */ + __HAL_RCC_AES_SPI1_CLK_ENABLE(); + + if(security_mode == AES_SPI_NORMAL_MODE) + { + aes_crypt_normal_u8(indata, outdata, block_len, operation, mode, iv); + __HAL_RCC_AES_SPI1_CLK_DISABLE(); + return AES_SPI_PASS; + } + else + { + flag = aes_crypt_security_u8(indata, outdata, block_len, operation, mode, iv); + __HAL_RCC_AES_SPI1_CLK_DISABLE(); + return flag; + } +} + + + + +//uint32_t aes_crypt_CTR(uint32_t *indata, uint32_t *outdata, uint32_t block_len, uint8_t operation, uint32_t *ctr_iv, uint32_t *counter_val) +//{ +// uint32_t ctr_o[4]; +// uint32_t i; +// uint32_t cnt[4]; +// for(i = 0; i < 4; i++) +// { +// cnt[i] = ctr_iv[i]; +// } +// +// if(block_len == 0) +// { +// return AES_FAIL; +// } +// +//// enable_module(BIT_AES); +//// REG_AESCTRL = 0; +//// REG_UAC_CTRL = 0x0; +// +// /* Enable Clock */ +// __HAL_RCC_AESSPI1_CLK_ENABLE(); +// + +// for(i = 0; i < block_len; i++) +// { +// printf("cnt = 0x%08x %08x %08x %08x\n",cnt[0],cnt[1],cnt[2],cnt[3]); +// aes_func(cnt, ctr_o, AES_ECB_MODE); +// printf("ctr_o = 0x%08x %08x %08x %08x\n",ctr_o[0],ctr_o[1],ctr_o[2],ctr_o[3]); +// printf("indata = 0x%08x %08x %08x %08x\n\n",indata[0],indata[1],indata[2],indata[3]); + +// outdata[0] = ctr_o[0] ^ indata[0]; +// outdata[1] = ctr_o[1] ^ indata[1]; +// outdata[2] = ctr_o[2] ^ indata[2]; +// outdata[3] = ctr_o[3] ^ indata[3]; +// printf("outdata = 0x%08x %08x %08x %08x\n\n",outdata[0],outdata[1],outdata[2],outdata[3]); +// +// indata += 4; +// outdata += 4; +// cnt[3]++; +// if(cnt[3] == 0x00000000) +// cnt[2]++; +// } +// +// disable_module(BIT_AES); +// +// return AES_PASS; +//} + +/****************************************************************************** + + * Name: aes_set_key + * Function: aes_set_key + * Input: + keyin -- pointer to buffer of key + key_len -- select length of key(AES_KEY_128/ AES_KEY_192/ AES_KEY_256) + swap_en -- AES_SWAP_ENABLE, AES_SWAP_DISABLE + * Return: None +*******************************************************************************/ +void HAL_AES_SetKey_CTR(uint32_t *keyin, uint8_t key_len, uint32_t *iv, uint8_t swap_en) +{ + /* Enable Clock */ + __HAL_RCC_AES_SPI1_CLK_ENABLE(); + + AES_SPI1->CTRL = (1<<13);// sel high 5 bit +// AES->CTRL = 0x1000; //CTR mode + + if(AES_SPI_SWAP_ENABLE == swap_en) + { + AES_SPI1->CTRL |= 0x10; + } + + if(AES_SPI_KEY_192 == key_len) + { + AES_SPI1->CTRL |= (1 << 6); + } + else if(AES_SPI_KEY_256 == key_len) + { + AES_SPI1->CTRL |= (2 << 6); + } + + //key128 + AES_SPI1->KEYIN = keyin[0]; + AES_SPI1->KEYIN = keyin[1]; + AES_SPI1->KEYIN = keyin[2]; + AES_SPI1->KEYIN = keyin[3]; + + if(AES_SPI_KEY_192 == key_len) + { +// AES->CTRL |= (1 << 6); + AES_SPI1->KEYIN = keyin[4]; + AES_SPI1->KEYIN = keyin[5]; + } + else if(AES_SPI_KEY_256 == key_len) + { +// AES->CTRL |= (2 << 6); + AES_SPI1->KEYIN = keyin[4]; + AES_SPI1->KEYIN = keyin[5]; + AES_SPI1->KEYIN = keyin[6]; + AES_SPI1->KEYIN = keyin[7]; + } + + AES_SPI1->STARTADDR = iv[0]; + AES_SPI1->ENDADDR = iv[1]; + AES_SPI1->INIDATA = iv[2]; + AES_SPI1->ADDR = iv[3]; + +// __HAL_RCC_AESSPI1_CLK_DISABLE(); + +} + +void HAL_AES_SPI_Crypt_CTR( + uint32_t *indata, + uint32_t *outdata, + uint32_t *iv, + uint32_t block_len, + uint8_t auto_en +) +{ + uint32_t i,j; + uint32_t ctr_o[4]; + uint32_t cnt[4]; + + /* Enable Clock */ + __HAL_RCC_AES_SPI1_CLK_ENABLE(); + + AES_SPI1->CTRL &= (~0x04);//encrypt + AES_SPI1->CTRL |= (1<<13);//AES mode + + if(AES_SPI_ADDR_AUTO_ENABLE == auto_en) + { +// AES_SPI->CTRL = 0x1000; //CTR EN, CTR mode +// AES_SPI->CTRL |= 0x4000; + AES_SPI1->CTRL |= (1<<14);//ADDR auto + AES_SPI1->CTRL |= (1<<12);//CTR EN, CTR mode + } + else + { + AES_SPI1->CTRL &= ~0x1000; //clr CTR mode + AES_SPI1->CTRL &= ~(1<<5); //clr CBC mode + AES_SPI1->CTRL &= ~(1<<14);//clr addr_auto + for(i = 0; i < 4; i++) + { + cnt[i] = iv[i]; + } +//printf("222 -- AES->CTRL = 0x%x\n",AES->CTRL); + + } + + AES_SPI1->STARTADDR = iv[0]; + AES_SPI1->ENDADDR = iv[1]; + AES_SPI1->INIDATA = iv[2]; + AES_SPI1->ADDR = iv[3]; + +// i = 0; + for( j = block_len; j > 0; j-- ) + { + if(AES_SPI_ADDR_AUTO_DISABLE == auto_en) + { +// AES->STARTADDR = cnt[0]; +// AES->ENDADDR = cnt[1]; +// AES->INIDATA = cnt[2]; +// AES->ADDR = cnt[3]; +// printf("cnt[3] = 0x%x\n",cnt[3]); + AES_SPI1->DATAIN = cnt[ 0]; + AES_SPI1->DATAIN = cnt[ 1 ]; + AES_SPI1->DATAIN = cnt[ 2 ]; + AES_SPI1->DATAIN = cnt[ 3 ]; + +// printf("cnt[0] = 0x%x\n",cnt[0]); +// printf("cnt[1] = 0x%x\n",cnt[1]); +// printf("cnt[2] = 0x%x\n",cnt[2]); +// printf("cnt[3] = 0x%x\n",cnt[3]); + } + + AES_SPI1->CTRL |= 0x01; + while( (AES_SPI1->STATE & 0x01) == 0); + AES_SPI1->STATE = 0x01; + + ctr_o[0] = AES_SPI1->DATAOUT; + ctr_o[1] = AES_SPI1->DATAOUT; + ctr_o[2] = AES_SPI1->DATAOUT; + ctr_o[3] = AES_SPI1->DATAOUT; + +// printf("ctr_o[0] = 0x%x\n",ctr_o[0]); +// printf("ctr_o[1] = 0x%x\n",ctr_o[1]); +// printf("ctr_o[2] = 0x%x\n",ctr_o[2]); +// printf("ctr_o[3] = 0x%x\n",ctr_o[3]); +// printf("\n"); +// +// printf("indata[0] = 0x%x\n",indata[0]); +// printf("indata[1] = 0x%x\n",indata[1]); +// printf("indata[2] = 0x%x\n",indata[2]); +// printf("indata[3] = 0x%x\n",indata[3]); +// printf("\n"); + + outdata[0] = ctr_o[0] ^ indata[0]; + outdata[1] = ctr_o[1] ^ indata[1]; + outdata[2] = ctr_o[2] ^ indata[2]; + outdata[3] = ctr_o[3] ^ indata[3]; + +// printf("outdata[0] = 0x%x\n",outdata[0]); +// printf("outdata[1] = 0x%x\n",outdata[1]); +// printf("outdata[2] = 0x%x\n",outdata[2]); +// printf("outdata[3] = 0x%x\n",outdata[3]); +// printf("\n"); + + indata += 4; + outdata += 4; + + if(AES_SPI_ADDR_AUTO_DISABLE == auto_en) + { + cnt[3] += 0x10; +// cnt[3] += 0x1; + } + + } + + __HAL_RCC_AES_SPI1_CLK_DISABLE(); +} + +//otfdec_en : 1: select PUF + RANDOM 3: UID+RANDOM +//write only once after sysreset +void otfdec_en(uint8_t otfdec_en, uint8_t spi_sel) +{ + AES_SPI1->OTFDEC_CTRL = otfdec_en; + AES_SPI1->OTFDEC_SPI_CTRL = spi_sel; + +// printf("spi_sel = 0x%x\n", spi_sel); +// printf("AES_SPI1->OTFDEC_CTRL = 0x%x\n", AES_SPI1->OTFDEC_SPI_CTRL); + +} + +void otfdec_encrypt1(uint32_t *datain, uint32_t start_addr, uint32_t length,uint32_t *dataout) +{ + uint32_t i; + uint32_t ctr_o[4]; + uint32_t addr; + uint8_t otfdec_en; + + + otfdec_en = AES_SPI1->OTFDEC_CTRL; +// AES_SPI1->ENDADDR = MEM_ADDR + FIRST_SIZE -1; //32k + + if(otfdec_en) + { + AES_SPI1->CTRL = 0x8000;//encrypt + + addr = start_addr; + AES_SPI1->ADDR = addr; + for( i = length; i > 0; i-- ) + { + AES_SPI1->ADDR1 = addr; + addr += 16; + AES_SPI1->CTRL |= 0x01; + while( (AES_SPI1->STATE & 0x01) == 0); + AES_SPI1->STATE = 0x01; + + ctr_o[3] = AES_SPI1->DATAOUT1; + ctr_o[2] = AES_SPI1->DATAOUT1; + ctr_o[1] = AES_SPI1->DATAOUT1; + ctr_o[0] = AES_SPI1->DATAOUT1; + + dataout[0] = ctr_o[0] ^ datain[0]; + dataout[1] = ctr_o[1] ^ datain[1]; + dataout[2] = ctr_o[2] ^ datain[2]; + dataout[3] = ctr_o[3] ^ datain[3]; +// if(i==length) +// { +// str_printf("ctr_o[0] is 0x%x!\n",ctr_o[0]); +// str_printf("datain[0] is 0x%x!\n",datain[0]); +// str_printf("dataout[0] is 0x%x!\n",dataout[0]); +// } + datain += 4; + dataout += 4; + + } + } + else + { + for( i = 0; i <(length<<2); i++) + { + dataout[i] = datain[i]; + } + } +} + +void otfdec_encrypt(uint32_t *datain, uint32_t start_addr, uint32_t length,uint32_t *dataout) +{ + uint32_t i; + uint32_t ctr_o[4]; + uint32_t addr; + uint8_t otfdec_en; + + + otfdec_en = AES_SPI1->OTFDEC_CTRL; +// AES_SPI1->ENDADDR2 = MEM_ADDR + SECOND_SIZE -1; //128k + + if(otfdec_en) + { + AES_SPI1->CTRL = 0x000;//encrypt + + addr = start_addr; + + for( i = length; i > 0; i-- ) + { + AES_SPI1->ADDR = addr; + addr += 16; + AES_SPI1->CTRL |= 0x01; + while( (AES_SPI1->STATE & 0x01) == 0); + AES_SPI1->STATE = 0x01; + + ctr_o[0] = AES_SPI1->DATAOUT; + ctr_o[1] = AES_SPI1->DATAOUT; + ctr_o[2] = AES_SPI1->DATAOUT; + ctr_o[3] = AES_SPI1->DATAOUT; + + dataout[0] = ctr_o[0] ^ datain[0]; + dataout[1] = ctr_o[1] ^ datain[1]; + dataout[2] = ctr_o[2] ^ datain[2]; + dataout[3] = ctr_o[3] ^ datain[3]; +// if(i==length) +// { +// str_printf("ctr_o[0] is 0x%x!\n",ctr_o[0]); +// str_printf("datain[0] is 0x%x!\n",datain[0]); +// str_printf("dataout[0] is 0x%x!\n",dataout[0]); +// } + datain += 4; + dataout += 4; + + } + } + else + { + for( i = 0; i <(length<<2); i++) + { + dataout[i] = datain[i]; + } + } +} + + +//write only once after sysreset +void otfdec_uid_set_key(uint32_t *uid, uint32_t *random) +{ + AES_SPI1->UID = uid[0]; + AES_SPI1->UID = uid[1]; + AES_SPI1->UID = uid[2]; + AES_SPI1->UID = uid[3]; + + AES_SPI1->RAND0 = random[0]; + AES_SPI1->RAND1 = random[1]; + AES_SPI1->ENDADDR = MEM_ADDR + FIRST_SIZE -1; //32k +} + +void otfdec_uid_set_key2(uint32_t *key2, uint32_t *random) +{ + AES_SPI1->KEYIN2 = key2[0]; + AES_SPI1->KEYIN2 = key2[1]; + AES_SPI1->KEYIN2 = key2[2]; + AES_SPI1->KEYIN2 = key2[3]; + + AES_SPI1->RAND2 = random[0]; + AES_SPI1->RAND3 = random[1]; + + AES_SPI1->ENDADDR2 = MEM_ADDR + SECOND_SIZE -1; //128k +} + +void otfdec_uid_set_key3(uint32_t *key3) +{ + AES_SPI1->KEYIN3 = key3[0]; + AES_SPI1->KEYIN3 = key3[1]; + AES_SPI1->KEYIN3 = key3[2]; + AES_SPI1->KEYIN3 = key3[3]; +} + +void otfdec_update_random23(uint32_t *random) +{ + uint32_t temp; + AES_SPI1->OTFDEC_SPI_CTRL |= 0x20; + temp = AES_SPI1->OTFDEC_SPI_CTRL; + random[0] = AES_SPI1->RAND2; + random[1] = AES_SPI1->RAND3; +} + + +#endif + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_cde.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_cde.c new file mode 100644 index 0000000000..28f046ea2e --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_cde.c @@ -0,0 +1,38 @@ +/****************************************************************************** +*@file : hal_cde.c +*@brief : cde module file +*@ver : 1.0.0 +*@date : 2023.2.3 +******************************************************************************/ + +//ARMCC command line options: --target=arm-arm-none-eabi -mcpu=cortex-m33+cdecpN +//for example: --target=arm-arm-none-eabi -mcpu=cortex-m33+cdecp0 + +//fromelf command line option: --coprocN=CDE +//for example: fromelf.exe --bin -c --cpu=8.1-M.Main.mve.fp --coproc0=CDE --output ./Objects/Project.bin ./Objects/Project.axf +//for example: fromelf.exe --bin -c --cpu=cortex-m33 --coproc0=CDE --output ./Objects/Project.bin ./Objects/Project.axf + + +#include "hal.h" + +/****************************************************************************** +*@brief : enable coopration processor number +*@param : num : coopration processor number +*@return: none +******************************************************************************/ +void HAL_CDE_EnableCPx(int num) +{ + SCB->CPACR |= (3UL << num*2); //0xE000ED88 + HAL_SimpleDelay(10); +} + +/****************************************************************************** +*@brief : enable coopration processor number +*@param : num : coopration processor number +*@return: none +******************************************************************************/ +void HAL_CDE_DisableCPx(int num) +{ + SCB->CPACR &= ~(3UL << num*2); //0xE000ED88 + HAL_SimpleDelay(10); +} diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_comp.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_comp.c new file mode 100644 index 0000000000..98eea88ce4 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_comp.c @@ -0,0 +1,269 @@ + +/****************************************************************************** +*@file : hal_comp.c +*@brief : COMP HAL module driver. +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ + +#include "hal.h" + +#ifdef HAL_COMP_MODULE_ENABLED + +/****************************************************************************** +*@brief : COMP MSP Initialization.such as module clock, IO share, ... +* COMP1 VinP: PB0, PB2 +* COMP1 VinM: DAC1,PB1,PC4,VREF_AVDD +* COMP1 Vout: PA11(AF5), PB8(AF1), PC5(AF14), PE12(AF15), PF4(AF5) +*@param : hcomp: COMP handle +*@return: None +******************************************************************************/ +__weak void HAL_COMP_MspInit(COMP_HandleTypeDef* hcomp) +{ + //Prevent unused argument(s) compilation warning + UNUSED(hcomp); + + //NOTE : This function should not be modified. + //when the callback is needed,the HAL_COMP_MspInit could be implemented in the user file +} + +/****************************************************************************** +*@brief : COMP MSP De-Initialization. +*@param : hcomp: COMP handle +*@return: None +******************************************************************************/ +__weak void HAL_COMP_MspDeInit(COMP_HandleTypeDef* hcomp) +{ + //Prevent unused argument(s) compilation warning + UNUSED(hcomp); + + //NOTE : This function should not be modified. + //when the callback is needed,the HAL_COMP_MspDeInit could be implemented in the user file +} + +/****************************************************************************** +*@brief : Initialize the COMP. +*@note : If the selected comparator is locked, initialization can't be performed. +* To unlock the configuration, perform a module reset. +*@param : hcomp: COMP handle +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_COMP_Init(COMP_HandleTypeDef* hcomp) +{ + uint32_t tempReg; + + if(hcomp == NULL) + { + return HAL_ERROR; + } + + assert_param(IS_COMP_INSTANCE(hcomp->Instance)); + + /* Init the low level hardware : GPIO, CLOCK */ + HAL_COMP_MspInit(hcomp); + + //check lock status + if(hcomp->Instance->CR & COMP_CR_LOCK) + { + return HAL_ERROR; + } + + tempReg = 0; + + assert_param(IS_COMP_POLARITY(hcomp->Init.Polarity)); + assert_param(IS_COMP_BLANKSEL(hcomp->Init.BlankSel)); + assert_param(IS_COMP_HYS(hcomp->Init.HYS)); + tempReg |= ((hcomp->Init.Polarity & COMP_CR_POLARITY_Msk) | \ + (hcomp->Init.BlankSel & COMP_CR_BLANKSEL_Msk) | \ + (hcomp->Init.HYS & COMP_CR_HYS_Msk)); + + assert_param(IS_COMP_INPSEL(hcomp->Init.InPSel)); + tempReg |= hcomp->Init.InPSel & COMP_CR_INPSEL_Msk; + + assert_param(IS_COMP_INMSEL(hcomp->Init.InMSel)); + tempReg |= hcomp->Init.InMSel & COMP_CR_INMSEL_Msk; + + + if(hcomp->Init.InMSel == COMP_INMSEL_VREF_AVDD) + { + assert_param(IS_COMP_CRVSEL(hcomp->Init.CrvSel)); + assert_param(IS_COMP_CRVEN(hcomp->Init.CrvEn)); + tempReg |= ((hcomp->Init.CrvSel & COMP_CR_CRV_SEL_Msk) | \ + (hcomp->Init.CrvEn & COMP_CR_CRV_EN_Msk)); + + if(hcomp->Init.CrvEn == COMP_CRV_ENABLE) + { + assert_param(IS_COMP_CRVCFG(hcomp->Init.CrvCfg)); + tempReg |= hcomp->Init.CrvCfg << COMP_CR_CRV_CFG_Pos; + } + } + + assert_param(IS_COMP_FLTEN(hcomp->Init.FltEn)); + tempReg |= hcomp->Init.FltEn & COMP_CR_FLTEN_Msk; + if(hcomp->Init.FltEn == COMP_FLT_ENABLE) + { + assert_param(IS_COMP_FLTTIME(hcomp->Init.FltTime)); + tempReg |= hcomp->Init.FltTime & COMP_CR_FLTTIME_Msk; + } + + CLEAR_BIT(hcomp->Instance->CR, COMP_CR_EN); //disable + + //Write the COMP_CR register + WRITE_REG(hcomp->Instance->CR,tempReg); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : de-Initialize the COMP. +*@note : If the selected comparator is locked, de-initialization can't be performed. +* To unlock the configuration, perform a module reset. +*@param : hcomp: COMP handle +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_COMP_DeInit(COMP_HandleTypeDef* hcomp) +{ + if(hcomp == NULL) + { + return HAL_ERROR; + } + + assert_param(IS_COMP_INSTANCE(hcomp->Instance)); + + //check lock status + if(hcomp->Instance->CR & COMP_CR_LOCK) + { + return HAL_ERROR; + } + + /* Set COMP_CSR register to reset value */ + WRITE_REG(hcomp->Instance->CR, 0x00000000UL); + + HAL_COMP_MspDeInit(hcomp); + + memset(&hcomp->Init, 0, sizeof(hcomp->Init)); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Enable comparator. +*@param : hcomp: COMP handle +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_COMP_Enable(COMP_HandleTypeDef* hcomp) +{ + if(hcomp == NULL) + { + return HAL_ERROR; + } + + assert_param(IS_COMP_INSTANCE(hcomp->Instance)); + + //check lock status + if(hcomp->Instance->CR & COMP_CR_LOCK) + { + return HAL_ERROR; + } + + SET_BIT(hcomp->Instance->CR, COMP_CR_EN); //enable + + return HAL_OK; +} + +/****************************************************************************** +*@brief : disable comparator. +*@param : hcomp: COMP handle +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_COMP_Disable(COMP_HandleTypeDef* hcomp) +{ + if(hcomp == NULL) + { + return HAL_ERROR; + } + + assert_param(IS_COMP_INSTANCE(hcomp->Instance)); + + //check lock status + if(hcomp->Instance->CR & COMP_CR_LOCK) + { + return HAL_ERROR; + } + + CLEAR_BIT(hcomp->Instance->CR, COMP_CR_EN); //disable + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Get the output level of the comparator. the value is stored in hcomp. +*@param : hcomp: COMP handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_COMP_GetOutputLevel(COMP_HandleTypeDef* hcomp) +{ + if(hcomp == NULL) + { + return HAL_ERROR; + } + + assert_param(IS_COMP_INSTANCE(hcomp->Instance)); + + hcomp->OutputLevelOrg = (hcomp->Instance->SR & COMP_SR_VCOUT1_ORG) ? 1 : 0; + hcomp->OutputLevel = (hcomp->Instance->SR & COMP_SR_VCOUT1) ? 1 : 0; + + return HAL_OK; +} + + +/****************************************************************************** +*@brief : start comparator. +*@param : hcomp: COMP handle +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_COMP_Start(COMP_HandleTypeDef *hcomp) +{ + return(HAL_COMP_Enable(hcomp)); +} + + +/****************************************************************************** +*@brief : stop comparator. +*@param : hcomp: COMP handle +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_COMP_Stop(COMP_HandleTypeDef *hcomp) +{ + return(HAL_COMP_Disable(hcomp)); +} + + +/****************************************************************************** +*@brief : lock comparator. +*@param : hcomp: COMP handle +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_COMP_Lock(COMP_HandleTypeDef* hcomp) +{ + __IO uint32_t *pCRx; + + if(hcomp == NULL) + { + return HAL_ERROR; + } + + assert_param(IS_COMP_INSTANCE(hcomp->Instance)); + + //check lock status + if(hcomp->Instance->CR & COMP_CR_LOCK) + { + return HAL_OK; + } + + SET_BIT(hcomp->Instance->CR, COMP_CR_LOCK); //lock + + return HAL_OK; +} + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_cortex.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_cortex.c new file mode 100644 index 0000000000..8a2e069bba --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_cortex.c @@ -0,0 +1,478 @@ +/****************************************************************************** +*@file : hal_cortex.c +*@brief : CORTEX HAL module driver +******************************************************************************/ + + +#include "hal.h" + +#if (__MPU_PRESENT == 1) +static void MPU_ConfigRegion(MPU_Type* MPUx, MPU_Region_InitTypeDef *MPU_RegionInit); +static void MPU_ConfigMemoryAttributes(MPU_Type* MPUx, MPU_Attributes_InitTypeDef *MPU_AttributesInit); +#endif /* __MPU_PRESENT */ + +/****************************************************************************** +*@brief : Sets the priority grouping field (preemption priority and subpriority) using the required unlock sequence. +*@param : PriorityGroup: The priority grouping bits length. +* This parameter can be one of the following values: +* @arg NVIC_PRIORITYGROUP_0: 0 bits for pre-emption priority, 4 bits for subpriority +* @arg NVIC_PRIORITYGROUP_1: 1 bits for pre-emption priority, 3 bits for subpriority +* @arg NVIC_PRIORITYGROUP_2: 2 bits for pre-emption priority, 2 bits for subpriority +* @arg NVIC_PRIORITYGROUP_3: 3 bits for pre-emption priority, 1 bits for subpriority +* @arg NVIC_PRIORITYGROUP_4: 4 bits for pre-emption priority, 0 bits for subpriority +*@note : When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible. +* The pending IRQ priority will be managed only by the subpriority. +*@ret : none +******************************************************************************/ +void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); + + /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ + NVIC_SetPriorityGrouping(PriorityGroup); +} + +/****************************************************************************** +*@brief : Sets the priority of an interrupt. +*@param : IRQn: External interrupt number. +* This parameter can be an enumerator of IRQn_Type enumeration +*@param : PreemptPriority: The preemption priority for the IRQn channel. +* This parameter can be a value between 0 and 15. +* A lower priority value indicates a higher priority +*@param : SubPriority: he subpriority level for the IRQ channel. +* This parameter can be a value between 0 and 15. +* A lower priority value indicates a higher priority. +*@ret : None +******************************************************************************/ +void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t prioritygroup = 0x00U; + + /* Check the parameters */ + assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); + assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); + + prioritygroup = NVIC_GetPriorityGrouping(); + + NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); +} + +/****************************************************************************** +*@brief : Enables a device specific interrupt in the NVIC interrupt controller. +*@param : IRQn: External interrupt number. +* This parameter can be an enumerator of IRQn_Type enumeration +*@ret : None +******************************************************************************/ +void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Enable interrupt */ + NVIC_EnableIRQ(IRQn); +} + +/****************************************************************************** +*@brief : Disables a device specific interrupt in the NVIC interrupt controller. +*@param : IRQn: External interrupt number. +* This parameter can be an enumerator of IRQn_Type enumeration +*@ret : None +******************************************************************************/ +void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Disable interrupt */ + NVIC_DisableIRQ(IRQn); +} + + +/****************************************************************************** +*@brief : Initiates a system reset request to reset the MCU. +*@ret : None +******************************************************************************/ +void HAL_NVIC_SystemReset(void) +{ + /* System Reset */ + NVIC_SystemReset(); +} + +/****************************************************************************** +*@brief : Initializes the System Timer and its interrupt, and starts the System Tick Timer. +* Counter is in free running mode to generate periodic interrupts. +*@param : TicksNum: Specifies the ticks Number of ticks between two interrupts. +*@ret : None +******************************************************************************/ +HAL_StatusTypeDef HAL_SYSTICK_Config(uint32_t TicksNum) +{ + if(SysTick_Config(TicksNum)==0) + { + return HAL_OK; + } + else + { + return HAL_ERROR; + } +} + +#if (__MPU_PRESENT == 1U) + +/****************************************************************************** +*@brief : Enable the MPU. +*@param : MPU_Control: Specifies the control mode of the MPU during hard fault, +* NMI, FAULTMASK and privileged access to the default memory +* This parameter can be one of the following values: +* @arg MPU_HFNMI_PRIVDEF_NONE +* @arg MPU_HARDFAULT_NMI +* @arg MPU_PRIVILEGED_DEFAULT +* @arg MPU_HFNMI_PRIVDEF +*@ret : None +******************************************************************************/ +void HAL_MPU_Enable(uint32_t MPU_Control) +{ + /* Enable the MPU */ + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; + + /* Enable fault exceptions */ + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; + + /* Ensure MPU setting take effects */ + __DSB(); + __ISB(); +} + +/****************************************************************************** +*@brief : Disables the MPU. +*@ret : None +******************************************************************************/ +void HAL_MPU_Disable(void) +{ + /* Make sure outstanding transfers are done */ + __DMB(); + + /* Disable fault exceptions */ + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; + + /* Disable the MPU and clear the control register*/ + MPU->CTRL = 0U; +} + + +/****************************************************************************** +*@brief : Initializes and configures the Region and the memory to be protected. +*@param : MPU_RegionInit: Pointer to a MPU_Region_InitTypeDef structure that contains +* the initialization and configuration information. +*@ret : None +******************************************************************************/ +void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_RegionInit) +{ + MPU_ConfigRegion(MPU, MPU_RegionInit); +} + +/****************************************************************************** +*@brief : Initialize and configure the memory attributes. +*@param : MPU_AttributesInit Pointer to a MPU_Attributes_InitTypeDef structure that contains +* the initialization and configuration information. +*@ret : None +******************************************************************************/ +void HAL_MPU_ConfigMemoryAttributes(MPU_Attributes_InitTypeDef *MPU_AttributesInit) +{ + MPU_ConfigMemoryAttributes(MPU, MPU_AttributesInit); +} + +static void MPU_ConfigRegion(MPU_Type* MPUx, MPU_Region_InitTypeDef *MPU_RegionInit) +{ + /* Check the parameters */ + assert_param(IS_MPU_REGION_NUMBER(MPU_RegionInit->Number)); + assert_param(IS_MPU_REGION_ENABLE(MPU_RegionInit->Enable)); + + /* Follow ARM recommendation with Data Memory Barrier prior to MPU configuration */ + __DMB(); + + /* Set the Region number */ + MPUx->RNR = MPU_RegionInit->Number; + + if (MPU_RegionInit->Enable != MPU_REGION_DISABLE) + { + /* Check the parameters */ + assert_param(IS_MPU_INSTRUCTION_ACCESS(MPU_RegionInit->DisableExec)); + assert_param(IS_MPU_REGION_PERMISSION_ATTRIBUTE(MPU_RegionInit->AccessPermission)); + assert_param(IS_MPU_ACCESS_SHAREABLE(MPU_RegionInit->IsShareable)); + + MPUx->RBAR = (((uint32_t)MPU_RegionInit->BaseAddress & 0xFFFFFFE0U) | + ((uint32_t)MPU_RegionInit->IsShareable << MPU_RBAR_SH_Pos) | + ((uint32_t)MPU_RegionInit->AccessPermission << MPU_RBAR_AP_Pos) | + ((uint32_t)MPU_RegionInit->DisableExec << MPU_RBAR_XN_Pos)); + + MPUx->RLAR = (((uint32_t)MPU_RegionInit->LimitAddress & 0xFFFFFFE0U) | + ((uint32_t)MPU_RegionInit->AttributesIndex << MPU_RLAR_AttrIndx_Pos) | + ((uint32_t)MPU_RegionInit->Enable << MPU_RLAR_EN_Pos)); + } + else + { + MPUx->RBAR = 0U; + MPUx->RLAR = 0U; + } +} + +static void MPU_ConfigMemoryAttributes(MPU_Type* MPUx, MPU_Attributes_InitTypeDef *MPU_AttributesInit) +{ + __IO uint32_t *mair; + uint32_t attr_values; + uint32_t attr_number; + + /* Check the parameters */ + assert_param(IS_MPU_ATTRIBUTES_NUMBER(MPU_AttributesInit->Number)); + /* No need to check Attributes value as all 0x0..0xFF possible */ + + /* Follow ARM recommendation with Data Memory Barrier prior to MPUx configuration */ + __DMB(); + + if(MPU_AttributesInit->Number < MPU_ATTRIBUTES_NUMBER4) + { + /* Program MPU_MAIR0 */ + mair = &(MPUx->MAIR0); + attr_number = MPU_AttributesInit->Number; + } + else + { + /* Program MPU_MAIR1 */ + mair = &(MPUx->MAIR1); + attr_number = (uint32_t)MPU_AttributesInit->Number - 4U; + } + + attr_values = *(mair); + attr_values &= ~(0xFFU << (attr_number * 8U)); + *(mair) = attr_values | ((uint32_t)MPU_AttributesInit->Attributes << (attr_number * 8U)); +} + + +// default mpu attrs +const uint8_t MPU_attrs[8] = +{ + MPU_ATTR_NO_CACHE, + MPU_ATTR_WRITE_THROUGH, + MPU_ATTR_WRITE_BACK, + MPU_ATTR_DEVICE, + 0, + 0, + 0, + 0 +}; + +/****************************************************************************** +*@brief : MPU config. +*@param : MPU_configInit: mpu config init parameter +*@return: void +******************************************************************************/ +void HAL_MPU_Config(MPU_ConfigInitTypeDef *MPU_configInit) +{ + uint32_t i,j,count,attrIndex; + uint32_t ctrl; + MPU_RegionConfigTypeDef *pRegion; + + HAL_MPU_Disable(); + + __DMB(); + + //Config Memory Attributes + MPU->MAIR0 = MPU_attrs[0] | (MPU_attrs[1]<<8) | (MPU_attrs[2]<<16) | (MPU_attrs[3]<<24); + MPU->MAIR1 = MPU_attrs[4] | (MPU_attrs[5]<<8) | (MPU_attrs[6]<<16) | (MPU_attrs[7]<<24); + + count = MPU_configInit->RegionCount; + if(count>8) + { + count = 8; + } + + for(i=0; iRegionConfigs + i; + + //get index by attribute + attrIndex = 0; //default attr index + for(j=0;j<8;j++) + { + if(MPU_attrs[j] == pRegion->Attr) + { + attrIndex = j; + break; + } + } + + //config region + MPU->RNR = i; + + MPU->RBAR = ((pRegion->BaseAddr & MPU_RBAR_BASE_Msk) | + ((pRegion->Access<Execute<RLAR = ((pRegion->LimitAddr & MPU_RLAR_LIMIT_Msk) | + ((attrIndex<RNR = i; + MPU->RBAR = 0; + MPU->RLAR = 0; + } + + + ctrl = (((MPU_configInit->PrivDef<HfNmi<AIRCR [10:8] PRIGROUP field) +******************************************************************************/ +uint32_t HAL_NVIC_GetPriorityGrouping(void) +{ + /* Get the PRIGROUP[10:8] field value */ + return NVIC_GetPriorityGrouping(); +} + +/****************************************************************************** +*@brief : Gets the priority of an interrupt. +*@param : IRQn: External interrupt number. +* This parameter can be an enumerator of IRQn_Type enumeration +*@param : PriorityGroup: The priority grouping bits length. +* This parameter can be one of the following values: +* @arg NVIC_PRIORITYGROUP_0: 0 bits for pre-emption priority, 4 bits for subpriority +* @arg NVIC_PRIORITYGROUP_1: 1 bits for pre-emption priority, 3 bits for subpriority +* @arg NVIC_PRIORITYGROUP_2: 2 bits for pre-emption priority, 2 bits for subpriority +* @arg NVIC_PRIORITYGROUP_3: 3 bits for pre-emption priority, 1 bits for subpriority +* @arg NVIC_PRIORITYGROUP_4: 4 bits for pre-emption priority, 0 bits for subpriority +*@param : pPreemptPriority: Pointer on the Preemptive priority value (starting from 0). +*@param : pSubPriority: Pointer on the Subpriority value (starting from 0). +*@ret : None +******************************************************************************/ +void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority) +{ + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); + + /* Get priority for Cortex-M system or device specific interrupts */ + NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); +} + +/****************************************************************************** +*@brief : Sets Pending bit of an external interrupt. +*@param : IRQn: External interrupt number. +* This parameter can be an enumerator of IRQn_Type enumeration +*@ret : None +******************************************************************************/ +void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Set interrupt pending */ + NVIC_SetPendingIRQ(IRQn); +} + +/****************************************************************************** +*@brief : Gets Pending Interrupt (reads the pending register in the NVIC +* and returns the pending bit for the specified interrupt). +*@param : IRQn: External interrupt number. +* This parameter can be an enumerator of IRQn_Type enumeration +*@ret : status: - 0 Interrupt status is not pending. +* - 1 Interrupt status is pending. +******************************************************************************/ +uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Return 1 if pending else 0 */ + return NVIC_GetPendingIRQ(IRQn); +} + +/****************************************************************************** +*@brief : Clears the pending bit of an external interrupt. +*@param : IRQn: External interrupt number. +* This parameter can be an enumerator of IRQn_Type enumeration +*@ret : None +******************************************************************************/ +void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Clear pending interrupt */ + NVIC_ClearPendingIRQ(IRQn); +} + +/****************************************************************************** +*@brief : Gets active interrupt ( reads the active register in NVIC and returns the active bit). +*@param : IRQn: External interrupt number. +* This parameter can be an enumerator of IRQn_Type enumeration +*@ret : status: - 0 Interrupt status is not pending. +* - 1 Interrupt status is pending. +******************************************************************************/ +uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Return 1 if active else 0 */ + return NVIC_GetActive(IRQn); +} + +/****************************************************************************** +*@brief : Configures the SysTick clock source. +*@param : CLKSource specifies the SysTick clock source. +* This parameter can be one of the following values: +* @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. +* @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. +*@ret : None +******************************************************************************/ +void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) +{ + /* Check the parameters */ + assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); + if (CLKSource == SYSTICK_CLKSOURCE_HCLK) + { + SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; + } + else + { + SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; + } +} + + +/****************************************************************************** +*@brief : This function handles SYSTICK interrupt request. +*@ret : None +******************************************************************************/ +void HAL_SYSTICK_IRQHandler(void) +{ + HAL_SYSTICK_Callback(); +} + +/****************************************************************************** +*@brief : SYSTICK callback. +*@ret : None +******************************************************************************/ +__weak void HAL_SYSTICK_Callback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_SYSTICK_Callback could be implemented in the user file + */ +} + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_crc.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_crc.c new file mode 100644 index 0000000000..17c3f2f215 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_crc.c @@ -0,0 +1,83 @@ +/* + ****************************************************************************** + * @file HAL_Crc.c + * @author AisinoChip Firmware Team + * @version V1.0.0 + * @date 2020 + * @brief CRC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (UART). + * @ Initialization and de-initialization functions + * @ IO operation functions + * @ Peripheral Control functions + ****************************************************************************** + * @attention + * + * Copyright (c) 2020 AisinoChip. + * All rights reserved. + ****************************************************************************** +*/ +#include "hal.h" + +#ifdef HAL_CRC_ENABLED + +/****************************************************************************** +*@brief : Initialize NFM +*@param : hnfm: pointer to the NFM handle +*@return: None +******************************************************************************/ +void HAL_CRC_Init(CRC_HandleTypeDef *hcrc) +{ + __HAL_RCC_CRC_CLK_ENABLE(); + hcrc->Instance->CTRL = hcrc->Init.PolyRev | hcrc->Init.OutxorRev | hcrc->Init.InitRev | hcrc->Init.RsltRev | + hcrc->Init.DataRev | hcrc->Init.PolyLen | hcrc->Init.DataLen; + + hcrc->Instance->INIT = hcrc->Init.InitData; + hcrc->Instance->OUTXOR = hcrc->Init.OutXorData; + hcrc->Instance->POLY = hcrc->Init.PolyData; +} + +/****************************************************************************** +*@brief : Calculate the crc calue of input data +*@param : hcrc: pointer to the CRC handle +*@return: CRC value +******************************************************************************/ +uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc) +{ + int crc_cnt; + __HAL_RCC_CRC_CLK_ENABLE(); + + if(CRC_DATA_LEN_2B == hcrc->Init.DataLen) + { + crc_cnt = hcrc->CRC_Data_Len>>1; + while(crc_cnt--) + { + hcrc->Instance->DATA = *((uint16_t*)hcrc->CRC_Data_Buff); + hcrc->CRC_Data_Buff +=2; + } + } + else if(CRC_DATA_LEN_4B == hcrc->Init.DataLen) + { + crc_cnt = hcrc->CRC_Data_Len>>2; + while(crc_cnt--) + { + hcrc->Instance->DATA = *((uint32_t*)hcrc->CRC_Data_Buff); + hcrc->CRC_Data_Buff +=4; + } + } + else + { + crc_cnt = hcrc->CRC_Data_Len; + while(crc_cnt--) + { + hcrc->Instance->DATA = *((uint8_t*)hcrc->CRC_Data_Buff++); + } + } + __HAL_RCC_CRC_CLK_DISABLE(); + return (hcrc->Instance->DATA); + +} + +#endif + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dac.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dac.c new file mode 100644 index 0000000000..fb10a1ae98 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dac.c @@ -0,0 +1,944 @@ +/****************************************************************************** +* @file : hal_dac.c +* @version : 1.0 +* @date : 2022.10.29 +* @brief : DAC HAL module driver +******************************************************************************/ +#include "hal_dac.h" + +#ifdef HAL_DAC_MODULE_ENABLED +/****************************************************************************** +* @brief : This function uses the interruption of DMA underrun. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @return: none +******************************************************************************/ +__weak void HAL_DAC_IRQHandler(DAC_HandleTypeDef *hdac) +{ + if((hdac->Instance->SR & DAC_SR_DMAUDR1) == DAC_SR_DMAUDR1 + || (hdac->Instance->SR & DAC_SR_DMAUDR2) == DAC_SR_DMAUDR2) + { +// printfS("DMA underrun happened\r\n"); + //clear the DMA underrun + hdac->Instance->SR |= DAC_SR_DMAUDR1 | DAC_SR_DMAUDR2; + } +} + +/****************************************************************************** +* @brief : Initialize the DAC MSP. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @return: none +******************************************************************************/ +__weak void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_DAC_MspInit can be implemented in the user file + */ + UNUSED(hdac); +} + +/****************************************************************************** +* @brief : DAC MSP De-Initialization. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @return: none +******************************************************************************/ +void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac) +{ + /* + NOTE : This function should be modified by the user. + the HAL_DAC_MspDeInit can be implemented in the user file. + */ + UNUSED(hdac); + +} + +/****************************************************************************** +* @brief : Initializes the CAN peripheral according to the specified parameters in the DAC_HandleTypeDef. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef *hdac) +{ + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + + HAL_DAC_MspInit(hdac); + + return HAL_OK; +} + +/****************************************************************************** +* @brief : Deinitialize the DAC peripheral registers to their default reset values. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DAC_DeInit(DAC_HandleTypeDef* hdac) +{ + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + + HAL_DAC_MspDeInit(hdac); + + return HAL_OK; +} + +/****************************************************************************** +* @brief : Configures the selected DAC channel. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : sConfig : DAC configuration structure +* @param : Channel : This parameter can be one of the following values: @arg DAC_CHANNEL_1 @argDAC_CHANNEL_2 +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef* hdac, DAC_ChannelConfTypeDef* sConfig, uint32_t Channel) +{ + uint32_t tmpreg1, tmpreg2; + uint32_t tickstart = 0U; + uint32_t ConnectOnChipPeripheral=0U; + uint32_t connectOnChip; + /* Check the DAC parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + + assert_param(IS_DAC_TRIGGER(sConfig->DAC_Trigger)); + assert_param(IS_DAC_TRIGGER(sConfig->SawtoothStepTrigger)); + + assert_param(IS_DAC_OUTPUT_BUFFER_STATE(sConfig->DAC_OutputBuffer)); + assert_param(IS_DAC_TRIMMING(sConfig->DAC_UserTrimming)); + if ((sConfig->DAC_UserTrimming) == DAC_TRIMMING_USER) + { + assert_param(IS_DAC_TRIMMINGVALUE(sConfig->DAC_TrimmingValue)); + } + assert_param(IS_DAC_SAMPLEANDHOLD(sConfig->DAC_SampleAndHold)); + + if(sConfig->DAC_OutputBuffer == DAC_OUTPUTBUFFER_ENABLE) + { + /* output buffer on */ + assert_param(IS_DAC_CHIP_CONNECTION_BUFON(sConfig->DAC_ConnectOnChipPeripheral)); + } + else + { + /* output buffer off */ + if((sConfig->DAC_SampleAndHold) == DAC_SAMPLEANDHOLD_ENABLE) + { + /* Sample and hold mode */ + assert_param(IS_DAC_CHIP_CONNECTION_SHMODE_BUFOFF(sConfig->DAC_ConnectOnChipPeripheral)); + + assert_param(IS_DAC_SAMPLETIME(sConfig->DAC_SampleAndHoldConfig.DAC_SampleTime)); + assert_param(IS_DAC_HOLDTIME(sConfig->DAC_SampleAndHoldConfig.DAC_HoldTime)); + assert_param(IS_DAC_REFRESHTIME(sConfig->DAC_SampleAndHoldConfig.DAC_RefreshTime)); + } + else + { + /* Normal mode */ + assert_param(IS_DAC_CHIP_CONNECTION_NORMALMODE_BUFOFF(sConfig->DAC_ConnectOnChipPeripheral)); + } + } + + + assert_param(IS_DAC_CHANNEL(Channel)); + + /* ## sample, hold, refresh ---------------------------------------------------------- */ + if (sConfig->DAC_SampleAndHold == DAC_SAMPLEANDHOLD_ENABLE) + /* Sample on old configuration */ + { + /* SampleTime */ + if (Channel == DAC_CHANNEL_1) + { + hdac->Instance->SHSR1 = sConfig->DAC_SampleAndHoldConfig.DAC_SampleTime; + } + else /* Channel 2 */ + { + hdac->Instance->SHSR2 = sConfig->DAC_SampleAndHoldConfig.DAC_SampleTime; + } + + /* HoldTime */ + MODIFY_REG(hdac->Instance->SHHR, DAC_SHHR_THOLD1 << (Channel & 0x10UL), (sConfig->DAC_SampleAndHoldConfig.DAC_HoldTime) << (Channel & 0x10UL)); + /* RefreshTime */ + MODIFY_REG(hdac->Instance->SHRR, DAC_SHRR_TREFRESH1 << (Channel & 0x10UL), (sConfig->DAC_SampleAndHoldConfig.DAC_RefreshTime) << (Channel & 0x10UL)); + } + + /* ## CCR---------------------------------------------------------------------------- */ + if (sConfig->DAC_UserTrimming == DAC_TRIMMING_USER) + /* USER TRIMMING */ + { + /* Get the DAC CCR value */ + tmpreg1 = hdac->Instance->CCR; + /* Clear trimming value */ + tmpreg1 &= ~(((uint32_t)(DAC_CCR_OTRIM1)) << (Channel & 0x10UL)); + /* Configure for the selected trimming offset */ + tmpreg2 = sConfig->DAC_TrimmingValue; + /* Calculate CCR register value depending on DAC_Channel */ + tmpreg1 |= tmpreg2 << (Channel & 0x10UL); + /* Write to DAC CCR */ + hdac->Instance->CCR = tmpreg1; + } + else + { + /* factory trimming in NVR,read to DAC_CCR */ + uint8_t trim_val; + HAL_StatusTypeDef ret; + if(hdac->Instance == DAC1) + ret = HAL_EFUSE_ReadByte(EFUSE1, 0x76 + (Channel >> 4), &trim_val, 100000); + else + ret = HAL_EFUSE_ReadByte(EFUSE1, 0x78 + (Channel >> 4), &trim_val, 100000); + + if(ret == HAL_OK) + MODIFY_REG(hdac->Instance->CCR, DAC_CCR_OTRIM1 << (Channel & 0x10UL), trim_val << (Channel & 0x10UL)); + } + + /* ## MCR---------------------------------------------------------------------------- */ + /* Get the DAC MCR value */ + tmpreg1 = hdac->Instance->MCR; + /* Clear DAC_MCR_MODEx bits */ + tmpreg1 &= ~(((uint32_t)(DAC_MCR_MODE1)) << (Channel & 0x10UL)); + /* Configure for the selected DAC channel: mode, buffer output & on chip peripheral connect */ + + if (sConfig->DAC_ConnectOnChipPeripheral == DAC_CHIPCONNECT_EXTERNAL) + { + connectOnChip = 0x00000000UL; + } + else if (sConfig->DAC_ConnectOnChipPeripheral == DAC_CHIPCONNECT_INTERNAL) + { + connectOnChip = DAC_MCR_MODE1_0; + } + else /* (sConfig->DAC_ConnectOnChipPeripheral == DAC_CHIPCONNECT_BOTH) */ + { + if(sConfig->DAC_SampleAndHold == DAC_SAMPLEANDHOLD_ENABLE) + { + if (sConfig->DAC_OutputBuffer == DAC_OUTPUTBUFFER_ENABLE) + { + connectOnChip = DAC_MCR_MODE1_0; + } + else + { + connectOnChip = 0x00000000UL; + } + } + else + { + connectOnChip = DAC_MCR_MODE1_0; + } + } + + tmpreg2 = (sConfig->DAC_SampleAndHold | sConfig->DAC_OutputBuffer | connectOnChip); + /* Clear DAC_MCR_DMADOUBLEx */ + tmpreg1 &= ~(((uint32_t)(DAC_MCR_DMADOUBLE1)) << (Channel & 0x10UL)); + /* Configure for the selected DAC channel: DMA double data mode */ + tmpreg2 |= (sConfig->DAC_DMADoubleDataMode == ENABLE) ? DAC_MCR_DMADOUBLE1 : 0UL; + /* Clear DAC_MCR_SINFORMATx */ + tmpreg1 &= ~(((uint32_t)(DAC_MCR_SINFORMAT1)) << (Channel & 0x10UL)); + /* Configure for the selected DAC channel: Signed format */ + tmpreg2 |= (sConfig->DAC_SignedFormat == ENABLE) ? DAC_MCR_SINFORMAT1 : 0UL; + + /* Calculate MCR register value depending on DAC_Channel */ + tmpreg1 |= tmpreg2 << (Channel & 0x10UL); + /* Write to DAC MCR */ + hdac->Instance->MCR = tmpreg1; + + /* ## CR ---------------------------------------------------------------------------- */ + /* DAC in normal operating mode hence clear DAC Calibraion bit DAC_CR_CENx */ + CLEAR_BIT(hdac->Instance->CR, DAC_CR_CEN1 << (Channel & 0x10UL)); + + /* Get the DAC CR value */ + tmpreg1 = hdac->Instance->CR; + /* Clear TENx, TSELx, WAVEx and MAMPx bits */ + tmpreg1 &= ~(((uint32_t)(DAC_CR_MAMP1 | DAC_CR_WAVE1 | DAC_CR_TSEL1 | DAC_CR_TEN1)) << (Channel & 0x10UL)); + /* Configure for the selected DAC channel: trigger */ + /* Set TSELx and TENx bits according to DAC_Trigger value */ + tmpreg2 = sConfig->DAC_Trigger; + /* Calculate CR register value depending on DAC_Channel */ + tmpreg1 |= tmpreg2 << (Channel & 0x10UL); + /* Write to DAC CR */ + hdac->Instance->CR = tmpreg1; + + /* Disable wave generation */ + hdac->Instance->CR &= ~(DAC_CR_WAVE1 << (Channel & 0x10UL)); + + /* ## STMODR---------------------------------------------------------------------------- */ + + /* Set STRSTTRIGSELx and STINCTRIGSELx bits according to SawtoothResetTrigger & SawtoothStepTrigger values */ + tmpreg2 = ((sConfig->SawtoothResetTrigger & DAC_CR_TSEL1) >> DAC_CR_TSEL1_Pos) << DAC_STMODR_STRSTTRIGSEL1_Pos; + tmpreg2 |= ((sConfig->SawtoothStepTrigger & DAC_CR_TSEL1) >> DAC_CR_TSEL1_Pos) << DAC_STMODR_STINCTRIGSEL1_Pos; + + /* Modify STMODR register value depending on DAC_Channel */ + MODIFY_REG(hdac->Instance->STMODR, (DAC_STMODR_STINCTRIGSEL1 | DAC_STMODR_STRSTTRIGSEL1) << (Channel & 0x10UL), tmpreg2 << (Channel & 0x10UL)); + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +* @brief : Enables DAC and starts conversion of channel. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : Channel : This parameter can be one of the following values: @arg DAC_CHANNEL_1 @argDAC_CHANNEL_2 +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + uint32_t tmp1 = 0U, tmp2 = 0U; + + if (Channel == DAC_CHANNEL_1) + { + hdac->Instance->CR|=DAC_CR_EN1; + tmp1 = hdac->Instance->CR & DAC_CR_TEN1; + tmp2 = hdac->Instance->CR & DAC_CR_TSEL1; + /* Check if software trigger enabled */ + if ((hdac->Instance->CR & (DAC_CR_TEN1 | DAC_CR_TSEL1)) == DAC_TRIGGER_SOFTWARE) + { + /* Enable the selected DAC software conversion */ + hdac->Instance->SWTRIGR|=DAC_SWTRIGR_SWTRIG1; + } + } + else + { + hdac->Instance->CR|=DAC_CR_EN2; + tmp1 = hdac->Instance->CR & DAC_CR_TEN2; + tmp2 = hdac->Instance->CR & DAC_CR_TSEL2; + /* Check if software trigger enabled */ + if ((hdac->Instance->CR & (DAC_CR_TEN2 | DAC_CR_TSEL2)) == (DAC_TRIGGER_SOFTWARE << (Channel & 0x10UL))) + { + /* Enable the selected DAC software conversion */ + hdac->Instance->SWTRIGR|=DAC_SWTRIGR_SWTRIG2; + } + } + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +* @brief : Disables DAC and stop conversion of channel. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : Channel : This parameter can be one of the following values: @arg DAC_CHANNEL_1 @argDAC_CHANNEL_2 +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + + /* Disable the Peripheral */ + if (Channel == DAC_CHANNEL_1) + { + hdac->Instance->CR &= ~DAC_CR_EN1; + } + else + { + hdac->Instance->CR &= ~DAC_CR_EN2; + } + + /* Return function status */ + return HAL_OK; +} + +#ifdef HAL_DMA_MODULE_ENABLED +/****************************************************************************** +* @brief : Enables DAC and starts conversion of channel. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : Channel : This parameter can be one of the following values: @arg DAC_CHANNEL_1 @argDAC_CHANNEL_2 +* @param : pData: The destination peripheral Buffer address. +* @param : Length: The length of data to be transferred from memory to DAC peripheral +* @param : Alignment: Specifies the data alignment for DAC channel.This parameter can be one of the following values: +* @arg DAC_ALIGN_8B_R @arg DAC_ALIGN_12B_L @arg DAC_ALIGN_12B_R +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t *pData, uint32_t Length, uint32_t Alignment) +{ + HAL_StatusTypeDef status; + uint32_t DstAddr = 0U; + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + assert_param(IS_DAC_ALIGN(Alignment)); + + if (Channel == DAC_CHANNEL_1) + { + /* Enable the DAC DMA underrun interrupt */ + /* Enable the selected DAC channel2 DMA request */ + hdac->Instance->CR |= DAC_CR_EN1 | DAC_CR_DMAEN1 | DAC_CR_DMAUDIE1; + /* Case of use of channel 1 */ + switch (Alignment) + { + case DAC_ALIGN_12B_R: + /* Get DHR12R1 address */ + DstAddr = (uint32_t)&hdac->Instance->DHR12R1; + break; + case DAC_ALIGN_12B_L: + /* Get DHR12L1 address */ + DstAddr = (uint32_t)&hdac->Instance->DHR12L1; + break; + case DAC_ALIGN_8B_R: + /* Get DHR8R1 address */ + DstAddr = (uint32_t)&hdac->Instance->DHR8R1; + break; + default: + break; + } + status = HAL_DMA_Start_IT(hdac->DMA_Handle1, (uint32_t)pData, DstAddr, Length); + } + else if(Channel == DAC_CHANNEL_2) + { + /* Enable the DAC DMA underrun interrupt */ + /* Enable the selected DAC channel2 DMA request */ + hdac->Instance->CR |= DAC_CR_EN2 | DAC_CR_DMAEN2 | DAC_CR_DMAUDIE2; + + /* Case of use of channel 1 */ + switch (Alignment) + { + case DAC_ALIGN_12B_R: + /* Get DHR12R1 address */ + DstAddr = (uint32_t)&hdac->Instance->DHR12R2; + break; + case DAC_ALIGN_12B_L: + /* Get DHR12L1 address */ + DstAddr = (uint32_t)&hdac->Instance->DHR12L2; + break; + case DAC_ALIGN_8B_R: + /* Get DHR8R1 address */ + DstAddr = (uint32_t)&hdac->Instance->DHR8R2; + break; + default: + break; + } + status = HAL_DMA_Start_IT(hdac->DMA_Handle2, (uint32_t)pData, DstAddr, Length); + } + else/* DualChannel */ + { + hdac->Instance->CR |= DAC_CR_EN1 | DAC_CR_DMAEN1 | DAC_CR_DMAUDIE1 | DAC_CR_EN2 ; + /* Case of use of channel_1 DMA change two DAC channel */ + switch (Alignment) + { + case DAC_ALIGN_12B_R: + /* Get DHR12R1 address */ + DstAddr = (uint32_t)&hdac->Instance->DHR12RD; + break; + case DAC_ALIGN_12B_L: + /* Get DHR12L1 address */ + DstAddr = (uint32_t)&hdac->Instance->DHR12LD; + break; + case DAC_ALIGN_8B_R: + /* Get DHR8R1 address */ + DstAddr = (uint32_t)&hdac->Instance->DHR8RD; + break; + default: + break; + } + status = HAL_DMA_Start_IT(hdac->DMA_Handle1, (uint32_t)pData, DstAddr, Length); + } + /* Return function status */ + return status; +} + + +/****************************************************************************** +* @brief : Disables DAC and stop conversion of channel. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : Channel : This parameter can be one of the following values: @arg DAC_CHANNEL_1 @argDAC_CHANNEL_2 +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + + /* Disable the selected DAC channel DMA request */ + /* Disable the DMA Channel */ + /* Channel1 is used */ + if(Channel == DAC_CHANNEL_1) + { + hdac->Instance->CR &= ~DAC_CR_DMAEN1; + /* Disable the Peripheral */ + hdac->Instance->CR&=~DAC_CR_EN1; + status = HAL_DMA_Abort(hdac->DMA_Handle1); + } + + else if(Channel == DAC_CHANNEL_2) /* Channel2 is used for */ + { + hdac->Instance->CR &= ~DAC_CR_DMAEN2; + hdac->Instance->CR&=~DAC_CR_EN2; + status = HAL_DMA_Abort(hdac->DMA_Handle2); + } + else + { + hdac->Instance->CR &= ~DAC_CR_DMAEN1; + hdac->Instance->CR &= ~DAC_CR_DMAEN2; + /* Disable the Peripheral */ + hdac->Instance->CR&=~DAC_CR_EN1; + hdac->Instance->CR&=~DAC_CR_EN2; + status = HAL_DMA_Abort(hdac->DMA_Handle1) | HAL_DMA_Abort(hdac->DMA_Handle2); + } + + /* Return function status */ + return status; +} +#endif + +/****************************************************************************** +* @brief : Set the specified data holding register value for DAC channel. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : Channel : This parameter can be one of the following values: @arg DAC_CHANNEL_1 @argDAC_CHANNEL_2 +* @param : Alignment: Specifies the data alignment for DAC channel.This parameter can be one of the following values: +* @arg DAC_ALIGN_8B_R @arg DAC_ALIGN_12B_L @arg DAC_ALIGN_12B_R +* @param : Data: The destination peripheral data. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data) +{ + __IO uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + assert_param(IS_DAC_ALIGN(Alignment)); + + tmp = (uint32_t)hdac->Instance; + if (Channel == DAC_CHANNEL_1) + { + tmp += DAC_DHR12R1_ALIGNMENT(Alignment); + } + else + { + tmp += DAC_DHR12R2_ALIGNMENT(Alignment); + } + + /* Calculate and set dual DAC data holding register value */ +// if (Alignment == DAC_ALIGN_12B_L) +// { +// Data = (uint32_t)Data << 4; +// } + + /* Set the DAC channel selected data holding register */ + *(__IO uint32_t *) tmp = Data; + + /* Return function status */ + return HAL_OK; +} + + +/****************************************************************************** +* @brief : Set the specified data holding register value for dual DAC channel. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : Channel : This parameter can be one of the following values: @arg DAC_CHANNEL_1 @argDAC_CHANNEL_2 +* @param : Alignment: Specifies the data alignment for DAC channel.This parameter can be one of the following values: +* @arg DAC_ALIGN_8B_R @arg DAC_ALIGN_12B_L @arg DAC_ALIGN_12B_R +* @param : Data1: The destination peripheral data1. +* @param : Data2: The destination peripheral data2. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DACEx_DualSetValue(DAC_HandleTypeDef *hdac, uint32_t Alignment, uint32_t Data1, uint32_t Data2) +{ + uint32_t data, tmp; + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_ALIGN(Alignment)); + + /* Calculate and set dual DAC data holding register value */ + if (Alignment == DAC_ALIGN_8B_R) + { + data = ((uint32_t)Data2 << 8) | Data1; + } + else + { + data = ((uint32_t)Data2 << 16) | Data1; + } + + /* DAC Ĵַ */ + tmp = (uint32_t)hdac->Instance; + /* Alignment϶ӦļĴƫƣDAC_DHR12RD DAC_DHR12LD DAC_DHR8RD */ + tmp += DAC_DHR12RD_ALIGNMENT(Alignment); + + /* Set the dual DAC selected data holding register */ + *(__IO uint32_t *)tmp = data; + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +* @brief : Returns the last data output value of the selected DAC channel. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : Channel : This parameter can be one of the following values: @arg DAC_CHANNEL_1 @argDAC_CHANNEL_2 +* @return: The selected DAC channel data output value +******************************************************************************/ +uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + + /* Returns the DAC channel data output register value */ + if(Channel == DAC_CHANNEL_1) + { + return hdac->Instance->DOR1; + } + else + { + return hdac->Instance->DOR2; + } + +} + +/****************************************************************************** +* @brief : Returns the last data output value of two DAC channels. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @return: The two DAC channels data output value +******************************************************************************/ +uint32_t HAL_DACEx_DualGetValue(DAC_HandleTypeDef *hdac) +{ + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + uint32_t tmp = 0U; + + tmp |= hdac->Instance->DOR1; + + tmp |= hdac->Instance->DOR2 << 16U; + + /* Returns the DAC channel data output register value */ + return tmp; +} + +/****************************************************************************** +* @brief : Enable or disable the selected DAC channel wave generation. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : Channel:The selected DAC channel. his parameter can be one of the following values: +* @arg DAC_CHANNEL_1: DAC Channel1 selected +* @arg DAC_CHANNEL_2: DAC Channel2 selected +* @param : Amplitude: Amplitude Select max triangle amplitude. This parameter can be one of the following values: +* @arg DAC_TRIANGLEAMPLITUDE_1: Select max triangle amplitude of 1 +* @arg DAC_TRIANGLEAMPLITUDE_3: Select max triangle amplitude of 3 +* @arg DAC_TRIANGLEAMPLITUDE_7: Select max triangle amplitude of 7 +* @arg DAC_TRIANGLEAMPLITUDE_15: Select max triangle amplitude of 15 +* @arg DAC_TRIANGLEAMPLITUDE_31: Select max triangle amplitude of 31 +* @arg DAC_TRIANGLEAMPLITUDE_63: Select max triangle amplitude of 63 +* @arg DAC_TRIANGLEAMPLITUDE_127: Select max triangle amplitude of 127 +* @arg DAC_TRIANGLEAMPLITUDE_255: Select max triangle amplitude of 255 +* @arg DAC_TRIANGLEAMPLITUDE_511: Select max triangle amplitude of 511 +* @arg DAC_TRIANGLEAMPLITUDE_1023: Select max triangle amplitude of 1023 +* @arg DAC_TRIANGLEAMPLITUDE_2047: Select max triangle amplitude of 2047 +* @arg DAC_TRIANGLEAMPLITUDE_4095: Select max triangle amplitude of 4095 +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DACEx_TriangleWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude) +{ + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(Amplitude)); + /* Enable the triangle wave generation for the selected DAC channel */ + MODIFY_REG(hdac->Instance->CR, ((DAC_CR_WAVE1) | (DAC_CR_MAMP1)) << (Channel & 0x10UL), (DAC_CR_WAVE_TRIANGLE | Amplitude) << (Channel & 0x10UL)); + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +* @brief : Enable or disable the selected DAC channel wave generation. +* @param : hdac: pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : Channel: The selected DAC channel. his parameter can be one of the following values: +* @arg DAC_CHANNEL_1: DAC Channel1 selected +* @arg DAC_CHANNEL_2: DAC Channel2 selected +* @param : Amplitude: Amplitude Unmask DAC channel LFSR for noise wave generation. This parameter can be one of the following values: +* @arg DAC_LFSRUNMASK_BIT0: Unmask DAC channel LFSR bit0 for noise wave generation +* @arg DAC_LFSRUNMASK_BITS1_0: Unmask DAC channel LFSR bit[1:0] for noise wave generation +* @arg DAC_LFSRUNMASK_BITS2_0: Unmask DAC channel LFSR bit[2:0] for noise wave generation +* @arg DAC_LFSRUNMASK_BITS3_0: Unmask DAC channel LFSR bit[3:0] for noise wave generation +* @arg DAC_LFSRUNMASK_BITS4_0: Unmask DAC channel LFSR bit[4:0] for noise wave generation +* @arg DAC_LFSRUNMASK_BITS5_0: Unmask DAC channel LFSR bit[5:0] for noise wave generation +* @arg DAC_LFSRUNMASK_BITS6_0: Unmask DAC channel LFSR bit[6:0] for noise wave generation +* @arg DAC_LFSRUNMASK_BITS7_0: Unmask DAC channel LFSR bit[7:0] for noise wave generation +* @arg DAC_LFSRUNMASK_BITS8_0: Unmask DAC channel LFSR bit[8:0] for noise wave generation +* @arg DAC_LFSRUNMASK_BITS9_0: Unmask DAC channel LFSR bit[9:0] for noise wave generation +* @arg DAC_LFSRUNMASK_BITS10_0: Unmask DAC channel LFSR bit[10:0] for noise wave generation +* @arg DAC_LFSRUNMASK_BITS11_0: Unmask DAC channel LFSR bit[11:0] for noise wave generation +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude) +{ + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(Amplitude)); + /* Enable the noise wave generation for the selected DAC channel */ + MODIFY_REG(hdac->Instance->CR, ((DAC_CR_WAVE1) | (DAC_CR_MAMP1)) << (Channel & 0x10UL), (DAC_CR_WAVE_NOISE | Amplitude) << (Channel & 0x10UL)); + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +* @brief : Run the self calibration of one DAC channel. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : sConfig : sConfig DAC channel configuration structure +* @param : Channel : The selected DAC channel. his parameter can be one of the following values: +* @arg DAC_CHANNEL_1: DAC Channel1 selected +* @arg DAC_CHANNEL_2: DAC Channel2 selected +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DACEx_SelfCalibrate(DAC_HandleTypeDef *hdac, DAC_ChannelConfTypeDef *sConfig, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + + HAL_StatusTypeDef status = HAL_OK; + + __IO uint32_t tmp; + uint32_t trimmingvalue; + uint32_t laststatus=0; + uint32_t nowstatus=0; + + SET_BIT((hdac->Instance->CR), (DAC_CR_EN1 << (Channel & 0x10UL))); + tmp = (uint32_t)hdac->Instance; + if (Channel == DAC_CHANNEL_1) + { + tmp += DAC_DHR12R1_ALIGNMENT(DAC_ALIGN_12B_R); + } + else + { + tmp += DAC_DHR12R2_ALIGNMENT(DAC_ALIGN_12B_R); + } + + *(__IO uint32_t *) tmp = 0x0800U; + + /* Enable the selected DAC channel calibration */ + /* i.e. set DAC_CR_CENx bit */ + SET_BIT((hdac->Instance->CR), (DAC_CR_CEN1 << (Channel & 0x10UL))); + + /* Init trimming counter */ + /* Medium value ,trimmingvalue:0-31(0x1f)*/ + for(trimmingvalue = 0; trimmingvalue < 32; trimmingvalue++) + { + /* Set candidate trimming */ + MODIFY_REG(hdac->Instance->CCR, (DAC_CCR_OTRIM1 << (Channel & 0x10UL)), (trimmingvalue << (Channel & 0x10UL))); + + HAL_SimpleDelay(50000); + + laststatus=nowstatus; + nowstatus=(hdac->Instance->SR & (DAC_SR_CALFLAG1 << (Channel & 0x10UL)))>>(DAC_SR_CALFLAG1_Pos +Channel); + /* tOFFTRIMmax delay x ms as per datasheet (electrical characteristics */ + /* i.e. minimum time needed between two calibration steps */ + if (nowstatus == 1 && laststatus == 0) + { + break; + } + } + + /* Disable the selected DAC channel calibration */ + /* i.e. clear DAC_CR_CENx bit */ + CLEAR_BIT((hdac->Instance->CR), (DAC_CR_CEN1 << (Channel & 0x10UL))); + + /* Disable the selected DAC channel */ + CLEAR_BIT((hdac->Instance->CR), (DAC_CR_EN1 << (Channel & 0x10UL))); + + sConfig->DAC_TrimmingValue = trimmingvalue; + sConfig->DAC_UserTrimming = DAC_TRIMMING_USER; + + return status; +} + + + +/****************************************************************************** +* @brief : Set the trimming mode and trimming value (user trimming mode applied). +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : sConfig : sConfig DAC channel configuration structure +* @param : Channel : The selected DAC channel. his parameter can be one of the following values: +* @arg DAC_CHANNEL_1: DAC Channel1 selected +* @arg DAC_CHANNEL_2: DAC Channel2 selected +* @param : NewTrimmingValue: DAC new trimming value +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DACEx_SetUserTrimming(DAC_HandleTypeDef *hdac, DAC_ChannelConfTypeDef *sConfig, uint32_t Channel, uint32_t NewTrimmingValue) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + assert_param(IS_DAC_Calibration_TRIM(NewTrimmingValue)); + + /* Check the DAC handle allocation */ + if (hdac == NULL) + { + status = HAL_ERROR; + } + else + { + /* Set new trimming */ + MODIFY_REG(hdac->Instance->CCR, (DAC_CCR_OTRIM1 << (Channel & 0x10UL)), (NewTrimmingValue << (Channel & 0x10UL))); + /* Update trimming mode */ + sConfig->DAC_UserTrimming = DAC_TRIMMING_USER; + sConfig->DAC_TrimmingValue = NewTrimmingValue; + } + return status; +} + + + +/****************************************************************************** +* @brief : Return the DAC trimming value. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : Channel : The selected DAC channel. his parameter can be one of the following values: +* @arg DAC_CHANNEL_1: DAC Channel1 selected +* @arg DAC_CHANNEL_2: DAC Channel2 selected +* @return: Trimming value : range: 0->31 +******************************************************************************/ +uint32_t HAL_DACEx_GetTrimOffset(DAC_HandleTypeDef *hdac, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + + /* Retrieve trimming */ + return ((hdac->Instance->CCR & (DAC_CCR_OTRIM1 << (Channel & 0x10UL))) >> (Channel & 0x10UL)); +} + +/****************************************************************************** +* @brief : Enables or disables the selected DAC channel Sawtooth wave generation. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : Channel : The selected DAC channel. his parameter can be one of the following values: +* @arg DAC_CHANNEL_1: DAC Channel1 selected +* @arg DAC_CHANNEL_2: DAC Channel2 selected +* @param : Polarity : Sawtooth direction. @arg DAC_SAWTOOTH_POLARITY_DECREMENT, @arg DAC_SAWTOOTH_POLARITY_INCREMENT +* @param : ResetData : Sawtooth reset value +* @param : StepData : Sawtooth increasing/decreasing value +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DACEx_SawtoothWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Polarity, uint32_t ResetData, uint32_t StepData) +{ + /* Check the parameters */ + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + assert_param(IS_DAC_SAWTOOTH_POLARITY(Polarity)); + + if (Channel == DAC_CHANNEL_1) + { + /* Configure the sawtooth wave generation data parameters */ + MODIFY_REG(hdac->Instance->STR1, DAC_STR1_STINCDATA1 | DAC_STR1_STDIR1 | DAC_STR1_STRSTDATA1, \ + (StepData << DAC_STR1_STINCDATA1_Pos) | Polarity | (ResetData << DAC_STR1_STRSTDATA1_Pos)); + } + else + { + /* Configure the sawtooth wave generation data parameters */ + MODIFY_REG(hdac->Instance->STR2, DAC_STR2_STINCDATA2 | DAC_STR2_STDIR2 | DAC_STR2_STRSTDATA2, \ + (StepData << DAC_STR2_STINCDATA2_Pos) | Polarity | (ResetData << DAC_STR2_STRSTDATA2_Pos)); + } + + /* Enable the sawtooth wave generation for the selected DAC channel */ + MODIFY_REG(hdac->Instance->CR, (DAC_CR_WAVE1) << (Channel & 0x10UL), (uint32_t)(DAC_CR_WAVE_SAWTOOTH) << (Channel & 0x10UL)); + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +* @brief : DAC channel Sawtooth wave Reset by software. +* @param : hdac : pointer to a DAC_HandleTypeDef structure that contains +* the configuration information for DAC module. +* @param : Channel : The selected DAC channel. his parameter can be one of the following values: +* @arg DAC_CHANNEL_1: DAC Channel1 selected +* @arg DAC_CHANNEL_2: DAC Channel2 selected +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_DACEx_SawtoothWaveDataResetBySoftware(DAC_HandleTypeDef *hdac, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + + + if (((hdac->Instance->STMODR >> (Channel & 0x10UL)) & DAC_STMODR_STRSTTRIGSEL1) == 0U /* SW TRIGGER */) + { + if (Channel == DAC_CHANNEL_1) + { + /* Enable the selected DAC software conversion */ + SET_BIT(hdac->Instance->SWTRIGR, DAC_SWTRIGR_SWTRIG1); + } + else + { + /* Enable the selected DAC software conversion */ + SET_BIT(hdac->Instance->SWTRIGR, DAC_SWTRIGR_SWTRIG2); + } + } + else + { + status = HAL_ERROR; + } + + /* Return function status */ + return status; +} + +/** + * @brief Trig sawtooth wave step + * @note This function allows to generate step in sawtooth wave in case of + * SW trigger has been configured for this usage. + * @param hdac pointer to a DAC_HandleTypeDef structure that contains + * the configuration information for the specified DAC. + * @param Channel The selected DAC channel. + * This parameter can be one of the following values: + * @arg DAC_CHANNEL_1: DAC Channel1 selected + * @arg DAC_CHANNEL_2: DAC Channel2 selected (1) + * + * (1) On this STM32 serie, parameter not available on all instances. + * Refer to device datasheet for channels availability. + * @retval HAL status + */ +/* + úǾݲ +*/ +HAL_StatusTypeDef HAL_DACEx_SawtoothWaveDataStep(DAC_HandleTypeDef *hdac, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + assert_param(IS_DAC_INSTANCE(hdac->Instance)); + assert_param(IS_DAC_CHANNEL(Channel)); + + if (((hdac->Instance->STMODR >> (Channel & 0x10UL)) & DAC_STMODR_STINCTRIGSEL1) == 0U /* SW TRIGGER */) + { + + if (Channel == DAC_CHANNEL_1) + { + /* Enable the selected DAC software conversion */ + SET_BIT(hdac->Instance->SWTRIGR, DAC_SWTRIGR_SWTRIGB1); + } + else + { + /* Enable the selected DAC software conversion */ + SET_BIT(hdac->Instance->SWTRIGR, DAC_SWTRIGR_SWTRIGB2); + } + } + else + { + status = HAL_ERROR; + } + + /* Return function status */ + return status; +} + +#endif /* HAL_DAC_MODULE_ENABLED */ \ No newline at end of file diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dcmi.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dcmi.c new file mode 100644 index 0000000000..18924a3cc2 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dcmi.c @@ -0,0 +1,863 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_dcmi.c + * @author MCD Application Team + * @brief DCMI HAL module driver + * This file provides firmware functions to manage the following + * functionalities of the Digital Camera Interface (DCMI) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral Control functions + * + Peripheral State and Error functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The sequence below describes how to use this driver to capture image + from a camera module connected to the DCMI Interface. + This sequence does not take into account the configuration of the + camera module, which should be made before to configure and enable + the DCMI to capture images. + + (#) Program the required configuration through following parameters: + horizontal and vertical polarity, pixel clock polarity, Capture Rate, + Synchronization Mode, code of the frame delimiter and data width + using HAL_DCMI_Init() function. + + (#) Configure the DMA2_Stream1 channel1 to transfer Data from DCMI DR + register to the destination memory buffer. + + (#) Program the required configuration through following parameters: + DCMI mode, destination memory Buffer address and the data length + and enable capture using HAL_DCMI_Start_DMA() function. + + (#) Optionally, configure and Enable the CROP feature to select a rectangular + window from the received image using HAL_DCMI_ConfigCrop() + and HAL_DCMI_EnableCROP() functions + + (#) The capture can be stopped using HAL_DCMI_Stop() function. + + (#) To control DCMI state you can use the function HAL_DCMI_GetState(). + + *** DCMI HAL driver macros list *** + ============================================= + [..] + Below the list of most used macros in DCMI HAL driver. + + (+) __HAL_DCMI_ENABLE: Enable the DCMI peripheral. + (+) __HAL_DCMI_DISABLE: Disable the DCMI peripheral. + (+) __HAL_DCMI_GET_FLAG: Get the DCMI pending flags. + (+) __HAL_DCMI_CLEAR_FLAG: Clear the DCMI pending flags. + (+) __HAL_DCMI_ENABLE_IT: Enable the specified DCMI interrupts. + (+) __HAL_DCMI_DISABLE_IT: Disable the specified DCMI interrupts. + (+) __HAL_DCMI_GET_IT_SOURCE: Check whether the specified DCMI interrupt has occurred or not. + + [..] + (@) You can refer to the DCMI HAL driver header file for more useful macros + + @endverbatim + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "hal.h" +static __attribute__ ((aligned (4))) DMA_LinkTypeDef g_dma_node[10]; +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ +/** @defgroup DCMI DCMI + * @brief DCMI HAL module driver + * @{ + */ + +#ifdef HAL_DCMI_MODULE_ENABLED + + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#define HAL_TIMEOUT_DCMI_STOP 14U /* Set timeout to 1s */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void DCMI_DMAXferCplt(DMA_HandleTypeDef *hdma); +static void DCMI_DMAError(DMA_HandleTypeDef *hdma); + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup DCMI_Exported_Functions DCMI Exported Functions + * @{ + */ + +/** @defgroup DCMI_Exported_Functions_Group1 Initialization and Configuration functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Initialize and configure the DCMI + (+) De-initialize the DCMI + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the DCMI according to the specified + * parameters in the DCMI_InitTypeDef and create the associated handle. + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_DCMI_Init(DCMI_HandleTypeDef *hdcmi) +{ + /* Check the DCMI peripheral state */ + if(hdcmi == NULL) + { + return HAL_ERROR; + } + + /* Check function parameters */ + assert_param(IS_DCMI_ALL_INSTANCE(hdcmi->Instance)); + assert_param(IS_DCMI_PCKPOLARITY(hdcmi->Init.PCKPolarity)); + assert_param(IS_DCMI_VSPOLARITY(hdcmi->Init.VSPolarity)); + assert_param(IS_DCMI_HSPOLARITY(hdcmi->Init.HSPolarity)); + assert_param(IS_DCMI_SYNCHRO(hdcmi->Init.SynchroMode)); + assert_param(IS_DCMI_CAPTURE_RATE(hdcmi->Init.CaptureRate)); + assert_param(IS_DCMI_EXTENDED_DATA(hdcmi->Init.ExtendedDataMode)); + assert_param(IS_DCMI_MODE_JPEG(hdcmi->Init.JPEGMode)); + + if(hdcmi->State == HAL_DCMI_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hdcmi->Lock = HAL_UNLOCKED; + /* Init the low level hardware */ + HAL_DCMI_MspInit(hdcmi); + } + + /* Change the DCMI state */ + hdcmi->State = HAL_DCMI_STATE_BUSY; + + /* Set DCMI parameters */ + /* Configures the HS, VS, DE and PC polarity */ + hdcmi->Instance->CR &= ~(DCMI_CR_PCKPOL | DCMI_CR_HSPOL | DCMI_CR_VSPOL | DCMI_CR_EDM_0 | + DCMI_CR_EDM_1 | DCMI_CR_FCRC_0 | DCMI_CR_FCRC_1 | DCMI_CR_JPEG | + DCMI_CR_ESS); + hdcmi->Instance->CR |= (uint32_t)(hdcmi->Init.SynchroMode | hdcmi->Init.CaptureRate | \ + hdcmi->Init.VSPolarity | hdcmi->Init.HSPolarity | \ + hdcmi->Init.PCKPolarity | hdcmi->Init.ExtendedDataMode | \ + hdcmi->Init.JPEGMode); + + if(hdcmi->Init.SynchroMode == DCMI_SYNCHRO_EMBEDDED) + { + hdcmi->Instance->ESCR = (((uint32_t)hdcmi->Init.SyncroCode.FrameStartCode) | + ((uint32_t)hdcmi->Init.SyncroCode.LineStartCode << DCMI_POSITION_ESCR_LSC)| + ((uint32_t)hdcmi->Init.SyncroCode.LineEndCode << DCMI_POSITION_ESCR_LEC) | + ((uint32_t)hdcmi->Init.SyncroCode.FrameEndCode << DCMI_POSITION_ESCR_FEC)); + } + + /* Enable the Line, Vsync, Error and Overrun interrupts */ + __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_LINE | DCMI_IT_VSYNC | DCMI_IT_ERR | DCMI_IT_OVR); + + /* Update error code */ + hdcmi->ErrorCode = HAL_DCMI_ERROR_NONE; + + /* Initialize the DCMI state*/ + hdcmi->State = HAL_DCMI_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Deinitializes the DCMI peripheral registers to their default reset + * values. + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_DCMI_DeInit(DCMI_HandleTypeDef *hdcmi) +{ + /* DeInit the low level hardware */ + HAL_DCMI_MspDeInit(hdcmi); + + /* Update error code */ + hdcmi->ErrorCode = HAL_DCMI_ERROR_NONE; + + /* Initialize the DCMI state*/ + hdcmi->State = HAL_DCMI_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(hdcmi); + + return HAL_OK; +} + +/** + * @brief Initializes the DCMI MSP. + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval None + */ +__weak void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hdcmi); + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_DCMI_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes the DCMI MSP. + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval None + */ +__weak void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* hdcmi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hdcmi); + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_DCMI_MspDeInit could be implemented in the user file + */ +} + +/** + * @} + */ +/** @defgroup DCMI_Exported_Functions_Group2 IO operation functions + * @brief IO operation functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure destination address and data length and + Enables DCMI DMA request and enables DCMI capture + (+) Stop the DCMI capture. + (+) Handles DCMI interrupt request. + +@endverbatim + * @{ + */ + +/** + * @brief Enables DCMI DMA request and enables DCMI capture + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @param DCMI_Mode DCMI capture mode snapshot or continuous grab. + * @param pData The destination memory Buffer address (LCD Frame buffer). + * @param Length The length of capture to be transferred. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DCMI_Start_DMA(DCMI_HandleTypeDef* hdcmi, uint32_t DCMI_Mode, uint32_t pData, uint32_t Length) +{ + DMA_LinkInitTypeDef DMA_LinkInit; + + /* Check function parameters */ + assert_param(IS_DCMI_CAPTURE_MODE(DCMI_Mode)); + + /* Process Locked */ + __HAL_LOCK(hdcmi); + + /* Lock the DCMI peripheral state */ + hdcmi->State = HAL_DCMI_STATE_BUSY; + + /* Enable DCMI by setting DCMIEN bit */ + __HAL_DCMI_ENABLE(hdcmi);/*TF.03*/ + + /* Configure the DCMI Mode */ + hdcmi->Instance->CR &= ~(DCMI_CR_CM); + hdcmi->Instance->CR |= (uint32_t)(DCMI_Mode); + + /* Set the DMA memory0 conversion complete callback */ + hdcmi->DMA_Handle->XferCpltCallback = DCMI_DMAXferCplt; + + /* Set the DMA error callback */ + hdcmi->DMA_Handle->XferErrorCallback = DCMI_DMAError; + + /* Set the dma abort callback */ + hdcmi->DMA_Handle->XferAbortCallback = NULL; + + if(Length <= 0xFFFFU) + { + /* Enable the DMA Stream */ + HAL_DMA_Start_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, Length); + } + else /* DMA LINK Mode */ + { + + /* Initialize transfer parameters */ + hdcmi->XferCount = 0U; + hdcmi->XferSize = Length; + + /* Get the number of buffer */ + while(hdcmi->XferSize > 0xFFFFU) + { + hdcmi->XferSize = (hdcmi->XferSize >>1); + hdcmi->XferCount+=2; + } + + for (uint8_t j = 0; j < hdcmi->XferCount; j++) + { + if (j == (hdcmi->XferCount - 1)) + { + DMA_LinkInit.TransferSize = hdcmi->XferSize; + DMA_LinkInit.RawInt = DMA_RAWINT_ENABLE; + } + else + { + DMA_LinkInit.RawInt = DMA_RAWINT_DISABLE; + DMA_LinkInit.TransferSize = hdcmi->XferSize; + } + DMA_LinkInit.SrcIncDec = hdcmi->DMA_Handle->Init.SrcIncDec; + DMA_LinkInit.DestIncDec = hdcmi->DMA_Handle->Init.DestIncDec; + DMA_LinkInit.SrcWidth = hdcmi->DMA_Handle->Init.SrcWidth; + DMA_LinkInit.DestWidth = hdcmi->DMA_Handle->Init.DestWidth; + DMA_LinkInit.SrcBurst = hdcmi->DMA_Handle->Init.SrcBurst; + DMA_LinkInit.DestBurst = hdcmi->DMA_Handle->Init.DestBurst; + DMA_LinkInit.NextMaster = DMA_NEXTMASTER_1; + DMA_LinkInit.SrcAddr = (uint32_t)&hdcmi->Instance->DR; + DMA_LinkInit.DestAddr = (uint32_t)pData+hdcmi->XferSize*4*j; + DMA_LinkInit.Next = 0u; + + HAL_DMA_InitLink(&g_dma_node[j], &DMA_LinkInit); + } + for (uint8_t i = 0; i < (hdcmi->XferCount - 1); i++) + { + HAL_DMA_SetLinkNext(&g_dma_node[i], &g_dma_node[i + 1]); + } + + /* DMA */ + HAL_DMA_Start_Link(hdcmi->DMA_Handle, &g_dma_node[0]); + } + + /* Enable Capture */ + hdcmi->Instance->CR |= DCMI_CR_CAPTURE;/*TF.13*/ + + /* Release Lock */ + __HAL_UNLOCK(hdcmi); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Disable DCMI DMA request and Disable DCMI capture + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DCMI_Stop(DCMI_HandleTypeDef* hdcmi) +{ + __IO uint32_t count = SystemCoreClock / HAL_TIMEOUT_DCMI_STOP; + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hdcmi); + + /* Lock the DCMI peripheral state */ + hdcmi->State = HAL_DCMI_STATE_BUSY; + + /* Disable Capture */ + hdcmi->Instance->CR &= ~(DCMI_CR_CAPTURE); + + /* Check if the DCMI capture effectively disabled */ + do + { + if (count-- == 0U) + { + /* Update error code */ + hdcmi->ErrorCode |= HAL_DCMI_ERROR_TIMEOUT; + + status = HAL_TIMEOUT; + } + } + while((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0U); + + /* Disable the DCMI */ + __HAL_DCMI_DISABLE(hdcmi); + + /* Disable the DMA */ + HAL_DMA_Abort(hdcmi->DMA_Handle); + + /* Update error code */ + hdcmi->ErrorCode |= HAL_DCMI_ERROR_NONE; + + /* Change DCMI state */ + hdcmi->State = HAL_DCMI_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdcmi); + + /* Return function status */ + return status; +} + +/** + * @brief Suspend DCMI capture + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DCMI_Suspend(DCMI_HandleTypeDef* hdcmi) +{ + __IO uint32_t count = SystemCoreClock / HAL_TIMEOUT_DCMI_STOP; + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hdcmi); + + if(hdcmi->State == HAL_DCMI_STATE_BUSY) + { + /* Change DCMI state */ + hdcmi->State = HAL_DCMI_STATE_SUSPENDED; + + /* Disable Capture */ + hdcmi->Instance->CR &= ~(DCMI_CR_CAPTURE); + + /* Check if the DCMI capture effectively disabled */ + do + { + if (count-- == 0U) + { + /* Update error code */ + hdcmi->ErrorCode |= HAL_DCMI_ERROR_TIMEOUT; + + /* Change DCMI state */ + hdcmi->State = HAL_DCMI_STATE_READY; + + status = HAL_TIMEOUT; + break; + } + } + while((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0); + } + /* Process Unlocked */ + __HAL_UNLOCK(hdcmi); + + /* Return function status */ + return status; +} + +/** + * @brief Resume DCMI capture + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DCMI_Resume(DCMI_HandleTypeDef* hdcmi) +{ + /* Process locked */ + __HAL_LOCK(hdcmi); + + if(hdcmi->State == HAL_DCMI_STATE_SUSPENDED) + { + /* Change DCMI state */ + hdcmi->State = HAL_DCMI_STATE_BUSY; + + /* Disable Capture */ + hdcmi->Instance->CR |= DCMI_CR_CAPTURE; + } + /* Process Unlocked */ + __HAL_UNLOCK(hdcmi); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Handles DCMI interrupt request. + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for the DCMI. + * @retval None + */ + +void HAL_DCMI_IRQHandler(DCMI_HandleTypeDef *hdcmi) +{ + uint32_t isr_value = READ_REG(hdcmi->Instance->MIS); + + /* Synchronization error interrupt management *******************************/ + if((isr_value & DCMI_FLAG_ERRRI) == DCMI_FLAG_ERRRI) + { + /* Clear the Synchronization error flag */ + __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_ERRRI); + + /* Update error code */ + hdcmi->ErrorCode |= HAL_DCMI_ERROR_SYNC; + + /* Change DCMI state */ + hdcmi->State = HAL_DCMI_STATE_ERROR; + /* Set the synchronization error callback */ + hdcmi->DMA_Handle->XferAbortCallback = DCMI_DMAError; + /* Abort the DMA Transfer */ + HAL_DMA_Abort(hdcmi->DMA_Handle); + } + /* Overflow interrupt management ********************************************/ + if((isr_value & DCMI_FLAG_OVRRI) == DCMI_FLAG_OVRRI) + { + /* Clear the Overflow flag */ + __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_OVRRI); + + /* Update error code */ + hdcmi->ErrorCode |= HAL_DCMI_ERROR_OVR; + + /* Change DCMI state */ + hdcmi->State = HAL_DCMI_STATE_ERROR; + + /* Set the overflow callback */ + hdcmi->DMA_Handle->XferAbortCallback = DCMI_DMAError; + + /* Abort the DMA Transfer */ + HAL_DMA_Abort(hdcmi->DMA_Handle); + + + + } + /* Line Interrupt management ************************************************/ + if((isr_value & DCMI_FLAG_LINERI) == DCMI_FLAG_LINERI) + { + /* Clear the Line interrupt flag */ + __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_LINERI); + + /* Line interrupt Callback */ + HAL_DCMI_LineEventCallback(hdcmi); + } + /* VSYNC interrupt management ***********************************************/ + if((isr_value & DCMI_FLAG_VSYNCRI) == DCMI_FLAG_VSYNCRI) + { + /* Clear the VSYNC flag */ + __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_VSYNCRI); + + /* VSYNC Callback */ + HAL_DCMI_VsyncEventCallback(hdcmi); + } + /* FRAME interrupt management ***********************************************/ + if((isr_value & DCMI_FLAG_FRAMERI) == DCMI_FLAG_FRAMERI) + { + /* When snapshot mode, disable Vsync, Error and Overrun interrupts */ + if((hdcmi->Instance->CR & DCMI_CR_CM) == DCMI_MODE_SNAPSHOT) + { + /* Disable the Line, Vsync, Error and Overrun interrupts */ + __HAL_DCMI_DISABLE_IT(hdcmi, DCMI_IT_LINE | DCMI_IT_VSYNC | DCMI_IT_ERR | DCMI_IT_OVR); + } + __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_FRAMERI); + /* Disable the Frame interrupt */ + __HAL_DCMI_DISABLE_IT(hdcmi, DCMI_IT_FRAME); + + /* Frame Callback */ + HAL_DCMI_FrameEventCallback(hdcmi); + } +} + +/** + * @brief Error DCMI callback. + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval None + */ +__weak void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hdcmi); + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_DCMI_ErrorCallback could be implemented in the user file + */ +} + +/** + * @brief Line Event callback. + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval None + */ +__weak void HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef *hdcmi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hdcmi); + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_DCMI_LineEventCallback could be implemented in the user file + */ +} + +/** + * @brief VSYNC Event callback. + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval None + */ +__weak void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hdcmi); + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_DCMI_VsyncEventCallback could be implemented in the user file + */ +} + +/** + * @brief Frame Event callback. + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval None + */ +__weak void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hdcmi); + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_DCMI_FrameEventCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup DCMI_Exported_Functions_Group3 Peripheral Control functions + * @brief Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== +[..] This section provides functions allowing to: + (+) Configure the CROP feature. + (+) Enable/Disable the CROP feature. + +@endverbatim + * @{ + */ + +/** + * @brief Configure the DCMI CROP coordinate. + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @param X0 DCMI window X offset + * @param Y0 DCMI window Y offset + * @param XSize DCMI Pixel per line + * @param YSize DCMI Line number + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DCMI_ConfigCrop(DCMI_HandleTypeDef *hdcmi, uint32_t X0, uint32_t Y0, uint32_t XSize, uint32_t YSize) +{ + /* Process Locked */ + __HAL_LOCK(hdcmi); + + /* Lock the DCMI peripheral state */ + hdcmi->State = HAL_DCMI_STATE_BUSY; + + /* Check the parameters */ + assert_param(IS_DCMI_WINDOW_COORDINATE(X0)); + assert_param(IS_DCMI_WINDOW_COORDINATE(YSize)); + assert_param(IS_DCMI_WINDOW_COORDINATE(XSize)); + assert_param(IS_DCMI_WINDOW_HEIGHT(Y0)); + + /* Configure CROP */ + hdcmi->Instance->CWSIZE = (XSize | (YSize << DCMI_POSITION_CWSIZE_VLINE)); + hdcmi->Instance->CWSTRT = (X0 | (Y0 << DCMI_POSITION_CWSTRT_VST)); + + /* Initialize the DCMI state*/ + hdcmi->State = HAL_DCMI_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdcmi); + + return HAL_OK; +} + +/** + * @brief Disable the Crop feature. + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DCMI_DisableCrop(DCMI_HandleTypeDef *hdcmi) +{ + /* Process Locked */ + __HAL_LOCK(hdcmi); + + /* Lock the DCMI peripheral state */ + hdcmi->State = HAL_DCMI_STATE_BUSY; + + /* Disable DCMI Crop feature */ + hdcmi->Instance->CR &= ~(uint32_t)DCMI_CR_CROP; + + /* Change the DCMI state*/ + hdcmi->State = HAL_DCMI_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdcmi); + + return HAL_OK; +} + +/** + * @brief Enable the Crop feature. + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DCMI_EnableCrop(DCMI_HandleTypeDef *hdcmi) +{ + /* Process Locked */ + __HAL_LOCK(hdcmi); + + /* Lock the DCMI peripheral state */ + hdcmi->State = HAL_DCMI_STATE_BUSY; + + /* Enable DCMI Crop feature */ + hdcmi->Instance->CR |= (uint32_t)DCMI_CR_CROP; + + /* Change the DCMI state*/ + hdcmi->State = HAL_DCMI_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdcmi); + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup DCMI_Exported_Functions_Group4 Peripheral State functions + * @brief Peripheral State functions + * +@verbatim + =============================================================================== + ##### Peripheral State and Errors functions ##### + =============================================================================== + [..] + This subsection provides functions allowing to + (+) Check the DCMI state. + (+) Get the specific DCMI error flag. + +@endverbatim + * @{ + */ + +/** + * @brief Return the DCMI state + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval HAL state + */ +HAL_DCMI_StateTypeDef HAL_DCMI_GetState(DCMI_HandleTypeDef *hdcmi) +{ + return hdcmi->State; +} + +/** + * @brief Return the DCMI error code + * @param hdcmi pointer to a DCMI_HandleTypeDef structure that contains + * the configuration information for DCMI. + * @retval DCMI Error Code + */ +uint32_t HAL_DCMI_GetError(DCMI_HandleTypeDef *hdcmi) +{ + return hdcmi->ErrorCode; +} + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup DCMI_Private_Functions DCMI Private Functions + * @{ + */ + +/** + * @brief DMA conversion complete callback. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void DCMI_DMAXferCplt(DMA_HandleTypeDef *hdma) +{ + uint32_t tmp = 0U; + + DCMI_HandleTypeDef* hdcmi = ( DCMI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; + /* Enable the Frame interrupt */ + __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_FRAME); + + /* When snapshot mode, set dcmi state to ready */ + if((hdcmi->Instance->CR & DCMI_CR_CM) == DCMI_MODE_SNAPSHOT) + { + hdcmi->State= HAL_DCMI_STATE_READY; + } + +} + +/** + * @brief DMA error callback + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void DCMI_DMAError(DMA_HandleTypeDef *hdma) +{ + DCMI_HandleTypeDef* hdcmi = ( DCMI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; + + + /* Initialize the DCMI state*/ + hdcmi->State = HAL_DCMI_STATE_READY; + + + /* DCMI error Callback */ + HAL_DCMI_ErrorCallback(hdcmi); +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_DCMI_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dlyb.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dlyb.c new file mode 100644 index 0000000000..d7b95a884f --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dlyb.c @@ -0,0 +1,92 @@ +/* + ****************************************************************************** + * @file HAL_DLYB.c + * @version V1.0.0 + * @date 2020 + * @brief DLYB HAL module driver. + * This file provides firmware functions to config phase shift of SDIO + * . + ****************************************************************************** +*/ +#include "hal.h" + + +/********************************************************************************* +* Function : HAL_DLYB_Enable +* Description : Enable DLYB for phase shif of SDIO clk. +* Input : hdlyb: DLYB handle. +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_DLYB_Enable(DLYB_TypeDef *hdlyb) +{ + uint32_t len; + uint32_t i, t; + uint32_t clkn; + uint32_t delay_unit; + uint32_t sel; + + hdlyb->DLYB_REG_CTRL = (DEN_ENABLE | SEN_ENABLE); //DEN and SEN enable + hdlyb->DLYB_REG_CFGR &= ~(0x0F); +// SDMMC_DLYB_REG_CFGR |= (12<<0); //SEL +// hdlyb->DLYB_REG_CFGR = (12<<0); //SEL + + for(t=0; t<=DLYB_SEL_MAX; t++) + { + hdlyb->DLYB_REG_CFGR = (t<<0); //SEL + + for(i=0; iDLYB_REG_CFGR =((hdlyb->DLYB_REG_CFGR & (~(0x7FUL<<8))) | (i<<8)); //UNIT + while(!(hdlyb->DLYB_REG_CFGR&(1UL<<31))); //wait LENF + len = ((hdlyb->DLYB_REG_CFGR>>16)&0x0FFF); + if((len&0x7FF) && ((len&(3<<10)) != (3<<10))) + { + delay_unit = i; + break; + } + } + } + + if(t>DLYB_SEL_MAX) + { + return HAL_ERROR; + } + + t=10; + for(i=0; i<11; i++) + { + if(len&(1<DLYB_REG_CTRL = 0; + + hdlyb->DLYB_REG_CTRL = (DEN_ENABLE | SEN_ENABLE); //DEN and SEN enable + hdlyb->DLYB_REG_CFGR = ((delay_unit<<8) | (sel<<0)); + hdlyb->DLYB_REG_CTRL = DEN_ENABLE; + + return HAL_OK; +} + + +/********************************************************************************* +* Function : HAL_DLYB_Disable +* Description : Disable DLYB. +* Input : hdlyb: DLYB handle. +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_DLYB_Disable(DLYB_TypeDef *hdlyb) +{ + hdlyb->DLYB_REG_CTRL = 0; + + return HAL_OK; +} + + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dma.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dma.c new file mode 100644 index 0000000000..57ab7841b7 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dma.c @@ -0,0 +1,746 @@ +/****************************************************************************** +*@file : hal_dma.c +*@brief : DMA HAL module driver. +******************************************************************************/ +#include "hal.h" + +#ifdef HAL_DMA_MODULE_ENABLED + +/****************************************************************************** +*@brief : This function handles DMA interrupt request. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for DMA module. +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) +{ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + + /* Channel has been interrupted */ + if (hdma->DMA->INTSTATUS & (1UL << hdma->Channel)) + { + /* Transfer complete interrupt */ + if ((hdma->DMA->INTTCSTATUS & (1UL << hdma->Channel)) && (hdma->Instance->CXCONFIG & DMA_CXCONFIG_ITC)) + { + hdma->DMA->INTTCCLR = (1UL << hdma->Channel); + if (hdma->XferCpltCallback) + { + hdma->XferCpltCallback(hdma); + } + } + + /* Transfer half interrupt */ + if ((hdma->DMA->INTTCSTATUS & ((1UL << hdma->Channel) << 8)) && (hdma->Instance->CXCONFIG & DMA_CXCONFIG_IHFTC)) + { + hdma->DMA->INTTCCLR = 1UL << (hdma->Channel + 8); + if (hdma->XferHalfCpltCallback) + { + hdma->XferHalfCpltCallback(hdma); + } + } + + /* Transfer error interrupt */ + if ((hdma->DMA->INTERRSTATUS & (1UL << hdma->Channel)) && (hdma->Instance->CXCONFIG & DMA_CXCONFIG_IE)) + { + hdma->DMA->INTERRCLR = (1UL << hdma->Channel); + if (hdma->XferErrorCallback) + { + hdma->XferErrorCallback(hdma); + } + } + } +} + +/****************************************************************************** +*@brief : Initialize the DMA according to the specified. +* parameters in the DMA_InitTypeDef and create the associated handle. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) +{ + uint32_t RequestID; + + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_MODE(hdma->Init.Mode)); + assert_param(IS_FUNCTIONAL_STATE(hdma->Init.Lock)); + assert_param(IS_DMA_DATAFLOW(hdma->Init.DataFlow)); + assert_param(IS_DMA_SRCINCDEC(hdma->Init.SrcIncDec)); + assert_param(IS_DMA_DESTINCDEC(hdma->Init.DestIncDec)); + assert_param(IS_DMA_SRCWIDTH(hdma->Init.SrcWidth)); + assert_param(IS_DMA_DESTWIDTH(hdma->Init.DestWidth)); + assert_param(IS_DMA_SRCBURST(hdma->Init.SrcBurst)); + assert_param(IS_DMA_DESTBURST(hdma->Init.DestBurst)); + assert_param(IS_DMA_SRCMASTER(hdma->Init.SrcMaster)); + assert_param(IS_DMA_DESTMASTER(hdma->Init.DestMaster)); + + /* Init the low level hardware : clock */ + HAL_DMA_MspInit(hdma); + + /* calculation of the channel index */ + if ((uint32_t)(hdma->Instance) < (uint32_t)(DMA2_Channel0)) + { + /* Check the parameters */ + assert_param(IS_DMA_REQ1ID(hdma->Init.DataFlow, hdma->Init.ReqID)); + + /* DMA1 */ + hdma->Channel = ((uint32_t)(hdma->Instance) - (uint32_t)(DMA1_Channel0)) >> 5; + hdma->DMA = DMA1; + } + else + { + /* Check the parameters */ + assert_param(IS_DMA_REQ2ID(hdma->Init.DataFlow, hdma->Init.ReqID)); + + /* DMA2 */ + hdma->Channel = ((uint32_t)(hdma->Instance) - (uint32_t)(DMA2_Channel0)) >> 5; + hdma->DMA = DMA2; + } + + /* Enable DMA */ + hdma->DMA->CONFIG |= DMA_CONFIG_EN; + + /* Clear Channel Config */ + hdma->Instance->CXCONFIG = 0; + + if (hdma->Init.DataFlow == DMA_DATAFLOW_M2P) + { + RequestID = hdma->Init.ReqID << DMA_CXCONFIG_DESTPERIPH_Pos; + } + else if (hdma->Init.DataFlow == DMA_DATAFLOW_P2M) + { + RequestID = hdma->Init.ReqID << DMA_CXCONFIG_SRCPERIPH_Pos; + } + else + { + RequestID = 0; + } + + hdma->Instance->CXCONFIG = hdma->Init.DataFlow | RequestID | hdma->Init.SrcMaster | hdma->Init.DestMaster; + if (hdma->Init.Lock) + hdma->Instance->CXCONFIG |= DMA_CXCONFIG_LOCK; + + /* Config Channel Control */ + hdma->Instance->CXCTRL = DMA_CXCTRL_RITEN; + + /* Source or Desination address increase */ + hdma->Instance->CXCTRL |= (hdma->Init.DestIncDec | hdma->Init.SrcIncDec); + + /* Source or Desination date width */ + hdma->Instance->CXCTRL |= (hdma->Init.DestWidth | hdma->Init.SrcWidth); + + /* Source or Desination burst size */ + hdma->Instance->CXCTRL |= hdma->Init.SrcBurst | hdma->Init.DestBurst; + + if (hdma->Init.Mode == DMA_MODE_NORMAL) + hdma->Instance->CXLLI = 0; + else + { + /* Check the parameters */ + assert_param(IS_DMA_NEXTMASTER(hdma->Init.NextMaster)); + + hdma->Instance->CXLLI = hdma->Init.NextMaster; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : DeInitializes the DMA peripheral. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma) +{ + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + + /* DeInit the low level hardware */ + HAL_DMA_MspDeInit(hdma); + + hdma->Instance->CXCONFIG = 0U; + hdma->Instance->CXCTRL = 0U; + hdma->Instance->CXSRCADDR = 0U; + hdma->Instance->CXDESTADDR = 0U; + hdma->Instance->CXLLI = 0U; + + hdma->XferCpltCallback = NULL; + hdma->XferHalfCpltCallback = NULL; + hdma->XferErrorCallback = NULL; + hdma->XferAbortCallback = NULL; + + hdma->DMA = 0U; + hdma->Channel = 0U; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initialize the DMA MSP. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_DMA_MspInit(DMA_HandleTypeDef *hdma) +{ + UNUSED(hdma); +} + +/****************************************************************************** +*@brief : DeInitialize the DMA MSP. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_DMA_MspDeInit(DMA_HandleTypeDef *hdma) +{ + UNUSED(hdma); +} + +/****************************************************************************** +*@brief : Register callbacks. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@param : CallbackID: User Callback identifier +* This parameter can be a combination of @ref DMA_XfeCallbackID. +* @arg DMA_CALLBACKID_CPLT: Transfer completion interrupt callback function. +* @arg DMA_CALLBACKID_HALFCPLT: Half transfer completion interrupt callback function. +* @arg DMA_CALLBACKID_ERROR: Error interrupt callback function. +* @arg DMA_CALLBACKID_ABORT: Abort callback function. +*@param : pCallback: callback function. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, uint32_t CallbackID, \ + void (* pCallback)(struct __DMA_HandleTypeDef * hdma)) +{ + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_CALLBACK(CallbackID)); + + switch (CallbackID) + { + case DMA_CALLBACKID_CPLT: + + hdma->XferCpltCallback = pCallback; + break; + + case DMA_CALLBACKID_HALFCPLT: + + hdma->XferHalfCpltCallback = pCallback; + break; + + case DMA_CALLBACKID_ERROR: + + hdma->XferErrorCallback = pCallback; + break; + + case DMA_CALLBACKID_ABORT: + + hdma->XferAbortCallback = pCallback; + break; + + default: + return HAL_ERROR; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : UnRegister callbacks. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@param : CallbackID: User Callback identifier +* This parameter can be a combination of @ref DMA_XfeCallbackID. +* @arg DMA_CALLBACKID_CPLT: Transfer completion interrupt callback function. +* @arg DMA_CALLBACKID_HALFCPLT: Half transfer completion interrupt callback function. +* @arg DMA_CALLBACKID_ERROR: Error interrupt callback function. +* @arg DMA_CALLBACKID_ABORT: Abort callback function. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, uint32_t CallbackID) +{ + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_CALLBACK(CallbackID)); + + switch (CallbackID) + { + case DMA_CALLBACKID_CPLT: + + hdma->XferCpltCallback = NULL; + break; + + case DMA_CALLBACKID_HALFCPLT: + + hdma->XferHalfCpltCallback = NULL; + break; + + case DMA_CALLBACKID_ERROR: + + hdma->XferErrorCallback = NULL; + break; + + case DMA_CALLBACKID_ABORT: + + hdma->XferAbortCallback = NULL; + break; + + default: + return HAL_ERROR; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Starts the DMA Transfer. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@param : SrcAddr: The source memory Buffer address. +*@param : DestAddr: The destination memory Buffer address. +*@param : Size: The length of data to be transferred from source to destination. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddr, uint32_t DestAddr, uint32_t TransferSize) +{ + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_MODE(hdma->Init.Mode)); + assert_param(IS_DMA_SRCADDR(SrcAddr)); + assert_param(IS_DMA_DESTADDR(DestAddr)); + assert_param(IS_DMA_TRANSFERSIZE(TransferSize)); + + /* DMA Channel Disable */ + hdma->Instance->CXCONFIG &= ~DMA_CXCONFIG_EN; + + /* Set source address and desination address */ + hdma->Instance->CXSRCADDR = SrcAddr; + hdma->Instance->CXDESTADDR = DestAddr; + + /* Set Transfer Size */ + hdma->Instance->CXCTRL = (hdma->Instance->CXCTRL & ~DMA_TRANSFER_SIZE) | (TransferSize << DMA_CXCTRL_TRANSFERSIZE_Pos); + + /* Set Next Link */ + if (hdma->Init.Mode == DMA_MODE_NORMAL) + { + hdma->Instance->CXLLI = 0; + } + else + { + hdma->Instance->CXLLI = (hdma->Instance->CXLLI & ~DMA_CXLLI_LLI) | ((uint32_t)(&hdma->Link) & DMA_CXLLI_LLI); + + hdma->Link.SrcAddr = hdma->Instance->CXSRCADDR; + hdma->Link.DestAddr = hdma->Instance->CXDESTADDR; + hdma->Link.Next = hdma->Instance->CXLLI; + hdma->Link.Ctrl = (hdma->Instance->CXCTRL & ~DMA_TRANSFER_SIZE) | (TransferSize << DMA_CXCTRL_TRANSFERSIZE_Pos); + } + + /* Disable interrupt */ + hdma->Instance->CXCONFIG &= ~(DMA_CXCONFIG_IHFTC | DMA_CXCONFIG_ITC | DMA_CXCONFIG_IE); + + /* DMA Channel Enable */ + hdma->Instance->CXCONFIG |= DMA_CXCONFIG_EN; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Start the DMA Transfer with interrupt enabled. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@param : SrcAddr: The source memory Buffer address. +*@param : DestAddr: The destination memory Buffer address. +*@param : Size: The length of data to be transferred from source to destination. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddr, uint32_t DestAddr, uint32_t TransferSize) +{ + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_MODE(hdma->Init.Mode)); + assert_param(IS_DMA_SRCADDR(SrcAddr)); + assert_param(IS_DMA_DESTADDR(DestAddr)); + assert_param(IS_DMA_TRANSFERSIZE(TransferSize)); + + /* DMA Channel Disable */ + hdma->Instance->CXCONFIG &= ~DMA_CXCONFIG_EN; + + /* Set source address and desination address */ + hdma->Instance->CXSRCADDR = SrcAddr; + hdma->Instance->CXDESTADDR = DestAddr; + + /* Set Transfer Size and enable LLI interrupt */ + hdma->Instance->CXCTRL = (hdma->Instance->CXCTRL & ~DMA_CXCTRL_TRANSFERSIZE) | (TransferSize << DMA_CXCTRL_TRANSFERSIZE_Pos); + + /* Enable interrupt */ + hdma->Instance->CXCONFIG &= ~DMA_CXCONFIG_IHFTC; + hdma->Instance->CXCONFIG |= DMA_CXCONFIG_ITC | DMA_CXCONFIG_IE; + + if (hdma->XferHalfCpltCallback) + { + hdma->Instance->CXCONFIG |= DMA_CXCONFIG_IHFTC; + } + + /* Set Next Link */ + if (hdma->Init.Mode == DMA_MODE_NORMAL) + { + hdma->Instance->CXLLI = 0; + } + else + { + hdma->Instance->CXLLI = ((uint32_t)(&hdma->Link) & DMA_CXLLI_LLI) | (hdma->Instance->CXLLI & DMA_CXLLI_LM); + hdma->Link.SrcAddr = hdma->Instance->CXSRCADDR; + hdma->Link.DestAddr = hdma->Instance->CXDESTADDR; + hdma->Link.Next = hdma->Instance->CXLLI; + hdma->Link.Ctrl = (hdma->Instance->CXCTRL & ~DMA_CXCTRL_TRANSFERSIZE) | (TransferSize << DMA_CXCTRL_TRANSFERSIZE_Pos); + } + + /* DMA Channel Enable */ + hdma->Instance->CXCONFIG |= DMA_CXCONFIG_EN; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initialize linked list. +*@param : Link: Initialize linked list node. +*@param : Link_Init: pointer to an DMA_LinkInitTypeDef structure that contains +* the configuration information for the specified Link. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_InitLink(DMA_LinkTypeDef *Link, DMA_LinkInitTypeDef *Link_Init) +{ + /* Check the parameters */ + assert_param(Link != NULL); + assert_param(Link_Init != NULL); + assert_param(IS_DMA_SRCADDR(Link_Init->SrcAddr)); + assert_param(IS_DMA_DESTADDR(Link_Init->DestAddr)); + assert_param(IS_DMA_NEXT(Link_Init->Next)); + assert_param(IS_DMA_NEXTMASTER(Link_Init->NextMaster)); + assert_param(IS_DMA_RAWIT(Link_Init->RawInt)); + assert_param(IS_DMA_SRCINCDEC(Link_Init->SrcIncDec)); + assert_param(IS_DMA_DESTINCDEC(Link_Init->DestIncDec)); + assert_param(IS_DMA_SRCWIDTH(Link_Init->SrcWidth)); + assert_param(IS_DMA_DESTWIDTH(Link_Init->DestWidth)); + assert_param(IS_DMA_SRCBURST(Link_Init->SrcBurst)); + assert_param(IS_DMA_DESTBURST(Link_Init->DestBurst)); + assert_param(IS_DMA_TRANSFERSIZE(Link_Init->TransferSize)); + + Link->SrcAddr = Link_Init->SrcAddr; + Link->DestAddr = Link_Init->DestAddr; + Link->Next = (Link_Init->Next & DMA_CXLLI_LLI) | Link_Init->NextMaster; + Link->Ctrl = Link_Init->RawInt | Link_Init->SrcIncDec | Link_Init->DestIncDec | \ + Link_Init->SrcWidth | Link_Init->DestWidth | Link_Init->SrcBurst | \ + Link_Init->DestBurst | Link_Init->TransferSize ; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Set the next node of the linked node. +*@param : Curr: current linked node. +*@param : Next: next linked node. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_SetLinkNext(DMA_LinkTypeDef *Curr, DMA_LinkTypeDef *Next) +{ + /* Check the parameters */ + assert_param(IS_DMA_NEXT(Curr)); + assert_param(IS_DMA_NEXT(Next)); + + Curr->Next = (Curr->Next & ~DMA_CXLLI_LLI) | ((uint32_t)Next & DMA_CXLLI_LLI); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : DMA link transfer start. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@param : Link: First node of linked list. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_Start_Link(DMA_HandleTypeDef *hdma, DMA_LinkTypeDef *Link) +{ + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + assert_param(Link != NULL); + + /* DMA Channel Disable */ + hdma->Instance->CXCONFIG &= ~DMA_CXCONFIG_EN; + + /* Set source address and desination address */ + hdma->Instance->CXSRCADDR = Link->SrcAddr; + hdma->Instance->CXDESTADDR = Link->DestAddr; + + /* Set Next Link */ + hdma->Instance->CXLLI = Link->Next; + + /* Set Transfer Size */ + hdma->Instance->CXCTRL = Link->Ctrl; + + hdma->Instance->CXCONFIG &= ~(DMA_CXCONFIG_IHFTC | DMA_CXCONFIG_ITC | DMA_CXCONFIG_IE); + + /* DMA Channel Enable */ + hdma->Instance->CXCONFIG |= DMA_CXCONFIG_EN; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : DMA link transfer start. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@param : Link: First node of linked list. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_Start_Link_IT(DMA_HandleTypeDef *hdma, DMA_LinkTypeDef *Link) +{ + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + assert_param(Link != NULL); + + /* DMA Channel Disable */ + hdma->Instance->CXCONFIG &= ~DMA_CXCONFIG_EN; + + /* Set source address and desination address */ + hdma->Instance->CXSRCADDR = Link->SrcAddr; + hdma->Instance->CXDESTADDR = Link->DestAddr; + hdma->Instance->CXLLI = Link->Next; + hdma->Instance->CXCTRL = Link->Ctrl; + + hdma->Instance->CXCONFIG |= DMA_CXCONFIG_ITC | DMA_CXCONFIG_IE; + hdma->Instance->CXCONFIG &= ~DMA_CXCONFIG_IHFTC; + if (hdma->XferHalfCpltCallback) + hdma->Instance->CXCONFIG |= DMA_CXCONFIG_IHFTC; + + /* DMA Channel Enable */ + hdma->Instance->CXCONFIG |= DMA_CXCONFIG_EN; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Abort the DMA Transfer . +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma) +{ + uint32_t timeout; + + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + + /* Disable interrupt */ + hdma->Instance->CXCONFIG &= ~(DMA_CXCONFIG_IHFTC | DMA_CXCONFIG_ITC | DMA_CXCONFIG_IE); + + /* DMA Channel Abort */ + hdma->Instance->CXCONFIG |= DMA_CXCONFIG_HALT; + + /* Wait until data clearing in FIFO */ + timeout = DMA_ABORT_TIMEOUT; + while (hdma->Instance->CXCONFIG & DMA_CXCONFIG_ACTIVE) + { + if (timeout-- == 0) + return HAL_ERROR; + } + + /* Disable interrupt */ + hdma->Instance->CXCONFIG &= ~(DMA_CXCONFIG_HALT | DMA_CXCONFIG_EN); + /* Clear TC ERR Falg */ + hdma->DMA->INTTCCLR |= (1UL << hdma->Channel) | (1UL << (hdma->Channel + 8)); + hdma->DMA->INTERRCLR |= (1UL << hdma->Channel); + + /* Wait until the channel is closed */ + timeout = DMA_ABORT_TIMEOUT; + while (hdma->DMA->ENCHSTATUS & (1U << hdma->Channel)) + { + if (timeout-- == 0) + return HAL_TIMEOUT; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Enable interrupt. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@param : IT: interrupt +* This parameter can be a combination of @ref DMA_IT. +* @arg DMA_IT_TC: transmission completion interrupt. +* @arg DMA_IT_HTC: indicating half transmission completion interrupt. +* @arg DMA_IT_ERR: error interrupt. +* @arg DMA_IT_RAW: raw interrupt. +*@return: HAL status +******************************************************************************/ +FunctionalState HAL_DMA_GetITSource(DMA_HandleTypeDef *hdma, uint32_t IT) +{ + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_IT(IT)); + + if ((hdma->Instance->CXCONFIG & IT) == 0) + return (DISABLE); + else + return (ENABLE); +} + +/****************************************************************************** +*@brief : Enable interrupt. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@param : IT: interrupt +* This parameter can be a combination of @ref DMA_IT. +* @arg DMA_IT_TC: transmission completion interrupt. +* @arg DMA_IT_HTC: indicating half transmission completion interrupt. +* @arg DMA_IT_ERR: error interrupt. +* @arg DMA_IT_RAW: raw interrupt. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_EnableIT(DMA_HandleTypeDef *hdma, uint32_t IT) +{ + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_IT(IT)); + + hdma->Instance->CXCONFIG |= IT; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Disable interrupt. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@param : IT: interrupt +* This parameter can be a combination of @ref DMA_IT. +* @arg DMA_IT_TC: transmission completion interrupt. +* @arg DMA_IT_HTC: indicating half transmission completion interrupt. +* @arg DMA_IT_ERR: error interrupt. +* @arg DMA_IT_RAW: raw interrupt. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_DisableIT(DMA_HandleTypeDef *hdma, uint32_t IT) +{ + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_IT(IT)); + + hdma->Instance->CXCONFIG &= ~IT; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Clear the DMA flag. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@param : Flag: DMA flag +* This parameter can be a combination of the following: +* @arg DMA_FLAG_TC: indicating transmission completion interrupt occur. +* @arg DMA_FLAG_HTC: indicating half transmission completion interrupt occur. +* @arg DMA_FLAG_ERR: indicating error interrupt occur. +* @arg DMA_FLAG_RTC: indicating raw transmission completion interrupt occur. +* @arg DMA_FLAG_RHTC: indicating raw half transmission completion interrupt occur. +* @arg DMA_FLAG_RERR: indicating raw error interrupt occur. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_DMA_ClearFlag(DMA_HandleTypeDef *hdma, uint32_t Flag) +{ + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_FLAG(Flag)); + + if (Flag &( DMA_FLAG_TC | DMA_FLAG_RTC)) + hdma->DMA->INTTCCLR = 1UL << hdma->Channel; + if (Flag &( DMA_FLAG_HTC | DMA_FLAG_RHTC)) + hdma->DMA->INTTCCLR = 1UL << (hdma->Channel + 8); + if (Flag &( DMA_FLAG_ERR | DMA_FLAG_RERR)) + hdma->DMA->INTERRCLR = 1UL << hdma->Channel; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Returns the DMA flag. +*@param : hdma: pointer to a DMA_HandleTypeDef structure that contains +* the configuration information for the specified DMA Channel. +*@param : Flag: DMA flag +* This parameter can be a combination of the following: +* @arg DMA_FLAG_IT: indicating transmission completion interrupt or error interrupt occur. +* @arg DMA_FLAG_TC: indicating transmission completion interrupt occur. +* @arg DMA_FLAG_HTC: indicating half transmission completion interrupt occur. +* @arg DMA_FLAG_ERR: indicating error interrupt occur. +* @arg DMA_FLAG_RTC: indicating raw transmission completion interrupt occur. +* @arg DMA_FLAG_RHTC: indicating raw half transmission completion interrupt occur. +* @arg DMA_FLAG_RERR: indicating raw error interrupt occur. +*@return: DMA flag +******************************************************************************/ +FlagStatus HAL_DMA_GetFlag(DMA_HandleTypeDef *hdma, uint32_t Flag) +{ + uint32_t Status; + + /* Check the parameters */ + assert_param(IS_DMA_HANDLE(hdma)); + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_FLAG(Flag)); + + Status = 0; + if (Flag & DMA_FLAG_TC) + { + if (hdma->DMA->INTTCSTATUS & (1UL << hdma->Channel)) + Status |= DMA_FLAG_TC; + } + if (Flag & DMA_FLAG_HTC) + { + if (hdma->DMA->INTTCSTATUS & (1UL << (hdma->Channel + 8))) + Status |= DMA_FLAG_HTC; + } + if (Flag & DMA_FLAG_ERR) + { + if (hdma->DMA->INTERRSTATUS & (1UL << hdma->Channel)) + Status |= DMA_FLAG_ERR; + } + if (Flag & DMA_FLAG_RTC) + { + if (hdma->DMA->RAWINTTCSTATUS & (1UL << hdma->Channel)) + Status |= DMA_FLAG_RTC; + } + if (Flag & DMA_FLAG_RHTC) + { + if (hdma->DMA->RAWINTTCSTATUS & (1UL << (hdma->Channel + 8))) + Status |= DMA_FLAG_RHTC; + } + if (Flag & DMA_FLAG_RERR) + { + if (hdma->DMA->RAWINTERRSTATUS & (1UL << hdma->Channel)) + Status |= DMA_FLAG_RERR; + } + + return (Status); +} + +#endif /* HAL_DMA_MODULE_ENABLED */ + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dma2d.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dma2d.c new file mode 100644 index 0000000000..4bedacd3ed --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dma2d.c @@ -0,0 +1,1632 @@ +/****************************************************************************** +*@file : hal_dma2d.c +*@brief : GPIO HAL module driver. +******************************************************************************/ + + +#include "hal.h" + +#ifdef HAL_DMA2D_MODULE_ENABLED + +/* Private types -------------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup DMA2D_Private_Constants DMA2D Private Constants + * @{ + */ + +/** @defgroup DMA2D_TimeOut DMA2D Time Out + * @{ + */ +#define DMA2D_TIMEOUT_ABORT ((uint32_t)1000) /*!< 1s */ +#define DMA2D_TIMEOUT_SUSPEND ((uint32_t)1000) /*!< 1s */ +/** + * @} + */ + +/** @defgroup DMA2D_Shifts DMA2D Shifts + * @{ + */ +#define DMA2D_POSITION_FGPFCCR_CS (uint32_t)POSITION_VAL(DMA2D_FGPFCCR_CS) /*!< Required left shift to set foreground CLUT size */ +#define DMA2D_POSITION_BGPFCCR_CS (uint32_t)POSITION_VAL(DMA2D_BGPFCCR_CS) /*!< Required left shift to set background CLUT size */ + +#define DMA2D_POSITION_FGPFCCR_CCM (uint32_t)POSITION_VAL(DMA2D_FGPFCCR_CCM) /*!< Required left shift to set foreground CLUT color mode */ +#define DMA2D_POSITION_BGPFCCR_CCM (uint32_t)POSITION_VAL(DMA2D_BGPFCCR_CCM) /*!< Required left shift to set background CLUT color mode */ + +#define DMA2D_POSITION_OPFCCR_AI (uint32_t)POSITION_VAL(DMA2D_OPFCCR_AI) /*!< Required left shift to set output alpha inversion */ +#define DMA2D_POSITION_FGPFCCR_AI (uint32_t)POSITION_VAL(DMA2D_FGPFCCR_AI) /*!< Required left shift to set foreground alpha inversion */ +#define DMA2D_POSITION_BGPFCCR_AI (uint32_t)POSITION_VAL(DMA2D_BGPFCCR_AI) /*!< Required left shift to set background alpha inversion */ + +#define DMA2D_POSITION_OPFCCR_RBS (uint32_t)POSITION_VAL(DMA2D_OPFCCR_RBS) /*!< Required left shift to set output Red/Blue swap */ +#define DMA2D_POSITION_FGPFCCR_RBS (uint32_t)POSITION_VAL(DMA2D_FGPFCCR_RBS) /*!< Required left shift to set foreground Red/Blue swap */ +#define DMA2D_POSITION_BGPFCCR_RBS (uint32_t)POSITION_VAL(DMA2D_BGPFCCR_RBS) /*!< Required left shift to set background Red/Blue swap */ + +#define DMA2D_POSITION_AMTCR_DT (uint32_t)POSITION_VAL(DMA2D_AMTCR_DT) /*!< Required left shift to set deadtime value */ + +#define DMA2D_POSITION_FGPFCCR_AM (uint32_t)POSITION_VAL(DMA2D_FGPFCCR_AM) /*!< Required left shift to set foreground alpha mode */ +#define DMA2D_POSITION_BGPFCCR_AM (uint32_t)POSITION_VAL(DMA2D_BGPFCCR_AM) /*!< Required left shift to set background alpha mode */ + +#define DMA2D_POSITION_FGPFCCR_ALPHA (uint32_t)POSITION_VAL(DMA2D_FGPFCCR_ALPHA) /*!< Required left shift to set foreground alpha value */ +#define DMA2D_POSITION_BGPFCCR_ALPHA (uint32_t)POSITION_VAL(DMA2D_BGPFCCR_ALPHA) /*!< Required left shift to set background alpha value */ + +#define DMA2D_POSITION_NLR_PL (uint32_t)POSITION_VAL(DMA2D_NLR_PL) /*!< Required left shift to set pixels per lines value */ + +#define DMA2D_POSITION_FGPFCCR_CSS (uint32_t)POSITION_VAL(DMA2D_FGPFCCR_CSS) /*!< Required left shift to set foreground Chroma sub-sampling */ +/** + * @} + */ + +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup DMA2D_Private_Functions_Prototypes + * @{ + */ +static void DMA2D_SetConfig(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width, uint32_t Height); +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @defgroup DMA2D_Exported_Functions DMA2D Exported Functions + * @{ + */ + +/** @defgroup DMA2D_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Initialize and configure the DMA2D + (+) De-initialize the DMA2D + +@endverbatim + * @{ + */ + +/** + * @brief Initialize the DMA2D according to the specified + * parameters in the DMA2D_InitTypeDef and create the associated handle. + * @param hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_Init(DMA2D_HandleTypeDef *hdma2d) +{ + /* Check the DMA2D peripheral state */ + if(hdma2d == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_DMA2D_ALL_INSTANCE(hdma2d->Instance)); + assert_param(IS_DMA2D_MODE(hdma2d->Init.Mode)); + assert_param(IS_DMA2D_CMODE(hdma2d->Init.ColorMode)); + assert_param(IS_DMA2D_OFFSET(hdma2d->Init.OutputOffset)); + + __HAL_RCC_DMA2D_CLK_ENABLE(); + __HAL_RCC_DMA2D_RESET(); + + if(hdma2d->State == HAL_DMA2D_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hdma2d->Lock = HAL_UNLOCKED; + /* Init the low level hardware */ + HAL_DMA2D_MspInit(hdma2d); + } + + /* Change DMA2D peripheral state */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + /* DMA2D CR register configuration -------------------------------------------*/ + MODIFY_REG(hdma2d->Instance->CR, DMA2D_CR_MODE, hdma2d->Init.Mode); + + /* DMA2D OPFCCR register configuration ---------------------------------------*/ + MODIFY_REG(hdma2d->Instance->OPFCCR, DMA2D_OPFCCR_CM, hdma2d->Init.ColorMode); + + /* DMA2D OOR register configuration ------------------------------------------*/ + MODIFY_REG(hdma2d->Instance->OOR, DMA2D_OOR_LO, hdma2d->Init.OutputOffset); + + /* DMA2D OPFCCR AI fields setting (Output Alpha Inversion)*/ + MODIFY_REG(hdma2d->Instance->OPFCCR, DMA2D_OPFCCR_AI, (hdma2d->Init.AlphaInverted << DMA2D_POSITION_OPFCCR_AI)); + + MODIFY_REG(hdma2d->Instance->OPFCCR, DMA2D_OPFCCR_RBS,(hdma2d->Init.RedBlueSwap << DMA2D_POSITION_OPFCCR_RBS)); + +// SET_BIT(hdma2d->Instance->CR, DMA2D_CR_AHB_LOCK); //DMA2D lock function have influence on ltdc display + + /* Update error code */ + hdma2d->ErrorCode = HAL_DMA2D_ERROR_NONE; + + /* Initialize the DMA2D state*/ + hdma2d->State = HAL_DMA2D_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Deinitializes the DMA2D peripheral registers to their default reset + * values. + * @param hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @retval None + */ + +HAL_StatusTypeDef HAL_DMA2D_DeInit(DMA2D_HandleTypeDef *hdma2d) +{ + + /* Check the DMA2D peripheral state */ + if(hdma2d == NULL) + { + return HAL_ERROR; + } + + /* Abort DMA2D transfer if any */ + if ((hdma2d->Instance->CR & DMA2D_CR_START) == DMA2D_CR_START) + { + if (HAL_DMA2D_Abort(hdma2d) != HAL_OK) + { + /* Issue when aborting DMA2D transfer */ + return HAL_ERROR; + } + } + else + { + /* Abort background CLUT loading if any */ + if ((hdma2d->Instance->BGPFCCR & DMA2D_BGPFCCR_START) == DMA2D_BGPFCCR_START) + { + if (HAL_DMA2D_CLUTLoading_Abort(hdma2d, 0) != HAL_OK) + { + /* Issue when aborting background CLUT loading */ + return HAL_ERROR; + } + } + else + { + /* Abort foreground CLUT loading if any */ + if ((hdma2d->Instance->FGPFCCR & DMA2D_FGPFCCR_START) == DMA2D_FGPFCCR_START) + { + if (HAL_DMA2D_CLUTLoading_Abort(hdma2d, 1) != HAL_OK) + { + /* Issue when aborting foreground CLUT loading */ + return HAL_ERROR; + } + } + } + } + + + + /* Carry on with de-initialization of low level hardware */ + HAL_DMA2D_MspDeInit(hdma2d); + + /* Reset DMA2D control registers*/ + hdma2d->Instance->CR = 0; + hdma2d->Instance->FGOR = 0; + hdma2d->Instance->BGOR = 0; + hdma2d->Instance->FGPFCCR = 0; + hdma2d->Instance->BGPFCCR = 0; + hdma2d->Instance->OPFCCR = 0; + + /* Update error code */ + hdma2d->ErrorCode = HAL_DMA2D_ERROR_NONE; + + /* Initialize the DMA2D state*/ + hdma2d->State = HAL_DMA2D_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(hdma2d); + + return HAL_OK; +} + +/** + * @brief Initializes the DMA2D MSP. + * @param hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @retval None + */ +__weak void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef* hdma2d) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hdma2d); + + /* NOTE : This function should not be modified; when the callback is needed, + the HAL_DMA2D_MspInit can be implemented in the user file. + */ +} + +/** + * @brief DeInitializes the DMA2D MSP. + * @param hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @retval None + */ +__weak void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef* hdma2d) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hdma2d); + + /* NOTE : This function should not be modified; when the callback is needed, + the HAL_DMA2D_MspDeInit can be implemented in the user file. + */ +} + +/** + * @} + */ + + +/** @defgroup DMA2D_Exported_Functions_Group2 IO operation functions + * @brief IO operation functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure the pdata, destination address and data size then + start the DMA2D transfer. + (+) Configure the source for foreground and background, destination address + and data size then start a MultiBuffer DMA2D transfer. + (+) Configure the pdata, destination address and data size then + start the DMA2D transfer with interrupt. + (+) Configure the source for foreground and background, destination address + and data size then start a MultiBuffer DMA2D transfer with interrupt. + (+) Abort DMA2D transfer. + (+) Suspend DMA2D transfer. + (+) Resume DMA2D transfer. + (+) Enable CLUT transfer. + (+) Configure CLUT loading then start transfer in polling mode. + (+) Configure CLUT loading then start transfer in interrupt mode. + (+) Abort DMA2D CLUT loading. + (+) Suspend DMA2D CLUT loading. + (+) Resume DMA2D CLUT loading. + (+) Poll for transfer complete. + (+) handle DMA2D interrupt request. + (+) Transfer watermark callback. + (+) CLUT Transfer Complete callback. + + +@endverbatim + * @{ + */ + +/** + * @brief Start the DMA2D Transfer. + * @param hdma2d: Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param pdata: Configure the source memory Buffer address if + * Memory-to-Memory or Memory-to-Memory with pixel format + * conversion mode is selected, or configure + * the color value if Register-to-Memory mode is selected. + * @param DstAddress: The destination memory Buffer address. + * @param Width: The width of data to be transferred from source to destination (expressed in number of pixels per line). + * @param Height: The height of data to be transferred from source to destination (expressed in number of lines). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_Start(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width, uint32_t Height) +{ + /* Check the parameters */ + assert_param(IS_DMA2D_LINE(Height)); + assert_param(IS_DMA2D_PIXEL(Width)); + + /* Process locked */ + __HAL_LOCK(hdma2d); + + /* Change DMA2D peripheral state */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + /* Configure the source, destination address and the data size */ + DMA2D_SetConfig(hdma2d, pdata, DstAddress, Width, Height); + + /* Enable the Peripheral */ + __HAL_DMA2D_ENABLE(hdma2d); + + return HAL_OK; +} + +/** + * @brief Start the DMA2D Transfer with interrupt enabled. + * @param hdma2d: Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param pdata: Configure the source memory Buffer address if + * the Memory-to-Memory or Memory-to-Memory with pixel format + * conversion mode is selected, or configure + * the color value if Register-to-Memory mode is selected. + * @param DstAddress: The destination memory Buffer address. + * @param Width: The width of data to be transferred from source to destination (expressed in number of pixels per line). + * @param Height: The height of data to be transferred from source to destination (expressed in number of lines). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_Start_IT(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width, uint32_t Height) +{ + /* Check the parameters */ + assert_param(IS_DMA2D_LINE(Height)); + assert_param(IS_DMA2D_PIXEL(Width)); + + /* Process locked */ + __HAL_LOCK(hdma2d); + + /* Change DMA2D peripheral state */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + /* Configure the source, destination address and the data size */ + DMA2D_SetConfig(hdma2d, pdata, DstAddress, Width, Height); + + /* Enable the transfer complete, transfer error and configuration error interrupts */ + __HAL_DMA2D_ENABLE_IT(hdma2d, DMA2D_IT_TC|DMA2D_IT_TE|DMA2D_IT_CE); + + /* Enable the Peripheral */ + __HAL_DMA2D_ENABLE(hdma2d); + + return HAL_OK; +} + +/** + * @brief Start the multi-source DMA2D Transfer. + * @param hdma2d: Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param SrcAddress1: The source memory Buffer address for the foreground layer. + * @param SrcAddress2: The source memory Buffer address for the background layer. + * @param DstAddress: The destination memory Buffer address. + * @param Width: The width of data to be transferred from source to destination (expressed in number of pixels per line). + * @param Height: The height of data to be transferred from source to destination (expressed in number of lines). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_BlendingStart(DMA2D_HandleTypeDef *hdma2d, uint32_t SrcAddress1, uint32_t SrcAddress2, uint32_t DstAddress, uint32_t Width, uint32_t Height) +{ + /* Check the parameters */ + assert_param(IS_DMA2D_LINE(Height)); + assert_param(IS_DMA2D_PIXEL(Width)); + + /* Process locked */ + __HAL_LOCK(hdma2d); + + /* Change DMA2D peripheral state */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + /* Configure DMA2D Stream source2 address */ + WRITE_REG(hdma2d->Instance->BGMAR, SrcAddress2); + + /* Configure the source, destination address and the data size */ + DMA2D_SetConfig(hdma2d, SrcAddress1, DstAddress, Width, Height); + + /* Enable the Peripheral */ + __HAL_DMA2D_ENABLE(hdma2d); + + return HAL_OK; +} + +/** + * @brief Start the multi-source DMA2D Transfer with interrupt enabled. + * @param hdma2d: Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param SrcAddress1: The source memory Buffer address for the foreground layer. + * @param SrcAddress2: The source memory Buffer address for the background layer. + * @param DstAddress: The destination memory Buffer address. + * @param Width: The width of data to be transferred from source to destination (expressed in number of pixels per line). + * @param Height: The height of data to be transferred from source to destination (expressed in number of lines). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_BlendingStart_IT(DMA2D_HandleTypeDef *hdma2d, uint32_t SrcAddress1, uint32_t SrcAddress2, uint32_t DstAddress, uint32_t Width, uint32_t Height) +{ + /* Check the parameters */ + assert_param(IS_DMA2D_LINE(Height)); + assert_param(IS_DMA2D_PIXEL(Width)); + + /* Process locked */ + __HAL_LOCK(hdma2d); + + /* Change DMA2D peripheral state */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + /* Configure DMA2D Stream source2 address */ + WRITE_REG(hdma2d->Instance->BGMAR, SrcAddress2); + + /* Configure the source, destination address and the data size */ + DMA2D_SetConfig(hdma2d, SrcAddress1, DstAddress, Width, Height); + + /* Enable the transfer complete, transfer error and configuration error interrupts */ + __HAL_DMA2D_ENABLE_IT(hdma2d, DMA2D_IT_TC|DMA2D_IT_TE|DMA2D_IT_CE); + + /* Enable the Peripheral */ + __HAL_DMA2D_ENABLE(hdma2d); + + return HAL_OK; +} + +/** + * @brief Abort the DMA2D Transfer. + * @param hdma2d : pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_Abort(DMA2D_HandleTypeDef *hdma2d) +{ + uint32_t tickstart = 0; + + /* Abort the DMA2D transfer */ + /* START bit is reset to make sure not to set it again, in the event the HW clears it + between the register read and the register write by the CPU (writing ??has no + effect on START bitvalue). */ + MODIFY_REG(hdma2d->Instance->CR, DMA2D_CR_ABORT|DMA2D_CR_START, DMA2D_CR_ABORT); + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Check if the DMA2D is effectively disabled */ + while((hdma2d->Instance->CR & DMA2D_CR_START) != RESET) + { + if((HAL_GetTick() - tickstart ) > DMA2D_TIMEOUT_ABORT) + { + /* Update error code */ + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; + + /* Change the DMA2D state */ + hdma2d->State = HAL_DMA2D_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_TIMEOUT; + } + } + + /* Disable the Transfer Complete, Transfer Error and Configuration Error interrupts */ + __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_TC|DMA2D_IT_TE|DMA2D_IT_CE); + + /* Change the DMA2D state*/ + hdma2d->State = HAL_DMA2D_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_OK; +} + +/** + * @brief Suspend the DMA2D Transfer. + * @param hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_Suspend(DMA2D_HandleTypeDef *hdma2d) +{ + uint32_t tickstart = 0; + + /* Suspend the DMA2D transfer */ + /* START bit is reset to make sure not to set it again, in the event the HW clears it + between the register read and the register write by the CPU (writing ??has no + effect on START bitvalue). */ + MODIFY_REG(hdma2d->Instance->CR, DMA2D_CR_SUSP|DMA2D_CR_START, DMA2D_CR_SUSP); + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Check if the DMA2D is effectively suspended */ + while (((hdma2d->Instance->CR & DMA2D_CR_SUSP) != DMA2D_CR_SUSP) \ + && ((hdma2d->Instance->CR & DMA2D_CR_START) == DMA2D_CR_START)) + { + if((HAL_GetTick() - tickstart ) > DMA2D_TIMEOUT_SUSPEND) + { + /* Update error code */ + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; + + /* Change the DMA2D state */ + hdma2d->State = HAL_DMA2D_STATE_TIMEOUT; + + return HAL_TIMEOUT; + } + } + + /* Check whether or not a transfer is actually suspended and change the DMA2D state accordingly */ + if ((hdma2d->Instance->CR & DMA2D_CR_START) != RESET) + { + hdma2d->State = HAL_DMA2D_STATE_SUSPEND; + } + else + { + /* Make sure SUSP bit is cleared since it is meaningless + when no tranfer is on-going */ + CLEAR_BIT(hdma2d->Instance->CR, DMA2D_CR_SUSP); + } + + return HAL_OK; +} + +/** + * @brief Resume the DMA2D Transfer. + * @param hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_Resume(DMA2D_HandleTypeDef *hdma2d) +{ + /* Check the SUSP and START bits */ + if((hdma2d->Instance->CR & (DMA2D_CR_SUSP | DMA2D_CR_START)) == (DMA2D_CR_SUSP | DMA2D_CR_START)) + { + /* Ongoing transfer is suspended: change the DMA2D state before resuming */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + } + + /* Resume the DMA2D transfer */ + /* START bit is reset to make sure not to set it again, in the event the HW clears it + between the register read and the register write by the CPU (writing ??has no + effect on START bitvalue). */ + CLEAR_BIT(hdma2d->Instance->CR, (DMA2D_CR_SUSP|DMA2D_CR_START)); + + return HAL_OK; +} + + +/** + * @brief Enable the DMA2D CLUT Transfer. + * @param hdma2d: Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param LayerIdx: DMA2D Layer index. + * This parameter can be one of the following values: + * 0(background) / 1(foreground) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_EnableCLUT(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_DMA2D_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hdma2d); + + /* Change DMA2D peripheral state */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + if(LayerIdx == 0) + { + /* Enable the background CLUT loading */ + SET_BIT(hdma2d->Instance->BGPFCCR, DMA2D_BGPFCCR_START); + } + else + { + /* Enable the foreground CLUT loading */ + SET_BIT(hdma2d->Instance->FGPFCCR, DMA2D_FGPFCCR_START); + } + + return HAL_OK; +} + + +/** + * @brief Start DMA2D CLUT Loading. + * @param hdma2d: Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param CLUTCfg: Pointer to a DMA2D_CLUTCfgTypeDef structure that contains + * the configuration information for the color look up table. + * @param LayerIdx: DMA2D Layer index. + * This parameter can be one of the following values: + * 0(background) / 1(foreground) + * @note Invoking this API is similar to calling HAL_DMA2D_ConfigCLUT() then HAL_DMA2D_EnableCLUT(). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_CLUTLoad(DMA2D_HandleTypeDef *hdma2d, DMA2D_CLUTCfgTypeDef CLUTCfg, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_DMA2D_LAYER(LayerIdx)); + assert_param(IS_DMA2D_CLUT_CM(CLUTCfg.CLUTColorMode)); + assert_param(IS_DMA2D_CLUT_SIZE(CLUTCfg.Size)); + + /* Process locked */ + __HAL_LOCK(hdma2d); + + /* Change DMA2D peripheral state */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + /* Configure the CLUT of the background DMA2D layer */ + if(LayerIdx == 0) + { + /* Write background CLUT memory address */ + WRITE_REG(hdma2d->Instance->BGCMAR, (uint32_t)CLUTCfg.pCLUT); + + /* Write background CLUT size and CLUT color mode */ + MODIFY_REG(hdma2d->Instance->BGPFCCR, (DMA2D_BGPFCCR_CS | DMA2D_BGPFCCR_CCM), + ((CLUTCfg.Size << DMA2D_POSITION_BGPFCCR_CS) | (CLUTCfg.CLUTColorMode << DMA2D_POSITION_BGPFCCR_CCM))); + + /* Enable the CLUT loading for the background */ + SET_BIT(hdma2d->Instance->BGPFCCR, DMA2D_BGPFCCR_START); + } + /* Configure the CLUT of the foreground DMA2D layer */ + else + { + /* Write foreground CLUT memory address */ + WRITE_REG(hdma2d->Instance->FGCMAR, (uint32_t)CLUTCfg.pCLUT); + + /* Write foreground CLUT size and CLUT color mode */ + MODIFY_REG(hdma2d->Instance->FGPFCCR, (DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM), + ((CLUTCfg.Size << DMA2D_POSITION_BGPFCCR_CS) | (CLUTCfg.CLUTColorMode << DMA2D_POSITION_FGPFCCR_CCM))); + + /* Enable the CLUT loading for the foreground */ + SET_BIT(hdma2d->Instance->FGPFCCR, DMA2D_FGPFCCR_START); + + +#if 0 +{ + int i; + + for(i=0; i<1024; i++) + ((uint32_t *)(DMA2D_BASE_ADDR+0x0800))[i] = 0; +} +#endif + + } + + return HAL_OK; +} + +/** + * @brief Start DMA2D CLUT Loading with interrupt enabled. + * @param hdma2d: Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param CLUTCfg: Pointer to a DMA2D_CLUTCfgTypeDef structure that contains + * the configuration information for the color look up table. + * @param LayerIdx: DMA2D Layer index. + * This parameter can be one of the following values: + * 0(background) / 1(foreground) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_CLUTLoad_IT(DMA2D_HandleTypeDef *hdma2d, DMA2D_CLUTCfgTypeDef CLUTCfg, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_DMA2D_LAYER(LayerIdx)); + assert_param(IS_DMA2D_CLUT_CM(CLUTCfg.CLUTColorMode)); + assert_param(IS_DMA2D_CLUT_SIZE(CLUTCfg.Size)); + + /* Process locked */ + __HAL_LOCK(hdma2d); + + /* Change DMA2D peripheral state */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + /* Configure the CLUT of the background DMA2D layer */ + if(LayerIdx == 0) + { + /* Write background CLUT memory address */ + WRITE_REG(hdma2d->Instance->BGCMAR, (uint32_t)CLUTCfg.pCLUT); + + /* Write background CLUT size and CLUT color mode */ + MODIFY_REG(hdma2d->Instance->BGPFCCR, (DMA2D_BGPFCCR_CS | DMA2D_BGPFCCR_CCM), + ((CLUTCfg.Size << DMA2D_POSITION_BGPFCCR_CS) | (CLUTCfg.CLUTColorMode << DMA2D_POSITION_BGPFCCR_CCM))); + + /* Enable the CLUT Transfer Complete, transfer Error, configuration Error and CLUT Access Error interrupts */ + __HAL_DMA2D_ENABLE_IT(hdma2d, DMA2D_IT_CTC | DMA2D_IT_TE | DMA2D_IT_CE |DMA2D_IT_CAE); + + /* Enable the CLUT loading for the background */ + SET_BIT(hdma2d->Instance->BGPFCCR, DMA2D_BGPFCCR_START); + } + /* Configure the CLUT of the foreground DMA2D layer */ + else + { + /* Write foreground CLUT memory address */ + WRITE_REG(hdma2d->Instance->FGCMAR, (uint32_t)CLUTCfg.pCLUT); + + /* Write foreground CLUT size and CLUT color mode */ + MODIFY_REG(hdma2d->Instance->FGPFCCR, (DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM), + ((CLUTCfg.Size << DMA2D_POSITION_BGPFCCR_CS) | (CLUTCfg.CLUTColorMode << DMA2D_POSITION_FGPFCCR_CCM))); + + /* Enable the CLUT Transfer Complete, transfer Error, configuration Error and CLUT Access Error interrupts */ + __HAL_DMA2D_ENABLE_IT(hdma2d, DMA2D_IT_CTC | DMA2D_IT_TE | DMA2D_IT_CE |DMA2D_IT_CAE); + + /* Enable the CLUT loading for the foreground */ + SET_BIT(hdma2d->Instance->FGPFCCR, DMA2D_FGPFCCR_START); + } + + return HAL_OK; +} + +/** + * @brief Abort the DMA2D CLUT loading. + * @param hdma2d : Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param LayerIdx: DMA2D Layer index. + * This parameter can be one of the following values: + * 0(background) / 1(foreground) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_CLUTLoading_Abort(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx) +{ + uint32_t tickstart = 0; + __IO uint32_t * reg = &(hdma2d->Instance->BGPFCCR); /* by default, point at background register */ + uint32_t mask = DMA2D_BGPFCCR_START; /* by default, set to background constant */ + + + /* Abort the CLUT loading */ + SET_BIT(hdma2d->Instance->CR, DMA2D_CR_ABORT); + + /* If foreground CLUT loading is considered, update local variables */ + if(LayerIdx == 1) + { + reg = &(hdma2d->Instance->FGPFCCR); + } + + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Check if the CLUT loading is aborted */ + while((*reg & mask) != RESET) + { + if((HAL_GetTick() - tickstart ) > DMA2D_TIMEOUT_ABORT) + { + /* Update error code */ + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; + + /* Change the DMA2D state */ + hdma2d->State = HAL_DMA2D_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_TIMEOUT; + } + } + + /* Disable the CLUT Transfer Complete, Transfer Error, Configuration Error and CLUT Access Error interrupts */ + __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_CTC | DMA2D_IT_TE | DMA2D_IT_CE |DMA2D_IT_CAE); + + /* Change the DMA2D state*/ + hdma2d->State = HAL_DMA2D_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_OK; +} + +/** + * @brief Suspend the DMA2D CLUT loading. + * @param hdma2d: Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param LayerIdx: DMA2D Layer index. + * This parameter can be one of the following values: + * 0(background) / 1(foreground) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_CLUTLoading_Suspend(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx) +{ + uint32_t tickstart = 0; + __IO uint32_t * reg = &(hdma2d->Instance->BGPFCCR); /* by default, point at background register */ + uint32_t mask = DMA2D_BGPFCCR_START; /* by default, set to background constant */ + + + /* Suspend the CLUT loading */ + SET_BIT(hdma2d->Instance->CR, DMA2D_CR_SUSP); + + /* If foreground CLUT loading is considered, update local variables */ + if(LayerIdx == 1) + { + reg = &(hdma2d->Instance->FGPFCCR); + } + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Check if the CLUT loading is suspended */ + while (((hdma2d->Instance->CR & DMA2D_CR_SUSP) != DMA2D_CR_SUSP) \ + && ((*reg & mask) == mask)) + { + if((HAL_GetTick() - tickstart ) > DMA2D_TIMEOUT_SUSPEND) + { + /* Update error code */ + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; + + /* Change the DMA2D state */ + hdma2d->State = HAL_DMA2D_STATE_TIMEOUT; + + return HAL_TIMEOUT; + } + } + + /* Check whether or not a transfer is actually suspended and change the DMA2D state accordingly */ + if ((*reg & mask) != RESET) + { + hdma2d->State = HAL_DMA2D_STATE_SUSPEND; + } + else + { + /* Make sure SUSP bit is cleared since it is meaningless + when no tranfer is on-going */ + CLEAR_BIT(hdma2d->Instance->CR, DMA2D_CR_SUSP); + } + + return HAL_OK; +} + +/** + * @brief Resume the DMA2D CLUT loading. + * @param hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param LayerIdx: DMA2D Layer index. + * This parameter can be one of the following values: + * 0(background) / 1(foreground) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_CLUTLoading_Resume(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx) +{ + /* Check the SUSP and START bits for background or foreground CLUT loading */ + if(LayerIdx == 0) + { + /* Background CLUT loading suspension check */ + if (((hdma2d->Instance->CR & DMA2D_CR_SUSP) == DMA2D_CR_SUSP) + && ((hdma2d->Instance->BGPFCCR & DMA2D_BGPFCCR_START) == DMA2D_BGPFCCR_START)) + { + /* Ongoing CLUT loading is suspended: change the DMA2D state before resuming */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + } + } + else + { + /* Foreground CLUT loading suspension check */ + if (((hdma2d->Instance->CR & DMA2D_CR_SUSP) == DMA2D_CR_SUSP) + && ((hdma2d->Instance->FGPFCCR & DMA2D_FGPFCCR_START) == DMA2D_FGPFCCR_START)) + { + /* Ongoing CLUT loading is suspended: change the DMA2D state before resuming */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + } + } + + /* Resume the CLUT loading */ + CLEAR_BIT(hdma2d->Instance->CR, DMA2D_CR_SUSP); + + return HAL_OK; +} + + +/** + + * @brief Polling for transfer complete or CLUT loading. + * @param hdma2d: Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param Timeout: Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_PollForTransfer(DMA2D_HandleTypeDef *hdma2d, uint32_t Timeout) +{ + uint32_t tickstart = 0; + __IO uint32_t isrflags = 0x0; + + /* Polling for DMA2D transfer */ + if((hdma2d->Instance->CR & DMA2D_CR_START) != RESET) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + while(__HAL_DMA2D_GET_FLAG(hdma2d, DMA2D_FLAG_TC) == RESET) + { + isrflags = READ_REG(hdma2d->Instance->ISR); + if ((isrflags & (DMA2D_FLAG_CE|DMA2D_FLAG_TE)) != RESET) + { + if ((isrflags & DMA2D_FLAG_CE) != RESET) + { + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_CE; + } + if ((isrflags & DMA2D_FLAG_TE) != RESET) + { + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TE; + } + /* Clear the transfer and configuration error flags */ + __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CE | DMA2D_FLAG_TE); + + /* Change DMA2D state */ + hdma2d->State = HAL_DMA2D_STATE_ERROR; + + /* Process unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_ERROR; + } + /* Check for the Timeout */ + if(Timeout != HAL_MAX_DELAY) + { + if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) + { + /* Update error code */ + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; + + /* Change the DMA2D state */ + hdma2d->State = HAL_DMA2D_STATE_TIMEOUT; + + /* Process unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_TIMEOUT; + } + } + } + } + /* Polling for CLUT loading (foreground or background) */ + if (((hdma2d->Instance->FGPFCCR & DMA2D_FGPFCCR_START) != RESET) || + ((hdma2d->Instance->BGPFCCR & DMA2D_BGPFCCR_START) != RESET)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + while(__HAL_DMA2D_GET_FLAG(hdma2d, DMA2D_FLAG_CTC) == RESET) + { + isrflags = READ_REG(hdma2d->Instance->ISR); + if ((isrflags & (DMA2D_FLAG_CAE|DMA2D_FLAG_CE|DMA2D_FLAG_TE)) != RESET) + { + if ((isrflags & DMA2D_FLAG_CAE) != RESET) + { + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_CAE; + } + if ((isrflags & DMA2D_FLAG_CE) != RESET) + { + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_CE; + } + if ((isrflags & DMA2D_FLAG_TE) != RESET) + { + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TE; + } + /* Clear the CLUT Access Error, Configuration Error and Transfer Error flags */ + __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CAE | DMA2D_FLAG_CE | DMA2D_FLAG_TE); + + /* Change DMA2D state */ + hdma2d->State= HAL_DMA2D_STATE_ERROR; + + /* Process unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_ERROR; + } + /* Check for the Timeout */ + if(Timeout != HAL_MAX_DELAY) + { + if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) + { + /* Update error code */ + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT; + + /* Change the DMA2D state */ + hdma2d->State= HAL_DMA2D_STATE_TIMEOUT; + + /* Process unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_TIMEOUT; + } + } + } + } + + /* Clear the transfer complete and CLUT loading flags */ + __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_TC|DMA2D_FLAG_CTC); + + /* Change DMA2D state */ + hdma2d->State = HAL_DMA2D_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_OK; +} +/** + * @brief Handle DMA2D interrupt request. + * @param hdma2d: Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @retval HAL status + */ +void HAL_DMA2D_IRQHandler(DMA2D_HandleTypeDef *hdma2d) +{ + uint32_t isrflags = READ_REG(hdma2d->Instance->ISR); + uint32_t crflags = READ_REG(hdma2d->Instance->CR); + + /* Transfer Error Interrupt management ***************************************/ + if ((isrflags & DMA2D_FLAG_TE) != RESET) + { + if ((crflags & DMA2D_IT_TE) != RESET) + { + /* Disable the transfer Error interrupt */ + __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_TE); + + /* Update error code */ + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TE; + + /* Clear the transfer error flag */ + __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_TE); + + /* Change DMA2D state */ + hdma2d->State = HAL_DMA2D_STATE_ERROR; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma2d); + + if(hdma2d->XferErrorCallback != NULL) + { + /* Transfer error Callback */ + hdma2d->XferErrorCallback(hdma2d); + } + } + } + /* Configuration Error Interrupt management **********************************/ + if ((isrflags & DMA2D_FLAG_CE) != RESET) + { + if ((crflags & DMA2D_IT_CE) != RESET) + { + /* Disable the Configuration Error interrupt */ + __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_CE); + + /* Clear the Configuration error flag */ + __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CE); + + /* Update error code */ + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_CE; + + /* Change DMA2D state */ + hdma2d->State = HAL_DMA2D_STATE_ERROR; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma2d); + + if(hdma2d->XferErrorCallback != NULL) + { + /* Transfer error Callback */ + hdma2d->XferErrorCallback(hdma2d); + } + } + } + /* CLUT access Error Interrupt management ***********************************/ + if ((isrflags & DMA2D_FLAG_CAE) != RESET) + { + if ((crflags & DMA2D_IT_CAE) != RESET) + { + /* Disable the CLUT access error interrupt */ + __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_CAE); + + /* Clear the CLUT access error flag */ + __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CAE); + + /* Update error code */ + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_CAE; + + /* Change DMA2D state */ + hdma2d->State = HAL_DMA2D_STATE_ERROR; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma2d); + + if(hdma2d->XferErrorCallback != NULL) + { + /* Transfer error Callback */ + hdma2d->XferErrorCallback(hdma2d); + } + } + } + /* Transfer watermark Interrupt management **********************************/ + if ((isrflags & DMA2D_FLAG_TW) != RESET) + { + if ((crflags & DMA2D_IT_TW) != RESET) + { + /* Disable the transfer watermark interrupt */ + __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_TW); + + /* Clear the transfer watermark flag */ + __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_TW); + + /* Transfer watermark Callback */ + HAL_DMA2D_LineEventCallback(hdma2d); + } + } + /* Transfer Complete Interrupt management ************************************/ + if ((isrflags & DMA2D_FLAG_TC) != RESET) + { + if ((crflags & DMA2D_IT_TC) != RESET) + { + /* Disable the transfer complete interrupt */ + __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_TC); + + /* Clear the transfer complete flag */ + __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_TC); + + /* Update error code */ + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_NONE; + + /* Change DMA2D state */ + hdma2d->State = HAL_DMA2D_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma2d); + + if(hdma2d->XferCpltCallback != NULL) + { + /* Transfer complete Callback */ + hdma2d->XferCpltCallback(hdma2d); + } + } + } + /* CLUT Transfer Complete Interrupt management ******************************/ + if ((isrflags & DMA2D_FLAG_CTC) != RESET) + { + if ((crflags & DMA2D_IT_CTC) != RESET) + { + /* Disable the CLUT transfer complete interrupt */ + __HAL_DMA2D_DISABLE_IT(hdma2d, DMA2D_IT_CTC); + + /* Clear the CLUT transfer complete flag */ + __HAL_DMA2D_CLEAR_FLAG(hdma2d, DMA2D_FLAG_CTC); + + /* Update error code */ + hdma2d->ErrorCode |= HAL_DMA2D_ERROR_NONE; + + /* Change DMA2D state */ + hdma2d->State = HAL_DMA2D_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma2d); + + /* CLUT Transfer complete Callback */ + HAL_DMA2D_CLUTLoadingCpltCallback(hdma2d); + } + } + +} + +/** + * @brief Transfer watermark callback. + * @param hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @retval None + */ +__weak void HAL_DMA2D_LineEventCallback(DMA2D_HandleTypeDef *hdma2d) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hdma2d); + + hdma2d->LineEvtCallback(hdma2d); + + /* NOTE : This function should not be modified; when the callback is needed, + the HAL_DMA2D_LineEventCallback can be implemented in the user file. + */ +} + +/** + * @brief CLUT Transfer Complete callback. + * @param hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @retval None + */ +__weak void HAL_DMA2D_CLUTLoadingCpltCallback(DMA2D_HandleTypeDef *hdma2d) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hdma2d); + + /* NOTE : This function should not be modified; when the callback is needed, + the HAL_DMA2D_CLUTLoadingCpltCallback can be implemented in the user file. + */ +} + +/** + * @} + */ + +/** @defgroup DMA2D_Exported_Functions_Group3 Peripheral Control functions + * @brief Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure the DMA2D foreground or background layer parameters. + (+) Configure the DMA2D CLUT transfer. + (+) Configure the line watermark + (+) Configure the dead time value. + (+) Enable or disable the dead time value functionality. + + +@endverbatim + * @{ + */ + +/** + * @brief Configure the DMA2D Layer according to the specified + * parameters in the DMA2D_InitTypeDef and create the associated handle. + * @param hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param LayerIdx: DMA2D Layer index. + * This parameter can be one of the following values: + * 0(background) / 1(foreground) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_ConfigLayer(DMA2D_HandleTypeDef *hdma2d, uint32_t LayerIdx) +{ + DMA2D_LayerCfgTypeDef *pLayerCfg = &hdma2d->LayerCfg[LayerIdx]; + + uint32_t regMask = 0, regValue = 0; + + /* Check the parameters */ + assert_param(IS_DMA2D_LAYER(LayerIdx)); + assert_param(IS_DMA2D_OFFSET(pLayerCfg->InputOffset)); + if(hdma2d->Init.Mode != DMA2D_R2M) + { + assert_param(IS_DMA2D_INPUT_COLOR_MODE(pLayerCfg->InputColorMode)); + if(hdma2d->Init.Mode != DMA2D_M2M) + { + assert_param(IS_DMA2D_ALPHA_MODE(pLayerCfg->AlphaMode)); + } + } + + /* Process locked */ + __HAL_LOCK(hdma2d); + + /* Change DMA2D peripheral state */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + /* DMA2D BGPFCR register configuration -----------------------------------*/ + /* Prepare the value to be written to the BGPFCCR register */ + + regValue = pLayerCfg->InputColorMode | (pLayerCfg->AlphaMode << DMA2D_POSITION_BGPFCCR_AM) | \ + (pLayerCfg->AlphaInverted << DMA2D_POSITION_BGPFCCR_AI) | \ + (pLayerCfg->RedBlueSwap << DMA2D_POSITION_BGPFCCR_RBS); + + regMask = DMA2D_BGPFCCR_CM | DMA2D_BGPFCCR_AM | DMA2D_BGPFCCR_ALPHA | DMA2D_BGPFCCR_AI | DMA2D_BGPFCCR_RBS; + + if ((pLayerCfg->InputColorMode == DMA2D_INPUT_A4) || (pLayerCfg->InputColorMode == DMA2D_INPUT_A8)) + { + regValue |= ((pLayerCfg->InputAlpha << DMA2D_POSITION_BGPFCCR_ALPHA) & DMA2D_BGPFCCR_ALPHA); + } + else + { + regValue |= (pLayerCfg->InputAlpha << DMA2D_POSITION_BGPFCCR_ALPHA); + } + + /* Configure the background DMA2D layer */ + if(LayerIdx == 0) + { + /* Write DMA2D BGPFCCR register */ + MODIFY_REG(hdma2d->Instance->BGPFCCR, regMask, regValue); + + /* DMA2D BGOR register configuration -------------------------------------*/ + WRITE_REG(hdma2d->Instance->BGOR, pLayerCfg->InputOffset); + + /* DMA2D BGCOLR register configuration -------------------------------------*/ + if ((pLayerCfg->InputColorMode == DMA2D_INPUT_A4) || (pLayerCfg->InputColorMode == DMA2D_INPUT_A8)) + { + WRITE_REG(hdma2d->Instance->BGCOLR, pLayerCfg->InputAlpha & (DMA2D_BGCOLR_BLUE|DMA2D_BGCOLR_GREEN|DMA2D_BGCOLR_RED)); + } + } + /* Configure the foreground DMA2D layer */ + else + { + #if 0 + if(pLayerCfg->InputColorMode == DMA2D_INPUT_YCBCR) + { + regValue |= (pLayerCfg->ChromaSubSampling << DMA2D_POSITION_FGPFCCR_CSS); + regMask |= DMA2D_FGPFCCR_CSS; + } + #endif + + /* Write DMA2D FGPFCCR register */ + MODIFY_REG(hdma2d->Instance->FGPFCCR, regMask, regValue); + + /* DMA2D FGOR register configuration -------------------------------------*/ + WRITE_REG(hdma2d->Instance->FGOR, pLayerCfg->InputOffset); + + /* DMA2D FGCOLR register configuration -------------------------------------*/ + if ((pLayerCfg->InputColorMode == DMA2D_INPUT_A4) || (pLayerCfg->InputColorMode == DMA2D_INPUT_A8)) + { + WRITE_REG(hdma2d->Instance->FGCOLR, pLayerCfg->InputAlpha & (DMA2D_FGCOLR_BLUE|DMA2D_FGCOLR_GREEN|DMA2D_FGCOLR_RED)); + } + } + /* Initialize the DMA2D state*/ + hdma2d->State = HAL_DMA2D_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_OK; +} + +/** + * @brief Configure the DMA2D CLUT Transfer. + * @param hdma2d: Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param CLUTCfg: Pointer to a DMA2D_CLUTCfgTypeDef structure that contains + * the configuration information for the color look up table. + * @param LayerIdx: DMA2D Layer index. + * This parameter can be one of the following values: + * 0(background) / 1(foreground) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_ConfigCLUT(DMA2D_HandleTypeDef *hdma2d, DMA2D_CLUTCfgTypeDef CLUTCfg, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_DMA2D_LAYER(LayerIdx)); + assert_param(IS_DMA2D_CLUT_CM(CLUTCfg.CLUTColorMode)); + assert_param(IS_DMA2D_CLUT_SIZE(CLUTCfg.Size)); + + /* Process locked */ + __HAL_LOCK(hdma2d); + + /* Change DMA2D peripheral state */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + /* Configure the CLUT of the background DMA2D layer */ + if(LayerIdx == 0) + { + /* Write background CLUT memory address */ + WRITE_REG(hdma2d->Instance->BGCMAR, (uint32_t)CLUTCfg.pCLUT); + + /* Write background CLUT size and CLUT color mode */ + MODIFY_REG(hdma2d->Instance->BGPFCCR, (DMA2D_BGPFCCR_CS | DMA2D_BGPFCCR_CCM), + ((CLUTCfg.Size << DMA2D_POSITION_BGPFCCR_CS) | (CLUTCfg.CLUTColorMode << DMA2D_POSITION_BGPFCCR_CCM))); + } + /* Configure the CLUT of the foreground DMA2D layer */ + else + { + /* Write foreground CLUT memory address */ + WRITE_REG(hdma2d->Instance->FGCMAR, (uint32_t)CLUTCfg.pCLUT); + + /* Write foreground CLUT size and CLUT color mode */ + MODIFY_REG(hdma2d->Instance->FGPFCCR, (DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM), + ((CLUTCfg.Size << DMA2D_POSITION_BGPFCCR_CS) | (CLUTCfg.CLUTColorMode << DMA2D_POSITION_FGPFCCR_CCM))); + } + + /* Set the DMA2D state to Ready*/ + hdma2d->State = HAL_DMA2D_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_OK; +} + + +/** + * @brief Configure the line watermark. + * @param hdma2d: Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @param Line: Line Watermark configuration (maximum 16-bit long value expected). + * @note HAL_DMA2D_ProgramLineEvent() API enables the transfer watermark interrupt. + * @note The transfer watermark interrupt is disabled once it has occurred. + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_DMA2D_ProgramLineEvent(DMA2D_HandleTypeDef *hdma2d, uint32_t Line) +{ + /* Check the parameters */ + assert_param(IS_DMA2D_LINEWATERMARK(Line)); + + /* Process locked */ + __HAL_LOCK(hdma2d); + + /* Change DMA2D peripheral state */ + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + /* Sets the Line watermark configuration */ + WRITE_REG(hdma2d->Instance->LWR, Line); + + /* Enable the Line interrupt */ + __HAL_DMA2D_ENABLE_IT(hdma2d, DMA2D_IT_TW); + + /* Initialize the DMA2D state*/ + hdma2d->State = HAL_DMA2D_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_OK; +} + +/** + * @brief Enable DMA2D dead time feature. + * @param hdma2d: DMA2D handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_EnableDeadTime(DMA2D_HandleTypeDef *hdma2d) +{ + /* Process Locked */ + __HAL_LOCK(hdma2d); + + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + /* Set DMA2D_AMTCR EN bit */ + SET_BIT(hdma2d->Instance->AMTCR, DMA2D_AMTCR_EN); + + hdma2d->State = HAL_DMA2D_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_OK; +} + +/** + * @brief Disable DMA2D dead time feature. + * @param hdma2d: DMA2D handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_DisableDeadTime(DMA2D_HandleTypeDef *hdma2d) +{ + /* Process Locked */ + __HAL_LOCK(hdma2d); + + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + /* Clear DMA2D_AMTCR EN bit */ + CLEAR_BIT(hdma2d->Instance->AMTCR, DMA2D_AMTCR_EN); + + hdma2d->State = HAL_DMA2D_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_OK; +} + +/** + * @brief Configure dead time. + * @note The dead time value represents the guaranteed minimum number of cycles between + * two consecutive transactions on the AHB bus. + * @param hdma2d: DMA2D handle. + * @param DeadTime: dead time value. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA2D_ConfigDeadTime(DMA2D_HandleTypeDef *hdma2d, uint8_t DeadTime) +{ + /* Process Locked */ + __HAL_LOCK(hdma2d); + + hdma2d->State = HAL_DMA2D_STATE_BUSY; + + /* Set DMA2D_AMTCR DT field */ + MODIFY_REG(hdma2d->Instance->AMTCR, DMA2D_AMTCR_DT, (((uint32_t) DeadTime) << DMA2D_POSITION_AMTCR_DT)); + + hdma2d->State = HAL_DMA2D_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma2d); + + return HAL_OK; +} + +/** + * @} + */ + + +/** @defgroup DMA2D_Exported_Functions_Group4 Peripheral State and Error functions + * @brief Peripheral State functions + * +@verbatim + =============================================================================== + ##### Peripheral State and Errors functions ##### + =============================================================================== + [..] + This subsection provides functions allowing to : + (+) Get the DMA2D state + (+) Get the DMA2D error code + +@endverbatim + * @{ + */ + +/** + * @brief Return the DMA2D state + * @param hdma2d: pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the DMA2D. + * @retval HAL state + */ +HAL_DMA2D_StateTypeDef HAL_DMA2D_GetState(DMA2D_HandleTypeDef *hdma2d) +{ + return hdma2d->State; +} + +/** + * @brief Return the DMA2D error code + * @param hdma2d : pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for DMA2D. + * @retval DMA2D Error Code + */ +uint32_t HAL_DMA2D_GetError(DMA2D_HandleTypeDef *hdma2d) +{ + return hdma2d->ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + + +/** @defgroup DMA2D_Private_Functions DMA2D Private Functions + * @{ + */ + +/** + * @brief Set the DMA2D transfer parameters. + * @param hdma2d: Pointer to a DMA2D_HandleTypeDef structure that contains + * the configuration information for the specified DMA2D. + * @param pdata: The source memory Buffer address + * @param DstAddress: The destination memory Buffer address + * @param Width: The width of data to be transferred from source to destination. + * @param Height: The height of data to be transferred from source to destination. + * @retval HAL status + */ +static void DMA2D_SetConfig(DMA2D_HandleTypeDef *hdma2d, uint32_t pdata, uint32_t DstAddress, uint32_t Width, uint32_t Height) +{ + uint32_t tmp = 0; + uint32_t tmp1 = 0; + uint32_t tmp2 = 0; + uint32_t tmp3 = 0; + uint32_t tmp4 = 0; + + /* Configure DMA2D data size */ + MODIFY_REG(hdma2d->Instance->NLR, (DMA2D_NLR_NL|DMA2D_NLR_PL), (Height| (Width << DMA2D_POSITION_NLR_PL))); + + /* Configure DMA2D destination address */ + WRITE_REG(hdma2d->Instance->OMAR, DstAddress); + + /* Register to memory DMA2D mode selected */ + if (hdma2d->Init.Mode == DMA2D_R2M) + { + tmp1 = pdata & DMA2D_OCOLR_ALPHA_1; + tmp2 = pdata & DMA2D_OCOLR_RED_1; + tmp3 = pdata & DMA2D_OCOLR_GREEN_1; + tmp4 = pdata & DMA2D_OCOLR_BLUE_1; + + /* Prepare the value to be written to the OCOLR register according to the color mode */ + if (hdma2d->Init.ColorMode == DMA2D_OUTPUT_ARGB8888) + { + tmp = (tmp3 | tmp2 | tmp1| tmp4); + } + else if (hdma2d->Init.ColorMode == DMA2D_OUTPUT_RGB888) + { + tmp = (tmp3 | tmp2 | tmp4); + } + else if (hdma2d->Init.ColorMode == DMA2D_OUTPUT_RGB565) + { + tmp2 = (tmp2 >> 19); + tmp3 = (tmp3 >> 10); + tmp4 = (tmp4 >> 3 ); + tmp = ((tmp3 << 5) | (tmp2 << 11) | tmp4); + } + else if (hdma2d->Init.ColorMode == DMA2D_OUTPUT_ARGB1555) + { + tmp1 = (tmp1 >> 31); + tmp2 = (tmp2 >> 19); + tmp3 = (tmp3 >> 11); + tmp4 = (tmp4 >> 3 ); + tmp = ((tmp3 << 5) | (tmp2 << 10) | (tmp1 << 15) | tmp4); + } + else /* Dhdma2d->Init.ColorMode = DMA2D_OUTPUT_ARGB4444 */ + { + tmp1 = (tmp1 >> 28); + tmp2 = (tmp2 >> 20); + tmp3 = (tmp3 >> 12); + tmp4 = (tmp4 >> 4 ); + tmp = ((tmp3 << 4) | (tmp2 << 8) | (tmp1 << 12) | tmp4); + } + /* Write to DMA2D OCOLR register */ + WRITE_REG(hdma2d->Instance->OCOLR, tmp); + } + else /* M2M, M2M_PFC or M2M_Blending DMA2D Mode */ + { + /* Configure DMA2D source address */ + WRITE_REG(hdma2d->Instance->FGMAR, pdata); + } +} + +/** + * @} + */ +#endif /* HAL_DMA2D_MODULE_ENABLED */ + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dwt.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dwt.c new file mode 100644 index 0000000000..4fbaf2e7e6 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dwt.c @@ -0,0 +1,69 @@ +/****************************************************************************** +*@file : hal_dwt.c +*@brief : DataWatchpoint andTrace +******************************************************************************/ + +#include "hal_dwt.h" + +#ifdef HAL_DWT_MODULE_ENABLED + +uint32_t HAL_DWT_clkPerUs, HAL_DWT_clkPerMs; + + +void HAL_DWT_Init(void) +{ + CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;//ʹDWT裬ں˵ԼĴDEM_CRλ24ƣд1ʹ + DWT->CYCCNT = 0; //ʹCYCCNTĴ֮ǰ0 + DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;//ʹCYCCNTĴDWT_CTRLλ0ƣд1ʹܡ + HAL_DWT_clkPerUs = SystemCoreClock/1000000; + HAL_DWT_clkPerMs = SystemCoreClock/1000; +} + + + +uint32_t HAL_DWT_GetClkDelay(uint32_t startClkTick) +{ + return (DWT->CYCCNT - startClkTick); +} + +uint32_t HAL_DWT_GetUsDelay(uint32_t startClkTick) +{ + return (DWT->CYCCNT - startClkTick)/HAL_DWT_clkPerUs; +} + +uint32_t HAL_DWT_GetMsDelay(uint32_t startClkTick) +{ + return (DWT->CYCCNT - startClkTick)/HAL_DWT_clkPerMs; +} + + +void HAL_DWT_DelayClks(uint32_t clks) +{ + uint32_t startClkTick; + + startClkTick = DWT->CYCCNT; + while(DWT->CYCCNT - startClkTick < clks); +} + +void HAL_DWT_DelayUs(uint32_t us) +{ + uint32_t clks,startClkTick; + + startClkTick = DWT->CYCCNT; + clks = HAL_DWT_clkPerUs*us; + while(DWT->CYCCNT - startClkTick < clks); +} + +void HAL_DWT_DelayMs(uint32_t ms) +{ + while(ms--) + { + HAL_DWT_DelayClks(HAL_DWT_clkPerMs); + } +} + +#endif + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_efuse.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_efuse.c new file mode 100644 index 0000000000..1379ef86a3 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_efuse.c @@ -0,0 +1,441 @@ +/****************************************************************************** +*@file : hal_efuse.c +*@brief : EFUSE HAL module driver. +******************************************************************************/ + +#include "hal.h" + +#ifdef HAL_EFUSE_MODULE_ENABLED + +/****************************************************************************** +*@brief : Initializes the EFUSEx peripheral according to the specified parameters +* in the EFUSE_Init. +*@param : EFUSEx: where x can be (A..F) to select the EFUSE peripheral. +*@param : EFUSE_Init: pointer to an EFUSE_InitTypeDef structure that contains +* the configuration information for the specified EFUSE peripheral. +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_EFUSE_Init(EFUSE_TypeDef *EFUSEx) +{ + + /* Check the parameters */ + assert_param(IS_EFUSE_ALL_INSTANCE(EFUSEx)); + + if(EFUSEx == EFUSE1) + { + __HAL_RCC_EFUSE1_CLK_ENABLE(); + + } + else if(EFUSEx == EFUSE2) + { + __HAL_RCC_EFUSE2_CLK_ENABLE(); + + } + if ((RCC->RCHCR & (RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) != (RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) + return HAL_ERROR; + + HAL_EFUSE_PowerUpSpTimeCfg(EFUSEx,11*EFUSE_1US_TIMES); + HAL_EFUSE_PowerDownHdCfg(EFUSEx,2*EFUSE_1US_TIMES); + HAL_EFUSE_ProWaitTimeCfg(EFUSEx,2*EFUSE_1US_TIMES); + HAL_EFUSE_ProTimeCfg(EFUSEx,4*EFUSE_1US_TIMES); + //wtim:4*4+3*2+1+11=34us(0x55),ʵ36us + //pt*bit+pw*(bit-1)+st+pu + + return HAL_OK; +} + +/****************************************************************************** +*@brief : De-initializes the EFUSEx peripheral registers to their default reset values. +*@param : EFUSEx: where x can be (A..F) to select the EFUSE peripheral. +*@param : EFUSE_Pin: specifies the port bit to be written. +*@return: None +******************************************************************************/ +void HAL_EFUSE_DeInit(EFUSE_TypeDef *EFUSEx) +{ + + /* Check the parameters */ + assert_param(IS_EFUSE_ALL_INSTANCE(EFUSEx)); + + if(EFUSEx == EFUSE1) + { + __HAL_RCC_EFUSE1_RESET(); + __HAL_RCC_EFUSE1_CLK_DISABLE(); + } + else if(EFUSEx == EFUSE2) + { + __HAL_RCC_EFUSE2_RESET(); + __HAL_RCC_EFUSE2_CLK_DISABLE(); + } + +} + +/****************************************************************************** +*@brief : Write data(in byte) of byteaddr. +*@param : EFUSEx: where x can be (1..2) to select the EFUSE peripheral. +*@param : byteaddr: specifies the byteaddr to be write. +*@param : data: specifies the data written to byteaddr. +*@param : timeout: specifies the time wait for write byte to complete +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_EFUSE_WriteByte(EFUSE_TypeDef *EFUSEx,uint16_t byteaddr,uint8_t data,uint32_t timeout) +{ + + /* Check the parameters */ + assert_param(IS_EFUSE_ALL_INSTANCE(EFUSEx)); + assert_param(IS_EFUSE_BYTE_ADDR(byteaddr)); + + if (RCC->RCHCR & RCC_RCHCR_RCHDIV) + return HAL_ERROR;//֧RCH 16Ƶ + + if ((RCC->RCHCR & (RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) != (RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) + return HAL_ERROR; + + while((!(EFUSEx->SR & EFUSE_SR_PREREAD_DONE)) && timeout--); + if(timeout == 0) + { + return HAL_TIMEOUT; + } + + EFUSEx->AR = byteaddr; + + EFUSEx->DWR = data; + + EFUSEx->CTRL = EFUSE_WBYTE; + + EFUSEx->CTRL |= EFUSE_CTRL_TRIG; + + while( (!(EFUSEx->SR&EFUSE_SR_UNPG)) && (!(EFUSEx->SR&EFUSE_SR_DONE)) && timeout--); + EFUSEx->CLR |=EFUSE_CLR_CDONE|EFUSE_CLR_CUNPG; + + + if(timeout == 0) + { + return HAL_TIMEOUT; + } + else + { + return HAL_OK; + } + +} +/****************************************************************************** +*@brief : Write multiple data(in byte) of byteaddr. +*@param : EFUSEx: where x can be (1..2) to select the EFUSE peripheral. +*@param : byteaddr: specifies the byteaddr to be write. +*@param : data: specifies the data written to byteaddr. +*@param : timeout: specifies the time wait for write byte to complete +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_EFUSE_WriteBytes(EFUSE_TypeDef *EFUSEx,uint16_t byteaddr,uint8_t* data,uint32_t len,uint32_t timeout) +{ + uint32_t time_byte = timeout; + + /* Check the parameters */ + assert_param(IS_EFUSE_ALL_INSTANCE(EFUSEx)); + assert_param(IS_EFUSE_BYTE_ADDR(byteaddr)); + + if (RCC->RCHCR & RCC_RCHCR_RCHDIV) + return HAL_ERROR;//֧RCH 16Ƶ + + if ((RCC->RCHCR & (RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) != (RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) + return HAL_ERROR; + + while((!(EFUSEx->SR & EFUSE_SR_PREREAD_DONE)) && timeout--); + if(timeout == 0) + { + return HAL_TIMEOUT; + } + + + EFUSEx->CTRL = EFUSE_WBYTE; + + for(uint32_t i=0; iAR = byteaddr+i; + + EFUSEx->DWR = *(data+i); + + EFUSEx->CTRL |= EFUSE_CTRL_TRIG; + + while( (!(EFUSEx->SR&EFUSE_SR_UNPG)) && (!(EFUSEx->SR&EFUSE_SR_DONE)) && time_byte--); + EFUSEx->CLR |=EFUSE_CLR_CDONE|EFUSE_CLR_CUNPG; + + if(time_byte == 0) + { + return HAL_TIMEOUT; + } + + time_byte = timeout; + } + + return HAL_OK; + +} +/****************************************************************************** +*@brief : Read data(in byte) of byteaddr. +*@param : EFUSEx: where x can be (1..2) to select the EFUSE peripheral. +*@param : byteaddr: specifies the byteaddr to be read. +*@param : data: the data read from byteaddr. +*@param : timeout: specifies the time wait for read byte to complete +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_EFUSE_ReadByte(EFUSE_TypeDef *EFUSEx,uint16_t byteaddr,uint8_t* data,uint32_t timeout) +{ + + /* Check the parameters */ + assert_param(IS_EFUSE_ALL_INSTANCE(EFUSEx)); + assert_param(IS_EFUSE_BYTE_ADDR(byteaddr)); + + while((!(EFUSEx->SR & EFUSE_SR_PREREAD_DONE)) && timeout--); + if(timeout == 0) + { + return HAL_TIMEOUT; + } + + + EFUSEx->AR = byteaddr; + + EFUSEx->CTRL = EFUSE_RBYTE; + + EFUSEx->CTRL |= EFUSE_CTRL_TRIG; + + while( (!(EFUSEx->SR&EFUSE_SR_DONE)) && timeout--); + + *data = EFUSEx->DR; + + EFUSEx->CLR |=EFUSE_CLR_CDONE; + + if(timeout == 0) + { + return HAL_TIMEOUT; + } + else + { + return HAL_OK; + } + +} + +/****************************************************************************** +*@brief : Read multiple data(in byte) of byteaddr. +*@param : EFUSEx: where x can be (1..2) to select the EFUSE peripheral. +*@param : byteaddr: specifies the byteaddr to be read. +*@param : data: the data read from byteaddr. +*@param : timeout: specifies the time wait for read byte to complete +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_EFUSE_ReadBytes(EFUSE_TypeDef *EFUSEx,uint16_t byteaddr,uint8_t* data,uint32_t len,uint32_t timeout) +{ + uint32_t time_byte = timeout; + + /* Check the parameters */ + assert_param(IS_EFUSE_ALL_INSTANCE(EFUSEx)); + assert_param(IS_EFUSE_BYTE_ADDR(byteaddr)); + + while((!(EFUSEx->SR & EFUSE_SR_PREREAD_DONE)) && timeout--); + if(timeout == 0) + { + return HAL_TIMEOUT; + } + + EFUSEx->CTRL = EFUSE_RBYTE; + + for(uint32_t i=0; iAR = byteaddr+i; + + EFUSEx->CTRL |= EFUSE_CTRL_TRIG; + + while( (!(EFUSEx->SR&EFUSE_SR_DONE)) && time_byte--); + + if(time_byte == 0) + { + return HAL_TIMEOUT; + } + + *(data+i) = EFUSEx->DR; + EFUSEx->CLR |=EFUSE_CLR_CDONE; + time_byte = timeout; + } + + return HAL_OK; + +} + +/****************************************************************************** +*@brief : Config EFUSE write protection. +*@param : EFUSEx: where x can be (1..2) to select the EFUSE peripheral. +*@return: None +******************************************************************************/ +void HAL_EFUSE_WpEnable(EFUSE_TypeDef *EFUSEx) +{ + assert_param(IS_EFUSE_ALL_INSTANCE(EFUSEx)); + EFUSEx->WP = 0xEF59A6CB; + +} + +/****************************************************************************** +*@brief : Config EFUSE read protection(0~15 byte). +*@param : EFUSEx: where x can be (1..2) to select the EFUSE peripheral. +*@return: None +******************************************************************************/ +void HAL_EFUSE_RpEnable(EFUSE_TypeDef *EFUSEx) +{ + assert_param(IS_EFUSE_ALL_INSTANCE(EFUSEx)); + EFUSEx->DSDP = 0xACF56B49; + +} + +/****************************************************************************** +*@brief : Read data from data shadow register. +*@param : EFUSEx: where x can be (1..2) to select the EFUSE peripheral. +*@param : str_addr:where x can be (0..15), specifies the first data shadow register to be read. +*@param : len: specifies the number of data shadow register to be read. +*@param : data: the data read from of data shadow register. +*@return: None +******************************************************************************/ +void HAL_EFUSE_ReadDsr(EFUSE_TypeDef *EFUSEx,uint8_t str_addr,uint8_t len,uint8_t* data) +{ + assert_param(IS_EFUSE_ALL_INSTANCE(EFUSEx)); + + if(str_addr+len >16) + return; + if(len==0) + return; + + for(uint8_t i=0; iDSR[str_addr+i])&0xff; + } + +} + +/****************************************************************************** +*@brief : Config EFUSE byte write protection. +*@param : EFUSEx: where x can be (1..2) to select the EFUSE peripheral. +*@return: None +******************************************************************************/ +void HAL_EFUSE_ByteWpEnable(EFUSE_TypeDef *EFUSEx) +{ + assert_param(IS_EFUSE_ALL_INSTANCE(EFUSEx)); + EFUSEx->BYTEWP = 0xC98E1A6D; + +} +/****************************************************************************** +*@brief : Config EFUSE Power Up Set Up Time +*@param : EFUSEx: where x can be (1..2) to select the EFUSE peripheral. +*@param : us: 1000 times Power Up Time in microsecond mode. +*@return: None +******************************************************************************/ +void HAL_EFUSE_PowerUpSpTimeCfg(EFUSE_TypeDef *EFUSEx, uint32_t us) +{ + assert_param(IS_EFUSE_ALL_INSTANCE(EFUSEx)); + assert_param(us>=1*EFUSE_1US_TIMES); + uint16_t avdd_sp; + uint32_t rch_freq,goal_freq; + rch_freq=(64000000/8); + goal_freq=(1000000*EFUSE_1US_TIMES/us); + if(rch_freq<=goal_freq) + avdd_sp=0; + else + avdd_sp=rch_freq/goal_freq-1; + MODIFY_REG(EFUSEx->PGCFG,EFUSE_PGCFG_AVDD_SP,avdd_sp<=1*EFUSE_1US_TIMES); + uint16_t avdd_hd; + uint32_t rch_freq,goal_freq; + rch_freq=(64000000/8); + goal_freq=(1000000*EFUSE_1US_TIMES/us); + if(rch_freq<=goal_freq) + avdd_hd=0; + else + avdd_hd=rch_freq/goal_freq-1; + MODIFY_REG(EFUSEx->PGCFG,EFUSE_PGCFG_AVDD_HD,avdd_hd<=1*EFUSE_1US_TIMES); + uint16_t pgwt; + uint32_t rch_freq,goal_freq; + rch_freq=(64000000/8); + goal_freq=(1000000*EFUSE_1US_TIMES/us); + if(rch_freq<=goal_freq) + pgwt=0; + else + pgwt=rch_freq/goal_freq-1; + MODIFY_REG(EFUSEx->PGCFG,EFUSE_PGCFG_PGWT,pgwt<=3*EFUSE_1US_TIMES && us<=5*EFUSE_1US_TIMES); + uint16_t pgt; + uint32_t rch_freq,goal_freq; + rch_freq=(64000000/8); + goal_freq=(1000000*EFUSE_1US_TIMES/us); + if(rch_freq<=goal_freq) + pgt=0; + else + pgt=rch_freq/goal_freq-1; + MODIFY_REG(EFUSEx->PGCFG,EFUSE_PGCFG_PGT,pgt<SR & flag) + return SET; + else + return RESET; + +} +/****************************************************************************** +*@brief : Clear state of flag in EFUSE SR register +*@param : EFUSEx: where x can be (1..2) to select the EFUSE peripheral. +*@param : flag: EFUSE_UNPG_FLAG/EFUSE_DONE_FLAG +*@return: None +******************************************************************************/ +void HAL_EFUSE_ClrState(EFUSE_TypeDef *EFUSEx, uint32_t flag) +{ + assert_param(IS_EFUSE_ALL_INSTANCE(EFUSEx)); + assert_param(IS_EFUSE_CLR_FLAG(flag)); + EFUSEx->CLR = flag; + +} +#endif /* HAL_EFUSE_MODULE_ENABLED */ + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_eth.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_eth.c new file mode 100644 index 0000000000..a1d5283b8d --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_eth.c @@ -0,0 +1,4663 @@ +/****************************************************************************** +*@file : hal_eth.c +*@brief : ETH HAL module driver. +******************************************************************************/ +#include "math.h" +#include "hal.h" + +#ifdef HAL_ETH_MODULE_ENABLED + +static HAL_StatusTypeDef HAL_ETH_DMATxDescListInit(ETH_HandleTypeDef *heth); +static HAL_StatusTypeDef HAL_ETH_DMARxDescListInit(ETH_HandleTypeDef *heth); + +HAL_StatusTypeDef HAL_ETH_TestDelay(void); +HAL_StatusTypeDef HAL_ETH_Init(ETH_HandleTypeDef *heth) +{ + uint32_t tempreg; + uint32_t timeout; + + assert_param(heth); + + if (heth->State == HAL_ETH_STATE_RESET) + { + HAL_ETH_MspInit(heth); + } + + heth->State = HAL_ETH_STATE_BUSY; + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + + // Mediaӿѡ + if (heth->Init.MediaInterface == ETH_MEDIA_INTERFACE_MII) + SYSCFG->SYSCR &= ~SYSCFG_SYSCR_EPIS; + else if (heth->Init.MediaInterface == ETH_MEDIA_INTERFACE_RMII) + SYSCFG->SYSCR = (SYSCFG->SYSCR & ~SYSCFG_SYSCR_EPIS) | SYSCFG_SYSCR_EPIS_2; + else + return HAL_ERROR; + + SET_BIT(heth->Instance->DMABMR, ETH_DMABMR_SWR); + timeout = ETH_TIMEOUT_SWRESET; + while (READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_SWR) != (uint32_t)RESET) + { + if(--timeout == 0) + { + heth->ErrorCode = HAL_ETH_ERROR_TIMEOUT; + heth->State= HAL_ETH_STATE_ERROR; + return HAL_ERROR; + } + } + + HAL_ETH_RxClockDelayConfig(heth, heth->Init.Delay.Uint, heth->Init.Delay.Len); + + if (HAL_ETH_SetMACAddrConfig(heth) != HAL_OK) + return HAL_ERROR; + if (HAL_ETH_SetSpeedConfig(heth) != HAL_OK) + return HAL_ERROR; + if (HAL_ETH_SetDuplexModeConfig(heth) != HAL_OK) + return HAL_ERROR; + + // SMIʱ + if (HAL_ETH_ConfigSMI(heth) != HAL_OK) + return HAL_ERROR; + + if (HAL_ETH_SetMACConfig(heth) != HAL_OK) + return HAL_ERROR; + if (HAL_ETH_SetDMAConfig(heth) != HAL_OK) + return HAL_ERROR; + if (HAL_ETH_SetAddrFilterConfig(heth) != HAL_OK) + return HAL_ERROR; + if (HAL_ETH_SetVLANFilterConfig(heth) != HAL_OK) + return HAL_ERROR; + if (HAL_ETH_SetL3L4FilterConfig(heth) != HAL_OK) + return HAL_ERROR; + if (HAL_ETH_SetMMCConfig(heth) != HAL_OK) + return HAL_ERROR; + if (HAL_ETH_SetPMTConfig(heth) != HAL_OK) + return HAL_ERROR; + if (HAL_ETH_SetPTPConfig(heth) != HAL_OK) + return HAL_ERROR; + + /* Set Receive Buffs Len (must be a multiple of 4) */ + if ((heth->Init.RxBuffLen % 0x4U) != 0x0U) + { + heth->ErrorCode = HAL_ETH_ERROR_PARAM; + heth->State = HAL_ETH_STATE_ERROR; + return HAL_ERROR; + } + + if (HAL_ETH_DMATxDescListInit(heth) != HAL_OK) + return HAL_ERROR; + if (HAL_ETH_DMARxDescListInit(heth) != HAL_OK) + return HAL_ERROR; + + heth->ErrorCode = HAL_ETH_ERROR_NONE; + heth->State = HAL_ETH_STATE_READY; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_DeInit(ETH_HandleTypeDef *heth) +{ + heth->State = HAL_ETH_STATE_BUSY; + + HAL_ETH_MspDeInit(heth); + + heth->State= HAL_ETH_STATE_RESET; + + return HAL_OK; +} + +__attribute__((weak)) void HAL_ETH_MspInit(ETH_HandleTypeDef *heth) +{ +} + +__attribute__((weak)) void HAL_ETH_MspDeInit(ETH_HandleTypeDef *heth) +{ +} + + + +HAL_StatusTypeDef HAL_ETH_InitDefaultParamter(ETH_HandleTypeDef *heth) +{ + memset((void *)heth, 0, sizeof(ETH_HandleTypeDef)); + + heth->Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII; + heth->Init.AutoNegotiation = ENABLE; + heth->Init.PhyAddress = 0; + + HAL_ETH_InitSpeedDefaultParamter(heth); + + HAL_ETH_InitDuplexModeDefaultParamter(heth); + + HAL_ETH_InitMACAddrDefaultParamter(heth); + + // + HAL_ETH_InitFilterDefaultParamter(heth); + + // MMC + HAL_ETH_InitMMCDefaultParamter(heth); + + // PMT + HAL_ETH_InitPMTDefaultParamter(heth); + + // PTP + HAL_ETH_InitPTPDefaultParamter(heth); + + // LPI + HAL_ETH_SetLPIDefaultConfig(heth); + + // MACĬֵ + HAL_ETH_InitMACDefaultParamter(heth); + + // DMAĬֵ + HAL_ETH_InitDMADefaultParamter(heth); + + return HAL_OK; +} + +// **************************************************************************** +// +// Speed +// +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_InitSpeedDefaultParamter(ETH_HandleTypeDef *heth) +{ + heth->Init.Speed = ETH_SPEED_100M; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_GetSpeedConfig(ETH_HandleTypeDef *heth) +{ + if ((heth->Instance)->MACCR & ETH_MACCR_FES) + heth->Init.Speed = ETH_SPEED_100M; + else + heth->Init.Speed = ETH_SPEED_10M; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetSpeedConfig(ETH_HandleTypeDef *heth) +{ + assert_param(IS_ETH_SPEED(heth->Init.Speed)); + + if (heth->Init.Speed == ETH_SPEED_100M) + (heth->Instance)->MACCR |= ETH_MACCR_FES; + else + (heth->Instance)->MACCR &= ~ETH_MACCR_FES; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetSpeedDefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitSpeedDefaultParamter(heth); + HAL_ETH_SetSpeedConfig(heth); + + return HAL_OK; +} + +// **************************************************************************** +// +// Duplex Mode +// +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_InitDuplexModeDefaultParamter(ETH_HandleTypeDef *heth) +{ + heth->Init.DuplexMode = ETH_MODE_FULL_DUPLEX; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_GetDuplexModeConfig(ETH_HandleTypeDef *heth) +{ + if ((heth->Instance)->MACCR & ETH_MACCR_DM) + heth->Init.DuplexMode = ETH_MODE_FULL_DUPLEX; + else + heth->Init.DuplexMode = ETH_MODE_HALF_DUPLEX; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetDuplexModeConfig(ETH_HandleTypeDef *heth) +{ + assert_param(IS_ETH_SPEED(heth->Init.DuplexMode)); + + if (heth->Init.DuplexMode != ETH_MODE_HALF_DUPLEX) + (heth->Instance)->MACCR |= ETH_MACCR_DM; + else + (heth->Instance)->MACCR &= ~ETH_MACCR_DM; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetDuplexModeDefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitDuplexModeDefaultParamter(heth); + HAL_ETH_SetDuplexModeConfig(heth); + + return HAL_OK; +} + + +// **************************************************************************** +// +// MAC Address +// +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_InitMACAddrDefaultParamter(ETH_HandleTypeDef *heth) +{ + memset((void *)heth->Init.MACAddr, 0xffu, 6); + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_GetMACAddrConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + tmpreg = (heth->Instance)->MACA0HR; + heth->Init.MACAddr[5] = (tmpreg >> 8) & 0xffu; + heth->Init.MACAddr[4] = (tmpreg >> 0) & 0xffu; + + tmpreg = (heth->Instance)->MACA0LR; + heth->Init.MACAddr[3] = (tmpreg >> 24) & 0xffu; + heth->Init.MACAddr[2] = (tmpreg >> 16) & 0xffu; + heth->Init.MACAddr[1] = (tmpreg >> 8) & 0xffu; + heth->Init.MACAddr[0] = (tmpreg >> 0) & 0xffu; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetMACAddrConfig(ETH_HandleTypeDef *heth) +{ + (heth->Instance)->MACA0HR = ETH_MACA0HR_AE | \ + ((uint32_t)heth->Init.MACAddr[5] << 8) | \ + ((uint32_t)heth->Init.MACAddr[4] << 0); + + // MACA1LR + (heth->Instance)->MACA0LR = ((uint32_t)heth->Init.MACAddr[3] << 24) | \ + ((uint32_t)heth->Init.MACAddr[2] << 16) | \ + ((uint32_t)heth->Init.MACAddr[1] << 8) | \ + ((uint32_t)heth->Init.MACAddr[0] << 0); + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetMACAddrDefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitMACAddrDefaultParamter(heth); + HAL_ETH_SetMACAddrConfig(heth); + + return HAL_OK; +} + + +// **************************************************************************** +// +// Interrupt +// +// **************************************************************************** + +#include "main.h" +__attribute__((weak)) void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth) +{ + (void)(heth); +} + +__attribute__((weak)) void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth) +{ + (void)(heth); +} + +__attribute__((weak)) void HAL_ETH_DMAErrorCallback(ETH_HandleTypeDef *heth) +{ + (void)(heth); +} + +__attribute__((weak)) void HAL_ETH_MMCCallback(ETH_HandleTypeDef *heth) +{ + (void)(heth); +} + +__attribute__((weak)) void HAL_ETH_PMTCallback(ETH_HandleTypeDef *heth) +{ + (void)(heth); +} + +__attribute__((weak)) void HAL_ETH_LPISendEntryCallback(ETH_HandleTypeDef *heth) +{ + (void)(heth); +} + +__attribute__((weak)) void HAL_ETH_LPISendExitCallback(ETH_HandleTypeDef *heth) +{ + (void)(heth); +} + +__attribute__((weak)) void HAL_ETH_LPIRecvEntryCallback(ETH_HandleTypeDef *heth) +{ + (void)(heth); +} + +__attribute__((weak)) void HAL_ETH_LPIRecvExitCallback(ETH_HandleTypeDef *heth) +{ + (void)(heth); +} + +__attribute__((weak)) void HAL_ETH_WakeupCallback(ETH_HandleTypeDef *heth) +{ + (void)(heth); +} + +void HAL_ETH_IRQHandler(ETH_HandleTypeDef *heth) +{ + volatile uint32_t temp; + + /* Frame received */ + if (ETH->DMASR & ETH_DMASR_RS) + { + if (ETH->DMAIER & ETH_DMAIER_RIE) + { + HAL_ETH_RxCpltCallback(heth); + + ETH->DMASR = ETH_DMASR_RS | ETH_DMASR_NIS; + return; + } + } + + /* Frame transmitted */ + if (ETH->DMASR & ETH_DMASR_TS) + { + if (ETH->DMAIER & ETH_DMAIER_TIE) + { + HAL_ETH_TxCpltCallback(heth); + + ETH->DMASR = ETH_DMASR_TS | ETH_DMASR_NIS; + return; + } + } + + /* ETH DMA Error */ + if(__HAL_ETH_DMA_GET_FLAG(heth, ETH_DMASR_AIS)) + { + if (__HAL_ETH_DMA_GET_IT(heth, ETH_DMAIER_AISE)) + { + heth->ErrorCode |= HAL_ETH_ERROR_DMA; + + if (__HAL_ETH_DMA_GET_FLAG(heth, ETH_DMASR_FBES)) + { + heth->DMAErrorCode = READ_BIT(heth->Instance->DMASR, (ETH_DMASR_FBES | ETH_DMASR_RPSS | ETH_DMASR_TPSS)); + + __HAL_ETH_DMA_DISABLE_IT(heth, ETH_DMAIER_NISE | ETH_DMAIER_AISE); + + __HAL_ETH_DMA_CLEAR_FLAG(heth, ETH_DMASR_FBES | ETH_DMASR_RPSS | ETH_DMASR_TPSS | ETH_DMASR_AIS); + + heth->State = HAL_ETH_STATE_ERROR; + } + else + { + + heth->DMAErrorCode = READ_BIT(heth->Instance->DMASR, ( ETH_DMASR_ETS | ETH_DMASR_RWTS | ETH_DMASR_RBUS | \ + ETH_DMASR_TUS | ETH_DMASR_ROS | ETH_DMASR_TJTS)); + + __HAL_ETH_DMA_CLEAR_FLAG(heth, ETH_DMASR_ETS | ETH_DMASR_RWTS | ETH_DMASR_RBUS | ETH_DMASR_TUS | \ + ETH_DMASR_ROS | ETH_DMASR_TJTS | ETH_DMASR_AIS); + } + + HAL_ETH_DMAErrorCallback(heth); + } + } + #ifdef ETH_PMT_SUPPORT + if (READ_BIT(heth->Instance->MACISR, ETH_MACISR_PMTS)) + { + if (READ_BIT(heth->Instance->MACIMR, ETH_MACIMR_PIM) == 0) + { + temp = (heth->Instance)->MACPMTCSR; + } + } + #endif + #ifdef ETH_MMC_SUPPORT + if (READ_BIT(heth->Instance->MMCTIR, ETH_MMCTIR_TGFIS)) + { + if (READ_BIT(heth->Instance->MMCTIMR, ETH_MMCTIMR_TGFIM) == 0) + { + heth->MMCCounter.TxGoodFrame = (heth->Instance)->MMCTGFCR; + } + } + if (READ_BIT(heth->Instance->MMCRIR, ETH_MMCRIR_RGUFIS)) + { + if (READ_BIT(heth->Instance->MMCRIMR, ETH_MMCRIMR_RGUFIM) == 0) + { + heth->MMCCounter.RxGoodUnicast = (heth->Instance)->MMCRGUFCR; + } + } + #endif + #ifdef ETH_LPI_SUPPORT + if (READ_BIT(heth->Instance->DMASR, ETH_DMASR_LPIS)) + { + temp = heth->Instance->MACLPICSR; + if (temp & ETH_MACLPICSR_TLPIEN) + { + HAL_ETH_LPISendEntryCallback(heth); + } + if (temp & ETH_MACLPICSR_TLPIEX) + { + HAL_ETH_LPISendExitCallback(heth); + } + if (temp & ETH_MACLPICSR_RLPIEN) + { + HAL_ETH_LPIRecvEntryCallback(heth); + } + if (temp & ETH_MACLPICSR_RLPIEX) + { + HAL_ETH_LPIRecvExitCallback(heth); + } + } + #endif + +} + +void HAL_ETH_WakeupIRQHandler(ETH_HandleTypeDef *heth) +{ + volatile uint32_t temp; + + temp = (heth->Instance)->MACPMTCSR; + + /* Enable the DMA reception */ + (heth->Instance)->DMAOMR |= ETH_DMAOMR_SR; + /* Enable the DMA transmission */ + (heth->Instance)->DMAOMR |= ETH_DMAOMR_ST; + /* Enable the MAC transmission */ + (heth->Instance)->MACCR |= ETH_MACCR_TE; + + HAL_ETH_WakeupCallback(heth); +} + +// **************************************************************************** +// +// data transmission +// +// **************************************************************************** + +//ʼ +static HAL_StatusTypeDef HAL_ETH_DMATxDescListInit(ETH_HandleTypeDef *heth) +{ + uint32_t i; + uint32_t buff; + ETH_DMADescTypeDef *tx_desc; + + if (heth->Init.TxDescNbr == 0) + return HAL_ERROR; + + if (heth->Init.TxBuffNbr != 0) + { + if (heth->Init.TxDescListMode == ETH_DESC_LIST_MODE_RING) + { + if (heth->Init.TxBuffNbr < (heth->Init.TxDescNbr << 1)) + return HAL_ERROR; + } + else + { + if (heth->Init.TxBuffNbr < heth->Init.TxDescNbr) + return HAL_ERROR; + } + } + + buff = (uint32_t)heth->Init.TxBuff; + + /* Fill each DMATxDesc descriptor with the right values */ + for(i=0; iInit.TxDescNbr; i++) + { + tx_desc = heth->Init.TxDesc + i; + + WRITE_REG(tx_desc->DESC0, 0); + WRITE_REG(tx_desc->DESC1, 0); + WRITE_REG(tx_desc->DESC2, 0); + WRITE_REG(tx_desc->DESC3, 0); + WRITE_REG(tx_desc->DESC4, 0); + WRITE_REG(tx_desc->DESC5, 0); + WRITE_REG(tx_desc->DESC6, 0); + WRITE_REG(tx_desc->DESC7, 0); + WRITE_REG(tx_desc->Buff1, 0); + WRITE_REG(tx_desc->Buff2, 0); + + if (heth->Init.TxDescListMode == ETH_DESC_LIST_MODE_RING) + { + if (i == (heth->Init.TxDescNbr - 1)) + SET_BIT(tx_desc->DESC0, ETH_DMA_TX_DESC0_TER); + + if (heth->Init.TxBuffNbr != 0) + { + WRITE_REG(tx_desc->Buff1, buff + (heth->Init.TxBuffLen * (i << 1))); + WRITE_REG(tx_desc->Buff2, buff + (heth->Init.TxBuffLen * ((i << 1) + 1))); + } + + if ((heth->Init.TxBuffTab != 0) && (heth->Init.TxBuffNodeNbr != 0)) + { + heth->Init.TxBuffTab[(i << 1) + 0].Buff = (uint8_t *)tx_desc->Buff1; + heth->Init.TxBuffTab[(i << 1) + 0].Len = 0; + heth->Init.TxBuffTab[(i << 1) + 0].next = 0; + heth->Init.TxBuffTab[(i << 1) + 1].Buff = (uint8_t *)tx_desc->Buff2; + heth->Init.TxBuffTab[(i << 1) + 1].Len = 0; + heth->Init.TxBuffTab[(i << 1) + 1].next = 0; + } + } + else + { + SET_BIT(tx_desc->DESC0, ETH_DMA_TX_DESC0_TCH); + + // next desc + if (i == (heth->Init.TxDescNbr - 1)) + WRITE_REG(tx_desc->DESC3, (uint32_t)heth->Init.TxDesc); + else + WRITE_REG(tx_desc->DESC3, (uint32_t)(tx_desc + 1)); + + if (heth->Init.TxBuffNbr != 0) + WRITE_REG(tx_desc->Buff1, buff + (heth->Init.TxBuffLen * i)); + + WRITE_REG(tx_desc->Buff2, tx_desc->DESC3); + + if ((heth->Init.TxBuffTab != 0) && (heth->Init.TxBuffNodeNbr != 0)) + { + heth->Init.TxBuffTab[i].Buff = (uint8_t *)tx_desc->Buff1; + heth->Init.TxBuffTab[i].Len = 0; + heth->Init.TxBuffTab[i].next = 0; + } + } + } + + heth->TxDescList.TxDescTab = heth->Init.TxDesc; + heth->TxDescList.CurTxDesc = 0; + + /* Set Transmit Descriptor List Address Register */ + (heth->Instance)->DMATDLAR = (uint32_t)heth->Init.TxDesc; + + return HAL_OK; +} + +//ʼ +static HAL_StatusTypeDef HAL_ETH_DMARxDescListInit(ETH_HandleTypeDef *heth) +{ + uint32_t i; + uint32_t buff_addr; + ETH_DMADescTypeDef *rx_desc; + + if ((heth->Init.RxDescNbr == 0) || (heth->Init.RxBuffTab == 0)) + return HAL_ERROR; + + if (heth->Init.RxDescListMode == ETH_DESC_LIST_MODE_RING) + { + if (heth->Init.RxBuffNbr < (heth->Init.RxDescNbr << 1)) + return HAL_ERROR; + if (heth->Init.RxBuffNodeNbr < (heth->Init.RxDescNbr << 1)) + return HAL_ERROR; + } + else + { + if (heth->Init.RxBuffNbr < heth->Init.RxDescNbr) + return HAL_ERROR; + if (heth->Init.RxBuffNodeNbr < heth->Init.RxDescNbr) + return HAL_ERROR; + } + + buff_addr = (uint32_t)heth->Init.RxBuff; + + /* Fill each DMARxDesc descriptor with the right values */ + for(i=0; iInit.RxDescNbr; i++) + { + rx_desc = heth->Init.RxDesc + i; + + WRITE_REG(rx_desc->DESC0, 0); + WRITE_REG(rx_desc->DESC1, 0); + WRITE_REG(rx_desc->DESC2, 0); + WRITE_REG(rx_desc->DESC3, 0); + WRITE_REG(rx_desc->DESC4, 0); + WRITE_REG(rx_desc->DESC5, 0); + WRITE_REG(rx_desc->DESC6, 0); + WRITE_REG(rx_desc->DESC7, 0); + WRITE_REG(rx_desc->Buff1, 0); + WRITE_REG(rx_desc->Buff2, 0); + + if (heth->Int.Rx == DISABLE) + SET_BIT(rx_desc->DESC0, ETH_DMA_RX_DESC1_DIC); + + if (heth->Init.RxDescListMode == ETH_DESC_LIST_MODE_RING) + { + if (i == (heth->Init.RxDescNbr - 1)) + SET_BIT(rx_desc->DESC1, ETH_DMA_RX_DESC1_RER); + + // buff len + MODIFY_REG(rx_desc->DESC1, ETH_DMA_RX_DESC1_RBS1, (heth->Init.RxBuffLen << ETH_DMA_RX_DESC1_RBS1_Pos)); + MODIFY_REG(rx_desc->DESC1, ETH_DMA_RX_DESC1_RBS2, (heth->Init.RxBuffLen << ETH_DMA_RX_DESC1_RBS2_Pos)); + + // rx buff + WRITE_REG(rx_desc->DESC2, buff_addr + (heth->Init.RxBuffLen * (i << 1))); + WRITE_REG(rx_desc->DESC3, buff_addr + (heth->Init.RxBuffLen * ((i << 1) + 1))); + + heth->Init.RxBuffTab[(i << 1) + 0].Buff = (uint8_t *)rx_desc->DESC2; + heth->Init.RxBuffTab[(i << 1) + 0].Len = 0; + heth->Init.RxBuffTab[(i << 1) + 0].next = 0; + heth->Init.RxBuffTab[(i << 1) + 1].Buff = (uint8_t *)rx_desc->DESC3; + heth->Init.RxBuffTab[(i << 1) + 1].Len = 0; + heth->Init.RxBuffTab[(i << 1) + 1].next = 0; + } + else + { + SET_BIT(rx_desc->DESC1, ETH_DMA_RX_DESC1_RCH); + + // next desc + if (i == (heth->Init.RxDescNbr - 1)) + WRITE_REG(rx_desc->DESC3, (uint32_t)heth->Init.RxDesc); + else + WRITE_REG(rx_desc->DESC3, (uint32_t)(rx_desc + 1)); + + // buff len + MODIFY_REG(rx_desc->DESC1, ETH_DMA_RX_DESC1_RBS1, (heth->Init.RxBuffLen << ETH_DMA_RX_DESC1_RBS1_Pos)); + + // rx buff + WRITE_REG(rx_desc->DESC2, buff_addr + (heth->Init.RxBuffLen * i)); + + heth->Init.RxBuffTab[i].Buff = (uint8_t *)rx_desc->DESC2; + heth->Init.RxBuffTab[i].Len = 0; + heth->Init.RxBuffTab[i].next = 0; + } + + WRITE_REG(rx_desc->Buff1, rx_desc->DESC2); + WRITE_REG(rx_desc->Buff2, rx_desc->DESC3); + + SET_BIT(rx_desc->DESC0, ETH_DMA_RX_DESC0_OWN); + + } + + heth->RxDescList.RxDescTab = heth->Init.RxDesc; + heth->RxDescList.CurRxDesc = 0; + heth->RxDescList.FirstRxDesc = 0; + heth->RxDescList.RxDescNbr = 0; + + /* Set Transmit Descriptor List Address Register */ + (heth->Instance)->DMARDLAR = (uint32_t)heth->Init.RxDesc; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_GetTxBuff(ETH_HandleTypeDef *heth, ETH_BuffTypeDef **buff) +{ + uint32_t i; + uint32_t index; + uint32_t tx_buff_index; + uint32_t tx_buff_next_index; + uint32_t tx_buff_first_index; + ETH_InitTypeDef *init; + ETH_BuffTypeDef *tx_buff; + ETH_TxDescListTypeDef *tx_desc_list; + ETH_DMADescTypeDef *tx_desc; + uint32_t timeout; + + if ((heth == NULL) || (buff == NULL)) + return HAL_ERROR; + + init = &heth->Init; + + tx_desc_list = (ETH_TxDescListTypeDef *)&heth->TxDescList; + index = tx_desc_list->CurTxDesc; + tx_desc = &tx_desc_list->TxDescTab[index]; + + if (init->TxDescListMode == ETH_DESC_LIST_MODE_RING) + *buff = &init->TxBuffTab[index << 1]; + else + *buff = &init->TxBuffTab[index]; + tx_buff = init->TxBuffTab; + for (i=0; iTxDescNbr; i++) + { + if (READ_BIT(tx_desc->DESC0, ETH_DMA_TX_DESC0_OWN)) + break; + + if (init->TxDescListMode == ETH_DESC_LIST_MODE_RING) + { + tx_buff_index = index << 1; + tx_buff_next_index = tx_buff_index; + if (++tx_buff_next_index >= init->TxBuffNodeNbr) + tx_buff_next_index = 0; + + tx_buff[tx_buff_index].Buff = (uint8_t *)tx_desc->Buff1; + tx_buff[tx_buff_index].Len = init->TxBuffLen; + tx_buff[tx_buff_index].next = &init->TxBuffTab[tx_buff_next_index]; + + tx_buff_index = tx_buff_next_index; + if (++tx_buff_next_index >= init->TxBuffNodeNbr) + tx_buff_next_index = 0; + + tx_buff[tx_buff_index].Buff = (uint8_t *)tx_desc->Buff1; + tx_buff[tx_buff_index].Len = init->TxBuffLen; + tx_buff[tx_buff_index].next = &init->TxBuffTab[tx_buff_next_index]; + } + else + { + tx_buff_index = index; + tx_buff_next_index = tx_buff_index; + if (++tx_buff_next_index >= init->TxBuffNodeNbr) + tx_buff_next_index = 0; + + tx_buff[tx_buff_index].Buff = (uint8_t *)tx_desc->Buff1; + tx_buff[tx_buff_index].Len = init->TxBuffLen; + tx_buff[tx_buff_index].next = &init->TxBuffTab[tx_buff_next_index]; + } + + index++; + if (index >= init->TxDescNbr) + index = 0; + tx_desc = &tx_desc_list->TxDescTab[index]; + } + if (i == 0) + *buff = 0; + else + tx_buff[tx_buff_index].next = 0; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_Transmit(ETH_HandleTypeDef *heth, ETH_BuffTypeDef *buff, uint32_t mode, ETH_TxStatusTypeDef *pStatus) +{ + uint32_t i; + uint32_t len; + uint32_t index; + uint32_t nbr; + uint32_t desc0; + ETH_InitTypeDef *init; + ETH_TxDescListTypeDef *tx_desc_list; + ETH_DMADescTypeDef *tx_desc; + ETH_TxConfigTypeDef *pTxConfig; + uint32_t timeout; + + if ((heth == NULL) || (buff == NULL) || (buff->Buff == NULL) || (buff->Len == 0)) + return HAL_ERROR; + + init = &heth->Init; + + if ((mode & ETH_TX_MODE_DATA_COPY) && (init->TxBuffNbr == 0)) + return HAL_ERROR; + + nbr = 0; + tx_desc_list = (ETH_TxDescListTypeDef *)&heth->TxDescList; + index = tx_desc_list->CurTxDesc; + tx_desc = &tx_desc_list->TxDescTab[index]; + pTxConfig = &heth->TxConfig; + + for (i=0; iTxDescNbr; i++) + { + if (READ_BIT(tx_desc->DESC0, ETH_DMA_TX_DESC0_OWN)) + return HAL_BUSY; + +// desc0 = tx_desc->DESC0 & (ETH_DMA_TX_DESC0_TER | ETH_DMA_TX_DESC0_TCH); + desc0 = 0; + if (mode & (ETH_TX_MODE_WAIT_TX_COMPLETE | ETH_TX_MODE_TIMESTAMP)) + { + SET_BIT(heth->Instance->DMAIER , ETH_DMAIER_NISE | ETH_DMAIER_TIE); + } + SET_BIT(desc0, ETH_DMA_TX_DESC0_IC); + + + MODIFY_REG(desc0, ETH_DMA_TX_DESC0_CIC, (uint32_t)pTxConfig->AutoChecksum << ETH_DMA_TX_DESC0_CIC_Pos); + + if (init->TxDescListMode != ETH_DESC_LIST_MODE_RING) + SET_BIT(desc0, ETH_DMA_TX_DESC0_TCH); + else if (index == (init->TxDescNbr - 1)) + SET_BIT(desc0, ETH_DMA_TX_DESC0_TER); + + if (nbr == 0) + { + SET_BIT(desc0, ETH_DMA_TX_DESC0_FS); + if (pTxConfig->AutoCRC == 0) + SET_BIT(desc0, ETH_DMA_TX_DESC0_DC); + if (pTxConfig->AutoPad == 0) + SET_BIT(desc0, ETH_DMA_TX_DESC0_DP); + if (mode & ETH_TX_MODE_TIMESTAMP) + SET_BIT(desc0, ETH_DMA_TX_DESC0_TTSE); + } + WRITE_REG(tx_desc->DESC0, desc0); + + // buff1 len + if (buff->Len > init->TxBuffLen) + len = init->TxBuffLen; + else + len = buff->Len; + buff->Len -= len; + WRITE_REG(tx_desc->DESC1, len << ETH_DMA_TX_DESC1_TBS1_Pos); + + // buffer 1 + if (mode & ETH_TX_MODE_DATA_COPY) + { + // copy + WRITE_REG(tx_desc->DESC2, tx_desc->Buff1); + memcpy((void *)tx_desc->DESC2, (void *)buff->Buff, len); + } + else + { + // ַcopy + WRITE_REG(tx_desc->DESC2, (uint32_t)buff->Buff); + } + buff->Buff += len; + + while (1) + { + if ((buff->Len != 0) || (buff->next == 0)) + break; + buff = buff->next; + } + + // buffer 2 + if (init->TxDescListMode == ETH_DESC_LIST_MODE_RING) + { + if (buff->Len != 0) + { + // buff2 len + if (buff->Len > init->TxBuffLen) + len = init->TxBuffLen; + else + len = buff->Len; + buff->Len -= len; + MODIFY_REG(tx_desc->DESC1, ETH_DMA_TX_DESC1_TBS2, (len << ETH_DMA_TX_DESC1_TBS2_Pos)); + + if (mode & ETH_TX_MODE_DATA_COPY) + { + // ֵcopy + WRITE_REG(tx_desc->DESC3, tx_desc->Buff2); + memcpy((void *)tx_desc->DESC3, (void *)buff->Buff, len); + } + else + { + // ַcopy + WRITE_REG(tx_desc->DESC3, (uint32_t)buff->Buff); + } + buff->Buff += len; + + while (1) + { + if ((buff->Len != 0) || (buff->next == 0)) + break; + buff = buff->next; + } + } + } + nbr++; + + if (buff->Len == 0) + break; + + index++; + if (index >= init->TxDescNbr) + index = 0; + tx_desc = &tx_desc_list->TxDescTab[index]; + } + SET_BIT(tx_desc->DESC0, ETH_DMA_TX_DESC0_LS); + + index = tx_desc_list->CurTxDesc; + tx_desc = &tx_desc_list->TxDescTab[index]; + while (nbr--) + { + SET_BIT(tx_desc->DESC0, ETH_DMA_TX_DESC0_OWN); + + index++; + if (index >= init->TxDescNbr) + index = 0; + tx_desc = &tx_desc_list->TxDescTab[index]; + } + tx_desc_list->CurTxDesc = index; + + (heth->Instance)->DMASR = ETH_DMASR_TBUS; + (heth->Instance)->DMATPDR = 0; + + // ȴ + if (mode & (ETH_TX_MODE_WAIT_TX_COMPLETE | ETH_TX_MODE_TIMESTAMP)) + { + index = tx_desc_list->CurTxDesc; + if (index == 0) + index = init->TxDescNbr - 1; + else + index--; + tx_desc = &tx_desc_list->TxDescTab[index]; + + timeout = 0xffffffff; + while (1) + { + if (READ_BIT(tx_desc->DESC0, ETH_DMA_TX_DESC0_OWN) == 0) + break; + timeout--; + if (timeout == 0) + return HAL_ERROR; + } + if (pStatus) + { + pStatus->Status0 = READ_REG(tx_desc->DESC0); + if (READ_BIT(tx_desc->DESC0, ETH_DMA_TX_DESC0_TTSS)) + { + pStatus->TimestampValid = ENABLE; + pStatus->Timestamp.sec = READ_REG(tx_desc->DESC7); + pStatus->Timestamp.nsec = (int32_t)READ_REG(tx_desc->DESC6); + } + else + { + pStatus->TimestampValid = DISABLE; + } + } + } + + return HAL_OK; +} + +/** + * @brief Checks for received Packets. + * @param heth: pointer to a ETH_HandleTypeDef structure that contains + * the configuration information for ETHERNET module + * @retval 1: A Packet is received + * 0: no Packet received + */ +HAL_StatusTypeDef HAL_ETH_Receive(ETH_HandleTypeDef *heth, ETH_BuffTypeDef **buff, ETH_RxStatusTypeDef *pStatus) +{ + uint32_t i; + uint32_t first_desc_index; + uint32_t desc_nbr; + uint32_t desc_index; + uint32_t first_rx_buff_index; + uint32_t curr_rx_buff_index; + uint32_t next_rx_buff_index; + uint32_t desc0; + uint32_t packet_len; + uint32_t desc_len; + uint32_t len; + ETH_InitTypeDef *init; + ETH_BuffTypeDef *rx_buff; + ETH_DMADescTypeDef *rx_desc; + ETH_RxDescListTypeDef *rx_desc_list; + + rx_desc_list = &heth->RxDescList; + + if(rx_desc_list->RxDescNbr != 0U) + return HAL_OK; + + *buff = 0; + init = &heth->Init; + rx_buff = init->RxBuffTab; + while (1) + { + desc_index = rx_desc_list->CurRxDesc; + desc_nbr = 0; + first_desc_index = 0; + rx_desc = &rx_desc_list->RxDescTab[desc_index]; + packet_len = 0; + desc_len = 0; + len = 0; + first_rx_buff_index = 0; + + for (i=0; iRxDescNbr; i++) + { + if (READ_BIT(rx_desc->DESC0, ETH_DMA_RX_DESC0_OWN)) + { + if (desc_nbr == 0) + return HAL_OK; + break; + } + + desc0 = READ_REG(rx_desc->DESC0); + + if (READ_BIT(desc0, ETH_DMA_RX_DESC0_LS)) + { + if (READ_BIT(desc0, ETH_DMA_RX_DESC0_FS)) + { + if (desc_nbr) + break; + desc_nbr = 1; + + first_desc_index = desc_index; + packet_len = (desc0 & ETH_DMA_RX_DESC0_FL) >> ETH_DMA_RX_DESC0_FL_Pos; + + if (init->RxDescListMode == ETH_DESC_LIST_MODE_RING) + first_rx_buff_index = desc_index << 1; + else + first_rx_buff_index = desc_index; + } + else + { + desc_nbr++; + if (desc_nbr == 1) + break; + + packet_len = (desc0 & ETH_DMA_RX_DESC0_FL) >> ETH_DMA_RX_DESC0_FL_Pos; + if (packet_len < len) + break; + packet_len -= len; + } + + if (init->RxDescListMode == ETH_DESC_LIST_MODE_RING) + { + if (packet_len > (init->RxBuffLen << 1)) + break; + + first_rx_buff_index = desc_index << 1; + + if (packet_len <= init->RxBuffLen) + { + rx_buff[curr_rx_buff_index].Buff = (uint8_t *)rx_desc->Buff1; + rx_buff[curr_rx_buff_index].Len = packet_len; + rx_buff[curr_rx_buff_index].next = 0; + } + else + { + packet_len -= init->RxBuffLen; + + next_rx_buff_index = curr_rx_buff_index; + next_rx_buff_index++; + if (next_rx_buff_index >= init->RxBuffNodeNbr) + next_rx_buff_index = 0; + + rx_buff[curr_rx_buff_index].Buff = (uint8_t *)rx_desc->Buff1; + rx_buff[curr_rx_buff_index].Len = init->RxBuffLen; + rx_buff[curr_rx_buff_index].next = &rx_buff[next_rx_buff_index]; + + rx_buff[next_rx_buff_index].Buff = (uint8_t *)rx_desc->Buff2; + rx_buff[next_rx_buff_index].Len = packet_len; + rx_buff[next_rx_buff_index].next = 0; + } + } + else + { + if (packet_len > init->RxBuffLen) + break; + + rx_buff[desc_index].Buff = (uint8_t *)rx_desc->Buff1; + rx_buff[desc_index].Len = packet_len; + rx_buff[desc_index].next = 0; + } + + desc_index++; + if (desc_index >= init->RxDescNbr) + desc_index = 0; + + rx_desc_list->CurRxDesc = desc_index; + rx_desc_list->FirstRxDesc = first_desc_index; + rx_desc_list->RxDescNbr = 1; + + *buff = &init->RxBuffTab[first_rx_buff_index]; + if (pStatus) + { + pStatus->Status0 = rx_desc->DESC0; + if (READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_EDFE)) + { + if (READ_BIT(rx_desc->DESC0, ETH_DMA_RX_DESC0_TSV)) + { + pStatus->TimestampValid = ENABLE; + pStatus->Timestamp.sec = rx_desc->DESC7; + pStatus->Timestamp.nsec = (int32_t)rx_desc->DESC6; + } + } + } + return HAL_OK; + } + else if (READ_BIT(desc0, ETH_DMA_RX_DESC0_FS)) + { + if (desc_nbr) + break; + desc_nbr = 1; + + first_desc_index = desc_index; + len = 0; + + if (init->RxDescListMode == ETH_DESC_LIST_MODE_RING) + { + len += init->RxBuffLen << 1; + + curr_rx_buff_index = desc_index << 1; + + next_rx_buff_index = curr_rx_buff_index; + next_rx_buff_index++; + if (next_rx_buff_index >= init->RxBuffNodeNbr) + next_rx_buff_index = 0; + + rx_buff[curr_rx_buff_index].Buff = (uint8_t *)rx_desc->Buff1; + rx_buff[curr_rx_buff_index].Len = init->RxBuffLen; + rx_buff[curr_rx_buff_index].next = &rx_buff[next_rx_buff_index]; + + curr_rx_buff_index = next_rx_buff_index; + next_rx_buff_index++; + if (next_rx_buff_index >= init->RxBuffNodeNbr) + next_rx_buff_index = 0; + + rx_buff[curr_rx_buff_index].Buff = (uint8_t *)rx_desc->Buff2; + rx_buff[curr_rx_buff_index].Len = init->RxBuffLen; + rx_buff[curr_rx_buff_index].next = &rx_buff[next_rx_buff_index]; + } + else + { + len += init->RxBuffLen; + + next_rx_buff_index = desc_index; + next_rx_buff_index++; + if (next_rx_buff_index >= init->RxBuffNodeNbr) + next_rx_buff_index = 0; + + rx_buff[desc_index].Buff = (uint8_t *)rx_desc->Buff1; + rx_buff[desc_index].Len = init->RxBuffLen; + rx_buff[desc_index].next = &rx_buff[next_rx_buff_index]; + } + + desc_index++; + if (desc_index >= init->RxDescNbr) + desc_index = 0; + rx_desc = &rx_desc_list->RxDescTab[desc_index]; + } + else + { + desc_nbr++; + if (desc_nbr == 1) + break; + + if (init->RxDescListMode == ETH_DESC_LIST_MODE_RING) + { + len += init->RxBuffLen << 1; + + curr_rx_buff_index = desc_index << 1; + + next_rx_buff_index = curr_rx_buff_index; + next_rx_buff_index++; + if (next_rx_buff_index >= init->RxBuffNodeNbr) + next_rx_buff_index = 0; + + rx_buff[curr_rx_buff_index].Buff = (uint8_t *)rx_desc->Buff1; + rx_buff[curr_rx_buff_index].Len = init->RxBuffLen; + rx_buff[curr_rx_buff_index].next = &rx_buff[next_rx_buff_index]; + + curr_rx_buff_index = next_rx_buff_index; + next_rx_buff_index++; + if (next_rx_buff_index >= init->RxBuffNodeNbr) + next_rx_buff_index = 0; + + rx_buff[curr_rx_buff_index].Buff = (uint8_t *)rx_desc->Buff2; + rx_buff[curr_rx_buff_index].Len = init->RxBuffLen; + rx_buff[curr_rx_buff_index].next = &rx_buff[next_rx_buff_index]; + } + else + { + len += init->RxBuffLen; + + next_rx_buff_index = desc_index; + next_rx_buff_index++; + if (next_rx_buff_index >= init->RxBuffNodeNbr) + next_rx_buff_index = 0; + + rx_buff[desc_index].Buff = (uint8_t *)rx_desc->Buff1; + rx_buff[desc_index].Len = init->RxBuffLen; + rx_buff[desc_index].next = &rx_buff[next_rx_buff_index]; + } + + desc_index++; + if (desc_index >= init->RxDescNbr) + desc_index = 0; + rx_desc = &rx_desc_list->RxDescTab[desc_index]; + } + } + + desc_index = rx_desc_list->CurRxDesc; + rx_desc = &rx_desc_list->RxDescTab[desc_index]; + + while (desc_nbr--) + { + WRITE_REG(rx_desc->DESC2, rx_desc->Buff1); + WRITE_REG(rx_desc->DESC3, rx_desc->Buff2); + + SET_BIT(rx_desc->DESC0, ETH_DMA_RX_DESC0_OWN); + + desc_index++; + if (desc_index >= init->RxDescNbr) + desc_index = 0; + rx_desc = &rx_desc_list->RxDescTab[desc_index]; + } + + rx_desc_list->CurRxDesc = desc_index; + rx_desc_list->FirstRxDesc = 0; + rx_desc_list->RxDescNbr = 0; + } +} + + +/** +* @brief This function gives back Rx Desc of the last received Packet +* to the DMA, so ETH DMA will be able to use these descriptors +* to receive next Packets. +* It should be called after processing the received Packet. +* @param heth: pointer to a ETH_HandleTypeDef structure that contains +* the configuration information for ETHERNET module +* @retval HAL status. +*/ +HAL_StatusTypeDef HAL_ETH_ReleaseRxDescriptors(ETH_HandleTypeDef *heth) +{ + uint32_t desc_nbr; + uint32_t desc_index; + ETH_InitTypeDef *init; + ETH_DMADescTypeDef *rx_desc; + ETH_RxDescListTypeDef *rx_desc_list; + + rx_desc_list = &heth->RxDescList; + desc_nbr = rx_desc_list->RxDescNbr; + + if(desc_nbr == 0U) + return HAL_OK; + + init = &heth->Init; + + desc_index = rx_desc_list->FirstRxDesc; + + while (desc_nbr--) + { + rx_desc = &rx_desc_list->RxDescTab[desc_index]; + + WRITE_REG(rx_desc->DESC2, rx_desc->Buff1); + WRITE_REG(rx_desc->DESC3, rx_desc->Buff2); + + SET_BIT(rx_desc->DESC0, ETH_DMA_RX_DESC0_OWN); + + desc_index++; + if (desc_index >= init->RxDescNbr) + desc_index = 0; + } + + rx_desc_list->CurRxDesc = desc_index; + rx_desc_list->FirstRxDesc = 0; + rx_desc_list->RxDescNbr = 0; + + return HAL_OK; +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_Start(ETH_HandleTypeDef *heth); +// ETHʼ +// hethETH_HandleTypeDefṹָ룻 +// ޣ +// HAL_OKɹ +// ע +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_Start(ETH_HandleTypeDef *heth) +{ +// if (heth->State != HAL_ETH_STATE_RESET) +// return HAL_ERROR; + + heth->State = HAL_ETH_STATE_BUSY; + + /* Enable the MAC transmission */ + (heth->Instance)->MACCR |= ETH_MACCR_TE; + + /* Enable the MAC reception */ + (heth->Instance)->MACCR |= ETH_MACCR_RE; + + /* Set the Flush Transmit FIFO bit */ +// (heth->Instance)->DMAOMR |= ETH_DMAOMR_FTF; + + /* Enable the DMA transmission */ + (heth->Instance)->DMAOMR |= ETH_DMAOMR_ST; + + /* Enable the DMA reception */ + (heth->Instance)->DMAOMR |= ETH_DMAOMR_SR; + + __HAL_ETH_DMA_ENABLE_IT(heth, (ETH_DMAIER_NISE | ETH_DMAIER_AISE | ETH_DMAIER_RIE | ETH_DMAIER_TIE)); + + heth->State= HAL_ETH_STATE_READY; + + return HAL_OK; +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_Stop(ETH_HandleTypeDef *heth); +// ETHֹͣ +// hethETH_HandleTypeDefṹָ룻 +// ޣ +// HAL_OKɹ +// ע +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_Stop(ETH_HandleTypeDef *heth) +{ +// if (heth->State != HAL_ETH_STATE_RESET) +// return HAL_ERROR; + + heth->State = HAL_ETH_STATE_BUSY; + + /* Disable the DMA transmission */ + (heth->Instance)->DMAOMR &= ~ETH_DMAOMR_ST; + + /* Disable the DMA reception */ + (heth->Instance)->DMAOMR &= ~ETH_DMAOMR_SR; + + /* Disable the MAC reception */ + (heth->Instance)->MACCR &= ~ETH_MACCR_RE; + + /* Set the Flush Transmit FIFO bit */ + (heth->Instance)->DMAOMR |= ETH_DMAOMR_FTF; + + /* Disable the MAC transmission */ + (heth->Instance)->MACCR &= ~ETH_MACCR_TE; + + heth->State = HAL_ETH_STATE_READY; + + return HAL_OK; +} + +// **************************************************************************** +// HAL_ETH_StateTypeDef HAL_ETH_GetState(ETH_HandleTypeDef *heth); +// ȡ̫״̬ +// hethETH_HandleTypeDefṹָ룻 +// ޣ +// ̫״̬ +// ע +// **************************************************************************** + +HAL_ETH_StateTypeDef HAL_ETH_GetState(ETH_HandleTypeDef *heth) +{ + /* Return ETH state */ + return heth->State; +} + +// **************************************************************************** +// +// Filter +// +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_InitAddrFilterDefaultParamter(ETH_HandleTypeDef *heth) +{ + ETH_AddrFilterTypeDef *pAddrFilterConfig = &heth->FilterConfig.Addr; + + // ַ + pAddrFilterConfig->Addr[0].Enable = DISABLE; + pAddrFilterConfig->Addr[0].GroupFilter = DISABLE; + pAddrFilterConfig->Addr[0].PerfectSourAddr = DISABLE; + pAddrFilterConfig->Addr[0].GroupMask = 0; + pAddrFilterConfig->Addr[0].Addr[0] = 0xFFU; + pAddrFilterConfig->Addr[0].Addr[1] = 0xFFU; + pAddrFilterConfig->Addr[0].Addr[2] = 0xFFU; + pAddrFilterConfig->Addr[0].Addr[3] = 0xFFU; + pAddrFilterConfig->Addr[0].Addr[4] = 0xFFU; + pAddrFilterConfig->Addr[0].Addr[5] = 0xFFU; + pAddrFilterConfig->Addr[1].Enable = DISABLE; + pAddrFilterConfig->Addr[1].GroupFilter = DISABLE; + pAddrFilterConfig->Addr[1].PerfectSourAddr = DISABLE; + pAddrFilterConfig->Addr[1].GroupMask = 0; + pAddrFilterConfig->Addr[1].Addr[0] = 0; + pAddrFilterConfig->Addr[1].Addr[1] = 0; + pAddrFilterConfig->Addr[1].Addr[2] = 0; + pAddrFilterConfig->Addr[1].Addr[3] = 0; + pAddrFilterConfig->Addr[1].Addr[4] = 0; + pAddrFilterConfig->Addr[1].Addr[5] = 0; + pAddrFilterConfig->Addr[2].Enable = DISABLE; + pAddrFilterConfig->Addr[2].GroupFilter = DISABLE; + pAddrFilterConfig->Addr[2].PerfectSourAddr = DISABLE; + pAddrFilterConfig->Addr[2].GroupMask = 0; + pAddrFilterConfig->Addr[2].Addr[0] = 0; + pAddrFilterConfig->Addr[2].Addr[1] = 0; + pAddrFilterConfig->Addr[2].Addr[2] = 0; + pAddrFilterConfig->Addr[2].Addr[3] = 0; + pAddrFilterConfig->Addr[2].Addr[4] = 0; + pAddrFilterConfig->Addr[2].Addr[5] = 0; + pAddrFilterConfig->ReceiveAll = DISABLE; + pAddrFilterConfig->HashPerfectFilter = DISABLE; + pAddrFilterConfig->SourceAddrFilter = DISABLE; + pAddrFilterConfig->SourceAddrInverseFilter = DISABLE; + pAddrFilterConfig->PassControlPackets = ETH_PASS_CONTROL_BLOCK_ALL; // ã֡˵пưֹǴﵽӦó + pAddrFilterConfig->BroadcastFramesReception = ENABLE; // ʹܣ㲥֡ + pAddrFilterConfig->PassAllMulticast = DISABLE; + pAddrFilterConfig->DestAddrInverseFilter = DISABLE; + pAddrFilterConfig->HushMulticastFramesFilter = DISABLE; + pAddrFilterConfig->HashUnicastFramesFilter = DISABLE; + pAddrFilterConfig->PromiscuousMode = DISABLE; + pAddrFilterConfig->HashTable[0] = 0; + pAddrFilterConfig->HashTable[1] = 0; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_GetAddrFilterConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + ETH_AddrFilterTypeDef *pAddrFilterConfig = &heth->FilterConfig.Addr; + + if (heth == NULL) + return (HAL_ERROR); + + memset((void *)pAddrFilterConfig, 0, sizeof(ETH_AddrFilterTypeDef)); + + // MACA1HR + tmpreg = (heth->Instance)->MACA1HR; + + if (tmpreg & ETH_MACA1HR_AE) + pAddrFilterConfig->Addr[0].Enable = ENABLE; + else + pAddrFilterConfig->Addr[0].Enable = DISABLE; + + if (tmpreg & ETH_MACA1HR_MBC) + { + pAddrFilterConfig->Addr[0].GroupFilter = ENABLE; + pAddrFilterConfig->Addr[0].GroupMask = (tmpreg & ETH_MACA1HR_MBC) >> ETH_MACA1HR_MBC_Pos; + } + else + { + pAddrFilterConfig->Addr[0].GroupFilter = DISABLE; + pAddrFilterConfig->Addr[0].GroupMask = 0; + } + + if (tmpreg & ETH_MACA1HR_SA) + pAddrFilterConfig->Addr[0].PerfectSourAddr = ENABLE; + else + pAddrFilterConfig->Addr[0].PerfectSourAddr = DISABLE; + + pAddrFilterConfig->Addr[0].Addr[5] = (tmpreg >> 8) & 0xff; + pAddrFilterConfig->Addr[0].Addr[4] = (tmpreg >> 0) & 0xff; + + // MACA1LR + tmpreg = (heth->Instance)->MACA1LR; + pAddrFilterConfig->Addr[0].Addr[3] = (tmpreg >> 24) & 0xff; + pAddrFilterConfig->Addr[0].Addr[2] = (tmpreg >> 16) & 0xff; + pAddrFilterConfig->Addr[0].Addr[1] = (tmpreg >> 8) & 0xff; + pAddrFilterConfig->Addr[0].Addr[0] = (tmpreg >> 0) & 0xff; + + // MACA2HR + tmpreg = (heth->Instance)->MACA2HR; + + if (tmpreg & ETH_MACA1HR_AE) + pAddrFilterConfig->Addr[1].Enable = ENABLE; + else + pAddrFilterConfig->Addr[1].Enable = DISABLE; + + if (tmpreg & ETH_MACA1HR_MBC) + { + pAddrFilterConfig->Addr[1].GroupFilter = ENABLE; + pAddrFilterConfig->Addr[1].GroupMask = (tmpreg & ETH_MACA1HR_MBC) >> ETH_MACA1HR_MBC_Pos; + } + else + { + pAddrFilterConfig->Addr[1].GroupFilter = DISABLE; + pAddrFilterConfig->Addr[1].GroupMask = 0; + } + + if (tmpreg & ETH_MACA1HR_SA) + pAddrFilterConfig->Addr[1].PerfectSourAddr = ENABLE; + else + pAddrFilterConfig->Addr[1].PerfectSourAddr = DISABLE; + + pAddrFilterConfig->Addr[1].Addr[5] = (tmpreg >> 8) & 0xff; + pAddrFilterConfig->Addr[1].Addr[4] = (tmpreg >> 0) & 0xff; + + // MACA2LR + tmpreg = (heth->Instance)->MACA2LR; + pAddrFilterConfig->Addr[1].Addr[3] = (tmpreg >> 24) & 0xff; + pAddrFilterConfig->Addr[1].Addr[2] = (tmpreg >> 16) & 0xff; + pAddrFilterConfig->Addr[1].Addr[1] = (tmpreg >> 8) & 0xff; + pAddrFilterConfig->Addr[1].Addr[0] = (tmpreg >> 0) & 0xff; + + // MACA3HR + tmpreg = (heth->Instance)->MACA3HR; + + if (tmpreg & ETH_MACA1HR_AE) + pAddrFilterConfig->Addr[2].Enable = ENABLE; + else + pAddrFilterConfig->Addr[2].Enable = DISABLE; + + if (tmpreg & ETH_MACA1HR_MBC) + { + pAddrFilterConfig->Addr[2].GroupFilter = ENABLE; + pAddrFilterConfig->Addr[2].GroupMask = (tmpreg & ETH_MACA1HR_MBC) >> ETH_MACA1HR_MBC_Pos; + } + else + { + pAddrFilterConfig->Addr[2].GroupFilter = DISABLE; + pAddrFilterConfig->Addr[2].GroupMask = 0; + } + + if (tmpreg & ETH_MACA1HR_SA) + pAddrFilterConfig->Addr[2].PerfectSourAddr = ENABLE; + else + pAddrFilterConfig->Addr[2].PerfectSourAddr = DISABLE; + + pAddrFilterConfig->Addr[2].Addr[5] = (tmpreg >> 8) & 0xff; + pAddrFilterConfig->Addr[2].Addr[4] = (tmpreg >> 0) & 0xff; + + // MACA3LR + tmpreg = (heth->Instance)->MACA3LR; + pAddrFilterConfig->Addr[2].Addr[3] = (tmpreg >> 24) & 0xff; + pAddrFilterConfig->Addr[2].Addr[2] = (tmpreg >> 16) & 0xff; + pAddrFilterConfig->Addr[2].Addr[1] = (tmpreg >> 8) & 0xff; + pAddrFilterConfig->Addr[2].Addr[0] = (tmpreg >> 0) & 0xff; + + // MACFFR + tmpreg = (heth->Instance)->MACFFR; + + if (tmpreg & ETH_MACFFR_RA) + pAddrFilterConfig->ReceiveAll = ENABLE; + else + pAddrFilterConfig->ReceiveAll = DISABLE; + + if (tmpreg & ETH_MACFFR_HPF) + pAddrFilterConfig->HashPerfectFilter = ENABLE; + else + pAddrFilterConfig->HashPerfectFilter = DISABLE; + + if (tmpreg & ETH_MACFFR_SAF) + pAddrFilterConfig->SourceAddrFilter = ENABLE; + else + pAddrFilterConfig->SourceAddrFilter = DISABLE; + + if (tmpreg & ETH_MACFFR_SAIF) + pAddrFilterConfig->SourceAddrInverseFilter = ENABLE; + else + pAddrFilterConfig->SourceAddrInverseFilter = DISABLE; + + if ((tmpreg & ETH_MACFFR_PCF) == 0) + pAddrFilterConfig->PassControlPackets = ETH_PASS_CONTROL_BLOCK_ALL; + else if ((tmpreg & ETH_MACFFR_PCF) == ETH_MACFFR_PCF_0) + pAddrFilterConfig->PassControlPackets = ETH_PASS_CONTROL_FORWARD_ALL_EXCEPT_PAUSE_FRAME; + else if ((tmpreg & ETH_MACFFR_PCF) == ETH_MACFFR_PCF_1) + pAddrFilterConfig->PassControlPackets = ETH_PASS_CONTROL_FORWARD_ALL; + else if ((tmpreg & ETH_MACFFR_PCF) == (ETH_MACFFR_PCF_1 | ETH_MACFFR_PCF_0)) + pAddrFilterConfig->PassControlPackets = ETH_PASS_CONTROL_FORWARD_PASSED_ADDR_FILTER; + + if (tmpreg & ETH_MACFFR_DBF) + pAddrFilterConfig->BroadcastFramesReception = DISABLE; + else + pAddrFilterConfig->BroadcastFramesReception = ENABLE; + + if (tmpreg & ETH_MACFFR_PAM) + pAddrFilterConfig->PassAllMulticast = ENABLE; + else + pAddrFilterConfig->PassAllMulticast = DISABLE; + + if (tmpreg & ETH_MACFFR_DAIF) + pAddrFilterConfig->DestAddrInverseFilter = ENABLE; + else + pAddrFilterConfig->DestAddrInverseFilter = DISABLE; + + if (tmpreg & ETH_MACFFR_HMC) + pAddrFilterConfig->HushMulticastFramesFilter = ENABLE; + else + pAddrFilterConfig->HushMulticastFramesFilter = DISABLE; + + if (tmpreg & ETH_MACFFR_HUC) + pAddrFilterConfig->HashUnicastFramesFilter = ENABLE; + else + pAddrFilterConfig->HashUnicastFramesFilter = DISABLE; + + if (tmpreg & ETH_MACFFR_PR) + pAddrFilterConfig->PromiscuousMode = ENABLE; + else + pAddrFilterConfig->PromiscuousMode = DISABLE; + + // MACHTHR + pAddrFilterConfig->HashTable[1] = (heth->Instance)->MACHTHR; + + // MACHTLR + pAddrFilterConfig->HashTable[0] = (heth->Instance)->MACHTLR; + + return HAL_OK; +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_ConfigMAC(ETH_HandleTypeDef *heth, ETH_MACInitTypeDef *pMACConfig); +// MAC +// hethETH_HandleTypeDefṹָ룻 +// dmaconfýṹָ룻 +// ޣ +// HAL_OKóɹ +// ע +// **************************************************************************** +HAL_StatusTypeDef HAL_ETH_SetAddrFilterConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + ETH_AddrFilterTypeDef *pAddrFilterConfig = &heth->FilterConfig.Addr; + + if (heth == NULL) + return (HAL_ERROR); + + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->Addr[0].Enable)); + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->Addr[1].Enable)); + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->Addr[2].Enable)); + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->ReceiveAll)); + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->HashPerfectFilter)); + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->SourceAddrFilter)); + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->SourceAddrInverseFilter)); + assert_param(IS_ETH_PASS_CONTROL_PACKETS(pAddrFilterConfig->PassControlPackets)); + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->BroadcastFramesReception)); + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->PassAllMulticast)); + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->DestAddrInverseFilter)); + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->HushMulticastFramesFilter)); + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->HashUnicastFramesFilter)); + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->PromiscuousMode)); + + // MACA1HR + if (pAddrFilterConfig->Addr[0].Enable == DISABLE) + { + (heth->Instance)->MACA1HR = 0; + (heth->Instance)->MACA1LR = 0; + } + else + { + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->Addr[0].GroupFilter)); + + tmpreg = ETH_MACA1HR_AE; + if (pAddrFilterConfig->Addr[0].GroupFilter == DISABLE) + { + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->Addr[0].PerfectSourAddr)); + + if (pAddrFilterConfig->Addr[0].PerfectSourAddr != DISABLE) + tmpreg |= ETH_MACA1HR_SA; + } + else + { + assert_param(IS_ETH_ADDR_FILTER_GROUP_MASK(pAddrFilterConfig->Addr[0].GroupMask)); + + tmpreg |= pAddrFilterConfig->Addr[0].GroupMask << ETH_MACA1HR_MBC_Pos; + } + + (heth->Instance)->MACA1HR = tmpreg | \ + ((uint32_t)pAddrFilterConfig->Addr[0].Addr[5] << 8) | \ + ((uint32_t)pAddrFilterConfig->Addr[0].Addr[4] << 0); + + // MACA1LR + (heth->Instance)->MACA1LR = ((uint32_t)pAddrFilterConfig->Addr[0].Addr[3] << 24) | \ + ((uint32_t)pAddrFilterConfig->Addr[0].Addr[2] << 16) | \ + ((uint32_t)pAddrFilterConfig->Addr[0].Addr[1] << 8) | \ + ((uint32_t)pAddrFilterConfig->Addr[0].Addr[0] << 0); + } + + // MACA1HR + if (pAddrFilterConfig->Addr[1].Enable == DISABLE) + { + (heth->Instance)->MACA2HR = 0; + (heth->Instance)->MACA2LR = 0; + } + else + { + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->Addr[1].GroupFilter)); + + tmpreg = ETH_MACA2HR_AE; + if (pAddrFilterConfig->Addr[1].GroupFilter == DISABLE) + { + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->Addr[1].PerfectSourAddr)); + + if (pAddrFilterConfig->Addr[1].PerfectSourAddr != DISABLE) + tmpreg |= ETH_MACA2HR_SA; + } + else + { + assert_param(IS_ETH_ADDR_FILTER_GROUP_MASK(pAddrFilterConfig->Addr[1].GroupMask)); + + tmpreg |= pAddrFilterConfig->Addr[1].GroupMask << ETH_MACA2HR_MBC_Pos; + } + + (heth->Instance)->MACA2HR = tmpreg | \ + ((uint32_t)pAddrFilterConfig->Addr[1].Addr[5] << 8) | \ + ((uint32_t)pAddrFilterConfig->Addr[1].Addr[4] << 0); + + // MACA2LR + (heth->Instance)->MACA2LR = ((uint32_t)pAddrFilterConfig->Addr[1].Addr[3] << 24) | \ + ((uint32_t)pAddrFilterConfig->Addr[1].Addr[2] << 16) | \ + ((uint32_t)pAddrFilterConfig->Addr[1].Addr[1] << 8) | \ + ((uint32_t)pAddrFilterConfig->Addr[1].Addr[0] << 0); + } + + // MACA3HR + if (pAddrFilterConfig->Addr[2].Enable == DISABLE) + { + (heth->Instance)->MACA3HR = 0; + (heth->Instance)->MACA3LR = 0; + } + else + { + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->Addr[2].GroupFilter)); + + tmpreg = ETH_MACA3HR_AE; + if (pAddrFilterConfig->Addr[2].GroupFilter == DISABLE) + { + assert_param(IS_FUNCTIONAL_STATE(pAddrFilterConfig->Addr[2].PerfectSourAddr)); + + if (pAddrFilterConfig->Addr[2].PerfectSourAddr != DISABLE) + tmpreg |= ETH_MACA3HR_SA; + } + else + { + assert_param(IS_ETH_ADDR_FILTER_GROUP_MASK(pAddrFilterConfig->Addr[2].GroupMask)); + + tmpreg |= pAddrFilterConfig->Addr[2].GroupMask << ETH_MACA3HR_MBC_Pos; + } + + (heth->Instance)->MACA3HR = tmpreg | \ + ((uint32_t)pAddrFilterConfig->Addr[2].Addr[5] << 8) | \ + ((uint32_t)pAddrFilterConfig->Addr[2].Addr[4] << 0); + + // MACA3LR + (heth->Instance)->MACA3LR = ((uint32_t)pAddrFilterConfig->Addr[2].Addr[3] << 24) | \ + ((uint32_t)pAddrFilterConfig->Addr[2].Addr[2] << 16) | \ + ((uint32_t)pAddrFilterConfig->Addr[2].Addr[1] << 8) | \ + ((uint32_t)pAddrFilterConfig->Addr[2].Addr[0] << 0); + } + + // MACFFR + tmpreg = (heth->Instance)->MACFFR; + tmpreg &= ~(ETH_MACFFR_RA | ETH_MACFFR_HPF | ETH_MACFFR_SAF | ETH_MACFFR_PCF | ETH_MACFFR_DBF | \ + ETH_MACFFR_PAM | ETH_MACFFR_DAIF | ETH_MACFFR_HMC | ETH_MACFFR_HUC | ETH_MACFFR_PR); + + if (pAddrFilterConfig->ReceiveAll != DISABLE) + tmpreg |= ETH_MACFFR_RA; + + if (pAddrFilterConfig->HashPerfectFilter != DISABLE) + tmpreg |= ETH_MACFFR_HPF; + + if (pAddrFilterConfig->SourceAddrFilter != DISABLE) + tmpreg |= ETH_MACFFR_SAF; + + if (pAddrFilterConfig->SourceAddrInverseFilter != DISABLE) + tmpreg |= ETH_MACFFR_SAIF; + + if (pAddrFilterConfig->PassControlPackets == ETH_PASS_CONTROL_BLOCK_ALL) + tmpreg |= 0U; + else if (pAddrFilterConfig->PassControlPackets == ETH_PASS_CONTROL_FORWARD_ALL_EXCEPT_PAUSE_FRAME) + tmpreg |= ETH_MACFFR_PCF_0; + else if (pAddrFilterConfig->PassControlPackets == ETH_PASS_CONTROL_FORWARD_ALL) + tmpreg |= ETH_MACFFR_PCF_1; + else if (pAddrFilterConfig->PassControlPackets == ETH_PASS_CONTROL_FORWARD_PASSED_ADDR_FILTER) + tmpreg |= ETH_MACFFR_PCF_1 | ETH_MACFFR_PCF_0; + + if (pAddrFilterConfig->BroadcastFramesReception == DISABLE) + tmpreg |= ETH_MACFFR_DBF; + + if (pAddrFilterConfig->PassAllMulticast != DISABLE) + tmpreg |= ETH_MACFFR_PAM; + + if (pAddrFilterConfig->DestAddrInverseFilter != DISABLE) + tmpreg |= ETH_MACFFR_DAIF; + + if (pAddrFilterConfig->HushMulticastFramesFilter != DISABLE) + tmpreg |= ETH_MACFFR_HMC; + + if (pAddrFilterConfig->HashUnicastFramesFilter != DISABLE) + tmpreg |= ETH_MACFFR_HUC; + + if (pAddrFilterConfig->PromiscuousMode != DISABLE) + tmpreg |= ETH_MACFFR_PR; + + (heth->Instance)->MACFFR = tmpreg; + + // MACHTHR + (heth->Instance)->MACHTHR = (uint32_t)pAddrFilterConfig->HashTable[1]; + + // MACHTLR + (heth->Instance)->MACHTLR = (uint32_t)pAddrFilterConfig->HashTable[0]; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetAddrFilterDefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitAddrFilterDefaultParamter(heth); + + return HAL_ETH_SetAddrFilterConfig(heth); +} + +HAL_StatusTypeDef HAL_ETH_InitVLANFilterDefaultParamter(ETH_HandleTypeDef *heth) +{ + ETH_VLANFilterTypeDef *pVLANFilterConfig = &heth->FilterConfig.VLAN; + + // VLAN + pVLANFilterConfig->Enable = DISABLE; + pVLANFilterConfig->Hash = DISABLE; + pVLANFilterConfig->SVLAN = DISABLE; + pVLANFilterConfig->InverseMatch = DISABLE; + pVLANFilterConfig->Comparison12Bits = DISABLE; + pVLANFilterConfig->Tag = 0; + pVLANFilterConfig->HashTable = 0; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_GetVLANFilterConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + ETH_VLANFilterTypeDef *pVLANFilterConfig = &heth->FilterConfig.VLAN; + + if (heth == NULL) + return (HAL_ERROR); + + memset((void *)pVLANFilterConfig, 0, sizeof(ETH_VLANFilterTypeDef)); + + // MACFFR + tmpreg = (heth->Instance)->MACFFR; + + if (tmpreg & ETH_MACFFR_VTFE) + pVLANFilterConfig->Enable = ENABLE; + else + pVLANFilterConfig->Enable = DISABLE; + + // MACVLANTR + tmpreg = (heth->Instance)->MACVLANTR; + + if (tmpreg & ETH_MACVLANTR_VTHM) + pVLANFilterConfig->Hash = ENABLE; + else + pVLANFilterConfig->Hash = DISABLE; + + if (tmpreg & ETH_MACVLANTR_ESVL) + pVLANFilterConfig->SVLAN = ENABLE; + else + pVLANFilterConfig->SVLAN = DISABLE; + + if (tmpreg & ETH_MACVLANTR_VTIM) + pVLANFilterConfig->InverseMatch = ENABLE; + else + pVLANFilterConfig->InverseMatch = DISABLE; + + if (tmpreg & ETH_MACVLANTR_ETV) + pVLANFilterConfig->Comparison12Bits = ENABLE; + else + pVLANFilterConfig->Comparison12Bits = DISABLE; + + pVLANFilterConfig->Tag = (tmpreg & ETH_MACVLANTR_VL) >> ETH_MACVLANTR_VL_Pos; + + // MACVHTR + pVLANFilterConfig->HashTable = ((heth->Instance)->MACVHTR & ETH_MACVHTR_CSVL) >> ETH_MACVHTR_CSVL_Pos; + + return HAL_OK; +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_ConfigMAC(ETH_HandleTypeDef *heth, ETH_MACInitTypeDef *pMACConfig); +// MAC +// hethETH_HandleTypeDefṹָ룻 +// dmaconfýṹָ룻 +// ޣ +// HAL_OKóɹ +// ע +// **************************************************************************** +HAL_StatusTypeDef HAL_ETH_SetVLANFilterConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + ETH_VLANFilterTypeDef *pVLANFilterConfig = &heth->FilterConfig.VLAN; + + if (heth == NULL) + return (HAL_ERROR); + + assert_param(IS_FUNCTIONAL_STATE(pVLANFilterConfig->Enable)); + assert_param(IS_FUNCTIONAL_STATE(pVLANFilterConfig->Hash)); + assert_param(IS_FUNCTIONAL_STATE(pVLANFilterConfig->SVLAN)); + assert_param(IS_FUNCTIONAL_STATE(pVLANFilterConfig->InverseMatch)); + assert_param(IS_FUNCTIONAL_STATE(pVLANFilterConfig->Comparison12Bits)); + assert_param(IS_ETH_VLAN_TAG(pVLANFilterConfig->Tag)); + assert_param(IS_ETH_VLAN_HASH_TABLE(pVLANFilterConfig->HashTable)); + + // MACFFR + tmpreg = (heth->Instance)->MACFFR; + tmpreg &= ~ETH_MACFFR_VTFE; + + if (pVLANFilterConfig->Enable != DISABLE) + tmpreg |= ETH_MACFFR_VTFE; + + (heth->Instance)->MACFFR = tmpreg; + + // MACVLANTR + tmpreg = 0; + + if (pVLANFilterConfig->Hash != DISABLE) + tmpreg |= ETH_MACVLANTR_VTHM; + + if (pVLANFilterConfig->SVLAN != DISABLE) + tmpreg |= ETH_MACVLANTR_ESVL; + + if (pVLANFilterConfig->InverseMatch != DISABLE) + tmpreg |= ETH_MACVLANTR_VTIM; + + if (pVLANFilterConfig->Comparison12Bits != DISABLE) + tmpreg |= ETH_MACVLANTR_ETV; + + tmpreg |= pVLANFilterConfig->Tag << ETH_MACVLANTR_VL_Pos; + + (heth->Instance)->MACVLANTR = (uint32_t)tmpreg; + + // MACVHTR + (heth->Instance)->MACVHTR = pVLANFilterConfig->HashTable; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetVLANFilterDefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitVLANFilterDefaultParamter(heth); + + return HAL_ETH_SetVLANFilterConfig(heth); +} + +HAL_StatusTypeDef HAL_ETH_InitL3L4FilterDefaultParamter(ETH_HandleTypeDef *heth) +{ + uint32_t i; + ETH_L3FilterTypeDef *pL3Config; + ETH_L4FilterTypeDef *pL4Config; + + // Layer3 Layer4 + heth->FilterConfig.L3L4.Enable = DISABLE; + + for (i=0; i<2; i++) + { + if (i == 0) + pL3Config = &heth->FilterConfig.L3L4.L3[0]; + else + pL3Config = &heth->FilterConfig.L3L4.L3[1]; + + pL3Config->ProtocolIPV6 = DISABLE; + pL3Config->IPV4.SourAddrMatchEnable = DISABLE; + pL3Config->IPV4.SourAddrInverseMatch = DISABLE; + pL3Config->IPV4.SourAddrMatch = 0; + pL3Config->IPV4.DestAddrMatchEnable = DISABLE; + pL3Config->IPV4.DestAddrInverseMatch = DISABLE; + pL3Config->IPV4.DestAddrMatch = 0; + pL3Config->IPV4.Rsv1[0] = 0; + pL3Config->IPV4.Rsv1[1] = 0; + pL3Config->IPV4.SourAddr = 0; + pL3Config->IPV4.DestAddr = 0; + pL3Config->IPV4.Rsv2[0] = 0; + pL3Config->IPV4.Rsv2[1] = 0; + } + + for (i=0; i<2; i++) + { + if (i == 0) + pL4Config = &heth->FilterConfig.L3L4.L4[0]; + else + pL4Config = &heth->FilterConfig.L3L4.L4[1]; + + pL4Config->ProtocolUDP = DISABLE; + pL4Config->SourPortMatchEnable = DISABLE; + pL4Config->SourPortInverseMatch = DISABLE; + pL4Config->DestPortMatchEnable = DISABLE; + pL4Config->DestPortInverseMatch = DISABLE; + pL4Config->SourPort = 0; + pL4Config->DestPort = 0; + } + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_GetL3L4FilterConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + ETH_L3L4FilterTypeDef *pL3L4FilterConfig = &heth->FilterConfig.L3L4; + + if (heth == NULL) + return (HAL_ERROR); + + memset((void *)pL3L4FilterConfig, 0, sizeof(ETH_L3L4FilterTypeDef)); + + // MACFFR + tmpreg = (heth->Instance)->MACFFR; + + if (tmpreg & ETH_MACFFR_IPFE) + pL3L4FilterConfig->Enable = ENABLE; + else + pL3L4FilterConfig->Enable = DISABLE; + + // MACL3L4C0R + tmpreg = (heth->Instance)->MACL3L4C0R; + + if (tmpreg & ETH_MACL3L4C0R_L4DPIM0) + pL3L4FilterConfig->L4[0].DestPortInverseMatch = ENABLE; + else + pL3L4FilterConfig->L4[0].DestPortInverseMatch = DISABLE; + + if (tmpreg & ETH_MACL3L4C0R_L4DPM0) + pL3L4FilterConfig->L4[0].DestPortMatchEnable = ENABLE; + else + pL3L4FilterConfig->L4[0].DestPortMatchEnable = DISABLE; + + if (tmpreg & ETH_MACL3L4C0R_L4SPIM0) + pL3L4FilterConfig->L4[0].SourPortInverseMatch = ENABLE; + else + pL3L4FilterConfig->L4[0].SourPortInverseMatch = DISABLE; + + if (tmpreg & ETH_MACL3L4C0R_L4SPM0) + pL3L4FilterConfig->L4[0].SourPortMatchEnable = ENABLE; + else + pL3L4FilterConfig->L4[0].SourPortMatchEnable = DISABLE; + + if (tmpreg & ETH_MACL3L4C0R_L4PEN0) + pL3L4FilterConfig->L4[0].ProtocolUDP = ENABLE; + else + pL3L4FilterConfig->L4[0].ProtocolUDP = DISABLE; + + if (tmpreg & ETH_MACL3L4C0R_L3PEN0) + { + pL3L4FilterConfig->L3[0].ProtocolIPV6 = ENABLE; + + pL3L4FilterConfig->L3[0].IPV6.AddrMatch = (tmpreg & (ETH_MACL3L4C0R_L3HDBM0_0 | ETH_MACL3L4C0R_L3HDBM0_1 | ETH_MACL3L4C0R_L3HSBM0)) >> ETH_MACL3L4C0R_L3HSBM0_Pos; + + if (tmpreg & ETH_MACL3L4C0R_L3DAIM0) + pL3L4FilterConfig->L3[0].IPV6.DestAddrInverseMatch = ENABLE; + else + pL3L4FilterConfig->L3[0].IPV6.DestAddrInverseMatch = DISABLE; + + if (tmpreg & ETH_MACL3L4C0R_L3DAM0) + pL3L4FilterConfig->L3[0].IPV6.DestAddrMatchEnable = ENABLE; + else + pL3L4FilterConfig->L3[0].IPV6.DestAddrMatchEnable = DISABLE; + + if (tmpreg & ETH_MACL3L4C0R_L3SAIM0) + pL3L4FilterConfig->L3[0].IPV6.SourAddrInverseMatch = ENABLE; + else + pL3L4FilterConfig->L3[0].IPV6.SourAddrInverseMatch = DISABLE; + + if (tmpreg & ETH_MACL3L4C0R_L3SAM0) + pL3L4FilterConfig->L3[0].IPV6.SourAddrMatchEnable = ENABLE; + else + pL3L4FilterConfig->L3[0].IPV6.SourAddrMatchEnable = DISABLE; + + // MACL3A00R + pL3L4FilterConfig->L3[0].IPV6.Addr[0] = (heth->Instance)->MACL3A00R; + + // MACL3A10R + pL3L4FilterConfig->L3[0].IPV6.Addr[1] = (heth->Instance)->MACL3A10R; + + // MACL3A20R + pL3L4FilterConfig->L3[0].IPV6.Addr[2] = (heth->Instance)->MACL3A20R; + + // MACL3A30R + pL3L4FilterConfig->L3[0].IPV6.Addr[3] = (heth->Instance)->MACL3A30R; + + } + else + { + pL3L4FilterConfig->L3[0].ProtocolIPV6 = DISABLE; + + pL3L4FilterConfig->L3[0].IPV4.DestAddrMatch = (tmpreg & ETH_MACL3L4C0R_L3HDBM0) >> ETH_MACL3L4C0R_L3HDBM0_Pos; + + pL3L4FilterConfig->L3[0].IPV4.SourAddrMatch = (tmpreg & ETH_MACL3L4C0R_L3HSBM0) >> ETH_MACL3L4C0R_L3HSBM0_Pos; + + if (tmpreg & ETH_MACL3L4C0R_L3DAIM0) + pL3L4FilterConfig->L3[0].IPV4.DestAddrInverseMatch = ENABLE; + else + pL3L4FilterConfig->L3[0].IPV4.DestAddrInverseMatch = DISABLE; + + if (tmpreg & ETH_MACL3L4C0R_L3DAM0) + pL3L4FilterConfig->L3[0].IPV4.DestAddrMatchEnable = ENABLE; + else + pL3L4FilterConfig->L3[0].IPV4.DestAddrMatchEnable = DISABLE; + + if (tmpreg & ETH_MACL3L4C0R_L3SAIM0) + pL3L4FilterConfig->L3[0].IPV4.SourAddrInverseMatch = ENABLE; + else + pL3L4FilterConfig->L3[0].IPV4.SourAddrInverseMatch = DISABLE; + + if (tmpreg & ETH_MACL3L4C0R_L3SAM0) + pL3L4FilterConfig->L3[0].IPV4.SourAddrMatchEnable = ENABLE; + else + pL3L4FilterConfig->L3[0].IPV4.SourAddrMatchEnable = DISABLE; + + // MACL3A00R + pL3L4FilterConfig->L3[0].IPV4.SourAddr = (heth->Instance)->MACL3A00R; + + // MACL3A10R + pL3L4FilterConfig->L3[0].IPV4.DestAddr = (heth->Instance)->MACL3A10R; + + } + + // MACL4A0R + pL3L4FilterConfig->L4[0].DestPort = ((heth->Instance)->MACL4A0R & ETH_MACL4A0R_L4DP0) >> ETH_MACL4A0R_L4DP0_Pos; + + pL3L4FilterConfig->L4[0].SourPort = ((heth->Instance)->MACL4A0R & ETH_MACL4A0R_L4SP0) >> ETH_MACL4A0R_L4SP0_Pos; + + // MACL3L4C1R + tmpreg = (heth->Instance)->MACL3L4C1R; + + if (tmpreg & ETH_MACL3L4C1R_L4DPIM1) + pL3L4FilterConfig->L4[1].DestPortInverseMatch = ENABLE; + else + pL3L4FilterConfig->L4[1].DestPortInverseMatch = DISABLE; + + if (tmpreg & ETH_MACL3L4C1R_L4DPM1) + pL3L4FilterConfig->L4[1].DestPortMatchEnable = ENABLE; + else + pL3L4FilterConfig->L4[1].DestPortMatchEnable = DISABLE; + + if (tmpreg & ETH_MACL3L4C1R_L4SPIM1) + pL3L4FilterConfig->L4[1].SourPortInverseMatch = ENABLE; + else + pL3L4FilterConfig->L4[1].SourPortInverseMatch = DISABLE; + + if (tmpreg & ETH_MACL3L4C1R_L4SPM1) + pL3L4FilterConfig->L4[1].SourPortMatchEnable = ENABLE; + else + pL3L4FilterConfig->L4[1].SourPortMatchEnable = DISABLE; + + if (tmpreg & ETH_MACL3L4C1R_L4PEN1) + pL3L4FilterConfig->L4[1].ProtocolUDP = ENABLE; + else + pL3L4FilterConfig->L4[1].ProtocolUDP = DISABLE; + + if (tmpreg & ETH_MACL3L4C1R_L3PEN1) + { + pL3L4FilterConfig->L3[1].ProtocolIPV6 = ENABLE; + + pL3L4FilterConfig->L3[1].IPV6.AddrMatch = (tmpreg & (ETH_MACL3L4C1R_L3HDBM1_0 | ETH_MACL3L4C1R_L3HDBM1_1 | ETH_MACL3L4C1R_L3HSBM1)) >> ETH_MACL3L4C1R_L3HSBM1_Pos; + + if (tmpreg & ETH_MACL3L4C1R_L3DAIM1) + pL3L4FilterConfig->L3[1].IPV6.DestAddrInverseMatch = ENABLE; + else + pL3L4FilterConfig->L3[1].IPV6.DestAddrInverseMatch = DISABLE; + + if (tmpreg & ETH_MACL3L4C1R_L3DAM1) + pL3L4FilterConfig->L3[1].IPV6.DestAddrMatchEnable = ENABLE; + else + pL3L4FilterConfig->L3[1].IPV6.DestAddrMatchEnable = DISABLE; + + if (tmpreg & ETH_MACL3L4C1R_L3SAIM1) + pL3L4FilterConfig->L3[1].IPV6.SourAddrInverseMatch = ENABLE; + else + pL3L4FilterConfig->L3[1].IPV6.SourAddrInverseMatch = DISABLE; + + if (tmpreg & ETH_MACL3L4C1R_L3SAM1) + pL3L4FilterConfig->L3[1].IPV6.SourAddrMatchEnable = ENABLE; + else + pL3L4FilterConfig->L3[1].IPV6.SourAddrMatchEnable = DISABLE; + + // MACL3A01R + pL3L4FilterConfig->L3[1].IPV6.Addr[1] = (heth->Instance)->MACL3A01R; + + // MACL3A11R + pL3L4FilterConfig->L3[1].IPV6.Addr[1] = (heth->Instance)->MACL3A11R; + + // MACL3A21R + pL3L4FilterConfig->L3[1].IPV6.Addr[2] = (heth->Instance)->MACL3A21R; + + // MACL3A31R + pL3L4FilterConfig->L3[1].IPV6.Addr[3] = (heth->Instance)->MACL3A31R; + + } + else + { + pL3L4FilterConfig->L3[1].ProtocolIPV6 = DISABLE; + + pL3L4FilterConfig->L3[1].IPV4.DestAddrMatch = (tmpreg & ETH_MACL3L4C1R_L3HDBM1) >> ETH_MACL3L4C1R_L3HDBM1_Pos; + + pL3L4FilterConfig->L3[1].IPV4.SourAddrMatch = (tmpreg & ETH_MACL3L4C1R_L3HSBM1) >> ETH_MACL3L4C1R_L3HSBM1_Pos; + + if (tmpreg & ETH_MACL3L4C1R_L3DAIM1) + pL3L4FilterConfig->L3[1].IPV4.DestAddrInverseMatch = ENABLE; + else + pL3L4FilterConfig->L3[1].IPV4.DestAddrInverseMatch = DISABLE; + + if (tmpreg & ETH_MACL3L4C1R_L3DAM1) + pL3L4FilterConfig->L3[1].IPV4.DestAddrMatchEnable = ENABLE; + else + pL3L4FilterConfig->L3[1].IPV4.DestAddrMatchEnable = DISABLE; + + if (tmpreg & ETH_MACL3L4C1R_L3SAIM1) + pL3L4FilterConfig->L3[1].IPV4.SourAddrInverseMatch = ENABLE; + else + pL3L4FilterConfig->L3[1].IPV4.SourAddrInverseMatch = DISABLE; + + if (tmpreg & ETH_MACL3L4C1R_L3SAM1) + pL3L4FilterConfig->L3[1].IPV4.SourAddrMatchEnable = ENABLE; + else + pL3L4FilterConfig->L3[1].IPV4.SourAddrMatchEnable = DISABLE; + + // MACL3A01R + pL3L4FilterConfig->L3[1].IPV4.SourAddr = (heth->Instance)->MACL3A01R; + + // MACL3A11R + pL3L4FilterConfig->L3[1].IPV4.DestAddr = (heth->Instance)->MACL3A11R; + + } + + // MACL4A1R + pL3L4FilterConfig->L4[1].DestPort = ((heth->Instance)->MACL4A1R & ETH_MACL4A1R_L4DP1) >> ETH_MACL4A1R_L4DP1_Pos; + + pL3L4FilterConfig->L4[1].SourPort = ((heth->Instance)->MACL4A1R & ETH_MACL4A1R_L4SP1) >> ETH_MACL4A1R_L4SP1_Pos; + + return HAL_OK; +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_ConfigMAC(ETH_HandleTypeDef *heth, ETH_MACInitTypeDef *pMACConfig); +// MAC +// hethETH_HandleTypeDefṹָ룻 +// dmaconfýṹָ룻 +// ޣ +// HAL_OKóɹ +// ע +// **************************************************************************** +HAL_StatusTypeDef HAL_ETH_SetL3L4FilterConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + ETH_L3L4FilterTypeDef *pL3L4FilterConfig = &heth->FilterConfig.L3L4; + + if (heth == NULL) + return (HAL_ERROR); + + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->Enable)); + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L3[0].ProtocolIPV6)); + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L3[1].ProtocolIPV6)); + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L4[0].ProtocolUDP)); + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L4[0].SourPortMatchEnable)); + assert_param(IS_ETH_SOUR_PORT(pL3L4FilterConfig->L4[0].SourPort)); + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L4[0].DestPortMatchEnable)); + assert_param(IS_ETH_DEST_PORT(pL3L4FilterConfig->L4[0].DestPort)); + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L4[1].ProtocolUDP)); + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L4[1].SourPortMatchEnable)); + assert_param(IS_ETH_SOUR_PORT(pL3L4FilterConfig->L4[1].SourPort)); + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L4[1].DestPortMatchEnable)); + assert_param(IS_ETH_DEST_PORT(pL3L4FilterConfig->L4[1].DestPort)); + + // MACFFR + tmpreg = (heth->Instance)->MACFFR; + + if (pL3L4FilterConfig->Enable != DISABLE) + tmpreg |= ETH_MACFFR_IPFE; + else + tmpreg &= ~ETH_MACFFR_IPFE; + + (heth->Instance)->MACFFR = tmpreg; + + // MACL3L4C0R + tmpreg = 0U; + + if (pL3L4FilterConfig->L4[0].ProtocolUDP != DISABLE) + tmpreg |= ETH_MACL3L4C0R_L4PEN0; + + if (pL3L4FilterConfig->L4[0].DestPortMatchEnable != DISABLE) + { + tmpreg |= ETH_MACL3L4C0R_L4DPM0; + + if (pL3L4FilterConfig->L4[0].DestPortInverseMatch != DISABLE) + tmpreg |= ETH_MACL3L4C0R_L4DPIM0; + } + + if (pL3L4FilterConfig->L4[0].SourPortMatchEnable != DISABLE) + { + tmpreg |= ETH_MACL3L4C0R_L4SPM0; + + if (pL3L4FilterConfig->L4[0].SourPortInverseMatch != DISABLE) + tmpreg |= ETH_MACL3L4C0R_L4SPIM0; + } + + if (pL3L4FilterConfig->L3[0].ProtocolIPV6 != DISABLE) + { + tmpreg |= ETH_MACL3L4C0R_L3PEN0; + + assert_param(IS_ETH_IPV6_ADDR_MASK(pL3L4FilterConfig->L3[0].IPV6.AddrMatch)); + + tmpreg |= pL3L4FilterConfig->L3[0].IPV6.AddrMatch << ETH_MACL3L4C0R_L3HSBM0_Pos; + + if (pL3L4FilterConfig->L3[0].IPV6.DestAddrMatchEnable != DISABLE) + { + tmpreg |= ETH_MACL3L4C0R_L3DAM0; + + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L3[0].IPV6.DestAddrInverseMatch)); + + if (pL3L4FilterConfig->L3[0].IPV6.DestAddrInverseMatch != DISABLE) + tmpreg |= ETH_MACL3L4C0R_L3DAIM0; + } + + if (pL3L4FilterConfig->L3[0].IPV6.SourAddrMatchEnable != DISABLE) + { + tmpreg |= ETH_MACL3L4C0R_L3SAM0; + + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L3[0].IPV6.DestAddrInverseMatch)); + + if (pL3L4FilterConfig->L3[0].IPV6.SourAddrInverseMatch != DISABLE) + tmpreg |= ETH_MACL3L4C0R_L3SAIM0; + } + + (heth->Instance)->MACL3L4C0R = tmpreg; + + // MACL3A00R + (heth->Instance)->MACL3A00R = pL3L4FilterConfig->L3[0].IPV6.Addr[0]; + + // MACL3A10R + (heth->Instance)->MACL3A10R = pL3L4FilterConfig->L3[0].IPV6.Addr[1]; + + // MACL3A20R + (heth->Instance)->MACL3A20R = pL3L4FilterConfig->L3[0].IPV6.Addr[2]; + + // MACL3A30R + (heth->Instance)->MACL3A30R = pL3L4FilterConfig->L3[0].IPV6.Addr[3]; + } + else + { + assert_param(IS_ETH_IPV4_SOUR_ADDR_MASK(pL3L4FilterConfig->L3[0].IPV4.SourAddrMatch)); + assert_param(IS_ETH_IPV4_DEST_ADDR_MASK(pL3L4FilterConfig->L3[0].IPV4.DestAddrMatch)); + + tmpreg |= pL3L4FilterConfig->L3[0].IPV4.DestAddrMatch << ETH_MACL3L4C0R_L3HDBM0_Pos; + + tmpreg |= pL3L4FilterConfig->L3[0].IPV4.SourAddrMatch << ETH_MACL3L4C0R_L3HSBM0_Pos; + + if (pL3L4FilterConfig->L3[0].IPV4.DestAddrMatchEnable != DISABLE) + { + tmpreg |= ETH_MACL3L4C0R_L3DAM0; + + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L3[0].IPV4.DestAddrInverseMatch)); + + if (pL3L4FilterConfig->L3[0].IPV4.DestAddrInverseMatch != DISABLE) + tmpreg |= ETH_MACL3L4C0R_L3DAIM0; + } + + if (pL3L4FilterConfig->L3[0].IPV4.SourAddrMatchEnable != DISABLE) + { + tmpreg |= ETH_MACL3L4C0R_L3SAM0; + + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L3[0].IPV4.SourAddrInverseMatch)); + + if (pL3L4FilterConfig->L3[0].IPV4.SourAddrInverseMatch != DISABLE) + tmpreg |= ETH_MACL3L4C0R_L3SAIM0; + } + + (heth->Instance)->MACL3L4C0R = tmpreg; + + // MACL3A00R + (heth->Instance)->MACL3A00R = pL3L4FilterConfig->L3[0].IPV4.SourAddr; + + // MACL3A10R + (heth->Instance)->MACL3A10R = pL3L4FilterConfig->L3[0].IPV4.DestAddr; + + // MACL3A20R + (heth->Instance)->MACL3A20R = 0; + + // MACL3A30R + (heth->Instance)->MACL3A30R = 0; + } + + // MACL4A0R + tmpreg = 0; + + tmpreg |= pL3L4FilterConfig->L4[0].DestPort << ETH_MACL4A0R_L4DP0_Pos; + + tmpreg |= pL3L4FilterConfig->L4[0].SourPort << ETH_MACL4A0R_L4SP0_Pos; + + (heth->Instance)->MACL4A0R = tmpreg; + + // MACL3L4C1R + tmpreg = 0U; + + if (pL3L4FilterConfig->L4[1].ProtocolUDP != DISABLE) + tmpreg |= ETH_MACL3L4C1R_L4PEN1; + + if (pL3L4FilterConfig->L4[1].DestPortMatchEnable != DISABLE) + { + tmpreg |= ETH_MACL3L4C1R_L4DPM1; + + if (pL3L4FilterConfig->L4[1].DestPortInverseMatch != DISABLE) + tmpreg |= ETH_MACL3L4C1R_L4DPIM1; + } + + if (pL3L4FilterConfig->L4[1].SourPortMatchEnable != DISABLE) + { + tmpreg |= ETH_MACL3L4C1R_L4SPM1; + + if (pL3L4FilterConfig->L4[1].SourPortInverseMatch != DISABLE) + tmpreg |= ETH_MACL3L4C1R_L4SPIM1; + } + + if (pL3L4FilterConfig->L3[1].ProtocolIPV6 != DISABLE) + { + tmpreg |= ETH_MACL3L4C1R_L3PEN1; + + assert_param(IS_ETH_IPV6_ADDR_MASK(pL3L4FilterConfig->L3[1].IPV6.AddrMatch)); + + tmpreg |= pL3L4FilterConfig->L3[1].IPV6.AddrMatch << ETH_MACL3L4C1R_L3HSBM1_Pos; + + if (pL3L4FilterConfig->L3[1].IPV6.DestAddrMatchEnable != DISABLE) + { + tmpreg |= ETH_MACL3L4C1R_L3DAM1; + + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L3[1].IPV6.DestAddrInverseMatch)); + + if (pL3L4FilterConfig->L3[1].IPV6.DestAddrInverseMatch != DISABLE) + tmpreg |= ETH_MACL3L4C1R_L3DAIM1; + } + + if (pL3L4FilterConfig->L3[1].IPV6.SourAddrMatchEnable != DISABLE) + { + tmpreg |= ETH_MACL3L4C1R_L3SAM1; + + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L3[1].IPV6.DestAddrInverseMatch)); + + if (pL3L4FilterConfig->L3[1].IPV6.SourAddrInverseMatch != DISABLE) + tmpreg |= ETH_MACL3L4C1R_L3SAIM1; + } + + (heth->Instance)->MACL3L4C1R = tmpreg; + + // MACL3A01R + (heth->Instance)->MACL3A01R = pL3L4FilterConfig->L3[1].IPV6.Addr[0]; + + // MACL3A11R + (heth->Instance)->MACL3A11R = pL3L4FilterConfig->L3[1].IPV6.Addr[1]; + + // MACL3A21R + (heth->Instance)->MACL3A21R = pL3L4FilterConfig->L3[1].IPV6.Addr[2]; + + // MACL3A31R + (heth->Instance)->MACL3A31R = pL3L4FilterConfig->L3[1].IPV6.Addr[3]; + } + else + { + assert_param(IS_ETH_IPV4_SOUR_ADDR_MASK(pL3L4FilterConfig->L3[1].IPV4.SourAddrMatch)); + assert_param(IS_ETH_IPV4_DEST_ADDR_MASK(pL3L4FilterConfig->L3[1].IPV4.DestAddrMatch)); + + tmpreg |= pL3L4FilterConfig->L3[1].IPV4.DestAddrMatch << ETH_MACL3L4C1R_L3HDBM1_Pos; + + tmpreg |= pL3L4FilterConfig->L3[1].IPV4.SourAddrMatch << ETH_MACL3L4C1R_L3HSBM1_Pos; + + if (pL3L4FilterConfig->L3[1].IPV4.DestAddrMatchEnable != DISABLE) + { + tmpreg |= ETH_MACL3L4C1R_L3DAM1; + + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L3[1].IPV4.DestAddrInverseMatch)); + + if (pL3L4FilterConfig->L3[1].IPV4.DestAddrInverseMatch != DISABLE) + tmpreg |= ETH_MACL3L4C1R_L3DAIM1; + } + + if (pL3L4FilterConfig->L3[1].IPV4.SourAddrMatchEnable != DISABLE) + { + tmpreg |= ETH_MACL3L4C1R_L3SAM1; + + assert_param(IS_FUNCTIONAL_STATE(pL3L4FilterConfig->L3[1].IPV4.SourAddrInverseMatch)); + + if (pL3L4FilterConfig->L3[1].IPV4.SourAddrInverseMatch != DISABLE) + tmpreg |= ETH_MACL3L4C1R_L3SAIM1; + } + + (heth->Instance)->MACL3L4C1R = tmpreg; + + // MACL3A01R + (heth->Instance)->MACL3A01R = pL3L4FilterConfig->L3[1].IPV4.SourAddr; + + // MACL3A11R + (heth->Instance)->MACL3A11R = pL3L4FilterConfig->L3[1].IPV4.DestAddr; + + // MACL3A21R + (heth->Instance)->MACL3A21R = 0; + + // MACL3A31R + (heth->Instance)->MACL3A31R = 0; + } + + // MACL4A1R + tmpreg = 0; + + tmpreg |= pL3L4FilterConfig->L4[1].DestPort << ETH_MACL4A1R_L4DP1_Pos; + + tmpreg |= pL3L4FilterConfig->L4[1].SourPort << ETH_MACL4A1R_L4SP1_Pos; + + (heth->Instance)->MACL4A1R = tmpreg; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetL3L4FilterDefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitL3L4FilterDefaultParamter(heth); + + return HAL_ETH_SetL3L4FilterConfig(heth); +} + +HAL_StatusTypeDef HAL_ETH_InitFilterDefaultParamter(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitAddrFilterDefaultParamter(heth); + HAL_ETH_InitVLANFilterDefaultParamter(heth); + HAL_ETH_InitL3L4FilterDefaultParamter(heth); + heth->FilterConfig.DropNonTCPUDP = DISABLE; + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_GetFilterConfig(ETH_HandleTypeDef *heth) +{ + if (heth == NULL) + return (HAL_ERROR); + + if (HAL_ETH_GetAddrFilterConfig(heth) != HAL_OK) + return (HAL_ERROR); + + if (HAL_ETH_GetVLANFilterConfig(heth) != HAL_OK) + return (HAL_ERROR); + + if (HAL_ETH_GetL3L4FilterConfig(heth) != HAL_OK) + return (HAL_ERROR); + + if (heth->Instance->MACFFR & ETH_MACFFR_DNTU) + heth->FilterConfig.DropNonTCPUDP = ENABLE; + else + heth->FilterConfig.DropNonTCPUDP = DISABLE; + + return HAL_OK; +} + + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_ConfigMAC(ETH_HandleTypeDef *heth, ETH_MACInitTypeDef *pMACConfig); +// MAC +// hethETH_HandleTypeDefṹָ룻 +// dmaconfýṹָ룻 +// ޣ +// HAL_OKóɹ +// ע +// **************************************************************************** +HAL_StatusTypeDef HAL_ETH_SetFilterConfig(ETH_HandleTypeDef *heth) +{ + assert_param(IS_FUNCTIONAL_STATE(heth->FilterConfig.DropNonTCPUDP)); + + if (heth == NULL) + return (HAL_ERROR); + + if (HAL_ETH_SetAddrFilterConfig(heth) != HAL_OK) + return (HAL_ERROR); + + if (HAL_ETH_SetVLANFilterConfig(heth) != HAL_OK) + return (HAL_ERROR); + + if (HAL_ETH_SetL3L4FilterConfig(heth) != HAL_OK) + return (HAL_ERROR); + + if (heth->FilterConfig.DropNonTCPUDP == DISABLE) + heth->Instance->MACFFR &= ~ETH_MACFFR_DNTU; + else + heth->Instance->MACFFR |= ETH_MACFFR_DNTU; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetFilterDefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitFilterDefaultParamter(heth); + + return HAL_ETH_SetFilterConfig(heth); +} + +// **************************************************************************** +// +// VLAN +// +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_InitVLANDefaultParamter(ETH_HandleTypeDef *heth) +{ + ETH_VLANTypeDef *pVLANConfig = &heth->MACConfig.VLAN; + + pVLANConfig->Enable = DISABLE; + pVLANConfig->Mode = ETH_VLAN_MODE_NONE; + pVLANConfig->SVLAN = DISABLE; + pVLANConfig->Tag = 0; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_GetVLANConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + ETH_VLANTypeDef *pVLANConfig = &heth->MACConfig.VLAN; + + if (heth == NULL) + return (HAL_ERROR); + + memset((void *)pVLANConfig, 0, sizeof(ETH_VLANTypeDef)); + + // MACVTIRR + tmpreg = (heth->Instance)->MACVTIRR; + + if (tmpreg & ETH_MACVTIRR_CSVL) + pVLANConfig->SVLAN = ENABLE; + else + pVLANConfig->SVLAN = DISABLE; + + if (tmpreg & ETH_MACVTIRR_VLP) + pVLANConfig->Enable = ENABLE; + else + pVLANConfig->Enable = DISABLE; + + pVLANConfig->Mode = (tmpreg & ETH_MACVTIRR_VLC) >> ETH_MACVTIRR_VLC_Pos; + + pVLANConfig->Tag = (tmpreg & ETH_MACVTIRR_VLT) >> ETH_MACVTIRR_VLT_Pos; + + return HAL_OK; +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_ConfigMAC(ETH_HandleTypeDef *heth, ETH_MACInitTypeDef *pMACConfig); +// MAC +// hethETH_HandleTypeDefṹָ룻 +// dmaconfýṹָ룻 +// ޣ +// HAL_OKóɹ +// ע +// **************************************************************************** +HAL_StatusTypeDef HAL_ETH_SetVLANConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + ETH_VLANTypeDef *pVLANConfig = &heth->MACConfig.VLAN; + + if (heth == NULL) + return (HAL_ERROR); + + assert_param(IS_FUNCTIONAL_STATE(pVLANConfig->Enable)); + assert_param(IS_FUNCTIONAL_STATE(pVLANConfig->SVLAN)); + assert_param(IS_ETH_VLAN_MODE(pVLANConfig->Mode)); + assert_param(IS_ETH_VLAN_TAG(pVLANConfig->Tag)); + + // MACVTIRR + tmpreg = 0; + + if (pVLANConfig->SVLAN != DISABLE) + tmpreg |= ETH_MACVTIRR_CSVL; + + if (pVLANConfig->Enable != DISABLE) + tmpreg |= ETH_MACVTIRR_VLP; + + tmpreg |= pVLANConfig->Mode << ETH_MACVTIRR_VLC_Pos; + + tmpreg |= pVLANConfig->Tag << ETH_MACVTIRR_VLT_Pos; + + (heth->Instance)->MACVTIRR = (uint32_t)tmpreg; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetVLANDefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitVLANDefaultParamter(heth); + + return HAL_ETH_SetVLANConfig(heth); +} + +// **************************************************************************** +// +// MAC +// +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_InitMACDefaultParamter(ETH_HandleTypeDef *heth) +{ + // MACĬֵ + + heth->MACConfig.SourceAddrControl = ETH_SOURCE_ADDRESS_REPLACE_ADDR0; // ãԴַ滻MACַ1Ĵ + heth->MACConfig.Support2KPacket = ENABLE; // ֹ2KݰIEEE 802.3as ֧ + heth->MACConfig.CRCStripTypePacket = ENABLE; // ֹ֡ CRC ȥ + heth->MACConfig.Watchdog = DISABLE; // ʹܣտŹ + heth->MACConfig.WatchdogTimeout = 1523U; // ãտŹʱ + heth->MACConfig.Jabber = DISABLE; // ʹܣjabberʱ + heth->MACConfig.JumboPacket = ENABLE; // ֹݰʹ + heth->MACConfig.InterFrameGap = ETH_INTERFRAME_GAP_96BIT; // ã֡96λ + heth->MACConfig.CarrierSense = DISABLE; // ʹܣز + heth->MACConfig.ReceiveOwn = ENABLE; // ʹܣ + heth->MACConfig.LoopbackMode = DISABLE; // ֹģʽ + heth->MACConfig.ChecksumOffload = ENABLE; // ã֡ TCP/UDP/ICMP ͷ IPv4 Уͼ + heth->MACConfig.RetryTransmission = ENABLE; // ʹܣ + heth->MACConfig.AutoPadCRCStrip = ENABLE; // ֹԶȥPADFCSֶ + heth->MACConfig.BackOffLimit = ETH_BACK_OFF_LIMIT_10; // ã10λ + heth->MACConfig.DeferralCheck = DISABLE; // ֹӳ + heth->MACConfig.PreambleLen = ETH_PREAMBLE_LEN_7B; // ֹͷ7ֽ + + HAL_ETH_InitVLANDefaultParamter(heth); + + return HAL_OK; +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_GetMACConfig(ETH_HandleTypeDef *heth, ETH_MACInitTypeDef *pMACConfig); +// ȡMAC +// hethETH_HandleTypeDefṹָ룻 +// pMACConfigýṹָ룻 +// HAL_OKȡóɹ +// HAL_ERRORȡʧܣ +// ע +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_GetMACConfig(ETH_HandleTypeDef *heth) +{ + uint32_t err; + volatile uint32_t tmpreg = 0; + ETH_MACInitTypeDef *pMACConfig = &heth->MACConfig; + + if (heth == NULL) + return (HAL_ERROR); + + memset((void *)pMACConfig, 0, sizeof(ETH_MACInitTypeDef)); + err = 0; + + // MACCR + tmpreg = (heth->Instance)->MACCR; + + if ((tmpreg & ETH_MACCR_SARC_1) == 0) + pMACConfig->SourceAddrControl = ETH_SOURCE_ADDRESS_DISABLE; + else if ((tmpreg & ETH_MACCR_SARC) == (ETH_MACCR_SARC_1)) + pMACConfig->SourceAddrControl = ETH_SOURCE_ADDRESS_INSERT_ADDR0; + else if ((tmpreg & ETH_MACCR_SARC) == (ETH_MACCR_SARC_2 | ETH_MACCR_SARC_1)) + pMACConfig->SourceAddrControl = ETH_SOURCE_ADDRESS_INSERT_ADDR1; + else if ((tmpreg & ETH_MACCR_SARC) == (ETH_MACCR_SARC_1 | ETH_MACCR_SARC_0)) + pMACConfig->SourceAddrControl = ETH_SOURCE_ADDRESS_REPLACE_ADDR0; + else if ((tmpreg & ETH_MACCR_SARC) == (ETH_MACCR_SARC_2 | ETH_MACCR_SARC_1 | ETH_MACCR_SARC_0)) + pMACConfig->SourceAddrControl = ETH_SOURCE_ADDRESS_REPLACE_ADDR1; + + if (tmpreg & ETH_MACCR_S2KP) + pMACConfig->Support2KPacket = ENABLE; + else + pMACConfig->Support2KPacket = DISABLE; + + if (tmpreg & ETH_MACCR_CSTF) + pMACConfig->CRCStripTypePacket = ENABLE; + else + pMACConfig->CRCStripTypePacket = DISABLE; + + if (((tmpreg & ETH_MACCR_WD) == 0) && ((heth->Instance)->MACWTR & ETH_MACWTR_PWE)) + pMACConfig->Watchdog = ENABLE; + else + pMACConfig->Watchdog = DISABLE; + + if (tmpreg & ETH_MACCR_JD) + pMACConfig->Jabber = ENABLE; + else + pMACConfig->Jabber = DISABLE; + + if (tmpreg & ETH_MACCR_JE) + pMACConfig->JumboPacket = ENABLE; + else + pMACConfig->JumboPacket = DISABLE; + + if ((tmpreg & ETH_MACCR_IFG) == 0) + pMACConfig->InterFrameGap = ETH_INTERFRAME_GAP_96BIT; + else if ((tmpreg & ETH_MACCR_IFG) == ETH_MACCR_IFG_0) + pMACConfig->InterFrameGap = ETH_INTERFRAME_GAP_88BIT; + else if ((tmpreg & ETH_MACCR_IFG) == ETH_MACCR_IFG_1) + pMACConfig->InterFrameGap = ETH_INTERFRAME_GAP_80BIT; + else if ((tmpreg & ETH_MACCR_IFG) == (ETH_MACCR_IFG_1 | ETH_MACCR_IFG_0)) + pMACConfig->InterFrameGap = ETH_INTERFRAME_GAP_72BIT; + else if ((tmpreg & ETH_MACCR_IFG) == ETH_MACCR_IFG_2) + pMACConfig->InterFrameGap = ETH_INTERFRAME_GAP_64BIT; + else if ((tmpreg & ETH_MACCR_IFG) == (ETH_MACCR_IFG_2 | ETH_MACCR_IFG_0)) + pMACConfig->InterFrameGap = ETH_INTERFRAME_GAP_56BIT; + else if ((tmpreg & ETH_MACCR_IFG) == (ETH_MACCR_IFG_2 | ETH_MACCR_IFG_1)) + pMACConfig->InterFrameGap = ETH_INTERFRAME_GAP_48BIT; + else if ((tmpreg & ETH_MACCR_IFG) == (ETH_MACCR_IFG_2 | ETH_MACCR_IFG_1 | ETH_MACCR_IFG_0)) + pMACConfig->InterFrameGap = ETH_INTERFRAME_GAP_40BIT; + + if (tmpreg & ETH_MACCR_CSD) + pMACConfig->JumboPacket = DISABLE; + else + pMACConfig->JumboPacket = ENABLE; + + if (tmpreg & ETH_MACCR_ROD) + pMACConfig->ReceiveOwn = DISABLE; + else + pMACConfig->ReceiveOwn = ENABLE; + + if (tmpreg & ETH_MACCR_LM) + pMACConfig->LoopbackMode = ENABLE; + else + pMACConfig->LoopbackMode = DISABLE; + + if (tmpreg & ETH_MACCR_IPCO) + pMACConfig->ChecksumOffload = ENABLE; + else + pMACConfig->ChecksumOffload = DISABLE; + + if (tmpreg & ETH_MACCR_DR) + pMACConfig->RetryTransmission = DISABLE; + else + pMACConfig->RetryTransmission = ENABLE; + + if (tmpreg & ETH_MACCR_APCS) + pMACConfig->AutoPadCRCStrip = ENABLE; + else + pMACConfig->AutoPadCRCStrip = DISABLE; + + if ((tmpreg & ETH_MACCR_BL) == 0) + pMACConfig->BackOffLimit = ETH_BACK_OFF_LIMIT_10; + else if ((tmpreg & ETH_MACCR_BL) == ETH_MACCR_BL_0) + pMACConfig->BackOffLimit = ETH_BACK_OFF_LIMIT_8; + else if ((tmpreg & ETH_MACCR_BL) == ETH_MACCR_BL_1) + pMACConfig->BackOffLimit = ETH_BACK_OFF_LIMIT_4; + else if ((tmpreg & ETH_MACCR_BL) == (ETH_MACCR_BL_1 | ETH_MACCR_BL_0)) + pMACConfig->BackOffLimit = ETH_BACK_OFF_LIMIT_1; + + if (tmpreg & ETH_MACCR_DC) + pMACConfig->DeferralCheck = ENABLE; + else + pMACConfig->DeferralCheck = DISABLE; + + if ((tmpreg & ETH_MACCR_PRELEN) == 0) + pMACConfig->PreambleLen = ETH_PREAMBLE_LEN_7B; + else if ((tmpreg & ETH_MACCR_BL) == ETH_MACCR_PRELEN_0) + pMACConfig->PreambleLen = ETH_PREAMBLE_LEN_5B; + else if ((tmpreg & ETH_MACCR_BL) == ETH_MACCR_PRELEN_1) + pMACConfig->PreambleLen = ETH_PREAMBLE_LEN_3B; + else + err = 1; + + // MACWTR + pMACConfig->WatchdogTimeout = ((heth->Instance)->MACWTR & ETH_MACWTR_WTO) >> ETH_MACWTR_WTO_Pos; + + err |= HAL_ETH_GetVLANConfig(heth); + + if (err == 0) + return HAL_OK; + else + return HAL_ERROR; +} + + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_ConfigMAC(ETH_HandleTypeDef *heth, ETH_MACInitTypeDef *pMACConfig); +// MAC +// hethETH_HandleTypeDefṹָ룻 +// dmaconfýṹָ룻 +// ޣ +// HAL_OKóɹ +// ע +// **************************************************************************** +HAL_StatusTypeDef HAL_ETH_SetMACConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg = 0; + ETH_MACInitTypeDef *pMACConfig = &heth->MACConfig; + + if (heth == NULL) + return (HAL_ERROR); + + assert_param(IS_ETH_SOURCE_ADDR_CONTROL(pMACConfig->SourceAddrControl)); + assert_param(IS_FUNCTIONAL_STATE(pMACConfig->Support2KPacket)); + assert_param(IS_FUNCTIONAL_STATE(pMACConfig->CRCStripTypePacket)); + assert_param(IS_FUNCTIONAL_STATE(pMACConfig->Watchdog)); + assert_param(IS_FUNCTIONAL_STATE(pMACConfig->Jabber)); + assert_param(IS_FUNCTIONAL_STATE(pMACConfig->JumboPacket)); + assert_param(IS_ETH_INTERFRAME_GAP(pMACConfig->InterFrameGap)); + assert_param(IS_FUNCTIONAL_STATE(pMACConfig->CarrierSense)); + assert_param(IS_FUNCTIONAL_STATE(pMACConfig->ReceiveOwn)); + assert_param(IS_FUNCTIONAL_STATE(pMACConfig->LoopbackMode)); + assert_param(IS_FUNCTIONAL_STATE(pMACConfig->ChecksumOffload)); + assert_param(IS_FUNCTIONAL_STATE(pMACConfig->RetryTransmission)); + assert_param(IS_FUNCTIONAL_STATE(pMACConfig->AutoPadCRCStrip)); + assert_param(IS_ETH_BACK_OFF_LIMIT(pMACConfig->BackOffLimit)); + assert_param(IS_FUNCTIONAL_STATE(pMACConfig->DeferralCheck)); + assert_param(IS_ETH_PREAMBLE_LEN(pMACConfig->PreambleLen)); + + // MACCR + tmpreg = (heth->Instance)->MACCR; + tmpreg &= 0x8520c90c; + + if (pMACConfig->SourceAddrControl == ETH_SOURCE_ADDRESS_DISABLE) + tmpreg |= 0U; + if (pMACConfig->SourceAddrControl == ETH_SOURCE_ADDRESS_INSERT_ADDR0) + tmpreg |= ETH_MACCR_SARC_1; + if (pMACConfig->SourceAddrControl == ETH_SOURCE_ADDRESS_INSERT_ADDR1) + tmpreg |= ETH_MACCR_SARC_2 | ETH_MACCR_SARC_1; + if (pMACConfig->SourceAddrControl == ETH_SOURCE_ADDRESS_REPLACE_ADDR0) + tmpreg |= ETH_MACCR_SARC_1 | ETH_MACCR_SARC_0; + if (pMACConfig->SourceAddrControl == ETH_SOURCE_ADDRESS_REPLACE_ADDR1) + tmpreg |= ETH_MACCR_SARC_2 | ETH_MACCR_SARC_1 | ETH_MACCR_SARC_0; + + if (pMACConfig->Support2KPacket != DISABLE) + tmpreg |= ETH_MACCR_S2KP; + + if (pMACConfig->CRCStripTypePacket != DISABLE) + tmpreg |= ETH_MACCR_CSTF; + + if (pMACConfig->Watchdog == DISABLE) + tmpreg |= ETH_MACCR_WD; + + if (pMACConfig->Jabber != DISABLE) + tmpreg |= ETH_MACCR_JD; + + if (pMACConfig->JumboPacket != DISABLE) + tmpreg |= ETH_MACCR_JE; + + if (pMACConfig->InterFrameGap == ETH_INTERFRAME_GAP_96BIT) + tmpreg |= 0U; + else if (pMACConfig->InterFrameGap == ETH_INTERFRAME_GAP_88BIT) + tmpreg |= ETH_MACCR_IFG_0; + else if (pMACConfig->InterFrameGap == ETH_INTERFRAME_GAP_80BIT) + tmpreg |= ETH_MACCR_IFG_1; + else if (pMACConfig->InterFrameGap == ETH_INTERFRAME_GAP_72BIT) + tmpreg |= ETH_MACCR_IFG_1 | ETH_MACCR_IFG_0; + else if (pMACConfig->InterFrameGap == ETH_INTERFRAME_GAP_64BIT) + tmpreg |= ETH_MACCR_IFG_2; + else if (pMACConfig->InterFrameGap == ETH_INTERFRAME_GAP_56BIT) + tmpreg |= ETH_MACCR_IFG_2 | ETH_MACCR_IFG_0; + else if (pMACConfig->InterFrameGap == ETH_INTERFRAME_GAP_48BIT) + tmpreg |= ETH_MACCR_IFG_2 | ETH_MACCR_IFG_1; + else if (pMACConfig->InterFrameGap == ETH_INTERFRAME_GAP_40BIT) + tmpreg |= ETH_MACCR_IFG_2 | ETH_MACCR_IFG_1 | ETH_MACCR_IFG_0; + + if (pMACConfig->CarrierSense == DISABLE) + tmpreg |= ETH_MACCR_CSD; + + if (pMACConfig->ReceiveOwn == DISABLE) + tmpreg |= ETH_MACCR_ROD; + + if (pMACConfig->LoopbackMode != DISABLE) + tmpreg |= ETH_MACCR_LM; + + if (pMACConfig->ChecksumOffload != DISABLE) + tmpreg |= ETH_MACCR_IPCO; + + if (pMACConfig->RetryTransmission == DISABLE) + tmpreg |= ETH_MACCR_DR; + + if (pMACConfig->AutoPadCRCStrip != DISABLE) + tmpreg |= ETH_MACCR_APCS; + + if (pMACConfig->BackOffLimit == ETH_BACK_OFF_LIMIT_10) + tmpreg |= 0U; + else if (pMACConfig->BackOffLimit == ETH_BACK_OFF_LIMIT_8) + tmpreg |= ETH_MACCR_BL_0; + else if (pMACConfig->BackOffLimit == ETH_BACK_OFF_LIMIT_4) + tmpreg |= ETH_MACCR_BL_1; + else if (pMACConfig->BackOffLimit == ETH_BACK_OFF_LIMIT_1) + tmpreg |= ETH_MACCR_BL_1 | ETH_MACCR_BL_1; + + if (pMACConfig->DeferralCheck != DISABLE) + tmpreg |= ETH_MACCR_DC; + + if (pMACConfig->PreambleLen == ETH_PREAMBLE_LEN_7B) + tmpreg |= 0U; + else if (pMACConfig->PreambleLen == ETH_PREAMBLE_LEN_5B) + tmpreg |= ETH_MACCR_PRELEN_0; + else if (pMACConfig->PreambleLen == ETH_PREAMBLE_LEN_3B) + tmpreg |= ETH_MACCR_PRELEN_1; + + (heth->Instance)->MACCR = (uint32_t)tmpreg; + + // MACWTR + if (pMACConfig->Watchdog) + (heth->Instance)->MACWTR = ETH_MACWTR_PWE | ((pMACConfig->WatchdogTimeout << ETH_MACWTR_WTO_Pos) & ETH_MACWTR_WTO); + else + (heth->Instance)->MACWTR = (pMACConfig->WatchdogTimeout << ETH_MACWTR_WTO_Pos) & ETH_MACWTR_WTO; + + // VLAN + HAL_ETH_SetVLANConfig(heth); + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetMACDefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitMACDefaultParamter(heth); + + return HAL_ETH_SetMACConfig(heth); +} + +HAL_StatusTypeDef HAL_ETH_InitDMADefaultParamter(ETH_HandleTypeDef *heth) +{ +// memset((void *)&heth->DMAConfig, 0, sizeof(ETH_DMAInitTypeDef)); + + // DMAĬֵ + heth->DMAConfig.DropTCPIPChecksumErrorFrame = ENABLE; //ֹTCP/IPУ֡ + heth->DMAConfig.ReceiveStoreForward = ENABLE; //ʹܣմ洢ת + heth->DMAConfig.FlushReceivedFrame = ENABLE; //ֹֹˢ½֡ + heth->DMAConfig.TransmitStoreForward = ENABLE; //ʹܣʹ洢ת + heth->DMAConfig.TransmitThresholdControl = ETH_TRANSMIT_THRESHOLD_CONTROL_64BYTES; //ãֵƣ64ֽ + heth->DMAConfig.ForwardErrorFrames = DISABLE; //ֹת֡ + heth->DMAConfig.ForwardUndersizedGoodFrames = DISABLE; //ֹתСĺ֡ + heth->DMAConfig.ReceiveThresholdControl = ETH_RECEIVED_THRESHOLD_CONTROL_64BYTES; //ãֵƣ64ֽ + heth->DMAConfig.SecondFrameOperate = ENABLE; //ʹܣڶ֡ + + heth->DMAConfig.MixedBurst = DISABLE; //ֹͻ + heth->DMAConfig.AddressAlignedBeats = ENABLE; //ʹܣַ + heth->DMAConfig.PBL8xMode = DISABLE; //ֹ 8xPBL ģʽ + heth->DMAConfig.UseSeparatePBL = ENABLE; //ֹ ʹõ PBL + heth->DMAConfig.RxDMABurstLen = ETH_RX_DMA_BURST_LEN_32BEAT; //ã DMAͻճ:32ֽ + heth->DMAConfig.FixedBurst = ENABLE; //ʹܣ̶ͻ + heth->DMAConfig.RxTxPriorityRatio = ETH_RX_TX_PRIORITY_RATIO_4_1; //ã Rx Tx ȼ + heth->DMAConfig.TxDMABurstLen = ETH_TX_DMA_BURST_LEN_32BEAT; //ã DMAͻͳȣ32ֽ + heth->DMAConfig.EnhancedDescriptorFormat = ENABLE; //ʹܣǿʽ + heth->DMAConfig.DescriptorSkipLen = 0x02; //ãȣ0 + heth->DMAConfig.DMAArbitration = ETH_DMA_ARBITRATION_ROUNDROBIN; //ã DMAٲãѭ + + return HAL_OK; +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_GetDMAConfig(ETH_HandleTypeDef *heth, ETH_DMAInitTypeDef *pDMAConfig); +// ȡDMA +// hethETH_HandleTypeDefṹָ룻 +// pDMAConfigýṹָ룻 +// HAL_OKȡóɹ +// HAL_ERRORȡʧܣ +// ע +// **************************************************************************** +HAL_StatusTypeDef HAL_ETH_GetDMAConfig(ETH_HandleTypeDef *heth) +{ + uint32_t err; + volatile uint32_t tmpreg = 0; + ETH_DMAInitTypeDef *pDMAConfig = &heth->DMAConfig; + + if (heth == NULL) + return (HAL_ERROR); + + err = 0; + + // DMAOMR + tmpreg = (heth->Instance)->DMAOMR; + + if (tmpreg & ETH_DMAOMR_DTCEFD) + pDMAConfig->DropTCPIPChecksumErrorFrame = ENABLE; + else + pDMAConfig->DropTCPIPChecksumErrorFrame = DISABLE; + + if (tmpreg & ETH_DMAOMR_RSF) + pDMAConfig->ReceiveStoreForward = ENABLE; + else + pDMAConfig->ReceiveStoreForward = DISABLE; + + if (tmpreg & ETH_DMAOMR_DFRF) + pDMAConfig->FlushReceivedFrame = DISABLE; + else + pDMAConfig->FlushReceivedFrame = ENABLE; + + if (tmpreg & ETH_DMAOMR_TSF) + pDMAConfig->TransmitStoreForward = ENABLE; + else + pDMAConfig->TransmitStoreForward = DISABLE; + + if ((tmpreg & ETH_DMAOMR_TTC) == 0) + pDMAConfig->TransmitThresholdControl = ETH_TRANSMIT_THRESHOLD_CONTROL_64BYTES; + else if ((tmpreg & ETH_DMAOMR_TTC) == ETH_DMAOMR_TTC_0) + pDMAConfig->TransmitThresholdControl = ETH_TRANSMIT_THRESHOLD_CONTROL_128BYTES; + else if ((tmpreg & ETH_DMAOMR_TTC) == ETH_DMAOMR_TTC_1) + pDMAConfig->TransmitThresholdControl = ETH_TRANSMIT_THRESHOLD_CONTROL_192BYTES; + else if ((tmpreg & ETH_DMAOMR_TTC) == (ETH_DMAOMR_TTC_1 | ETH_DMAOMR_TTC_0)) + pDMAConfig->TransmitThresholdControl = ETH_TRANSMIT_THRESHOLD_CONTROL_256BYTES; + else if ((tmpreg & ETH_DMAOMR_TTC) == ETH_DMAOMR_TTC_2) + pDMAConfig->TransmitThresholdControl = ETH_TRANSMIT_THRESHOLD_CONTROL_40BYTES; + else if ((tmpreg & ETH_DMAOMR_TTC) == (ETH_DMAOMR_TTC_2 | ETH_DMAOMR_TTC_0)) + pDMAConfig->TransmitThresholdControl = ETH_TRANSMIT_THRESHOLD_CONTROL_32BYTES; + else if ((tmpreg & ETH_DMAOMR_TTC) == (ETH_DMAOMR_TTC_2 | ETH_DMAOMR_TTC_1)) + pDMAConfig->TransmitThresholdControl = ETH_TRANSMIT_THRESHOLD_CONTROL_24BYTES; + else if ((tmpreg & ETH_DMAOMR_TTC) == (ETH_DMAOMR_TTC_2 | ETH_DMAOMR_TTC_1 | ETH_DMAOMR_TTC_0)) + pDMAConfig->TransmitThresholdControl = ETH_TRANSMIT_THRESHOLD_CONTROL_16BYTES; + + if (tmpreg & ETH_DMAOMR_FEF) + pDMAConfig->ForwardErrorFrames = ENABLE; + else + pDMAConfig->ForwardErrorFrames = DISABLE; + + if (tmpreg & ETH_DMAOMR_FUGF) + pDMAConfig->ForwardUndersizedGoodFrames = ENABLE; + else + pDMAConfig->ForwardUndersizedGoodFrames = DISABLE; + + if ((tmpreg & ETH_DMAOMR_RTC) == 0) + pDMAConfig->ReceiveThresholdControl = ETH_RECEIVED_THRESHOLD_CONTROL_64BYTES; + else if ((tmpreg & ETH_DMAOMR_RTC) == ETH_DMAOMR_RTC_0) + pDMAConfig->ReceiveThresholdControl = ETH_RECEIVED_THRESHOLD_CONTROL_32BYTES; + else if ((tmpreg & ETH_DMAOMR_RTC) == ETH_DMAOMR_RTC_1) + pDMAConfig->ReceiveThresholdControl = ETH_RECEIVED_THRESHOLD_CONTROL_96BYTES; + else if ((tmpreg & ETH_DMAOMR_RTC) == (ETH_DMAOMR_RTC_1 | ETH_DMAOMR_RTC_0)) + pDMAConfig->ReceiveThresholdControl = ETH_RECEIVED_THRESHOLD_CONTROL_128BYTES; + + + if (tmpreg & ETH_DMAOMR_OSF) + pDMAConfig->SecondFrameOperate = ENABLE; + else + pDMAConfig->SecondFrameOperate = DISABLE; + + // DMABMR + tmpreg = (heth->Instance)->DMABMR; + + if (tmpreg & ETH_DMABMR_MB) + pDMAConfig->MixedBurst = ENABLE; + else + pDMAConfig->MixedBurst = DISABLE; + + if (tmpreg & ETH_DMABMR_AAB) + pDMAConfig->AddressAlignedBeats = ENABLE; + else + pDMAConfig->AddressAlignedBeats = DISABLE; + + if (tmpreg & ETH_DMABMR_EPM) + pDMAConfig->PBL8xMode = ENABLE; + else + pDMAConfig->PBL8xMode = DISABLE; + + if (tmpreg & ETH_DMABMR_USP) + pDMAConfig->UseSeparatePBL = ENABLE; + else + pDMAConfig->UseSeparatePBL = DISABLE; + + if ((tmpreg & ETH_DMABMR_RDP) == ETH_DMABMR_RDP_0) + pDMAConfig->RxDMABurstLen = ETH_RX_DMA_BURST_LEN_1BEAT; + else if ((tmpreg & ETH_DMABMR_RDP) == ETH_DMABMR_RDP_1) + pDMAConfig->RxDMABurstLen = ETH_RX_DMA_BURST_LEN_2BEAT; + else if ((tmpreg & ETH_DMABMR_RDP) == ETH_DMABMR_RDP_2) + pDMAConfig->RxDMABurstLen = ETH_RX_DMA_BURST_LEN_4BEAT; + else if ((tmpreg & ETH_DMABMR_RDP) == (ETH_DMABMR_RDP_3)) + pDMAConfig->RxDMABurstLen = ETH_RX_DMA_BURST_LEN_8BEAT; + else if ((tmpreg & ETH_DMABMR_RDP) == (ETH_DMABMR_RDP_4)) + pDMAConfig->RxDMABurstLen = ETH_RX_DMA_BURST_LEN_16BEAT; + else if ((tmpreg & ETH_DMABMR_RDP) == (ETH_DMABMR_RDP_5)) + pDMAConfig->RxDMABurstLen = ETH_RX_DMA_BURST_LEN_32BEAT; + else + err = 1; + + if (tmpreg & ETH_DMABMR_FB) + pDMAConfig->FixedBurst = ENABLE; + else + pDMAConfig->FixedBurst = DISABLE; + + if ((tmpreg & ETH_DMAOMR_RTC) == 0) + pDMAConfig->RxTxPriorityRatio = ETH_RX_TX_PRIORITY_RATIO_1_1; + else if ((tmpreg & ETH_DMAOMR_RTC) == ETH_DMABMR_PM_0) + pDMAConfig->RxTxPriorityRatio = ETH_RX_TX_PRIORITY_RATIO_2_1; + else if ((tmpreg & ETH_DMAOMR_RTC) == ETH_DMABMR_PM_1) + pDMAConfig->RxTxPriorityRatio = ETH_RX_TX_PRIORITY_RATIO_3_1; + else if ((tmpreg & ETH_DMAOMR_RTC) == (ETH_DMABMR_PM_1 | ETH_DMABMR_PM_0)) + pDMAConfig->RxTxPriorityRatio = ETH_RX_TX_PRIORITY_RATIO_4_1; + else + err = 1; + + if ((tmpreg & ETH_DMABMR_RDP) == ETH_DMABMR_PBL_0) + pDMAConfig->TxDMABurstLen = ETH_RX_DMA_BURST_LEN_1BEAT; + else if ((tmpreg & ETH_DMABMR_RDP) == ETH_DMABMR_PBL_1) + pDMAConfig->TxDMABurstLen = ETH_RX_DMA_BURST_LEN_2BEAT; + else if ((tmpreg & ETH_DMABMR_RDP) == ETH_DMABMR_PBL_2) + pDMAConfig->TxDMABurstLen = ETH_RX_DMA_BURST_LEN_4BEAT; + else if ((tmpreg & ETH_DMABMR_RDP) == (ETH_DMABMR_PBL_3)) + pDMAConfig->TxDMABurstLen = ETH_RX_DMA_BURST_LEN_8BEAT; + else if ((tmpreg & ETH_DMABMR_RDP) == (ETH_DMABMR_PBL_4)) + pDMAConfig->TxDMABurstLen = ETH_RX_DMA_BURST_LEN_16BEAT; + else if ((tmpreg & ETH_DMABMR_RDP) == (ETH_DMABMR_PBL_5)) + pDMAConfig->TxDMABurstLen = ETH_RX_DMA_BURST_LEN_32BEAT; + else + err = 1; + + if (tmpreg & ETH_DMABMR_EDFE) + pDMAConfig->EnhancedDescriptorFormat = ENABLE; + else + pDMAConfig->EnhancedDescriptorFormat = DISABLE; + + pDMAConfig->EnhancedDescriptorFormat = (tmpreg & ETH_DMABMR_EDFE) >> ETH_DMABMR_EDFE_Pos; + + pDMAConfig->DescriptorSkipLen = (tmpreg & ETH_DMABMR_DSL) >> ETH_DMABMR_DSL_Pos; + + if (tmpreg & ETH_DMABMR_DA) + pDMAConfig->DMAArbitration = ETH_DMA_ARBITRATION_RX_PRIOR_TX; + else + pDMAConfig->DMAArbitration = ETH_DMA_ARBITRATION_ROUNDROBIN; + + if (err == 0) + return HAL_OK; + else + return HAL_ERROR; +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_ConfigDMA(ETH_HandleTypeDef *heth, ETH_DMAInitTypeDef *pDMAConfig); +// DMA +// hethETH_HandleTypeDefṹָ룻 +// pDMAConfigýṹָ룻 +// ޣ +// HAL_OKóɹ +// ע +// **************************************************************************** +HAL_StatusTypeDef HAL_ETH_SetDMAConfig(ETH_HandleTypeDef *heth) +{ + uint32_t tmpreg = 0; + ETH_DMAInitTypeDef *pDMAConfig = &heth->DMAConfig; + + if (heth == NULL) + return (HAL_ERROR); + + assert_param(IS_FUNCTIONAL_STATE(pDMAConfig->DropTCPIPChecksumErrorFrame)); + assert_param(IS_FUNCTIONAL_STATE(pDMAConfig->ReceiveStoreForward)); + assert_param(IS_FUNCTIONAL_STATE(pDMAConfig->FlushReceivedFrame)); + assert_param(IS_FUNCTIONAL_STATE(pDMAConfig->TransmitStoreForward)); + assert_param(IS_ETH_TRANSMIT_THRESHOLD_CONTROL(pDMAConfig->TransmitThresholdControl)); + assert_param(IS_FUNCTIONAL_STATE(pDMAConfig->ForwardErrorFrames)); + assert_param(IS_FUNCTIONAL_STATE(pDMAConfig->ForwardUndersizedGoodFrames)); + assert_param(IS_ETH_RECEIVED_THRESHOLD_CONTROL(pDMAConfig->ReceiveThresholdControl)); + assert_param(IS_FUNCTIONAL_STATE(pDMAConfig->SecondFrameOperate)); + assert_param(IS_FUNCTIONAL_STATE(pDMAConfig->MixedBurst)); + assert_param(IS_FUNCTIONAL_STATE(pDMAConfig->AddressAlignedBeats)); + assert_param(IS_FUNCTIONAL_STATE(pDMAConfig->PBL8xMode)); + assert_param(IS_FUNCTIONAL_STATE(pDMAConfig->UseSeparatePBL)); + assert_param(IS_ETH_RX_DMA_BURST_LEN(pDMAConfig->RxDMABurstLen)); + assert_param(IS_FUNCTIONAL_STATE(pDMAConfig->FixedBurst)); + assert_param(IS_ETH_RX_TX_PRIORITY_RATIO(pDMAConfig->RxTxPriorityRatio)); + assert_param(IS_ETH_TX_DMA_BURST_LEN(pDMAConfig->TxDMABurstLen)); + assert_param(IS_FUNCTIONAL_STATE(pDMAConfig->EnhancedDescriptorFormat)); + assert_param(IS_ETH_DESCRIPTOR_SKIP_LEN(pDMAConfig->DescriptorSkipLen)); + assert_param(IS_ETH_DMA_ARBITRATION(pDMAConfig->DMAArbitration)); + + // DMAOMR + tmpreg = (heth->Instance)->DMAOMR; + tmpreg &= 0xF8DE3F23U; + + if (pDMAConfig->DropTCPIPChecksumErrorFrame != DISABLE) + tmpreg |= ETH_DMAOMR_DTCEFD; + + if (pDMAConfig->ReceiveStoreForward != DISABLE) + tmpreg |= ETH_DMAOMR_RSF; + + if (pDMAConfig->FlushReceivedFrame == DISABLE) + tmpreg |= ETH_DMAOMR_DFRF; + + if (pDMAConfig->TransmitStoreForward != DISABLE) + tmpreg |= ETH_DMAOMR_TSF; + + if (pDMAConfig->TransmitThresholdControl == ETH_TRANSMIT_THRESHOLD_CONTROL_64BYTES) + tmpreg |= 0; + else if (pDMAConfig->TransmitThresholdControl == ETH_TRANSMIT_THRESHOLD_CONTROL_128BYTES) + tmpreg |= ETH_DMAOMR_TTC_0; + else if (pDMAConfig->TransmitThresholdControl == ETH_TRANSMIT_THRESHOLD_CONTROL_192BYTES) + tmpreg |= ETH_DMAOMR_TTC_1; + else if (pDMAConfig->TransmitThresholdControl == ETH_TRANSMIT_THRESHOLD_CONTROL_256BYTES) + tmpreg |= ETH_DMAOMR_TTC_1 | ETH_DMAOMR_TTC_0; + else if (pDMAConfig->TransmitThresholdControl == ETH_TRANSMIT_THRESHOLD_CONTROL_40BYTES) + tmpreg |= ETH_DMAOMR_TTC_2; + else if (pDMAConfig->TransmitThresholdControl == ETH_TRANSMIT_THRESHOLD_CONTROL_32BYTES) + tmpreg |= ETH_DMAOMR_TTC_2 | ETH_DMAOMR_TTC_0; + else if (pDMAConfig->TransmitThresholdControl == ETH_TRANSMIT_THRESHOLD_CONTROL_24BYTES) + tmpreg |= ETH_DMAOMR_TTC_2 | ETH_DMAOMR_TTC_1; + else if (pDMAConfig->TransmitThresholdControl == ETH_TRANSMIT_THRESHOLD_CONTROL_16BYTES) + tmpreg |= ETH_DMAOMR_TTC_2 | ETH_DMAOMR_TTC_1 | ETH_DMAOMR_TTC_0; + + if (pDMAConfig->ForwardErrorFrames != DISABLE) + tmpreg |= ETH_DMAOMR_FEF; + + if (pDMAConfig->ForwardUndersizedGoodFrames != DISABLE) + tmpreg |= ETH_DMAOMR_FUGF; + + if (pDMAConfig->ReceiveThresholdControl == ETH_RECEIVED_THRESHOLD_CONTROL_64BYTES) + tmpreg |= 0; + else if (pDMAConfig->ReceiveThresholdControl == ETH_RECEIVED_THRESHOLD_CONTROL_32BYTES) + tmpreg |= ETH_DMAOMR_RTC_0; + else if (pDMAConfig->ReceiveThresholdControl == ETH_RECEIVED_THRESHOLD_CONTROL_96BYTES) + tmpreg |= ETH_DMAOMR_RTC_1; + else if (pDMAConfig->ReceiveThresholdControl == ETH_RECEIVED_THRESHOLD_CONTROL_128BYTES) + tmpreg |= ETH_DMAOMR_RTC_1 | ETH_DMAOMR_RTC_0; + + if (pDMAConfig->SecondFrameOperate != DISABLE) + tmpreg |= ETH_DMAOMR_OSF; + + (heth->Instance)->DMAOMR = (uint32_t)tmpreg; + + // DMABMR + tmpreg = 0; + + if (pDMAConfig->MixedBurst != DISABLE) + tmpreg |= ETH_DMABMR_MB; + + if (pDMAConfig->AddressAlignedBeats != DISABLE) + tmpreg |= ETH_DMABMR_AAB; + + if (pDMAConfig->PBL8xMode != DISABLE) + tmpreg |= ETH_DMABMR_EPM; + + if (pDMAConfig->UseSeparatePBL != DISABLE) + tmpreg |= ETH_DMABMR_USP; + + if (pDMAConfig->RxDMABurstLen == ETH_RX_DMA_BURST_LEN_1BEAT) + tmpreg |= ETH_DMABMR_RDP_0; + else if (pDMAConfig->RxDMABurstLen == ETH_RX_DMA_BURST_LEN_2BEAT) + tmpreg |= ETH_DMABMR_RDP_1; + else if (pDMAConfig->RxDMABurstLen == ETH_RX_DMA_BURST_LEN_4BEAT) + tmpreg |= ETH_DMABMR_RDP_2; + else if (pDMAConfig->RxDMABurstLen == ETH_RX_DMA_BURST_LEN_8BEAT) + tmpreg |= ETH_DMABMR_RDP_3; + else if (pDMAConfig->RxDMABurstLen == ETH_RX_DMA_BURST_LEN_16BEAT) + tmpreg |= ETH_DMABMR_RDP_4; + else if (pDMAConfig->RxDMABurstLen == ETH_RX_DMA_BURST_LEN_32BEAT) + tmpreg |= ETH_DMABMR_RDP_5; + + if (pDMAConfig->FixedBurst != DISABLE) + tmpreg |= ETH_DMABMR_FB; + + if (pDMAConfig->RxTxPriorityRatio == ETH_RX_TX_PRIORITY_RATIO_1_1) + tmpreg |= 0; + else if (pDMAConfig->RxTxPriorityRatio == ETH_RX_TX_PRIORITY_RATIO_2_1) + tmpreg |= ETH_DMABMR_PM_0; + else if (pDMAConfig->RxTxPriorityRatio == ETH_RX_TX_PRIORITY_RATIO_3_1) + tmpreg |= ETH_DMABMR_PM_1; + else if (pDMAConfig->RxTxPriorityRatio == ETH_RX_TX_PRIORITY_RATIO_4_1) + tmpreg |= ETH_DMABMR_PM_1 | ETH_DMABMR_PM_0; + + if (pDMAConfig->TxDMABurstLen == ETH_TX_DMA_BURST_LEN_1BEAT) + tmpreg |= ETH_DMABMR_PBL_0; + else if (pDMAConfig->TxDMABurstLen == ETH_TX_DMA_BURST_LEN_2BEAT) + tmpreg |= ETH_DMABMR_PBL_1; + else if (pDMAConfig->TxDMABurstLen == ETH_TX_DMA_BURST_LEN_4BEAT) + tmpreg |= ETH_DMABMR_PBL_2; + else if (pDMAConfig->TxDMABurstLen == ETH_TX_DMA_BURST_LEN_8BEAT) + tmpreg |= ETH_DMABMR_PBL_3; + else if (pDMAConfig->TxDMABurstLen == ETH_TX_DMA_BURST_LEN_16BEAT) + tmpreg |= ETH_DMABMR_PBL_4; + else if (pDMAConfig->TxDMABurstLen == ETH_TX_DMA_BURST_LEN_32BEAT) + tmpreg |= ETH_DMABMR_PBL_5; + + if (pDMAConfig->EnhancedDescriptorFormat != DISABLE) + tmpreg |= ETH_DMABMR_EDFE; + + tmpreg |= (pDMAConfig->DescriptorSkipLen << ETH_DMABMR_DSL_Pos) & ETH_DMABMR_DSL; + + if (pDMAConfig->DMAArbitration != ETH_DMA_ARBITRATION_ROUNDROBIN) + tmpreg |= ETH_DMABMR_DA; + else + tmpreg |= 0; + + (heth->Instance)->DMABMR = (uint32_t)tmpreg; + + return HAL_OK; +} + + +HAL_StatusTypeDef HAL_ETH_SetDMADefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitDMADefaultParamter(heth); + + return HAL_ETH_SetDMAConfig(heth); +} + +// **************************************************************************** +// +// Flow Control +// +// **************************************************************************** + +uint32_t HAL_ETH_GetFlowCtrlStatus(ETH_HandleTypeDef *heth) +{ + if (heth == NULL) + return (0); + + if (heth->Instance->MACFCR & ETH_MACFCR_FCB_BPA) + return (1); + else + return (0); +} + +HAL_StatusTypeDef HAL_ETH_RecvFlowCtrlEnable(ETH_HandleTypeDef *heth, uint32_t pausetime) +{ + volatile uint32_t tmpreg; + + if (heth == NULL) + return (HAL_ERROR); + + if (heth->Instance->MACFCR & ETH_MACFCR_FCB_BPA) + return HAL_ERROR; + + tmpreg = heth->Instance->MACFCR & ~ETH_MACFCR_PT; + + tmpreg |= (pausetime << ETH_MACFCR_PT_Pos) & ETH_MACFCR_PT; + tmpreg |= ETH_MACFCR_TFCE; + + heth->Instance->MACFCR = tmpreg | ETH_MACFCR_FCB_BPA; + +// heth->Instance->MACFCR |= ETH_MACFCR_FCB_BPA; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_RecvFlowCtrlDisable(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + + if (heth == NULL) + return (HAL_ERROR); + + if (heth->Instance->MACFCR & ETH_MACFCR_FCB_BPA) + return HAL_ERROR; + + tmpreg = heth->Instance->MACFCR & ~ETH_MACFCR_PT; + + tmpreg |= ETH_MACFCR_TFCE; + + heth->Instance->MACFCR = tmpreg | ETH_MACFCR_FCB_BPA; + +// heth->Instance->MACFCR |= ETH_MACFCR_FCB_BPA; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SendFlowCtrlEnable(ETH_HandleTypeDef *heth, uint32_t unicast_pause_frame_detect) +{ + volatile uint32_t tmpreg; + + if (heth == NULL) + return (HAL_ERROR); + + if (heth->Instance->MACFCR & ETH_MACFCR_FCB_BPA) + return HAL_ERROR; + + tmpreg = heth->Instance->MACFCR; + + if (unicast_pause_frame_detect) + tmpreg |= ETH_MACFCR_UPFD; + else + tmpreg &= ~ETH_MACFCR_UPFD; + + tmpreg |= ETH_MACFCR_RFCE; + + heth->Instance->MACFCR = tmpreg; + +// heth->Instance->MACFFR |= BIT7 | BIT6; + + + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SendFlowCtrlDisable(ETH_HandleTypeDef *heth) +{ + if (heth == NULL) + return (HAL_ERROR); + + if (heth->Instance->MACFCR & ETH_MACFCR_FCB_BPA) + return HAL_ERROR; + + heth->Instance->MACFCR &= ~(ETH_MACFCR_UPFD | ETH_MACFCR_RFCE); + + return HAL_OK; +} + +uint32_t HAL_ETH_GetBackPressureStatus(ETH_HandleTypeDef *heth) +{ + if (heth == NULL) + return (0); + + if (heth->Instance->MACFCR & ETH_MACFCR_FCB_BPA) + return (1); + else + return (0); +} + +HAL_StatusTypeDef HAL_ETH_BackPressureEnable(ETH_HandleTypeDef *heth) +{ + if (heth == NULL) + return (HAL_ERROR); + + if (heth->Instance->MACFCR & ETH_MACFCR_FCB_BPA) + return HAL_ERROR; + + heth->Instance->MACFCR |= ETH_MACFCR_TFCE | ETH_MACFCR_FCB_BPA; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_BackPressureDisable(ETH_HandleTypeDef *heth) +{ + if (heth == NULL) + return (HAL_ERROR); + + heth->Instance->MACFCR &= ~(ETH_MACFCR_FCB_BPA); + heth->Instance->MACFCR &= ~(ETH_MACFCR_TFCE); + + return HAL_OK; +} + + +// **************************************************************************** +// +// MMC +// +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_InitMMCDefaultParamter(ETH_HandleTypeDef *heth) +{ + // MMC + heth->MMCConfig.UpdateForDroppedBroadcast = 0; + heth->MMCConfig.FullHalfPreset = 0; + heth->MMCConfig.Preset = 0; + heth->MMCConfig.ResetOnRead = 0; + heth->MMCConfig.StopRollover = 0; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_GetMMCCounter(ETH_HandleTypeDef *heth) +{ + ETH_MMCCounterTypeDef *pMMCCounter = &heth->MMCCounter; + + if (heth == NULL) + return (HAL_ERROR); + + pMMCCounter->TxGoodFrameSingleCollision = heth->Instance->MMCTGFSCCR; + pMMCCounter->TxGoodFrameMultipleCollision = heth->Instance->MMCTGFMCCR; + pMMCCounter->TxGoodFrame = heth->Instance->MMCTGFCR; + pMMCCounter->RxCRCErr = heth->Instance->MMCRFCECR; + pMMCCounter->RxAlignmentErr = heth->Instance->MMCRFAECR; + pMMCCounter->RxGoodUnicast = heth->Instance->MMCRGUFCR; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_GetMMCConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + ETH_MMCInitTypeDef *pMMCConfig = &heth->MMCConfig; + + if (heth == NULL) + return (HAL_ERROR); + + memset((void *)pMMCConfig, 0, sizeof(ETH_MMCInitTypeDef)); + tmpreg = heth->Instance->MMCCR; + + if (tmpreg & ETH_MMCCR_UCDBC) + pMMCConfig->UpdateForDroppedBroadcast = 1; + + if (tmpreg & ETH_MMCCR_CNTPRSTLVL) + pMMCConfig->FullHalfPreset = 1; + + if (tmpreg & ETH_MMCCR_CNTPRST) + pMMCConfig->Preset = 1; + + if (tmpreg & ETH_MMCCR_RSTONRD) + pMMCConfig->ResetOnRead = 1; + + if (tmpreg & ETH_MMCCR_CNTSTOPRO) + pMMCConfig->StopRollover = 1; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetMMCConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + ETH_MMCInitTypeDef *pMMCConfig = &heth->MMCConfig; + + if (heth == NULL) + return (HAL_ERROR); + + tmpreg = 0; + + if (pMMCConfig->UpdateForDroppedBroadcast) + SET_BIT(tmpreg, ETH_MMCCR_UCDBC); + + if (pMMCConfig->FullHalfPreset) + SET_BIT(tmpreg, ETH_MMCCR_CNTPRSTLVL); + + if (pMMCConfig->Preset) + SET_BIT(tmpreg, ETH_MMCCR_CNTPRST); + + if (pMMCConfig->ResetOnRead) + SET_BIT(tmpreg, ETH_MMCCR_RSTONRD); + + if (pMMCConfig->StopRollover) + SET_BIT(tmpreg, ETH_MMCCR_CNTSTOPRO); + + WRITE_REG(heth->Instance->MMCCR, tmpreg); + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetMMCDefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitMMCDefaultParamter(heth); + + return HAL_ETH_SetMMCConfig(heth); +} + +HAL_StatusTypeDef HAL_ETH_MMCFreezeCounter(ETH_HandleTypeDef *heth, FunctionalState cmd) +{ + assert_param(IS_FUNCTIONAL_STATE(cmd)); + + if (heth == NULL) + return (HAL_ERROR); + + if (cmd == DISABLE) + { + CLEAR_BIT(heth->Instance->MMCCR, ETH_MMCCR_CNTFREEZ); + } + else + { + SET_BIT(heth->Instance->MMCCR, ETH_MMCCR_CNTFREEZ); + } + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_MMCResetCounter(ETH_HandleTypeDef *heth) +{ + if (heth == NULL) + return (HAL_ERROR); + + SET_BIT(heth->Instance->MMCCR, ETH_MMCCR_CNTRST); + + return HAL_OK; +} + + +// **************************************************************************** +// +// LPI +// +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_InitLPIDefaultParamter(ETH_HandleTypeDef *heth) +{ + // MMC + heth->LPIConfig.TxAuto = 0; + heth->LPIConfig.TxClockGateCtrlInvalid = 0; + heth->LPIConfig.EntryTime = 100; + heth->LPIConfig.ExtiTime = 10; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_GetLPIConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + ETH_LPITypeDef *pLPIConfig = &heth->LPIConfig; + + if (heth == NULL) + return (HAL_ERROR); + + memset((void *)pLPIConfig, 0, sizeof(ETH_LPITypeDef)); + + tmpreg = heth->Instance->MACLPICSR; + + if (tmpreg & ETH_MACLPICSR_LPITXA) + pLPIConfig->TxAuto = 1; + + if (SYSCFG->SYSCR & SYSCFG_SYSCR_ETHMAC_TX_CLKGE) + pLPIConfig->TxClockGateCtrlInvalid = 1; + + if (tmpreg & ETH_MACLPICSR_PLSEN) + pLPIConfig->EntryTime = (heth->Instance->MACLPITCR & ETH_MACLPITCR_LST) >> ETH_MACLPITCR_LST_Pos; + + pLPIConfig->ExtiTime = (heth->Instance->MACLPITCR & ETH_MACLPITCR_TWT) >> ETH_MACLPITCR_TWT_Pos; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetLPIConfig(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tmpreg; + ETH_LPITypeDef *pLPIConfig = &heth->LPIConfig; + + if (heth == NULL) + return (HAL_ERROR); + + if (pLPIConfig->TxClockGateCtrlInvalid) + SYSCFG->SYSCR |= SYSCFG_SYSCR_ETHMAC_TX_CLKGE; + else + SYSCFG->SYSCR &= ~SYSCFG_SYSCR_ETHMAC_TX_CLKGE; + + heth->Instance->MACLPITCR = (((uint32_t)pLPIConfig->EntryTime << ETH_MACLPITCR_LST_Pos) & ETH_MACLPITCR_LST) | \ + (((uint32_t)pLPIConfig->ExtiTime << ETH_MACLPITCR_TWT_Pos) & ETH_MACLPITCR_TWT); + + tmpreg = heth->Instance->MACLPICSR & ~(ETH_MACLPICSR_LPITXA | ETH_MACLPICSR_PLSEN); + + if (pLPIConfig->TxAuto) + tmpreg |= ETH_MACLPICSR_LPITXA; + + heth->Instance->MACLPICSR = tmpreg; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetLPIDefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitLPIDefaultParamter(heth); + + return HAL_ETH_SetLPIConfig(heth); +} + +HAL_StatusTypeDef HAL_ETH_EnterLPIMode(ETH_HandleTypeDef *heth) +{ + if (heth == NULL) + return (HAL_ERROR); + + heth->Instance->MACLPICSR |= ETH_MACLPICSR_LPIEN; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_ExitLPIMode(ETH_HandleTypeDef *heth) +{ + if (heth == NULL) + return (HAL_ERROR); + + heth->Instance->MACLPICSR &= ~ETH_MACLPICSR_LPIEN; + + return HAL_OK; +} + + + +// **************************************************************************** +// +// PMT +// +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_InitPMTDefaultParamter(ETH_HandleTypeDef *heth) +{ + memset((void *)&heth->PMTConfig, 0, sizeof(ETH_PMTInitTypeDef)); + + return HAL_OK; +} +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_GetPMTConfig(ETH_HandleTypeDef *heth, ETH_PMTInitTypeDef *pPMTConfig); +// ȡPMT +// hethETH_HandleTypeDefṹָ룻 +// pPMTConfigýṹָ룻 +// HAL_OKȡóɹ +// HAL_ERRORȡʧܣ +// ע +// **************************************************************************** +HAL_StatusTypeDef HAL_ETH_GetPMTConfig(ETH_HandleTypeDef *heth) +{ + uint32_t i; + uint32_t err; + volatile uint32_t tmpreg; + ETH_PMTInitTypeDef *pPMTConfig = &heth->PMTConfig; + + if (heth == NULL) + return (HAL_ERROR); + + err = 0; + (heth->Instance)->MACPMTCSR |= ETH_MACPMTCSR_RWFFPR; + + pPMTConfig->Filter[0].Mask = (heth->Instance)->MACRWUFF; + pPMTConfig->Filter[1].Mask = (heth->Instance)->MACRWUFF; + pPMTConfig->Filter[2].Mask = (heth->Instance)->MACRWUFF; + pPMTConfig->Filter[3].Mask = (heth->Instance)->MACRWUFF; + + tmpreg = (heth->Instance)->MACRWUFF; + pPMTConfig->Filter[0].Cmd = tmpreg & 0x0f; + pPMTConfig->Filter[1].Cmd = (tmpreg >> 8) & 0x0f; + pPMTConfig->Filter[2].Cmd = (tmpreg >> 16) & 0x0f; + pPMTConfig->Filter[3].Cmd = (tmpreg >> 24) & 0x0f; + + tmpreg = (heth->Instance)->MACRWUFF; + pPMTConfig->Filter[0].Offset = tmpreg & 0xff; + pPMTConfig->Filter[1].Offset = (tmpreg >> 8) & 0xff; + pPMTConfig->Filter[2].Offset = (tmpreg >> 16) & 0xff; + pPMTConfig->Filter[3].Offset = (tmpreg >> 24) & 0xff; + + tmpreg = (heth->Instance)->MACRWUFF; + pPMTConfig->Filter[0].CRC16 = tmpreg & 0xffff; + pPMTConfig->Filter[1].CRC16 = (tmpreg >> 16) & 0xffff; + + tmpreg = (heth->Instance)->MACRWUFF; + pPMTConfig->Filter[2].CRC16 = tmpreg & 0xffff; + pPMTConfig->Filter[3].CRC16 = (tmpreg >> 16) & 0xffff; + + if ((heth->Instance)->MACPMTCSR & ETH_MACPMTCSR_GU) + pPMTConfig->GlobalUnicast = 1; + else + pPMTConfig->GlobalUnicast = 0; + + + for (i=0; i<8; i++) + { + tmpreg = (heth->Instance)->MACRWUFF; + } + + for (i=0; i<4; i++) + { + if (pPMTConfig->Filter[i].Mask & BIT31) + { + err = 1; + break; + } + if (pPMTConfig->Filter[i].Offset < 12) + { + err = 1; + break; + } + } + + if (err == 0) + return HAL_OK; + else + return HAL_ERROR; +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_SetPMTConfig(ETH_HandleTypeDef *heth, ETH_PMTInitTypeDef *pPMTConfig); +// PMT +// hethETH_HandleTypeDefṹָ룻 +// pPMTConfigýṹָ룻 +// ޣ +// HAL_OKóɹ +// ע +// **************************************************************************** +HAL_StatusTypeDef HAL_ETH_SetPMTConfig(ETH_HandleTypeDef *heth) +{ + uint32_t i; + uint32_t tmpreg; + ETH_PMTInitTypeDef *pPMTConfig = &heth->PMTConfig; + + if (heth == NULL) + return (HAL_ERROR); + + (heth->Instance)->MACPMTCSR |= ETH_MACPMTCSR_RWFFPR; + + for (i=0; i<4; i++) + { + (heth->Instance)->MACRWUFF = pPMTConfig->Filter[i].Mask; + } + + tmpreg = pPMTConfig->Filter[0].Cmd & 0x0f; + tmpreg |= (pPMTConfig->Filter[1].Cmd & 0x0f) << 8; + tmpreg |= (pPMTConfig->Filter[2].Cmd & 0x0f) << 16; + tmpreg |= (pPMTConfig->Filter[3].Cmd & 0x0f) << 24; + (heth->Instance)->MACRWUFF = tmpreg; + + tmpreg = pPMTConfig->Filter[0].Offset & 0xff; + tmpreg |= (pPMTConfig->Filter[1].Offset & 0xff) << 8; + tmpreg |= (pPMTConfig->Filter[2].Offset & 0xff) << 16; + tmpreg |= (pPMTConfig->Filter[3].Offset & 0xff) << 24; + (heth->Instance)->MACRWUFF = tmpreg; + + tmpreg = pPMTConfig->Filter[0].CRC16 & 0xffff; + tmpreg |= (pPMTConfig->Filter[1].CRC16 & 0xffff) << 16; + (heth->Instance)->MACRWUFF = tmpreg; + + tmpreg = pPMTConfig->Filter[2].CRC16 & 0xffff; + tmpreg |= (pPMTConfig->Filter[3].CRC16 & 0xffff) << 16; + (heth->Instance)->MACRWUFF = tmpreg; + + if (pPMTConfig->GlobalUnicast) + (heth->Instance)->MACPMTCSR |= BIT9; + else + (heth->Instance)->MACPMTCSR &= ~BIT9; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetPMTDefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitPMTDefaultParamter(heth); + + return HAL_ETH_SetPMTConfig(heth); +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_EnterPowerDownMode(ETH_HandleTypeDef *heth, uint32_t WakeupFrameEnable, uint32_t MagicPacketEnable); +// ģʽ +// hethETH_HandleTypeDefṹָ룻 +// WakeupModeģʽbit0жϻѣbit1¼ѣ +// WakeupFrameEnable֡ʹܣ +// MagicPacketEnableħʹܣ +// ޣ +// HAL_OKóɹ +// ע +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_EnterPowerDownMode(ETH_HandleTypeDef *heth, uint32_t WakeupMode, uint32_t WakeupFrameEnable, uint32_t MagicPacketEnable) +{ + uint32_t tmpreg; + uint32_t timeout; + + if ((WakeupFrameEnable == 0) && (MagicPacketEnable == 0)) + return (HAL_ERROR); + + + /* Disable the DMA transmission */ + (heth->Instance)->DMAOMR &= ~ETH_DMAOMR_ST; + + timeout = 0xffffff; + while ((heth->Instance)->DMASR & ETH_DMASR_TS) + { + if (--timeout == 0) + return (HAL_TIMEOUT); + } + + /* Disable the MAC transmission */ + (heth->Instance)->MACCR &= ~ETH_MACCR_TE; + + /* Disable the MAC reception */ + (heth->Instance)->MACCR &= ~ETH_MACCR_RE; + + timeout = 0xffffff; + while (((heth->Instance)->MACDBGR & ETH_MACDBGR_RFFL) != 0) + { + if (--timeout == 0) + return (HAL_TIMEOUT); + } + + /* Disable the DMA reception */ + (heth->Instance)->DMAOMR &= ~ETH_DMAOMR_SR; + + __HAL_RCC_EXTI_CLK_ENABLE(); + + EXTI->RTENR2 &= ~BIT1; + EXTI->FTENR2 &= ~BIT1; + EXTI->PDR2 = BIT1; + if (WakeupMode & BIT0) + EXTI->IENR2 |= BIT1; + else + EXTI->IENR2 &= ~BIT1; + if (WakeupMode & BIT1) + EXTI->EENR2 |= BIT1; + else + EXTI->EENR2 &= ~BIT1; + EXTI->RTENR2 |= BIT1; + + if (WakeupMode) + (heth->Instance)->MACIMR &= ~ETH_MACIMR_PIM; + else + (heth->Instance)->MACIMR |= ETH_MACIMR_PIM; + + if (WakeupFrameEnable) + (heth->Instance)->MACPMTCSR |= ETH_MACPMTCSR_WFE; + else + (heth->Instance)->MACPMTCSR &= ~ETH_MACPMTCSR_WFE; + + if (MagicPacketEnable) + (heth->Instance)->MACPMTCSR |= ETH_MACPMTCSR_MPE; + else + (heth->Instance)->MACPMTCSR &= ~ETH_MACPMTCSR_MPE; + + (heth->Instance)->MACPMTCSR |= ETH_MACPMTCSR_PD; + + (heth->Instance)->MACCR |= ETH_MACCR_RE; + + return (HAL_OK); +} + + +// **************************************************************************** +// +// PTP +// +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_InitPTPDefaultParamter(ETH_HandleTypeDef *heth) +{ + uint32_t i; + + memset((void *)&heth->PTPConfig, 0, sizeof(ETH_PTPInitTypeDef)); + + heth->PTPConfig.IPV4Message = ENABLE; + heth->PTPConfig.DigitalRollover = ENABLE; + heth->PTPConfig.FineUpdate = ENABLE; + + return HAL_OK; +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_GetPMTConfig(ETH_HandleTypeDef *heth, ETH_PMTInitTypeDef *pPMTConfig); +// ȡPMT +// hethETH_HandleTypeDefṹָ룻 +// pPMTConfigýṹָ룻 +// HAL_OKȡóɹ +// HAL_ERRORȡʧܣ +// ע +// **************************************************************************** +HAL_StatusTypeDef HAL_ETH_GetPTPConfig(ETH_HandleTypeDef *heth) +{ + uint32_t i; + uint32_t err; + volatile uint32_t tmpreg; + ETH_PTPInitTypeDef *pPTPConfig = &heth->PTPConfig; + + if (heth == NULL) + return (HAL_ERROR); + + err = 0; + memset((void *)pPTPConfig, 0, sizeof(ETH_PTPInitTypeDef)); + + // PTPTSCR + tmpreg = (heth->Instance)->PTPTSCR; + + if (tmpreg & ETH_PTPTSCR_ASEN3) + pPTPConfig->Auxi[3] = ENABLE; + if (tmpreg & ETH_PTPTSCR_ASEN2) + pPTPConfig->Auxi[2] = ENABLE; + if (tmpreg & ETH_PTPTSCR_ASEN2) + pPTPConfig->Auxi[1] = ENABLE; + if (tmpreg & ETH_PTPTSCR_ASEN2) + pPTPConfig->Auxi[0] = ENABLE; + + if (tmpreg & ETH_PTPTSCR_EMAFPFF) + pPTPConfig->MACAddrFilter = ENABLE; + + pPTPConfig->Clock = (tmpreg & ETH_PTPTSCR_SPPFTS) >> ETH_PTPTSCR_SPPFTS_Pos; + + if (tmpreg & ETH_PTPTSCR_ESFMRTM) + pPTPConfig->MasterMessage = ENABLE; + + if (tmpreg & ETH_PTPTSCR_ETSFEM) + pPTPConfig->EventMessage = ENABLE; + + if (tmpreg & ETH_PTPTSCR_EPPFSIP4U) + pPTPConfig->IPV4Message = ENABLE; + + if (tmpreg & ETH_PTPTSCR_EPPFSIP6U) + pPTPConfig->IPV6Message = ENABLE; + + if (tmpreg & ETH_PTPTSCR_EPPEF) + pPTPConfig->EthernetFrame = ENABLE; + + if (tmpreg & ETH_PTPTSCR_TSPTPPSV2E) + pPTPConfig->Ver2 = ENABLE; + + if (tmpreg & ETH_PTPTSCR_TSR) + pPTPConfig->DigitalRollover = ENABLE; + + if (tmpreg & ETH_PTPTSCR_TSARFE) + pPTPConfig->AllFrames = ENABLE; + + if (tmpreg & ETH_PTPTSCR_TFCU) + pPTPConfig->FineUpdate = ENABLE; + + // PTPPPSCR + tmpreg = (heth->Instance)->PTPPPSCR ; + + if ((tmpreg & ETH_PTPPPSCR_TRGTMODSEL) == ETH_PTPPPSCR_TRGTMODSEL_0) + err = 1; + else + pPTPConfig->PPS.TargetTimeFunc = (tmpreg & ETH_PTPPPSCR_TRGTMODSEL) >> ETH_PTPPPSCR_TRGTMODSEL_Pos; + + if (tmpreg & ETH_PTPPPSCR_PPSEN) + { + pPTPConfig->PPS.Mode = ETH_PTP_PPS_OUTPUT_MODE_CMD; + pPTPConfig->PPS.Output.Cmd = (tmpreg & ETH_PTPPPSCR_PPSCMD) >> ETH_PTPPPSCR_PPSCMD_Pos; + } + else + { + pPTPConfig->PPS.Mode = ETH_PTP_PPS_OUTPUT_MODE_CTRL; + pPTPConfig->PPS.Output.Freq = (tmpreg & ETH_PTPPPSCR_PPSCTRL) >> ETH_PTPPPSCR_PPSCTRL_Pos; + } + + // PTPPPSIR + pPTPConfig->PPS.Interval = (heth->Instance)->PTPPPSIR; + + // PTPPPSWR + pPTPConfig->PPS.Width = (heth->Instance)->PTPPPSWR; + + if (err == 0) + return HAL_OK; + else + return HAL_ERROR; +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_SetPMTConfig(ETH_HandleTypeDef *heth, ETH_PMTInitTypeDef *pPMTConfig); +// PMT +// hethETH_HandleTypeDefṹָ룻 +// pPMTConfigýṹָ룻 +// ޣ +// HAL_OKóɹ +// ע +// **************************************************************************** +HAL_StatusTypeDef HAL_ETH_SetPTPConfig(ETH_HandleTypeDef *heth) +{ + uint32_t i; + volatile uint32_t tmpreg; + ETH_PTPInitTypeDef *pPTPConfig = &heth->PTPConfig; + + if (heth == NULL) + return (HAL_ERROR); + + // PTPTSCR + tmpreg = (heth->Instance)->PTPTSCR & ~0x1e07ff02; + + if (pPTPConfig->Auxi[3] != DISABLE) + tmpreg |= ETH_PTPTSCR_ASEN3; + if (pPTPConfig->Auxi[2] != DISABLE) + tmpreg |= ETH_PTPTSCR_ASEN2; + if (pPTPConfig->Auxi[1] != DISABLE) + tmpreg |= ETH_PTPTSCR_ASEN1; + if (pPTPConfig->Auxi[0] != DISABLE) + tmpreg |= ETH_PTPTSCR_ASEN0; + + if (pPTPConfig->MACAddrFilter != DISABLE) + tmpreg |= ETH_PTPTSCR_EMAFPFF; + + tmpreg |= ((uint32_t)pPTPConfig->Clock << ETH_PTPTSCR_SPPFTS_Pos) & ETH_PTPTSCR_SPPFTS; + + if (pPTPConfig->MasterMessage != DISABLE) + tmpreg |= ETH_PTPTSCR_ESFMRTM; + + if (pPTPConfig->EventMessage != DISABLE) + tmpreg |= ETH_PTPTSCR_ETSFEM; + + if (pPTPConfig->IPV4Message != DISABLE) + tmpreg |= ETH_PTPTSCR_EPPFSIP4U; + + if (pPTPConfig->IPV6Message != DISABLE) + tmpreg |= ETH_PTPTSCR_EPPFSIP6U; + + if (pPTPConfig->EthernetFrame != DISABLE) + tmpreg |= ETH_PTPTSCR_EPPEF; + + if (pPTPConfig->Ver2 != DISABLE) + tmpreg |= ETH_PTPTSCR_TSPTPPSV2E; + + if (pPTPConfig->DigitalRollover != DISABLE) + { + tmpreg |= ETH_PTPTSCR_TSR; + ETH->PTPSSIR = 20u; + } + else + { + ETH->PTPSSIR = 43u; + } + + if (pPTPConfig->AllFrames != DISABLE) + tmpreg |= ETH_PTPTSCR_TSARFE; + + if (pPTPConfig->FineUpdate != DISABLE) + tmpreg |= ETH_PTPTSCR_TFCU; + + (heth->Instance)->PTPTSCR = tmpreg; + + // PTPTSCR + tmpreg = (heth->Instance)->PTPPPSCR & ~0x0000007f; + + tmpreg |= ((uint32_t)pPTPConfig->PPS.TargetTimeFunc << ETH_PTPPPSCR_TRGTMODSEL_Pos) & ETH_PTPPPSCR_TRGTMODSEL; + + if (pPTPConfig->PPS.Mode == ETH_PTP_PPS_OUTPUT_MODE_CMD) + { + tmpreg |= ETH_PTPPPSCR_PPSEN; + tmpreg |= ((uint32_t)pPTPConfig->PPS.Output.Cmd << ETH_PTPPPSCR_PPSCMD_Pos) & ETH_PTPPPSCR_PPSCMD; + } + else + { + tmpreg |= ((uint32_t)pPTPConfig->PPS.Output.Freq << ETH_PTPPPSCR_PPSCTRL_Pos) & ETH_PTPPPSCR_PPSCTRL; + } + + // PTPPPSIR + (heth->Instance)->PTPPPSIR = pPTPConfig->PPS.Interval; + + // PTPPPSWR + (heth->Instance)->PTPPPSWR = pPTPConfig->PPS.Width; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_SetPTPDefaultConfig(ETH_HandleTypeDef *heth) +{ + HAL_ETH_InitPTPDefaultParamter(heth); + + return HAL_ETH_SetPTPConfig(heth); +} + +HAL_StatusTypeDef HAL_ETH_PTPStart(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp) +{ + uint64_t temp; + uint32_t timeout; + ETH_TypeDef *eth = heth->Instance; + + if (timestamp->nsec & BIT31) + return HAL_ERROR; + + // ֹʱж + eth->MACIMR |= ETH_MACIMR_TIM; + + // ʹʱ + eth->PTPTSCR |= ETH_PTPTSCR_TE; + + if (heth->PTPConfig.DigitalRollover) + eth->PTPSSIR = 20; + else + eth->PTPSSIR = 43; + + if (heth->PTPConfig.FineUpdate) + { + eth->PTPTSAR = (uint32_t)(pow(2,32) * 50000000 / HAL_RCC_GetHCLKFreq()); + + timeout = ETH_PTP_TIMEOUT; + while (eth->PTPTSCR & ETH_PTPTSCR_TARU) + { + if (--timeout == 0) + return HAL_ERROR; + } + + eth->PTPTSCR |= ETH_PTPTSCR_TARU; + + timeout = ETH_PTP_TIMEOUT; + while (eth->PTPTSCR & ETH_PTPTSCR_TARU) + { + if (--timeout == 0) + return HAL_ERROR; + } + + eth->PTPTSCR |= ETH_PTPTSCR_TFCU; + } + else + { + eth->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TFCU); + } + + eth->PTPTSHUR = timestamp->sec; + if (heth->PTPConfig.DigitalRollover) + eth->PTPTSLUR = timestamp->nsec; + else + eth->PTPTSLUR = (uint32_t)((uint64_t)timestamp->nsec * 0x80000000 / 1000000000); + + + timeout = ETH_PTP_TIMEOUT; + while (eth->PTPTSCR & ETH_PTPTSCR_TI) + { + if (--timeout == 0) + return HAL_ERROR; + } + eth->PTPTSCR |= ETH_PTPTSCR_TI; + + timeout = ETH_PTP_TIMEOUT; + while (eth->PTPTSCR & ETH_PTPTSCR_TI) + { + if (--timeout == 0) + return HAL_ERROR; + } + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_PTPStop(ETH_HandleTypeDef *heth) +{ + uint32_t timeout; + ETH_TypeDef *eth = heth->Instance; + ETH_TimestampTypeDef timestamp; + + // ֹʱж + eth->MACIMR |= ETH_MACIMR_TIM; + + // ֹʱжϴ + eth->PTPTSCR &= ~ETH_PTPTSCR_TITE; + + // ֹʱ + eth->PTPTSCR &= ~ETH_PTPTSCR_TE; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_PTPAdjFreq(ETH_HandleTypeDef *heth, int32_t freq) +{ + uint32_t sysclk; + uint32_t timeout; + ETH_TypeDef *eth = heth->Instance; + + sysclk = HAL_RCC_GetHCLKFreq(); + + if (freq >= 0) + { + sysclk += freq; + } + else + { + freq = -freq; + sysclk -= freq; + } + + eth->PTPTSAR = (uint32_t)(pow(2,32) * 50000000 / sysclk); + + timeout = ETH_PTP_TIMEOUT; + while (eth->PTPTSCR & ETH_PTPTSCR_TARU) + { + if (--timeout == 0) + return HAL_ERROR; + } + + eth->PTPTSCR |= ETH_PTPTSCR_TARU; + + timeout = ETH_PTP_TIMEOUT; + while (eth->PTPTSCR & ETH_PTPTSCR_TARU) + { + if (--timeout == 0) + return HAL_ERROR; + } + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_PTPUpdateOffset(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp) +{ + uint32_t sign; + uint32_t addend; + uint32_t timeout; + ETH_TypeDef *eth = heth->Instance; + + sign = 0; + if (timestamp->nsec & ETH_PTPTSLUR_AST) + { + sign = ETH_PTPTSLUR_AST; + timestamp->nsec &= ~ETH_PTPTSLUR_AST; + } + + timeout = ETH_PTP_TIMEOUT; + while (eth->PTPTSCR & ETH_PTPTSCR_TU) + { + if (--timeout == 0) + return HAL_ERROR; + } + timeout = ETH_PTP_TIMEOUT; + while (eth->PTPTSCR & ETH_PTPTSCR_TI) + { + if (--timeout == 0) + return HAL_ERROR; + } + + /* read old addend register value*/ + addend = ETH->PTPTSAR; + + eth->PTPTSHUR = timestamp->sec; + if (heth->PTPConfig.DigitalRollover) + eth->PTPTSLUR = sign | (uint32_t)timestamp->nsec; + else + eth->PTPTSLUR = sign | (uint32_t)((uint64_t)timestamp->nsec * 0x80000000 / 1000000000); + + eth->PTPTSCR |= ETH_PTPTSCR_TU; + + timeout = ETH_PTP_TIMEOUT; + while (eth->PTPTSCR & ETH_PTPTSCR_TU) + { + if (--timeout == 0) + return HAL_ERROR; + } + + // + ETH->PTPTSAR = addend; + + timeout = ETH_PTP_TIMEOUT; + while (eth->PTPTSCR & ETH_PTPTSCR_TARU) + { + if (--timeout == 0) + return HAL_ERROR; + } + + eth->PTPTSCR |= ETH_PTPTSCR_TARU; + + timeout = ETH_PTP_TIMEOUT; + while (eth->PTPTSCR & ETH_PTPTSCR_TARU) + { + if (--timeout == 0) + return HAL_ERROR; + } + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_PTPTimeSetTime(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp) +{ + uint32_t sign; + uint32_t timeout; + ETH_TypeDef *eth = heth->Instance; + + sign = 0; + if (timestamp->nsec & ETH_PTPTSLUR_AST) + { + sign = ETH_PTPTSLUR_AST; + timestamp->nsec &= ~ETH_PTPTSLUR_AST; + } + + ETH->PTPTSHUR = timestamp->sec; + if (ETH->PTPTSCR & ETH_PTPTSCR_TSR) + ETH->PTPTSLUR = sign | timestamp->nsec; + else + ETH->PTPTSLUR = sign | (uint32_t)((uint64_t)timestamp->nsec * (uint64_t)0x80000000 / (uint64_t)1000000000); + + ETH->PTPTSCR |= ETH_PTPTSCR_TI; + + timeout = ETH_PTP_TIMEOUT; + while (eth->PTPTSCR & ETH_PTPTSCR_TI) + { + if (--timeout == 0) + return HAL_ERROR; + } + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_PTPGetSystemTime(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp) +{ + if (heth->Instance->PTPTSCR & ETH_PTPTSCR_TSR) + timestamp->nsec = (int32_t)ETH->PTPTSLR; + else + timestamp->nsec = (int32_t)(((uint64_t)ETH->PTPTSLR * (uint64_t)1000000000) >> 31); + timestamp->sec = ETH->PTPTSHR; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_PTPGetTargetTime(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp) +{ + uint32_t timeout; + + timeout = ETH_PTP_TIMEOUT; + while (heth->Instance->PTPTTLR & ETH_PTPTTLR_TTRB ) + { + if (--timeout == 0) + return HAL_ERROR; + } + + if (heth->Instance->PTPTSCR & ETH_PTPTSCR_TSR) + timestamp->nsec = (int32_t)ETH->PTPTTLR; + else + timestamp->nsec = (int32_t)(((uint64_t)ETH->PTPTTLR * (uint64_t)1000000000) >> 31); + timestamp->sec = ETH->PTPTTHR ; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_PTPSetTargetTime(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp) +{ + if (timestamp->nsec & ETH_PTPTSLUR_AST) + return HAL_ERROR; + + heth->Instance->PTPTTHR = timestamp->sec; + if (heth->Instance->PTPTSCR & ETH_PTPTSCR_TSR) + heth->Instance->PTPTTLR = (uint32_t)timestamp->nsec; + else + heth->Instance->PTPTTLR = (uint32_t)((uint64_t)timestamp->nsec * (uint64_t)0x80000000 / (uint64_t)1000000000); + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_ETH_PTPGetAuxiliaryTime(ETH_HandleTypeDef *heth, ETH_TimestampTypeDef *timestamp) +{ + if (heth->Instance->PTPTSCR & ETH_PTPTSCR_TSR) + timestamp->nsec = (int32_t)ETH->PTPATSNR; + else + timestamp->nsec = (int32_t)(((uint64_t)ETH->PTPATSNR * (uint64_t)1000000000) >> 31); + timestamp->sec = ETH->PTPATSSR; + + return HAL_OK; +} + +uint32_t HAL_ETH_PTPGetAuxiTimeStatus(ETH_HandleTypeDef *heth, ETH_PTPAuxiTimeStatusTypeDef *status) +{ + volatile uint32_t tempreg; + + tempreg = heth->Instance->PTPTSSR; + + status->AuxiNbr = (tempreg & ETH_PTPTSSR_ATSNS) >> ETH_PTPTSSR_ATSNS_Pos; + + if (tempreg & ETH_PTPTSSR_ATSTM) + status->AuxiTriggerMissed = ENABLE; + else + status->AuxiTriggerMissed = DISABLE; + + if (tempreg & ETH_PTPTSSR_ATSTI_0) + status->AuxiTrigger[0] = ENABLE; + else + status->AuxiTrigger[0] = DISABLE; + + if (tempreg & ETH_PTPTSSR_ATSTI_1) + status->AuxiTrigger[1] = ENABLE; + else + status->AuxiTrigger[1] = DISABLE; + + if (tempreg & ETH_PTPTSSR_ATSTI_2) + status->AuxiTrigger[2] = ENABLE; + else + status->AuxiTrigger[2] = DISABLE; + + if (tempreg & ETH_PTPTSSR_ATSTI_3) + status->AuxiTrigger[3] = ENABLE; + else + status->AuxiTrigger[3] = DISABLE; + + return HAL_OK; +} + + +// **************************************************************************** +// +// SMI +// +// **************************************************************************** + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_ConfigSMI(ETH_HandleTypeDef *heth) +// SMI +// hethETH_HandleTypeDefṹָ룻 +// ޣ +// HAL_OKóɹ +// HAL_ERRORʱƵʲЧΧ֮ڣ +// ע +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_ConfigSMI(ETH_HandleTypeDef *heth) +{ + volatile uint32_t tempreg; + uint32_t hclk; + + //SMIʱ + tempreg = (heth->Instance)->MACMIIAR; + + tempreg &= ~ETH_MACMIIAR_CR; + + hclk = HAL_RCC_GetHCLKFreq(); + + if (hclk < 20000000) + return (HAL_ERROR); + else if (hclk < 35000000) + tempreg |= ETH_MACMIIAR_CR_1; + else if (hclk <= 60000000) + tempreg |= ETH_MACMIIAR_CR_1 | ETH_MACMIIAR_CR_0; + else if (hclk < 100000000) + tempreg |= 0; + else if (hclk < 150000000) + tempreg |= ETH_MACMIIAR_CR_0; + else if (hclk < 250000000) + tempreg |= ETH_MACMIIAR_CR_2; + else if (hclk < 300000000) + tempreg |= ETH_MACMIIAR_CR_2 | ETH_MACMIIAR_CR_0; + else + return (HAL_ERROR); + + (heth->Instance)->MACMIIAR = (uint32_t)tempreg; + + return (HAL_OK); +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_ReadPHYRegister(ETH_HandleTypeDef *heth, uint16_t PHYReg, uint32_t *RegValue); +// PHYĴ +// hethETH_HandleTypeDefṹָ룻 +// PHYRegĴַ +// RegValueָ룻 +// HAL_OKɹ +// HAL_BUSYæ +// HAL_TIMEOUTʱ +// HAL_ERRORPHYַ +// ע +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_ReadPHYRegister(ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg, uint32_t *RegValue) +{ + volatile uint32_t tmpreg; + uint32_t tickstart = 0; + + if (READ_BIT(heth->Instance->MACMIIAR, ETH_MACMIIAR_MB)) + return HAL_BUSY; + + WRITE_REG(tmpreg, heth->Instance->MACMIIAR); + + MODIFY_REG(tmpreg, ETH_MACMIIAR_PA, (PHYAddr << ETH_MACMIIAR_PA_Pos)); + MODIFY_REG(tmpreg, ETH_MACMIIAR_MR, (PHYReg << ETH_MACMIIAR_MR_Pos)); + CLEAR_BIT(tmpreg, ETH_MACMIIAR_MW); + SET_BIT(tmpreg, ETH_MACMIIAR_MB); + WRITE_REG(heth->Instance->MACMIIAR, tmpreg); + + // ȴ + tickstart = HAL_GetTick(); + while(READ_BIT(heth->Instance->MACMIIAR, ETH_MACMIIAR_MB)) + { + if((HAL_GetTick() - tickstart ) > ETH_TIMEOUT_PHY_WRITE) + return HAL_TIMEOUT; + } + + if (RegValue) + { + *RegValue = (uint16_t)(heth->Instance->MACMIIDR); + } + + heth->State = HAL_ETH_STATE_READY; + + return HAL_OK; +} + +// **************************************************************************** +// HAL_StatusTypeDef HAL_ETH_WritePHYRegister(ETH_HandleTypeDef *heth, uint16_t PHYReg, uint32_t RegValue); +// дPHYĴ +// hethETH_HandleTypeDefṹָ룻 +// PHYRegĴַ +// RegValueдݣ +// ޣ +// HAL_OKдɹ +// HAL_BUSYæ +// HAL_TIMEOUTдʱ +// HAL_ERRORPHYַ +// ע +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_WritePHYRegister(ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg, uint32_t RegValue) +{ + volatile uint32_t tmpreg = 0; + uint32_t tickstart = 0; + + if (READ_BIT(heth->Instance->MACMIIAR, ETH_MACMIIAR_MB)) + return HAL_BUSY; + + WRITE_REG(tmpreg, heth->Instance->MACMIIAR); + + MODIFY_REG(tmpreg, ETH_MACMIIAR_PA, (PHYAddr << ETH_MACMIIAR_PA_Pos)); + MODIFY_REG(tmpreg, ETH_MACMIIAR_MR, (PHYReg << ETH_MACMIIAR_MR_Pos)); + SET_BIT(tmpreg, ETH_MACMIIAR_MW); + SET_BIT(tmpreg, ETH_MACMIIAR_MB); + + WRITE_REG(heth->Instance->MACMIIDR, RegValue); + + WRITE_REG(heth->Instance->MACMIIAR, tmpreg); + + //ȴд + tickstart = HAL_GetTick(); + while(READ_BIT(heth->Instance->MACMIIAR, ETH_MACMIIAR_MB)) + { + if((HAL_GetTick() - tickstart ) >= ETH_TIMEOUT_PHY_READ) + return HAL_TIMEOUT; + } + + return HAL_OK; +} + +// **************************************************************************** +// +// Rx Delay +// +// **************************************************************************** + +HAL_StatusTypeDef HAL_ETH_RxClockDelayConfig(ETH_HandleTypeDef *heth, uint32_t uint, uint32_t len) +{ + SYSCFG->SYSCR |= SYSCFG_SYSCR_ETHMAC_RX_DLYSEL; + ETH_DLYB->CR = DLYB_CR_DEN; + ETH_DLYB->CR |= DLYB_CR_SEN; + ETH_DLYB->CFGR = ((uint << DLYB_CFGR_UNIT_Pos) & DLYB_CFGR_UNIT_Msk) | ((len << DLYB_CFGR_SEL_Pos) & DLYB_CFGR_SEL_Msk); + HAL_SimpleDelay(10); + ETH_DLYB->CR &= ~DLYB_CR_SEN; + + return HAL_OK; +} + + +#endif + + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_exti.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_exti.c new file mode 100644 index 0000000000..5ff6c04045 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_exti.c @@ -0,0 +1,431 @@ +/****************************************************************************** +*@file : hal_exti.c +*@brief : GPIO EXTI module driver. +******************************************************************************/ + +#include "hal.h" + +#ifdef HAL_EXTI_MODULE_ENABLED + +/****************************************************************************** +*@brief : EXTI interrupt request. +*@param : Line: Exti line number. +* This parameter can be a combination of @ref EXTI_Line. +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_EXTI_IRQHandler(uint32_t Line) +{ + assert_param(IS_EXTI_SINGLE_LINE(Line)); + + if (Line < 32U) + { + if (EXTI->PDR1 & (1UL << Line)) + { + EXTI->PDR1 = 1UL << Line; + HAL_EXTI_LineCallback(Line); + } + } + else + { + if (EXTI->PDR2 & (1UL << (Line - 32))) + { + EXTI->PDR2 = 1UL << (Line - 32); + HAL_EXTI_LineCallback(Line); + } + } +} + +/****************************************************************************** +*@brief : EXTI interrupt callback. +*@param : Line: Exti line number. +* This parameter can be a combination of @ref EXTI_Line. +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_EXTI_LineCallback(uint32_t Line) +{ + UNUSED(Line); +} + +/****************************************************************************** +*@brief : Set configuration of a dedicated Exti line. +*@param : GPIOx: where x can be (A..F) to select the GPIO peripheral. +* This parameter is only possible for line 0 to 15. +*@param : Line: Exti line number. +* This parameter can be a value of @ref EXTI_Line. +*@param : Mode: The Exit Mode to be configured for a core. + This parameter can be a value of @ref EXTI_Mode . +*@return: HAL Status +******************************************************************************/ +HAL_StatusTypeDef HAL_EXTI_SetConfigLine(GPIO_TypeDef *GPIOx, uint32_t Line, uint32_t Mode) +{ + uint32_t mask1=0; + uint32_t mask2=0; + uint32_t source; + + /* Check the parameters */ + assert_param(IS_EXTI_SINGLE_LINE(Line)); + assert_param(IS_EXTI_MODE(Mode)); + + /* disable interrupt and event */ + if (Line < 32U) + { + mask1 = 1UL << Line; + EXTI->IENR1 &= ~mask1; + EXTI->EENR1 &= ~mask1; + EXTI->RTENR1 &= ~mask1; + EXTI->FTENR1 &= ~mask1; + EXTI->PDR1 = mask1; + } + else + { + mask2 = 1UL << (Line - 32); + EXTI->IENR2 &= ~mask2; + EXTI->EENR2 &= ~mask2; + EXTI->RTENR2 &= ~mask2; + EXTI->FTENR2 &= ~mask2; + EXTI->PDR2 = mask2; + } + + /* Line0 ~ 15 trigger from GPIO */ + if (Line < 16U) + { + /* Check the parameters */ + assert_param(IS_EXTI_GPIO(GPIOx)); + + /* Configure EXTI source select */ + source = ((uint32_t)GPIOx - (uint32_t)GPIOA) >> 10; + + if (Line < 6U) + { + /* Line0 ~ 5 */ + EXTI->CR1 = (EXTI->CR1 & ~(0x1FUL << (Line * 5))) | (source << (Line * 5)); + } + else if (Line < 12U) + { + /* Line6 ~ 11 */ + EXTI->CR2 = (EXTI->CR2 & ~(0x1FUL << ((Line - 6) * 5))) | (source << ((Line - 6) * 5)); + } + else + { + /* Line12 ~ 15 */ + EXTI->CR3 = (EXTI->CR3 & ~(0x1FUL << ((Line - 12) * 5))) | (source << ((Line - 12) * 5)); + } + } + + if (Mode == EXTI_MODE_IT_RISING) + { + /* Interrupt rising edge mode */ + if (Line < 32U) + { + EXTI->RTENR1 |= mask1; + EXTI->IENR1 |= mask1; + } + else + { + EXTI->RTENR2 |= mask2; + EXTI->IENR2 |= mask2; + } + } + else if (Mode == EXTI_MODE_IT_FALLING) + { + /* Interrupt falling edge mode */ + if (Line < 32U) + { + EXTI->FTENR1 |= mask1; + EXTI->IENR1 |= mask1; + } + else + { + EXTI->FTENR2 |= mask2; + EXTI->IENR2 |= mask2; + } + } + else if (Mode == EXTI_MODE_IT_RISING_FALLING) + { + /* Interrupt rising and falling edge mode */ + if (Line < 32U) + { + EXTI->RTENR1 |= mask1; + EXTI->FTENR1 |= mask1; + EXTI->IENR1 |= mask1; + } + else + { + EXTI->RTENR2 |= mask2; + EXTI->FTENR2 |= mask2; + EXTI->IENR2 |= mask2; + } + } + else if (Mode == EXTI_MODE_EVT_RISING) + { + /* Event rising edge mode */ + if (Line < 32U) + { + EXTI->RTENR1 |= mask1; + EXTI->EENR1 |= mask1; + } + else + { + EXTI->RTENR2 |= mask2; + EXTI->EENR2 |= mask2; + } + } + else if (Mode == EXTI_MODE_EVT_FALLING) + { + /* Event falling edge mode */ + if (Line < 32U) + { + EXTI->FTENR1 |= mask1; + EXTI->EENR1 |= mask1; + } + else + { + EXTI->FTENR2 |= mask2; + EXTI->EENR2 |= mask2; + } + } + else if (Mode == EXTI_MODE_EVT_RISING_FALLING) + { + /* Event rising and falling edge mode */ + if (Line < 32U) + { + EXTI->RTENR1 |= mask1; + EXTI->FTENR1 |= mask1; + EXTI->EENR1 |= mask1; + } + else + { + EXTI->RTENR2 |= mask2; + EXTI->FTENR2 |= mask2; + EXTI->EENR2 |= mask2; + } + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Clear whole configuration of a dedicated Exti line. +*@param : Line: Exti line number. +* This parameter can be a value of @ref EXTI_Line. +*@return: HAL Status +******************************************************************************/ +HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(uint32_t Line) +{ + uint32_t mask1; + uint32_t mask2; + + /* Check the parameters */ + assert_param(IS_EXTI_SINGLE_LINE(Line)); + + /* disable interrupt and event */ + if (Line < 32U) + { + mask1 = 1UL << Line; + EXTI->IENR1 &= ~mask1; + EXTI->EENR1 &= ~mask1; + EXTI->RTENR1 &= ~mask1; + EXTI->FTENR1 &= ~mask1; + EXTI->PDR1 = mask1; + } + else + { + mask2 = 1UL << (Line - 32); + EXTI->IENR2 &= ~mask2; + EXTI->EENR2 &= ~mask2; + EXTI->RTENR2 &= ~mask2; + EXTI->FTENR2 &= ~mask2; + EXTI->PDR2 = mask2; + } + + /* Line0 ~ 15 trigger from GPIO */ + if (Line < 16U) + { + if (Line < 6U) + { + /* Line0 ~ 5 */ + EXTI->CR1 = EXTI->CR1 & ~(0x1FUL << (Line * 5)); + } + else if (Line < 12U) + { + /* Line6 ~ 11 */ + EXTI->CR2 = EXTI->CR2 & ~(0x1FUL << ((Line - 6) * 5)); + } + else + { + /* Line12 ~ 15 */ + EXTI->CR3 = EXTI->CR3 & ~(0x1FUL << ((Line - 12) * 5)); + } + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Check whether the LINE of the specified GPIOx is configured. +*@param : GPIOx: where x can be (A..F) to select the GPIO peripheral. +* This parameter is only possible for line 0 to 15. +*@param : Line: Exti line number. +* This parameter can be a value of @ref EXTI_Line. +*@return: configuration status +* This parameter can be a value of @ref FunctionalState. +* @arg ENABLE: Configured. +* @arg DISABLE: Not configured. +******************************************************************************/ +FunctionalState HAL_EXTI_IsConfigLine(GPIO_TypeDef *GPIOx, uint32_t Line) +{ + uint32_t mask1; + uint32_t mask2; + uint32_t source; + + /* Check the parameters */ + assert_param(IS_EXTI_SINGLE_LINE(Line)); + + if (Line < 32U) + { + mask1 = 1UL << Line; + if (((EXTI->IENR1 & mask1) == 0) && ((EXTI->EENR1 & mask1) == 0)) + return (DISABLE); + } + else + { + mask2 = 1UL << (Line - 32); + if (((EXTI->IENR2 & mask2) == 0) && ((EXTI->EENR2 & mask2) == 0)) + return (DISABLE); + } + + if (Line >= 16U) + { + return (ENABLE); + } + + /* Line0 ~ 15 trigger from GPIO */ + + /* Check the parameters */ + assert_param(IS_EXTI_GPIO(GPIOx)); + + /* Configure EXTI source select */ + source = (GPIOx - GPIOA) >> 10; + + if (Line < 6U) + { + /* Line0 ~ 7 */ + if (((EXTI->CR1 >> (Line * 5)) & 0x1FU) == source) + return (ENABLE); + else + return (DISABLE); + } + else if (Line < 12U) + { + /* Line8 ~ 15 */ + if (((EXTI->CR2 >> ((Line - 6) * 5)) & 0x1FU) == source) + return (ENABLE); + else + return (DISABLE); + } + else + { + /* Line8 ~ 15 */ + if (((EXTI->CR3 >> ((Line - 12) * 5)) & 0x1FU) == source) + return (ENABLE); + else + return (DISABLE); + } +} + +/****************************************************************************** +*@brief : The specified Line generates a software interrupt. +*@param : Line: Exti line number. +* This parameter can be a combination of @ref EXTI_Line. +*@return: None. +******************************************************************************/ +void HAL_EXTI_GenerateSWI(uint32_t Line) +{ + uint32_t mask1; + uint32_t mask2; + + /* Check the parameters */ + assert_param(IS_EXTI_SINGLE_LINE(Line)); + + if (Line < 32U) + { + mask1 = 1UL << Line; + EXTI->SWIER1 &= ~mask1; + EXTI->SWIER1 |= mask1; + } + else + { + mask2 = 1UL << (Line - 32); + EXTI->SWIER2 &= ~mask2; + EXTI->SWIER2 |= mask2; + } +} + +/****************************************************************************** +*@brief : Get interrupt pending bit of a dedicated line. +*@param : Line: Exti line number. +* This parameter can be a value of @ref EXTI_Line. +*@return: interrupt pending bit status +* This parameter can be a value of @ref FlagStatus. +* @arg SET: interrupt is pending. +* @arg RESET: interrupt is not pending. +******************************************************************************/ +FlagStatus HAL_EXTI_GetPending(uint32_t Line) +{ + /* Check the parameters */ + assert_param(IS_EXTI_SINGLE_LINE(Line)); + + if (Line < 32U) + { + if (EXTI->PDR1 & (1UL << Line)) + return (SET); + else + return (RESET); + } + else + { + if (EXTI->PDR2 & (1UL << (Line - 32))) + return (SET); + else + return (RESET); + } +} + +/****************************************************************************** +*@brief : Clear interrupt pending bit of a dedicated line. +*@param : Line: Exti line number. +* This parameter can be a combination of @ref EXTI_Line. +*@return: None. +******************************************************************************/ +void HAL_EXTI_ClearPending(uint32_t Line) +{ + /* Check the parameters */ + assert_param(IS_EXTI_SINGLE_LINE(Line)); + + if (Line < 32U) + { + EXTI->PDR1 = 1UL << Line; + } + else + { + EXTI->PDR2 = 1UL << (Line - 32); + } +} + +/****************************************************************************** +*@brief : Clear all interrupt pending bit. +*@return: None. +******************************************************************************/ +void HAL_EXTI_ClearAllPending(void) +{ + /* Clear pending status */ + EXTI->PDR1 = 0xFFFFFFFF; + EXTI->PDR2 = 0x00000007; +} + + + +#endif /* HAL_EXTI_MODULE_ENABLED */ + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_fdcan.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_fdcan.c new file mode 100644 index 0000000000..6f81f060af --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_fdcan.c @@ -0,0 +1,1250 @@ +#include "hal_fdcan.h" + +#ifdef HAL_FDCAN_MODULE_ENABLED + +__weak void HAL_FDCAN_IRQHandler(FDCAN_HandleTypeDef *hfdcan) +{ + if (__HAL_FDCAN_GET_FLAG(hfdcan, FDCAN_FLAG_RX_BUFFER_NEW_MESSAGE) != 0U) + { + __HAL_FDCAN_CLEAR_FLAG(hfdcan, FDCAN_FLAG_RX_BUFFER_NEW_MESSAGE); + HAL_FDCAN_RxBufferNewMessageCallback(hfdcan); + } + + if (__HAL_FDCAN_GET_FLAG(hfdcan, FDCAN_FLAG_RX_BUFFER_FULL) != 0U) + { + __HAL_FDCAN_CLEAR_FLAG(hfdcan, FDCAN_FLAG_RX_BUFFER_FULL); + HAL_FDCAN_RxBufferFullCallback(hfdcan); + } + + if (__HAL_FDCAN_GET_FLAG(hfdcan, FDCAN_FLAG_RX_BUFFER_OVERRUN) != 0U) + { + __HAL_FDCAN_CLEAR_FLAG(hfdcan, FDCAN_FLAG_RX_BUFFER_OVERRUN); + HAL_FDCAN_RxBufferOVCallback(hfdcan); + } + + if (__HAL_FDCAN_GET_FLAG(hfdcan, FDCAN_FLAG_TX_STB_COMPLETE) != 0U) + { + __HAL_FDCAN_CLEAR_FLAG(hfdcan, FDCAN_FLAG_TX_STB_COMPLETE); + HAL_FDCAN_TXSTBCompletedCallback(hfdcan); + } + + if (__HAL_FDCAN_GET_FLAG(hfdcan, FDCAN_FLAG_TX_PTB_COMPLETE) != 0U) + { + __HAL_FDCAN_CLEAR_FLAG(hfdcan, FDCAN_FLAG_TX_PTB_COMPLETE); + HAL_FDCAN_TXPTBCompletedCallback(hfdcan); + } + + if (__HAL_FDCAN_GET_FLAG(hfdcan, FDCAN_FLAG_RX_BUFFER_ALMOSTFULL) != 0U) + { + __HAL_FDCAN_CLEAR_FLAG(hfdcan, FDCAN_FLAG_RX_BUFFER_ALMOSTFULL); +// HAL_FDCAN_RxBufferAFCallback(hfdcan); + } + + if (__HAL_FDCAN_GET_FLAG(hfdcan, FDCAN_FLAG_TX_ABORT_COMPLETE) != 0U) + { + __HAL_FDCAN_CLEAR_FLAG(hfdcan, FDCAN_FLAG_TX_ABORT_COMPLETE); + HAL_FDCAN_TxAbortCallback(hfdcan); + } + + if (__HAL_FDCAN_GET_FLAG(hfdcan, FDCAN_FLAG_ERROR) != 0U) + { + __HAL_FDCAN_CLEAR_FLAG(hfdcan, FDCAN_FLAG_ERROR); + HAL_FDCAN_ErrorCallback(hfdcan); + } + + if (__HAL_FDCAN_GET_FLAG(hfdcan, FDCAN_FLAG_BUS_ERROR) != 0U) + { + __HAL_FDCAN_CLEAR_FLAG(hfdcan, FDCAN_FLAG_BUS_ERROR); + HAL_FDCAN_BusErrorCallback(hfdcan); + } + + if (__HAL_FDCAN_GET_FLAG(hfdcan, FDCAN_FLAG_ERROR_PASSIVE) != 0U) + { + __HAL_FDCAN_CLEAR_FLAG(hfdcan, FDCAN_FLAG_ERROR_PASSIVE); + HAL_FDCAN_ErrorPassiveCallback(hfdcan); + } + + if (__HAL_FDCAN_GET_FLAG(hfdcan, FDCAN_FLAG_ARBITRATION_LOST) != 0U) + { + __HAL_FDCAN_CLEAR_FLAG(hfdcan, FDCAN_FLAG_ARBITRATION_LOST); + HAL_FDCAN_ArbitrationLostCallback(hfdcan); + } + + if(__HAL_FDCAN_TT_GET_FLAG(hfdcan, FDCAN_TTCFG_REFMSGIF)) + { + __HAL_FDCAN_TT_CLEAR_FLAG(hfdcan, FDCAN_TTCFG_REFMSGIF); + printfS("REFMSGIF\r\n"); + } + + if(__HAL_FDCAN_TT_GET_FLAG(hfdcan, FDCAN_TTCFG_WTIF)) + { + __HAL_FDCAN_TT_CLEAR_FLAG(hfdcan, FDCAN_TTCFG_WTIF); + printfS("WTIF\r\n"); + } + + if(__HAL_FDCAN_TT_GET_FLAG(hfdcan, FDCAN_TTCFG_TTIF)) + { + __HAL_FDCAN_TT_CLEAR_FLAG(hfdcan, FDCAN_TTCFG_TTIF); + HAL_FDCAN_TT_TimerTriggerCallback(hfdcan); + + } + + if(__HAL_FDCAN_TT_GET_FLAG(hfdcan, FDCAN_TTCFG_TEIF)) + { + __HAL_FDCAN_TT_CLEAR_FLAG(hfdcan, FDCAN_TTCFG_TEIF); + printfS("TEIF\r\n"); + } + +} + + +/** + * @brief Initializes the FDCAN peripheral according to the specified + * parameters in the FDCAN_InitTypeDef structure. + * @param hfdcan pointer to an FDCAN_HandleTypeDef structure that contains + * the configuration information for the specified FDCAN. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_FDCAN_Init(FDCAN_HandleTypeDef *hfdcan) +{ + uint32_t tickstart; + + /* Check function parameters */ + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + assert_param(IS_FDCAN_RX_BUF_MODE(hfdcan->Init.RxBufOverFlowMode)); + +#if USE_HAL_FDCAN_REGISTER_CALLBACKS == 1 + if (hfdcan->State == HAL_FDCAN_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hfdcan->Lock = HAL_UNLOCKED; + + /* Reset callbacks to legacy functions */ + hfdcan->TxEventFifoCallback = HAL_FDCAN_TxEventFifoCallback; /* Legacy weak TxEventFifoCallback */ + hfdcan->RxFifo0Callback = HAL_FDCAN_RxFifo0Callback; /* Legacy weak RxFifo0Callback */ + hfdcan->RxFifo1Callback = HAL_FDCAN_RxFifo1Callback; /* Legacy weak RxFifo1Callback */ + hfdcan->TxFifoEmptyCallback = HAL_FDCAN_TxFifoEmptyCallback; /* Legacy weak TxFifoEmptyCallback */ + hfdcan->TxBufferCompleteCallback = HAL_FDCAN_TxBufferCompleteCallback; /* Legacy weak + TxBufferCompleteCallback */ + hfdcan->TxBufferAbortCallback = HAL_FDCAN_TxBufferAbortCallback; /* Legacy weak + TxBufferAbortCallback */ + hfdcan->HighPriorityMessageCallback = HAL_FDCAN_HighPriorityMessageCallback; /* Legacy weak + HighPriorityMessageCallback */ + hfdcan->TimestampWraparoundCallback = HAL_FDCAN_TimestampWraparoundCallback; /* Legacy weak + TimestampWraparoundCallback */ + hfdcan->TimeoutOccurredCallback = HAL_FDCAN_TimeoutOccurredCallback; /* Legacy weak + TimeoutOccurredCallback */ + hfdcan->ErrorCallback = HAL_FDCAN_ErrorCallback; /* Legacy weak ErrorCallback */ + hfdcan->ErrorStatusCallback = HAL_FDCAN_ErrorStatusCallback; /* Legacy weak ErrorStatusCallback */ + + if (hfdcan->MspInitCallback == NULL) + { + hfdcan->MspInitCallback = HAL_FDCAN_MspInit; /* Legacy weak MspInit */ + } + + /* Init the low level hardware: CLOCK, NVIC */ + hfdcan->MspInitCallback(hfdcan); + } +#else + if (hfdcan->State == HAL_FDCAN_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hfdcan->Lock = HAL_UNLOCKED; + + /* Init the low level hardware: CLOCK, NVIC */ + HAL_FDCAN_MspInit(hfdcan); + } +#endif /* USE_HAL_FDCAN_REGISTER_CALLBACKS */ + + /* Enter to RESET state */ + __HAL_FDCAN_ENTER_RESET_STATE(hfdcan); + + MODIFY_REG(hfdcan->Instance->CR, FDCAN_CR_FD_ISO, hfdcan->Init.FrameISOType); + + /* Set the nominal bit timing register */ + hfdcan->Instance->SBTR.b.PRESC = (uint8_t)hfdcan->Init.NominalPrescaler - 1; + hfdcan->Instance->SBTR.b.SJW = (uint8_t)hfdcan->Init.NominalSyncJumpWidth; + hfdcan->Instance->SBTR.b.SEG1 = (uint8_t)hfdcan->Init.NominalTimeSeg1 - 2; + hfdcan->Instance->SBTR.b.SEG2 = (uint8_t)hfdcan->Init.NominalTimeSeg2 - 1; + + /* If FD operation with BRS is selected, set the data bit timing register */ + hfdcan->Instance->FBTR.b.PRESC = (uint8_t)hfdcan->Init.DataPrescaler - 1; + hfdcan->Instance->FBTR.b.SJW = (uint8_t)hfdcan->Init.DataSyncJumpWidth; + hfdcan->Instance->FBTR.b.SEG1 = (uint8_t)hfdcan->Init.DataTimeSeg1 - 2; + hfdcan->Instance->FBTR.b.SEG2 = (uint8_t)hfdcan->Init.DataTimeSeg2 - 1; + + __HAL_FDCAN_EXIT_RESET_STATE(hfdcan); + + + if((hfdcan->Init.AutoRetransmission == DISABLE) || (hfdcan->Init.Mode == FDCAN_MODE_LBME)) + { + /* single shot mode */ + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TPSS); + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TSSS); + } + else + { + /* Auto re-transmission */ + CLEAR_BIT(hfdcan->Instance->CR, FDCAN_CR_TPSS); + CLEAR_BIT(hfdcan->Instance->CR, FDCAN_CR_TSSS); + } + + if(hfdcan->Init.RxBufOverFlowMode == FDCAN_RX_BUF_BLOCKING) + { + /* 1 - The new message will not be stored */ + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_ROM); + } + else + { + /* 0 - The oldest message will be overwritten */ + CLEAR_BIT(hfdcan->Instance->CR, FDCAN_CR_ROM); + } + + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Reset FDCAN Operation Mode */ + CLEAR_BIT(hfdcan->Instance->CR, FDCAN_CR_LBME | FDCAN_CR_LBMI | FDCAN_CR_LOM | FDCAN_CR_SACK); + + SET_BIT(hfdcan->Instance->CR, hfdcan->Init.Mode); + + /* Initialize the error code */ + hfdcan->ErrorCode = ERR_FDCAN_NONE; + + /* Initialize the FDCAN state */ + hfdcan->State = HAL_FDCAN_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + + +HAL_StatusTypeDef HAL_FDCAN_Start(FDCAN_HandleTypeDef *hfdcan) +{ +#if 0 + if (hfdcan->State == HAL_FDCAN_STATE_READY) + { + /* Change FDCAN peripheral state */ + hfdcan->State = HAL_FDCAN_STATE_BUSY; + + /* Request leave initialisation */ + __HAL_FDCAN_EXIT_RESET_STATE(hfdcan); + + /* Reset the FDCAN ErrorCode */ + hfdcan->ErrorCode = ERR_FDCAN_NONE; + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hfdcan->ErrorCode |= HAL_FDCAN_ERROR_NOT_READY; + + return HAL_ERROR; + } +#endif + /* Request leave initialisation */ + __HAL_FDCAN_EXIT_RESET_STATE(hfdcan); + + /* Reset the FDCAN ErrorCode */ + hfdcan->ErrorCode = ERR_FDCAN_NONE; + + /* Return function status */ + return HAL_OK; +} + +HAL_StatusTypeDef HAL_FDCAN_Stop(FDCAN_HandleTypeDef *hfdcan) +{ +#if 0 + uint32_t Counter = 0U; + + if (hfdcan->State == HAL_FDCAN_STATE_BUSY) + { + /* Request initialisation */ + SET_BIT(hfdcan->Instance->CCCR, FDCAN_CCCR_INIT); + + /* Wait until the INIT bit into CCCR register is set */ + while ((hfdcan->Instance->CCCR & FDCAN_CCCR_INIT) == 0U) + { + /* Check for the Timeout */ + if (Counter > FDCAN_TIMEOUT_COUNT) + { + /* Update error code */ + hfdcan->ErrorCode |= HAL_FDCAN_ERROR_TIMEOUT; + + /* Change FDCAN state */ + hfdcan->State = HAL_FDCAN_STATE_ERROR; + + return HAL_ERROR; + } + + /* Increment counter */ + Counter++; + } + + /* Reset counter */ + Counter = 0U; + + /* Exit from Sleep mode */ + CLEAR_BIT(hfdcan->Instance->CCCR, FDCAN_CCCR_CSR); + + /* Wait until FDCAN exits sleep mode */ + while ((hfdcan->Instance->CCCR & FDCAN_CCCR_CSA) == FDCAN_CCCR_CSA) + { + /* Check for the Timeout */ + if (Counter > FDCAN_TIMEOUT_COUNT) + { + /* Update error code */ + hfdcan->ErrorCode |= HAL_FDCAN_ERROR_TIMEOUT; + + /* Change FDCAN state */ + hfdcan->State = HAL_FDCAN_STATE_ERROR; + + return HAL_ERROR; + } + + /* Increment counter */ + Counter++; + } + + /* Enable configuration change */ + SET_BIT(hfdcan->Instance->CCCR, FDCAN_CCCR_CCE); + + /* Reset Latest Tx FIFO/Queue Request Buffer Index */ + hfdcan->LatestTxFifoQRequest = 0U; + + /* Change FDCAN peripheral state */ + hfdcan->State = HAL_FDCAN_STATE_READY; + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hfdcan->ErrorCode |= HAL_FDCAN_ERROR_NOT_STARTED; + + return HAL_ERROR; + } +#endif + return HAL_OK; +} + + + +HAL_StatusTypeDef HAL_FDCAN_ConfigFilter(FDCAN_HandleTypeDef *hfdcan, FDCAN_FilterTypeDef *sFilterConfig) +{ +#if 0 + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + assert_param(IS_FILTER_ID_TYPE(sFilterConfig->IdType)); + assert_param(IS_VALID_FILTER_INDEX(sFilterConfig->FilterIndex)); + + __HAL_FDCAN_ENTER_RESET_STATE(hfdcan); + + //MODIFY_REG(hfdcan->Instance->ACFCR.w, FDCAN_ACFCR_ACFADR_Msk, sFilterConfig->FilterIndex << FDCAN_ACFCR_ACFADR_Pos); + hfdcan->Instance->ACFCR.b.ACFADR = sFilterConfig->FilterIndex; + + /* select ACODE */ + //CLEAR_BIT(hfdcan->Instance->ACFCR.w, FDCAN_ACFCR_SELMASK); + hfdcan->Instance->ACFCR.b.SELMASK = 0; + hfdcan->Instance->ACODR.b.ACM = sFilterConfig->FilerCode & 0x1FFFFFFF; + /* select AMASK */ + //SET_BIT(hfdcan->Instance->ACFCR.w, FDCAN_ACFCR_SELMASK); + hfdcan->Instance->ACFCR.b.SELMASK = 1; + hfdcan->Instance->ACODR.b.ACM = sFilterConfig->FilerMask & 0x1FFFFFFF; + + if(sFilterConfig->IdType == FDCAN_STANDARD_ID) + { + hfdcan->Instance->ACODR.b.AIDEE = 1; + hfdcan->Instance->ACODR.b.AIDE = 0; + } + else if(sFilterConfig->IdType == FDCAN_EXTENDED_ID) + { + hfdcan->Instance->ACODR.b.AIDEE = 1; + hfdcan->Instance->ACODR.b.AIDE = 1; + } + else + { + hfdcan->Instance->ACODR.b.AIDEE = 0; + } + + __HAL_FDCAN_EXIT_RESET_STATE(hfdcan); + + //SET_BIT(hfdcan->Instance->ACFCR.w, sFilterConfig->FilterIndex << FDCAN_ACFCR_AE_Pos); + hfdcan->Instance->ACFCR.b.AE |= 1 << sFilterConfig->FilterIndex; +#endif + return HAL_OK; +} + +HAL_StatusTypeDef HAL_FDCAN_NewConfigFilter(FDCAN_HandleTypeDef *hfdcan, FDCAN_NewFilterTypeDef *sFilterConfig) +{ + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); +// assert_param(IS_FILTER_ID_TYPE(sFilterConfig->IdType)); + assert_param(IS_VALID_FILTER_INDEX(sFilterConfig->FilterIndex)); + + __HAL_FDCAN_ENTER_RESET_STATE(hfdcan); + + printfS("\r\n[%d]====================================:\r\n", sFilterConfig->FilterIndex); + + //MODIFY_REG(hfdcan->Instance->ACFCR.w, FDCAN_ACFCR_ACFADR_Msk, sFilterConfig->FilterIndex << FDCAN_ACFCR_ACFADR_Pos); + hfdcan->Instance->ACFCR.b.ACFADR = sFilterConfig->FilterIndex; + + switch(sFilterConfig->FilterType) + { + case FDCAN_FILTER_TYPE0: + hfdcan->Instance->ACFCR.b.SELMASK = 0; + hfdcan->Instance->ACODR = sFilterConfig->Filter.type0.code32.w; + hfdcan->Instance->ACFCR.b.SELMASK = 1; + hfdcan->Instance->ACODR = sFilterConfig->Filter.type0.mask32.w; + + hfdcan->Instance->ACFMODE &= (~((1 << sFilterConfig->FilterIndex) << 16)); //32bit + hfdcan->Instance->ACFMODE &= (~(1 << sFilterConfig->FilterIndex)); //mask + break; + + case FDCAN_FILTER_TYPE1: + hfdcan->Instance->ACFCR.b.SELMASK = 0; + hfdcan->Instance->ACODR = sFilterConfig->Filter.type1.code32.w; + hfdcan->Instance->ACFCR.b.SELMASK = 1; + hfdcan->Instance->ACODR = sFilterConfig->Filter.type1.code32_2.w; + + hfdcan->Instance->ACFMODE &= (~((1 << sFilterConfig->FilterIndex) << 16)); //32bit + hfdcan->Instance->ACFMODE |= (1 << sFilterConfig->FilterIndex); //mask Ч + break; + + case FDCAN_FILTER_TYPE2: + hfdcan->Instance->ACFCR.b.SELMASK = 0; + hfdcan->Instance->ACODR = sFilterConfig->Filter.type2.code16.hw | (sFilterConfig->Filter.type2.code16_2.hw << 16); + hfdcan->Instance->ACFCR.b.SELMASK = 1; + hfdcan->Instance->ACODR = sFilterConfig->Filter.type2.mask16.hw | (sFilterConfig->Filter.type2.mask16_2.hw << 16); + + hfdcan->Instance->ACFMODE |= (1 << sFilterConfig->FilterIndex) << 16; //16bit + hfdcan->Instance->ACFMODE &= (~(1 << sFilterConfig->FilterIndex)); //mask + break; + + case FDCAN_FILTER_TYPE3: + hfdcan->Instance->ACFCR.b.SELMASK = 0; + hfdcan->Instance->ACODR = sFilterConfig->Filter.type3.code16.hw | (sFilterConfig->Filter.type3.code16_2.hw << 16); + hfdcan->Instance->ACFCR.b.SELMASK = 1; + hfdcan->Instance->ACODR = sFilterConfig->Filter.type3.code16_3.hw | (sFilterConfig->Filter.type3.code16_4.hw << 16); + + hfdcan->Instance->ACFMODE |= (1 << sFilterConfig->FilterIndex) << 16; //16bit + hfdcan->Instance->ACFMODE |= 1 << sFilterConfig->FilterIndex; //mask Ч + break; + } + + + __HAL_FDCAN_EXIT_RESET_STATE(hfdcan); + + hfdcan->Instance->ACFCR.b.AE |= 1 << sFilterConfig->FilterIndex; + + return HAL_OK; +} + + +HAL_StatusTypeDef HAL_FDCAN_EnableLoopBackInternal(FDCAN_HandleTypeDef *hfdcan) +{ + assert_param (IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + if(HAL_FDCAN_GetBusStatus(hfdcan) & FDCAN_BUS_TACTIVE) + return HAL_BUSY; + + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_LBMI); + + return HAL_OK; +} + +/* FDCAN should be re-initisized after calling HAL_FDCAN_DisLoopBackInternal */ +HAL_StatusTypeDef HAL_FDCAN_DisLoopBackInternal(FDCAN_HandleTypeDef *hfdcan) +{ + assert_param (IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_RESET); + + return HAL_OK; +} + + +HAL_StatusTypeDef HAL_FDCAN_EnableLoopBackExternal(FDCAN_HandleTypeDef *hfdcan, bool sack) +{ + assert_param (IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + if(HAL_FDCAN_GetBusStatus(hfdcan) & FDCAN_BUS_TACTIVE) + return HAL_BUSY; + + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_LBME); + if(sack) + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_SACK); + else + CLEAR_BIT(hfdcan->Instance->CR, FDCAN_CR_SACK); + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_FDCAN_DisableLoopBackExternal(FDCAN_HandleTypeDef *hfdcan) +{ + assert_param (IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + CLEAR_BIT(hfdcan->Instance->CR, FDCAN_CR_LBME); + + return HAL_OK; +} +/****************************************************************************** +*@brief : Transmission single shot mode configuration for PTB +* +*@param : hfdcan: a pointer of FDCAN_HandleTypeDef structure which contains +* the configuration information for the specified FDCAN. +*@param : state: Mode new state. This parameter can be: ENABLE or DISABLE. +*@note : If state is ENABLE, The transmission for PTB is configed in single shot mode, + otherwise it is in auto-retransmission mode. + The configuration will reset to default mode(auto-retransmission mode) + by module local reset. +*@return: None +******************************************************************************/ +void HAL_FDCAN_PTBTranmistSingleShot(FDCAN_HandleTypeDef *hfdcan, FunctionalState state) +{ + assert_param (IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + assert_param (IS_FUNCTIONAL_STATE(state)); + + if(state == ENABLE) + { + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TPSS); + } + else + { + CLEAR_BIT(hfdcan->Instance->CR, FDCAN_CR_TPSS); + } +} + +/****************************************************************************** +*@brief : Transmission single shot mode configuration for STB +* +*@param : hfdcan: a pointer of FDCAN_HandleTypeDef structure which contains +* the configuration information for the specified FDCAN. +*@param : state: Mode new state. This parameter can be: ENABLE or DISABLE. +*@note : If state is ENABLE, The transmission for PTB is configed in single shot mode, + otherwise it is in auto-retransmission mode. + The configuration will reset to default mode(auto-retransmission mode) + by module local reset. +*@return: None +******************************************************************************/ +void HAL_FDCAN_STBTranmistSingleShot(FDCAN_HandleTypeDef *hfdcan, FunctionalState state) +{ + assert_param (IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + assert_param (IS_FUNCTIONAL_STATE(state)); + + if(state == ENABLE) + { + __HAL_FDCAN_ENABLE_IT(hfdcan, FDCAN_IE_BUS_ERROR | FDCAN_IE_ARBITRATION_LOST); + + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TSSS); + } + else + { + CLEAR_BIT(hfdcan->Instance->CR, FDCAN_CR_TSSS); + } +} + +HAL_StatusTypeDef HAL_FDCAN_ClearEntireSTB(FDCAN_HandleTypeDef *hfdcan) +{ + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TSALL | FDCAN_CR_TSA); + return HAL_OK; +} + +HAL_StatusTypeDef HAL_FDCAN_AddMessageToPTB(FDCAN_HandleTypeDef *hfdcan, FDCAN_TxHeaderTypeDef *pTxHeader, uint8_t *pTxData) +{ + uint8_t i; + + uint8_t data_len; + + uint32_t* ptmp; + + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + assert_param(IS_FDCAN_DLC(pTxHeader->FrameInfo.b.DLC)); + + if(READ_BIT(hfdcan->Instance->CR, FDCAN_CR_TPE)) + { + hfdcan->ErrorCode = ERR_FDCAN_PTB_LOCKED; + return HAL_BUSY; + } + + CLEAR_BIT(hfdcan->Instance->CR, FDCAN_CR_TBSEL); + + ptmp = (uint32_t*)pTxHeader; + + hfdcan->Instance->TBUF[0] = *ptmp++; + hfdcan->Instance->TBUF[1] = *ptmp; + + data_len = __HAL_FDCAN_DLC2LEN(pTxHeader->FrameInfo.b.DLC); + + for(i = 0; i < (data_len + 3) / 4; i++) + { + hfdcan->Instance->TBUF[2 + i] = *(uint32_t*)pTxData; + pTxData += 4; + } + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_FDCAN_TransmitMessageByPTB(FDCAN_HandleTypeDef *hfdcan, FDCAN_TxHeaderTypeDef *pTxHeader, uint8_t *pTxData) +{ + HAL_StatusTypeDef status; + + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + assert_param(IS_FDCAN_DLC(pTxHeader->FrameInfo.b.DLC)); + + status = HAL_FDCAN_AddMessageToPTB(hfdcan, pTxHeader, pTxData); + + if(status) + return status; + + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TPE); + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_FDCAN_AddMessageToSTB(FDCAN_HandleTypeDef *hfdcan, FDCAN_TxHeaderTypeDef *pTxHeader, uint8_t *pTxData) +{ + uint8_t i; + + uint8_t data_len; + + uint32_t* ptmp; + + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + assert_param(IS_FDCAN_DLC(pTxHeader->FrameInfo.b.DLC)); + + if((hfdcan->Instance->CR & FDCAN_CR_TSSTAT) == (3 << FDCAN_CR_TSSTAT_Pos)) + { + hfdcan->ErrorCode |= ERR_FDCAN_TXBUF_FULL; + return HAL_BUSY; + } + + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TBSEL); + + ptmp = (uint32_t*)pTxHeader; + + hfdcan->Instance->TBUF[0] = *ptmp++; + hfdcan->Instance->TBUF[1] = *ptmp; + + data_len = __HAL_FDCAN_DLC2LEN(pTxHeader->FrameInfo.b.DLC); + + for(i = 0; i < (data_len + 3) / 4; i++) + { + hfdcan->Instance->TBUF[2 + i] = *(uint32_t*)pTxData; + pTxData += 4; + } + + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TSNEXT); + + return HAL_OK; +} + + +HAL_StatusTypeDef HAL_FDCAN_EnableSTBPriorityMode(FDCAN_HandleTypeDef *hfdcan) +{ + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TSMODE); + return HAL_OK; +} + +HAL_StatusTypeDef HAL_FDCAN_DisableSTBPriorityMode(FDCAN_HandleTypeDef *hfdcan) +{ + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + CLEAR_BIT(hfdcan->Instance->CR, FDCAN_CR_TSMODE); + return HAL_OK; +} + +HAL_StatusTypeDef HAL_FDCAN_TransmitMessageBySTB(FDCAN_HandleTypeDef *hfdcan, FDCAN_TxHeaderTypeDef *pTxHeader, uint8_t *pTxData) +{ + HAL_StatusTypeDef status; + + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + assert_param(IS_FDCAN_DLC(pTxHeader->FrameInfo.b.DLC)); + + status = HAL_FDCAN_AddMessageToSTB(hfdcan, pTxHeader, pTxData); + + if(status) + return status; + + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TSALL); + + return HAL_OK; +} + + +HAL_StatusTypeDef HAL_FDCAN_EnableTxBufferRequest(FDCAN_HandleTypeDef *hfdcan, TransmitType_enum type) +{ + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + assert_param(IS_FDCAN_TRANSMIT_TYPE(type)); + + if(type == FDCAN_TRANSMIT_PTB) + { + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TPE); + } + else if(type == FDCAN_TRANSMIT_STB_ALL) + { + if(READ_BIT(hfdcan->Instance->CR, FDCAN_CR_TSONE)) + { + hfdcan->ErrorCode = HAL_FDCAN_ERROR_PENDING; + return HAL_BUSY; + } + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TSALL); + } + else + { + if(READ_BIT(hfdcan->Instance->CR, FDCAN_CR_TSALL)) + { + hfdcan->ErrorCode = HAL_FDCAN_ERROR_PENDING; + return HAL_BUSY; + } + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TSONE); + } + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_FDCAN_AbortTxRequest(FDCAN_HandleTypeDef *hfdcan, TransmitAbortType_enum type) +{ + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + assert_param(IS_FDCAN_ABORT_TYPE(type)); + + if(type == FDCAN_ABORT_PTB) + { + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TPA); + while(READ_BIT(hfdcan->Instance->CR, FDCAN_CR_TPA)); + } + else + { + + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TSA); + while(READ_BIT(hfdcan->Instance->CR, FDCAN_CR_TSA)); + } + + return HAL_OK; +} + +//true: completed; false: not completed +bool HAL_FDCAN_GetTxReqCompleted(FDCAN_HandleTypeDef *hfdcan, TransmitType_enum type) +{ + bool tx_status = false; + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + if(type == FDCAN_TRANSMIT_PTB) + { + if(!READ_BIT(hfdcan->Instance->CR, FDCAN_CR_TPE)) + tx_status = true; + } + else if(type == FDCAN_TRANSMIT_STB_ALL) + { + if(!READ_BIT(hfdcan->Instance->CR, FDCAN_CR_TSALL)) + tx_status = true; + } + else if(type == FDCAN_TRANSMIT_STB_ONE) + { + if(!READ_BIT(hfdcan->Instance->CR, FDCAN_CR_TSONE)) + tx_status = true; + } + + return tx_status; +} + +uint32_t HAL_FDCAN_GetBusStatus(FDCAN_HandleTypeDef *hfdcan) +{ + return (hfdcan->Instance->CR & 0x7); +} + + +HAL_StatusTypeDef HAL_FDCAN_WaitTxCompleted(FDCAN_HandleTypeDef *hfdcan, TransmitType_enum type, uint32_t timeout) +{ + uint32_t tickstart = 0; + + TransmitAbortType_enum abort_cmd; + + abort_cmd = (type == FDCAN_TRANSMIT_PTB)? FDCAN_ABORT_PTB : FDCAN_ABORT_STB; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(!HAL_FDCAN_GetTxReqCompleted(hfdcan, type)) + { + if((HAL_GetTick() - tickstart) > timeout) + { + /* Update error code */ + //hfdcan->ErrorCode |= ERR_FDCAN_TIMEOUT; + + HAL_FDCAN_AbortTxRequest(hfdcan, abort_cmd); + + return HAL_ERROR; + } + } + + return HAL_OK; +} + +/* make sure the pRxData buffer size is aligned of uint32_t */ +HAL_StatusTypeDef HAL_FDCAN_GetRxMessage(FDCAN_HandleTypeDef *hfdcan, FDCAN_RxHeaderTypeDef *pRxHeader, uint8_t *pRxData) +{ + + uint8_t idx = 0; + uint8_t i; + uint8_t data_len; + + uint32_t* ptmp;// = (uint32_t*)pRxData; + + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + assert_param(pRxHeader); + assert_param(pRxData); + + if((hfdcan->Instance->CR & FDCAN_CR_RSTAT) == 0) + { + hfdcan->ErrorCode |= ERR_FDCAN_RXBUF_EMPTY; + return HAL_ERROR; + } + + ptmp = (uint32_t*)pRxHeader; + + *ptmp = hfdcan->Instance->RBUF[idx++]; + ptmp++; + *ptmp = hfdcan->Instance->RBUF[idx++]; + ptmp++; + + data_len = __HAL_FDCAN_DLC2LEN(pRxHeader->FrameInfo.b.DLC); + + for(i = 0; i < (data_len + 3) / 4; i++) + { + *(uint32_t*)pRxData = hfdcan->Instance->RBUF[idx++]; + pRxData += 4; + } + + + *ptmp = hfdcan->Instance->RBUF[18]; + ptmp++; + *ptmp = hfdcan->Instance->RBUF[19]; + + /* RELease buffer slot */ + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_RREL); + + return HAL_OK; +} + +FDCAN_RXBUF_FILL_STATE_enum HAL_FDCAN_GetRxBufFillState(FDCAN_HandleTypeDef *hfdcan) +{ + uint32_t FillLevel; + + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + FillLevel = (hfdcan->Instance->CR & FDCAN_CR_RSTAT) >> FDCAN_CR_RSTAT_Pos; + + if((FillLevel == FDCAN_RXBUF_FULL) && READ_BIT(hfdcan->Instance->CR, FDCAN_CR_ROV)) + FillLevel = FDCAN_RXBUF_OV; + + return (FDCAN_RXBUF_FILL_STATE_enum)FillLevel; +} + + +FDCAN_TXBUF_FILL_STATE_enum HAL_FDCAN_GetTxBufFillState(FDCAN_HandleTypeDef *hfdcan) +{ + uint32_t FreeLevel; + + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + FreeLevel = (hfdcan->Instance->CR & FDCAN_CR_TSSTAT) >> FDCAN_CR_TSSTAT_Pos; + + /* Return Tx BUF free level */ + return (FDCAN_TXBUF_FILL_STATE_enum)FreeLevel; +} + + +HAL_StatusTypeDef HAL_FDCAN_ConfigRxBufWarnningLimit(FDCAN_HandleTypeDef *hfdcan, uint8_t afwl) +{ + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + assert_param(IS_FDCAN_AFWL(afwl)); + + MODIFY_REG(hfdcan->Instance->LIMIT, FDCAN_LIMIT_AFWL_Msk, afwl << FDCAN_LIMIT_AFWL_Pos); + + return HAL_OK; +} + + +uint8_t HAL_FDCAN_GetRxBufWarnningLimit(FDCAN_HandleTypeDef *hfdcan) +{ + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + return ((hfdcan->Instance->LIMIT & FDCAN_LIMIT_AFWL_Msk) >> FDCAN_LIMIT_AFWL_Pos); +} + + +HAL_StatusTypeDef HAL_FDCAN_ConfigErrCntWarnningLimit(FDCAN_HandleTypeDef *hfdcan, uint8_t ecnt) +{ + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + MODIFY_REG(hfdcan->Instance->LIMIT, FDCAN_LIMIT_EWL_Msk, ecnt << FDCAN_LIMIT_EWL_Pos); + + return HAL_OK; +} + +uint8_t HAL_FDCAN_GetErrCntWarnningLimit(FDCAN_HandleTypeDef *hfdcan) +{ + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + return ((hfdcan->Instance->LIMIT & FDCAN_LIMIT_EWL_Msk) >> FDCAN_LIMIT_EWL_Pos); + + return HAL_OK; +} + + +HAL_StatusTypeDef HAL_FDCAN_ConfigRxBufOverwriteMode(FDCAN_HandleTypeDef *hfdcan, uint32_t OverwriteMode) +{ + /* Check function parameters */ + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + assert_param(IS_FDCAN_RX_BUF_MODE(OverwriteMode)); + + if (hfdcan->State == HAL_FDCAN_STATE_READY) + { + if(hfdcan->Init.RxBufOverFlowMode == FDCAN_RX_BUF_BLOCKING) + { + /* 1 - The new message will not be stored */ + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_ROM); + } + else + { + /* 0 - The oldest message will be overwritten */ + CLEAR_BIT(hfdcan->Instance->CR, FDCAN_CR_ROM); + } + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hfdcan->ErrorCode |= HAL_FDCAN_ERROR_NOT_READY; + + return HAL_ERROR; + } +} + +HAL_StatusTypeDef HAL_FDCAN_TransceiverEnterSTBY(FDCAN_HandleTypeDef *hfdcan) +{ + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_STBY); + return HAL_OK; +} + + +__weak void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef *hfdcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hfdcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FDCAN_MspInit could be implemented in the user file + */ +} + +HAL_StatusTypeDef HAL_FDCAN_GetErrorInfo(FDCAN_HandleTypeDef *hfdcan, FDCAN_ErrorInfo_u *errinfo) +{ + assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); + + if(!errinfo) + return HAL_ERROR; + + errinfo->w = hfdcan->Instance->ECC.w; + + return HAL_OK; +} + + +__weak void HAL_FDCAN_RxBufferNewMessageCallback(FDCAN_HandleTypeDef *hfdcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hfdcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FDCAN_RxBufferNewMessageCallback could be implemented in the user file + */ +} + +__weak void HAL_FDCAN_RxBufferAFCallback(FDCAN_HandleTypeDef *hfdcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hfdcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FDCAN_RxBufferNewMessageCallback could be implemented in the user file + */ +} + +__weak void HAL_FDCAN_RxBufferFullCallback(FDCAN_HandleTypeDef *hfdcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hfdcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FDCAN_RxBufferNewMessageCallback could be implemented in the user file + */ +} + +__weak void HAL_FDCAN_RxBufferOVCallback(FDCAN_HandleTypeDef *hfdcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hfdcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FDCAN_RxBufferNewMessageCallback could be implemented in the user file + */ +} + +__weak void HAL_FDCAN_TXPTBCompletedCallback(FDCAN_HandleTypeDef *hfdcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hfdcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FDCAN_RxBufferNewMessageCallback could be implemented in the user file + */ +} + +__weak void HAL_FDCAN_TXSTBCompletedCallback(FDCAN_HandleTypeDef *hfdcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hfdcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FDCAN_RxBufferNewMessageCallback could be implemented in the user file + */ +} + +__weak void HAL_FDCAN_TxAbortCallback(FDCAN_HandleTypeDef *hfdcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hfdcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FDCAN_RxBufferNewMessageCallback could be implemented in the user file + */ +} + + +__weak void HAL_FDCAN_ErrorCallback(FDCAN_HandleTypeDef *hfdcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hfdcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FDCAN_RxBufferNewMessageCallback could be implemented in the user file + */ +} + +__weak void HAL_FDCAN_BusErrorCallback(FDCAN_HandleTypeDef *hfdcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hfdcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FDCAN_RxBufferNewMessageCallback could be implemented in the user file + */ +} + +__weak void HAL_FDCAN_ErrorPassiveCallback(FDCAN_HandleTypeDef *hfdcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hfdcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FDCAN_RxBufferNewMessageCallback could be implemented in the user file + */ +} + +__weak void HAL_FDCAN_ArbitrationLostCallback(FDCAN_HandleTypeDef *hfdcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hfdcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FDCAN_RxBufferNewMessageCallback could be implemented in the user file + */ +} +/* ====================================================================================== */ + +__weak void HAL_FDCAN_TT_TimerTriggerCallback(FDCAN_HandleTypeDef *hfdcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hfdcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FDCAN_RxBufferNewMessageCallback could be implemented in the user file + */ +} + +HAL_StatusTypeDef HAL_FDCAN_TT_Config(FDCAN_HandleTypeDef *hfdcan, uint32_t TT_Presc) +{ + assert_param(IS_FDCAN_TT_INSTANCE(hfdcan->Instance)); + assert_param(IS_FDCAN_TT_TPRESC(TT_Presc)); + + CLEAR_BIT(hfdcan->Instance->TTCFG, FDCAN_TTCFG_TTEN); + + MODIFY_REG(hfdcan->Instance->TTCFG, FDCAN_TTCFG_T_PRESC, TT_Presc << FDCAN_TTCFG_T_PRESC_Pos); + + /* clear 'trigger error' interrupt flag */ + __HAL_FDCAN_TT_CLEAR_FLAG(hfdcan, FDCAN_TTCFG_TEIF); + + /* clear 'time trigger' interrupt flag */ + __HAL_FDCAN_TT_CLEAR_FLAG(hfdcan, FDCAN_TTCFG_TTIF); + + /* clear 'watch trigger' interrupt flag */ + __HAL_FDCAN_TT_CLEAR_FLAG(hfdcan, FDCAN_TTCFG_WTIF); + + /* Time Trigger Interrupt Enable */ + SET_BIT(hfdcan->Instance->TTCFG, FDCAN_TTCFG_TTIE); + + /* Watch Trigger Interrupt Flag */ + CLEAR_BIT(hfdcan->Instance->TTCFG, FDCAN_TTCFG_WTIE); + + SET_BIT(hfdcan->Instance->TTCFG, FDCAN_TTCFG_TTEN); + + SET_BIT(hfdcan->Instance->CR, FDCAN_CR_TTTBM); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Configure TTCAN reference message +* +*@param : hfdcan: FDCAN_HandleTypeDef handler +*@param : IdType: can be FDCAN_STANDARD_ID or FDCAN_EXTENDED_ID +*@param : Identifier : frame ID +*@param : Payload: not used +* +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_FDCAN_TT_ConfigReferenceMessage(FDCAN_HandleTypeDef *hfdcan, uint32_t IdType, uint32_t Identifier, uint32_t Payload) +{ + /* Check function parameters */ + assert_param(IS_FDCAN_TT_INSTANCE(hfdcan->Instance)); + assert_param(IS_FDCAN_ID_TYPE(IdType)); + + if (IdType == FDCAN_STANDARD_ID) + { + assert_param(IS_FDCAN_MAX_VALUE(Identifier, 0x7FFU)); + } + else /* IdType == FDCAN_EXTENDED_ID */ + { + assert_param(IS_FDCAN_MAX_VALUE(Identifier, 0x1FFFFFFFU)); + } + + hfdcan->Instance->TTREFMSG.b.REF_ID = Identifier; + + hfdcan->Instance->TTREFMSG.b.REF_IDE = (IdType == FDCAN_EXTENDED_ID) ? 1 : 0; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_FDCAN_TT_ConfigTrigger(FDCAN_HandleTypeDef *hfdcan, FDCAN_TriggerTypeDef *sTriggerConfig) +{ + hfdcan->Instance->TTTRIGCFG.w = sTriggerConfig->TriggerType << 8 | sTriggerConfig->TTPtr | sTriggerConfig->TxEnWindow << 12; + + hfdcan->Instance->TTTRIG = sTriggerConfig->TimeMark & 0xFFFF; + + if(hfdcan->Instance->TTTRIG != sTriggerConfig->TimeMark) + return HAL_ERROR; + + return HAL_OK; +} + +void HAL_FDCAN_TT_ImmediateTrigger(FDCAN_HandleTypeDef *hfdcan, uint8_t TTPtr) +{ + /* Select TBUF slot for the trigger */ + hfdcan->Instance->TTTRIGCFG.b.TTPTR = TTPtr; + + /* configure the trigger type and transmit enable window */ + hfdcan->Instance->TTTRIGCFG.b.TTYPE = FDCAN_TT_TX_IMMEDIATE_TRIGGER; + + hfdcan->Instance->TTTRIG = 1; + + return; +} + + +HAL_StatusTypeDef HAL_FDCAN_TT_AddMessageByTBPtr(FDCAN_HandleTypeDef *hfdcan, FDCAN_TxHeaderTypeDef *pTxHeader, uint8_t *pTxData, uint8_t TBPtr) +{ + uint8_t i; + uint8_t data_len; + uint32_t* ptmp; + + assert_param(IS_FDCAN_TT_INSTANCE(hfdcan->Instance)); + assert_param(IS_FDCAN_DLC(pTxHeader->FrameInfo.b.DLC)); + + MODIFY_REG(hfdcan->Instance->TTCFG, FDCAN_TTCFG_TBPTR_Msk, TBPtr << FDCAN_TTCFG_TBPTR_Pos); + + ptmp = (uint32_t*)pTxHeader; + + hfdcan->Instance->TBUF[0] = *ptmp++; + hfdcan->Instance->TBUF[1] = *ptmp; + + data_len = __HAL_FDCAN_DLC2LEN(pTxHeader->FrameInfo.b.DLC); + + for(i = 0; i < (data_len + 3) / 4; i++) + { + hfdcan->Instance->TBUF[2 + i] = *(uint32_t*)pTxData; + pTxData += 4; + } + + SET_BIT(hfdcan->Instance->TTCFG, FDCAN_TTCFG_TBF); + while(!READ_BIT(hfdcan->Instance->IR, FDCAN_IR_TSFF)); + + return HAL_OK; +} + + +HAL_StatusTypeDef HAL_FDCAN_TT_EnableWatchTrigger(FDCAN_HandleTypeDef *hfdcan, uint32_t cycle_time) +{ + assert_param(IS_FDCAN_TT_INSTANCE(hfdcan->Instance)); + + hfdcan->Instance->TTWTRIGR.w = (cycle_time & 0xFFFF); + SET_BIT(hfdcan->Instance->TTCFG, FDCAN_TTCFG_WTIE); + return HAL_OK; +} + + +HAL_StatusTypeDef HAL_FDCAN_TT_DisableWatchTrigger(FDCAN_HandleTypeDef *hfdcan) +{ + assert_param(IS_FDCAN_TT_INSTANCE(hfdcan->Instance)); + + CLEAR_BIT(hfdcan->Instance->TTCFG, FDCAN_TTCFG_WTIE); + return HAL_OK; +} + + + +HAL_StatusTypeDef HAL_FDCAN_EnableTimestamp(FDCAN_HandleTypeDef *hfdcan, uint32_t ts_position) +{ + assert_param(IS_FDCAN_TT_INSTANCE(hfdcan->Instance)); + assert_param(IS_FDCAN_TIMESTAMP_POSITION(ts_position)); + + hfdcan->Instance->TIMECFG = FDCAN_TIMCFG_TIMEEN | (ts_position << FDCAN_TIMCFG_TIMEPOS_Pos); + return HAL_OK; +} + + +HAL_StatusTypeDef HAL_FDCAN_DisableTimestamp(FDCAN_HandleTypeDef *hfdcan) +{ + assert_param(IS_FDCAN_TT_INSTANCE(hfdcan->Instance)); + + CLEAR_BIT(hfdcan->Instance->TIMECFG, FDCAN_TIMCFG_TIMEEN); + return HAL_OK; +} + +void HAL_FDCAN_GetTTS(FDCAN_HandleTypeDef *hfdcan, FDCAN_TTSTypeDef *tts) +{ + assert_param(IS_FDCAN_TT_INSTANCE(hfdcan->Instance)); + tts->tts_h = hfdcan->Instance->TTSH; + tts->tts_l = hfdcan->Instance->TTSL; +} + +#endif /* HAL_FDCAN_MODULE_ENABLED */ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_fmc.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_fmc.c new file mode 100644 index 0000000000..53c7f194e3 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_fmc.c @@ -0,0 +1,623 @@ +/****************************************************************************** +* @file : HAL_FMC.c +* @version : 1.0 +* @date : 2022.10.25 +* @brief : FMC HAL module driver +* +* @history : +* 2022.10.25 lwq create +* +******************************************************************************/ +#include "hal.h" + +#ifdef HAL_FMC_MODULE_ENABLED + +/****************************************************************************** +* @brief : Initialize the FMC NORSRAM MSP. +* @param : none. +* @return: none +******************************************************************************/ +__weak void HAL_FMC_NORSRAM_MspInit(void) +{ + + /* Prevent unused argument(s) compilation warning */ + + /* NOTE: This function Should not be modified, when the callback is needed, + the HAL_FMC_NORSRAM_MspInit could be implemented in the user file + */ +} + + +/****************************************************************************** +* @brief : Initialize the FMC NORSRAM peripheral. +* @param : hfmc: Pointer to a FMC_NORSRAMInitTypeDef structure that contains +* the configuration information for the specified FMC module. +* @return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NORSRAM_Init(FMC_NORSRAMInitTypeDef *hfmc) +{ + /* Check the parameters */ + assert_param(IS_FMC_NORSRAM_BANK(hfmc->NSBank)); + assert_param(IS_FMC_MUX(hfmc->DataAddressMux)); + assert_param(IS_FMC_MEMORY(hfmc->MemoryType)); + assert_param(IS_FMC_MEMORY_WIDTH(hfmc->MemoryDataWidth)); + assert_param(IS_FMC_BURSTMODE(hfmc->BurstAccessMode)); + assert_param(IS_FMC_WAIT_POLARITY(hfmc->WaitSignalPolarity)); + assert_param(IS_FMC_WRAP_MODE(hfmc->WrapMode)); + assert_param(IS_FMC_WAIT_SIGNAL_ACTIVE(hfmc->WaitSignalActive)); + assert_param(IS_FMC_WRITE_OPERATION(hfmc->WriteOperation)); + assert_param(IS_FMC_WAITE_SIGNAL(hfmc->WaitSignal)); + assert_param(IS_FMC_ASYNWAIT(hfmc->AsynchronousWait)); + assert_param(IS_FMC_CRAMPPAGE_SIZE(hfmc->CRAMPageSize)); + assert_param(IS_FMC_WRITE_MODE(hfmc->WriteMode)); + + + /* Enable FMC clock */ + __HAL_RCC_FMC_CLK_ENABLE(); + + /* Initialize the low level hardware (MSP) */ + HAL_FMC_NORSRAM_MspInit(); + + /*---------------------------- FMC SNCTL Configuration -----------------*/ + /* Clear NRBKEN, NRMUX, NRTP, NRW, NREN, SBRSTEN, NRWTPOL, WRAPEN, NRWTCFG, WREN, + NWAITEN, EXTMODEN, ASYNCWAIT, CPS and SYNCWR bits */ + FMC_NORSRAM->SNCTLCFG[hfmc->NSBank] &= ((uint32_t)~( FMC_SNCTLX_NRBKEN_Msk | FMC_SNCTLX_NRMUX_Msk | FMC_SNCTLX_NRTP_Msk | \ + FMC_SNCTLX_NRW_Msk | FMC_SNCTLX_NREN_Msk | FMC_SNCTLX_SBRSTEN_Msk | \ + FMC_SNCTLX_NRWTPOL_Msk | FMC_SNCTLX_WRAPEN_Msk | FMC_SNCTLX_NRWTCFG_Msk | \ + FMC_SNCTLX_WREN_Msk | FMC_SNCTLX_NRWTEN_Msk | FMC_SNCTLX_EXMODEN_Msk | \ + FMC_SNCTLX_ASYNCWAIT_Msk | FMC_SNCTLX_CPS_Msk | FMC_SNCTLX_SYNCWR_Msk)); + + /* Bank1 NOR/SRAM control register configuration */ + FMC_NORSRAM->SNCTLCFG[hfmc->NSBank] |= (uint32_t)(hfmc->DataAddressMux | \ + hfmc->MemoryType | \ + hfmc->MemoryDataWidth | \ + hfmc->BurstAccessMode | \ + hfmc->WaitSignalPolarity | \ + hfmc->WrapMode | \ + hfmc->WaitSignalActive | \ + hfmc->WriteOperation | \ + hfmc->WaitSignal | \ + hfmc->ExtendedMode | \ + hfmc->AsynchronousWait | \ + hfmc->CRAMPageSize | \ + hfmc->WriteMode); + + + + if(hfmc->MemoryType == FMC_MEMORY_TYPE_NOR) + { + FMC_NORSRAM->SNCTLCFG[hfmc->NSBank] |= (uint32_t)FMC_NORSRAM_FLASH_ACCESS_ENABLE; + } + + FMC_NORSRAM->SNCTLCFG[hfmc->NSBank] |= FMC_SNCTLX_NRBKEN; + + return HAL_OK; +} + + +/****************************************************************************** +* @brief : DeInitialize the FMC_NORSRAM peripheral +* @param : hfmc: Pointer to a FMC_NORSRAMInitTypeDef structure that contains +* the configuration information for the specified FMC module. +* @return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NORSRAM_DeInit(FMC_NORSRAMInitTypeDef *hfmc) +{ + /* Check the parameters */ + assert_param(IS_FMC_NORSRAM_BANK(hfmc->NSBank)); + + /* De-initialize the FMC_NORSRAM device */ + FMC_NORSRAM->SNCTLCFG[hfmc->NSBank] = 0x000030DAU; + + FMC_NORSRAM->SNCTLCFG[hfmc->NSBank+1] = 0x0FFFFFFFU; + + FMC_NORSRAM->SNWTCFG[hfmc->NSBank] = 0x0FFFFFFFU; + + return HAL_OK; +} + + +/****************************************************************************** +* @brief : Initialize the FMC_NORSRAM Timing according to the specified +* parameters in the FMC_NORSRAM_TimingTypeDef +* @param : Timing Pointer to NORSRAM Timing structure +* @param : Bank NORSRAM bank number +* @return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NORSRAM_Timing_Init(FMC_NORSRAMTimingInitTypeDef *Timing, uint32_t Bank) +{ + /* Check the parameters */ + assert_param(IS_FMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime)); + assert_param(IS_FMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime)); + assert_param(IS_FMC_DATASETUP_TIME(Timing->DataSetupTime)); + assert_param(IS_FMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration)); + assert_param(IS_FMC_CLK_DIV(Timing->CLKDivision)); + assert_param(IS_FMC_DATA_LATENCY(Timing->DataLatency)); + assert_param(IS_FMC_ACCESS_MODE(Timing->AccessMode)); + assert_param(IS_FMC_NORSRAM_BANK(Bank)); + + /*---------------------------- FMC SNTCFG Configuration -----------------*/ + /* Clear ASET, AHLD, DSET, BUSLAT, CKDIV, DLAT and ASYNCMO bits */ + FMC_NORSRAM->SNCTLCFG[Bank+1] &= ((uint32_t)~(FMC_SNTCFGX_ASET_Msk | FMC_SNTCFGX_AHLD_Msk | FMC_SNTCFGX_DSET_Msk | \ + FMC_SNTCFGX_BUSLAT_Msk | FMC_SNTCFGX_CKDIV_Msk | FMC_SNTCFGX_DLAT_Msk | \ + FMC_SNTCFGX_ASYNCMOD_Msk)); + + /* Bank1 NOR/SRAM timing register configuration */ + FMC_NORSRAM->SNCTLCFG[Bank+1] |= (uint32_t)Timing->AddressSetupTime | \ + (Timing->AddressHoldTime << FMC_SNTCFGX_AHLD_Pos) | \ + (Timing->DataSetupTime << FMC_SNTCFGX_DSET_Pos) | \ + (Timing->BusTurnAroundDuration << FMC_SNTCFGX_BUSLAT_Pos) | \ + (Timing->CLKDivision << FMC_SNTCFGX_CKDIV_Pos) | \ + (Timing->DataLatency << FMC_SNTCFGX_DLAT_Pos) | \ + Timing->AccessMode; + + return HAL_OK; +} + +/****************************************************************************** +* @brief : Initialize the FMC_NORSRAM Extended mode Timing according to the specified +* parameters in the FMC_NORSRAM_TimingTypeDef +* @param : Timing Pointer to NORSRAM Timing structure +* @param : Bank NORSRAM bank number +* @return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NORSRAM_Extended_Timing_Init(FMC_NORSRAMTimingInitTypeDef *Timing, uint32_t Bank, uint32_t ExtendedMode) +{ + /* Check the parameters */ + assert_param(IS_FMC_NORSRAM_BANK(Bank)); + assert_param(IS_FMC_EXTENDED_MODE(ExtendedMode)); + /*---------------------------- FMC SNWTCFG Configuration -----------------*/ + /* Bank1 NOR/SRAM timing register for write configuration, if extended mode is used */ + if(ExtendedMode == FMC_EXTENDED_MODE_ENABLE) + { + assert_param(IS_FMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime)); + assert_param(IS_FMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime)); + assert_param(IS_FMC_DATASETUP_TIME(Timing->DataSetupTime)); + assert_param(IS_FMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration)); + assert_param(IS_FMC_DATA_LATENCY(Timing->DataLatency)); + assert_param(IS_FMC_ACCESS_MODE(Timing->AccessMode)); + + /* Clear WASET, WAHLD, WDSET, WBUSLAT, DLAT, and WASYNCMOD bits */ + FMC_NORSRAM->SNWTCFG[Bank] &= ((uint32_t)~(FMC_SNWTCFGX_WASET_Msk | FMC_SNWTCFGX_WAHLD_Msk | FMC_SNWTCFGX_WDSET_Msk | \ + FMC_SNWTCFGX_WBUSLAT_Msk | FMC_SNWTCFGX_DLAT_Msk | FMC_SNWTCFGX_WASYNCMOD_Msk)); + + FMC_NORSRAM->SNWTCFG[Bank] |= (uint32_t)Timing->AddressSetupTime | + (Timing->AddressHoldTime << FMC_SNWTCFGX_WAHLD_Pos )| + (Timing->DataSetupTime << FMC_SNWTCFGX_WDSET_Pos) | + (Timing->BusTurnAroundDuration << FMC_SNWTCFGX_WBUSLAT_Pos) | + (Timing->DataLatency << FMC_SNWTCFGX_DLAT_Pos) | + Timing->AccessMode; + + } + else + { + FMC_NORSRAM->SNWTCFG[Bank] = 0x0FFFFFFF; + } + return HAL_OK; +} + +/****************************************************************************** +* @brief : Initialize the FMC SDRAM MSP. +* @param : none. +* @return: none +******************************************************************************/ +__weak void HAL_FMC_SDRAM_MspInit(void) +{ + + /* Prevent unused argument(s) compilation warning */ + + /* NOTE: This function Should not be modified, when the callback is needed, + the HAL_FMC_SDRAM_MspInit could be implemented in the user file + */ +} + +/****************************************************************************** +* @brief : Initializes the FMC_SDRAM device according to the specified +* control parameters in the FMC_SDRAMInitTypeDef +* @param : Init: Pointer to SDRAM Initialization structure +* @return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_SDRAM_Init(FMC_SDRAMInitTypeDef *Init) +{ + /* Check the parameters */ + assert_param(IS_FMC_SDRAM_BANK(Init->SDBank)); + assert_param(IS_FMC_COLUMNBITS_NUMBER(Init->ColumnBitsNumber)); + assert_param(IS_FMC_ROWBITS_NUMBER(Init->RowBitsNumber)); + assert_param(IS_FMC_SDMEMORY_WIDTH(Init->MemoryDataWidth)); + assert_param(IS_FMC_INTERNALBANK_NUMBER(Init->InternalBankNumber)); + assert_param(IS_FMC_CAS_LATENCY(Init->CASLatency)); + assert_param(IS_FMC_WRITE_PROTECTION(Init->WriteProtection)); + assert_param(IS_FMC_SDCLOCK_PERIOD(Init->SDClockPeriod)); + assert_param(IS_FMC_READ_BURST(Init->ReadBurst)); + assert_param(IS_FMC_READPIPE_DELAY(Init->ReadPipeDelay)); + + /* Enable FMC clock */ + __HAL_RCC_FMC_CLK_ENABLE(); + + /* Initialize the low level hardware (MSP) */ + HAL_FMC_SDRAM_MspInit(); + /* Set SDRAM bank configuration parameters */ + if (Init->SDBank != FMC_SDRAM_BANK2) + { + /* Clear NC, NR, MWID, NB, CAS, WP, SDCLK, RBURST, and RPIPE bits */ + FMC_SDRAM->SDRCR[FMC_SDRAM_BANK1] &= ((uint32_t)~(FMC_SDRCR_NCA_Msk | FMC_SDRCR_NRA_Msk | FMC_SDRCR_MWID_Msk | \ + FMC_SDRCR_NB_Msk | FMC_SDRCR_CAS_Msk | FMC_SDRCR_WP_Msk | \ + FMC_SDRCR_CLKDIV_Msk | FMC_SDRCR_RBURST_Msk | FMC_SDRCR_RPIPE_Msk)); + + FMC_SDRAM->SDRCR[FMC_SDRAM_BANK1] |= (uint32_t)(Init->ColumnBitsNumber |\ + Init->RowBitsNumber |\ + Init->MemoryDataWidth |\ + Init->InternalBankNumber |\ + Init->CASLatency |\ + Init->WriteProtection |\ + Init->SDClockPeriod |\ + Init->ReadBurst |\ + Init->ReadPipeDelay + ); + } + else /* FMC_Bank2_SDRAM */ + { + /* Clear SDCLK, RBURST, and RPIPE bits */ + FMC_SDRAM->SDRCR[FMC_SDRAM_BANK1] &= ((uint32_t)~(FMC_SDRCR_CLKDIV_Msk | FMC_SDRCR_RBURST_Msk | FMC_SDRCR_RPIPE_Msk)); + + FMC_SDRAM->SDRCR[FMC_SDRAM_BANK1] |= (uint32_t)(Init->SDClockPeriod |\ + Init->ReadBurst |\ + Init->ReadPipeDelay); + + /* Clear NC, NR, MWID, NB, CAS, WP, SDCLK, RBURST, and RPIPE bits */ + FMC_SDRAM->SDRCR[FMC_SDRAM_BANK2] &= ((uint32_t)~(FMC_SDRCR_NCA_Msk | FMC_SDRCR_NRA_Msk | FMC_SDRCR_MWID_Msk | \ + FMC_SDRCR_NB_Msk | FMC_SDRCR_CAS_Msk | FMC_SDRCR_WP_Msk | \ + FMC_SDRCR_CLKDIV_Msk | FMC_SDRCR_RBURST_Msk | FMC_SDRCR_RPIPE_Msk)); + + FMC_SDRAM->SDRCR[FMC_SDRAM_BANK2] |= (uint32_t)(Init->ColumnBitsNumber |\ + Init->RowBitsNumber |\ + Init->MemoryDataWidth |\ + Init->InternalBankNumber |\ + Init->CASLatency |\ + Init->WriteProtection); + } + + return HAL_OK; +} + + + +/****************************************************************************** +* @brief : Initializes the FMC_SDRAM device timing according to the specified +* parameters in the FMC_SDRAMTimingInitTypeDef +* @param : Timing: Pointer to SDRAM Timing structure +* @param : Bank: SDRAM bank number +* @return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_SDRAM_Timing_Init(FMC_SDRAMTimingInitTypeDef *Timing, uint32_t Bank) +{ + /* Check the parameters */ + assert_param(IS_FMC_LOADTOACTIVE_DELAY(Timing->LoadToActiveDelay)); + assert_param(IS_FMC_EXITSELFREFRESH_DELAY(Timing->ExitSelfRefreshDelay)); + assert_param(IS_FMC_SELFREFRESH_TIME(Timing->SelfRefreshTime)); + assert_param(IS_FMC_ROWCYCLE_DELAY(Timing->RowCycleDelay)); + assert_param(IS_FMC_WRITE_RECOVERY_TIME(Timing->WriteRecoveryTime)); + assert_param(IS_FMC_RP_DELAY(Timing->RPDelay)); + assert_param(IS_FMC_RCD_DELAY(Timing->RCDDelay)); + assert_param(IS_FMC_SDRAM_BANK(Bank)); + + /* Set SDRAM device timing parameters */ + if (Bank != FMC_SDRAM_BANK2) + { + /* Clear TMRD, TXSR, TRAS, TRC, TWR, TRP and TRCD bits */ + FMC_SDRAM->SDRTR[FMC_SDRAM_BANK1] &= ((uint32_t)~(FMC_SDRTR_TMRD_Msk | FMC_SDRTR_TXSR_Msk | FMC_SDRTR_TRAS_Msk | \ + FMC_SDRTR_TRC_Msk | FMC_SDRTR_TWR_Msk | FMC_SDRTR_TRP_Msk | \ + FMC_SDRTR_TRCD_Msk)); + + FMC_SDRAM->SDRTR[FMC_SDRAM_BANK1] |= (uint32_t)(((Timing->LoadToActiveDelay)-1) |\ + (((Timing->ExitSelfRefreshDelay)-1) << 4) |\ + (((Timing->SelfRefreshTime)-1) << 8) |\ + (((Timing->RowCycleDelay)-1) << 12) |\ + (((Timing->WriteRecoveryTime)-1) <<16) |\ + (((Timing->RPDelay)-1) << 20) |\ + (((Timing->RCDDelay)-1) << 24)); + } + else /* FMC_Bank2_SDRAM */ + { + /* Clear TRC and TRP bits */ + FMC_SDRAM->SDRTR[FMC_SDRAM_BANK1] &= ((uint32_t)~(FMC_SDRTR_TRC_Msk | FMC_SDRTR_TRP_Msk)); + + FMC_SDRAM->SDRTR[FMC_SDRAM_BANK1] |= (uint32_t)((((Timing->RowCycleDelay)-1) << 12) |\ + (((Timing->RPDelay)-1) << 20)); + + /* Clear TMRD, TXSR, TRAS, TRC, TWR, TRP and TRCD bits */ + FMC_SDRAM->SDRTR[FMC_SDRAM_BANK2] &= ((uint32_t)~(FMC_SDRTR_TMRD_Msk | FMC_SDRTR_TXSR_Msk | FMC_SDRTR_TRAS_Msk | \ + FMC_SDRTR_TRC_Msk | FMC_SDRTR_TWR_Msk | FMC_SDRTR_TRP_Msk | \ + FMC_SDRTR_TRCD_Msk)); + + FMC_SDRAM->SDRTR[FMC_SDRAM_BANK2] |= (uint32_t)(((Timing->LoadToActiveDelay)-1) |\ + (((Timing->ExitSelfRefreshDelay)-1) << 4) |\ + (((Timing->SelfRefreshTime)-1) << 8) |\ + (((Timing->WriteRecoveryTime)-1) <<16) |\ + (((Timing->RCDDelay)-1) << 24)); + } + + return HAL_OK; +} + +/****************************************************************************** +* @brief : DeInitializes the FMC_SDRAM peripheral +* @param : Bank: SDRAM bank number +* @return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_SDRAM_DeInit(uint32_t Bank) +{ + /* Check the parameters */ + assert_param(IS_FMC_SDRAM_BANK(Bank)); + + /* De-initialize the SDRAM device */ + FMC_SDRAM->SDRCR[Bank] = 0x000002D0; + FMC_SDRAM->SDRTR[Bank] = 0x0FFFFFFF; + FMC_SDRAM->SDRCMD = 0x00000000; + FMC_SDRAM->SDRART = 0x00000000; + FMC_SDRAM->SDRSR = 0x00000000; + + return HAL_OK; +} + + +/****************************************************************************** +* @brief : Send Command to the FMC SDRAM bank +* @param : Command: Pointer to SDRAM command structure +* @param : Timing: Pointer to SDRAM Timing structure +* @param : Timeout: Timeout wait value +* @return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_SDRAM_SendCommand(FMC_SDRAMCommandTypeDef *Command, uint32_t Timeout) +{ + __IO uint32_t uiTimeout; + + /* Check the parameters */ + assert_param(IS_FMC_COMMAND_MODE(Command->CommandMode)); + assert_param(IS_FMC_COMMAND_TARGET(Command->CommandTarget)); + assert_param(IS_FMC_AUTOREFRESH_NUMBER(Command->AutoRefreshNumber)); + assert_param(IS_FMC_MODE_REGISTER(Command->ModeRegisterDefinition)); + + /* Clear CMD, CTD2, CTD1, NARF, MRD bits */ + FMC_SDRAM->SDRCMD &= ((uint32_t)~(FMC_SDRCMD_CMD_Msk | FMC_SDRCMD_CTD2_Msk | FMC_SDRCMD_CTD1_Msk | \ + FMC_SDRCMD_NARF_Msk | FMC_SDRCMD_MRD_Msk)); + /* Set command register */ + FMC_SDRAM->SDRCMD = (uint32_t)(Command->CommandMode |\ + (Command->CommandTarget) |\ + (((Command->AutoRefreshNumber)-1) << FMC_SDRCMD_NARF_Pos) |\ + ((Command->ModeRegisterDefinition) << FMC_SDRCMD_MRD_Pos) + ); + + uiTimeout = Timeout; + + /* wait until command is send */ + while(HAL_IS_BIT_SET(FMC_SDRAM->SDRSR, FMC_SDRSR_BUSY)) + { + /* Check for the Timeout */ + if(uiTimeout) + { + uiTimeout--; + if (uiTimeout == 0) + { + return HAL_TIMEOUT; + } + } + } + + return HAL_OK; +} + +/****************************************************************************** +* @brief : Program the SDRAM Memory Refresh rate. +* @param : RefreshRate: The SDRAM refresh rate value. +* @return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_SDRAM_ProgramRefreshRate(uint32_t RefreshRate) +{ + /* Check the parameters */ + assert_param(IS_FMC_REFRESH_RATE(RefreshRate)); + + /* Clear COUNT bits */ + FMC_SDRAM->SDRART &= (uint32_t)~(FMC_SDRART_COUNT_Msk); + /* Set the refresh rate in command register */ + FMC_SDRAM->SDRART |= (RefreshRate << FMC_SDRART_COUNT_Pos); + + return HAL_OK; +} + +/****************************************************************************** +* @brief : Set the Number of consecutive SDRAM Memory auto Refresh commands. +* @param : AutoRefreshNumber: Specifies the auto Refresh number. +* @return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_SDRAM_SetAutoRefreshNumber(uint32_t AutoRefreshNumber) +{ + /* Check the parameters */ + assert_param(IS_FMC_AUTOREFRESH_NUMBER(AutoRefreshNumber)); + + /* Clear NARF bits */ + FMC_SDRAM->SDRCMD &= (uint32_t)~(FMC_SDRCMD_NARF_Msk); + /* Set the Auto-refresh number in command register */ + FMC_SDRAM->SDRCMD |= (AutoRefreshNumber << FMC_SDRCMD_NARF_Pos); + + return HAL_OK; +} + +/****************************************************************************** +* @brief : Returns the indicated FMC SDRAM bank mode status. +* @param : Bank: Defines the FMC SDRAM bank. This parameter can be +* FMC_SDRAM_BANK1 or FMC_SDRAM_BANK2. +* @return: The FMC SDRAM bank mode status, could be on of the following values: +* FMC_SDRAM_NORMAL_MODE, FMC_SDRAM_SELF_REFRESH_MODE or +* FMC_SDRAM_POWER_DOWN_MODE. +******************************************************************************/ +uint32_t HAL_FMC_SDRAM_GetBankModeStatus(uint32_t Bank) +{ + uint32_t tmpreg = 0; + + /* Check the parameters */ + assert_param(IS_FMC_SDRAM_BANK(Bank)); + + /* Get the corresponding bank mode */ + if(Bank == FMC_SDRAM_BANK1) + { + tmpreg = (uint32_t)((FMC_SDRAM->SDRSR & FMC_SDRSR_STA1_Msk) >> FMC_SDRSR_STA1_Pos); + } + else + { + tmpreg = ((uint32_t)(FMC_SDRAM->SDRSR & FMC_SDRSR_STA2_Msk) >> FMC_SDRSR_STA2_Pos); + } + + /* Return the mode status */ + return tmpreg; +} + +/****************************************************************************** +* @brief : Returns the indicated FMC SDRAM status. +* @param : None. +* @return: The FMC SDRAM status. +******************************************************************************/ +uint32_t HAL_FMC_SDRAM_GetStatus(void) +{ + /* Return the mode status */ + return (FMC_SDRAM->SDRSR); +} + +/****************************************************************************** +* @brief : Set Burst read FIFO length. +* @param : FifoLen: fifo length. +* @param : Bank: Defines the FMC SDRAM bank. This parameter can be +* FMC_SDRAM_BANK1 or FMC_SDRAM_BANK2. +* @return: None. +******************************************************************************/ +void HAL_FMC_SDRAM_BurstReadFifoLength(uint32_t FifoLen, uint32_t Bank) +{ + /* Check the parameters */ + assert_param(IS_FMC_BURST_READ_FIFO_LEN(FifoLen)); + assert_param(IS_FMC_SDRAM_BANK(Bank)); + + if(FifoLen == FMC_SDRAM_BURST_READ_FIFO_LEN_0) + { + FMC_SDRAM->SDRCR[Bank] &= ~(FMC_SDRCR_RBURST); + } + else + { + FMC_SDRAM->SDRCR[Bank] |= (FMC_SDRCR_RBURST); + FMC_SDRAM->SDRCR[Bank] &= ~(FMC_SDRCR_BDEPTH_Msk); + FMC_SDRAM->SDRCR[Bank] |= FifoLen; + } +} + +/****************************************************************************** +* @brief : Set write to read continuous operation with SDCLK delay. +* @param : W2RDelay: Number of delayed SDCLK.This parameter can be +* FMC_SDRAM_W2R_DELAY_0 or FMC_SDRAM_W2R_DELAY_HALF_SDCLK. +* @param : Bank: Defines the FMC SDRAM bank. This parameter can be +* FMC_SDRAM_BANK1 or FMC_SDRAM_BANK2. +* @return: None. +******************************************************************************/ +void HAL_FMC_SDRAM_W2RDelay(uint32_t W2RDelay, uint32_t Bank) +{ + /* Check the parameters */ + assert_param(IS_FMC_W2R_DELAY(W2RDelay)); + assert_param(IS_FMC_SDRAM_BANK(Bank)); + + FMC_SDRAM->SDRCR[Bank] &= ~(FMC_SDRCR_W2RDLY_Msk); + FMC_SDRAM->SDRCR[Bank] |= W2RDelay; +} + +/****************************************************************************** +* @brief : Enable or disable the SDRAM device refresh error interrupt. +* @param : NewState: new state of the specified SDRAM interrupts. +* This parameter can be: ENABLE or DISABLE. +* @return: None. +******************************************************************************/ +void HAL_FMC_SDRAM_ITConfig(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the refresh error interrupt */ + FMC_SDRAM->SDRART |= FMC_SDRART_RFEIE ; + } + else + { + /* Disable the refresh error interrupt */ + FMC_SDRAM->SDRART &= (~FMC_SDRART_RFEIE); + } +} + +/****************************************************************************** +* @brief: Checks whether the specified SDRAM interrupt has occurred or not. +* @param: None. +* @return: SET or RESET. +******************************************************************************/ +FlagStatus HAL_FMC_SDRAM_GetITStatus(void) +{ + FlagStatus bitstatus = RESET; + + /* Return the status of the flag */ + if (((FMC_SDRAM->SDRART & FMC_SDRART_RFEIE) != (uint32_t)RESET) && ((FMC_SDRAM->SDRSR & FMC_SDRSR_RFE) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/****************************************************************************** +* @brief: Clears the SDRAM's interrupt pending bits. +* @param: None. +* @return: None +******************************************************************************/ +void HAL_FMC_SDRAM_ClearITPendingBit(void) +{ + if((FMC_SDRAM->SDRART & FMC_SDRART_RFEIE) != (uint32_t)RESET) + { + /* Clear the interrupt pending bits in the SDRART register */ + FMC_SDRAM->SDRART |= FMC_SDRART_CRFE; + } +} + + +/****************************************************************************** +* @brief: SDRAM Refresh error callback. +* @param: None. +* @return: None +******************************************************************************/ +__weak void HAL_SDRAM_RefreshErrorCallback(void) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(NULL); + + /* NOTE: This function Should not be modified, when the callback is needed, + the HAL_SDRAM_RefreshErrorCallback could be implemented in the user file + */ +} + +/****************************************************************************** +* @brief: This function handles SDRAM refresh error interrupt request. +* @param: None. +* @return: None +******************************************************************************/ +__weak void HAL_SDRAM_IRQHandler(void) +{ + /* Check SDRAM interrupt Rising edge flag */ + if (SET == HAL_FMC_SDRAM_GetITStatus()) + { + /* SDRAM refresh error interrupt callback */ + HAL_SDRAM_RefreshErrorCallback(); + /* Clear SDRAM refresh error interrupt pending bit */ + HAL_FMC_SDRAM_ClearITPendingBit(); + } +} + + +#endif + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_gpio.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_gpio.c new file mode 100644 index 0000000000..1b26bee9aa --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_gpio.c @@ -0,0 +1,328 @@ +/****************************************************************************** +*@file : hal_gpio.c +*@brief : GPIO HAL module driver. +******************************************************************************/ +#include "hal.h" + +#ifdef HAL_GPIO_MODULE_ENABLED + +/****************************************************************************** +*@brief : Initializes the GPIOx peripheral according to the specified parameters +* in the GPIO_Init. +*@param : GPIOx: where x can be (A..F) to select the GPIO peripheral. +*@param : GPIO_Init: pointer to an GPIO_InitTypeDef structure that contains +* the configuration information for the specified GPIO peripheral. +*@return: None +******************************************************************************/ +void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) +{ + uint32_t position; + uint32_t currentPin; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_ALL_PIN(GPIO_Init->Pin)); + assert_param(IS_GPIO_MODE(GPIOx, GPIO_Init->Mode)); + + /* Configure Select pins */ + position = 0; + while ((GPIO_Init->Pin) >> position != 0) + { + /* Get current pin position */ + currentPin = (GPIO_Init->Pin) & (1UL << position); + + if (currentPin) + { + if (currentPin & (GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15)) + { + if (GPIOx == GPIOC) + { + __HAL_RCC_PMU_CLK_ENABLE(); + if (currentPin & GPIO_PIN_13) + PMU->IOSEL &= ~PMU_IOSEL_PC13VALUE; + else if (currentPin & GPIO_PIN_14) + PMU->IOSEL &= ~PMU_IOSEL_PC14VALUE; + else if (currentPin & GPIO_PIN_15) + PMU->IOSEL &= ~PMU_IOSEL_PC15VALUE; + } + } + + /*--------------------- GPIO Mode Configuration ------------------------*/ + if ((GPIO_Init->Mode == GPIO_MODE_ANALOG_SWITCH_OFF) || (GPIO_Init->Mode == GPIO_MODE_ANALOG_SWITCH_ON)) + { + if (position < 8U) + { + GPIOx->AF0 &= ~(0xFUL << (position << 2)); + GPIOx->DS0 &= ~(0xFUL << (position << 2)); + } + else + { + GPIOx->AF1 &= ~(0xFUL << ((position - 8) << 2)); + GPIOx->DS1 &= ~(0xFUL << ((position - 8) << 2)); + } + GPIOx->OTYP &= ~(1UL << position); + GPIOx->PUPD &= ~(0x3UL << (position << 1)); + GPIOx->SMIT &= ~(0x01UL << position); + + if (GPIO_Init->Mode == GPIO_MODE_ANALOG_SWITCH_OFF) + GPIOx->AIEN &= ~(0x01UL << position); + else + GPIOx->AIEN |= 0x01UL << position; + } + else + { + assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); + + GPIOx->AIEN &= ~(0x01UL << position); + + /* Alternate Function */ + if ((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the Alternate function parameters */ + assert_param(IS_GPIO_FUNCTION(GPIO_Init->Alternate)); + + /* Configure Alternate function mapped with the current IO */ + if (position < 8U) + { + GPIOx->AF0 = (GPIOx->AF0 & ~(0xFUL << (position << 2))) | (GPIO_Init->Alternate << (position << 2)); + } + else + { + GPIOx->AF1 = (GPIOx->AF1 & ~(0xFUL << ((position - 8) << 2))) | (GPIO_Init->Alternate << ((position - 8) << 2)); + } + } + /* In case of Output or Alternate function mode selection */ + if ((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || + (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the drive parameter */ + assert_param(IS_GPIO_DRIVE(GPIO_Init->Drive)); + + /* Configure the IO drive capability */ + if (position < 8) + { + GPIOx->DS0 = (GPIOx->DS0 & ~(0xFUL << (position << 2))) | (GPIO_Init->Drive << (position << 2)); + } + else + { + GPIOx->DS1 = (GPIOx->DS1 & ~(0xFUL << ((position - 8) << 2))) | (GPIO_Init->Drive << ((position - 8) << 2)); + } + + /* Configure the IO Output Type */ + GPIOx->OTYP = (GPIOx->OTYP & ~(1UL << position)) | (((GPIO_Init->Mode & GPIO_MODE_GPIO_OUTPUT_TYPE_MASK) >> 4) << position); + } + + /* Activate the Pull-up or Pull down resistor for the current IO */ + GPIOx->PUPD = (GPIOx->PUPD & ~(0x3UL << (position << 1))) | ((GPIO_Init->Pull) << (position << 1)); + + /* Configure schmitt input */ + GPIOx->SMIT |= 0x01UL << position; + + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + GPIOx->MD = (GPIOx->MD & ~(0x3UL << (position << 1))) | ((GPIO_Init->Mode & GPIO_MODE_GPIO_MASK) << (position << 1)); + + /*--------------------- EXTI Mode Configuration ------------------------*/ + /* Configure the External Interrupt or event for the current IO */ + if (GPIO_Init->Mode & GPIO_MODE_EXTI_MASK) + { + /* Clear EXTI interrupt flag */ + HAL_EXTI_ClearPending(position); + + /* Configure the EXTI for the current IO */ + if (HAL_EXTI_SetConfigLine(GPIOx, position, GPIO_Init->Mode) != HAL_OK) + return; + } + else + { + + /* Check whether the current IO is configured as EXTI */ + if (HAL_EXTI_IsConfigLine(GPIOx, position) != DISABLE) + { + /* Deactivate the EXTI configuration of the current IO */ + HAL_EXTI_ClearConfigLine(position); + + /* Clear EXTI interrupt flag */ + HAL_EXTI_ClearPending(position); + } + } + } + position++; + } +} + +/****************************************************************************** +*@brief : De-initializes the GPIOx peripheral registers to their default reset values. +*@param : GPIOx: where x can be (A..F) to select the GPIO peripheral. +*@param : GPIO_Pin: specifies the port bit to be written. +*@return: None +******************************************************************************/ +void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) +{ + uint32_t position = 0; + uint32_t currentPin; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_ALL_PIN(GPIO_Pin)); + + /* Configure Select pins */ + while (GPIO_Pin >> position != 0U) + { + /* Get current pin position */ + currentPin = GPIO_Pin & (1UL << position); + + if (currentPin) + { + /* SET GPIO Function */ + if (position < 8U) + { + GPIOx->AF0 &= ~(0xFU << (position << 2U)); + GPIOx->DS0 &= ~(0xFU << (position << 2U)); + } + else + { + GPIOx->AF1 &= ~(0xFU << ((position - 8U) << 2U)); + GPIOx->DS1 &= ~(0xFU << ((position - 8U) << 2U)); + } + + /* Deactivate the Pull-up and Pull-down resistor for the current IO */ + GPIOx->PUPD &= ~(0x3U << (position << 1U)); + + /* Configure the default value for output type */ + GPIOx->OTYP &= ~currentPin; + + /* Configure the default value for schmitt input */ + GPIOx->SMIT &= ~currentPin; + + GPIOx->AIEN &= ~currentPin; + + /* Configure IO Direction mode to Analog*/ + GPIOx->MD |= ((0x03U) << (position << 1U)); + + /* Check whether the current IO is configured as EXTI */ + if (HAL_EXTI_IsConfigLine(GPIOx, position) != DISABLE) + { + /* Deactivate the EXTI configuration of the current IO */ + HAL_EXTI_ClearConfigLine(position); + + /* Clear EXTI interrupt flag */ + HAL_EXTI_ClearPending(position); + } + } + position++; + } +} + +/****************************************************************************** +*@brief : Set or clear the selected data port bit. +*@param : GPIOx: where x can be (A..F) to select the GPIO peripheral. +*@param : GPIO_Pin: specifies the port bit to be written. +*@param : PinState: specifies the value to be written to the selected bit. +* This parameter must be a value of @ref GPIO_PinState. +* @arg GPIO_PIN_RESET: clear the port pin. +* @arg GPIO_PIN_SET: set the port pin. +*@return: None +******************************************************************************/ +void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin, GPIO_PinState PinState) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_ALL_PIN(GPIO_Pin)); + assert_param(IS_GPIO_PIN_ACTION(PinState)); + + if (GPIO_PIN_RESET == PinState) + { + GPIOx->BSC = GPIO_Pin << 16U; + } + else + { + GPIOx->BSC = GPIO_Pin; + } +} + +/****************************************************************************** +*@brief : Read the specified input port pin. +*@param : GPIOx: where x can be (A..F) to select the GPIO peripheral. +*@param : GPIO_Pin: specifies the port bit to be written. +*@return: The input port pin value. +******************************************************************************/ +GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_SINGLE_PIN(GPIO_Pin)); + + if (GPIOx->IDATA & GPIO_Pin) + { + return GPIO_PIN_SET; + } + else + { + return GPIO_PIN_RESET; + } +} + +/****************************************************************************** +*@brief : Toggle the specified GPIO pin. +*@param : GPIOx: where x can be (A..F) to select the GPIO peripheral. +*@param : GPIO_Pin: specifies the port bit to be written. +*@return: None. +******************************************************************************/ +void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) +{ + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_ALL_PIN(GPIO_Pin)); + + if (GPIOx->ODATA & GPIO_Pin) + { + GPIOx->BSC = GPIO_Pin << 16; + } + else + { + GPIOx->BSC = GPIO_Pin; + } +} + +/****************************************************************************** +*@brief : Lock GPIO Pins configuration registers. +*@param : GPIOx: where x can be (A..F) to select the GPIO peripheral. +*@param : GPIO_Pin: specifies the port bit to be written. +*@return: HAL Status. +******************************************************************************/ +HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) +{ + __IO uint32_t temp = GPIO_LOCK_LOCK_KEY; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_ALL_PIN(GPIO_Pin)); + + /* Apply lock key write sequence */ + temp |= GPIO_Pin; + + /* Set LOCKx bit(s): LOCKK='1' + LOCK[15-0] */ + GPIOx->LOCK = temp; + + /* Reset LOCKx bit(s): LOCKK='0' + LOCK[15-0] */ + GPIOx->LOCK = GPIO_Pin; + + /* Set LOCKx bit(s): LOCKK='1' + LOCK[15-0] */ + GPIOx->LOCK = temp; + + /* Read LOCK register. This read is mandatory to complete key lock sequence */ + temp = GPIOx->LOCK; + + /* read again in order to confirm lock is active */ + if (GPIOx->LOCK & GPIO_LOCK_LOCK_KEY) + return HAL_OK; + else + return HAL_ERROR; +} + + +#endif /* HAL_GPIO_MODULE_ENABLED */ + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_i2c.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_i2c.c new file mode 100644 index 0000000000..93da5a3f23 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_i2c.c @@ -0,0 +1,1405 @@ +/****************************************************************************** +*@file : hal_i2c.c +*@brief : This file provides firmware functions to manage the I2C HAL module +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ + +#include "hal_i2c.h" + + +#ifdef HAL_I2C_MODULE_ENABLED + +/* Private functions for I2C */ +static HAL_StatusTypeDef I2C_Set_Clock_Speed(I2C_HandleTypeDef *hi2c, uint32_t ClockSpeed); +static HAL_StatusTypeDef I2C_Master_Request_Write(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint32_t Timeout); +static HAL_StatusTypeDef I2C_Master_Request_Read(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint32_t Timeout); +static HAL_StatusTypeDef I2C_Check_Device_Ready(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint32_t Timeout); +static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout); + + +/****************************************************************************** +*@brief : I2C interrupt handler +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@return: None +******************************************************************************/ +__weak void HAL_I2C_IRQHandler(I2C_HandleTypeDef *hi2c) +{ + if(hi2c->Init.I2C_Mode == I2C_MODE_SLAVE) + { + /* Slave ADDR1 Interrupt */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_RX_ADDR1)) + { + /* Clear ADDR1 Interrupt Flag */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_RX_ADDR1); + + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_RX_ADDR1_INT_EN ); + + /* Slave Transmit */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_SRW)) + { + hi2c->state = I2C_STATE_TX_DATA; + } + else + { + hi2c->state = I2C_STATE_RX_DATA; + } + } + + if(hi2c->state == I2C_STATE_TX_DATA) + { + if (READ_BIT(hi2c->Instance->SR, I2C_SR_TXE)) + { + if(hi2c->Tx_Count == hi2c->Tx_Size) + { + ;//while(1); + } + else + { + hi2c->Instance->DR = hi2c->Tx_Buffer[hi2c->Tx_Count++]; + } + } + } + else if(hi2c->state == I2C_STATE_RX_DATA) + { + if (READ_BIT(hi2c->Instance->SR, I2C_SR_RXNE)) + { + hi2c->Rx_Buffer[hi2c->Rx_Count++] = hi2c->Instance->DR; + } + } + + } + else + { + + + + + /* master */ + if(hi2c->state == I2C_STATE_TX_DATA) + { + + + if (READ_BIT(hi2c->Instance->SR, I2C_SR_TXE)) + { + hi2c->Instance->DR = hi2c->Tx_Buffer[hi2c->Tx_Count++]; + if(hi2c->Tx_Count > hi2c->Tx_Size) + { + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + } + } + } + else{ + + if((hi2c->state == I2C_STATE_RX_DATA) /*|| (hi2c->state == I2C_STATE_REQ_ADDR)*/) + { + if (READ_BIT(hi2c->Instance->SR, I2C_SR_RXNE)) + { + hi2c->Rx_Buffer[hi2c->Rx_Count++] = hi2c->Instance->DR; + + if(hi2c->Rx_Size - hi2c->Rx_Count == 1) + { + /* Prepare for Generate NACK */ + SET_BIT(hi2c->Instance->CR, I2C_CR_TACK); + /* Prepare for Generate STOP */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + } + } + +// if(READ_BIT(hi2c->Instance->SR, I2C_SR_MTF)) +// { +// //clear MTF +// hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); +// +// if(hi2c->state == I2C_STATE_REQ_ADDR) +// { +// hi2c->state = I2C_STATE_RX_DATA; +// hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_TX_RX_FLAG); +// +// } +// } + } + else if(hi2c->state == I2C_STATE_REQ_ADDR) + { + if(READ_BIT(hi2c->Instance->SR, I2C_SR_TX_RX_FLAG)) + { + hi2c->state = I2C_STATE_RX_DATA; + hi2c->Instance->SR = I2C_SR_TX_RX_FLAG;//READ_BIT(hi2c->Instance->SR, I2C_SR_TX_RX_FLAG); + if(hi2c->Rx_Size == 1) + { + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + } + } + } + } + + if(READ_BIT(hi2c->Instance->SR, I2C_SR_NACKF)) + { + //clear MTF + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_NACKF); + +// if (READ_BIT(hi2c->Instance->SR, I2C_SR_RACK)) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + } + + } + } + + /* STOP Flag Interrupt */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_STOPF)) + { + /* Clear STOPF Interrupt Flag */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_STOPF); + + /* Clear STOPF */ + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_STOPF_INTEN); + + if(hi2c->state == I2C_STATE_RX_DATA) + { + if(hi2c->Init.I2C_Mode == I2C_MODE_MASTER) + { + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_TACK); + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_STOP); + } + } + + if (hi2c->I2C_STOPF_Callback != NULL) + { + hi2c->I2C_STOPF_Callback(hi2c); + } + + hi2c->state = I2C_STATE_IDLE; + + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_TXE_INT_EN | I2C_CR_MTF_INT_EN | I2C_CR_STOPF_INTEN | I2C_CR_RXNE_INT_EN | I2C_CR_NACKF_INTEN | I2C_CR_TX_RX_FLAG_INTEN); + + } +} + +/****************************************************************************** +*@brief : Init low level of I2C module: GPIO, CLK, NVIC +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@return: None +******************************************************************************/ +__weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) +{ + /* + NOTE : This function should be modified by the user. + */ + + /* For Example */ + GPIO_InitTypeDef GPIO_Handle; + + /* I2C1 */ + if (hi2c->Instance == I2C1) + { + /* Enable Clock */ + __HAL_RCC_I2C1_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /* I2C1 SDA PB7 */ + /* I2C1 SCL PB6 */ + GPIO_Handle.Pin = GPIO_PIN_6 | GPIO_PIN_7; + GPIO_Handle.Mode = GPIO_MODE_AF_PP; + GPIO_Handle.Pull = GPIO_PULLUP; + GPIO_Handle.Drive = GPIO_DRIVE_LEVEL3; + GPIO_Handle.Alternate = GPIO_FUNCTION_5; + HAL_GPIO_Init(GPIOB, &GPIO_Handle); + + /* Clear Pending Interrupt */ + NVIC_ClearPendingIRQ(I2C1_IRQn); + + /* Enable External Interrupt */ + NVIC_EnableIRQ(I2C1_IRQn); + } + +} + +/****************************************************************************** +*@brief : DeInit low level of I2C module: GPIO, CLK, NVIC +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@return: None +******************************************************************************/ +__weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c) +{ + /* + NOTE : This function should be modified by the user. + */ + + /* For Example */ + GPIO_InitTypeDef GPIO_Handle; + + /* I2C1 */ + if (hi2c->Instance == I2C1) + { + /* Disable Clock */ + __HAL_RCC_I2C1_CLK_DISABLE(); + + /* I2C1 SDA PortB Pin7 */ + /* I2C1 SCL PortB Pin6 */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6 | GPIO_PIN_7); + /* Clear Pending Interrupt */ + NVIC_ClearPendingIRQ(I2C1_IRQn); + + /* Disable External Interrupt */ + NVIC_DisableIRQ(I2C1_IRQn); + } + +} + +/****************************************************************************** +*@brief : Initialize the I2c module with parameters +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c) +{ + /* Check I2C Parameter */ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + assert_param (IS_I2C_ALL_MODE(hi2c->Init.I2C_Mode)); + + if(hi2c->Init.I2C_Mode == I2C_MODE_MASTER) + assert_param (IS_I2C_CLOCK_SPEED(hi2c->Init.Clock_Speed)); + else + { + assert_param (IS_I2C_TX_AUTO_EN(hi2c->Init.Tx_Auto_En)); + assert_param (IS_I2C_STRETCH_EN(hi2c->Init.Stretch_Mode)); + } + + /* Disable the selected I2C peripheral */ + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_MEN); + + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_I2C_MspInit(hi2c); + + switch (hi2c->Init.I2C_Mode) + { + /* Master Mode */ + case I2C_MODE_MASTER: + { + /* Set Master Mode */ + SET_BIT(hi2c->Instance->CR, I2C_CR_MASTER); + + /* Set Clock Speed */ + I2C_Set_Clock_Speed(hi2c, hi2c->Init.Clock_Speed); + + if (FILTER_ALGO_ENABLE == hi2c->Init.filter_enable) + { + hi2c->Instance->FILTER = 0x303; //config as PCLK + } + /* Set SDA auto change the direction */ + if (hi2c->Init.Tx_Auto_En == TX_AUTO_ENABLE) + SET_BIT(hi2c->Instance->CR, I2C_CR_TX_AUTO_EN); + else + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_TX_AUTO_EN); + + /* Enable the selected I2C peripheral */ + SET_BIT(hi2c->Instance->CR, I2C_CR_MEN); + }break; + + /* Slave Mode */ + case I2C_MODE_SLAVE: + { + SET_BIT(hi2c->Instance->CR, I2C_CR_TXE_SEL); + + if (FILTER_ALGO_ENABLE == hi2c->Init.filter_enable) + { + hi2c->Instance->FILTER = 0x303; //config as PCLK + } + /* Set SDA auto change the direction */ + if (hi2c->Init.Tx_Auto_En == TX_AUTO_ENABLE) + SET_BIT(hi2c->Instance->CR, I2C_CR_TX_AUTO_EN); + else + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_TX_AUTO_EN); + + /* Set Clock Stretch Mode */ + if (hi2c->Init.Stretch_Mode == STRETCH_MODE_DISABLE) + SET_BIT(hi2c->Instance->CR, I2C_CR_NOSTRETCH); + else + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_NOSTRETCH); + + /* Set Address 1 */ + hi2c->Instance->SLAVE_ADDR1 = hi2c->Init.Own_Address; + + /* Enable the selected I2C peripheral */ + SET_BIT(hi2c->Instance->CR, I2C_CR_MEN); + }break; + + default: break; + } + + hi2c->state = I2C_STATE_IDLE; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : De-Initialize the I2c module +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c) +{ + /* Check I2C Parameter */ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + hi2c->state = I2C_STATE_IDLE; + + HAL_I2C_MspDeInit(hi2c); + + hi2c->Tx_Size = 0; + hi2c->Rx_Size = 0; + hi2c->Tx_Count = 0; + hi2c->Rx_Count = 0; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : send an amount of data in master mode. +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : DevAddress: I2C slave device address. +*@param : pData: Pointer to a data buffer. +*@param : Size: Total size of data to send. +*@param : Timeout: Timeout value. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + uint32_t i; + + /* Check I2C Parameter */ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + hi2c->Tx_Buffer = pData; + hi2c->Tx_Size = Size; + hi2c->Tx_Count = 0; + + /* Send Write Access Request */ + if (I2C_Master_Request_Write(hi2c, DevAddress, 0) == HAL_OK) + { + for (i = 0; i < hi2c->Tx_Size; i++) + { + /* Wait TXE Flag */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_TXE, RESET, Timeout) != HAL_OK) return HAL_ERROR; + + /* Send Data */ + hi2c->Instance->DR = hi2c->Tx_Buffer[hi2c->Tx_Count++]; + + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* Get NACK */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_RACK)) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + + /* Wait for the bus to idle */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_BUS_BUSY, SET, Timeout) != HAL_OK) return HAL_ERROR; + + return HAL_ERROR; + } + } + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + + /* Wait for the bus to idle */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_BUS_BUSY, SET, Timeout) != HAL_OK) return HAL_ERROR; + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data in master mode. +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : DevAddress: I2C slave device address. +*@param : pData: Pointer to a data buffer to store data. +*@param : Size: Total size of data to receive . +*@param : Timeout: Timeout value. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + uint32_t i; + + /* Check I2C Parameter */ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + hi2c->Rx_Buffer = pData; + hi2c->Rx_Size = Size; + hi2c->Rx_Count = 0; + + if (1 == hi2c->Rx_Size) + { + __set_PRIMASK(1); + if (I2C_Master_Request_Read(hi2c, DevAddress, Timeout) == HAL_OK) + { + // disable interrupt + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_TX_RX_FLAG, RESET, Timeout) != HAL_OK) + { + __set_PRIMASK(0); // enable interrupt + + return HAL_ERROR; + } + /* Clear TX_RX_FLAG */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_TX_RX_FLAG); + /* Generate ACK */ + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_TACK); + /* Prepare for Generate NACK */ + SET_BIT(hi2c->Instance->CR, I2C_CR_TACK); + /* Prepare for Generate STOP */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + + /* Wait RXNE Flag */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_RXNE, RESET, Timeout) != HAL_OK) + { + __set_PRIMASK(0); // enable interrupt + + return HAL_ERROR; + } + + /* Read Data */ + hi2c->Rx_Buffer[hi2c->Rx_Count++] = hi2c->Instance->DR; + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) + { + __set_PRIMASK(0); // enable interrupt + + return HAL_ERROR; + } + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* Wait for the bus to idle */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_BUS_BUSY, SET, Timeout) != HAL_OK) + { + __set_PRIMASK(0); // enable interrupt + + return HAL_ERROR; + } + + /* Generate ACK by default*/ + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_TACK); + + __set_PRIMASK(0); // enable interrupt + + return HAL_OK; + + } + else + { + __set_PRIMASK(0); + + return HAL_ERROR; + } + } + + + /* Send Read Access Request */ + if (I2C_Master_Request_Read(hi2c, DevAddress, Timeout) == HAL_OK) + { + /* Wait Master Transition receiving state */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_TX_RX_FLAG, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear TX_RX_FLAG */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_TX_RX_FLAG); + /* Generate ACK */ + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_TACK); + + for (i = 0; i < hi2c->Rx_Size - 1; i++) + { + /* Wait RXNE Flag */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_RXNE, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Read Data */ + hi2c->Rx_Buffer[hi2c->Rx_Count++] = hi2c->Instance->DR; + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + } + + __set_PRIMASK(1); + + /* Prepare for Generate NACK */ + SET_BIT(hi2c->Instance->CR, I2C_CR_TACK); + /* Prepare for Generate STOP */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + + __set_PRIMASK(0); + + + /* Wait RXNE Flag */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_RXNE, RESET, Timeout) != HAL_OK) + { + return HAL_ERROR; + } + + /* Read Data */ + hi2c->Rx_Buffer[hi2c->Rx_Count++] = hi2c->Instance->DR; + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) + { + return HAL_ERROR; + } + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* Wait for the bus to idle */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_BUS_BUSY, SET, Timeout) != HAL_OK) + { + return HAL_ERROR; + } + /* Generate ACK */ + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_TACK); + + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : send an amount of data in slave mode. +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : pData: Pointer to a data buffer. +*@param : Size: Total size of data to send . +*@param : Timeout: Timeout value. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + uint32_t i = 0; + + /* Check I2C Parameter */ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + hi2c->Tx_Buffer = pData; + hi2c->Tx_Size = Size; + hi2c->Tx_Count = 0; + + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_TXE_SEL); + + hi2c->Instance->DR = hi2c->Tx_Buffer[i++]; + + hi2c->Tx_Count++; + + /* Clear RX_ADDR1 Flag */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_RX_ADDR1); + /* Match the Address 1 */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_RX_ADDR1, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear RX_ADDR1 Flag */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_RX_ADDR1); + + /* Slave Transmit */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_SRW)) + { + /* BUS BUSY */ + while(READ_BIT(hi2c->Instance->SR, I2C_SR_BUS_BUSY)) + { + if (READ_BIT(hi2c->Instance->SR, I2C_SR_MTF)) + { + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + } + + if (READ_BIT(hi2c->Instance->SR, I2C_SR_TXE)) + { + if (i < hi2c->Tx_Size || hi2c->Tx_Size == 0) + { + hi2c->Instance->DR = hi2c->Tx_Buffer[i++]; + hi2c->Tx_Count++; + } + } + } + hi2c->Instance->SR = READ_REG(hi2c->Instance->SR); + } + else + { + return HAL_ERROR; + } + + + return HAL_OK; +} + +/****************************************************************************** +*@brief : send an amount of data in Master mode using IT mode. +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : pData: Pointer to a buffer to send data. +*@param : Size: Total size of data to send . +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) +{ + __IO uint32_t count = 0U; + + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + /* Tx machine is running */ + if (hi2c->state != I2C_STATE_IDLE) + return HAL_ERROR; + + /* Set I2C machine is sending */ + hi2c->state = I2C_STATE_TX_DATA; + + hi2c->Tx_Buffer = pData; + hi2c->Tx_Size = Size; + hi2c->Tx_Count = 0; + + /* Clear MTF, To Prevent Errors */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + + SET_BIT(hi2c->Instance->CR, I2C_CR_START); + + + SET_BIT(hi2c->Instance->CR, I2C_CR_TXE_INT_EN /*| I2C_CR_MTF_INT_EN */| I2C_CR_STOPF_INTEN | I2C_CR_NACKF_INTEN ); + + /* Send Device Address */ + hi2c->Instance->DR = DevAddress & 0xFE; + + + return HAL_OK; +} + +/****************************************************************************** +*@brief : receivd an amount of data in Master mode using IT mode. +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : pData: Pointer to a buffer to store data. +*@param : Size: Total size of data to receive . +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) +{ + uint32_t i; + + /* Check I2C Parameter */ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + hi2c->Rx_Buffer = pData; + hi2c->Rx_Size = Size; + hi2c->Rx_Count = 0; + + hi2c->state = I2C_STATE_REQ_ADDR; + + + /* Clear MTF, To Prevent Errors */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* Generate Start */ + SET_BIT(hi2c->Instance->CR, I2C_CR_START); + + + SET_BIT(hi2c->Instance->CR, I2C_CR_RXNE_INT_EN | I2C_CR_TX_RX_FLAG_INTEN | I2C_CR_STOPF_INTEN | I2C_CR_NACKF_INTEN); + +// SET_BIT(hi2c->Instance->CR, I2C_CR_START); + + /* Send Device Address */ + hi2c->Instance->DR = DevAddress | 0x01; + + if(hi2c->Rx_Size == 1) + { + SET_BIT(hi2c->Instance->CR, I2C_CR_TACK); + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : send an amount of data in slave mode using IT mode. +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : pData: Pointer to a buffer to send data. +*@param : Size: Total size of data to send . +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint32_t Size) +{ + /* Check I2C Parameter */ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + /* Rx machine is running */ + if (hi2c->state != I2C_STATE_IDLE) + return HAL_ERROR; + + /* Set Slave machine is sending */ + hi2c->state = I2C_STATE_TX_DATA; + + hi2c->Tx_Buffer = pData; + hi2c->Tx_Size = Size; + hi2c->Tx_Count = 0; + + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_TXE_SEL); + + hi2c->Instance->DR = hi2c->Tx_Buffer[0]; + + hi2c->Tx_Count++; + + /* Clear RX ADDR1 Flag */ + SET_BIT(hi2c->Instance->SR, I2C_SR_RX_ADDR1); + + SET_BIT(hi2c->Instance->CR, I2C_CR_RX_ADDR1_INT_EN | I2C_CR_TXE_INT_EN | I2C_CR_STOPF_INTEN); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : receivd an amount of data in slave mode. +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : pData: Pointer to a buffer to store data. +*@param : Size: Total size of data to receive . +*@param : Timeout: Timeout value. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + uint32_t i = 0; + HAL_StatusTypeDef Status; + + /* Check I2C Parameter */ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + hi2c->Rx_Buffer = pData; + hi2c->Rx_Size = Size; + hi2c->Rx_Count = 0; + + /* Match the Address 1 */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_RX_ADDR1, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear RX_ADDR1 Flag */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_RX_ADDR1); + + /* Slave Receive */ + if (!READ_BIT(hi2c->Instance->SR, I2C_SR_SRW)) + { + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* BUS BUSY */ + while(READ_BIT(hi2c->Instance->SR, I2C_SR_BUS_BUSY)) + { + /* Receive Data */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_RXNE)) + { + hi2c->Rx_Buffer[hi2c->Rx_Count++] = hi2c->Instance->DR; + + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + if (hi2c->Rx_Size != 0) + { + if (hi2c->Rx_Count >= hi2c->Rx_Size) + { + break; + } + } + } + } + + /* Generate ACK */ + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_TACK); + + hi2c->Instance->SR = READ_REG(hi2c->Instance->SR); + } + /* Slave Transmit */ + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : receivd an amount of data in slave mode using IT mode. +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : pData: Pointer to a buffer to store data. +*@param : Size: Total size of data to receive . +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint32_t Size) +{ + /* Check I2C Parameter */ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + /* Rx machine is running */ + if (hi2c->state != I2C_STATE_IDLE) + return HAL_ERROR; + + /* Set Slave machine is receiving */ + hi2c->state = I2C_STATE_RX_DATA; + + hi2c->Rx_Buffer = pData; + hi2c->Rx_Size = Size; + hi2c->Rx_Count = 0; + + /* Clear RX ADDR1 Flag */ + SET_BIT(hi2c->Instance->SR, I2C_SR_RX_ADDR1); + /* RX ADDR1, RXNE, STOPF Interrupt Enable */ + SET_BIT(hi2c->Instance->CR, I2C_CR_RX_ADDR1_INT_EN | I2C_CR_RXNE_INT_EN | I2C_CR_STOPF_INTEN); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : receive an amount of data in slave mode using DMA mode. +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : pData: Pointer to a buffer to store data. +*@param : Size: Total size of data to receive . +*@return: HAL_StatusTypeDef +******************************************************************************/ +#ifdef HAL_DMA_MODULE_ENABLED +HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint32_t Size) +{ + /* Check I2C Parameter */ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + hi2c->Rx_Buffer = pData; + hi2c->Rx_Size = Size; + hi2c->Rx_Count = Size; + + /* DMA Enable */ + SET_BIT(hi2c->Instance->CR, I2C_CR_DMA_EN); + + /* Clear STOPF Interrupt Flag */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_STOPF); + /* STOPF Interrupt Enable */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOPF_INTEN); + + HAL_DMA_Start(hi2c->HDMA_Rx, (uint32_t)&hi2c->Instance->DR, (uint32_t)hi2c->Rx_Buffer, hi2c->Rx_Size); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : send an amount of data in slave mode using DMA mode. +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : pData: Pointer to a data buffer. +*@param : Size: Total size of data to send . +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint32_t Size) +{ + /* Check I2C Parameter */ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + hi2c->Tx_Buffer = pData; + hi2c->Tx_Size = Size; + hi2c->Tx_Count = Size; + + /* Must Set TXE_SEL In DMA Mode !!! */ + SET_BIT(hi2c->Instance->CR, I2C_CR_TXE_SEL); + /* DMA Enable */ + SET_BIT(hi2c->Instance->CR, I2C_CR_DMA_EN); + + HAL_DMA_Start_IT(hi2c->HDMA_Tx, (uint32_t)hi2c->Tx_Buffer, (uint32_t)&hi2c->Instance->DR, hi2c->Tx_Size); + + return HAL_OK; +} +#endif +/****************************************************************************** +*@brief : Write an amount of data in blocking mode to a specific memory address +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : DevAddress : Target device address +*@param : MemAddress : MemAddress Internal memory address +*@param : MemAddSize : MemAddSize Size of internal memory address +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@param : Timeout : Timeout value +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + uint32_t i; + + /* Check I2C Parameter */ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + hi2c->Tx_Buffer = pData; + hi2c->Tx_Size = Size; + hi2c->Tx_Count = 0; + + /* Bus Busy */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_BUS_BUSY)) + return HAL_ERROR; + + /* Send Write Access Request */ + if (I2C_Master_Request_Write(hi2c, DevAddress,0) == HAL_OK) + { + /* If Memory address size is 8Bit */ + if (MemAddSize == I2C_MEMADD_SIZE_8BIT) + { + /* Send Memory Address */ + hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); + } + /* If Memory address size is 16Bit */ + else + { + /* Send Memory Address MSB*/ + hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress); + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + /* Send Memory Address LSB*/ + hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); + } + + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* Get NACK */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_RACK)) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + + /* Wait for the bus to idle */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_BUS_BUSY, SET, Timeout) != HAL_OK) return HAL_ERROR; + + return HAL_ERROR; + } + /* Get ACK */ + else + { + for (i = 0; i < hi2c->Tx_Size; i++) + { + /* Wait TXE Flag */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_TXE, RESET, Timeout)!= HAL_OK) return HAL_ERROR; + + /* Send Data */ + hi2c->Instance->DR = hi2c->Tx_Buffer[hi2c->Tx_Count++]; + + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* Get NACK */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_RACK)) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + + /* Wait for the bus to idle */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_BUS_BUSY, SET, Timeout) != HAL_OK) return HAL_ERROR; + return HAL_ERROR; + } + } + + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + + /* Wait for the bus to idle */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_BUS_BUSY, SET, Timeout) != HAL_OK) return HAL_ERROR; + /* Check Device Ready */ + while(I2C_Check_Device_Ready(hi2c, DevAddress, Timeout) != HAL_OK); + } + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Read an amount of data in blocking mode to a specific memory address +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : DevAddress : Target device address +*@param : MemAddress : MemAddress Internal memory address +*@param : MemAddSize : MemAddSize Size of internal memory address +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to read +*@param : Timeout : Timeout value +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + uint32_t i; + + /* Check I2C Parameter */ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + hi2c->Rx_Buffer = pData; + hi2c->Rx_Size = Size; + hi2c->Rx_Count = 0; + + /* Bus Busy */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_BUS_BUSY)) + return HAL_ERROR; + + /* Send Write Access Request */ + if (I2C_Master_Request_Write(hi2c, DevAddress,0) == HAL_OK) + { + /* If Memory address size is 8Bit */ + if (MemAddSize == I2C_MEMADD_SIZE_8BIT) + { + /* Send Memory Address */ + hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); + } + /* If Memory address size is 16Bit */ + else + { + /* Send Memory Address MSB*/ + hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress); + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + /* Send Memory Address LSB*/ + hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); + } + + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* Get NACK */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_RACK)) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + + /* Wait for the bus to idle */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_BUS_BUSY, SET, Timeout) != HAL_OK) return HAL_ERROR; + + return HAL_ERROR; + } + /* Get ACK */ + else + { + /* Send Write Read Request */ + if (I2C_Master_Request_Read(hi2c, DevAddress, Timeout) == HAL_OK) + { + /* Wait Master Transition receiving state */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_TX_RX_FLAG, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear TX_RX_FLAG */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_TX_RX_FLAG); + + /* Generate ACK */ + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_TACK); + + for (i = 0; i < hi2c->Rx_Size - 1; i++) + { + /* Wait RXNE Flag */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_RXNE, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Read Data */ + hi2c->Rx_Buffer[hi2c->Rx_Count++] = hi2c->Instance->DR; + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + } + + /* Prepare for Generate NACK */ + SET_BIT(hi2c->Instance->CR, I2C_CR_TACK); + /* Prepare for Generate STOP */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + + /* Wait RXNE Flag */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_RXNE, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Read Data */ + hi2c->Rx_Buffer[hi2c->Rx_Count++] = hi2c->Instance->DR; + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* Wait for the bus to idle */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_BUS_BUSY, SET, Timeout) != HAL_OK) return HAL_ERROR; + /* Generate ACK */ + CLEAR_BIT(hi2c->Instance->CR, I2C_CR_TACK); + } + else + { + /* Get NACK */ + return HAL_ERROR; + } + } + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Get Slave Rx State +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +* +*@return: Slave State +******************************************************************************/ +uint8_t HAL_I2C_GetSlaveRxState(I2C_HandleTypeDef *hi2c) +{ + return hi2c->state; +} + +/****************************************************************************** +*@brief : Get Slave Tx State +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +* +*@return: Slave State +******************************************************************************/ +uint8_t HAL_I2C_GetSlaveTxState(I2C_HandleTypeDef *hi2c) +{ + return hi2c->state; +} + +/****************************************************************************** +*@brief : Set I2C Clock Speed +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : ClockSpeed: I2C Clock Speed +*@return: HAL_StatusTypeDef +******************************************************************************/ +static HAL_StatusTypeDef I2C_Set_Clock_Speed(I2C_HandleTypeDef *hi2c, uint32_t ClockSpeed) +{ + uint32_t APB_Clock; + + APB_Clock = HAL_RCC_GetPCLK1Freq(); + + hi2c->Instance->CLK_DIV = APB_Clock / (4 * ClockSpeed) - 1; + + return HAL_OK; +} + +/****************************************************************************** +*@brief This function handles I2C Communication Timeout. +*@param hi2c Pointer to a I2C_HandleTypeDef structure that contains +* the configuration information for I2C module +*@param Flag specifies the I2C flag to check. +*@param Status The new Flag status (SET or RESET). +*@param Timeout Timeout duration +*@param Tickstart Tick start value +*@retval HAL status +******************************************************************************/ +static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout) +{ + __IO uint32_t lu32_Timeout; + /* have no timeout */ + if (Timeout == 0) + { + while (__HAL_I2C_GET_FLAG(hi2c, Flag)==Status); + } + else + { + lu32_Timeout = Timeout * 0xFF; + + while (__HAL_I2C_GET_FLAG(hi2c, Flag)==Status) + { + if (lu32_Timeout-- == 0) + { + return HAL_ERROR; + } + } + } + return HAL_OK; +} + +/****************************************************************************** +*@brief : I2C Write Access Request +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : DevAddress: Device address +*@param : Timeout: Timeout value +*@return: HAL_StatusTypeDef +******************************************************************************/ +static HAL_StatusTypeDef I2C_Master_Request_Write(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint32_t Timeout) +{ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + /* Generate Start */ + SET_BIT(hi2c->Instance->CR, I2C_CR_START); + + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_STARTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + + /* Clear MTF, To Prevent Errors */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* Send Device Address */ + hi2c->Instance->DR = DevAddress & 0xFE; + + /* Wait for transmission End*/ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* Get NACK */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_RACK)) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + + /* Wait for the bus to idle */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_BUS_BUSY, SET, Timeout) != HAL_OK) return HAL_ERROR; + + return HAL_ERROR; + } + /* Get ACK */ + else + { + return HAL_OK; + } +} + +/****************************************************************************** +*@brief : I2C Read Access Request +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : DevAddress: Device address +*@param : Timeout: Timeout value +*@return: HAL_StatusTypeDef +******************************************************************************/ +static HAL_StatusTypeDef I2C_Master_Request_Read(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint32_t Timeout) +{ + assert_param (IS_I2C_ALL_INSTANCE(hi2c->Instance)); + + /* Generate Start */ + SET_BIT(hi2c->Instance->CR, I2C_CR_START); + + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_STARTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + + /* Clear MTF, To Prevent Errors */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* Send Device Address */ + hi2c->Instance->DR = DevAddress | 0x01; + + /* Wait for transmission End */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* Get NACK */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_RACK)) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + + /* Wait for the bus to idle */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_BUS_BUSY, SET, Timeout) != HAL_OK) return HAL_ERROR; + + return HAL_ERROR; + } + /* Get ACK */ + else + { + return HAL_OK; + } +} + +/****************************************************************************** +*@brief : Check Device Ready +* +*@param : hi2c: a pointer of I2C_HandleTypeDef structure which contains +* the configuration information for the specified I2C. +*@param : DevAddress: Device address +*@param : Timeout: Timeout value +*@return: HAL_StatusTypeDef +******************************************************************************/ +static HAL_StatusTypeDef I2C_Check_Device_Ready(I2C_HandleTypeDef *hi2c, uint8_t DevAddress, uint32_t Timeout) +{ + /* Bus Busy */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_BUS_BUSY)) + return HAL_ERROR; + + /* Generate Start */ + SET_BIT(hi2c->Instance->CR, I2C_CR_START); + + /* Send Device Address */ + hi2c->Instance->DR = DevAddress; + + /* Wait for transmission End */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_MTF, RESET, Timeout) != HAL_OK) return HAL_ERROR; + /* Clear MTF */ + hi2c->Instance->SR = READ_BIT(hi2c->Instance->SR, I2C_SR_MTF); + + /* Get NACK */ + if (READ_BIT(hi2c->Instance->SR, I2C_SR_RACK)) + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + + /* Wait for the bus to idle */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_BUS_BUSY, SET, Timeout) != HAL_OK) return HAL_ERROR; + + return HAL_ERROR; + } + /* Get ACK */ + else + { + /* Generate Stop */ + SET_BIT(hi2c->Instance->CR, I2C_CR_STOP); + + /* Wait for the bus to idle */ + if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_SR_BUS_BUSY, SET, Timeout) != HAL_OK) return HAL_ERROR; + + return HAL_OK; + } +} + +#endif //HAL_I2C_MODULE_ENABLED diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_i2s.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_i2s.c new file mode 100644 index 0000000000..f6d36d5aa4 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_i2s.c @@ -0,0 +1,1552 @@ + +/****************************************************************************** +*@file : hal_i2s.c +*@brief : I2S HAL module driver. +******************************************************************************/ + +#include "hal.h" + +#ifdef HAL_I2S_MODULE_ENABLED + +static void HAL_I2S_InitParamter(I2S_HandleTypeDef *hi2s); + +/****************************************************************************** +*@brief : This function handles I2S interrupt request. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_I2S_IRQHander(I2S_HandleTypeDef *hi2s) +{ + uint32_t flag; + uint32_t source; + + flag = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_MASK); + source = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_MASK); + + if ((source & I2S_IT_TXE) && (flag & I2S_FLAG_TXE)) + { + /* Tx buffer empty callback function */ + HAL_I2S_TxEmptyCallback(hi2s); + } + + if ((source & I2S_IT_RXNE) && (flag & I2S_FLAG_RXNE)) + { + /* Rx buffer non empty callback function */ + HAL_I2S_RxNonEmptyCallback(hi2s); + } + + if ((source & I2S_IT_MSUSP) && (flag & I2S_FLAG_MSUSP)) + { + __HAL_I2S_CLEAR_FLAG(hi2s, I2S_FLAG_MSUSP); + /* Tx complete callback function */ + HAL_I2S_MsuspCallback(hi2s); + } + + if ((source & I2S_IT_SVTC) && (flag & I2S_FLAG_SVTC)) + { + __HAL_I2S_CLEAR_FLAG(hi2s, I2S_FLAG_SVTC); + /* Tx complete callback function */ + HAL_I2S_SvtcCallback(hi2s); + } + + flag &= I2S_FLAG_FE | I2S_FLAG_UDR | I2S_FLAG_OVR; + if ((source & I2S_IT_ERR) && (flag)) + { + hi2s->Error |= flag; + __HAL_I2S_CLEAR_FLAG(hi2s, flag); + HAL_I2S_ErrorCallback(hi2s); + } +} + +/****************************************************************************** +*@brief : Tx buffer empty callback function. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None. +******************************************************************************/ +__attribute__((weak)) void HAL_I2S_TxEmptyCallback(I2S_HandleTypeDef *hi2s) +{ + uint32_t over; + + /* Continue sending */ + if (hi2s->TxCount) + { + if (hi2s->pTxBuf) + __HAL_I2S_WRITE_DATA(hi2s, *hi2s->pTxBuf++); + else + __HAL_I2S_WRITE_DATA(hi2s, 0); + if (--hi2s->TxCount == 0) + { + over = 1; + if (hi2s->TxEmptyCallback) + { + over = hi2s->TxEmptyCallback(hi2s); + } + if (over) + { + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_TXE); + } + } + } +} + +/****************************************************************************** +*@brief : Tx buffer empty callback function. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None. +******************************************************************************/ +__attribute__((weak)) void HAL_I2S_MsuspCallback(I2S_HandleTypeDef *hi2s) +{ + uint32_t over; + + over = 1; + if (hi2s->MsuspCallback) + { + over = hi2s->MsuspCallback(hi2s); + } + if (over != 0) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_STOP | I2S_CR_TEN | I2S_CR_REN | I2S_CR_TXDMAEN | I2S_CR_RXDMAEN); + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_MASK); + hi2s->State = I2S_STATE_READY; + } +} + +/****************************************************************************** +*@brief : Tx buffer empty callback function. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None. +******************************************************************************/ +__attribute__((weak)) void HAL_I2S_SvtcCallback(I2S_HandleTypeDef *hi2s) +{ + uint32_t over; + + over = 1; + if (hi2s->SvtcCallback) + { + over = hi2s->SvtcCallback(hi2s); + } + if (over != 0) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_STOP | I2S_CR_TEN | I2S_CR_REN | I2S_CR_TXDMAEN | I2S_CR_RXDMAEN); + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_MASK); + hi2s->State = I2S_STATE_READY; + } +} + +/****************************************************************************** +*@brief : Rx buffer non empty callback function. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None. +******************************************************************************/ +__attribute__((weak)) void HAL_I2S_RxNonEmptyCallback(I2S_HandleTypeDef *hi2s) +{ + uint32_t over; + volatile uint32_t temp; + + if (hi2s->RxCount--) + { + if (hi2s->pRxBuf) + *hi2s->pRxBuf++ = __HAL_I2S_READ_DATA(hi2s); + else + temp = __HAL_I2S_READ_DATA(hi2s); + + } + + if (hi2s->RxCount == 0) + { + over = 1; + if (hi2s->RxCpltCallback) + { + over = hi2s->RxCpltCallback(hi2s); + } + + if (over != 0) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_STOP | I2S_CR_TEN | I2S_CR_REN | I2S_CR_TXDMAEN | I2S_CR_RXDMAEN); + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_MASK); + hi2s->State = I2S_STATE_READY; + } + } +} + +/****************************************************************************** +*@brief : Tx Error callback function. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None. +******************************************************************************/ +__attribute__((weak)) void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s) +{ + if (hi2s->ErrorCallback) + { + hi2s->ErrorCallback(hi2s); + } +} + +/****************************************************************************** +*@brief : Tx DMA transfer complete callback function. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None. +******************************************************************************/ +__attribute__((weak)) void HAL_I2S_DMATxCpltCallback(DMA_HandleTypeDef *hdmac) +{ + I2S_HandleTypeDef *hi2s; + + hi2s = hdmac->Parent; + + /* Take the number of unsent data */ + hi2s->TxCount = __HAL_DMA_GET_TRANSFER_SIZE(hi2s->hdmactx); + + if (hi2s->DMATxCpltCallback) + { + hi2s->DMATxCpltCallback(hi2s); + } +} + +/****************************************************************************** +*@brief : Tx DMA half transfer complete callback function. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None. +******************************************************************************/ +__attribute__((weak)) void HAL_I2S_DMATxHalfCpltCallback(DMA_HandleTypeDef *hdmac) +{ + I2S_HandleTypeDef *hi2s; + + hi2s = hdmac->Parent; + + /* Take the number of unsent data */ + hi2s->TxCount = __HAL_DMA_GET_TRANSFER_SIZE(hi2s->hdmactx); + + if (hi2s->DMATxHalfCpltCallback) + { + hi2s->DMATxHalfCpltCallback(hi2s); + } +} + +/****************************************************************************** +*@brief : Rx DMA transfer complete callback function. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None. +******************************************************************************/ +__attribute__((weak)) void HAL_I2S_DMARxCpltCallback(DMA_HandleTypeDef *hdmac) +{ + uint32_t over; + I2S_HandleTypeDef *hi2s; + + hi2s = hdmac->Parent; + + over = 1; + if (hi2s->DMARxCpltCallback) + { + over = hi2s->DMARxCpltCallback(hi2s); + } + + if (over != 0) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_STOP | I2S_CR_TEN | I2S_CR_REN | I2S_CR_TXDMAEN | I2S_CR_RXDMAEN); + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_MASK); + hi2s->State = I2S_STATE_READY; + } +} + +/****************************************************************************** +*@brief : Rx DMA hlaf transfer complete callback function. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None. +******************************************************************************/ +__attribute__((weak)) void HAL_I2S_DMARxHalfCpltCallback(DMA_HandleTypeDef *hdmac) +{ + I2S_HandleTypeDef *hi2s; + + hi2s = hdmac->Parent; + + /* Take the number of data not received */ + hi2s->RxCount = __HAL_DMA_GET_TRANSFER_SIZE(hi2s->hdmacrx); + + if (hi2s->DMARxHalfCpltCallback) + { + hi2s->DMARxHalfCpltCallback(hi2s); + } +} + +/****************************************************************************** +*@brief : Rx DMA transfer error callback function. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None. +******************************************************************************/ +__attribute__((weak)) void HAL_I2S_DMAErrorCallback(DMA_HandleTypeDef *hdmac) +{ + uint32_t over; + I2S_HandleTypeDef *hi2s; + + hi2s = hdmac->Parent; + + over = 1; + if (hi2s->ErrorCallback) + { + over = hi2s->ErrorCallback(hi2s); + } + + if (over) + { + /* abort rx dma transfer */ + HAL_DMA_Abort(hdmac); + + /* disable I2S Tx Rx DMA */ + __HAL_I2S_TX_RX_DMA_DISABLE(hi2s); + + __HAL_I2S_TX_RX_DISABLE(hi2s); + + /* Disable the error interrupt */ + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_ERR); + + /* set the dma transfer error */ + hi2s->Error |= I2S_DMA_ERROR; + + /* End of reception */ + hi2s->State = I2S_STATE_READY; + } +} + +/****************************************************************************** +*@brief : Initialize the I2S according to the specified. +* parameters in the I2S_InitTypeDef and create the associated handle. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_Init(I2S_HandleTypeDef *hi2s) +{ + double Freq; + uint32_t div; + + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + assert_param(IS_I2S_MODE(hi2s->Init.Mode)); + assert_param(IS_I2S_STANDARD(hi2s->Init.Standard)); + assert_param(IS_I2S_DATAFORMAT(hi2s->Init.DataFormat)); + assert_param(IS_I2S_MCLKOUTPUT(hi2s->Init.MCLKOutput)); + assert_param(IS_I2S_CLOCKPOLARITY(hi2s->Init.ClockPolarity)); + assert_param(IS_I2S_IOSWITCH(hi2s->Init.IOSwitch)); + + assert_param(hi2s->Init.AudioFreq != 0u); + + Freq = (double)HAL_RCC_GetHCLKFreq(); + if (hi2s->Init.MCLKOutput == I2S_MCLKOUT_DISABLE) + { + if (hi2s->Init.DataFormat == I2S_DATA_FORMAT_16B_EXTENDED_TO_16B) + Freq = Freq / 32; + else + Freq = Freq / 64; + } + else + { + Freq = Freq / 256; + } + assert_param(Freq >= (double)hi2s->Init.AudioFreq); + Freq = Freq / (double)hi2s->Init.AudioFreq; + Freq += 0.5; + div = (uint32_t)Freq; + if (div & 1u) + { + div = (div - 1) >> 1; + assert_param(div <= 0x1FFU); + div += I2S_PR_OF; + } + else + { + div = div >> 1; + assert_param(div <= 0x1FFU); + } + + /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ + HAL_I2S_MspInit(hi2s); + + /* Disable I2S */ + __HAL_I2S_DISABLE(hi2s); + + /* Init the internal parameter */ + HAL_I2S_InitParamter(hi2s); + + hi2s->Instance->CR = hi2s->Init.Mode | hi2s->Init.Standard | hi2s->Init.DataFormat | \ + hi2s->Init.ClockPolarity | hi2s->Init.IOSwitch; + + hi2s->Instance->PR = hi2s->Init.MCLKOutput | div; + + __HAL_I2S_ENABLE(hi2s); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : DeInitialize the I2S peripheral. +* Before Deinitialization, the sending or receiving process needs to be aborted. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_DeInit(I2S_HandleTypeDef *hi2s) +{ + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + + __HAL_I2S_DISABLE(hi2s); + + /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ + HAL_I2S_MspDeInit(hi2s); + + /* Init the internal parameter */ + HAL_I2S_InitParamter(hi2s); + + return HAL_OK; +} + + +/****************************************************************************** +*@brief : Initialize the I2S MSP. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None +******************************************************************************/ +__weak void HAL_I2S_MspInit(I2S_HandleTypeDef *hi2s) +{ + UNUSED(hi2s); +} + +/****************************************************************************** +*@brief : DeInitialize the I2S MSP. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None +******************************************************************************/ +__weak void HAL_I2S_MspDeInit(I2S_HandleTypeDef *hi2s) +{ + UNUSED(hi2s); +} + +/****************************************************************************** +*@brief : Register a User I2S Callback. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@note The registered callback function must be after initialization. +*@param : id: ID of the callback to be registered +* This parameter can be a combination of @ref I2S_CallbackID. +* @arg I2S_CALLBACKID_TXCPLT : transfer complete callback function. +* @arg I2S_CALLBACKID_TXHALFCPLT : transfer half complete callback function. +* @arg I2S_CALLBACKID_TXERROR : transfer error callback function. +* @arg I2S_CALLBACKID_RXCPLT : recevice completion callback function. +* @arg I2S_CALLBACKID_RXHALFCPLT : recevice half completion callback function. +* @arg I2S_CALLBACKID_RXERROR : receive error callback function. +*@param : pCallback: pointer to the Callback function. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_RegisterCallback(I2S_HandleTypeDef *hi2s, uint32_t id, pI2S_CallbackTypeDef pCallback) +{ + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + assert_param(IS_I2S_CALLBACKID(id)); + assert_param(pCallback != NULL); + + switch (id) + { + case I2S_CALLBACKID_TX_EMPTY: + + hi2s->TxEmptyCallback = pCallback; + break; + + case I2S_CALLBACKID_MSUSP: + + hi2s->MsuspCallback = pCallback; + break; + + case I2S_CALLBACKID_SVTC: + + hi2s->SvtcCallback = pCallback; + break; + + case I2S_CALLBACKID_TX_CPLT: + + hi2s->TxCpltCallback = pCallback; + break; + + case I2S_CALLBACKID_RX_CPLT: + + hi2s->RxCpltCallback = pCallback; + break; + + case I2S_CALLBACKID_DMA_TX_CPLT: + + hi2s->DMATxCpltCallback = pCallback; + break; + + case I2S_CALLBACKID_DMA_TX_HALF_CPLT: + + hi2s->DMATxHalfCpltCallback = pCallback; + break; + + case I2S_CALLBACKID_DMA_RX_CPLT: + + hi2s->DMARxCpltCallback = pCallback; + break; + + case I2S_CALLBACKID_DMA_RX_HALF_CPLT: + + hi2s->DMARxHalfCpltCallback = pCallback; + break; + + case I2S_CALLBACKID_ERROR: + + hi2s->ErrorCallback = pCallback; + break; + + default: + return HAL_ERROR; + } + return HAL_OK; +} + + +/****************************************************************************** +*@brief : Unregister a User I2S Callback. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@param : id: ID of the callback to be registered +* This parameter can be a combination of @ref I2S_CallbackID. +* @arg I2S_CALLBACKID_TXCPLT : transfer complete callback function. +* @arg I2S_CALLBACKID_TXHALFCPLT : transfer half complete callback function. +* @arg I2S_CALLBACKID_TXERROR : transfer error callback function. +* @arg I2S_CALLBACKID_RXCPLT : recevice completion callback function. +* @arg I2S_CALLBACKID_RXHALFCPLT : recevice half completion callback function. +* @arg I2S_CALLBACKID_RXERROR : receive error callback function. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_UnRegisterCallback(I2S_HandleTypeDef *hi2s, uint32_t id) +{ + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + assert_param(IS_I2S_CALLBACKID(id)); + + switch (id) + { + case I2S_CALLBACKID_TX_EMPTY: + + hi2s->TxEmptyCallback = NULL; + break; + + case I2S_CALLBACKID_MSUSP: + + hi2s->MsuspCallback = NULL; + break; + + case I2S_CALLBACKID_SVTC: + + hi2s->SvtcCallback = NULL; + break; + + case I2S_CALLBACKID_TX_CPLT: + + hi2s->TxCpltCallback = NULL; + break; + + case I2S_CALLBACKID_RX_CPLT: + + hi2s->RxCpltCallback = NULL; + break; + + case I2S_CALLBACKID_DMA_TX_CPLT: + + hi2s->DMATxCpltCallback = NULL; + break; + + case I2S_CALLBACKID_DMA_TX_HALF_CPLT: + + hi2s->DMATxHalfCpltCallback = NULL; + break; + + case I2S_CALLBACKID_DMA_RX_CPLT: + + hi2s->DMARxCpltCallback = NULL; + break; + + case I2S_CALLBACKID_DMA_RX_HALF_CPLT: + + hi2s->DMARxHalfCpltCallback = NULL; + break; + + case I2S_CALLBACKID_ERROR: + + hi2s->ErrorCallback = NULL; + break; + + default: + return HAL_ERROR; + } + return HAL_OK; +} + +HAL_StatusTypeDef HAL_I2S_TxData(I2S_HandleTypeDef *hi2s, uint32_t Data) +{ + hi2s->Instance->TXDR = Data; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_I2S_RxData(I2S_HandleTypeDef *hi2s, uint32_t *pdata) +{ + *pdata = hi2s->Instance->RXDR; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Send an amount of data in blocking mode. +*@note In blocking mode, the user cannot enable interrupt. +*@note Users can add or ignore error handling in TxErrorCallback(). +* Error codes are stored in hi2s->TxError. +*@note The last word was being sent when the function exited. +* The application also needs to call the HAL_I2S_GetBusyStatus() function +* to detect the end of sending. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be sent. +*@param : timeout: Timeout duration. +* The minimum value of this parameter is 1. +* If the value of this parameter is 0xFFFFFFFF, it will be sent until all data are sent. +* @node The timeout should be greater than the time of all data transfers. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_Transmit(I2S_HandleTypeDef *hi2s, uint32_t *pdata, uint32_t size, uint32_t timeout) +{ + volatile uint32_t temp; + uint32_t startTick; + + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + assert_param(pdata != NULL); + assert_param(size != 0U); + assert_param(timeout != 0U); + + /* If I2S is sending, an error is returned */ + if (hi2s->State != I2S_STATE_READY) + return HAL_ERROR; + + /* Blocking transmission can be aborted. Clear the abort flag bit */ + hi2s->Abort = DISABLE; + + /* state: busy */ + hi2s->State = I2S_STATE_BUSY; + + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_STOP | I2S_CR_TEN | I2S_CR_REN | I2S_CR_TXDMAEN | I2S_CR_RXDMAEN); + + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_MASK); + __HAL_I2S_CLEAR_FLAG(hi2s, I2S_FLAG_MASK); + temp = __HAL_I2S_READ_DATA(hi2s); + + hi2s->pTxBuf = pdata; + hi2s->TxCount = size; + hi2s->Error = 0U; + + __HAL_I2S_TX_ENABLE(hi2s); + if (hi2s->Init.Mode != I2S_MODE_SLAVE) + { + __HAL_I2S_START_ENABLE(hi2s); + } + + startTick = HAL_GetTick(); + while (1) + { + /* Whether sending is aborted */ + if (hi2s->Abort != DISABLE) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN); + hi2s->State = I2S_STATE_READY; + return (HAL_ERROR); + } + + /* Check for errors */ + hi2s->Error = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_FE | I2S_FLAG_UDR); + if (hi2s->Error) + { + __HAL_I2S_CLEAR_FLAG(hi2s, hi2s->Error); + + if (hi2s->ErrorCallback) + { + if (hi2s->ErrorCallback(hi2s)) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN); + hi2s->State = I2S_STATE_READY; + return (HAL_ERROR); + } + } + } + + if (hi2s->TxCount) + { + if (__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_TXE)) + { + __HAL_I2S_WRITE_DATA(hi2s, *pdata++); + hi2s->TxCount--; + } + } + else if (hi2s->Init.Mode != I2S_MODE_SLAVE) + { + if (__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_MSUSP)) + { + __HAL_I2S_CLEAR_FLAG(hi2s, I2S_FLAG_MSUSP); + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN); + hi2s->State = I2S_STATE_READY; + return HAL_OK; + } + } + else + { + if (__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_SVTC)) + { + __HAL_I2S_CLEAR_FLAG(hi2s, I2S_FLAG_SVTC); + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN); + hi2s->State = I2S_STATE_READY; + return HAL_OK; + } + } + + if (timeout != 0xFFFFFFFFU) + { + /* Whether the sending time has expired */ + if ((HAL_GetTick() - startTick) >= timeout) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN); + hi2s->State = I2S_STATE_READY; + return (HAL_TIMEOUT); + } + } + } +} + +/****************************************************************************** +*@brief : Receive an amount of data in blocking mode. +*@note In blocking mode, the user cannot enable interrupt. +*@note Users can add or ignore error handling in RxErrorCallback(). +* Error codes are stored in hi2s->RxError. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be received. +*@param : timeout: Timeout duration. +* If the value of this parameter is 0, the received data will be detected only once and will not wait. +* If the value of this parameter is 0xFFFFFFFF, it will be received until all data are received. +* @node The timeout should be greater than the time of all data transfers. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_Receive(I2S_HandleTypeDef *hi2s, uint32_t *pdata, uint32_t size, uint32_t timeout) +{ + volatile uint32_t temp; + uint32_t startTick; + + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + assert_param(pdata != NULL); + assert_param(size != 0U); + + /* If I2S is receiving, an error is returned */ + if (hi2s->State != I2S_STATE_READY) + return HAL_ERROR; + + /* Blocking reception can be aborted. Clear the abort flag bit */ + hi2s->Abort = DISABLE; + + /* state: busy */ + hi2s->State = I2S_STATE_BUSY; + + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_STOP | I2S_CR_TEN | I2S_CR_REN | I2S_CR_TXDMAEN | I2S_CR_RXDMAEN); + + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_MASK); + temp = __HAL_I2S_READ_DATA(hi2s); + __HAL_I2S_CLEAR_FLAG(hi2s, I2S_FLAG_MASK); + + hi2s->pRxBuf = pdata; + hi2s->RxCount = size; + hi2s->Error = 0U; + + if (hi2s->Init.Mode != I2S_MODE_SLAVE) + { + __HAL_I2S_START_ENABLE(hi2s); + } + else + { + hi2s->Instance->RSIZE = size; + } + __HAL_I2S_RX_ENABLE(hi2s); + + startTick = HAL_GetTick(); + while (1) + { + /* Whether reception is aborted */ + if (hi2s->Abort != DISABLE) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_REN); + hi2s->State = I2S_STATE_READY; + return (HAL_ERROR); + } + + /* Whether there are errors */ + hi2s->Error = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_FE | I2S_FLAG_OVR); + if (hi2s->Error) + { + if (hi2s->Error & I2S_FLAG_OVR) + { + temp = __HAL_I2S_READ_DATA(hi2s); + } + __HAL_I2S_CLEAR_FLAG(hi2s, hi2s->Error); + + if (hi2s->ErrorCallback) + { + if (hi2s->ErrorCallback(hi2s)) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_REN); + hi2s->State = I2S_STATE_READY; + return (HAL_ERROR); + } + } + } + + if (__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_RXNE)) + { + /* receive data */ + *pdata++ = (uint32_t)(__HAL_I2S_READ_DATA(hi2s)); + hi2s->RxCount--; + + if (hi2s->RxCount == 1) + { + } + if (hi2s->RxCount == 0) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_REN); + hi2s->State = I2S_STATE_READY; + return (HAL_OK); + } + } + + /* Whether the receiving time has expired */ + if (timeout != 0xFFFFFFFFU) + { + if ((HAL_GetTick() - startTick) >= timeout) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_REN); + hi2s->State = I2S_STATE_READY; + return (HAL_TIMEOUT); + } + } + } +} + +/****************************************************************************** +*@brief : Send an amount of data in blocking mode. +*@note In blocking mode, the user cannot enable interrupt. +*@note Users can add or ignore error handling in TxErrorCallback(). +* Error codes are stored in hi2s->TxError. +*@note The last word was being sent when the function exited. +* The application also needs to call the HAL_I2S_GetBusyStatus() function +* to detect the end of sending. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be sent. +*@param : timeout: Timeout duration. +* The minimum value of this parameter is 1. +* If the value of this parameter is 0xFFFFFFFF, it will be sent until all data are sent. +* @node The timeout should be greater than the time of all data transfers. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_Transmit_Receive(I2S_HandleTypeDef *hi2s, uint32_t *prxdata, uint32_t *ptxdata, uint32_t size, uint32_t timeout) +{ + volatile uint32_t temp; + uint32_t startTick; + + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + assert_param((prxdata != 0U) || (ptxdata != 0U)); + assert_param(size != 0U); + assert_param(timeout != 0U); + + /* If I2S is sending, an error is returned */ + if (hi2s->State != I2S_STATE_READY) + return HAL_ERROR; + + /* Blocking transmission can be aborted. Clear the abort flag bit */ + hi2s->Abort = DISABLE; + + /* state: busy */ + hi2s->State = I2S_STATE_BUSY; + + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_STOP | I2S_CR_TEN | I2S_CR_REN | I2S_CR_TXDMAEN | I2S_CR_RXDMAEN); + + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_MASK); + temp = __HAL_I2S_READ_DATA(hi2s); + __HAL_I2S_CLEAR_FLAG(hi2s, I2S_FLAG_MASK); + + hi2s->pTxBuf = ptxdata; + hi2s->pRxBuf = prxdata; + hi2s->TxCount = size; + hi2s->RxCount = size; + hi2s->Error = 0U; + + __HAL_I2S_TX_RX_ENABLE(hi2s); + + if (hi2s->Init.Mode != I2S_MODE_SLAVE) + { + __HAL_I2S_START_ENABLE(hi2s); + } + + startTick = HAL_GetTick(); + while (1) + { + /* Whether sending is aborted */ + if (hi2s->Abort != DISABLE) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN | I2S_CR_REN); + hi2s->State = I2S_STATE_READY; + return (HAL_ERROR); + } + + /* Check for errors */ + hi2s->Error = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_FE | I2S_FLAG_OVR | I2S_FLAG_UDR); + if (hi2s->Error) + { + if (hi2s->Error & I2S_FLAG_OVR) + { + temp = __HAL_I2S_READ_DATA(hi2s); + } + __HAL_I2S_CLEAR_FLAG(hi2s, hi2s->Error); + + if (hi2s->ErrorCallback) + { + if (hi2s->ErrorCallback(hi2s)) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN | I2S_CR_REN); + hi2s->State = I2S_STATE_READY; + return (HAL_ERROR); + } + } + } + + if (hi2s->TxCount) + { + if (__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_TXE)) + { + if (ptxdata) + { + __HAL_I2S_WRITE_DATA(hi2s, *ptxdata++); + } + else + { + __HAL_I2S_WRITE_DATA(hi2s, 0); + } + hi2s->TxCount--; + } + } + + if (__HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_RXNE)) + { + /* receive data */ + if (prxdata) + { + *prxdata++ = (uint32_t)(__HAL_I2S_READ_DATA(hi2s)); + } + else + { + temp = (uint32_t)(__HAL_I2S_READ_DATA(hi2s)); + } + hi2s->RxCount--; + + if (hi2s->RxCount == 0) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN | I2S_CR_REN); + hi2s->State = I2S_STATE_READY; + return (HAL_OK); + } + } + + if (timeout != 0xFFFFFFFF) + { + /* Whether the sending time has expired */ + if ((HAL_GetTick() - startTick) >= timeout) + { + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN | I2S_CR_REN); + hi2s->State = I2S_STATE_READY; + return (HAL_TIMEOUT); + } + } + } +} + +/****************************************************************************** +*@brief : Send an amount of data in interrupt mode. +*@note In interrupt mode, the transmission related interrupts (TXE/ERR) are forced enabled. +*@note Users can add or ignore error handling in ErrorCallback(). +* Error codes are stored in hi2s->TxError. +*@note When the callback function TxCpltCallback() is called, the last word is being sent. +* The application also needs to call the HAL_I2S_GetBusyStatus() function +* to detect the end of sending. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be received. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint32_t *pdata, uint32_t size) +{ + volatile uint32_t temp; + uint32_t tempCR; + uint32_t tempPR; + + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + assert_param(pdata); + assert_param(size != 0U); + + /* If I2S is sending, an error is returned */ + if (hi2s->State != I2S_STATE_READY) + return HAL_ERROR; + + /* Blocking transmission can be aborted. Clear the abort flag bit */ + hi2s->Abort = DISABLE; + + /* state: busy */ + hi2s->State = I2S_STATE_BUSY_IT; + + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_STOP | I2S_CR_TEN | I2S_CR_REN | I2S_CR_TXDMAEN | I2S_CR_RXDMAEN); + + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_MASK); + temp = __HAL_I2S_READ_DATA(hi2s); + __HAL_I2S_CLEAR_FLAG(hi2s, I2S_FLAG_MASK); + + hi2s->pTxBuf = pdata; + hi2s->TxCount = size; + hi2s->Error = 0U; + + if (hi2s->Init.Mode != I2S_MODE_SLAVE) + { + __HAL_I2S_IT_ENABLE(hi2s, I2S_IT_TXE | I2S_IT_MSUSP | I2S_IT_ERR); + __HAL_I2S_TX_ENABLE(hi2s); + __HAL_I2S_START_ENABLE(hi2s); + } + else + { + __HAL_I2S_IT_ENABLE(hi2s, I2S_IT_TXE | I2S_IT_SVTC | I2S_IT_ERR); + __HAL_I2S_TX_ENABLE(hi2s); + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data in interrupt mode. +*@note In interrupt mode, receiving completion interrupt (RXNE/ERR) are forced enabled. +* If an error occurs in the reception, the reception stops automatically. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be received. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_Receive_IT(I2S_HandleTypeDef *hi2s, uint32_t *pdata, uint32_t size) +{ + volatile uint32_t temp; + uint32_t tempCR; + uint32_t tempPR; + + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + assert_param(pdata); + assert_param(size != 0U); + + /* If I2S is receiving, an error is returned */ + if (hi2s->State != I2S_STATE_READY) + return HAL_ERROR; + + /* Blocking reception can be aborted. Clear the abort flag bit */ + hi2s->Abort = DISABLE; + + /* state: busy */ + hi2s->State = I2S_STATE_BUSY_IT; + + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_STOP | I2S_CR_TEN | I2S_CR_REN | I2S_CR_TXDMAEN | I2S_CR_RXDMAEN); + + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_MASK); + temp = __HAL_I2S_READ_DATA(hi2s); + __HAL_I2S_CLEAR_FLAG(hi2s, I2S_FLAG_MASK); + + hi2s->pRxBuf = pdata; + hi2s->RxCount = size; + hi2s->Error = 0U; + + __HAL_I2S_IT_ENABLE(hi2s, I2S_IT_RXNE | I2S_IT_ERR); + + __HAL_I2S_RX_ENABLE(hi2s); + if (hi2s->Init.Mode != I2S_MODE_SLAVE) + { + hi2s->Instance->RSIZE = size; + __HAL_I2S_START_ENABLE(hi2s); + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Send an amount of data in interrupt mode. +*@note In interrupt mode, the transmission related interrupts (TXE/ERR) are forced enabled. +*@note Users can add or ignore error handling in ErrorCallback(). +* Error codes are stored in hi2s->TxError. +*@note When the callback function TxCpltCallback() is called, the last word is being sent. +* The application also needs to call the HAL_I2S_GetBusyStatus() function +* to detect the end of sending. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be received. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_Transmit_Receive_IT(I2S_HandleTypeDef *hi2s, uint32_t *prxdata, uint32_t *ptxdata, uint32_t size) +{ + volatile uint32_t temp; + + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + assert_param((prxdata != 0U) || (ptxdata != 0U)); + assert_param(size != 0U); + + /* If I2S is sending, an error is returned */ + if (hi2s->State != I2S_STATE_READY) + return HAL_ERROR; + + /* Blocking transmission can be aborted. Clear the abort flag bit */ + hi2s->Abort = DISABLE; + + /* state: busy */ + hi2s->State = I2S_STATE_BUSY_IT; + + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_STOP | I2S_CR_TEN | I2S_CR_REN | I2S_CR_TXDMAEN | I2S_CR_RXDMAEN); + + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_MASK); + temp = __HAL_I2S_READ_DATA(hi2s); + __HAL_I2S_CLEAR_FLAG(hi2s, I2S_FLAG_MASK); + + hi2s->pTxBuf = ptxdata; + hi2s->TxCount = size; + hi2s->pRxBuf = prxdata; + hi2s->RxCount = size; + hi2s->Error = 0U; + + /* enable interrupt (TXE/RXNE/ERR) */ + __HAL_I2S_IT_ENABLE(hi2s, I2S_IT_TXE | I2S_IT_RXNE | I2S_IT_ERR); + + __HAL_I2S_TX_RX_ENABLE(hi2s); + if (hi2s->Init.Mode != I2S_MODE_SLAVE) + { + __HAL_I2S_START_ENABLE(hi2s); + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Send an amount of data in DMA mode. +*@note In DMA mode, the tx buffer empty interrupt (TXE) is forced to disabled. +* the error interrupt (ERR) is forced to enabled. +* the DMA transmission related interrupt (ITC/HFTC/IE) is forced to enabled. +* If an DMA transfer error occurs in the transmission, +* the transmission stops automatically. +*@note When the callback function TxCpltCallback() is called, the last word is being sent. +* The application also needs to call the HAL_I2S_GetBusyStatus() function +* to detect the end of sending. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be received. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_Transmit_DMA(I2S_HandleTypeDef *hi2s, uint32_t *pdata, uint16_t size) +{ + volatile uint32_t temp; + + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + assert_param(pdata != NULL); + assert_param(size != 0U); + + /* If I2S is sending, an error is returned */ + if (hi2s->State != I2S_STATE_READY) + return HAL_ERROR; + + /* Blocking transmission can be aborted. Clear the abort flag bit */ + hi2s->Abort = DISABLE; + + /* state: busy */ + hi2s->State = I2S_STATE_BUSY_DMA; + + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_STOP | I2S_CR_TEN | I2S_CR_REN | I2S_CR_TXDMAEN | I2S_CR_RXDMAEN); + + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_MASK); + temp = __HAL_I2S_READ_DATA(hi2s); + __HAL_I2S_CLEAR_FLAG(hi2s, I2S_FLAG_MASK); + + /* set dmac callback function */ + hi2s->hdmactx->XferCpltCallback = HAL_I2S_DMATxCpltCallback; + if (hi2s->DMATxHalfCpltCallback) + hi2s->hdmactx->XferHalfCpltCallback = HAL_I2S_DMATxHalfCpltCallback; + else + hi2s->hdmactx->XferHalfCpltCallback = NULL; + hi2s->hdmactx->XferErrorCallback = HAL_I2S_DMAErrorCallback; + + hi2s->pTxBuf = pdata; + hi2s->TxCount = size; + hi2s->Error = 0U; + + __HAL_I2S_IT_ENABLE(hi2s, I2S_IT_ERR); + __HAL_I2S_TX_ENABLE(hi2s); + if (hi2s->Init.Mode != I2S_MODE_SLAVE) + { + __HAL_I2S_IT_ENABLE(hi2s, I2S_IT_MSUSP); + __HAL_I2S_START_ENABLE(hi2s); + } + else + { + __HAL_I2S_IT_ENABLE(hi2s, I2S_IT_SVTC); + } + + /* Start DMA interrupt transfer */ + if (HAL_DMA_Start_IT(hi2s->hdmactx, (uint32_t)pdata, (uint32_t)&hi2s->Instance->TXDR, size) != HAL_OK) + { + /* DMA sending failed */ + HAL_DMA_Abort(hi2s->hdmactx); + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN); + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_ERR); + hi2s->Error = I2S_DMA_TX_ERROR; + hi2s->State = I2S_STATE_READY; + return HAL_ERROR; + } + + __HAL_I2S_TX_DMA_ENABLE(hi2s); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data in DMA mode. +*@note In DMA mode, rx buffer non empty interrupt (RXNE) is forced disable. +* the error interrupt (ERR) is forced enabled. +* the DMA transmission related interrupt (ITC/HFTC/IE) is forced to enabled. +* If an DMA transfer error occurs in the reception, +* the reception stops automatically. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be received. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_Receive_DMA(I2S_HandleTypeDef *hi2s, uint32_t *pdata, uint16_t size) +{ + volatile uint32_t temp; + uint32_t tempCR; + uint32_t tempPR; + + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + assert_param(pdata != NULL); + assert_param(size != 0U); + + /* If I2S is sending, an error is returned */ + if (hi2s->State != I2S_STATE_READY) + return HAL_ERROR; + + /* Blocking transmission can be aborted. Clear the abort flag bit */ + hi2s->Abort = DISABLE; + + /* state: busy */ + hi2s->State = I2S_STATE_BUSY_DMA; + + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_STOP | I2S_CR_TEN | I2S_CR_REN | I2S_CR_TXDMAEN | I2S_CR_RXDMAEN); + + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_MASK); + temp = __HAL_I2S_READ_DATA(hi2s); + __HAL_I2S_CLEAR_FLAG(hi2s, I2S_FLAG_MASK); + + /* set dma callback function */ + hi2s->hdmacrx->XferCpltCallback = HAL_I2S_DMARxCpltCallback; + hi2s->hdmacrx->XferErrorCallback = HAL_I2S_DMAErrorCallback; + if (hi2s->DMARxHalfCpltCallback) + hi2s->hdmacrx->XferHalfCpltCallback = HAL_I2S_DMARxHalfCpltCallback; + else + hi2s->hdmacrx->XferHalfCpltCallback = NULL; + + hi2s->pRxBuf = pdata; + hi2s->RxCount = size; + hi2s->Error = 0U; + + __HAL_I2S_IT_ENABLE(hi2s, I2S_IT_ERR); + __HAL_I2S_RX_ENABLE(hi2s); + if (hi2s->Init.Mode != I2S_MODE_SLAVE) + { + hi2s->Instance->RSIZE = size; + __HAL_I2S_START_ENABLE(hi2s); + } + /* Start DMA interrupt transfer */ + if (HAL_DMA_Start_IT(hi2s->hdmacrx, (uint32_t)&hi2s->Instance->RXDR, (uint32_t)pdata, size) != HAL_OK) + { + /* Set error code to DMA */ + HAL_DMA_Abort(hi2s->hdmacrx); + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_REN); + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_ERR); + hi2s->Error = I2S_DMA_RX_ERROR; + hi2s->State = I2S_STATE_READY; + return HAL_ERROR; + } + + __HAL_I2S_RX_DMA_ENABLE(hi2s); + + return HAL_OK; +} +/****************************************************************************** +*@brief : Send an amount of data in DMA mode. +*@note In DMA mode, the tx buffer empty interrupt (TXE) is forced to disabled. +* the error interrupt (ERR) is forced to enabled. +* the DMA transmission related interrupt (ITC/HFTC/IE) is forced to enabled. +* If an DMA transfer error occurs in the transmission, +* the transmission stops automatically. +*@note When the callback function TxCpltCallback() is called, the last word is being sent. +* The application also needs to call the HAL_I2S_GetBusyStatus() function +* to detect the end of sending. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be received. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_Transmit_Receive_DMA(I2S_HandleTypeDef *hi2s, uint32_t *prxdata, uint32_t *ptxdata, uint16_t size) +{ + volatile uint32_t temp; + + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + assert_param(size != 0U); + + /* If I2S is sending, an error is returned */ + if (hi2s->State != I2S_STATE_READY) + return HAL_ERROR; + + /* Blocking transmission can be aborted. Clear the abort flag bit */ + hi2s->Abort = DISABLE; + + /* state: busy */ + hi2s->State = I2S_STATE_BUSY_DMA; + + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_STOP | I2S_CR_TEN | I2S_CR_REN | I2S_CR_TXDMAEN | I2S_CR_RXDMAEN); + + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_MASK); + temp = __HAL_I2S_READ_DATA(hi2s); + __HAL_I2S_CLEAR_FLAG(hi2s, I2S_FLAG_MASK); + + /* set dmac callback function */ + hi2s->hdmactx->XferCpltCallback = HAL_I2S_DMATxCpltCallback; + if (hi2s->DMATxHalfCpltCallback) + hi2s->hdmactx->XferHalfCpltCallback = HAL_I2S_DMATxHalfCpltCallback; + else + hi2s->hdmactx->XferHalfCpltCallback = NULL; + hi2s->hdmactx->XferErrorCallback = HAL_I2S_DMAErrorCallback; + + /* set dma callback function */ + hi2s->hdmacrx->XferCpltCallback = HAL_I2S_DMARxCpltCallback; + hi2s->hdmacrx->XferErrorCallback = HAL_I2S_DMAErrorCallback; + if (hi2s->DMARxHalfCpltCallback) + hi2s->hdmacrx->XferHalfCpltCallback = HAL_I2S_DMARxHalfCpltCallback; + else + hi2s->hdmacrx->XferHalfCpltCallback = NULL; + + hi2s->pTxBuf = ptxdata; + hi2s->TxCount = size; + hi2s->pRxBuf = prxdata; + hi2s->RxCount = size; + hi2s->Error = 0U; + + + __HAL_I2S_IT_ENABLE(hi2s, I2S_IT_ERR); + __HAL_I2S_TX_RX_ENABLE(hi2s); + if (hi2s->Init.Mode != I2S_MODE_SLAVE) + { + __HAL_I2S_START_ENABLE(hi2s); + } + + /* Start DMA interrupt transfer */ + if (HAL_DMA_Start_IT(hi2s->hdmactx, (uint32_t)ptxdata, (uint32_t)&hi2s->Instance->TXDR, size) != HAL_OK) + { + /* DMA sending failed */ + HAL_DMA_Abort(hi2s->hdmactx); + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN | I2S_CR_REN); + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_ERR); + hi2s->Error = I2S_DMA_TX_ERROR; + hi2s->State = I2S_STATE_READY; + return HAL_ERROR; + } + + /* Start DMA interrupt transfer */ + if (HAL_DMA_Start_IT(hi2s->hdmacrx, (uint32_t)&hi2s->Instance->RXDR, (uint32_t)prxdata, size) != HAL_OK) + { + /* Set error code to DMA */ + HAL_DMA_Abort(hi2s->hdmactx); + HAL_DMA_Abort(hi2s->hdmacrx); + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN | I2S_CR_REN); + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_ERR); + hi2s->Error = I2S_DMA_RX_ERROR; + hi2s->State = I2S_STATE_READY; + return HAL_ERROR; + } + + __HAL_I2S_TX_RX_DMA_ENABLE(hi2s); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Abort ongoing transmit transfer(block mode/interrupt mode/dma mode). +* In blocking mode, check TxState to exit the abort function. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_I2S_Abort(I2S_HandleTypeDef *hi2s) +{ + volatile uint32_t temp; + + /* Check the parameters */ + assert_param(IS_I2S_HANDLE(hi2s)); + assert_param(IS_I2S_INSTANCE(hi2s->Instance)); + + /* If I2S is not sent, return directly */ + if (hi2s->State == I2S_STATE_READY) + return HAL_OK; + + if (hi2s->State == I2S_STATE_BUSY) + { + /* Abort ongoing transmit transfer(in block mode) */ + + /* enable tx abort flag */ + hi2s->Abort = ENABLE; + return HAL_OK; + } + + if (hi2s->State == I2S_STATE_BUSY_IT) + { + /* Abort ongoing transmit transfer(interrupt mode) */ + + /* disable interrupt (TXE/ERR) */ + __HAL_I2S_IT_ENABLE(hi2s, I2S_IT_TXE | I2S_IT_RXNE | I2S_IT_MSUSP | I2S_IT_ERR); + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN | I2S_CR_REN); + + /* end of sending */ + hi2s->State = I2S_STATE_READY; + return HAL_OK; + } + + if (hi2s->State == I2S_STATE_BUSY_DMA) + { + /* Abort ongoing transmit transfer(dma mode) */ + + /* disable interrupt (ERR) */ + __HAL_I2S_IT_DISABLE(hi2s, I2S_IT_ERR); + + /* abort dma transfer */ + HAL_DMA_Abort(hi2s->hdmactx); + + hi2s->Instance->CR &= ~(I2S_CR_START | I2S_CR_TEN | I2S_CR_REN); + + /* disable I2S Tx DMA */ + __HAL_I2S_TX_RX_DMA_DISABLE(hi2s); + + /* end of sending */ + hi2s->State = I2S_STATE_READY; + return HAL_OK; + } + + return HAL_ERROR; +} + +/****************************************************************************** +*@brief : Get sending status. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: sending status. +* The return value can be @ ref I2S_State value +* @arg I2S_STATE_READY: I2S not sent. +* @arg I2S_STATE_BUSY: I2S sending(block mode). +* @arg I2S_STATE_BUSY_IT: I2S sending(interrupt mode). +* @arg I2S_STATE_BUSY_DMA: I2S sending(dma mode). +******************************************************************************/ +uint32_t HAL_I2S_GetState(I2S_HandleTypeDef *hi2s) +{ + assert_param(IS_I2S_HANDLE(hi2s)); + + return (hi2s->State); +} + + + +/****************************************************************************** +*@brief : Init the internal parameter. +*@param : hi2s: pointer to a I2S_HandleTypeDef structure that contains +* the configuration information for I2S module. +*@return: None. +******************************************************************************/ +static void HAL_I2S_InitParamter(I2S_HandleTypeDef *hi2s) +{ + hi2s->State = 0U; + hi2s->Abort = 0U; + hi2s->pTxBuf = 0U; + hi2s->TxCount = 0U; + hi2s->pRxBuf = 0U; + hi2s->RxCount = 0U; + + hi2s->MsuspCallback = NULL; + hi2s->TxCpltCallback = NULL; + hi2s->RxCpltCallback = NULL; + hi2s->DMATxCpltCallback = NULL; + hi2s->DMATxHalfCpltCallback = NULL; + hi2s->DMARxCpltCallback = NULL; + hi2s->DMARxHalfCpltCallback = NULL; + hi2s->ErrorCallback = NULL; +} + +#endif /* HAL_I2S_MODULE_ENABLED */ + +/************************ (C) COPYRIGHT AISINOCHIP *****END OF FILE****/ + + + + + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_iwdt.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_iwdt.c new file mode 100644 index 0000000000..b408571246 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_iwdt.c @@ -0,0 +1,245 @@ + +/****************************************************************************** +*@file : hal_iwdt.c +*@brief : IWDT HAL module driver. +******************************************************************************/ + +#include "hal.h" + + +#ifdef HAL_IWDT_MODULE_ENABLED + + +static HAL_StatusTypeDef HAL_IWDT_WaitOnFlagToResetUntilTimeout(IWDT_HandleTypeDef *hiwdt, \ + uint32_t flags, int32_t startTick, uint32_t timeout); + +/****************************************************************************** +*@brief : IWDT interrupt request. +*@param : hiwdt: pointer to a IWDT_HandleTypeDef structure that contains +* the configuration information for the specified IWDT module. +*@return: None +******************************************************************************/ +void HAL_IWDT_IRQHandler(IWDT_HandleTypeDef *hiwdt) +{ + /* Check the parameters */ + assert_param(IS_IWDT_ALL_INSTANCE(hiwdt->Instance)); + + if (SET == HAL_IWDT_GetPending()) + { + HAL_IWDT_Callback(hiwdt); + + /* Clear interrupt pending bit of the IWDT. */ + HAL_IWDT_ClearPending(); + } +} + + +/****************************************************************************** +*@brief : IWDT interrupt callback. +*@param : hiwdt: pointer to a IWDT_HandleTypeDef structure that contains +* the configuration information for the specified IWDT module. +*@return: None +******************************************************************************/ +__weak void HAL_IWDT_Callback(IWDT_HandleTypeDef *hiwdt) +{ + UNUSED(hiwdt); +} + +/****************************************************************************** +*@brief : Initialize the IWDT according to the specified parameters in the +* IWDT_InitTypeDef and start watchdog. Before exiting function, +* watchdog is refreshed in order to have correct time base. +*@param : hiwdt: pointer to a IWDT_HandleTypeDef structure that contains +* the configuration information for the specified IWDT module. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_IWDT_Init(IWDT_HandleTypeDef * hiwdt) +{ + uint32_t startTime; + + /* Check the parameters */ + assert_param(IS_IWDT_HANDLE(hiwdt)); + assert_param(IS_IWDT_ALL_INSTANCE(hiwdt->Instance)); + assert_param(IS_IWDT_PRESCALER(hiwdt->Init.Prescaler)); + assert_param(IS_IWDT_RELOAD(hiwdt->Init.Reload)); + assert_param(IS_IWDT_WINDOW(hiwdt->Init.Window)); + assert_param(IS_IWDT_WAKEUP(hiwdt->Init.Wakeup)); + + HAL_IWDT_MspInit(hiwdt); + + + /* Enable IWDT. RC32K is turned on automatically */ + hiwdt->Instance->CMDR = IWDT_CMD_ENABLE; + + /* Enable write access to IWDT_PR */ + hiwdt->Instance->CMDR = IWDT_CMD_WRITE_ENABLE; + + /* Check flag IWDT_FLAG_PVU */ + startTime = HAL_GetTick(); + if (HAL_IWDT_WaitOnFlagToResetUntilTimeout(hiwdt, IWDT_FLAG_PVU, startTime, IWDT_PVU_TIMEOUT) != HAL_OK) + return HAL_ERROR; + + /* Write to IWDT registers the Prescaler to work with */ + hiwdt->Instance->PR = hiwdt->Init.Prescaler; + + /* Check flag IWDT_FLAG_RVU */ + startTime = HAL_GetTick(); + if (HAL_IWDT_WaitOnFlagToResetUntilTimeout(hiwdt, IWDT_FLAG_RVU, startTime, IWDT_RVU_TIMEOUT) != HAL_OK) + return HAL_ERROR; + + /* Write to IWDT registers the Reload values to work with */ + hiwdt->Instance->RLR = hiwdt->Init.Reload; + + /* Check flag IWDT_FLAG_WTU */ + startTime = HAL_GetTick(); + if (HAL_IWDT_WaitOnFlagToResetUntilTimeout(hiwdt, IWDT_FLAG_WTU, startTime, IWDT_WTU_TIMEOUT) != HAL_OK) + return HAL_ERROR; + + /* Write to IWDT registers the Wakeup values to work with */ + if (hiwdt->Init.Reload > hiwdt->Init.Wakeup) + { + /* Check the parameters */ + assert_param(IS_IWDT_WAKEUPMODE(hiwdt->Init.WakeupMode)); + + hiwdt->Instance->WUTR = hiwdt->Init.Wakeup; + + /* Clear interrupt pending bit of the IWDT. */ + HAL_EXTI_ClearPending(IWDT_EXTI_LINE); + + /* set wakeup mode. */ + HAL_EXTI_SetConfigLine(NULL, IWDT_EXTI_LINE, hiwdt->Init.WakeupMode); + + } + else + { + /* wakeup disable */ + hiwdt->Instance->WUTR = IWDT_RELOAD_MAX_VALUE; + + /* Clear wakeup mode. */ + HAL_EXTI_ClearConfigLine(IWDT_EXTI_LINE); + + /* Clear interrupt pending bit of the IWDT. */ + HAL_EXTI_ClearPending(IWDT_EXTI_LINE); + } + + /* Check flag IWDT_FLAG_WVU */ + startTime = HAL_GetTick(); + if (HAL_IWDT_WaitOnFlagToResetUntilTimeout(hiwdt, IWDT_FLAG_WVU, startTime, IWDT_WVU_TIMEOUT) != HAL_OK) + return HAL_ERROR; + + /* Write to IWDT registers the window values to work with */ + if (hiwdt->Init.Reload <= hiwdt->Init.Window) + hiwdt->Instance->WINR = IWDT_RELOAD_MAX_VALUE; + + /* Check all flags */ + startTime = HAL_GetTick(); + if (HAL_IWDT_WaitOnFlagToResetUntilTimeout(hiwdt, IWDT_FLAG_PVU | IWDT_FLAG_RVU | IWDT_FLAG_WVU | IWDT_FLAG_WTU | \ + IWDT_FLAG_RLF, startTime, IWDT_RLF_TIMEOUT) != HAL_OK) + { + return HAL_ERROR; + } + + if (hiwdt->Init.Reload > hiwdt->Init.Wakeup) + { + /* wakeup enable */ + hiwdt->Instance->CMDR = IWDT_CMD_WAKEUP_ENABLE; + } + + if (hiwdt->Init.Reload > hiwdt->Init.Window) + { + /* Write to IWDT registers the window values to work with */ + hiwdt->Instance->WINR = hiwdt->Init.Window; + } + else + { + hiwdt->Instance->CMDR = IWDT_CMD_RELOAD; + } + + /* Check all flags */ + startTime = HAL_GetTick(); + if (HAL_IWDT_WaitOnFlagToResetUntilTimeout(hiwdt, IWDT_FLAG_PVU | IWDT_FLAG_RVU | IWDT_FLAG_WVU | IWDT_FLAG_WTU | \ + IWDT_FLAG_RLF, startTime, IWDT_RLF_TIMEOUT) != HAL_OK) + return HAL_ERROR; + + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initialize the IWDT MSP. +*@param : hiwdt: pointer to a IWDT_HandleTypeDef structure that contains +* the configuration information for the specified IWDT module. +*@return: None +******************************************************************************/ +__weak void HAL_IWDT_MspInit(IWDT_HandleTypeDef * hiwdt) +{ + UNUSED(hiwdt); +} + +/****************************************************************************** +*@brief : Refresh the IWDT. +*@param : hiwdt: pointer to a IWDT_HandleTypeDef structure that contains +* the configuration information for the specified IWDT module. +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_IWDT_Refresh(IWDT_HandleTypeDef *hiwdt) +{ + /* Check the parameters */ + assert_param(IS_IWDT_HANDLE(hiwdt)); + + hiwdt->Instance->CMDR = IWDT_CMD_RELOAD; + + while (hiwdt->Instance->SR & IWDT_FLAG_RLF); + + return HAL_OK; +} + + +/****************************************************************************** +*@brief : Get interrupt pending bit of the IWDT. +*@return: None +******************************************************************************/ +FlagStatus HAL_IWDT_GetPending(void) +{ + return (HAL_EXTI_GetPending(IWDT_EXTI_LINE)); +} + +/****************************************************************************** +*@brief : Clear interrupt pending bit of the IWDT. +*@return: None. +******************************************************************************/ +void HAL_IWDT_ClearPending(void) +{ + HAL_EXTI_ClearPending(IWDT_EXTI_LINE); +} + +/****************************************************************************** +*@brief : Handle IWDT Timeout. +*@param : hiwdt: pointer to a IWDT_HandleTypeDef structure that contains +* the configuration information for the specified IWDT module. +*@param : flags: Specifies the IWDT flag to check. +* This parameter can be a combination of @ref IWDT_Flag. +* @arg IWDT_FLAG_PVU: IWDT timer prescaler value update. +* @arg IWDT_FLAG_RVU: IWDT timer reload value update. +* @arg IWDT_FLAG_WVU: IWDT timer window value update. +* @arg IWDT_FLAG_WTU: IWDT timer wake-up value update. +* @arg IWDT_FLAG_RLF: IWDT timer feeding dog completed. +*@param : startTick: Tick start value. +*@param : timeout: Timeout duration. +*@return: None. +******************************************************************************/ +static HAL_StatusTypeDef HAL_IWDT_WaitOnFlagToResetUntilTimeout(IWDT_HandleTypeDef *hiwdt, \ + uint32_t flags, int32_t startTick, uint32_t timeout) +{ + while ((hiwdt->Instance->SR & flags) == flags) + { + if ((HAL_GetTick() - startTick) >= timeout) + return (HAL_TIMEOUT); + } + return (HAL_OK); +} + +#endif /* HAL_IWDT_MODULE_ENABLED */ + +/************************ (C) COPYRIGHT AISINOCHIP *****END OF FILE****/ + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_lptim.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_lptim.c new file mode 100644 index 0000000000..e4d7974eef --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_lptim.c @@ -0,0 +1,1244 @@ + +/****************************************************************************** +*@file : hal_lptim.c +*@brief : LPTIM HAL module driver. +******************************************************************************/ + +#include "hal.h" + +#ifdef HAL_LPTIM_MODULE_ENABLED + + +static HAL_StatusTypeDef LPTIM_WaitForFlag(LPTIM_HandleTypeDef *hlptim, uint32_t flag); +static HAL_StatusTypeDef HAL_LPTIM_Disable(LPTIM_HandleTypeDef *hlptim); + +/****************************************************************************** +*@brief : Handle LPTIM interrupt request. +*@param : hlptim: LPTIM handle. +*@return: None +******************************************************************************/ +void HAL_LPTIM_IRQHandler(LPTIM_HandleTypeDef *hlptim) +{ + /* Compare match interrupt */ + if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_CMPM)) + { + if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_CMPM)) + { + /* Clear Compare match flag */ + __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_CMPM); + + if (hlptim->CompareMatchCallback) + { + hlptim->CompareMatchCallback(hlptim); + } + return; + } + } + + /* Autoreload match interrupt */ + if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_ARRM)) + { + if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_ARRM)) + { + /* Clear Autoreload match flag */ + __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_ARRM); + + if (hlptim->AutoReloadMatchCallback) + { + hlptim->AutoReloadMatchCallback(hlptim); + } + return; + } + } + + /* Repetition Counter update event interrupt */ + if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_REPUE)) + { + if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_REPUE)) + { + /* Clear Autoreload match flag */ + __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_REPUE); + + if (hlptim->RepetitionUpdateCallback) + { + hlptim->RepetitionUpdateCallback(hlptim); + } + return; + } + } + + /* Direction counter changed from Down to Up interrupt */ + if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_UP)) + { + if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_UP)) + { + /* Clear Direction counter changed from Down to Up flag */ + __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_UP); + + if (hlptim->DirectionUpCallback) + { + hlptim->DirectionUpCallback(hlptim); + } + return; + } + } + + /* Direction counter changed from Up to Down interrupt */ + if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_DOWN)) + { + if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_DOWN)) + { + /* Clear Direction counter changed from Up to Down flag */ + __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_DOWN); + + if (hlptim->DirectionDownCallback) + { + hlptim->DirectionDownCallback(hlptim); + } + return; + } + } + + /* Trigger detected interrupt */ + if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_EXTTRIG)) + { + if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_EXTTRIG)) + { + /* Clear Trigger detected flag */ + __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_EXTTRIG); + + if (hlptim->TriggerCallback) + { + hlptim->TriggerCallback(hlptim); + } + return; + } + } + + /* Compare write interrupt */ + if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_CMPOK)) + { + if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_CMPOK)) + { + /* Clear Compare write flag */ + __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_CMPOK); + + if (hlptim->CompareWriteCallback) + { + hlptim->CompareWriteCallback(hlptim); + } + return; + } + } + + /* Autoreload write interrupt */ + if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_ARROK)) + { + if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_ARROK)) + { + /* Clear Autoreload write flag */ + __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_ARROK); + + if (hlptim->AutoReloadWriteCallback) + { + hlptim->AutoReloadWriteCallback(hlptim); + } + return; + } + } + + /* Repetition Counter write interrupt */ + if (__HAL_LPTIM_GET_IT_SOURCE(hlptim, LPTIM_IT_REPOK)) + { + if (__HAL_LPTIM_GET_FLAG(hlptim, LPTIM_FLAG_REPOK)) + { + /* Clear Autoreload write flag */ + __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_REPOK); + + if (hlptim->RepetitionWriteCallback) + { + hlptim->RepetitionWriteCallback(hlptim); + } + return; + } + } + +} + +/****************************************************************************** +*@brief : Initialize the LPTIM according to the specified parameters in the +* LPTIM_InitTypeDef and initialize the associated handle. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_Init(LPTIM_HandleTypeDef *hlptim) +{ + uint32_t temp; + + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + + assert_param(IS_LPTIM_CLOCK_SOURCE(hlptim->Init.ClockSource)); + assert_param(IS_LPTIM_CLOCK_PRESCALER(hlptim->Init.ClockPrescaler)); + assert_param(IS_LPTIM_TRIG_SOURCE(hlptim->Init.TriggerSource));; + assert_param(IS_LPTIM_UPDATE_MODE(hlptim->Init.UpdateMode)); + assert_param(IS_LPTIM_WAVEFORM_POLARITY(hlptim->Init.WaveformPolarity)); + + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_LPTIM_MspInit(hlptim); + + /* LPTIM Reset */ + { + if (hlptim->Instance == LPTIM1) + { + __HAL_RCC_LPTIM1_RESET(); + } + else if(hlptim->Instance == LPTIM2) + { + __HAL_RCC_LPTIM2_RESET(); + } + else if(hlptim->Instance == LPTIM3) + { + __HAL_RCC_LPTIM3_RESET(); + } + else if(hlptim->Instance == LPTIM4) + { + __HAL_RCC_LPTIM4_RESET(); + } + else if(hlptim->Instance == LPTIM5) + { + __HAL_RCC_LPTIM5_RESET(); + } + else if(hlptim->Instance == LPTIM6) + { + __HAL_RCC_LPTIM6_RESET(); + } + } + + + /* Set initialization parameters */ + temp = hlptim->Init.ClockPrescaler | hlptim->Init.WaveformPolarity | hlptim->Init.UpdateMode; + + if (hlptim->Init.TriggerSource != LPTIM_TRIGSOURCE_SOFTWARE) + temp |= hlptim->Init.TriggerSource; + + /* Configure internal clock source, counter source */ + if (hlptim->Init.ClockSource != LPTIM_CLOCKSOURCE_EXTERNAL_INPUT1) + { + assert_param(IS_LPTIM_COUNTER_SOURCE(hlptim->Init.CounterSource)); + + /* Configure LPTIM internal clock sources */ + { + if (hlptim->Instance == LPTIM1) + { + if (HAL_RCC_LPTIM1ClockSourceConfig(hlptim->Init.ClockSource) != HAL_OK) + return HAL_ERROR; + } + else if(hlptim->Instance == LPTIM2) + { + if (HAL_RCC_LPTIM2ClockSourceConfig(hlptim->Init.ClockSource) != HAL_OK) + return HAL_ERROR; + } + else if(hlptim->Instance == LPTIM3) + { + if (HAL_RCC_LPTIM3ClockSourceConfig(hlptim->Init.ClockSource) != HAL_OK) + return HAL_ERROR; + } + else if(hlptim->Instance == LPTIM4) + { + if (HAL_RCC_LPTIM4ClockSourceConfig(hlptim->Init.ClockSource) != HAL_OK) + return HAL_ERROR; + } + else if(hlptim->Instance == LPTIM5) + { + if (HAL_RCC_LPTIM5ClockSourceConfig(hlptim->Init.ClockSource) != HAL_OK) + return HAL_ERROR; + } + else if(hlptim->Instance == LPTIM6) + { + if (HAL_RCC_LPTIM6ClockSourceConfig(hlptim->Init.ClockSource) != HAL_OK) + return HAL_ERROR; + } + } + + /* Configure counter source */ + temp |= hlptim->Init.CounterSource; + + /* Configure counter polarity and counter filtering, if external counter source is selected */ + if (hlptim->Init.CounterSource == LPTIM_COUNTERSOURCE_EXTERNAL) + { + assert_param(IS_LPTIM_COUNTER_POLARITY(hlptim->Init.CounterPolarity)); + assert_param(IS_LPTIM_COUNTER_FILTER(hlptim->Init.CounterFilter)); + + temp |= hlptim->Init.CounterPolarity | hlptim->Init.CounterFilter; + + /* Configure LPTIM input1 sources */ +// if (hlptim->Instance == LPTIM1) +// { + assert_param(IS_LPTIM_INPUT1_SOURCE(hlptim->Init.Input1Source)); + + /* Configure LPTIM Input1 sources */ + hlptim->Instance->CFGR2 |= hlptim->Init.Input1Source; +// } + } + + /* Configure trigger polarity and trigger filtering, if external trigger source is selected */ + if (hlptim->Init.TriggerSource != LPTIM_TRIGSOURCE_SOFTWARE) + { + assert_param(IS_LPTIM_TRIG_POLARITY(hlptim->Init.TriggerPolarity)); + assert_param(IS_LPTIM_TRIG_FILTER(hlptim->Init.TriggerFilter)); + + temp |= hlptim->Init.TriggerPolarity | hlptim->Init.TriggerFilter; + } + } + else + { + assert_param((hlptim->Init.CounterPolarity == LPTIM_COUNTERPOLARITY_RISING) || \ + (hlptim->Init.CounterPolarity == LPTIM_COUNTERPOLARITY_FALLING)); + assert_param(IS_LPTIM_INPUT1_SOURCE(hlptim->Init.Input1Source)); + + /* Configure external clock source and counter polarity */ +// temp |= hlptim->Init.ClockSource | hlptim->Init.CounterPolarity; + temp |= LPTIM_CFGR1_CKSEL | hlptim->Init.CounterPolarity; + + /* Configure trigger polarity and trigger filtering, if external trigger source is selected */ + if (hlptim->Init.TriggerSource != LPTIM_TRIGSOURCE_SOFTWARE) + { + assert_param(IS_LPTIM_TRIG_POLARITY(hlptim->Init.TriggerPolarity)); + + temp |= hlptim->Init.TriggerPolarity; + } + + /* Configure LPTIM input sources */ +// if (hlptim->Instance == LPTIM1) +// { + /* Configure LPTIM Input1 sources */ + hlptim->Instance->CFGR2 |= hlptim->Init.Input1Source; +// } + } + + hlptim->RepetitionCounter = 0U; + hlptim->AutoReload = 1U; + hlptim->Compare = 0U; + + /* Write to LPTIMx CFGR1 */ + hlptim->Instance->CFGR1 = temp; + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : DeInitialize the LPTIM peripheral. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_DeInit(LPTIM_HandleTypeDef *hlptim) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + + /* LPTIM Reset */ + if (hlptim->Instance == LPTIM1) + { + __HAL_RCC_LPTIM1_RESET(); + } + else if(hlptim->Instance == LPTIM2) + { + __HAL_RCC_LPTIM2_RESET(); + } + else if(hlptim->Instance == LPTIM3) + { + __HAL_RCC_LPTIM3_RESET(); + } + else if(hlptim->Instance == LPTIM4) + { + __HAL_RCC_LPTIM4_RESET(); + } + else if(hlptim->Instance == LPTIM5) + { + __HAL_RCC_LPTIM5_RESET(); + } + else if(hlptim->Instance == LPTIM6) + { + __HAL_RCC_LPTIM6_RESET(); + } + + /* DeInit the low level hardware: CLOCK, NVIC.*/ + HAL_LPTIM_MspDeInit(hlptim); + + hlptim->RepetitionCounter = 0U; + hlptim->AutoReload = 1U; + hlptim->Compare = 0U; + + hlptim->CompareMatchCallback = NULL; + hlptim->AutoReloadMatchCallback = NULL; + hlptim->TriggerCallback = NULL; + hlptim->CompareWriteCallback = NULL; + hlptim->AutoReloadWriteCallback = NULL; + hlptim->DirectionUpCallback = NULL; + hlptim->DirectionDownCallback = NULL; + hlptim->RepetitionUpdateCallback = NULL; + hlptim->RepetitionWriteCallback = NULL; + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initialize the LPTIM MSP. +*@param : hlpuart: pointer to a LPTIM_HandleTypeDef structure that contains +* the configuration information for LPTIM module. +*@return: None +******************************************************************************/ +__weak void HAL_LPTIM_MspInit(LPTIM_HandleTypeDef *hlptim) +{ + UNUSED(hlptim); +} + +/****************************************************************************** +*@brief : DeInitialize the LPTIM MSP. +*@param : hlpuart: pointer to a LPTIM_HandleTypeDef structure that contains +* the configuration information for LPTIM module. +*@return: None +******************************************************************************/ +__weak void HAL_LPTIM_MspDeInit(LPTIM_HandleTypeDef *hlptim) +{ + UNUSED(hlptim); +} + +/****************************************************************************** +*@brief : Configure Count Value. +*@param : hlptim: LPTIM handle. +*@param : RepetitionCounter: Specifies the Repetition counter value. +* This parameter must be a value between 0x00 and 0xFF. +*@param : Period: Specifies the Autoreload value. +* This parameter must be a value between 0x0000 and 0xFFFF. +*@param : PulseOrTimeout: Specifies the compare value. +* This parameter must be a value between 0x0000 and 0xFFFF. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_ConfigCountValue(LPTIM_HandleTypeDef *hlptim, uint8_t RepetitionCounter, \ + uint16_t Period, uint16_t PulseOrTimeout) +{ + /* Check the LPTIM handle allocation */ + if ((hlptim == NULL) || (PulseOrTimeout >= Period)) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + assert_param(IS_LPTIM_REPETITION_COUNTER(RepetitionCounter)); + assert_param(IS_LPTIM_PERIOD(Period)); + assert_param(IS_LPTIM_PULSE(PulseOrTimeout)); + + hlptim->RepetitionCounter = RepetitionCounter; + hlptim->AutoReload = Period; + hlptim->Compare = PulseOrTimeout; + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Enable interrupt. +*@param : hlptim: LPTIM handle. +*@param : IT: interrupt. +* This parameter can be a combination of @ref LPTIM_IT. +* @arg LPTIM_IT_REPOK: Repetition counter write complete interrupt. +* @arg LPTIM_IT_REPUE: Repetition counter update event interrupt +* @arg LPTIM_IT_ARROK: Autoreload write complete interrupt +* @arg LPTIM_IT_ARRM: Autoreload match interrupt +* @arg LPTIM_IT_CMPOK: Compare write complete interrupt +* @arg LPTIM_IT_CMPM: Compare match interrupt +* @arg LPTIM_IT_EXTTRIG:External trigger interrupt +* @arg LPTIM_IT_DOWN: "switch to down direction" interrupt +* @arg LPTIM_IT_UP: "switch to up direction" interrupt +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_EnableIT(LPTIM_HandleTypeDef *hlptim, uint32_t IT) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + assert_param(IS_LPTIM_IT(IT)); + + __HAL_LPTIM_ENABLE_IT(hlptim, IT); + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Disable interrupt. +*@param : hlptim: LPTIM handle. +*@param : IT: interrupt. +* This parameter can be a combination of @ref LPTIM_IT. +* @arg LPTIM_IT_REPOK: Repetition counter write complete interrupt. +* @arg LPTIM_IT_REPUE: Repetition counter update event interrupt +* @arg LPTIM_IT_ARROK: Autoreload write complete interrupt +* @arg LPTIM_IT_ARRM: Autoreload match interrupt +* @arg LPTIM_IT_CMPOK: Compare write complete interrupt +* @arg LPTIM_IT_CMPM: Compare match interrupt +* @arg LPTIM_IT_EXTTRIG:External trigger interrupt +* @arg LPTIM_IT_DOWN: "switch to down direction" interrupt +* @arg LPTIM_IT_UP: "switch to up direction" interrupt +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_DisableIT(LPTIM_HandleTypeDef *hlptim, uint32_t IT) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + assert_param(IS_LPTIM_IT(IT)); + + __HAL_LPTIM_DISABLE_IT(hlptim, IT); + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Start the LPTIM PWM generation. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_PWM_Start(LPTIM_HandleTypeDef *hlptim) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + assert_param(IS_LPTIM_REPETITION_COUNTER(hlptim->RepetitionCounter)); + assert_param(IS_LPTIM_PERIOD(hlptim->AutoReload)); + assert_param(IS_LPTIM_PULSE(hlptim->Compare)); + + /* Disable LPTIM */ + if (HAL_LPTIM_Disable(hlptim) != HAL_OK) + return HAL_ERROR; + + /* Reset WAVE bit to set PWM mode */ + hlptim->Instance->CFGR1 &= ~LPTIM_CFGR1_WAVE; + + /* Enable the Peripheral */ + __HAL_LPTIM_ENABLE(hlptim); + + /* Start timer in continuous mode */ + __HAL_LPTIM_START_CONTINUOUS(hlptim); + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Stop the LPTIM PWM generation. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_PWM_Stop(LPTIM_HandleTypeDef *hlptim) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + + /* Disable LPTIM */ + if (HAL_LPTIM_Disable(hlptim) != HAL_OK) + return HAL_ERROR; + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Start the LPTIM One pulse generation. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_OnePulse_Start(LPTIM_HandleTypeDef *hlptim) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + assert_param(IS_LPTIM_REPETITION_COUNTER(hlptim->RepetitionCounter)); + assert_param(IS_LPTIM_PERIOD(hlptim->AutoReload)); + assert_param(IS_LPTIM_PULSE(hlptim->Compare)); + + /* Disable LPTIM */ + if (HAL_LPTIM_Disable(hlptim) != HAL_OK) + return HAL_ERROR; + + /* Reset WAVE bit to set one pulse mode */ + hlptim->Instance->CFGR1 &= ~LPTIM_CFGR1_WAVE; + + /* Enable the Peripheral */ + __HAL_LPTIM_ENABLE(hlptim); + + /* Start timer in single (one shot) mode */ + __HAL_LPTIM_START_SINGLE(hlptim); + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Stop the LPTIM One pulse generation. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_OnePulse_Stop(LPTIM_HandleTypeDef *hlptim) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + + /* Disable LPTIM */ + if (HAL_LPTIM_Disable(hlptim) != HAL_OK) + return HAL_ERROR; + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Start the LPTIM in Set once mode. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_SetOnce_Start(LPTIM_HandleTypeDef *hlptim) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + assert_param(IS_LPTIM_REPETITION_COUNTER(hlptim->RepetitionCounter)); + assert_param(IS_LPTIM_PERIOD(hlptim->AutoReload)); + assert_param(IS_LPTIM_PULSE(hlptim->Compare)); + + /* Disable LPTIM */ + if (HAL_LPTIM_Disable(hlptim) != HAL_OK) + return HAL_ERROR; + + /* Set WAVE bit to enable the set once mode */ + hlptim->Instance->CFGR1 |= LPTIM_CFGR1_WAVE; + + /* Enable the Peripheral */ + __HAL_LPTIM_ENABLE(hlptim); + + /* Start timer in single (one shot) mode */ + __HAL_LPTIM_START_SINGLE(hlptim); + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Stop the LPTIM Set once mode. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_SetOnce_Stop(LPTIM_HandleTypeDef *hlptim) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + + /* Disable LPTIM */ + if (HAL_LPTIM_Disable(hlptim) != HAL_OK) + return HAL_ERROR; + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Start the Encoder interface. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_Encoder_Start(LPTIM_HandleTypeDef *hlptim) +{ + uint32_t temp; + + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + assert_param(IS_LPTIM_PERIOD(hlptim->AutoReload)); + assert_param(hlptim->Init.ClockSource != LPTIM_CLOCKSOURCE_EXTERNAL_INPUT1); + assert_param(hlptim->Init.CounterSource == LPTIM_COUNTERSOURCE_EXTERNAL); + assert_param(IS_LPTIM_INPUT2_SOURCE(hlptim->Init.Input2Source)); + + /* Disable LPTIM */ + if (HAL_LPTIM_Disable(hlptim) != HAL_OK) + return HAL_ERROR; + + /* Get the LPTIMx CFGR2 value */ + temp = hlptim->Instance->CFGR2; + + /* Clear CKPOL bits */ + temp &= (uint32_t)(~LPTIM_CFGR2_IN2SEL_Msk); + + /* Set Input polarity */ + temp |= hlptim->Init.Input2Source; + + /* Write to LPTIMx CFGR */ + hlptim->Instance->CFGR2 = temp; + + /* Set ENC bit to enable the encoder interface */ + hlptim->Instance->CFGR1 |= LPTIM_CFGR1_ENC; + + /* Enable the Peripheral */ + __HAL_LPTIM_ENABLE(hlptim); + + /* Start timer in continuous mode */ + __HAL_LPTIM_START_CONTINUOUS(hlptim); + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Stop the Encoder interface. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_Encoder_Stop(LPTIM_HandleTypeDef *hlptim) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + + /* Disable LPTIM */ + if (HAL_LPTIM_Disable(hlptim) != HAL_OK) + return HAL_ERROR; + + /* Reset ENC bit to disable the encoder interface */ + hlptim->Instance->CFGR1 &= ~LPTIM_CFGR1_ENC; + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Start the Timeout function. +* @note The first trigger event will start the timer, any successive +* trigger event will reset the counter and the timer restarts. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_Timeout_Start(LPTIM_HandleTypeDef *hlptim) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + assert_param(IS_LPTIM_PERIOD(hlptim->AutoReload)); + assert_param(IS_LPTIM_PULSE(hlptim->Compare)); + + /* Disable LPTIM */ + if (HAL_LPTIM_Disable(hlptim) != HAL_OK) + return HAL_ERROR; + + /* Set TIMOUT bit to enable the timeout function */ + hlptim->Instance->CFGR1 |= LPTIM_CFGR1_TIMEOUT; + + /* Enable the Peripheral */ + __HAL_LPTIM_ENABLE(hlptim); + + /* Start timer in continuous mode */ + __HAL_LPTIM_START_CONTINUOUS(hlptim); + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Stop the Timeout function. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_Timeout_Stop(LPTIM_HandleTypeDef *hlptim) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + + /* Disable LPTIM */ + if (HAL_LPTIM_Disable(hlptim) != HAL_OK) + return HAL_ERROR; + + /* Reset TIMOUT bit to enable the timeout function */ + hlptim->Instance->CFGR1 &= ~LPTIM_CFGR1_TIMEOUT; + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Start the Counter mode. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_Counter_Start(LPTIM_HandleTypeDef *hlptim) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + assert_param(IS_LPTIM_PERIOD(hlptim->AutoReload)); + assert_param(IS_LPTIM_PULSE(hlptim->Compare)); + + /* Disable LPTIM */ + if (HAL_LPTIM_Disable(hlptim) != HAL_OK) + return HAL_ERROR; + + /* Enable the Peripheral */ + __HAL_LPTIM_ENABLE(hlptim); + + /* Start timer in continuous mode */ + __HAL_LPTIM_START_CONTINUOUS(hlptim); + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Stop the Counter mode. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_Counter_Stop(LPTIM_HandleTypeDef *hlptim) +{ + /* Check the LPTIM handle allocation */ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + + /* Disable LPTIM */ + if (HAL_LPTIM_Disable(hlptim) != HAL_OK) + return HAL_ERROR; + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +*@brief : Register a User LPTIM callback to be used instead of the weak predefined callback +*@param : hlptim: LPTIM handle. +*@param : CallbackID: ID of the callback to be registered +* This parameter can be a combination of @ref LPTIM_CallbackID. +* @arg @ref LPTIM_CALLBACKID_COMPARE_MATCH : Compare match Callback ID +* @arg @ref LPTIM_CALLBACKID_AUTORELOAD_MATCH : Auto-reload match Callback ID +* @arg @ref LPTIM_CALLBACKID_TRIGGER : External trigger event detection Callback ID +* @arg @ref LPTIM_CALLBACKID_COMPARE_WRITE : Compare register write complete Callback ID +* @arg @ref LPTIM_CALLBACKID_AUTORELOAD_WRITE : Auto-reload register write complete Callback ID +* @arg @ref LPTIM_CALLBACKID_DIRECTION_UP : Up-counting direction change Callback ID +* @arg @ref LPTIM_CALLBACKID_DIRECTION_DOWN : Down-counting direction change Callback ID +* @arg @ref LPTIM_CALLBACKID_REPETITION_UPDATE : Repetition counter update event Callback ID +* @arg @ref LPTIM_CALLBACKID_REPETITION_WRITE : Repetition counter write complete Callback ID +*@param : pCallback pointer to the callback function +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_RegisterCallback(LPTIM_HandleTypeDef *hlptim, + uint32_t CallbackID, + pLPTIM_CallbackTypeDef pCallback) +{ + if ((hlptim == NULL) || (pCallback == NULL)) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + + switch (CallbackID) + { + case LPTIM_CALLBACKID_COMPARE_MATCH : + + hlptim->CompareMatchCallback = pCallback; + break; + + case LPTIM_CALLBACKID_AUTORELOAD_MATCH : + + hlptim->AutoReloadMatchCallback = pCallback; + break; + + case LPTIM_CALLBACKID_TRIGGER : + + hlptim->TriggerCallback = pCallback; + break; + + case LPTIM_CALLBACKID_COMPARE_WRITE : + + hlptim->CompareWriteCallback = pCallback; + break; + + case LPTIM_CALLBACKID_AUTORELOAD_WRITE : + + hlptim->AutoReloadWriteCallback = pCallback; + break; + + case LPTIM_CALLBACKID_DIRECTION_UP : + + hlptim->DirectionUpCallback = pCallback; + break; + + case LPTIM_CALLBACKID_DIRECTION_DOWN : + + hlptim->DirectionDownCallback = pCallback; + break; + + case LPTIM_CALLBACKID_REPETITION_UPDATE : + + hlptim->RepetitionUpdateCallback = pCallback; + break; + + case LPTIM_CALLBACKID_REPETITION_WRITE : + + hlptim->RepetitionWriteCallback = pCallback; + break; + + default : + + return HAL_ERROR; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Unregister a LPTIM callback +*@param : hlptim: LPTIM handle. +*@param : CallbackID: ID of the callback to be registered +* This parameter can be a combination of @ref LPTIM_CallbackID. +* @arg @ref LPTIM_CALLBACKID_COMPARE_MATCH : Compare match Callback ID +* @arg @ref LPTIM_CALLBACKID_AUTORELOAD_MATCH : Auto-reload match Callback ID +* @arg @ref LPTIM_CALLBACKID_TRIGGER : External trigger event detection Callback ID +* @arg @ref LPTIM_CALLBACKID_COMPARE_WRITE : Compare register write complete Callback ID +* @arg @ref LPTIM_CALLBACKID_AUTORELOAD_WRITE : Auto-reload register write complete Callback ID +* @arg @ref LPTIM_CALLBACKID_DIRECTION_UP : Up-counting direction change Callback ID +* @arg @ref LPTIM_CALLBACKID_DIRECTION_DOWN : Down-counting direction change Callback ID +* @arg @ref LPTIM_CALLBACKID_REPETITION_UPDATE : Repetition counter update event Callback ID +* @arg @ref LPTIM_CALLBACKID_REPETITION_WRITE : Repetition counter write complete Callback ID +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPTIM_UnRegisterCallback(LPTIM_HandleTypeDef *hlptim, + uint32_t CallbackID) +{ + if (hlptim == NULL) + return HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_LPTIM_INSTANCE(hlptim->Instance)); + + switch (CallbackID) + { + case LPTIM_CALLBACKID_COMPARE_MATCH : + + hlptim->CompareMatchCallback = NULL; + break; + + case LPTIM_CALLBACKID_AUTORELOAD_MATCH : + + hlptim->AutoReloadMatchCallback = NULL; + break; + + case LPTIM_CALLBACKID_TRIGGER : + + hlptim->TriggerCallback = NULL; + break; + + case LPTIM_CALLBACKID_COMPARE_WRITE : + + hlptim->CompareWriteCallback = NULL; + break; + + case LPTIM_CALLBACKID_AUTORELOAD_WRITE : + + hlptim->AutoReloadWriteCallback = NULL; + break; + + case LPTIM_CALLBACKID_DIRECTION_UP : + + hlptim->DirectionUpCallback = NULL; + break; + + case LPTIM_CALLBACKID_DIRECTION_DOWN : + + hlptim->DirectionDownCallback = NULL; + break; + + case LPTIM_CALLBACKID_REPETITION_UPDATE : + + hlptim->RepetitionUpdateCallback = NULL; + break; + + case LPTIM_CALLBACKID_REPETITION_WRITE : + + hlptim->RepetitionWriteCallback = NULL; + break; + + default : + + return HAL_ERROR; + } + return HAL_OK; +} + +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup LPTIM_Private_Functions LPTIM Private Functions + * @{ + */ + +/****************************************************************************** +*@brief : LPTimer Wait for flag set +*@param : hlptim: LPTIM handle. +*@param : flag: The lptim flag. +*@return: HAL status +******************************************************************************/ +static HAL_StatusTypeDef LPTIM_WaitForFlag(LPTIM_HandleTypeDef *hlptim, uint32_t flag) +{ + uint32_t count = 120000000U; + + while (count--) + { + if (__HAL_LPTIM_GET_FLAG(hlptim, flag)) + return HAL_OK; + } + + return HAL_TIMEOUT; +} + +/****************************************************************************** +*@brief : Disable LPTIM HW instance. +*@param : hlptim: LPTIM handle. +*@return: HAL status +******************************************************************************/ +static HAL_StatusTypeDef HAL_LPTIM_Disable(LPTIM_HandleTypeDef *hlptim) +{ + uint32_t tmpclksource = 0; + uint32_t tmpIER; + uint32_t tmpCFGR1; + uint32_t tmpCFGR2; + +// __disable_irq(); + + /* Save LPTIM source clock */ + { + if (hlptim->Instance == LPTIM1) + { + if (HAL_RCC_GetLPTIM1ClockSource(&tmpclksource) != HAL_OK) + return HAL_ERROR; + } + else if(hlptim->Instance == LPTIM2) + { + if (HAL_RCC_GetLPTIM2ClockSource(&tmpclksource) != HAL_OK) + return HAL_ERROR; + } + else if(hlptim->Instance == LPTIM6) + { + if (HAL_RCC_GetLPTIM6ClockSource(&tmpclksource) != HAL_OK) + return HAL_ERROR; + } + else if(hlptim->Instance == LPTIM3) + { + if (HAL_RCC_GetLPTIM3ClockSource(&tmpclksource) != HAL_OK) + return HAL_ERROR; + } + else if(hlptim->Instance == LPTIM4) + { + if (HAL_RCC_GetLPTIM4ClockSource(&tmpclksource) != HAL_OK) + return HAL_ERROR; + } + else if(hlptim->Instance == LPTIM5) + { + if (HAL_RCC_GetLPTIM5ClockSource(&tmpclksource) != HAL_OK) + return HAL_ERROR; + } + else + { + return HAL_ERROR; + } + } + + + /* Save LPTIM configuration registers */ + tmpIER = hlptim->Instance->IER; + tmpCFGR1 = hlptim->Instance->CFGR1; + tmpCFGR2 = hlptim->Instance->CFGR2; + + /*********** Reset LPTIM ***********/ + /* LPTIM Reset */ + { + if (hlptim->Instance == LPTIM1) + { + __HAL_RCC_LPTIM1_RESET(); + } + else if(hlptim->Instance == LPTIM2) + { + __HAL_RCC_LPTIM2_RESET(); + } + else if(hlptim->Instance == LPTIM3) + { + __HAL_RCC_LPTIM3_RESET(); + } + else if(hlptim->Instance == LPTIM4) + { + __HAL_RCC_LPTIM4_RESET(); + } + else if(hlptim->Instance == LPTIM5) + { + __HAL_RCC_LPTIM5_RESET(); + } + else if(hlptim->Instance == LPTIM6) + { + __HAL_RCC_LPTIM6_RESET(); + } + } + /*********** Restore LPTIM Config ***********/ + + if ((hlptim->RepetitionCounter != 0UL) || (hlptim->AutoReload != 1UL) || (hlptim->Compare != 0U)) + { + /* Force LPTIM source kernel clock from PCLK */ + if (hlptim->Instance == LPTIM1) + { + HAL_RCC_LPTIM1ClockSourceConfig(LPTIM_CLOCKSOURCE_INTERNAL_PCLK); + } + else if(hlptim->Instance == LPTIM2) + { + HAL_RCC_LPTIM2ClockSourceConfig(LPTIM_CLOCKSOURCE_INTERNAL_PCLK); + } + else if(hlptim->Instance == LPTIM3) + { + HAL_RCC_LPTIM3ClockSourceConfig(LPTIM_CLOCKSOURCE_INTERNAL_PCLK); + } + else if(hlptim->Instance == LPTIM4) + { + HAL_RCC_LPTIM4ClockSourceConfig(LPTIM_CLOCKSOURCE_INTERNAL_PCLK); + } + else if(hlptim->Instance == LPTIM5) + { + HAL_RCC_LPTIM5ClockSourceConfig(LPTIM_CLOCKSOURCE_INTERNAL_PCLK); + } + else if(hlptim->Instance == LPTIM6) + { + HAL_RCC_LPTIM6ClockSourceConfig(LPTIM_CLOCKSOURCE_INTERNAL_PCLK); + } + + + hlptim->Instance->CR |= LPTIM_CR_ENABLE; + + if (hlptim->RepetitionCounter != 0UL) + { + hlptim->Instance->RCR = hlptim->RepetitionCounter; + + if (LPTIM_WaitForFlag(hlptim, LPTIM_FLAG_REPOK) != HAL_OK) + return HAL_TIMEOUT; + + __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_REPOK); + } + + if (hlptim->AutoReload != 0UL) + { + hlptim->Instance->ARR = hlptim->AutoReload; + + if (LPTIM_WaitForFlag(hlptim, LPTIM_FLAG_ARROK) != HAL_OK) + return HAL_TIMEOUT; + + __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_ARROK); + } + + if (hlptim->Compare != 0UL) + { + hlptim->Instance->CMP = hlptim->Compare; + + if (LPTIM_WaitForFlag(hlptim, LPTIM_FLAG_CMPOK) != HAL_OK) + return HAL_TIMEOUT; + + __HAL_LPTIM_CLEAR_FLAG(hlptim, LPTIM_FLAG_CMPOK); + } + + hlptim->Instance->CR &= ~(LPTIM_CR_ENABLE); + + /* Restore LPTIM source kernel clock */ + if (hlptim->Instance == LPTIM1) + { + HAL_RCC_LPTIM1ClockSourceConfig(tmpclksource); + } + else if(hlptim->Instance == LPTIM2) + { + HAL_RCC_LPTIM2ClockSourceConfig(tmpclksource); + } + else if(hlptim->Instance == LPTIM3) + { + HAL_RCC_LPTIM5ClockSourceConfig(tmpclksource); + } + else if(hlptim->Instance == LPTIM4) + { + HAL_RCC_LPTIM4ClockSourceConfig(tmpclksource); + } + else if(hlptim->Instance == LPTIM5) + { + HAL_RCC_LPTIM5ClockSourceConfig(tmpclksource); + } + else if(hlptim->Instance == LPTIM6) + { + HAL_RCC_LPTIM6ClockSourceConfig(tmpclksource); + } + } + + /* Restore configuration registers (LPTIM should be disabled first) */ + hlptim->Instance->CFGR2 = tmpCFGR2; + hlptim->Instance->CFGR1 = tmpCFGR1; + hlptim->Instance->IER = tmpIER; + +// __enable_irq(); + + return HAL_OK; +} + +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +/************************ (C) COPYRIGHT AISINOCHIP *****END OF FILE****/ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_lpuart.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_lpuart.c new file mode 100644 index 0000000000..dffd33aeff --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_lpuart.c @@ -0,0 +1,1402 @@ + +/****************************************************************************** +*@file : hal_lpuart.c +*@brief : LPUART HAL module driver. +******************************************************************************/ + +#include "hal.h" + +#ifdef HAL_LPUART_MODULE_ENABLED + +static void HAL_LPUART_InitParamter(LPUART_HandleTypeDef *hlpuart); + +/****************************************************************************** +*@brief : This function handles LPUART interrupt request. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None +******************************************************************************/ +void HAL_LPUART_IRQHander(LPUART_HandleTypeDef *hlpuart) +{ + uint32_t Flag; + uint32_t ITSource; + uint32_t RxError; + uint32_t Wakeup; + + /* Check for errors */ + Flag = __HAL_LPUART_GET_FLAG(hlpuart, LPUART_FLAG_RXOVIF | LPUART_FLAG_FEIF | \ + LPUART_FLAG_PEIF | LPUART_FLAG_RXIF | \ + LPUART_FLAG_TCIF | LPUART_FLAG_TXEIF | \ + LPUART_FLAG_STARTIF | LPUART_FLAG_MATCHIF | \ + LPUART_FLAG_IDLEIF | LPUART_FLAG_BCNTIF); + + ITSource = __HAL_LPUART_GET_IT_SOURCE(hlpuart, LPUART_IT_RXOV | LPUART_IT_FE | \ + LPUART_IT_PE | LPUART_IT_RX | \ + LPUART_IT_TC | LPUART_IT_TXE | \ + LPUART_IT_START | LPUART_IT_MATCH |\ + LPUART_IT_IDLE | LPUART_IT_BCNT); + + if ((Flag & (LPUART_FLAG_RXOVIF | LPUART_FLAG_FEIF | LPUART_FLAG_PEIF)) == 0U) + { + /* No error occurred */ + + /* Receive completion interrupt */ + if ((Flag & LPUART_FLAG_RXIF) && (ITSource & LPUART_IT_RX)) + { + /* Clear the receive completion interrupt flag */ + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_RXIF); + + /* Receive completion (RXIF) callback function */ + HAL_LPUART_RxCompleteCallback(hlpuart); + } + } + else + { + hlpuart->RxError = 0; + + /* some errors occurred */ + + /* Over-Run interrupt occurred */ + if ((Flag & LPUART_FLAG_RXOVIF) && (ITSource & LPUART_IT_RXOV)) + { + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_RXOVIF); + hlpuart->RxError |= LPUART_FLAG_RXOVIF; + } + + /* frame error interrupt occurred */ + if ((Flag & LPUART_FLAG_FEIF) && (ITSource & LPUART_IT_FE)) + { + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_FEIF); + hlpuart->RxError |= LPUART_FLAG_FEIF; + } + + /* parity error interrupt occurred */ + if ((Flag & LPUART_FLAG_PEIF) && (ITSource & LPUART_IT_PE)) + { + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_PEIF); + hlpuart->RxError |= LPUART_FLAG_PEIF; + } + + if (Flag & (LPUART_FLAG_FEIF | LPUART_FLAG_PEIF)) + { + /* receive completion interrupt */ + if (ITSource & LPUART_IT_RX) + { + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_RXIF); + + /* receive complete (RXIF) callback function */ + HAL_LPUART_RxCompleteCallback(hlpuart); + } + } + else + { + /* Receive completion (RXIF) interrupt */ + if ((Flag & LPUART_FLAG_RXIF) && (ITSource & LPUART_IT_RX)) + { + /* Clear the receive completion interrupt flag */ + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_RXIF); + + /* Receive completion (RXIF) callback function */ + HAL_LPUART_RxCompleteCallback(hlpuart); + } + } + + if (hlpuart->RxError) + { + /* Error callback function */ + if (hlpuart->RxErrorCallback) + { + hlpuart->RxErrorCallback(hlpuart); + } + } + } + + /* transmit buffer empty interrupt */ + if ((Flag & LPUART_FLAG_TXEIF) && (ITSource & LPUART_IT_TXE)) + { + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_TXEIF); + + /* transmit empty (TXEIF) callback function */ + HAL_LPUART_TxEmptyCallback(hlpuart); + } + + /* transmit complete interrupt */ + if ((Flag & LPUART_FLAG_TCIF) && (ITSource & LPUART_IT_TC)) + { + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_TCIF); + + /* transmit complete (TCIF) callback function */ + HAL_LPUART_TxCompleteCallback(hlpuart); + } + + /* Bit counting interrupt */ + if ((Flag & LPUART_FLAG_BCNTIF) && (ITSource & LPUART_IT_BCNT)) + { + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_BCNTIF); + + /* Bit counting callback function */ + HAL_LPUART_BcntCallback(hlpuart); + } + + /* Idle interrupt */ + if ((Flag & LPUART_FLAG_IDLEIF) && (ITSource & LPUART_IT_IDLE)) + { + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_IDLEIF); + + /* Idle callback function */ + HAL_LPUART_IdleCallback(hlpuart); + } + + /* wakeup from Stop mode interrupt occurred */ + Wakeup = 0U; + if ((Flag & LPUART_FLAG_STARTIF) && (ITSource & LPUART_IT_START)) + { + /* Start bit wakeup */ + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_STARTIF); + Wakeup = 1U; + } + + if ((Flag & LPUART_FLAG_MATCHIF) && (ITSource & LPUART_IT_MATCH)) + { + /* address matching wakeup */ + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_MATCHIF); + Wakeup = 1U; + } + + /* wakeup callback function */ + if (Wakeup) + { + HAL_LPUART_WakeupCallback(hlpuart); + } +} + +/****************************************************************************** +*@brief : Initialize the LPUART according to the specified. +* parameters in the LPUART_InitTypeDef and create the associated handle. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_Init(LPUART_HandleTypeDef *hlpuart) +{ + /* Check the parameters */ + assert_param(IS_LPUART_HANDLE(hlpuart)); + assert_param(IS_LPUART_INSTANCE(hlpuart->Instance)); + assert_param(IS_LPUART_WORDLENGTH(hlpuart->Init.WordLength)); + assert_param(IS_LPUART_STOPBITS(hlpuart->Init.StopBits)); + assert_param(IS_LPUART_PARITY(hlpuart->Init.Parity)); + assert_param(IS_LPUART_MODE(hlpuart->Init.Mode)); + assert_param(IS_LPUART_WAKEUPMODE(hlpuart->Init.WakeupMode)); + assert_param(IS_LPUART_CLOCKSOURCE(hlpuart->Init.ClockSource)); + + /* Init the low level hardware : GPIO, CLOCK */ + HAL_LPUART_MspInit(hlpuart); + + /* Init the internal parameter */ + HAL_LPUART_InitParamter(hlpuart); + + /* set the clock source */ + if (HAL_RCC_LPUART1ClockSourceConfig(hlpuart->Init.ClockSource) != HAL_OK) + return HAL_ERROR; + + /* Set baud rate */ + HAL_LPUART_SetBaudRate(hlpuart, hlpuart->Init.BaudRate); + + /* Set the communication parameters */ + hlpuart->Instance->LCR = hlpuart->Init.WordLength | \ + hlpuart->Init.StopBits | \ + hlpuart->Init.Parity | \ + hlpuart->Init.WakeupMode; + + /* Set the address matching for wakeup */ + if ((hlpuart->Init.WakeupMode == LPUART_WAKEUPMODE_ADDRNOCHECK) || \ + (hlpuart->Init.WakeupMode == LPUART_WAKEUPMODE_ADDRCHECK)) + { + /* Check the parameters */ + assert_param(IS_LPUART_WAKEUPADDR(hlpuart->Init.WakeupAddr)); + + hlpuart->Instance->ADDR = hlpuart->Init.WakeupAddr; + } + + /* enable tx rx */ + hlpuart->Instance->CR = hlpuart->Init.Mode; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : DeInitialize the LPUART peripheral. +* Before Deinitialization, the sending or receiving process needs to be aborted. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_DeInit(LPUART_HandleTypeDef *hlpuart) +{ + /* Check the parameters */ + assert_param(IS_LPUART_HANDLE(hlpuart)); + assert_param(IS_LPUART_INSTANCE(hlpuart->Instance)); + + /* Disable tx */ + __HAL_LPUART_DISABLE_TX(hlpuart); + + /* Disable rx */ + __HAL_LPUART_DISABLE_RX(hlpuart); + + /* DeInit the low level hardware */ + HAL_LPUART_MspDeInit(hlpuart); + + /* Init the internal parameter */ + HAL_LPUART_InitParamter(hlpuart); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initialize the LPUART MSP. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None +******************************************************************************/ +__weak void HAL_LPUART_MspInit(LPUART_HandleTypeDef *hlpuart) +{ + UNUSED(hlpuart); +} + +/****************************************************************************** +*@brief : DeInitialize the LPUART MSP. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None +******************************************************************************/ +__weak void HAL_LPUART_MspDeInit(LPUART_HandleTypeDef *hlpuart) +{ + UNUSED(hlpuart); +} + +/****************************************************************************** +*@brief : set baud rate. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@param : baudRate: This member configures the UART communication baud rate +* The integer value of LPUART clock frequency divided by +* baud rate is 2-254. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_SetBaudRate(LPUART_HandleTypeDef *hlpuart, uint32_t baudRate) +{ + uint32_t temp; + float tempFloat; + uint32_t bits; + uint32_t ClockNum; + uint32_t iBaudRate; +#if 1 + const uint16_t fBaudRate[4][13] = + { +// 0 1 2 3 4 5 6 7 8 9 10 11 12 + {0x0000, 0x0010, 0x0044, 0x0092, 0x00AA, 0x0155, 0x01B6, 0x01DD, 0x01EF, 0x01FF, 0x0000, 0x0000, 0x0000},//start+7bit+end + {0x0000, 0x0020, 0x0084, 0x0124, 0x014A, 0x02AA, 0x02B5, 0x036D, 0x03DE, 0x03DF, 0x03FF, 0x0000, 0x0000}, + {0x0000, 0x0020, 0x0088, 0x0124, 0x0252, 0x02AA, 0x0355, 0x0575, 0x0776, 0x0777, 0x07DF, 0x07FF, 0x0000}, + {0x0000, 0x0040, 0x0108, 0x0248, 0x02A4, 0x0554, 0x0AAA, 0x0AEA, 0x0DB6, 0x0EEE, 0x0F7B, 0x0FDF, 0x0FFF},//start+8bit+pol+2end + }; +#else + const uint16_t fBaudRate[4][12] = + { +// 0 1 2 3 4 5 6 7 8 9 10 11 12 + {0x0000, 0x0010, 0x0044, 0x0092, 0x00AA, 0x0155, 0x01B6, 0x01DD, 0x01EF, 0x0000, 0x0000, 0x0000},//start+7bit+end + {0x0000, 0x0020, 0x0084, 0x0124, 0x014A, 0x02AA, 0x02B5, 0x036D, 0x03DE, 0x03DF, 0x0000, 0x0000}, + {0x0000, 0x0020, 0x0088, 0x0124, 0x0252, 0x02AA, 0x0355, 0x0575, 0x0776, 0x0777, 0x07DF, 0x0000}, + {0x0000, 0x0040, 0x0108, 0x0248, 0x02A4, 0x0554, 0x0AAA, 0x0AEA, 0x0DB6, 0x0EEE, 0x0F7B, 0x0FDF},//start+8bit+pol+2end + }; +#endif + + /* Check the parameters */ + assert_param(IS_LPUART_HANDLE(hlpuart)); + assert_param(IS_LPUART_INSTANCE(hlpuart->Instance)); + + /* Calculate the baud rate division factor */ + tempFloat = (float)HAL_RCC_GetLPUART1ClockFreq();//(float)HAL_RCC_GetLPUART1CLKFreq(); + + tempFloat = tempFloat / hlpuart->Init.BaudRate; + iBaudRate = (uint32_t)tempFloat; + tempFloat = tempFloat - iBaudRate; + iBaudRate--; + assert_param(IS_LPUART_BAUDRATE(iBaudRate)); + + bits = 10; + if (hlpuart->Init.WordLength != LPUART_WORDLENGTH_8B) + bits--; + if (hlpuart->Init.Parity != LPUART_PARITY_NONE) + bits++; + if (hlpuart->Init.StopBits != LPUART_STOPBITS_1B) + bits++; + + tempFloat = tempFloat * bits; + ClockNum = (uint32_t)tempFloat; + tempFloat = tempFloat - ClockNum; + if (tempFloat >= 0.5) + ClockNum++; + + hlpuart->Instance->IBAUD = iBaudRate + ((iBaudRate >> 1) << LPUART_IBAUD_RXSAM_Pos); + hlpuart->Instance->FBAUD = fBaudRate[bits - 9][ClockNum]; + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Register a User LPUART Callback. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@param : id: ID of the callback to be registered +* This parameter can be a combination of @ref LPUART_CallbackID. +* @arg LPUART_CALLBACKID_TXCPLT : transfer completion callback function. +* @arg LPUART_CALLBACKID_TXHALFCPLT : transfer half completion callback function. +* @arg LPUART_CALLBACKID_TXERROR : transfer error callback function. +* @arg LPUART_CALLBACKID_RXCPLT : receive completion callback function. +* @arg LPUART_CALLBACKID_RXHALFCPLT : receive half completion callback function. +* @arg LPUART_CALLBACKID_RXERROR : receive error callback function. +* @arg LPUART_CALLBACKID_WAKEUP : wakeup callback function. +* @arg LPUART_CALLBACKID_BCNT : bit count callback function. +* @arg LPUART_CALLBACKID_IDLE : idle callback function. +*@param : pCallback: pointer to the Callback function. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_RegisterCallback(LPUART_HandleTypeDef *hlpuart, uint32_t id, pLPUART_CallbackTypeDef pCallback) +{ + /* Check the parameters */ + assert_param(IS_LPUART_HANDLE(hlpuart)); + assert_param(IS_LPUART_INSTANCE(hlpuart->Instance)); + assert_param(IS_LPUART_CALLBACKID(id)); + + switch (id) + { + case LPUART_CALLBACKID_TXCPLT: + + hlpuart->TxCpltCallback = pCallback; + break; + + case LPUART_CALLBACKID_TXHALFCPLT: + + hlpuart->TxHalfCpltCallback = pCallback; + break; + + case LPUART_CALLBACKID_TXERROR: + + hlpuart->TxErrorCallback = pCallback; + break; + + case LPUART_CALLBACKID_RXCPLT: + + hlpuart->RxCpltCallback = pCallback; + break; + + case LPUART_CALLBACKID_RXHALFCPLT: + + hlpuart->RxHalfCpltCallback = pCallback; + break; + + case LPUART_CALLBACKID_RXERROR: + + hlpuart->RxErrorCallback = pCallback; + break; + + case LPUART_CALLBACKID_WAKEUP: + + hlpuart->WakeupCallback = pCallback; + break; + case LPUART_CALLBACKID_BCNT: + + hlpuart->BcntCallback = pCallback; + break; + case LPUART_CALLBACKID_IDLE: + + hlpuart->IdleCallback = pCallback; + break; + + default: + return HAL_ERROR; + } + return HAL_OK; +} + + +/****************************************************************************** +*@brief : Unregister a User LPUART Callback. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@param : id: ID of the callback to be registered +* This parameter can be a combination of @ref LPUART_CallbackID. +* @arg LPUART_CALLBACKID_TXCPLT : transfer completion callback function. +* @arg LPUART_CALLBACKID_TXHALFCPLT : transfer half completion callback function. +* @arg LPUART_CALLBACKID_TXERROR : transfer error callback function. +* @arg LPUART_CALLBACKID_RXCPLT : receive completion callback function. +* @arg LPUART_CALLBACKID_RXHALFCPLT : receive half completion callback function. +* @arg LPUART_CALLBACKID_RXERROR : receive error callback function. +* @arg LPUART_CALLBACKID_WAKEUP : wakeup callback function. +* @arg LPUART_CALLBACKID_BCNT : bit count callback function. +* @arg LPUART_CALLBACKID_IDLE : idle callback function. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_UnRegisterCallback(LPUART_HandleTypeDef *hlpuart, uint32_t id) +{ + /* Check the parameters */ + assert_param(IS_LPUART_HANDLE(hlpuart)); + assert_param(IS_LPUART_INSTANCE(hlpuart->Instance)); + assert_param(IS_LPUART_CALLBACKID(id)); + + switch (id) + { + case LPUART_CALLBACKID_TXCPLT: + + hlpuart->TxCpltCallback = NULL; + break; + + case LPUART_CALLBACKID_TXHALFCPLT: + + hlpuart->TxHalfCpltCallback = NULL; + break; + + case LPUART_CALLBACKID_TXERROR: + + hlpuart->TxErrorCallback = NULL; + break; + + case LPUART_CALLBACKID_RXCPLT: + + hlpuart->RxCpltCallback = NULL; + break; + + case LPUART_CALLBACKID_RXHALFCPLT: + + hlpuart->RxHalfCpltCallback = NULL; + break; + + case LPUART_CALLBACKID_RXERROR: + + hlpuart->RxErrorCallback = NULL; + break; + + case LPUART_CALLBACKID_WAKEUP: + + hlpuart->WakeupCallback = NULL; + break; + case LPUART_CALLBACKID_BCNT: + + hlpuart->BcntCallback = NULL; + break; + case LPUART_CALLBACKID_IDLE: + + hlpuart->IdleCallback = NULL; + break; + default: + return HAL_ERROR; + } + return HAL_OK; +} + +/****************************************************************************** +*@brief : Send an amount of data in blocking mode. +*@note In blocking mode, the user cannot enable interrupt. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be sent. +*@param : timeout: Timeout duration. +* The minimum value of this parameter is 1. +* If the value of this parameter is 0xFFFFFFFF, it will be sent until all data are sent. +* @node The timeout should be greater than the time of all data transfers. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_Transmit(LPUART_HandleTypeDef *hlpuart, uint8_t *pdata, uint32_t size, uint32_t timeout) +{ + uint32_t startTick; + + /* Check the parameters */ + assert_param(IS_LPUART_HANDLE(hlpuart)); + assert_param(IS_LPUART_INSTANCE(hlpuart->Instance)); + assert_param(pdata != NULL); + assert_param(size != 0U); + assert_param(timeout != 0U); + + /* If LPUART is sending, an error is returned */ + if (hlpuart->TxState != LPUART_STATE_READY) + return HAL_ERROR; + + /* Blocking transmission can be aborted. Clear the abort flag bit */ + hlpuart->TxAbort = DISABLE; + + /* tx state: busy */ + hlpuart->TxState = LPUART_STATE_BUSY; + + hlpuart->pTxBuf = pdata; + hlpuart->TxCount = size; + + startTick = HAL_GetTick(); + while (1) + { + if (hlpuart->TxCount) + { + /* Whether tx buffer is empty */ + if (__HAL_LPUART_GET_FLAG(hlpuart, LPUART_FLAG_TXE)) + { + /* send byte */ + hlpuart->Instance->TXDR = *pdata++; + hlpuart->TxCount--; + } + } + else + { + /* Whether sending has ended */ + if (__HAL_LPUART_GET_FLAG(hlpuart, LPUART_FLAG_TCIF)) + { + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_TCIF); + + hlpuart->TxState = LPUART_STATE_READY; + return HAL_OK; + } + } + + /* Whether sending is aborted */ + if (hlpuart->TxAbort != DISABLE) + { + if (hlpuart->Instance->CR & LPUART_CR_TX_EN) + { + __HAL_LPUART_DISABLE_TX(hlpuart); + __HAL_LPUART_ENABLE_TX(hlpuart); + } + hlpuart->TxState = LPUART_STATE_READY; + return (HAL_ERROR); + } + + /* Whether the sending time has expired */ + if (timeout != 0xFFFFFFFF) + { + if ((HAL_GetTick() - startTick) >= timeout) + { + if (hlpuart->Instance->CR & LPUART_CR_TX_EN) + { + __HAL_LPUART_DISABLE_TX(hlpuart); + __HAL_LPUART_ENABLE_TX(hlpuart); + } + hlpuart->TxState = LPUART_STATE_READY; + return (HAL_TIMEOUT); + } + } + } +} + +/****************************************************************************** +*@brief : Receive an amount of data in blocking mode. +*@note In blocking mode, the user cannot enable interrupt. +*@note Users can add or ignore error handling in RxErrorCallback(). +* Error codes are stored in hlpuart->RxError. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be received. +*@param : timeout: Timeout duration. +* If the value of this parameter is 0, the received data will be detected only once and will not wait. +* If the value of this parameter is 0xFFFFFFFF, it will be received until all data are received. +* @node The timeout should be greater than the time of all data transfers. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_Receive(LPUART_HandleTypeDef *hlpuart, uint8_t *pdata, uint32_t size, uint32_t timeout) +{ + uint32_t startTick; + + /* Check the parameters */ + assert_param(IS_LPUART_HANDLE(hlpuart)); + assert_param(IS_LPUART_INSTANCE(hlpuart->Instance)); + assert_param(pdata != NULL); + assert_param(size != 0U); + + /* If LPUART is receiving, an error is returned */ + if (hlpuart->RxState != LPUART_STATE_READY) + return HAL_ERROR; + + /* Blocking reception can be aborted. Clear the abort flag bit */ + hlpuart->RxAbort = DISABLE; + + /* rx state: busy */ + hlpuart->RxState = LPUART_STATE_BUSY; + + hlpuart->pRxBuf = pdata; + hlpuart->RxCount = size; + + startTick = HAL_GetTick(); + while (1) + { + /* Whether there are errors */ + hlpuart->RxError = __HAL_LPUART_GET_FLAG(hlpuart, LPUART_FLAG_RXOVIF | LPUART_FLAG_FEIF | LPUART_FLAG_PEIF); + if (hlpuart->RxError) + { + __HAL_LPUART_CLEAR_FLAG(hlpuart, hlpuart->RxError & (LPUART_FLAG_RXOVIF | LPUART_FLAG_FEIF | LPUART_FLAG_PEIF)); + if (hlpuart->RxErrorCallback) + { + hlpuart->RxErrorCallback(hlpuart); + } + } + + /* Whether reception is completed */ + if (__HAL_LPUART_GET_FLAG(hlpuart, LPUART_FLAG_RXF)) + { + /* receive data */ + *pdata++ = hlpuart->Instance->RXDR; + hlpuart->RxCount--; + + /* receive complete */ + if (hlpuart->RxCount == 0) + { + hlpuart->RxState = LPUART_STATE_READY; + return HAL_OK; + } + } + + /* Whether reception is aborted */ + if (hlpuart->RxAbort != DISABLE) + { + hlpuart->RxState = LPUART_STATE_READY; + return (HAL_ERROR); + } + + if (timeout != 0xFFFFFFFF) + { + /* Whether the receiving time has expired */ + if ((HAL_GetTick() - startTick) >= timeout) + { + hlpuart->TxState = LPUART_STATE_READY; + return (HAL_TIMEOUT); + } + } + } +} +/****************************************************************************** +*@brief : Receive an amount of data to Idle line or BCNT time. +* +*@param : hlpuart: lpuart handle with LPUART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to receive. +*@param : rece_mode: by idle line, or by bit value count reached +*@param : timeout: BCNT value(relative to LPUART baudrate), when LPUART BaudRate = 115200, + then set timeout = 115200,it is approximately 1 second. MAX BCNT value can be 0xFFFF. +* Only used when 'rece_mode' = LPUART_RECEIVE_TOBCNT +* when 'rece_mode' = LPUART_RECEIVE_TOIDLE, it is meaningless. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_Receive_To_IDLEorBCNT(LPUART_HandleTypeDef *hlpuart, uint8_t *buf, uint32_t size, + LPUART_Receive_Mode_Enum rece_mode, uint32_t timeout) +{ + + assert_param (IS_LPUART_INSTANCE(hlpuart->Instance)); + + if ((buf == NULL) || (size == 0U)) + { + return HAL_ERROR; + } + + hlpuart->RxCount = 0; + hlpuart->pRxBuf = buf; + + if(rece_mode == LPUART_RECEIVE_TOBCNT) + { + MODIFY_REG(hlpuart->Instance->LCR, LPUART_LCR_BCNT_VALUE, timeout<Instance->LCR, LPUART_LCR_AUTO_START_EN); + + } + + while (size--) + { + while(!(hlpuart->Instance->SR & LPUART_SR_RXF)) + { + if(rece_mode == RECEIVE_TOBCNT) + { + if(READ_BIT(hlpuart->Instance->SR, LPUART_SR_BCNTIF)) + { + CLEAR_BIT(hlpuart->Instance->LCR, LPUART_LCR_AUTO_START_EN); + CLEAR_STATUS(hlpuart->Instance->SR, LPUART_SR_BCNTIF); + return HAL_TIMEOUT; + } + } + else + { + if(READ_BIT(hlpuart->Instance->SR, LPUART_SR_IDLEIF)) + { + CLEAR_STATUS(hlpuart->Instance->SR, LPUART_SR_IDLEIF); + while(READ_BIT(hlpuart->Instance->SR, LPUART_SR_IDLEIF)) + { + CLEAR_STATUS(hlpuart->Instance->SR, 0); + CLEAR_STATUS(hlpuart->Instance->SR, LPUART_SR_IDLEIF); + } + return HAL_TIMEOUT; + } + } + } + + + hlpuart->pRxBuf[hlpuart->RxCount++] = (uint8_t)hlpuart->Instance->RXDR; + + } + + CLEAR_BIT(hlpuart->Instance->LCR, LPUART_LCR_AUTO_START_EN); + + return HAL_OK; +} +/****************************************************************************** +*@brief : Send an amount of data in interrupt mode. +*@note In interrupt mode, sending related interrupts (TXE/TC) is forced to enable. +*@note Users can add or ignore error handling in ErrorCallback(). +*@note The user can add the processing of sending completion in TxCpltCallback(). +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be received. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_Transmit_IT(LPUART_HandleTypeDef *hlpuart, uint8_t *pdata, uint32_t size) +{ + /* Check the parameters */ + assert_param(IS_LPUART_HANDLE(hlpuart)); + assert_param(IS_LPUART_INSTANCE(hlpuart->Instance)); + assert_param(pdata != NULL); + assert_param(size != 0U); + + /* If LPUART is sending, an error is returned */ + if (hlpuart->TxState != LPUART_STATE_READY) + return HAL_ERROR; + + /* tx state: busy */ + hlpuart->TxState = LPUART_STATE_BUSY_IT; + + hlpuart->pTxBuf = pdata; + hlpuart->TxCount = size; + + /* enable interrupt (TC) */ + __HAL_LPUART_ENABLE_IT(hlpuart, LPUART_IT_TXE); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data in interrupt mode. +*@note In interrupt mode, receiving completion interrupt (RX) and error +* interrupt (RXOVFEPE) are forced enabled. +* If an error occurs in the reception, the reception stops automatically. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be received. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_Receive_IT(LPUART_HandleTypeDef *hlpuart, uint8_t *pdata, uint32_t size) +{ + /* Check the parameters */ + assert_param(IS_LPUART_HANDLE(hlpuart)); + assert_param(IS_LPUART_INSTANCE(hlpuart->Instance)); + assert_param(pdata != NULL); + assert_param(size != 0U); + + /* If LPUART is receiving, an error is returned */ + if (hlpuart->RxState != LPUART_STATE_READY) + return HAL_ERROR; + + /* rx state: busy */ + hlpuart->RxState = LPUART_STATE_BUSY_IT; + + hlpuart->pRxBuf = pdata; + hlpuart->RxCount = size; + hlpuart->RxError = 0; + + /* enable interrupt (RXPEFERXOV) */ + __HAL_LPUART_ENABLE_IT(hlpuart, LPUART_IT_RXOV | LPUART_IT_FE | LPUART_IT_PE | LPUART_IT_RX); + + return HAL_OK; +} + +#ifdef HAL_DMA_MODULE_ENABLED +/****************************************************************************** +*@brief : Send an amount of data in DMA mode. +*@note In DMA mode, the transmission related interrupt (TC/TXE) is forced to disabled. +* the DMA transmission related interrupt (ITC/HFTC/IE) is forced to enabled. +* If an DMA transfer error occurs in the transmission, +* the transmission stops automatically. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be received. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_Transmit_DMA(LPUART_HandleTypeDef *hlpuart, uint8_t *pdata, uint32_t size) +{ + /* Check the parameters */ + assert_param(IS_LPUART_HANDLE(hlpuart)); + assert_param(IS_LPUART_INSTANCE(hlpuart->Instance)); + assert_param(pdata != NULL); + assert_param(size != 0U); + + /* If LPUART is sending, an error is returned */ + if (hlpuart->TxState != LPUART_STATE_READY) + return HAL_ERROR; + + /* tx state: busy */ + hlpuart->TxState = LPUART_STATE_BUSY_DMA; + + /* set dma callback function */ + hlpuart->hdmatx->XferCpltCallback = HAL_LPUART_DMATxCpltCallback; + hlpuart->hdmatx->XferErrorCallback = HAL_LPUART_DMATxErrorCallback; + if (hlpuart->TxHalfCpltCallback) + hlpuart->hdmatx->XferHalfCpltCallback = HAL_LPUART_DMATxHalfCpltCallback; + else + hlpuart->hdmatx->XferHalfCpltCallback = NULL; + + hlpuart->pTxBuf = pdata; + hlpuart->TxCount = size; + hlpuart->TxError = 0U; + + /* Start DMA interrupt transfer */ + if (HAL_DMA_Start_IT(hlpuart->hdmatx, (uint32_t)pdata, (uint32_t)&hlpuart->Instance->TXDR, size) != HAL_OK) + { + /* Set error code to DMA */ + hlpuart->TxError = LPUART_DMA_TX_ERROR; + hlpuart->TxState = LPUART_STATE_READY; + return HAL_ERROR; + } + + /* enable LPUART DMA */ + __HAL_LPUART_ENABLE_DMA(hlpuart); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data in DMA mode. +*@note In DMA mode, receiving completion interrupt (RX) is forced disable. +* the error interrupt (RXOVFEPE) are forced enabled. +* the DMA transmission related interrupt (ITC/HFTC/IE) is forced to enabled. +* If an error occurs in the reception, the reception stops automatically. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@param : pdata: Pointer to data buffer. +*@param : size: Amount of data elements to be received. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_Receive_DMA(LPUART_HandleTypeDef *hlpuart, uint8_t *pdata, uint32_t size) +{ + /* Check the parameters */ + assert_param(IS_LPUART_HANDLE(hlpuart)); + assert_param(IS_LPUART_INSTANCE(hlpuart->Instance)); + assert_param(pdata != NULL); + assert_param(size != 0U); + + /* If LPUART is receiving, an error is returned */ + if (hlpuart->RxState != LPUART_STATE_READY) + return HAL_ERROR; + + /* rx state: busy */ + hlpuart->RxState = LPUART_STATE_BUSY_DMA; + + /* set dma callback function */ + hlpuart->hdmarx->XferCpltCallback = HAL_LPUART_DMARxCpltCallback; + if (hlpuart->RxHalfCpltCallback) + hlpuart->hdmarx->XferHalfCpltCallback = HAL_LPUART_DMARxHalfCpltCallback; + else + hlpuart->hdmarx->XferHalfCpltCallback = NULL; + hlpuart->hdmarx->XferErrorCallback = HAL_LPUART_DMARxErrorCallback; + + hlpuart->pRxBuf = pdata; + hlpuart->RxCount = size; + hlpuart->RxError = 0U; + + /* Start DMA interrupt transfer */ + if (HAL_DMA_Start_IT(hlpuart->hdmarx, (uint32_t)&hlpuart->Instance->RXDR, (uint32_t)pdata, size) != HAL_OK) + { + /* Set error code to DMA */ + hlpuart->RxError = LPUART_DMA_RX_ERROR; + hlpuart->RxState = LPUART_STATE_READY; + return HAL_ERROR; + } + + /* enable interrupt (PEFERXOV) */ + if (hlpuart->RxErrorCallback) + { + __HAL_LPUART_ENABLE_IT(hlpuart, LPUART_IT_RXOV | LPUART_IT_FE | LPUART_IT_PE); + } + + /* enable LPUART DMA */ + __HAL_LPUART_ENABLE_DMA(hlpuart); + + return HAL_OK; +} +#endif + +/****************************************************************************** +*@brief : Abort ongoing transmit transfer(block mode/interrupt mode/dma mode). +* In blocking mode, check TxState to exit the abort function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_AbortTransmit(LPUART_HandleTypeDef *hlpuart) +{ + /* Check the parameters */ + assert_param(IS_LPUART_HANDLE(hlpuart)); + assert_param(IS_LPUART_INSTANCE(hlpuart->Instance)); + + /* If LPUART is not sent, return directly */ + if (hlpuart->TxState == LPUART_STATE_READY) + return HAL_OK; + + if (hlpuart->TxState == LPUART_STATE_BUSY) + { + /* Abort ongoing transmit transfer(block mode) */ + + /* enable tx abort flag */ + hlpuart->TxAbort = ENABLE; + } + else if (hlpuart->TxState == LPUART_STATE_BUSY_IT) + { + /* Abort ongoing transmit transfer(interrupt mode) */ + + /* disable interrupt (TXE/TC) */ + __HAL_LPUART_DISABLE_IT(hlpuart, LPUART_IT_TXE | LPUART_IT_TC); + + if (hlpuart->Instance->CR & LPUART_CR_TX_EN) + { + __HAL_LPUART_DISABLE_TX(hlpuart); + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_TCIF); + __HAL_LPUART_ENABLE_TX(hlpuart); + } + + /* end of sending */ + hlpuart->TxState = LPUART_STATE_READY; + } +#ifdef HAL_DMA_MODULE_ENABLED + else if (hlpuart->TxState == LPUART_STATE_BUSY_DMA) + { + /* Abort ongoing transmit transfer(dma mode) */ + + /* abort dma transfer */ + HAL_DMA_Abort(hlpuart->hdmatx); + + /* Take the number of unsent data */ + hlpuart->TxCount = __HAL_DMA_GET_TRANSFER_SIZE(hlpuart->hdmatx); + + if (hlpuart->Instance->CR & LPUART_CR_TX_EN) + { + __HAL_LPUART_DISABLE_TX(hlpuart); + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_TCIF); + __HAL_LPUART_ENABLE_TX(hlpuart); + } + + /* end of sending */ + hlpuart->TxState = LPUART_STATE_READY; + } +#endif + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Abort ongoing reception transfer(block mode/interrupt mode/dma mode). +* In blocking mode, check TxState to exit the abort function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_LPUART_AbortReceive(LPUART_HandleTypeDef *hlpuart) +{ + /* Check the parameters */ + assert_param(IS_LPUART_HANDLE(hlpuart)); + assert_param(IS_LPUART_INSTANCE(hlpuart->Instance)); + + /* If LPUART is not receving, return directly */ + if (hlpuart->RxState == LPUART_STATE_READY) + return HAL_OK; + + if (hlpuart->RxState == LPUART_STATE_BUSY) + { + /* Abort ongoing transmit transfer(block mode) */ + + /* enable rx abort flag */ + hlpuart->RxAbort = ENABLE; + } + else if (hlpuart->RxState == LPUART_STATE_BUSY_IT) + { + /* Abort ongoing transmit transfer(interrupt mode) */ + + /* disable interrupt (RXOV/FE/PE/RX) */ + __HAL_LPUART_DISABLE_IT(hlpuart, LPUART_IT_RXOV | LPUART_IT_FE | \ + LPUART_IT_PE | LPUART_IT_RX); + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_RXOVIF | LPUART_FLAG_FEIF | \ + LPUART_FLAG_PEIF | LPUART_FLAG_RXIF); + + /* End of reception */ + hlpuart->RxState = LPUART_STATE_READY; + } +#ifdef HAL_DMA_MODULE_ENABLED + else if (hlpuart->RxState == LPUART_STATE_BUSY_DMA) + { + /* Abort ongoing transmit transfer(dma mode) */ + + /* disable interrupt (RXOV/FE/PE) */ + __HAL_LPUART_DISABLE_IT(hlpuart, LPUART_IT_RXOV | LPUART_IT_FE | LPUART_IT_PE); + + /* abort dma transfer */ + HAL_DMA_Abort(hlpuart->hdmarx); + + /* Take the number of unsent data */ + hlpuart->RxCount = __HAL_DMA_GET_TRANSFER_SIZE(hlpuart->hdmarx); + + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_RXOVIF | LPUART_FLAG_FEIF | \ + LPUART_FLAG_PEIF | LPUART_FLAG_RXIF); + + /* End of reception */ + hlpuart->RxState = LPUART_STATE_READY; + } +#endif + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Get sending status. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: sending status. +* The return value can be @ ref LPUART_State value +* @arg LPUART_STATE_READY: LPUART not sent. +* @arg LPUART_STATE_BUSY: LPUART sending(block mode). +* @arg LPUART_STATE_BUSY_IT: LPUART sending(interrupt mode). +* @arg LPUART_STATE_BUSY_DMA: LPUART sending(dma mode). +******************************************************************************/ +uint32_t HAL_LPUART_GetTxState(LPUART_HandleTypeDef *hlpuart) +{ + assert_param(IS_LPUART_HANDLE(hlpuart)); + return (hlpuart->TxState); +} + +/****************************************************************************** +*@brief : Get the receiving status. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: receiving status. +* The return value can be @ ref LPUART_State value +* @arg LPUART_STATE_READY: LPUART did not receive. +* @arg LPUART_STATE_BUSY: LPUART is receiving(block mode). +* @arg LPUART_STATE_BUSY_IT: LPUART is receiving(interrupt mode). +* @arg LPUART_STATE_BUSY_DMA: LPUART is receiving(dma mode). +******************************************************************************/ +uint32_t HAL_LPUART_GetRxState(LPUART_HandleTypeDef *hlpuart) +{ + assert_param(IS_LPUART_HANDLE(hlpuart)); + return (hlpuart->RxState); +} + +/****************************************************************************** +*@brief : bit counting callback function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None. +******************************************************************************/ +__weak void HAL_LPUART_BcntCallback(LPUART_HandleTypeDef *hlpuart) +{ + if (hlpuart->BcntCallback) + { + hlpuart->BcntCallback(hlpuart); + } +} +/****************************************************************************** +*@brief : Idle callback function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None. +******************************************************************************/ +__weak void HAL_LPUART_IdleCallback(LPUART_HandleTypeDef *hlpuart) +{ + if (hlpuart->IdleCallback) + { + hlpuart->IdleCallback(hlpuart); + } +} +/****************************************************************************** +*@brief : Tx buffer empty callback function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None. +******************************************************************************/ +__weak void HAL_LPUART_TxEmptyCallback(LPUART_HandleTypeDef *hlpuart) +{ + if (hlpuart->TxCount) + { + /* Continue sending */ + hlpuart->Instance->TXDR = *hlpuart->pTxBuf++; + hlpuart->TxCount--; + } + else + { + /* disable interrupt (TXE) */ + __HAL_LPUART_DISABLE_IT(hlpuart, LPUART_IT_TXE); + + /* enable interrupt (TC) */ + __HAL_LPUART_ENABLE_IT(hlpuart, LPUART_IT_TC); + } +} + +/****************************************************************************** +*@brief : Tx transfer complete callback function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None. +******************************************************************************/ +__weak void HAL_LPUART_TxCompleteCallback(LPUART_HandleTypeDef *hlpuart) +{ + /* disable interrupt (TC) */ + __HAL_LPUART_DISABLE_IT(hlpuart, LPUART_IT_TC); + + hlpuart->TxState = LPUART_STATE_READY; + + if (hlpuart->TxCpltCallback) + { + hlpuart->TxCpltCallback(hlpuart); + } +} + +/****************************************************************************** +*@brief : Rx transfer complete callback function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None. +******************************************************************************/ +__weak void HAL_LPUART_RxCompleteCallback(LPUART_HandleTypeDef *hlpuart) +{ + /* The received data is put into the buffer */ + *hlpuart->pRxBuf++ = hlpuart->Instance->RXDR; + hlpuart->RxCount--; + + if (hlpuart->RxCount == 0U) + { + /* Receiving completed */ + + /* disable interrupt (RX/RXOV/FE/PE) */ + __HAL_LPUART_DISABLE_IT(hlpuart, LPUART_IT_RX | LPUART_IT_RXOV | \ + LPUART_IT_FE | LPUART_IT_PE); + + /* receive complete */ + hlpuart->RxState = LPUART_STATE_READY; + + if (hlpuart->RxCpltCallback) + { + hlpuart->RxCpltCallback(hlpuart); + } + } +} + +/****************************************************************************** +*@brief : Wakeup callback function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None. +******************************************************************************/ +__weak void HAL_LPUART_WakeupCallback(LPUART_HandleTypeDef *hlpuart) +{ + if (hlpuart->WakeupCallback) + { + hlpuart->WakeupCallback(hlpuart); + } +} + +#ifdef HAL_DMA_MODULE_ENABLED +/****************************************************************************** +*@brief : Tx DMA transfer complete callback function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None. +******************************************************************************/ +__weak void HAL_LPUART_DMATxCpltCallback(DMA_HandleTypeDef *hdma) +{ + LPUART_HandleTypeDef *hlpuart; + + hlpuart = hdma->Parent; + + /* clear flag (TCIF) */ + __HAL_LPUART_CLEAR_FLAG(hlpuart, LPUART_FLAG_TCIF); + + /* Take the number of unsent data */ + hlpuart->TxCount = __HAL_DMA_GET_TRANSFER_SIZE(hlpuart->hdmatx); + + /* tx DMA transfer complete */ + hlpuart->TxState = LPUART_STATE_READY; + + if (hlpuart->TxCpltCallback) + { + hlpuart->TxCpltCallback(hlpuart); + } +} + +/****************************************************************************** +*@brief : Tx DMA half transfer complete callback function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None. +******************************************************************************/ +__weak void HAL_LPUART_DMATxHalfCpltCallback(DMA_HandleTypeDef *hdma) +{ + LPUART_HandleTypeDef *hlpuart; + + hlpuart = hdma->Parent; + + /* Take the number of unsent data */ + hlpuart->TxCount = __HAL_DMA_GET_TRANSFER_SIZE(hlpuart->hdmatx); + + if (hlpuart->TxHalfCpltCallback) + { + hlpuart->TxHalfCpltCallback(hlpuart); + } +} + +/****************************************************************************** +*@brief : Tx DMA transfer error callback function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None. +******************************************************************************/ +__weak void HAL_LPUART_DMATxErrorCallback(DMA_HandleTypeDef *hdma) +{ + LPUART_HandleTypeDef *hlpuart; + + hlpuart = hdma->Parent; + + /* abort tx dma transfer */ + HAL_DMA_Abort(hdma); + + /* set the dma transfer error */ + hlpuart->TxError |= LPUART_DMA_TX_ERROR; + + /* Take the number of unsent data */ + hlpuart->TxCount = __HAL_DMA_GET_TRANSFER_SIZE(hlpuart->hdmatx); + + /* end of sending */ + hlpuart->TxState = LPUART_STATE_READY; + + if (hlpuart->TxErrorCallback) + { + hlpuart->TxErrorCallback(hlpuart); + } +} + +/****************************************************************************** +*@brief : Rx DMA transfer complete callback function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None. +******************************************************************************/ +__weak void HAL_LPUART_DMARxCpltCallback(DMA_HandleTypeDef *hdma) +{ + LPUART_HandleTypeDef *hlpuart; + + hlpuart = hdma->Parent; + + /* if no error occurs in reception, disable interrupt (RXOV/FE/PE) */ + __HAL_LPUART_DISABLE_IT(hlpuart, LPUART_IT_RXOV | LPUART_IT_FE | LPUART_IT_PE); + + /* Take the number of data not received */ + hlpuart->RxCount = __HAL_DMA_GET_TRANSFER_SIZE(hlpuart->hdmarx); + + /* End of reception */ + hlpuart->RxState = LPUART_STATE_READY; + + if (hlpuart->RxCpltCallback) + { + hlpuart->RxCpltCallback(hlpuart); + } +} + +/****************************************************************************** +*@brief : Rx DMA hlaf transfer complete callback function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None. +******************************************************************************/ +__weak void HAL_LPUART_DMARxHalfCpltCallback(DMA_HandleTypeDef *hdma) +{ + LPUART_HandleTypeDef *hlpuart; + + hlpuart = hdma->Parent; + + /* Take the number of data not received */ + hlpuart->RxCount = __HAL_DMA_GET_TRANSFER_SIZE(hlpuart->hdmarx); + + if (hlpuart->RxHalfCpltCallback) + { + hlpuart->RxHalfCpltCallback(hlpuart); + } +} + +/****************************************************************************** +*@brief : Rx DMA transfer error callback function. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None. +******************************************************************************/ +__weak void HAL_LPUART_DMARxErrorCallback(DMA_HandleTypeDef *hdma) +{ + LPUART_HandleTypeDef *hlpuart; + + hlpuart = hdma->Parent; + + /* abort rx dma transfer */ + HAL_DMA_Abort(hdma); + + /* set the dma transfer error */ + hlpuart->RxError = LPUART_DMA_RX_ERROR; + + /* End of reception */ + hlpuart->RxState = LPUART_STATE_READY; + + if (hlpuart->RxErrorCallback) + { + hlpuart->RxErrorCallback(hlpuart); + } +} +#endif + +/****************************************************************************** +*@brief : Init the internal parameter. +*@param : hlpuart: pointer to a LPUART_HandleTypeDef structure that contains +* the configuration information for LPUART module. +*@return: None. +******************************************************************************/ +static void HAL_LPUART_InitParamter(LPUART_HandleTypeDef *hlpuart) +{ + hlpuart->TxState = 0U; + hlpuart->TxError = 0U; + hlpuart->pTxBuf = 0U; + hlpuart->TxCount = 0U; + hlpuart->TxAbort = 0U; + + hlpuart->RxState = 0U; + hlpuart->RxError = 0U; + hlpuart->pRxBuf = 0U; + hlpuart->RxCount = 0U; + hlpuart->RxAbort = 0U; + + hlpuart->TxCpltCallback = NULL; + hlpuart->TxHalfCpltCallback = NULL; + hlpuart->TxErrorCallback = NULL; + hlpuart->RxCpltCallback = NULL; + hlpuart->RxHalfCpltCallback = NULL; + hlpuart->RxErrorCallback = NULL; + hlpuart->WakeupCallback = NULL; +} + +#endif /* HAL_LPUART_MODULE_ENABLED */ + +/************************ (C) COPYRIGHT AISINOCHIP *****END OF FILE****/ + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_ltdc.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_ltdc.c new file mode 100644 index 0000000000..78b530d16a --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_ltdc.c @@ -0,0 +1,1812 @@ +/****************************************************************************** +*@file : hal_ltdc.c +*@brief : GPIO HAL module driver. +******************************************************************************/ + +#include "hal.h" + +#ifdef HAL_LTDC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx); +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup LTDC_Exported_Functions LTDC Exported Functions + * @{ + */ + +/** @defgroup LTDC_Exported_Functions_Group1 Initialization and Configuration functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Initialize and configure the LTDC + (+) De-initialize the LTDC + +@endverbatim + * @{ + */ + + +HAL_StatusTypeDef HAL_LTDC_Clk_Div(uint8_t PLL2Q, uint8_t DckCfg) +{ + __ISB(); + while(0==(RCC->PLL2CR&RCC_PLL2CR_PLL2FREERUN)); + + //PLL2 Qclk output Q div value set + RCC->PLL2CFR = ((RCC->PLL2CFR & (~(0x0F<PLL2CR |= RCC_PLL2CR_PLL2UPDATEEN; + __ISB(); + while(0==(RCC->PLL2CR&RCC_PLL2CR_PLL2FREERUN)); + + //LTDC pixle clk divider set + HAL_RCC_LCDPiexlClockDivConfig(DckCfg); + + return HAL_OK; +} + +/** + * @brief Initialize the LTDC according to the specified parameters in the LTDC_InitTypeDef. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_Init(LTDC_HandleTypeDef *hltdc) +{ + uint32_t tmp = 0, tmp1 = 0; + + /* Check the LTDC peripheral state */ + if(hltdc == NULL) + { + return HAL_ERROR; + } + + /* Check function parameters */ + assert_param(IS_LTDC_ALL_INSTANCE(hltdc->Instance)); + assert_param(IS_LTDC_HSYNC(hltdc->Init.HorizontalSync)); + assert_param(IS_LTDC_VSYNC(hltdc->Init.VerticalSync)); + assert_param(IS_LTDC_AHBP(hltdc->Init.AccumulatedHBP)); + assert_param(IS_LTDC_AVBP(hltdc->Init.AccumulatedVBP)); + assert_param(IS_LTDC_AAH(hltdc->Init.AccumulatedActiveH)); + assert_param(IS_LTDC_AAW(hltdc->Init.AccumulatedActiveW)); + assert_param(IS_LTDC_TOTALH(hltdc->Init.TotalHeigh)); + assert_param(IS_LTDC_TOTALW(hltdc->Init.TotalWidth)); + assert_param(IS_LTDC_HSPOL(hltdc->Init.HSPolarity)); + assert_param(IS_LTDC_VSPOL(hltdc->Init.VSPolarity)); + assert_param(IS_LTDC_DEPOL(hltdc->Init.DEPolarity)); + assert_param(IS_LTDC_PCPOL(hltdc->Init.PCPolarity)); + + if(hltdc->State == HAL_LTDC_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hltdc->Lock = HAL_UNLOCKED; + /* Init the low level hardware */ + HAL_LTDC_MspInit(hltdc); + } + + __HAL_RCC_LTDC_CLK_ENABLE(); + __HAL_RCC_LTDC_RESET(); + + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Configure the HS, VS, DE and PC polarity */ + hltdc->Instance->GCR &= ~(LTDC_GCR_HSPOL | LTDC_GCR_VSPOL | LTDC_GCR_DEPOL | LTDC_GCR_PCPOL); + hltdc->Instance->GCR |= (uint32_t)(hltdc->Init.HSPolarity | hltdc->Init.VSPolarity | \ + hltdc->Init.DEPolarity | hltdc->Init.PCPolarity); + hltdc->Instance->GCR |= LTDC_GCR_AHB_LOCK; + + /* Set Synchronization size */ + hltdc->Instance->SSCR &= ~(LTDC_SSCR_VSH | LTDC_SSCR_HSW); + tmp = (hltdc->Init.HorizontalSync << 16); + hltdc->Instance->SSCR |= (tmp | hltdc->Init.VerticalSync); + + /* Set Accumulated Back porch */ + hltdc->Instance->BPCR &= ~(LTDC_BPCR_AVBP | LTDC_BPCR_AHBP); + tmp = (hltdc->Init.AccumulatedHBP << 16); + hltdc->Instance->BPCR |= (tmp | hltdc->Init.AccumulatedVBP); + + /* Set Accumulated Active Width */ + hltdc->Instance->AWCR &= ~(LTDC_AWCR_AAH | LTDC_AWCR_AAW); + tmp = (hltdc->Init.AccumulatedActiveW << 16); + hltdc->Instance->AWCR |= (tmp | hltdc->Init.AccumulatedActiveH); + + /* Set Total Width */ + hltdc->Instance->TWCR &= ~(LTDC_TWCR_TOTALH | LTDC_TWCR_TOTALW); + tmp = (hltdc->Init.TotalWidth << 16); + hltdc->Instance->TWCR |= (tmp | hltdc->Init.TotalHeigh); + + /* Set the background color value */ + tmp = ((uint32_t)(hltdc->Init.Backcolor.Green) << 8); + tmp1 = ((uint32_t)(hltdc->Init.Backcolor.Red) << 16); + hltdc->Instance->BCCR &= ~(LTDC_BCCR_BCBLUE | LTDC_BCCR_BCGREEN | LTDC_BCCR_BCRED); + hltdc->Instance->BCCR |= (tmp1 | tmp | hltdc->Init.Backcolor.Blue); + + /* Enable the Transfer Error and FIFO underrun interrupts */ + __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_TE | LTDC_IT_FU); +// __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_TE | LTDC_IT_FU|LTDC_IT_LI|LTDC_IT_RR); + + /* Enable LTDC by setting LTDCEN bit */ + __HAL_LTDC_ENABLE(hltdc); + + /* Initialize the error code */ + hltdc->ErrorCode = HAL_LTDC_ERROR_NONE; + + /* Initialize the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + return HAL_OK; +} + +/** + * @brief De-initialize the LTDC peripheral. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @retval None + */ + +HAL_StatusTypeDef HAL_LTDC_DeInit(LTDC_HandleTypeDef *hltdc) +{ + /* DeInit the low level hardware */ + HAL_LTDC_MspDeInit(hltdc); + + while(0 == (LTDC->CDSR&(1<<2))); //disable ltdc while vsync is invalid to avoid screen blink + __HAL_LTDC_DISABLE(hltdc); + + /* Initialize the error code */ + hltdc->ErrorCode = HAL_LTDC_ERROR_NONE; + + /* Initialize the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Initialize the LTDC MSP. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @retval None + */ +__weak void HAL_LTDC_MspInit(LTDC_HandleTypeDef* hltdc) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_LTDC_MspInit could be implemented in the user file + */ +} + +/** + * @brief De-initialize the LTDC MSP. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @retval None + */ +__weak void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* hltdc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hltdc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_LTDC_MspDeInit could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup LTDC_Exported_Functions_Group2 IO operation functions + * @brief IO operation functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] This section provides function allowing to: + (+) Handle LTDC interrupt request + +@endverbatim + * @{ + */ +/** + * @brief Handle LTDC interrupt request. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @retval HAL status + */ +void HAL_LTDC_IRQHandler(LTDC_HandleTypeDef *hltdc) +{ + /* Transfer Error Interrupt management ***************************************/ + if(__HAL_LTDC_GET_FLAG(hltdc, LTDC_FLAG_TE) != RESET) + { + if(__HAL_LTDC_GET_IT_SOURCE(hltdc, LTDC_IT_TE) != RESET) + { + /* Disable the transfer Error interrupt */ + __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_TE); + + /* Clear the transfer error flag */ + __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_TE); + + /* Update error code */ + hltdc->ErrorCode |= HAL_LTDC_ERROR_TE; + + /* Change LTDC state */ + hltdc->State = HAL_LTDC_STATE_ERROR; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + /* Transfer error Callback */ + HAL_LTDC_ErrorCallback(hltdc); + } + } + /* FIFO underrun Interrupt management ***************************************/ + if(__HAL_LTDC_GET_FLAG(hltdc, LTDC_FLAG_FU) != RESET) + { + if(__HAL_LTDC_GET_IT_SOURCE(hltdc, LTDC_IT_FU) != RESET) + { + /* Disable the FIFO underrun interrupt */ + __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_FU); + + /* Clear the FIFO underrun flag */ + __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_FU); + + /* Update error code */ + hltdc->ErrorCode |= HAL_LTDC_ERROR_FU; + + /* Change LTDC state */ + hltdc->State = HAL_LTDC_STATE_ERROR; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + /* Transfer error Callback */ + HAL_LTDC_ErrorCallback(hltdc); + } + } + /* Line Interrupt management ************************************************/ + if(__HAL_LTDC_GET_FLAG(hltdc, LTDC_FLAG_LI) != RESET) + { + if(__HAL_LTDC_GET_IT_SOURCE(hltdc, LTDC_IT_LI) != RESET) + { + /* Disable the Line interrupt */ + __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_LI); + + /* Clear the Line interrupt flag */ + __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_LI); + + /* Change LTDC state */ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + /* Line interrupt Callback */ + HAL_LTDC_LineEventCallback(hltdc); + } + } + /* Register reload Interrupt management ***************************************/ + if(__HAL_LTDC_GET_FLAG(hltdc, LTDC_FLAG_RR) != RESET) + { + if(__HAL_LTDC_GET_IT_SOURCE(hltdc, LTDC_IT_RR) != RESET) + { + /* Disable the register reload interrupt */ + __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_RR); + + /* Clear the register reload flag */ + __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_RR); + + /* Change LTDC state */ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + /* Register reload interrupt Callback */ + HAL_LTDC_ReloadEventCallback(hltdc); + } + } +} + + +void HAL_LTDC_ERR_IRQHandler(LTDC_HandleTypeDef *hltdc) +{ + /* Clear the transfer error flag */ + __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_TE); + __HAL_LTDC_CLEAR_FLAG(hltdc, LTDC_FLAG_FU); +} + + + +/** + * @brief Error LTDC callback. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @retval None + */ +__weak void HAL_LTDC_ErrorCallback(LTDC_HandleTypeDef *hltdc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hltdc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_LTDC_ErrorCallback could be implemented in the user file + */ +} + +/** + * @brief Line Event callback. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @retval None + */ +__weak void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hltdc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_LTDC_LineEventCallback could be implemented in the user file + */ +} + +/** + * @brief Reload Event callback. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @retval None + */ +__weak void HAL_LTDC_ReloadEventCallback(LTDC_HandleTypeDef *hltdc) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hltdc); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_LTDC_ReloadEvenCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup LTDC_Exported_Functions_Group3 Peripheral Control functions + * @brief Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure the LTDC foreground or/and background parameters. + (+) Set the active layer. + (+) Configure the color keying. + (+) Configure the C-LUT. + (+) Enable / Disable the color keying. + (+) Enable / Disable the C-LUT. + (+) Update the layer position. + (+) Update the layer size. + (+) Update pixel format on the fly. + (+) Update transparency on the fly. + (+) Update address on the fly. + +@endverbatim + * @{ + */ + +/** + * @brief Configure the LTDC Layer according to the specified + * parameters in the LTDC_InitTypeDef and create the associated handle. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param pLayerCfg pointer to a LTDC_LayerCfgTypeDef structure that contains + * the configuration information for the Layer. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + assert_param(IS_LTDC_HCONFIGST(pLayerCfg->WindowX0)); + assert_param(IS_LTDC_HCONFIGSP(pLayerCfg->WindowX1)); + assert_param(IS_LTDC_VCONFIGST(pLayerCfg->WindowY0)); + assert_param(IS_LTDC_VCONFIGSP(pLayerCfg->WindowY1)); + assert_param(IS_LTDC_PIXEL_FORMAT(pLayerCfg->PixelFormat)); + assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha)); + assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha0)); + assert_param(IS_LTDC_BLENDING_FACTOR1(pLayerCfg->BlendingFactor1)); + assert_param(IS_LTDC_BLENDING_FACTOR2(pLayerCfg->BlendingFactor2)); + assert_param(IS_LTDC_CFBLL(pLayerCfg->ImageWidth)); + assert_param(IS_LTDC_CFBLNBR(pLayerCfg->ImageHeight)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Copy new layer configuration into handle structure */ + hltdc->LayerCfg[LayerIdx] = *pLayerCfg; + + /* Configure the LTDC Layer */ + LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); + + /* Set the Immediate Reload type */ + hltdc->Instance->SRCR = LTDC_SRCR_IMR; + + /* Initialize the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Configure the color keying. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param RGBValue the color key value + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t RGBValue, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Configure the default color values */ + LTDC_LAYER(hltdc, LayerIdx)->CKCR &= ~(LTDC_LxCKCR_CKBLUE | LTDC_LxCKCR_CKGREEN | LTDC_LxCKCR_CKRED); + LTDC_LAYER(hltdc, LayerIdx)->CKCR = RGBValue; + + /* Set the Immediate Reload type */ + hltdc->Instance->SRCR = LTDC_SRCR_IMR; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Load the color lookup table. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param pCLUT pointer to the color lookup table address. + * @param CLUTSize the color lookup table size. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_ConfigCLUT(LTDC_HandleTypeDef *hltdc, uint32_t *pCLUT, uint32_t CLUTSize, uint32_t LayerIdx) +{ + uint32_t tmp = 0; + uint32_t counter = 0; + uint32_t pcounter = 0; + + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + for(counter = 0; (counter < CLUTSize); counter++) + { + if(hltdc->LayerCfg[LayerIdx].PixelFormat == LTDC_PIXEL_FORMAT_AL44) + { + tmp = (((counter + 16*counter) << 24) | ((uint32_t)(*pCLUT) & 0xFF) | ((uint32_t)(*pCLUT) & 0xFF00) | ((uint32_t)(*pCLUT) & 0xFF0000)); + } + else + { + tmp = ((counter << 24) | ((uint32_t)(*pCLUT) & 0xFF) | ((uint32_t)(*pCLUT) & 0xFF00) | ((uint32_t)(*pCLUT) & 0xFF0000)); + } + pcounter = (uint32_t)pCLUT + sizeof(*pCLUT); + pCLUT = (uint32_t *)pcounter; + + /* Specifies the C-LUT address and RGB value */ + LTDC_LAYER(hltdc, LayerIdx)->CLUTWR = tmp; + } + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Enable the color keying. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_EnableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Enable LTDC color keying by setting COLKEN bit */ + LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_COLKEN; + + /* Set the Immediate Reload type */ + hltdc->Instance->SRCR = LTDC_SRCR_IMR; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Disable the color keying. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_DisableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Disable LTDC color keying by setting COLKEN bit */ + LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_COLKEN; + + /* Set the Immediate Reload type */ + hltdc->Instance->SRCR = LTDC_SRCR_IMR; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Enable the color lookup table. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_EnableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Enable LTDC color lookup table by setting CLUTEN bit */ + LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_CLUTEN; + + /* Set the Immediate Reload type */ + hltdc->Instance->SRCR = LTDC_SRCR_IMR; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Disable the color lookup table. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_DisableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Disable LTDC color lookup table by setting CLUTEN bit */ + LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_CLUTEN; + + /* Set the Immediate Reload type */ + hltdc->Instance->SRCR = LTDC_SRCR_IMR; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Enable Dither. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_LTDC_EnableDither(LTDC_HandleTypeDef *hltdc) +{ + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Enable Dither by setting DTEN bit */ + LTDC->GCR |= (uint32_t)LTDC_GCR_DEN; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Disable Dither. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_LTDC_DisableDither(LTDC_HandleTypeDef *hltdc) +{ + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Disable Dither by setting DTEN bit */ + LTDC->GCR &= ~(uint32_t)LTDC_GCR_DEN; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Set the LTDC window size. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param XSize LTDC Pixel per line + * @param YSize LTDC Line number + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_SetWindowSize(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, uint32_t LayerIdx) +{ + LTDC_LayerCfgTypeDef *pLayerCfg; + + /* Check the parameters (Layers parameters)*/ + assert_param(IS_LTDC_LAYER(LayerIdx)); + assert_param(IS_LTDC_CFBLL(XSize)); + assert_param(IS_LTDC_CFBLNBR(YSize)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Get layer configuration from handle structure */ + pLayerCfg = &hltdc->LayerCfg[LayerIdx]; + + /* update horizontal stop */ + pLayerCfg->WindowX1 = XSize + pLayerCfg->WindowX0; + + /* update vertical stop */ + pLayerCfg->WindowY1 = YSize + pLayerCfg->WindowY0; + + /* Reconfigures the color frame buffer pitch in byte */ + pLayerCfg->ImageWidth = XSize; + + /* Reconfigures the frame buffer line number */ + pLayerCfg->ImageHeight = YSize; + + /* Set LTDC parameters */ + LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); + + /* Set the Immediate Reload type */ + hltdc->Instance->SRCR = LTDC_SRCR_IMR; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Set the LTDC window position. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param X0 LTDC window X offset + * @param Y0 LTDC window Y offset + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_SetWindowPosition(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, uint32_t LayerIdx) +{ + LTDC_LayerCfgTypeDef *pLayerCfg; + + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + assert_param(IS_LTDC_CFBLL(X0)); + assert_param(IS_LTDC_CFBLNBR(Y0)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Get layer configuration from handle structure */ + pLayerCfg = &hltdc->LayerCfg[LayerIdx]; + + /* update horizontal start/stop */ + pLayerCfg->WindowX0 = X0; + pLayerCfg->WindowX1 = X0 + pLayerCfg->ImageWidth; + + /* update vertical start/stop */ + pLayerCfg->WindowY0 = Y0; + pLayerCfg->WindowY1 = Y0 + pLayerCfg->ImageHeight; + + /* Set LTDC parameters */ + LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); + + /* Set the Immediate Reload type */ + hltdc->Instance->SRCR = LTDC_SRCR_IMR; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Reconfigure the pixel format. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param Pixelformat new pixel format value. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_SetPixelFormat(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx) +{ + LTDC_LayerCfgTypeDef *pLayerCfg; + + /* Check the parameters */ + assert_param(IS_LTDC_PIXEL_FORMAT(Pixelformat)); + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Get layer configuration from handle structure */ + pLayerCfg = &hltdc->LayerCfg[LayerIdx]; + + /* Reconfigure the pixel format */ + pLayerCfg->PixelFormat = Pixelformat; + + /* Set LTDC parameters */ + LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); + + /* Set the Immediate Reload type */ + hltdc->Instance->SRCR = LTDC_SRCR_IMR; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Reconfigure the layer alpha value. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param Alpha new alpha value. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_SetAlpha(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx) +{ + LTDC_LayerCfgTypeDef *pLayerCfg; + + /* Check the parameters */ + assert_param(IS_LTDC_ALPHA(Alpha)); + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Get layer configuration from handle structure */ + pLayerCfg = &hltdc->LayerCfg[LayerIdx]; + + /* Reconfigure the Alpha value */ + pLayerCfg->Alpha = Alpha; + + /* Set LTDC parameters */ + LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); + + /* Set the Immediate Reload type */ + hltdc->Instance->SRCR = LTDC_SRCR_IMR; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} +/** + * @brief Reconfigure the frame buffer Address. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param Address new address value. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_SetAddress(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx, uint32_t ReloadType) +{ + LTDC_LayerCfgTypeDef *pLayerCfg; + + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Get layer configuration from handle structure */ + pLayerCfg = &hltdc->LayerCfg[LayerIdx]; + + /* Reconfigure the Address */ + pLayerCfg->FBStartAdress = Address; + + /* Set LTDC parameters */ + LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); + + /* Set the Immediate Reload type */ + hltdc->Instance->SRCR = ReloadType; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Function used to reconfigure the pitch for specific cases where the attached LayerIdx buffer have a width that is + * larger than the one intended to be displayed on screen. Example of a buffer 800x480 attached to layer for which we + * want to read and display on screen only a portion 320x240 taken in the center of the buffer. The pitch in pixels + * will be in that case 800 pixels and not 320 pixels as initially configured by previous call to HAL_LTDC_ConfigLayer(). + * @note This function should be called only after a previous call to HAL_LTDC_ConfigLayer() to modify the default pitch + * configured by HAL_LTDC_ConfigLayer() when required (refer to example described just above). + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param LinePitchInPixels New line pitch in pixels to configure for LTDC layer 'LayerIdx'. + * @param LayerIdx LTDC layer index concerned by the modification of line pitch. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_SetPitch(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx) +{ + uint32_t tmp = 0; + uint32_t pitchUpdate = 0; + uint32_t pixelFormat = 0; + + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* get LayerIdx used pixel format */ + pixelFormat = hltdc->LayerCfg[LayerIdx].PixelFormat; + + if(pixelFormat == LTDC_PIXEL_FORMAT_ARGB8888) + { + tmp = 4; + } + else if (pixelFormat == LTDC_PIXEL_FORMAT_RGB888) + { + tmp = 3; + } + else if((pixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \ + (pixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \ + (pixelFormat == LTDC_PIXEL_FORMAT_ARGB1555) || \ + (pixelFormat == LTDC_PIXEL_FORMAT_AL88)) + { + tmp = 2; + } + else + { + tmp = 1; + } + + pitchUpdate = ((LinePitchInPixels * tmp) << 16); + + /* Clear previously set standard pitch */ + LTDC_LAYER(hltdc, LayerIdx)->CFBLR &= ~LTDC_LxCFBLR_CFBP; + + /* Set the Reload type as immediate update of LTDC pitch configured above */ + LTDC->SRCR |= LTDC_SRCR_IMR; + + /* Set new line pitch value */ + LTDC_LAYER(hltdc, LayerIdx)->CFBLR |= pitchUpdate; + + /* Set the Reload type as immediate update of LTDC pitch configured above */ + LTDC->SRCR |= LTDC_SRCR_IMR; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Define the position of the line interrupt. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param Line Line Interrupt Position. + * @note User application may resort to HAL_LTDC_LineEventCallback() at line interrupt generation. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_ProgramLineEvent(LTDC_HandleTypeDef *hltdc, uint32_t Line) +{ + /* Check the parameters */ + assert_param(IS_LTDC_LIPOS(Line)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Disable the Line interrupt */ + __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_LI); + + /* Set the Line Interrupt position */ + LTDC->LIPCR = (uint32_t)Line; + + /* Enable the Line interrupt */ + __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_LI); + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Reload LTDC Layers configuration. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param ReloadType This parameter can be one of the following values : + * LTDC_RELOAD_IMMEDIATE : Immediate Reload + * LTDC_RELOAD_VERTICAL_BLANKING : Reload in the next Vertical Blanking + * @note User application may resort to HAL_LTDC_ReloadEventCallback() at reload interrupt generation. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_Reload(LTDC_HandleTypeDef *hltdc, uint32_t ReloadType) +{ + /* Check the parameters */ + assert_param(IS_LTDC_RELOAD(ReloadType)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Enable the Reload interrupt */ + __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_RR); + + /* Apply Reload type */ + hltdc->Instance->SRCR = ReloadType; + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Configure the LTDC Layer according to the specified without reloading + * parameters in the LTDC_InitTypeDef and create the associated handle. + * Variant of the function HAL_LTDC_ConfigLayer without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param pLayerCfg pointer to a LTDC_LayerCfgTypeDef structure that contains + * the configuration information for the Layer. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_ConfigLayer_NoReload(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + assert_param(IS_LTDC_HCONFIGST(pLayerCfg->WindowX0)); + assert_param(IS_LTDC_HCONFIGSP(pLayerCfg->WindowX1)); + assert_param(IS_LTDC_VCONFIGST(pLayerCfg->WindowY0)); + assert_param(IS_LTDC_VCONFIGSP(pLayerCfg->WindowY1)); + assert_param(IS_LTDC_PIXEL_FORMAT(pLayerCfg->PixelFormat)); + assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha)); + assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha0)); + assert_param(IS_LTDC_BLENDING_FACTOR1(pLayerCfg->BlendingFactor1)); + assert_param(IS_LTDC_BLENDING_FACTOR2(pLayerCfg->BlendingFactor2)); + assert_param(IS_LTDC_CFBLL(pLayerCfg->ImageWidth)); + assert_param(IS_LTDC_CFBLNBR(pLayerCfg->ImageHeight)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Copy new layer configuration into handle structure */ + hltdc->LayerCfg[LayerIdx] = *pLayerCfg; + + /* Configure the LTDC Layer */ + LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); + + /* Do not set the Immediate Reload */ + + /* Initialize the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Set the LTDC window size without reloading. + * Variant of the function HAL_LTDC_SetWindowSize without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param XSize LTDC Pixel per line + * @param YSize LTDC Line number + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_SetWindowSize_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, uint32_t LayerIdx) +{ + LTDC_LayerCfgTypeDef *pLayerCfg; + + /* Check the parameters (Layers parameters)*/ + assert_param(IS_LTDC_LAYER(LayerIdx)); + assert_param(IS_LTDC_CFBLL(XSize)); + assert_param(IS_LTDC_CFBLNBR(YSize)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Get layer configuration from handle structure */ + pLayerCfg = &hltdc->LayerCfg[LayerIdx]; + + /* update horizontal stop */ + pLayerCfg->WindowX1 = XSize + pLayerCfg->WindowX0; + + /* update vertical stop */ + pLayerCfg->WindowY1 = YSize + pLayerCfg->WindowY0; + + /* Reconfigures the color frame buffer pitch in byte */ + pLayerCfg->ImageWidth = XSize; + + /* Reconfigures the frame buffer line number */ + pLayerCfg->ImageHeight = YSize; + + /* Set LTDC parameters */ + LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); + + /* Do not set the Immediate Reload */ + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Set the LTDC window position without reloading. + * Variant of the function HAL_LTDC_SetWindowPosition without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param X0 LTDC window X offset + * @param Y0 LTDC window Y offset + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_SetWindowPosition_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, uint32_t LayerIdx) +{ + LTDC_LayerCfgTypeDef *pLayerCfg; + + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + assert_param(IS_LTDC_CFBLL(X0)); + assert_param(IS_LTDC_CFBLNBR(Y0)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Get layer configuration from handle structure */ + pLayerCfg = &hltdc->LayerCfg[LayerIdx]; + + /* update horizontal start/stop */ + pLayerCfg->WindowX0 = X0; + pLayerCfg->WindowX1 = X0 + pLayerCfg->ImageWidth; + + /* update vertical start/stop */ + pLayerCfg->WindowY0 = Y0; + pLayerCfg->WindowY1 = Y0 + pLayerCfg->ImageHeight; + + /* Set LTDC parameters */ + LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); + + /* Do not set the Immediate Reload */ + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Reconfigure the pixel format without reloading. + * Variant of the function HAL_LTDC_SetPixelFormat without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDfef structure that contains + * the configuration information for the LTDC. + * @param Pixelformat new pixel format value. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_SetPixelFormat_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx) +{ + LTDC_LayerCfgTypeDef *pLayerCfg; + + /* Check the parameters */ + assert_param(IS_LTDC_PIXEL_FORMAT(Pixelformat)); + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Get layer configuration from handle structure */ + pLayerCfg = &hltdc->LayerCfg[LayerIdx]; + + /* Reconfigure the pixel format */ + pLayerCfg->PixelFormat = Pixelformat; + + /* Set LTDC parameters */ + LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); + + /* Do not set the Immediate Reload */ + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Reconfigure the layer alpha value without reloading. + * Variant of the function HAL_LTDC_SetAlpha without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param Alpha new alpha value. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_SetAlpha_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx) +{ + LTDC_LayerCfgTypeDef *pLayerCfg; + + /* Check the parameters */ + assert_param(IS_LTDC_ALPHA(Alpha)); + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Get layer configuration from handle structure */ + pLayerCfg = &hltdc->LayerCfg[LayerIdx]; + + /* Reconfigure the Alpha value */ + pLayerCfg->Alpha = Alpha; + + /* Set LTDC parameters */ + LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); + + /* Do not set the Immediate Reload */ + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Reconfigure the frame buffer Address without reloading. + * Variant of the function HAL_LTDC_SetAddress without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param Address new address value. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_SetAddress_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx) +{ + LTDC_LayerCfgTypeDef *pLayerCfg; + + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Get layer configuration from handle structure */ + pLayerCfg = &hltdc->LayerCfg[LayerIdx]; + + /* Reconfigure the Address */ + pLayerCfg->FBStartAdress = Address; + + /* Set LTDC parameters */ + LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx); + + /* Do not set the Immediate Reload */ + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Function used to reconfigure the pitch for specific cases where the attached LayerIdx buffer have a width that is + * larger than the one intended to be displayed on screen. Example of a buffer 800x480 attached to layer for which we + * want to read and display on screen only a portion 320x240 taken in the center of the buffer. The pitch in pixels + * will be in that case 800 pixels and not 320 pixels as initially configured by previous call to HAL_LTDC_ConfigLayer(). + * @note This function should be called only after a previous call to HAL_LTDC_ConfigLayer() to modify the default pitch + * configured by HAL_LTDC_ConfigLayer() when required (refer to example described just above). + * Variant of the function HAL_LTDC_SetPitch without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param LinePitchInPixels New line pitch in pixels to configure for LTDC layer 'LayerIdx'. + * @param LayerIdx LTDC layer index concerned by the modification of line pitch. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_SetPitch_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx) +{ + uint32_t tmp = 0; + uint32_t pitchUpdate = 0; + uint32_t pixelFormat = 0; + + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* get LayerIdx used pixel format */ + pixelFormat = hltdc->LayerCfg[LayerIdx].PixelFormat; + + if(pixelFormat == LTDC_PIXEL_FORMAT_ARGB8888) + { + tmp = 4; + } + else if (pixelFormat == LTDC_PIXEL_FORMAT_RGB888) + { + tmp = 3; + } + else if((pixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \ + (pixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \ + (pixelFormat == LTDC_PIXEL_FORMAT_ARGB1555) || \ + (pixelFormat == LTDC_PIXEL_FORMAT_AL88)) + { + tmp = 2; + } + else + { + tmp = 1; + } + + pitchUpdate = ((LinePitchInPixels * tmp) << 16); + + /* Clear previously set standard pitch */ + LTDC_LAYER(hltdc, LayerIdx)->CFBLR &= ~LTDC_LxCFBLR_CFBP; + + /* Set new line pitch value */ + LTDC_LAYER(hltdc, LayerIdx)->CFBLR |= pitchUpdate; + + /* Do not set the Immediate Reload */ + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + + +/** + * @brief Configure the color keying without reloading. + * Variant of the function HAL_LTDC_ConfigColorKeying without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param RGBValue the color key value + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t RGBValue, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Configure the default color values */ + LTDC_LAYER(hltdc, LayerIdx)->CKCR &= ~(LTDC_LxCKCR_CKBLUE | LTDC_LxCKCR_CKGREEN | LTDC_LxCKCR_CKRED); + LTDC_LAYER(hltdc, LayerIdx)->CKCR = RGBValue; + + /* Do not set the Immediate Reload */ + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Enable the color keying without reloading. + * Variant of the function HAL_LTDC_EnableColorKeying without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_EnableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Enable LTDC color keying by setting COLKEN bit */ + LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_COLKEN; + + /* Do not set the Immediate Reload */ + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Disable the color keying without reloading. + * Variant of the function HAL_LTDC_DisableColorKeying without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_DisableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Disable LTDC color keying by setting COLKEN bit */ + LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_COLKEN; + + /* Do not set the Immediate Reload */ + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Enable the color lookup table without reloading. + * Variant of the function HAL_LTDC_EnableCLUT without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_EnableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Disable LTDC color lookup table by setting CLUTEN bit */ + LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_CLUTEN; + + /* Do not set the Immediate Reload */ + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @brief Disable the color lookup table without reloading. + * Variant of the function HAL_LTDC_DisableCLUT without immediate reload. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: + * LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LTDC_DisableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx) +{ + /* Check the parameters */ + assert_param(IS_LTDC_LAYER(LayerIdx)); + + /* Process locked */ + __HAL_LOCK(hltdc); + + /* Change LTDC peripheral state */ + hltdc->State = HAL_LTDC_STATE_BUSY; + + /* Disable LTDC color lookup table by setting CLUTEN bit */ + LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_CLUTEN; + + /* Do not set the Immediate Reload */ + + /* Change the LTDC state*/ + hltdc->State = HAL_LTDC_STATE_READY; + + /* Process unlocked */ + __HAL_UNLOCK(hltdc); + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup LTDC_Exported_Functions_Group4 Peripheral State and Errors functions + * @brief Peripheral State and Errors functions + * +@verbatim + =============================================================================== + ##### Peripheral State and Errors functions ##### + =============================================================================== + [..] + This subsection provides functions allowing to + (+) Check the LTDC handle state. + (+) Get the LTDC handle error code. + +@endverbatim + * @{ + */ + +/** + * @brief Return the LTDC handle state. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @retval HAL state + */ +HAL_LTDC_StateTypeDef HAL_LTDC_GetState(LTDC_HandleTypeDef *hltdc) +{ + return hltdc->State; +} + +/** + * @brief Return the LTDC handle error code. + * @param hltdc pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. +* @retval LTDC Error Code +*/ +uint32_t HAL_LTDC_GetError(LTDC_HandleTypeDef *hltdc) +{ + return hltdc->ErrorCode; +} + +/** + * @} + */ + +/** + * @brief Configures the LTDC peripheral + * @param hltdc : Pointer to a LTDC_HandleTypeDef structure that contains + * the configuration information for the LTDC. + * @param pLayerCfg Pointer LTDC Layer Configuration structure + * @param LayerIdx LTDC Layer index. + * This parameter can be one of the following values: LTDC_LAYER_1 (0) or LTDC_LAYER_2 (1) + * @retval None + */ +static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx) +{ + uint32_t tmp = 0; + uint32_t tmp1 = 0; + uint32_t tmp2 = 0; + + /* Configure the horizontal start and stop position */ + tmp = ((pLayerCfg->WindowX1 + ((hltdc->Instance->BPCR & LTDC_BPCR_AHBP) >> 16)) << 16); + LTDC_LAYER(hltdc, LayerIdx)->WHPCR &= ~(LTDC_LxWHPCR_WHSTPOS | LTDC_LxWHPCR_WHSPPOS); + LTDC_LAYER(hltdc, LayerIdx)->WHPCR = ((pLayerCfg->WindowX0 + ((hltdc->Instance->BPCR & LTDC_BPCR_AHBP) >> 16U) + 1U) | tmp); + + /* Configure the vertical start and stop position */ + tmp = ((pLayerCfg->WindowY1 + (hltdc->Instance->BPCR & LTDC_BPCR_AVBP)) << 16); + LTDC_LAYER(hltdc, LayerIdx)->WVPCR &= ~(LTDC_LxWVPCR_WVSTPOS | LTDC_LxWVPCR_WVSPPOS); + LTDC_LAYER(hltdc, LayerIdx)->WVPCR = ((pLayerCfg->WindowY0 + (hltdc->Instance->BPCR & LTDC_BPCR_AVBP) + 1U) | tmp); + + /* Specifies the pixel format */ + LTDC_LAYER(hltdc, LayerIdx)->PFCR &= ~(LTDC_LxPFCR_PF); + LTDC_LAYER(hltdc, LayerIdx)->PFCR = (pLayerCfg->PixelFormat); + + /* Configure the default color values */ + tmp = ((uint32_t)(pLayerCfg->Backcolor.Green) << 8); + tmp1 = ((uint32_t)(pLayerCfg->Backcolor.Red) << 16); + tmp2 = (pLayerCfg->Alpha0 << 24); + LTDC_LAYER(hltdc, LayerIdx)->DCCR &= ~(LTDC_LxDCCR_DCBLUE | LTDC_LxDCCR_DCGREEN | LTDC_LxDCCR_DCRED | LTDC_LxDCCR_DCALPHA); + LTDC_LAYER(hltdc, LayerIdx)->DCCR = (pLayerCfg->Backcolor.Blue | tmp | tmp1 | tmp2); + + /* Specifies the constant alpha value */ + LTDC_LAYER(hltdc, LayerIdx)->CACR &= ~(LTDC_LxCACR_CONSTA); + LTDC_LAYER(hltdc, LayerIdx)->CACR = (pLayerCfg->Alpha); + + /* Specifies the blending factors */ + LTDC_LAYER(hltdc, LayerIdx)->BFCR &= ~(LTDC_LxBFCR_BF2 | LTDC_LxBFCR_BF1); + LTDC_LAYER(hltdc, LayerIdx)->BFCR = (pLayerCfg->BlendingFactor1 | pLayerCfg->BlendingFactor2); + + /* Configure the color frame buffer start address */ + LTDC_LAYER(hltdc, LayerIdx)->CFBAR &= ~(LTDC_LxCFBAR_CFBADD); + LTDC_LAYER(hltdc, LayerIdx)->CFBAR = (pLayerCfg->FBStartAdress); + + if(pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888) + { + tmp = 4; + } + else if (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_RGB888) + { + tmp = 3; + } + else if((pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \ + (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \ + (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_ARGB1555) || \ + (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_AL88)) + { + tmp = 2; + } + else + { + tmp = 1; + } + + /* Configure the color frame buffer pitch in byte */ + LTDC_LAYER(hltdc, LayerIdx)->CFBLR &= ~(LTDC_LxCFBLR_CFBLL | LTDC_LxCFBLR_CFBP); + LTDC_LAYER(hltdc, LayerIdx)->CFBLR = (((pLayerCfg->ImageWidth * tmp) << 16) | (((pLayerCfg->WindowX1 - pLayerCfg->WindowX0) * tmp) + 3)); + /* Configure the frame buffer line number */ + LTDC_LAYER(hltdc, LayerIdx)->CFBLNR &= ~(LTDC_LxCFBLNR_CFBLNBR); + LTDC_LAYER(hltdc, LayerIdx)->CFBLNR = (pLayerCfg->ImageHeight); + + /* Enable LTDC_Layer by setting LEN bit */ + LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_LEN; +} + +/** + * @} + */ + +#endif /* HAL_LTDC_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_mdac.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_mdac.c new file mode 100644 index 0000000000..809acb6b7a --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_mdac.c @@ -0,0 +1,323 @@ +/****************************************************************************** +* @file : hal_mdac.c +* @version : 1.0 +* @date : 2023.10.16 +* @brief : MDAC HAL module driver +******************************************************************************/ +#include "hal.h" + +#ifdef HAL_MDAC_MODULE_ENABLED + +/****************************************************************************** +* @brief : Initialize the MDAC MSP. +* @param : hmdac : pointer to a MDAC_HandleTypeDef structure that contains +* the configuration information for MDAC module. +* @return: none +******************************************************************************/ +__weak void HAL_MDAC_MspInit(MDAC_HandleTypeDef *hmdac) +{ + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_MDAC_MspInit can be implemented in the user file + */ + UNUSED(hmdac); +} + +/****************************************************************************** +* @brief : MDAC MSP De-Initialization. +* @param : hmdac : pointer to a MDAC_HandleTypeDef structure that contains +* the configuration information for MDAC module. +* @return: none +******************************************************************************/ +__weak void HAL_MDAC_MspDeInit(MDAC_HandleTypeDef* hmdac) +{ + /* + NOTE : This function should be modified by the user. + the HAL_MDAC_MspDeInit can be implemented in the user file. + */ + UNUSED(hmdac); + +} + +/****************************************************************************** +* @brief : Initializes the MDAC peripheral according to the specified parameters in the MDAC_HandleTypeDef. +* @param : hdac : pointer to a MDAC_HandleTypeDef structure that contains +* the configuration information for MDAC module. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_MDAC_Init(MDAC_HandleTypeDef *hmdac) +{ + /* Check the parameters */ + assert_param(IS_MDAC_INSTANCE(hmdac->Instance)); + + __HAL_RCC_MDAC_RESET(); + + __HAL_RCC_MDAC_CLK_ENABLE(); + + HAL_MDAC_MspInit(hmdac); + + return HAL_OK; +} + +/****************************************************************************** +* @brief : Deinitialize the MDAC peripheral registers to their default reset values. +* @param : hdac : pointer to a MDAC_HandleTypeDef structure that contains +* the configuration information for MDAC module. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_MDAC_DeInit(MDAC_HandleTypeDef *hmdac) +{ + /* Check the parameters */ + assert_param(IS_MDAC_INSTANCE(hmdac->Instance)); + + HAL_MDAC_MspDeInit(hmdac); + + __HAL_RCC_MDAC_CLK_DISABLE(); + + return HAL_OK; +} + +/****************************************************************************** +* @brief : Configures the selected MDAC voltage channel. +* @param : hmdac : pointer to a MDAC_HandleTypeDef structure that contains +* the configuration information for MDAC module. +* @param : Config : MDAC voltage channel configuration structure +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_MDAC_ConfigVoltageChannel(MDAC_HandleTypeDef* hmdac, uint32_t Channel, VDAC_ChannelConfigTypeDef* Config) +{ + /* Check the parameters */ + assert_param(IS_MDAC_INSTANCE(hmdac->Instance)); + assert_param(IS_VDAC_CHANNEL_NUM(Channel)); + assert_param(IS_VDAC_BUFFER_MODE(Config->BufferMode)); + + if(Config->SampleEn) + { + hmdac->Instance->VDACx_CTRL[Channel] |= MDAC_VDACX_CR_SAMPLE_EN; + } + else + { + hmdac->Instance->VDACx_CTRL[Channel] &= ~MDAC_VDACX_CR_SAMPLE_EN; + } + + /* config the Voltage DAC buffer mode. Note; config buffer mode before setting VDACx_CTRL.EN */ + MODIFY_REG(hmdac->Instance->VDACx_CTRL[Channel], MDAC_VDACX_CR_MODE_Msk, Config->BufferMode << MDAC_VDACX_CR_MODE_Pos); + + if(Config->SelfCalibrateEn) + { + HAL_MDAC_VoltageSelfcalibrate(hmdac, Channel); + } + else + { + /* factory trimming in NVR,read to DAC_CCR */ + uint8_t trim_val; + HAL_StatusTypeDef ret; + ret = HAL_EFUSE_ReadByte(EFUSE1, 0x7A + Channel, &trim_val, 100000); + + if(ret == HAL_OK) + MODIFY_REG(hmdac->Instance->VDACx_CTRL[Channel], MDAC_VDACX_CR_OTRIM_Msk, trim_val << MDAC_VDACX_CR_OTRIM_Pos); + } + + SET_BIT(hmdac->Instance->VDACx_CTRL[Channel], MDAC_VDACX_CR_EN); + + return HAL_OK; +} + +/****************************************************************************** +* @brief : Configures the selected MDAC current channel. +* @param : hmdac : pointer to a MDAC_HandleTypeDef structure that contains +* the configuration information for MDAC module. +* @param : Config : MDAC current channel configuration structure +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_MDAC_ConfigCurrentChannel(MDAC_HandleTypeDef* hmdac, uint32_t Channel, IDAC_ChannelConfigTypeDef* Config) +{ + /* Check the parameters */ + assert_param(IS_MDAC_INSTANCE(hmdac->Instance)); + assert_param(IS_IDAC_ITURN(Config->ITurn)); + assert_param(IS_IDAC_CHANNEL_NUM(Channel)); + + if(Config->ITurn == ITURN_FACTORY) + { + uint8_t iturn_val; + HAL_StatusTypeDef ret; + ret = HAL_EFUSE_ReadByte(EFUSE1, 0x86 + Channel, &iturn_val, 100000); + + if(ret == HAL_OK) + MODIFY_REG(hmdac->Instance->IDACx_CTRL[Channel], MDAC_IDACX_CR_ITURE_Msk, iturn_val << MDAC_IDACX_CR_ITURE_Pos); + } + else + { + MODIFY_REG(hmdac->Instance->IDACx_CTRL[Channel], MDAC_IDACX_CR_ITURE_Msk, Config->ITurn << MDAC_IDACX_CR_ITURE_Pos); + } + + SET_BIT(hmdac->Instance->IDACx_CTRL[Channel], MDAC_IDACX_CR_EN); + + return HAL_OK; +} + + +/****************************************************************************** +* @brief : Set the specified value for MDAC voltage channel. +* @param : hmdac : pointer to a MDAC_HandleTypeDef structure that contains +* the configuration information for MDAC module. +* @param : Channel : MDAC voltage channel index. +* @param : Data: The destination peripheral data. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_MDAC_SetVoltageValue(MDAC_HandleTypeDef *hmdac, uint32_t Channel, uint32_t Data) +{ + /* Check the parameters */ + assert_param(IS_MDAC_INSTANCE(hmdac->Instance)); + assert_param(IS_VDAC_CHANNEL_NUM(Channel)); + + hmdac->Instance->DACx_DOR[Channel] = Data; + + return HAL_OK; +} + +/****************************************************************************** +* @brief : Returns the last data output value of the selected MDAC voltage channel. +* @param : hmdac : pointer to a MDAC_HandleTypeDef structure that contains +* the configuration information for MDAC module. +* @param : Channel : MDAC voltage channel index. +* @return: The selected MDAC voltage channel data output value +******************************************************************************/ +uint32_t HAL_MDAC_GetVoltageValue(MDAC_HandleTypeDef* hmdac, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_MDAC_INSTANCE(hmdac->Instance)); + assert_param(IS_VDAC_CHANNEL_NUM(Channel)); + + return hmdac->Instance->DACx_DOR[Channel]; + +} + +/****************************************************************************** +* @brief : Set the specified value for MDAC current channel. +* @param : hmdac : pointer to a MDAC_HandleTypeDef structure that contains +* the configuration information for MDAC module. +* @param : Channel : MDAC current channel index. +* @param : Data: The destination peripheral data. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_MDAC_SetCurrentValue(MDAC_HandleTypeDef *hmdac, uint32_t Channel, uint32_t Data) +{ + /* Check the parameters */ + assert_param(IS_MDAC_INSTANCE(hmdac->Instance)); + assert_param(IS_IDAC_CHANNEL_NUM(Channel)); + + hmdac->Instance->DACx_DOR[12 + Channel] = Data; + + /* Return function status */ + return HAL_OK; +} + +/****************************************************************************** +* @brief : Returns the last data output value of the selected MDAC current channel. +* @param : hmdac : pointer to a MDAC_HandleTypeDef structure that contains +* the configuration information for MDAC module. +* @param : Channel : MDAC current channel index. +* @return: The selected MDAC current channel data output value +******************************************************************************/ +uint32_t HAL_MDAC_GetCurrentValue(MDAC_HandleTypeDef* hmdac, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_MDAC_INSTANCE(hmdac->Instance)); + assert_param(IS_IDAC_CHANNEL_NUM(Channel)); + + return hmdac->Instance->DACx_DOR[12 + Channel]; + +} + +/****************************************************************************** +* @brief : Run the self calibration of one voltage DAC channel. +* @param : hmdac : pointer to a MDAC_HandleTypeDef structure that contains +* the configuration information for MDAC module. +* @param : Channel : The selected MDAC voltage channel. +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_MDAC_VoltageSelfcalibrate(MDAC_HandleTypeDef *hmdac, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_MDAC_INSTANCE(hmdac->Instance)); + assert_param(IS_VDAC_CHANNEL_NUM(Channel)); + + uint32_t TrimVal; + uint32_t ChannelEn; + + ChannelEn = READ_BIT((hmdac->Instance->VDACx_CTRL[Channel]), MDAC_VDACX_CR_EN); + + if(!ChannelEn) + SET_BIT((hmdac->Instance->VDACx_CTRL[Channel]), MDAC_VDACX_CR_EN); + + SET_BIT((hmdac->Instance->VDACx_CTRL[Channel]), MDAC_VDACX_CR_CEN); + + for(TrimVal = 0; TrimVal < 32; TrimVal++) + { + /* Set candidate trimming */ + MODIFY_REG(hmdac->Instance->VDACx_CTRL[Channel], MDAC_VDACX_CR_OTRIM_Msk, TrimVal << MDAC_VDACX_CR_OTRIM_Pos); + + HAL_SimpleDelay(50000); + + if(READ_BIT((hmdac->Instance->VDACx_CTRL[Channel]), MDAC_VDACX_CR_CAL_FLAG)) + break; + } + + CLEAR_BIT((hmdac->Instance->VDACx_CTRL[Channel]), MDAC_VDACX_CR_CEN); + + if(!ChannelEn) + CLEAR_BIT((hmdac->Instance->VDACx_CTRL[Channel]), MDAC_VDACX_CR_EN); + + if(TrimVal > 31) + { + /* Restore the original TrimVal */ + + return HAL_ERROR; + } + + return HAL_OK; +} + + + +/****************************************************************************** +* @brief : Set the trimming mode and trimming value (user trimming mode applied). +* @param : hmdac : pointer to a MDAC_HandleTypeDef structure that contains +* the configuration information for MDAC module. +* @param : Channel : The selected MDAC voltage channel. +* @param : TrimVal: VDAC trim value +* @return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_MDAC_SetVoltageTrim(MDAC_HandleTypeDef *hmdac, uint32_t Channel, uint32_t TrimVal) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_MDAC_INSTANCE(hmdac->Instance)); + assert_param(IS_VDAC_CHANNEL_NUM(Channel)); + assert_param(IS_VDAC_TRIM_VALUE(TrimVal)); + + MODIFY_REG(hmdac->Instance->VDACx_CTRL[Channel], MDAC_VDACX_CR_OTRIM_Msk, TrimVal << MDAC_VDACX_CR_OTRIM_Pos); + + return HAL_OK; +} + +/****************************************************************************** +* @brief : Return the MDAC voltage trim value. +* @param : hmdac : pointer to a MDAC_HandleTypeDef structure that contains +* the configuration information for MDAC module. +* @param : Channel : The selected MDAC voltage channel. +* @return: The trim value of selected voltage channel. +******************************************************************************/ +uint32_t HAL_MDAC_GetVoltageTrimValue(MDAC_HandleTypeDef *hmdac, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_MDAC_INSTANCE(hmdac->Instance)); + assert_param(IS_VDAC_CHANNEL_NUM(Channel)); + + /* Retrieve trimming */ + return ((hmdac->Instance->VDACx_CTRL[Channel] & MDAC_VDACX_CR_OTRIM_Msk) >> MDAC_VDACX_CR_OTRIM_Pos); +} + +#endif + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_nand.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_nand.c new file mode 100644 index 0000000000..2675ff1c5b --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_nand.c @@ -0,0 +1,467 @@ +/* + ****************************************************************************** + * @file hal_nand.c + * @author AisinoChip Firmware Team + * @version V1.0.0 + * @date 2020 + * @brief Nand HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (UART). + * @ Initialization and de-initialization functions + * @ IO operation functions + * @ Peripheral Control functions + ****************************************************************************** + * @attention + * + * Copyright (c) 2020 AisinoChip. + * All rights reserved. + ****************************************************************************** +*/ +#include "hal.h" + +#ifdef HAL_NAND_MODULE_ENABLED + +volatile uint8_t flag_nand_int = 0; +void WaitFlashReady(void); +/****************************************************************************** +*@brief : FMC callback. +*@ret : None +******************************************************************************/ +__weak void HAL_FMC_NAND_Callback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FMC_NAND_Callback could be implemented in the user file + */ +} + +/****************************************************************************** +*@brief : BCH callback. +*@ret : None +******************************************************************************/ +__weak void HAL_BCH_Callback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_BCH_Callback could be implemented in the user file + */ +} + + +void FMC_NAND_IRQHandler(void) +{ + HAL_FMC_NAND_Callback(); +} + +void BCH_IRQHandler(void) +{ + HAL_BCH_Callback(); +} + + +/****************************************************************************** +*@brief : Initialize nand according to the specified parameters in hnand. +* +*@param : hnand: handle with nand parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_Init(FMC_NAND_HandleTypeDef *hnand) +{ + assert_param (IS_FMC_NAND_ALL_INSTANCE(hnand->Instance)); + assert_param (IS_FMC_NAND_EDO_EN(hnand->Init.EDO_EN)); + assert_param (IS_FMC_NAND_ENDIAN_EN(hnand->Init.ENDIAN)); + assert_param (IS_FMC_NAND_FCE_EN(hnand->Init.FCE)); + + __HAL_RCC_FMC_CLK_ENABLE(); + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_FMC_NAND_MspInit(hnand); + + hnand->Instance->CTRL = hnand->Init.EDO_EN | hnand->Init.RBN_INTEN | hnand->Init.ENDIAN | hnand->Init.FWP | hnand->Init.FCE; + hnand->Instance->WST = hnand->Init.TADL | hnand->Init.TRHW | hnand->Init.TWHR | hnand->Init.TREH | hnand->Init.TRP | hnand->Init.TWH | hnand->Init.TWP; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initialize the nand MSP: CLK, GPIO, NVIC +* +*@param : hnand: handle with nand parameters. +*@return: None +******************************************************************************/ +__weak void HAL_FMC_NAND_MspInit(FMC_NAND_HandleTypeDef *hnand) +{ + /* + NOTE : This function is implemented in user xxx_hal_msp.c + */ + + GPIO_InitTypeDef GPIO_InitStructure; + + /* ʹnandصGPIOʱ */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOG_CLK_ENABLE(); + + /*-- GPIO -----------------------------------------------------*/ + + /* ͨ GPIO */ + GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;//Ϊù + GPIO_InitStructure.Pull = GPIO_PULLUP; + GPIO_InitStructure.Alternate = GPIO_FUNCTION_10;//AF10 + GPIO_InitStructure.Drive = GPIO_DRIVE_LEVEL7; + + /*D[0:7]ź */ + GPIO_InitStructure.Pin = FMC_NAND_D0_GPIO_PIN; + HAL_GPIO_Init(FMC_NAND_D0_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = FMC_NAND_D1_GPIO_PIN; + HAL_GPIO_Init(FMC_NAND_D1_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = FMC_NAND_D2_GPIO_PIN; + HAL_GPIO_Init(FMC_NAND_D2_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = FMC_NAND_D3_GPIO_PIN; + HAL_GPIO_Init(FMC_NAND_D3_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = FMC_NAND_D4_GPIO_PIN; + HAL_GPIO_Init(FMC_NAND_D4_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = FMC_NAND_D5_GPIO_PIN; + HAL_GPIO_Init(FMC_NAND_D5_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = FMC_NAND_D6_GPIO_PIN; + HAL_GPIO_Init(FMC_NAND_D6_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = FMC_NAND_D7_GPIO_PIN; + HAL_GPIO_Init(FMC_NAND_D7_GPIO_PORT, &GPIO_InitStructure); + + /*ź*/ + GPIO_InitStructure.Pin = FMC_NAND_CEN_GPIO_PIN; //Ƭѡź + HAL_GPIO_Init(FMC_NAND_CEN_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = FMC_NAND_WEN_GPIO_PIN; //WEN + HAL_GPIO_Init(FMC_NAND_WEN_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = FMC_NAND_REN_GPIO_PIN; //REN + HAL_GPIO_Init(FMC_NAND_REN_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = FMC_NAND_CLE_GPIO_PIN; //CLE + HAL_GPIO_Init(FMC_NAND_CLE_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = FMC_NAND_ALE_GPIO_PIN; //ALE + HAL_GPIO_Init(FMC_NAND_ALE_GPIO_PORT, &GPIO_InitStructure); + + + GPIO_InitStructure.Alternate = GPIO_FUNCTION_11; //AF11 + + + GPIO_InitStructure.Pin = FMC_NAND_CEN_GPIO_PIN; //Ƭѡź + HAL_GPIO_Init(FMC_NAND_CEN_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = FMC_NAND_RBN_GPIO_PIN; //RBN + HAL_GPIO_Init(FMC_NAND_RBN_GPIO_PORT, &GPIO_InitStructure); + +} + +/****************************************************************************** +*@brief : Wait for Flash RBN rising event +* +*@param : hnand: handle with nand parameters. +*@return: None +******************************************************************************/ +static HAL_StatusTypeDef HAL_FMC_NAND_WaitFlashReady(FMC_NAND_HandleTypeDef *hnand) +{ + assert_param (IS_FMC_NAND_ALL_INSTANCE(hnand->Instance)); + + /* wait nand not busy*/ + while(READ_BIT(hnand->Instance->STATUS, FMC_NAND_STATUS_POS_RBN_0) == 0){;} + SET_BIT(hnand->Instance->STATUS, FMC_NAND_STATUS_POS_RBN_0); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Reset Nand Flash +* +*@param : hnand: handle with nand parameters. +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_FlashReset(FMC_NAND_HandleTypeDef *nand) +{ + assert_param (IS_FMC_NAND_ALL_INSTANCE(nand->Instance)); + + /* clear CE0 */ + CLEAR_BIT(nand->Instance->CTRL, FMC_NAND_CTRL_FCE_0); + /* write RESET CMD */ + nand->Instance->CMD = FMC_NAND_CMD_RESET; + HAL_FMC_NAND_WaitFlashReady(nand); + + /* release CE0 */ + SET_BIT(nand->Instance->CTRL, FMC_NAND_CTRL_FCE_0); + return HAL_OK; +} + +/****************************************************************************** +*@brief : Read ID from Nand Flash +* +*@param : hnand: handle with nand parameters. +*@param : rdata: start address to store ID +*@param : lenth: ID length +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_FlashGetID(FMC_NAND_HandleTypeDef *hnand, uint8_t rdata[], uint8_t lenth) +{ + uint8_t i; + + assert_param (IS_FMC_NAND_ALL_INSTANCE(hnand->Instance)); + + /* clear CE0 */ + CLEAR_BIT(hnand->Instance->CTRL, FMC_NAND_CTRL_FCE_0); + + /* write READ ID CMD */ + hnand->Instance->CMD = FMC_NAND_CMD_ID; + /* write address 00 */ + hnand->Instance->ADDR = 0x00; + + for(i = 0; i < lenth; i++) + { + *rdata++ = FMC_NAND->FMC_NAND_NECCDATA.FMC_NAND_NECCDATA_CH8; + } + + /* release CE0 */ + SET_BIT(hnand->Instance->CTRL, FMC_NAND_CTRL_FCE_0); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Erase a block +* +*@param : hnand: handle with nand parameters. +*@param : BlockAddr: start address of the block to erase +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_FlashErase(FMC_NAND_HandleTypeDef *hnand, uint32_t BlockAddr) +{ + assert_param (IS_FMC_NAND_ALL_INSTANCE(hnand->Instance)); + + /* clear CE0 */ + CLEAR_BIT(hnand->Instance->CTRL, FMC_NAND_CTRL_FCE_0); + + hnand->Instance->CMD = FMC_NAND_CMD_ERASE1; + hnand->Instance->ADDR = BlockAddr & 0xff; + hnand->Instance->ADDR = (BlockAddr >> 8) & 0xff; + hnand->Instance->ADDR = (BlockAddr >> 16) & 0xff; + + hnand->Instance->CMD = FMC_NAND_CMD_ERASE2; + HAL_FMC_NAND_WaitFlashReady(hnand); + + /* release CE0 */ + SET_BIT(hnand->Instance->CTRL, FMC_NAND_CTRL_FCE_0); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Program one sector(512 bytes) +* +*@param : hnand: handle with nand parameters. +*@param : RowAddr: row start address +*@param : ColumnAddr: column start address +*@param : wdata: start address of data to program +*@param : ecc_en:select the mode of program + BCH_ECC_MODE_EN : program with ecc mode + BCH_ECC_MODE_DIS: progran with no ecc mode +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_Flash_Program(FMC_NAND_HandleTypeDef *hnand, uint32_t RowAddr, uint16_t ColumnAddr, uint8_t wdata[], uint8_t ecc_en) +{ + uint32_t i; + uint32_t temp; + assert_param (IS_FMC_NAND_ALL_INSTANCE(hnand->Instance)); + + /* clear CE0 */ + CLEAR_BIT(hnand->Instance->CTRL, FMC_NAND_CTRL_FCE_0); + + hnand->Instance->CMD = FMC_NAND_CMD_PROGRAM1; + + hnand->Instance->ADDR = (uint8_t)ColumnAddr; // Column address + hnand->Instance->ADDR = (uint8_t)(ColumnAddr >> 8); // Column address + hnand->Instance->ADDR = (uint8_t)RowAddr; // Page address + hnand->Instance->ADDR = (uint8_t)(RowAddr >> 8); // Page address + hnand->Instance->ADDR = (uint8_t)(RowAddr >> 16); // Page address + + /* ECC Channel */ + if(BCH_ECC_MODE_EN == ecc_en) + { + /* BCH encode mode */ + CLEAR_BIT(hnand->Instance->BCH_CTRL, FMC_NAND_BCH_CTRL_MODE); + + /* Reset Encode Channel */ //reset encode channel + SET_BIT(hnand->Instance->BCH_STATUS, FMC_NAND_BCH_STATUS_ENCODE_CLR); + + for(i = 0; i < (BCH_SECTOR_SIZE + BCH_INF_SIZE); i++) + { + hnand->Instance->FMC_NAND_ECCDATA.FMC_NAND_ECCDATA_CH8 = wdata[i]; + } + + /* Reset BCH Code PTR */ + hnand->Instance->BCH_CODEPTR = 0; + for(i = 0; i < BCH_ECC_SIZE; i++) + { + hnand->Instance->FMC_NAND_ECCDATA.FMC_NAND_ECCDATA_CH8 = FMC_NAND->BCH_CODE.FMC_NAND_BCHCODE_CH8; + } + } + else + { + for(i = 0; i < BCH_SECTOR_SIZE; i++) + { + hnand->Instance->FMC_NAND_NECCDATA.FMC_NAND_NECCDATA_CH8 = wdata[i]; ;//no ecc channel + } + } + hnand->Instance->CMD = FMC_NAND_CMD_PROGRAM2; + HAL_FMC_NAND_WaitFlashReady(hnand); + + /* release CE0 */ + SET_BIT(hnand->Instance->CTRL, FMC_NAND_CTRL_FCE_0); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Program one sector(512 bytes) using necc channel and ecc data +* +*@param : hnand: handle with nand parameters. +*@param : RowAddr: row start address +*@param : ColumnAddr: column start address +*@param : wdata: start address of data to program +*@param : pEccByte: input ecc data +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_Flash_Program_NECC_with_ECC_CODE(FMC_NAND_HandleTypeDef *hnand, uint32_t RowAddr, uint16_t ColumnAddr, uint8_t wdata[], uint8_t pEccByte[]) +{ + uint32_t i; + uint32_t temp; + assert_param (IS_FMC_NAND_ALL_INSTANCE(hnand->Instance)); + + /* clear CE0 */ + CLEAR_BIT(hnand->Instance->CTRL, FMC_NAND_CTRL_FCE_0); + + hnand->Instance->CMD = FMC_NAND_CMD_PROGRAM1; + + hnand->Instance->ADDR = (uint8_t)ColumnAddr; // Column address + hnand->Instance->ADDR = (uint8_t)(ColumnAddr >> 8); // Column address + hnand->Instance->ADDR = (uint8_t)RowAddr; // Page address + hnand->Instance->ADDR = (uint8_t)(RowAddr >> 8); // Page address + hnand->Instance->ADDR = (uint8_t)(RowAddr >> 16); // Page address + + + for(i = 0; i < (BCH_SECTOR_SIZE + BCH_INF_SIZE); i++) + { + hnand->Instance->FMC_NAND_NECCDATA.FMC_NAND_NECCDATA_CH8 = wdata[i]; ;//write data using no ecc channel + } + for(i = 0; i < BCH_ECC_SIZE; i++) + { + hnand->Instance->FMC_NAND_NECCDATA.FMC_NAND_NECCDATA_CH8 = pEccByte[i]; ;//write ecc data + } + + hnand->Instance->CMD = FMC_NAND_CMD_PROGRAM2; + HAL_FMC_NAND_WaitFlashReady(hnand); + + /* release CE0 */ + SET_BIT(hnand->Instance->CTRL, FMC_NAND_CTRL_FCE_0); + + return HAL_OK; +} + + +/****************************************************************************** +*@brief : Read one sector(512 bytes) +* +*@param : hnand: handle with nand parameters. +*@param : RowAddr: row start address +*@param : ColumnAddr: column start address +*@param : rdata: start address of read data +*@param : ecc_en:select the mode of read + BCH_ECC_MODE_EN : read with ecc mode + BCH_ECC_MODE_DIS: read with no ecc mode +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_FlashRead(FMC_NAND_HandleTypeDef *hnand, uint32_t RowAddr, uint16_t ColumnAddr, uint8_t rdata[], uint8_t auto_sel) +{ + int i; + + assert_param (IS_FMC_NAND_ALL_INSTANCE(hnand->Instance)); + + /* clear CE0 */ + CLEAR_BIT(hnand->Instance->CTRL, FMC_NAND_CTRL_FCE_0); + + hnand->Instance->CMD = FMC_NAND_CMD_READ1; + hnand->Instance->ADDR = (uint8_t)ColumnAddr; // Column address + hnand->Instance->ADDR = (uint8_t)(ColumnAddr >> 8); // Column address + hnand->Instance->ADDR = (uint8_t)RowAddr; // Page address + hnand->Instance->ADDR = (uint8_t)(RowAddr >> 8); // Page address + hnand->Instance->ADDR = (uint8_t)(RowAddr >> 16); // Page address + + hnand->Instance->CMD = FMC_NAND_CMD_READ2; + + HAL_FMC_NAND_WaitFlashReady(hnand); + + if(BCH_ECC_MODE_EN == auto_sel) + { + /* BCH decode mode */ + SET_BIT(hnand->Instance->BCH_CTRL, FMC_NAND_BCH_CTRL_MODE); + + /* Auto Correct */ + SET_BIT(hnand->Instance->BCH_CTRL, FMC_NAND_BCH_CTRL_AUTO_CORRECT); + + /* SRAM Base */ + hnand->Instance->BCH_BASEADDR = (uint32_t)rdata; + + /* ECC Channel */ + for(i = 0; i < (BCH_SECTOR_SIZE + BCH_INF_SIZE + BCH_ECC_SIZE); i++) + { + rdata[i] = hnand->Instance->FMC_NAND_ECCDATA.FMC_NAND_ECCDATA_CH8; + } + + /* Wait Correct Done */ + while(READ_BIT(hnand->Instance->BCH_STATUS, FMC_NAND_BCH_STATUS_CORRECT_DONE) == 0){;} + /* Clear Flag */ + SET_BIT(hnand->Instance->BCH_STATUS, FMC_NAND_BCH_STATUS_CORRECT_DONE); + + if(READ_BIT(hnand->Instance->BCH_STATUS, FMC_NAND_BCH_STATUS_BCH_FAIL)) + { + /* Clear Error Flag */ + SET_BIT(hnand->Instance->BCH_STATUS, FMC_NAND_BCH_STATUS_BCH_FAIL); + /* release CE0 */ + SET_BIT(hnand->Instance->CTRL, FMC_NAND_CTRL_FCE_0); + + return HAL_ERROR; + } + } + else + { + for(i = 0; i < BCH_SECTOR_SIZE; i++) // + { + rdata[i] = FMC_NAND->FMC_NAND_NECCDATA.FMC_NAND_NECCDATA_CH8;//REG_NFM_NECC_CH8; + } + + } + + /* release CE0 */ + SET_BIT(hnand->Instance->CTRL, FMC_NAND_CTRL_FCE_0); + return HAL_OK; +} + +/****************************************************************************** +*@brief : Reset ECC Channel +* +*@return: None +******************************************************************************/ +HAL_StatusTypeDef HAL_FMC_NAND_Reset_ECC_Channel(FMC_NAND_HandleTypeDef *hnand) +{ + /* Reset Channel */ + SET_BIT(hnand->Instance->BCH_CTRL, FMC_NAND_BCH_CTRL_RESET_CHANNEL); + return HAL_OK; +} + +#endif + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_norflash.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_norflash.c new file mode 100644 index 0000000000..f1d153543c --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_norflash.c @@ -0,0 +1,728 @@ +/***************************************************************** +Copyright(C) 2008 - 2021, Shanghai AisinoChip Co.,Ltd. +@ļ: hal_norflash.c +@: norflashģ麯 +@Ա: bobzhang +@: 2023.1.18 +@ǰ汾: 1.0 +@޸ļ¼: +޸ ޸ ޸˵ + +******************************************************************/ + +/***************************************************************** +ע⣺ʹ HAL_NORFLASH_ModifyData Ҫջ6KBϡ +Ϊ HAL_NORFLASH_ModifyData ڲʹ4KBջռ䣬ݡ +******************************************************************/ + +#include "hal_norflash.h" + +#ifdef HAL_NORFLASH_MODULE_ENABLED + +static uint8_t HAL_NORFLASH_EraseSector(uint32_t addr); +static uint8_t HAL_NORFLASH_EraseBlock32K(uint32_t addr); +static uint8_t HAL_NORFLASH_EraseBlock64K(uint32_t addr); +static uint8_t HAL_NORFLASH_ProgramPage(uint32_t addr, uint8_t *buff, uint32_t len); + + + +//NORFLASH_ParamTypeDef NORFLASH_param = {0x200000, READ_DATA, 0, PAGE_PROGARM}; +NORFLASH_ParamTypeDef NORFLASH_param = {0x200000, QUAD_IO_FAST_READ, 0x02, QUAD_PAGE_PROGRAM}; + +uint32_t HAL_NORFLASH_EnterCritical(void) +{ + uint32_t sr; + sr = __get_PRIMASK(); + __set_PRIMASK(1); + SCB->ICSR = BIT25; // clear systick pending bit + return sr; +} + +void HAL_NORFLASH_ExitCritical(uint32_t sr) +{ + __set_PRIMASK(sr&0x01); +} + + + +/***************************************************************** +@ NORFLASHʼ +@ +@ HAL_OK-ɹ,HAL_ERROR-ʧ +******************************************************************/ +uint8_t HAL_NORFLASH_Init(void) +{ +// uint32_t sr; +// uint8_t paramBuff[32],ret; +// SPI_Flash_Parameter spiflashParam; +// +// spiflashParam.Command = READ_DATA; +// spiflashParam.Delay = NORFLASH_OPRA_DELAY; +// spiflashParam.Cont_MID = 0; +// spiflashParam.Dummy_bytes = 0; +// spiflashParam.Addr = 0; +// spiflashParam.Addr_Length = 24; +// spiflashParam.Operation_length = 32; +// spiflashParam.Output_data = paramBuff; +// sr = HAL_NORFLASH_EnterCritical(); +// ret = SPI_Nor_Get_Parameter(&spiflashParam); +// HAL_NORFLASH_ExitCritical(sr); +// if(ret) +// { +// return HAL_ERROR; +// } +// +// NORFLASH_param.chipSize = (paramBuff[4] | (paramBuff[5] << 8) | (paramBuff[6] << 16) | (paramBuff[7] << 24)); +// if(paramBuff[10]!=0) +// { +// NORFLASH_param.readCmd = paramBuff[10]; +// NORFLASH_param.readDummyBytes = paramBuff[11]; +// } +// else if(paramBuff[12]!=0) +// { +// NORFLASH_param.readCmd = paramBuff[12]; +// NORFLASH_param.readDummyBytes = paramBuff[13]; +// } +// else if(paramBuff[14]!=0) +// { +// NORFLASH_param.readCmd = paramBuff[14]; +// NORFLASH_param.readDummyBytes = paramBuff[15]; +// } +// else if(paramBuff[16]!=0) +// { +// NORFLASH_param.readCmd = paramBuff[16]; +// NORFLASH_param.readDummyBytes = paramBuff[17]; +// } +// else +// { +// NORFLASH_param.readCmd = READ_DATA; +// NORFLASH_param.readDummyBytes = 0; +// } +// +// if(paramBuff[23]!=0) +// { +// NORFLASH_param.programCmd = paramBuff[23]; +// } +// else if(paramBuff[22]!=0) +// { +// NORFLASH_param.programCmd = paramBuff[22]; +// } +// else +// { +// NORFLASH_param.programCmd = PAGE_PROGARM; +// } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : read Unique ID. +*@param : buff: save Unique ID. +*@param : len: len of Unique ID. +*@return: HAL_OK,HAL_ERROR +******************************************************************************/ +//9FH +uint8_t HAL_NORFLASH_ReadUniqueID(uint8_t *buff,uint32_t len) +{ + uint32_t sr; + uint8_t ret; + SPI_Flash_Parameter spiflashParam; + + spiflashParam.SPI_Instance = (uint32_t)SPI7; + spiflashParam.Command = SPI_READ_UNIQUE_ID; + spiflashParam.Delay = 0xFF; + spiflashParam.Operation_length = len; + spiflashParam.Output_data_Addr = (uint32_t)buff; + spiflashParam.Dummy_clks = 8; + + sr = HAL_NORFLASH_EnterCritical(); + ret=SPI_Nor_Read_Unique_ID(&spiflashParam); + HAL_NORFLASH_ExitCritical(sr); + if(ret) + { + return HAL_ERROR; + } + return HAL_OK; +} + + +/****************************************************************************** +*@brief : read Manufacture ID , Device ID. +*@param : buff: save Manufacture ID , Device ID.length is 2. +*@return: HAL_OK,HAL_ERROR +******************************************************************************/ +// 9FH 3 byte +uint8_t HAL_NORFLASH_ReadID(uint8_t *buff) +{ + uint32_t sr; + uint8_t ret; + SPI_Flash_Parameter spiflashParam; + + spiflashParam.SPI_Instance = (uint32_t)SPI7; + spiflashParam.Command = SPI_READ_ID_1S0S1S; + spiflashParam.Delay = 0xFF; + spiflashParam.Dummy_clks = 0; + spiflashParam.Operation_length = 3; + spiflashParam.Output_data_Addr = (uint32_t)buff; + sr = HAL_NORFLASH_EnterCritical(); + ret=SPI_Nor_Read_MID_DID(&spiflashParam); + HAL_NORFLASH_ExitCritical(sr); + if(ret) + { + return HAL_ERROR; + } + return HAL_OK; +} + +/***************************************************************** +@ õ͹ģʽ +@ mode + BIT0=1: spi flash enter power down mode + BIT1=1: mcu enter deep sleep + BIT2=1: mcu enter standby mode + BIT3=1: wakeup spi flash +@ HAL_OK-ɹ,HAL_ERROR-ʧ +******************************************************************/ +uint8_t HAL_NORFLASH_SetLowPowerMode(uint8_t mode) +{ +// uint32_t sr; +// uint8_t ret; +// SPI_Flash_Parameter spiflashParam; +// +// spiflashParam.Command = mode; +// spiflashParam.Delay = NORFLASH_OPRA_DELAY; +// spiflashParam.Cont_MID = 0; +// +// sr = HAL_NORFLASH_EnterCritical(); +// ret = SPI_Nor_Low_Power_Mode(&spiflashParam); +// HAL_NORFLASH_ExitCritical(sr); +// +// if(ret) +// { +// return HAL_ERROR; +// } + return HAL_OK; +} + +/***************************************************************** +@ λMCUλϵͳROMиֱ־жϣУ飬ͨתAPPʧͣBOOTģʽ +@ +@ +******************************************************************/ +void HAL_NORFLASH_ResetMcu(void) +{ +// uint32_t sr; +// uint8_t ret; +// SPI_Flash_Parameter spiflashParam; +// +// spiflashParam.Command = 0; +// spiflashParam.Delay = NORFLASH_OPRA_DELAY; +// spiflashParam.Cont_MID = 0; +// spiflashParam.Operation_length = 0; +// spiflashParam.Dummy_bytes = 0; +// +// sr = HAL_NORFLASH_EnterCritical(); +// ret = SPI_Nor_Flash_Reset_SOC(&spiflashParam); +// HAL_NORFLASH_ExitCritical(sr); +} + + +/***************************************************************** +@ flashֽڶ +@ addr - ʼַ +@ buf-ݻ棬ֽڵַ +@ len-ȡֽ +@ HAL_OK-ɹ,HAL_ERROR-ʧ +******************************************************************/ +uint8_t HAL_NORFLASH_Read(uint32_t addr, uint8_t *buff, uint32_t len) +{ + uint32_t sr; + uint8_t ret; + SPI_Flash_Parameter spiflashParam; + + spiflashParam.SPI_Instance = (uint32_t)SPI7; + spiflashParam.Command = SPI_READ_DATA_1S1S1S_24; + spiflashParam.Delay = 0xFFU; + spiflashParam.Cont_MID = 0; + spiflashParam.Dummy_clks = 0; + spiflashParam.Addr = addr; + spiflashParam.Operation_length = len; + spiflashParam.Output_data_Addr = (uint32_t)buff; + + sr = HAL_NORFLASH_EnterCritical(); + ret=SPI_Nor_Read(&spiflashParam); + HAL_NORFLASH_ExitCritical(sr); + if(ret) + { + return HAL_ERROR; + } + return HAL_OK; +} + + + + +/***************************************************************** +@ ݣֿ֧ +@ addr - ʼַ +@ len - +@ HAL_OK-ɹ ,HAL_ERROR-ʧ +******************************************************************/ +uint8_t HAL_NORFLASH_Erase(uint32_t addr, uint32_t len) +{ + uint8_t ret; + uint32_t eraseAddr; + + eraseAddr = addr & (~NORFLASH_SECTOR_SIZE_MASK);//׵ַ + len += (addr & NORFLASH_SECTOR_SIZE_MASK); + while(len) + { + if(((eraseAddr&NORFLASH_BLOCK_64K_SIZE_MASK)==0) && (len>=NORFLASH_BLOCK_64K_SIZE)) + { + ret=HAL_NORFLASH_EraseBlock64K(eraseAddr); + if(ret) + { + return HAL_ERROR; + } + if(len > NORFLASH_BLOCK_64K_SIZE) + { + len -= NORFLASH_BLOCK_64K_SIZE; + } + else + { + len = 0; + } + eraseAddr += NORFLASH_BLOCK_64K_SIZE; + } + else if(((eraseAddr&NORFLASH_BLOCK_32K_SIZE_MASK)==0) && (len>=NORFLASH_BLOCK_32K_SIZE)) + { + ret=HAL_NORFLASH_EraseBlock32K(eraseAddr); + if(ret) + { + return HAL_ERROR; + } + + if(len > NORFLASH_BLOCK_32K_SIZE) + { + len -= NORFLASH_BLOCK_32K_SIZE; + } + else + { + len = 0; + } + eraseAddr += NORFLASH_BLOCK_32K_SIZE; + } + else + { + ret=HAL_NORFLASH_EraseSector(eraseAddr); + if(ret) + { + return HAL_ERROR; + } + + if(len > NORFLASH_SECTOR_SIZE) + { + len -= NORFLASH_SECTOR_SIZE; + } + else + { + len = 0; + } + eraseAddr += NORFLASH_SECTOR_SIZE; + } + } + return HAL_OK; +} + +/***************************************************************** +@ eflashݡñǰȲFLASHݣ +@ addr - ʼַ +@ buff-ݻ棬ֽڵַ +@ len-дֽ +@ HAL_OK-ɹ,HAL_ERROR-ʧ +******************************************************************/ +uint8_t HAL_NORFLASH_Program(uint32_t addr, uint8_t *buff, uint32_t len) +{ + uint8_t ret; + uint32_t offset,writeLen,writeAddr; + + offset = addr & NORFLASH_PAGE_SIZE_MASK; + writeAddr = addr; + + while(len) + { + if((offset+len) < NORFLASH_PAGE_SIZE) + { + writeLen = len; + } + else + { + writeLen = NORFLASH_PAGE_SIZE-offset; + } + + ret = HAL_NORFLASH_ProgramPage(writeAddr,buff,writeLen); + if(ret != HAL_OK) + return HAL_ERROR; + writeAddr += writeLen; + buff += writeLen; + len -= writeLen; + offset = 0; + } + return HAL_OK; +} + +/***************************************************************** +@ eflashдֽݡԶд룬ֿ֧ҳдڲʹ4KBջռ䣬ݡ +@ addr - ʼַ +@ buff-ݻ棬ֽڵַ +@ len-дֽ +@ HAL_OK-ɹ,HAL_ERROR-ʧ +******************************************************************/ +uint8_t HAL_NORFLASH_ModifyData(uint32_t addr, uint8_t *buff, uint32_t len) +{ + uint16_t offset; + uint16_t writeLen; + uint32_t writeAddr; + uint8_t *writePtr; + uint8_t flash_buff[NORFLASH_SECTOR_SIZE]; + + offset = (addr & NORFLASH_SECTOR_SIZE_MASK); //ƫ + writeAddr = addr - offset; //ʼַ + + while(len>0) + { + //д볤 + if(len <= (NORFLASH_SECTOR_SIZE - offset))//дݲʣռ䣬ûгΧ + { + writeLen = len; + } + else + { + writeLen = NORFLASH_SECTOR_SIZE - offset; + } + + if(writeLen != NORFLASH_SECTOR_SIZE)//д + { + HAL_NORFLASH_Read(writeAddr, flash_buff, NORFLASH_SECTOR_SIZE);// + memcpy(flash_buff+offset,buff,writeLen); + + writePtr = flash_buff; + } + else//ҳд + { + writePtr = buff; + } + + //Ȳд1 + + if(HAL_NORFLASH_EraseSector(writeAddr)!=HAL_OK) + { + return HAL_ERROR; + } + + if(HAL_NORFLASH_Program(writeAddr,writePtr,NORFLASH_SECTOR_SIZE)!= HAL_OK) + { + return HAL_ERROR; + } + + offset = 0; //ƫλΪ0 + writeAddr += NORFLASH_SECTOR_SIZE; //дַƫ + buff += writeLen; //ָƫ + len -= writeLen; //ֽݼ + } + return HAL_OK; +} + + +/***************************************************************** +@ BOOT־ +@ +@ HAL_OK-ɹ ,HAL_ERROR-ʧ +******************************************************************/ +uint8_t HAL_NORFLASH_EraseBootFlag(void) +{ + uint8_t ret; + uint8_t val[4] = {0xFF, 0xFF, 0xFF, 0xFF}; + HAL_NORFLASH_ModifyData(0x1018, val, 4); + + if(ret) + { + return HAL_ERROR; + } + return HAL_OK; +} + + +void otfdec_key_reverse(uint8_t *data_in, uint32_t *data_out) +{ + uint32_t i; + + i = 0; + + for(i = 0; i < 4; i++) + { + data_out[i] = (data_in[15-4*i] << 24) + (data_in[14-i*4] << 16) + (data_in[13-i*4] << 8) + (data_in[12-i*4] << 0); + } +} + + +// input value: pointer to 16 bytes key +// return value: 1 means valid, other value means invalid +uint8_t HAL_NORFLASH_SetEncryptionKey(uint8_t * key_input) +{ + uint32_t sr; + uint8_t ret; + uint32_t key_reverse[8]; + SPI_Flash_Parameter spiflashParam; + + otfdec_key_reverse( (uint8_t *)key_input, key_reverse); + key_reverse[7] = 0xFE01; + + spiflashParam.SPI_Instance = (uint32_t)SPI7; + spiflashParam.Command = SPI_CMD_ID_NOT_CARE; + spiflashParam.Cont_MID = 0; + spiflashParam.Addr = 0; + spiflashParam.Delay = 0xFFU; + spiflashParam.Operation_length = 0; + spiflashParam.Input_data_Addr = (uint32_t)key_reverse; + spiflashParam.Dummy_clks = 0; + + sr = HAL_NORFLASH_EnterCritical(); + ret=SPI_SetEncrytionKey(&spiflashParam); + HAL_NORFLASH_ExitCritical(sr); + if(ret) + { + return HAL_ERROR; + } + return HAL_OK; +} + +/***************************************************************** +@ ֹ̡ܱҳ߽磨256ֽڶ룩̡ +@ addr - ʼַ0x08000000Ļַһҳʱ128ֽڶ +@ buff-ݻ棬ַ4ֽڶ롣 +@ wordLen-дWORDȣһҳʱΪ32ֳ128ֽڣ64ֳ256ֽڣ +@ HAL_OK-ɹ ,HAL_ERROR-ʧ +******************************************************************/ +uint8_t HAL_NORFLASH_EncryptProgram(uint32_t addr, uint32_t *data_in, uint32_t len, uint32_t *data_out) +{ + SPI_Flash_Parameter spiflashParam; + uint8_t ret; + uint32_t sr; + + spiflashParam.SPI_Instance = (uint32_t)SPI7; + spiflashParam.Command = SPI_PROG_DATA_1S1S1S_24; + spiflashParam.Cont_MID = 0; + spiflashParam.Addr = addr; + spiflashParam.Delay = 0xFFU; + spiflashParam.Operation_length = len; + spiflashParam.Input_data_Addr = (uint32_t)data_in; + spiflashParam.Output_data_Addr = (uint32_t)data_out; + spiflashParam.Dummy_clks = 0; + + sr = HAL_NORFLASH_EnterCritical(); + ret = ( SPI_Nor_Encrypt_Data)(&spiflashParam); + HAL_NORFLASH_ExitCritical(sr); + if(ret) + { + return HAL_ERROR; + } + return HAL_OK; + +} + +/***************************************************************** +@ ޸SPIĴ +@ write_addr - SPI Ĵַ +@ p_value-ݡ +@ len-ֵij +@ HAL_OK-ɹ ,HAL_ERROR-ʧ +******************************************************************/ +uint8_t HAL_NORFLASH_ModifySPIControllerParam(uint32_t write_addr, uint32_t * p_value, uint32_t len) +{ + SPI_Flash_Parameter spiflashParam; + uint8_t ret; + uint32_t sr; + + spiflashParam.SPI_Instance = (uint32_t)SPI7; + spiflashParam.Command = SPI_CMD_ID_NOT_CARE; + spiflashParam.Cont_MID = 0; + spiflashParam.Addr = write_addr; + spiflashParam.Delay = 0xFFU; + spiflashParam.Operation_length = len; + spiflashParam.Input_data_Addr = (uint32_t)p_value; + + sr = HAL_NORFLASH_EnterCritical(); + ret = (SPI_Nor_ModifyValue)(&spiflashParam); + HAL_NORFLASH_ExitCritical(sr); + if(ret) + { + return HAL_ERROR; + } + return HAL_OK; +} + + +/***************************************************************** +@ Modify baud rate of SPI +@ div: spi baud configuration, can set to 2, 4, 6, 8... +@ shift_clk- SPI_SHIFT_ZERO, SPI_SHIFT_1HCLK, ... +@ 0-ɹ , others-ʧ +******************************************************************/ +uint8_t HAL_NORFLASH_ModifyDivShift(uint32_t div, uint32_t shift_clk) +{ + uint32_t reg_addr; + uint32_t spi_data_write[4] = {0,}; + uint8_t ret; + + spi_data_write[0] = div; + spi_data_write[1] = SPI7->CTL; + spi_data_write[2] = SPI7->TX_CTL; + + if (shift_clk < SPI_SHIFT_2P5HCLK) + { + spi_data_write[3] = (SPI7->RX_CTL & ~((0x3 << 8) | BIT24) ) | (shift_clk << 8); + } + else if(shift_clk == SPI_SHIFT_2P5HCLK) + { + spi_data_write[3] = (SPI7->RX_CTL & ~((0x3 << 8) | BIT24) ) | (0x1 << 24); + } + else if(shift_clk == SPI_SHIFT_3HCLK) + { + spi_data_write[3] = (SPI7->RX_CTL & ~((0x3 << 8) | BIT24) ) | (0x1 << 24) | (1 << 8); + } + else + { + return 1; + } + + reg_addr = (uint32_t)(&(SPI7->BAUD)); + + ret = HAL_NORFLASH_ModifySPIControllerParam(reg_addr, spi_data_write, 4); + + return ret; +} + + + +/***************************************************************** +@ +@ addr - ʼַ +@ HAL_OK-ɹ ,HAL_ERROR-ʧ +******************************************************************/ +static uint8_t HAL_NORFLASH_EraseSector(uint32_t addr) +{ + uint32_t sr; + uint8_t ret; + SPI_Flash_Parameter spiflashParam; + + spiflashParam.SPI_Instance = (uint32_t)SPI7; + spiflashParam.Command = SPI_ERASE_SECTOR_1S1S_24; + spiflashParam.Delay = 0xFFU; + spiflashParam.Cont_MID = 0; + spiflashParam.Addr = addr; + + sr = HAL_NORFLASH_EnterCritical(); + ret=SPI_Nor_Erase(&spiflashParam); + HAL_NORFLASH_ExitCritical(sr); + if(ret) + { + return HAL_ERROR; + } + return HAL_OK; +} + +/***************************************************************** +@ 32K +@ addr - ʼַ +@ HAL_OK-ɹ ,HAL_ERROR-ʧ +******************************************************************/ +static uint8_t HAL_NORFLASH_EraseBlock32K(uint32_t addr) +{ + uint32_t sr; + uint8_t ret; + SPI_Flash_Parameter spiflashParam; + uint32_t offset; + + offset = addr & 0x00FFFFFFU; + + if (offset < 64 * 1024) + { + return HAL_ERROR; + } + + spiflashParam.SPI_Instance = (uint32_t)SPI7; + spiflashParam.Command = SPI_ERASE_BLOCK1_1S1S_24; + spiflashParam.Delay = 0xFFU; + spiflashParam.Cont_MID = 0; + spiflashParam.Addr = addr; + sr = HAL_NORFLASH_EnterCritical(); + ret=SPI_Nor_Erase(&spiflashParam); + HAL_NORFLASH_ExitCritical(sr); + if(ret) + { + return HAL_ERROR; + } + return HAL_OK; +} + +/***************************************************************** +@ 64K +@ addr - ʼַ +@ HAL_OK-ɹ ,HAL_ERROR-ʧ +******************************************************************/ +static uint8_t HAL_NORFLASH_EraseBlock64K(uint32_t addr) +{ + uint32_t sr; + uint8_t ret; + uint32_t offset; + SPI_Flash_Parameter spiflashParam; + + offset = addr & 0x00FFFFFFU; + + if (offset < 64 * 1024) + { + return HAL_ERROR; + } + spiflashParam.SPI_Instance = (uint32_t)SPI7; + spiflashParam.Command = SPI_ERASE_BLOCK2_1S1S_24; + spiflashParam.Delay = 0xFFU; + spiflashParam.Cont_MID = 0; + spiflashParam.Addr = addr; + sr = HAL_NORFLASH_EnterCritical(); + ret=SPI_Nor_Erase(&spiflashParam); + HAL_NORFLASH_ExitCritical(sr); + if(ret) + { + return HAL_ERROR; + } + return HAL_OK; +} + +static uint8_t HAL_NORFLASH_ProgramPage(uint32_t addr, uint8_t *buff, uint32_t len) +{ + uint32_t sr; + uint8_t ret; + SPI_Flash_Parameter spiflashParam; + + spiflashParam.SPI_Instance = (uint32_t)SPI7; + spiflashParam.Command = SPI_PROG_DATA_1S1S1S_24; + spiflashParam.Cont_MID = 0; + spiflashParam.Addr = addr; + spiflashParam.Delay = 0xFFU; + spiflashParam.Operation_length = len; + spiflashParam.Input_data_Addr = (uint32_t)buff; + spiflashParam.Dummy_clks = 0; + + sr = HAL_NORFLASH_EnterCritical(); + ret=SPI_Nor_PageProgram(&spiflashParam); + //System_InvalidateIAccelerate(); + HAL_NORFLASH_ExitCritical(sr); + if(ret) + { + return HAL_ERROR; + } + return HAL_OK; +} + +#endif /* HAL_NORFLASH_MODULE_ENABLED */ \ No newline at end of file diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_ospi.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_ospi.c new file mode 100644 index 0000000000..f07dd3b3c4 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_ospi.c @@ -0,0 +1,1996 @@ +/****************************************************************************** +*@file : hal_ospi.c +*@brief : This file provides firmware functions to manage the OSPI HAL module +*@ver : 1.0.0 +*@date : 2023.06.16 +******************************************************************************/ +#include "hal.h" + +#ifdef HAL_OSPI_MODULE_ENABLED + +/****************************************************************************** +*@brief : OSPI interrupt handler +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@return: None +******************************************************************************/ +__weak void HAL_OSPI_IRQHandler(OSPI_HandleTypeDef *hospi) +{ + if ( (hospi->Instance->STATUS & SPI_STATUS_RX_FIFO_NOT_EMPTY) && ((hospi->Instance->IE) & SPI_IE_RX_FIFO_NOT_EMPTY_EN) ) + { + do{ + if (hospi->Rx_Count < hospi->Rx_Size) + { + hospi->Rx_Buffer[hospi->Rx_Count++] = hospi->Instance->DAT; + } + else break; + }while (hospi->Instance->STATUS & SPI_STATUS_RX_FIFO_NOT_EMPTY); + } + + if ( (hospi->Instance->STATUS & SPI_STATUS_TX_FIFO_HALF_EMPTY) && ((hospi->Instance->IE) & SPI_IE_TX_FIFO_HALF_EMPTY_EN) ) + { + while (!(hospi->Instance->STATUS & SPI_STATUS_TX_FIFO_FULL)) + { + if(hospi->Tx_Count < hospi->Tx_Size) + { + hospi->Instance->DAT = hospi->Tx_Buffer[hospi->Tx_Count++]; + } + else + { + /* Disable TxFIFO half empty interrupt */ + CLEAR_BIT(hospi->Instance->IE, SPI_IE_TX_FIFO_HALF_EMPTY_EN); + break; + } + } + } + + if ((hospi->Instance->STATUS & SPI_STATUS_TX_BATCH_DONE) && ((hospi->Instance->IE) & SPI_IE_TX_BATCH_DONE_EN) ) + { + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + /* Disable TX Batch Done Interrupt, Tx FIFO half empty Interrupt */ + CLEAR_BIT(hospi->Instance->IE, SPI_IE_TX_BATCH_DONE_EN | SPI_IE_TX_FIFO_HALF_EMPTY_EN); + + /* Transmit End */ + HAL_OSPI_CS_Release(hospi); + + /* Tx Disable */ + CLEAR_BIT(hospi->Instance->TX_CTL, SPI_TX_CTL_EN); + CLEAR_BIT(hospi->Instance->TX_CTL, SPI_TX_CTL_DMA_REQ_EN); + + hospi->TxState = OSPI_TX_STATE_IDLE; + } + + if ( (hospi->Instance->STATUS & SPI_STATUS_RX_BATCH_DONE) && ((hospi->Instance->IE) & SPI_STATUS_RX_BATCH_DONE) ) + { + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, SPI_STATUS_RX_BATCH_DONE); + + /* Disable RX Batch Done Interrupt, RXFIFO not Empty interrupt */ + CLEAR_BIT(hospi->Instance->IE, SPI_IE_RX_BATCH_DONE_EN | SPI_IE_RX_FIFO_NOT_EMPTY_EN); + + while (hospi->Instance->STATUS & SPI_STATUS_RX_FIFO_NOT_EMPTY) + { + if (hospi->Rx_Count < hospi->Rx_Size) + { + hospi->Rx_Buffer[hospi->Rx_Count++] = hospi->Instance->DAT; + } + else break; + } + ///////////// + + /* Receive End */ + HAL_OSPI_CS_Release(hospi); + + /* Rx Disable */ + CLEAR_BIT(hospi->Instance->RX_CTL, SPI_RX_CTL_DMA_REQ_EN); + CLEAR_BIT(hospi->Instance->RX_CTL, SPI_RX_CTL_EN); + + hospi->RxState = OSPI_RX_STATE_IDLE; + } +} + +/****************************************************************************** +*@brief : Init low level of OSPI module: GPIO, CLK, NVIC +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@return: None +******************************************************************************/ +__weak void HAL_OSPI_MspInit(OSPI_HandleTypeDef *hospi) +{ + /* + NOTE : This function is implemented in user xxx_hal_msp.c + */ + + /* Prevent unused argument(s) compilation warning */ + UNUSED(hospi); +} + +/****************************************************************************** +*@brief : OSPI De-Initialize the OSPI clock, GPIO, IRQ. +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@return: None +******************************************************************************/ +__weak void HAL_OSPI_MspDeInit(OSPI_HandleTypeDef *hospi) +{ + /* + NOTE : This function is implemented in user xxx_hal_msp.c + */ + + /* Prevent unused argument(s) compilation warning */ + UNUSED(hospi); +} + +/****************************************************************************** +*@brief : Initialize the OSPI module with parameters +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_Init(OSPI_HandleTypeDef *hospi) +{ + /* Check OSPI Parameter */ + assert_param(IS_OSPI_ALL_INSTANCE(hospi->Instance)); + assert_param(IS_OSPI_WORK_MODE(hospi->Init.WorkMode)); + assert_param(IS_OSPI_X_MODE(hospi->Init.XMode)); + assert_param(IS_OSPI_FIRST_BIT(hospi->Init.FirstBit)); + assert_param(IS_OSPI_BAUDRATE_PRESCALER(hospi->Init.BaudRatePrescaler)); + assert_param(IS_OSPI_SAMPLE_SHIFT(hospi->Init.SampleShifting)); + assert_param(IS_OSPI_FIFO_MODE(hospi->Init.FWMode)); + assert_param(IS_OSPI_FIFO_MODE(hospi->Init.FRMode)); + assert_param(IS_OSPI_CS_SEL(hospi->CSx)); + + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_OSPI_MspInit(hospi); + + /* Clear Mst_ModeCHPACPOLLSB_firstX_ModeIO_MODEFW_MODE bit */ + hospi->Instance->CTL &= (~(OSPI_CTL_MST_MODE | SPI_CTL_CPHA | SPI_CTL_CPOL | SPI_CTL_LSB_FIRST | \ + SPI_CTL_X_MODE | OSPI_CTL_IO_MODE | OSPI_CTL_FW_MODE | OSPI_CTL_MEM_MODE)); + + /* Set OSPI Master ModeWorkModeFirstBitXModeAutomatic change directionFIFO wirte mode*/ + hospi->Instance->CTL |= (OSPI_CTL_MST_MODE | (hospi->Init.WorkMode) | (hospi->Init.FirstBit) | \ + (hospi->Init.XMode) | OSPI_CTL_IO_MODE | (hospi->Init.FWMode << OSPI_CTL_FW_MODE_Pos) | (hospi->Init.FRMode << OSPI_CTL_FR_MODE_Pos)); + + /* Set OSPI BaudRate Prescaler */ + hospi->Instance->BAUD = ((hospi->Instance->BAUD) & (~(SPI_BAUD_DIV1 | SPI_BAUD_DIV2))) | (hospi->Init.BaudRatePrescaler); + + /* Clear SSHIFT bit */ + hospi->Instance->RX_CTL &= ~(OSPI_RX_CTL_SSHIFT); + /* Set Master Sample shift*/ + hospi->Instance->RX_CTL |= ((hospi->Init.SampleShifting) << OSPI_RX_CTL_SSHIFT_Pos); + + /* CLEAR SPI_CS BIT*/ + hospi->Instance->CS &= (~OSPI_CS_CS); + + /* Disable All Interrupt */ + hospi->Instance->IE = 0x00000000; + + + return HAL_OK; +} + +/****************************************************************************** +*@brief : e-Initialize the OSPI peripheral +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_DeInit(OSPI_HandleTypeDef *hospi) +{ + /* Check the OSPI handle allocation */ + if (hospi == NULL) + { + return HAL_ERROR; + } + + /* Check OSPI Instance parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + hospi->RxState = OSPI_RX_STATE_IDLE; + hospi->TxState = OSPI_TX_STATE_IDLE; + + /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ + HAL_OSPI_MspDeInit(hospi); + + hospi->Rx_Size = 0; + hospi->Tx_Size = 0; + hospi->Rx_Count = 0; + hospi->Tx_Count = 0; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initialize the OSPI module Octal communication +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : Octal: a pointer of OSPI_OctalInitTypeDef structure which contains +* the configuration information for the specified OSPI Octal communication. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_OctalInit(OSPI_HandleTypeDef *hospi, OSPI_OctalInitTypeDef *Octal) +{ + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + assert_param(IS_OSPI_DTRM(Octal->DTRMode)); + assert_param(IS_OSPI_DQSOE(Octal->DQSMode)); + assert_param(IS_OSPI_MEMORY_TYPE(Octal->MemoryType)); + assert_param(IS_OSPI_DQS_SAMPLE(Octal->DQSSample)); + + + /* Clear DTRMMem_Mode bit */ + hospi->Instance->CTL &= (~(OSPI_CTL_DTRM | OSPI_CTL_MEM_MODE | OSPI_CTL_DQSOE)); + + /* Set DTRMDM_ENDMCTRLMem_ModeAPMD_CLK */ + hospi->Instance->CTL |= ((Octal->DTRMode) | (Octal->MemoryType) | (Octal->DQSMode)); + + /* Set DQS_SAMP_EN */ + hospi->Instance->RX_CTL = ((hospi->Instance->RX_CTL & (~OSPI_RX_CTL_DQS_SAMP_EN)) | (Octal->DQSSample)); + + if(Octal->DTRMode == OSPI_DTRM_DTR) + { + /* Check OSPI Parameter */ + assert_param (IS_OSPI_TX_OUT_DELAY(Octal->OutDelay)); + /* set DTR TX out delay */ + hospi->Instance->TX_CTL = ((hospi->Instance->TX_CTL) & (~(OSPI_TX_CTL_OUTDLY))) | (Octal->OutDelay); + } + + return HAL_OK; +} + + +/****************************************************************************** +*@brief : OSPI module memory mode initialization +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : Memory: a pointer of OSPI_MemoryInitTypeDef structure which contains +* the configuration information for the specified OSPI memory mode. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_MemoryInit(OSPI_HandleTypeDef *hospi, OSPI_MemoryInitTypeDef *Memory) +{ + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + assert_param(IS_OSPI_BURST_TYPE(Memory->HyperBurstType)); + assert_param(IS_OSPI_DATA_MODE(Memory->DataMode)); + assert_param(IS_OSPI_ALTER_BYTE_MODE(Memory->AlterByteMode)); + assert_param(IS_OSPI_ADDR_MODE(Memory->AddrMode)); + assert_param(IS_OSPI_INSRT_MODE(Memory->InstrMode)); + assert_param(IS_OSPI_ADDR_WIDTH(Memory->AddrWidth)); + assert_param(IS_OSPI_DUMMY_CYCLE(Memory->DummyCycleSize)); + assert_param(IS_OSPI_READ_DUMMY_STATE(Memory->ReadDummyByteEnable)); + assert_param(IS_OSPI_WRITE_DUMMY_STATE(Memory->WriteummyByteEnable)); + assert_param(IS_OSPI_ALTER_BYTE_SIZE(Memory->AlterByteSize)); + assert_param(IS_OSPI_READ_ALTER_STATE(Memory->ReadAlterByteEnable)); + assert_param(IS_OSPI_WRITE_ALTER_STATE(Memory->WriteAlterByteEnable)); + assert_param(IS_OSPI_CMD_SEND_STATE(Memory->SendInstrOnce)); + assert_param(IS_OSPI_CONTINUOUS_STATE(Memory->ContinuousModeEnable)); + assert_param(IS_OSPI_CS_TIMEOUT_STATE(Memory->CsTimeoutEnable)); + assert_param(IS_OSPI_WRAP_SIZE(Memory->WrapSize)); + assert_param(IS_OSPI_BURST_LEN(Memory->BurstLen)); + assert_param(IS_OSPI_LATENCY1_CYCLE(Memory->HyperXspiLC1)); + assert_param(IS_OSPI_LATENCY0_CYCLE(Memory->HyperXspiLc0)); + assert_param(IS_OSPI_CS_TIMEOUT_VAL(Memory->CsTimeoutVal)); + + if(Memory->CsTimeoutEnable == MEMOACC1_CS_TIMEOUT_ENABLE) + { + hospi->Instance->CS_TIMEOUT_VAL = Memory->CsTimeoutVal; + } + /* Set Wr_Cmd/Rd_Cmd bits of CMD register */ + hospi->Instance->CMD= ((Memory->ReadCmd) | (Memory->WriteCmd << 8)); + + /* Set Alter_Byte bit of ALTER_BYTE register */ + hospi->Instance->ALTER_BYTE = Memory->AlterByte; + + /* Set WRPS/BL/Hxspi_LC1/Hxspi_LC0 bits of MEMO_ACC2 register */ + hospi->Instance->MEMO_ACC2 = ((Memory->WrapSize) | \ + (Memory->BurstLen) | \ + (Memory->HyperXspiLC1 << OSPI_MEMO_ACC2_HXLC1_Pos) | \ + (Memory->HyperXspiLc0 << OSPI_MEMO_ACC2_HXLC0_Pos)); + + /* Disable Memory mode and clear 0*/ + hospi->Instance->MEMO_ACC1 = MEMOACC1_MEMORY_DISABLE; + + /* Set Hyper_BT/Data_Mode/Alter_Byte_Mode/Addr_Mode/Instr_Mode/Addr_width/Dummy_Cycle_Size + Rd_Db_EN/Wr_Db_EN/Alter_Byte_Size/Rd_Ab_EN/Wr_Ab_EN/disable_CMD/Con_Mode_EN/CS_Tout_EN + bits of MEMO_ACC1 register */ + hospi->Instance->MEMO_ACC1 = ((Memory->HyperBurstType) | \ + (Memory->DataMode) | \ + (Memory->AlterByteMode) | \ + (Memory->AddrMode) | \ + (Memory->InstrMode) | \ + (Memory->AddrWidth) | \ + (Memory->DummyCycleSize << OSPI_MEMO_ACC1_DUMMY_CYCLE_SIZE_Pos) | \ + (Memory->ReadDummyByteEnable) | \ + (Memory->WriteummyByteEnable) | \ + (Memory->AlterByteSize) | \ + (Memory->ReadAlterByteEnable) | \ + (Memory->WriteAlterByteEnable) | \ + (Memory->SendInstrOnce) | \ + (Memory->ContinuousModeEnable) | \ + (Memory->CsTimeoutEnable)); + + /* Enable Memory mode */ + hospi->Instance->MEMO_ACC1 |= MEMOACC1_MEMORY_ENABLE; + return HAL_OK; +} + +/****************************************************************************** +*@brief : CS Select +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@return: None +******************************************************************************/ +void HAL_OSPI_CS_Select(OSPI_HandleTypeDef *hospi) +{ + uint32_t tempreg = 0; + + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + /* Get MULTCS_EN value */ + tempreg = hospi->Instance->CS & OSPI_CS_CSMAP_EN_Msk; + /* Set bit0~2 */ + tempreg |= hospi->CSx; + /* Set OSPI_CS */ + hospi->Instance->CS = tempreg; +} + + +/****************************************************************************** +*@brief : CS Release +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@return: None +******************************************************************************/ +void HAL_OSPI_CS_Release(OSPI_HandleTypeDef *hospi) +{ + uint32_t tempreg = 0; + + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + /* Get MULTCS_EN value */ + tempreg = hospi->Instance->CS & OSPI_CS_CSMAP_EN_Msk; + /* Set OSPI_CS */ + hospi->Instance->CS = tempreg; +} + +/****************************************************************************** +*@brief : Transmits an amount of data by loop mode. +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@param : Timeout : Transmit Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_Transmit(OSPI_HandleTypeDef *hospi, uint8_t *pData, \ + uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status = HAL_OK; + __IO uint32_t uiTimeout; + + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + if(!Size) return HAL_ERROR; + if (pData == NULL) return HAL_ERROR; + + uiTimeout = Timeout; + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Clear TX FIFO */ + SET_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + CLEAR_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + + /* Set Data Size */ + hospi->Instance->BATCH = Size; + + /* RX Disable */ + hospi->Instance->RX_CTL &= ~OSPI_RX_CTL_RX_EN; + + /* Tx Enable */ + hospi->Instance->TX_CTL |= OSPI_TX_CTL_TX_EN; + + /* Transmit Start */ + HAL_OSPI_CS_Select(hospi); + + while(Size > 0) + { + /* Wait Tx FIFO Not Full */ + while (hospi->Instance->STATUS & OSPI_STATUS_TX_FIFO_FULL) + { + if(uiTimeout) + { + uiTimeout--; + if (uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + hospi->Instance->DAT = *pData++; + Size--; + uiTimeout = Timeout; + } + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_TX_BATCH_DONE)); + Status = HAL_OK; + + +End: + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Tx Disable */ + hospi->Instance->TX_CTL &= (~OSPI_TX_CTL_TX_EN); + + /* Transmit End */ + HAL_OSPI_CS_Release(hospi); + + + return Status; +} + +/****************************************************************************** +*@brief : Transmits an amount of data by loop mode and retain CS. +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@param : Timeout : Transmit Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_TransmitKeepCS(OSPI_HandleTypeDef *hospi, uint8_t *pData, \ + uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status = HAL_OK; + __IO uint32_t uiTimeout; + + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + if(!Size) return HAL_ERROR; + if (pData == NULL) return HAL_ERROR; + + uiTimeout = Timeout; + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Clear TX FIFO */ + SET_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + CLEAR_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + + /* Set Data Size */ + hospi->Instance->BATCH = Size; + + /* RX Disable */ + hospi->Instance->RX_CTL &= ~OSPI_RX_CTL_RX_EN; + + /* Tx Enable */ + hospi->Instance->TX_CTL |= OSPI_TX_CTL_TX_EN; + + /* Transmit Start */ + HAL_OSPI_CS_Select(hospi); + + while(Size > 0) + { + /* Wait Tx FIFO Not Full */ + while (hospi->Instance->STATUS & OSPI_STATUS_TX_FIFO_FULL) + { + if(uiTimeout) + { + uiTimeout--; + if (uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + hospi->Instance->DAT = *pData++; + Size--; + uiTimeout = Timeout; + } + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_TX_BATCH_DONE)); + Status = HAL_OK; + + +End: + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Tx Disable */ + hospi->Instance->TX_CTL &= (~OSPI_TX_CTL_TX_EN); + + ///* Transmit End */ + //HAL_OSPI_CS_Release(hospi); + + + return Status; +} + +/****************************************************************************** +*@brief : Receive an amount of data by loop mode. +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@param : Timeout : Receive Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_Receive(OSPI_HandleTypeDef *hospi, uint8_t *pData, \ + uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status = HAL_OK; + __IO uint32_t uiTimeout; + + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + if (pData == NULL) return HAL_ERROR; + + uiTimeout = Timeout; + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_RX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Set Data Size */ + hospi->Instance->BATCH = Size; + + /* Tx Disable */ + hospi->Instance->TX_CTL &= ~OSPI_TX_CTL_TX_EN; + + /* Rx Enable */ + hospi->Instance->RX_CTL |= OSPI_RX_CTL_RX_EN; + + /* Receive Start */ + HAL_OSPI_CS_Select(hospi); + + while(Size) + { + /* have no timeout */ + if (uiTimeout == 0) + { + /* Wait Rx FIFO Not Empty */ + while (hospi->Instance->STATUS & SPI_STATUS_RX_FIFO_EMPTY); + } + else + { + while (hospi->Instance->STATUS & SPI_STATUS_RX_FIFO_EMPTY) + { + if (uiTimeout-- == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + *pData++ = hospi->Instance->DAT; + Size--; + uiTimeout = Timeout; + } + + Status = HAL_OK; + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_RX_BATCH_DONE)); + +End: + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_RX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Rx Disable */ + hospi->Instance->RX_CTL &= (~OSPI_RX_CTL_RX_EN); + + /* Receive End */ + HAL_OSPI_CS_Release(hospi); + + return Status; +} + +/****************************************************************************** +*@brief : Receive an amount of data by loop mode and retain CS. +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@param : Timeout : Receive Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_ReceiveKeepCS(OSPI_HandleTypeDef *hospi, uint8_t *pData, \ + uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status = HAL_OK; + __IO uint32_t uiTimeout; + + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + if (pData == NULL) return HAL_ERROR; + + uiTimeout = Timeout; + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_RX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Set Data Size */ + hospi->Instance->BATCH = Size; + + /* Tx Disable */ + hospi->Instance->TX_CTL &= ~OSPI_TX_CTL_TX_EN; + + /* Rx Enable */ + hospi->Instance->RX_CTL |= OSPI_RX_CTL_RX_EN; + + /* Receive Start */ + HAL_OSPI_CS_Select(hospi); + + while(Size) + { + /* have no timeout */ + if (uiTimeout == 0) + { + /* Wait Rx FIFO Not Empty */ + while (hospi->Instance->STATUS & SPI_STATUS_RX_FIFO_EMPTY); + } + else + { + while (hospi->Instance->STATUS & SPI_STATUS_RX_FIFO_EMPTY) + { + if (uiTimeout-- == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + *pData++ = hospi->Instance->DAT; + Size--; + uiTimeout = Timeout; + } + + Status = HAL_OK; + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_RX_BATCH_DONE)); + +End: + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_RX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Rx Disable */ + hospi->Instance->RX_CTL &= (~OSPI_RX_CTL_RX_EN); + + ///* Receive End */ + //HAL_OSPI_CS_Release(hospi); + + return Status; +} + +/****************************************************************************** +*@brief : Transmits an amount of data by IT mode. +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_Transmit_IT(OSPI_HandleTypeDef *hospi, uint8_t *pData, uint32_t Size) +{ + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + /* Tx machine is running */ + if (hospi->TxState != OSPI_TX_STATE_IDLE) + { + return HAL_ERROR; + } + + hospi->Tx_Size = Size; + hospi->Tx_Buffer = pData; + hospi->Tx_Count = 0; + + /* Set machine is Sending */ + hospi->TxState = OSPI_TX_STATE_SENDING; + + /* Clear TX FIFO */ + SET_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + CLEAR_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Clear Tx FIFO half empty Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_FIFO_HALF_EMPTY); + + /* Set Data Size */ + hospi->Instance->BATCH = Size; + + /* Rx Disable */ + hospi->Instance->RX_CTL &= ~OSPI_RX_CTL_RX_EN; + + /* Tx Enable */ + hospi->Instance->TX_CTL |= OSPI_TX_CTL_TX_EN; + + /* Transmit Start */ + HAL_OSPI_CS_Select(hospi); + + + while (hospi->Tx_Count < hospi->Tx_Size) + { + if (!(hospi->Instance->STATUS & OSPI_STATUS_TX_FIFO_FULL)) + { + hospi->Instance->DAT = hospi->Tx_Buffer[hospi->Tx_Count++]; + } + else + { + break; + } + } + + /* Enable Tx FIFO half empty Interrupt and Tx batch done Interrupt*/ + SET_BIT(hospi->Instance->IE, (OSPI_IE_TX_FIFO_HALF_EMPTY_EN | OSPI_IE_TX_BATCH_DONE_EN)); + + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data by IT mode. +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_Receive_IT(OSPI_HandleTypeDef *hospi, uint8_t *pData, uint32_t Size) +{ + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + /* Rx machine is running */ + if (hospi->RxState != OSPI_RX_STATE_IDLE) + { + return HAL_ERROR; + } + + /* Set Slave machine is receiving */ + hospi->RxState = OSPI_RX_STATE_RECEIVING; + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_RX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Set Data Size */ + hospi->Instance->BATCH = Size; + + /* TX Disable */ + hospi->Instance->TX_CTL &= ~OSPI_TX_CTL_TX_EN; + + /* Rx Enable */ + hospi->Instance->RX_CTL |= OSPI_RX_CTL_RX_EN; + + /* Receive Start */ + HAL_OSPI_CS_Select(hospi); + + hospi->Rx_Size = Size; + hospi->Rx_Buffer = pData; + hospi->Rx_Count = 0; + + /* Enable Rx FIFO Not Empty Interrupt */ + SET_BIT(hospi->Instance->IE, OSPI_STATUS_RX_FIFO_NOT_EMPTY | OSPI_IE_RX_BATCH_DONE_EN); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Transmits an amount of data by DMA mode. +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_Transmit_DMA(OSPI_HandleTypeDef *hospi, uint8_t *pData, uint32_t Size) +{ + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + /* Rx machine is running */ + if (hospi->TxState != OSPI_TX_STATE_IDLE) + { + return HAL_ERROR; + } + /* Set machine is Sending */ + hospi->TxState = OSPI_TX_STATE_SENDING; + + /* Clear TX FIFO */ + SET_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + CLEAR_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Enable Tx Batch Done Interrupt */ + SET_BIT(hospi->Instance->IE, OSPI_STATUS_TX_BATCH_DONE); + + /* Set Data Size */ + hospi->Instance->BATCH = Size; + + /* Tx DMA FIFO */ + hospi->Instance->TX_CTL &= ~OSPI_TX_CTL_TX_DMA_LEVEL; + hospi->Instance->TX_CTL |= OSPI_TX_CTL_TX_DMA_LEVEL_0; + + /* Rx Disable */ + hospi->Instance->RX_CTL &= ~OSPI_RX_CTL_RX_EN; + + /* Tx Enable */ + hospi->Instance->TX_CTL |= OSPI_TX_CTL_TX_EN; + + /* Transmit Start */ + HAL_OSPI_CS_Select(hospi); + + + HAL_DMA_Start(hospi->HDMA_Tx, (uint32_t)pData, (uint32_t)&hospi->Instance->DAT, Size); + + hospi->Instance->TX_CTL |= OSPI_TX_CTL_TX_DMA_REQ_EN; + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data by DMA mode. +* +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_Receive_DMA(OSPI_HandleTypeDef *hospi, uint8_t *pData, uint32_t Size) +{ + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + /* Rx machine is running */ + if (hospi->RxState != OSPI_RX_STATE_IDLE) + { + return HAL_ERROR; + } + /* Set Slave machine is receiving */ + hospi->RxState = OSPI_RX_STATE_RECEIVING; + + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_RX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Enable Rx Batch Done Interrupt */ + SET_BIT(hospi->Instance->IE, OSPI_STATUS_RX_BATCH_DONE); + + /* Set Data Size */ + hospi->Instance->BATCH = Size; + + /* Rx FIFO */ + hospi->Instance->RX_CTL |= OSPI_RX_CTL_RX_DMA_LEVEL_0; + + /* TX Disable */ + hospi->Instance->TX_CTL &= ~OSPI_TX_CTL_TX_EN; + + /* Rx Enable */ + hospi->Instance->RX_CTL |= OSPI_RX_CTL_RX_EN; + + /* Receive Start */ + HAL_OSPI_CS_Select(hospi); + + + HAL_DMA_Start(hospi->HDMA_Rx, (uint32_t)&hospi->Instance->DAT, (uint32_t)pData, Size); + + hospi->Instance->RX_CTL |= OSPI_RX_CTL_RX_DMA_REQ_EN; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Simultaneously transmits and recieve an amount of data in loop mode. +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pTxData : Pointer to transmit data buffer +*@param : pRxData : Pointer to recieve data buffer +*@param : Size : Amount of data to be sent and receive +*@param : Timeout : sent and receive timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_SimultTransmitReceive(OSPI_HandleTypeDef *hospi, uint8_t *pTxData, \ + uint8_t *pRxData, uint32_t Size, uint32_t Timeout) +{ + __IO uint32_t TxFlag = 1U, uiTimeout; + HAL_StatusTypeDef Status = HAL_OK; + + /* Check SPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + if ((pTxData == NULL)||(pRxData == NULL)) return HAL_ERROR; + + hospi->Tx_Count = 0; + hospi->Rx_Count = 0; + hospi->Tx_Buffer = pTxData; + hospi->Rx_Buffer = pRxData; + hospi->Tx_Size = Size; + hospi->Rx_Size = Size; + uiTimeout = Timeout; + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Tx Enable */ + hospi->Instance->TX_CTL |= OSPI_TX_CTL_TX_EN; + + /* Rx Enable */ + hospi->Instance->RX_CTL |= OSPI_RX_CTL_RX_EN; + + /* Clear TX FIFO */ + SET_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + CLEAR_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + + /* Set Data Size */ + hospi->Instance->BATCH = hospi->Tx_Size; + + /* Transmit Start */ + HAL_OSPI_CS_Select(hospi); + TxFlag = 1; + + + while((hospi->Tx_Size>0) || (hospi->Rx_Size>0)) + { + /* Wait Tx FIFO Not Full */ + if((!(hospi->Instance->STATUS & OSPI_STATUS_TX_FIFO_FULL)) && (hospi->Tx_Size>0) && (TxFlag == 1U)) + { + hospi->Instance->DAT = hospi->Tx_Buffer[hospi->Tx_Count++]; + hospi->Tx_Size--; + TxFlag = 0; + } + + /* Wait Rx FIFO Not Empty */ + if((!(hospi->Instance->STATUS & OSPI_STATUS_RX_FIFO_EMPTY)) && (hospi->Rx_Size>0)) + { + hospi->Rx_Buffer[hospi->Rx_Count++] = hospi->Instance->DAT; + hospi->Rx_Size--; + TxFlag = 1U; + } + + + /* Wait Timeout */ + if(uiTimeout) + { + uiTimeout--; + if(uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_TX_BATCH_DONE)); + + Status = HAL_OK; + +End: + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Tx Disable */ + hospi->Instance->TX_CTL &= (~OSPI_TX_CTL_TX_EN); + + /* Rx Disable */ + hospi->Instance->RX_CTL &= (~OSPI_RX_CTL_RX_EN); + + /* Transmit End */ + HAL_OSPI_CS_Release(hospi); + + return Status; +} + + +/****************************************************************************** +*@brief : Transmit data through FIFO Half Word mode. +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@param : Timeout : Transmit Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_TransmitByHalfWord(OSPI_HandleTypeDef *hospi, uint16_t *pData, \ + uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status = HAL_OK; + __IO uint32_t uiTimeout; + + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + if(!Size) return HAL_ERROR; + if (pData == NULL) return HAL_ERROR; + + uiTimeout = Timeout; + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Clear TX FIFO */ + SET_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + CLEAR_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + + /* Set Data Size */ + hospi->Instance->BATCH = (Size * 2); + + /* Rx Disable */ + hospi->Instance->RX_CTL &= ~OSPI_RX_CTL_RX_EN; + + /* Tx Enable */ + hospi->Instance->TX_CTL |= OSPI_TX_CTL_TX_EN; + + /* Transmit Start */ + HAL_OSPI_CS_Select(hospi); + + while(Size > 0) + { + /* Wait Tx FIFO Not Full */ + while(hospi->Instance->STATUS & OSPI_STATUS_TX_FIFO_FULL) + { + if(uiTimeout) + { + uiTimeout--; + if (uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + hospi->Instance->DAT = *pData++; + Size--; + uiTimeout = Timeout; + } + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_TX_BATCH_DONE)); + Status = HAL_OK; + + +End: + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Tx Disable */ + hospi->Instance->TX_CTL &= (~OSPI_TX_CTL_TX_EN); + + /* Transmit End */ + HAL_OSPI_CS_Release(hospi); + + + return Status; +} + +/****************************************************************************** +*@brief : Transmit data through FIFO Word mode. +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@param : Timeout : Transmit Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_TransmitByWord(OSPI_HandleTypeDef *hospi, uint32_t *pData, \ + uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status = HAL_OK; + __IO uint32_t uiTimeout; + + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + if(!Size) return HAL_ERROR; + if (pData == NULL) return HAL_ERROR; + + uiTimeout = Timeout; + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Clear TX FIFO */ + SET_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + CLEAR_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + + /* Set Data Size */ + hospi->Instance->BATCH = (Size * 4); + + /* Rx Disable */ + hospi->Instance->RX_CTL &= ~OSPI_RX_CTL_RX_EN; + + /* Tx Enable */ + hospi->Instance->TX_CTL |= OSPI_TX_CTL_TX_EN; + + /* Transmit Start */ + HAL_OSPI_CS_Select(hospi); + + while(Size > 0) + { + /* Wait Tx FIFO Not Full */ + while(hospi->Instance->STATUS & OSPI_STATUS_TX_FIFO_FULL) + { + if(uiTimeout) + { + uiTimeout--; + if (uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + hospi->Instance->DAT = *pData++; + Size--; + uiTimeout = Timeout; + } + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_TX_BATCH_DONE)); + Status = HAL_OK; + + +End: + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Tx Disable */ + hospi->Instance->TX_CTL &= (~OSPI_TX_CTL_TX_EN); + + /* Transmit End */ + HAL_OSPI_CS_Release(hospi); + + + return Status; +} + + +/****************************************************************************** +*@brief : Receive an amount of data through FIFO HalfWord mode. +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@param : Timeout : Receive Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_ReceiveByHalfWord(OSPI_HandleTypeDef *hospi, uint16_t *pData, \ + uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status = HAL_OK; + __IO uint32_t uiTimeout; + + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + if (pData == NULL) return HAL_ERROR; + + uiTimeout = Timeout; + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_RX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Set Data Size */ + hospi->Instance->BATCH = (Size * 2); + + /* TX Disable */ + hospi->Instance->TX_CTL &= ~OSPI_TX_CTL_TX_EN; + + /* Rx Enable */ + hospi->Instance->RX_CTL |= OSPI_RX_CTL_RX_EN; + + /* Receive Start */ + HAL_OSPI_CS_Select(hospi); + + while(Size) + { + /* have no timeout */ + if (uiTimeout == 0) + { + /* Wait Rx FIFO Not Empty */ + while (hospi->Instance->STATUS & SPI_STATUS_RX_FIFO_EMPTY); + } + else + { + while (hospi->Instance->STATUS & SPI_STATUS_RX_FIFO_EMPTY) + { + if (uiTimeout-- == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + *pData++ = hospi->Instance->DAT; + Size--; + uiTimeout = Timeout; + } + + Status = HAL_OK; + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_RX_BATCH_DONE)); + +End: + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_RX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Rx Disable */ + hospi->Instance->RX_CTL &= (~OSPI_RX_CTL_RX_EN); + + /* Receive End */ + HAL_OSPI_CS_Release(hospi); + + return Status; +} + +/****************************************************************************** +*@brief : Receive an amount of data through FIFO Word mode. +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@param : Timeout : Receive Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_ReceiveByWord(OSPI_HandleTypeDef *hospi, uint32_t *pData, \ + uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status = HAL_OK; + __IO uint32_t uiTimeout; + + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + if (pData == NULL) return HAL_ERROR; + + uiTimeout = Timeout; + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_RX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Set Data Size */ + hospi->Instance->BATCH = (Size * 4); + + /* TX Disable */ + hospi->Instance->TX_CTL &= ~OSPI_TX_CTL_TX_EN; + + /* Rx Enable */ + hospi->Instance->RX_CTL |= OSPI_RX_CTL_RX_EN; + + /* Receive Start */ + HAL_OSPI_CS_Select(hospi); + + while(Size) + { + /* have no timeout */ + if (uiTimeout == 0) + { + /* Wait Rx FIFO Not Empty */ + while (hospi->Instance->STATUS & SPI_STATUS_RX_FIFO_EMPTY); + } + else + { + while (hospi->Instance->STATUS & SPI_STATUS_RX_FIFO_EMPTY) + { + if (uiTimeout-- == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + *pData++ = hospi->Instance->DAT; + Size--; + uiTimeout = Timeout; + } + + Status = HAL_OK; + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_RX_BATCH_DONE)); + +End: + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_RX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Rx Disable */ + hospi->Instance->RX_CTL &= (~OSPI_RX_CTL_RX_EN); + + /* Receive End */ + HAL_OSPI_CS_Release(hospi); + + return Status; +} + +/****************************************************************************** +*@brief : transmits an amount of data in FIFO Half Word mode before receiving an amount of data through FIFO Byte +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pTxData : Pointer to transmit data buffer +*@param : pRxData : Pointer to recieve data buffer +*@param : TxSize : Amount of data to be sent +*@param : RxSize : Amount of data to be receive +*@param : Timeout : sent and receive timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_Transmit_Recieve_ByByte(OSPI_HandleTypeDef *hospi, uint8_t *pTxData, uint32_t TXSize, \ + uint8_t *pRxData, uint32_t RXSize, uint32_t Timeout) +{ + __IO uint32_t uiTimeout; + HAL_StatusTypeDef Status = HAL_OK; + + /* Check SPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + if ((pTxData == NULL)||(pRxData == NULL)) return HAL_ERROR; + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Clear TX FIFO */ + SET_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + CLEAR_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + + /* Clear RX FIFO */ + SET_BIT(hospi->Instance->RX_CTL, OSPI_RX_CTL_RX_FIFO_RESET); + CLEAR_BIT(hospi->Instance->RX_CTL, OSPI_RX_CTL_RX_FIFO_RESET); + + /* Set Data Size */ + hospi->Instance->BATCH = TXSize; + + /* Tx Enable */ + hospi->Instance->TX_CTL |= OSPI_TX_CTL_TX_EN; + + /* Transmit Start */ + HAL_OSPI_CS_Select(hospi); + + uiTimeout = Timeout; + + while(TXSize) + { + /* Wait Tx FIFO Not Full */ + while(hospi->Instance->STATUS & OSPI_STATUS_TX_FIFO_FULL) + { + if(uiTimeout) + { + uiTimeout--; + if (uiTimeout == 0) + { + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Tx Disable */ + hospi->Instance->TX_CTL &= (~OSPI_TX_CTL_TX_EN); + + /* Transmit End */ + HAL_OSPI_CS_Release(hospi); + + Status = HAL_TIMEOUT; + return Status; + } + } + } + hospi->Instance->DAT = *pTxData++; + TXSize--; + uiTimeout = Timeout; + } + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_TX_BATCH_DONE)); + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + /* Tx Disable */ + hospi->Instance->TX_CTL &= (~OSPI_TX_CTL_TX_EN); + + /* Set Data Size */ + hospi->Instance->BATCH = RXSize; + + /* Rx Enable */ + hospi->Instance->RX_CTL |= OSPI_RX_CTL_RX_EN; + + /* recv reStart */ + HAL_OSPI_CS_Select(hospi); + + uiTimeout = Timeout; + + while(RXSize) + { + /* Wait Rx FIFO Not Empty */ + while (hospi->Instance->STATUS & OSPI_STATUS_RX_FIFO_EMPTY) + { + if(uiTimeout) + { + uiTimeout--; + if (uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + *pRxData++ = hospi->Instance->DAT; + RXSize--; + uiTimeout = Timeout; + } + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_RX_BATCH_DONE)); + +End: + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_RX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + /* Rx Disable */ + hospi->Instance->RX_CTL &= (~OSPI_RX_CTL_RX_EN); + + /* Transmit End */ + HAL_OSPI_CS_Release(hospi); + + return Status; +} + +/****************************************************************************** +*@brief : transmits an amount of data in FIFO Half Word mode before receiving an amount of data through FIFO Half Word +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pTxData : Pointer to transmit data buffer +*@param : pRxData : Pointer to recieve data buffer +*@param : TxSize : Amount of data to be sent +*@param : RxSize : Amount of data to be receive +*@param : Timeout : sent and receive timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_Transmit_Recieve_ByHalfWord(OSPI_HandleTypeDef *hospi, uint16_t *pTxData, \ + uint32_t TXSize, uint16_t *pRxData, uint32_t RXSize, uint32_t Timeout) +{ + __IO uint32_t uiTimeout; + HAL_StatusTypeDef Status = HAL_OK; + + /* Check SPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + if ((pTxData == NULL)||(pRxData == NULL)) return HAL_ERROR; + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Clear TX FIFO */ + SET_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + CLEAR_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + + /* Clear RX FIFO */ + SET_BIT(hospi->Instance->RX_CTL, OSPI_RX_CTL_RX_FIFO_RESET); + CLEAR_BIT(hospi->Instance->RX_CTL, OSPI_RX_CTL_RX_FIFO_RESET); + + /* Set Data Size */ + hospi->Instance->BATCH = (TXSize * 2); + + /* Tx Enable */ + hospi->Instance->TX_CTL |= OSPI_TX_CTL_TX_EN; + + /* Transmit Start */ + HAL_OSPI_CS_Select(hospi); + + uiTimeout = Timeout; + + while(TXSize) + { + /* Wait Tx FIFO Not Full */ + while(hospi->Instance->STATUS & OSPI_STATUS_TX_FIFO_FULL) + { + if(uiTimeout) + { + uiTimeout--; + if (uiTimeout == 0) + { + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Tx Disable */ + hospi->Instance->TX_CTL &= (~OSPI_TX_CTL_TX_EN); + + /* Transmit End */ + HAL_OSPI_CS_Release(hospi); + + Status = HAL_TIMEOUT; + return Status; + } + } + } + hospi->Instance->DAT = *pTxData++; + TXSize--; + uiTimeout = Timeout; + } + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_TX_BATCH_DONE)); + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + /* Tx Disable */ + hospi->Instance->TX_CTL &= (~OSPI_TX_CTL_TX_EN); + + /* Set Data Size */ + hospi->Instance->BATCH = (RXSize * 2); + + /* Rx Enable */ + hospi->Instance->RX_CTL |= OSPI_RX_CTL_RX_EN; + + /* recv reStart */ + HAL_OSPI_CS_Select(hospi); + + uiTimeout = Timeout; + + while(RXSize) + { + /* Wait Rx FIFO Not Empty */ + while (hospi->Instance->STATUS & OSPI_STATUS_RX_FIFO_EMPTY) + { + if(uiTimeout) + { + uiTimeout--; + if (uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + *pRxData++ = hospi->Instance->DAT; + RXSize--; + uiTimeout = Timeout; + } + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_RX_BATCH_DONE)); + +End: + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_RX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + /* Rx Disable */ + hospi->Instance->RX_CTL &= (~OSPI_RX_CTL_RX_EN); + + /* Transmit End */ + HAL_OSPI_CS_Release(hospi); + + return Status; +} + +/****************************************************************************** +*@brief : transmits an amount of data in FIFO Word mode before receiving an amount of data through FIFO Word +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : pTxData : Pointer to transmit data buffer +*@param : pRxData : Pointer to recieve data buffer +*@param : TxSize : Amount of data to be sent +*@param : RxSize : Amount of data to be receive +*@param : Timeout : sent and receive timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_Transmit_Recieve_ByWord(OSPI_HandleTypeDef *hospi, uint32_t *pTxData, uint32_t TXSize, \ + uint32_t *pRxData, uint32_t RXSize, uint32_t Timeout) +{ + __IO uint32_t uiTimeout; + HAL_StatusTypeDef Status = HAL_OK; + + /* Check SPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + + if ((pTxData == NULL)||(pRxData == NULL)) return HAL_ERROR; + + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Clear TX FIFO */ + SET_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + CLEAR_BIT(hospi->Instance->TX_CTL, OSPI_TX_CTL_TX_FIFO_RESET); + + /* Clear RX FIFO */ + SET_BIT(hospi->Instance->RX_CTL, OSPI_RX_CTL_RX_FIFO_RESET); + CLEAR_BIT(hospi->Instance->RX_CTL, OSPI_RX_CTL_RX_FIFO_RESET); + + /* Set Data Size */ + hospi->Instance->BATCH = (TXSize * 4); + + /* Tx Enable */ + hospi->Instance->TX_CTL |= OSPI_TX_CTL_TX_EN; + + /* Transmit Start */ + HAL_OSPI_CS_Select(hospi); + + uiTimeout = Timeout; + + while(TXSize) + { + /* Wait Tx FIFO Not Full */ + while(hospi->Instance->STATUS & OSPI_STATUS_TX_FIFO_FULL) + { + if(uiTimeout) + { + uiTimeout--; + if (uiTimeout == 0) + { + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_TX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + + /* Tx Disable */ + hospi->Instance->TX_CTL &= (~OSPI_TX_CTL_TX_EN); + + /* Transmit End */ + HAL_OSPI_CS_Release(hospi); + + Status = HAL_TIMEOUT; + return Status; + } + } + } + hospi->Instance->DAT = *pTxData++; + TXSize--; + uiTimeout = Timeout; + } + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_TX_BATCH_DONE)); + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + /* Tx Disable */ + hospi->Instance->TX_CTL &= (~OSPI_TX_CTL_TX_EN); + + /* Set Data Size */ + hospi->Instance->BATCH = (RXSize * 4); + + /* Rx Enable */ + hospi->Instance->RX_CTL |= OSPI_RX_CTL_RX_EN; + + /* recv reStart */ + HAL_OSPI_CS_Select(hospi); + + uiTimeout = Timeout; + + while(RXSize) + { + /* Wait Rx FIFO Not Empty */ + while (hospi->Instance->STATUS & OSPI_STATUS_RX_FIFO_EMPTY) + { + if(uiTimeout) + { + uiTimeout--; + if (uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + *pRxData++ = hospi->Instance->DAT; + RXSize--; + uiTimeout = Timeout; + } + + /* Wait Transmit Done */ + while (!(hospi->Instance->STATUS & OSPI_STATUS_RX_BATCH_DONE)); + +End: + /* Clear Batch Done Flag */ + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_RX_BATCH_DONE); + SET_BIT(hospi->Instance->STATUS, OSPI_STATUS_BATCH_DONE); + /* Rx Disable */ + hospi->Instance->RX_CTL &= (~OSPI_RX_CTL_RX_EN); + + /* Transmit End */ + HAL_OSPI_CS_Release(hospi); + + return Status; +} + +/****************************************************************************** +*@brief : Get Tx state. +* +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@return: OSPI Tx State +******************************************************************************/ +uint8_t HAL_OSPI_GetTxState(OSPI_HandleTypeDef *hospi) +{ + return hospi->TxState; +} + +/****************************************************************************** +*@brief : Get Rx state. +* +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@return: OSPI Rx State +******************************************************************************/ +uint8_t HAL_OSPI_GetRxState(OSPI_HandleTypeDef *hospi) +{ + return hospi->RxState; +} + +/****************************************************************************** +*@brief : OSPI Wire Config +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : X_Mode : 1x/2x/4x/8x Mode, see@ref X_MODE +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_WireConfig(OSPI_HandleTypeDef *hospi, uint32_t X_Mode) +{ + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + assert_param(IS_OSPI_X_MODE(X_Mode)); + + /* Set OSPI X_Mode */ + hospi->Instance->CTL = ((hospi->Instance->CTL) & (~SPI_CTL_X_MODE_Msk)) | X_Mode; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : OSPI Transmission rate mode +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : mode : OSPI_DTRM_STR or OSPI_DTRM_DTR, see@ref OSPI_DTR_STR +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_TransmitRateMode(OSPI_HandleTypeDef *hospi, uint32_t mode) +{ + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + assert_param(IS_OSPI_DTRM(mode)); + + /* Set OSPI DTRM */ + hospi->Instance->CTL = ((hospi->Instance->CTL) & (~OSPI_CTL_DTRM_Msk)) | mode; + + return HAL_OK; +} + + +/****************************************************************************** +*@brief : OSPI FIFO Write mode +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : mode : Byte/Halfword/Word Mode, see@ref OSPI_FIFO_Mode +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_FifoWriteMode(OSPI_HandleTypeDef *hospi, uint32_t mode) +{ + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + assert_param(IS_OSPI_FIFO_MODE(mode)); + + /* Set OSPI FIFO Write Mode */ + hospi->Instance->CTL = ((hospi->Instance->CTL) & (~OSPI_CTL_FW_MODE_Msk)) | (mode << OSPI_CTL_FW_MODE_Pos); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : OSPI FIFO Read mode +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : mode : Byte/Halfword/Word Mode, see@ref OSPI_FIFO_Mode +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_FifoReadMode(OSPI_HandleTypeDef *hospi, uint32_t mode) +{ + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + assert_param(IS_OSPI_FIFO_MODE(mode)); + + /* Set OSPI FIFO Write Mode */ + hospi->Instance->CTL = ((hospi->Instance->CTL) & (~OSPI_CTL_FR_MODE_Msk)) | (mode << OSPI_CTL_FR_MODE_Pos); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : set APM OPI Memory Dummy Clock +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : APMClock : see@ref OSPI_APM_Dummy_Clock +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_APMDummyClock(OSPI_HandleTypeDef *hospi, uint32_t APMClock) +{ + assert_param(IS_OSPI_APM_DUMMY_CLOCK(APMClock)); + /* Clear APMD_CLK bit */ + hospi->Instance->CTL &= (~OSPI_CTL_APMD_CLK_Msk ); + /* Set APMD_CLK */ + hospi->Instance->CTL |= APMClock; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Send output delay +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : Outdelay : see@ref OSPI_TX_OUT_Delay +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_TxOutDelay(OSPI_HandleTypeDef *hospi, uint32_t Outdelay) +{ + assert_param(IS_OSPI_TX_OUT_DELAY(Outdelay)); + /* Clear OUTDLY bit */ + hospi->Instance->TX_CTL &= (~(OSPI_TX_CTL_OUTDLY_Msk)); + /* Set OUTDLY */ + hospi->Instance->TX_CTL |= (Outdelay); + + return HAL_OK; + +} + +/****************************************************************************** +*@brief : Receive sampling delay +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : Outdelay : see@ref OSPI_TX_OUT_Delay +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_RxSampleDelay(OSPI_HandleTypeDef *hospi, uint32_t Sampledelay) +{ + assert_param(IS_OSPI_SAMPLE_SHIFT(Sampledelay)); + /* Clear SSHIFT bit */ + hospi->Instance->RX_CTL &= ~(OSPI_RX_CTL_SSHIFT_Msk); + /* Set SSHIFT */ + hospi->Instance->RX_CTL |= (Sampledelay << OSPI_RX_CTL_SSHIFT_Pos); + + return HAL_OK; + +} + + +/****************************************************************************** +*@brief : Memory mode enabled or disabled +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : state : see@ref OSPI_Memory_State +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_MemoryEnableDisable(OSPI_HandleTypeDef *hospi, uint32_t state) +{ + assert_param(IS_OSPI_MEMORY_STATE(state)); + + if(state == MEMOACC1_MEMORY_DISABLE) + { + hospi->Instance->MEMO_ACC1 &= ~MEMOACC1_MEMORY_ENABLE; + } + else + { + hospi->Instance->MEMO_ACC1 |= MEMOACC1_MEMORY_ENABLE; + } + + return HAL_OK; + +} + + +/****************************************************************************** +*@brief : DQS output enable or disable +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : state : see@ref OSPI_DQS_Output +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_DQSOutputEnableDisable(OSPI_HandleTypeDef *hospi, uint32_t state) +{ + assert_param(IS_OSPI_DQSOE(state)); + + if(state == OSPI_DQSOE_DISABLE) + { + hospi->Instance->CTL &= ~OSPI_DQSOE_ENABLE; + } + else + { + hospi->Instance->CTL |= OSPI_DQSOE_ENABLE; + } + + return HAL_OK; + +} + + +/****************************************************************************** +*@brief : DQS Sample enable or disable +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : Outdelay : see@ref OSPI_DQS_Smaple +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_DQSSampleEnableDisable(OSPI_HandleTypeDef *hospi, uint32_t state) +{ + assert_param(IS_OSPI_DQS_SAMPLE(state)); + + if(state == OSPI_DQS_SAMPLE_DISABLE) + { + hospi->Instance->RX_CTL &= ~OSPI_DQS_SAMPLE_ENABLE; + } + else + { + hospi->Instance->RX_CTL |= OSPI_DQS_SAMPLE_ENABLE; + } + + return HAL_OK; + +} + + +/****************************************************************************** +*@brief : Initialize the OSPI module Octal communication +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@param : DataMaskMode: see@ref OSPI_Data_Mask_Mode. +*@param : DataMaskCtrl: see@ref OSPI_DataMask_Ctrl. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_OSPI_DataMaskConfig(OSPI_HandleTypeDef *hospi, uint32_t DataMaskMode, uint32_t DataMaskCtrl) +{ + /* Check OSPI Parameter */ + assert_param (IS_OSPI_ALL_INSTANCE(hospi->Instance)); + assert_param(IS_OSPI_DM(DataMaskMode)); + assert_param(IS_OSPI_DMCTRL_ADDR(DataMaskCtrl)); + + /* Clear DTRMDM_ENDMCTRLMem_Mode bit */ + hospi->Instance->CTL &= (~(OSPI_CTL_DM_EN | OSPI_CTL_DMCTRL)); + + /* Set DM_ENDMCTRL */ + hospi->Instance->CTL |= ((DataMaskMode) | (DataMaskCtrl)); + + + return HAL_OK; +} + + + + + +#endif //HAL_OSPI_MODULE_ENABLED + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_pmu.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_pmu.c new file mode 100644 index 0000000000..c4bc7d3122 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_pmu.c @@ -0,0 +1,533 @@ + +/****************************************************************************** +*@file : hal_pmu.c +*@brief : PMU HAL module driver. +******************************************************************************/ +#include "hal.h" + + +#ifdef HAL_PMU_MODULE_ENABLED + +/****************************************************************************** +* @brief : PMU Initiation. +* @param : none +* @return: none +******************************************************************************/ +void HAL_PMU_Init(void) +{ + //PMU CLK Enable + __HAL_RCC_PMU_CLK_ENABLE(); + + HAL_SimpleDelay(10); +} + +/****************************************************************************** +* @brief : enter sleep mode. +* @param : mode: Event wake-up or interrupt wake-up +* @return: none +******************************************************************************/ +void HAL_PMU_EnterSleep(uint32_t mode) +{ + /* clear SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); + + if(mode == WAIT_FOR_INT) + { + /* Wait For Interrupt */ + __WFI(); + } + else + { + /*Wait For Event */ + __SEV(); + __WFE(); + __WFE(); + } + +} + +/****************************************************************************** +* @brief : enter stop mode. +* @param : mode: Event wake-up or interrupt wake-up +* @return: none +******************************************************************************/ +void HAL_PMU_EnterStop(uint32_t mode) +{ + HAL_PMU_ClearWakeupStatus(ALL_WANKEUP_STATUS); + + MODIFY_REG(PMU->CTRL0, PMU_CTRL0_LPMS_Msk, PMU_CTRL0_LPMS_STOP); + + HAL_SimpleDelay(1000);//Waiting for PMU area clock synchronization + + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); // Set SLEEPDEEP bit of Cortex System Control Register + + if(mode == WAIT_FOR_INT) + { + /* Wait For Interrupt */ + __WFI(); + } + else + { + /* Wait For Event */ + __SEV(); + __WFE(); + __WFE(); + } + /* clear SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + +/****************************************************************************** +* @brief : enter standby mode. +* @param : mode: Event wake-up or interrupt wake-up +* @return: none +******************************************************************************/ +void HAL_PMU_EnterStandbyMode(uint32_t mode) +{ + HAL_PMU_ClearWakeupStatus(ALL_WANKEUP_STATUS); + + MODIFY_REG(PMU->CTRL0, PMU_CTRL0_LPMS_Msk, PMU_CTRL0_LPMS_STANDBY);//Standby Mode + + HAL_SimpleDelay(1000);//Waiting for PMU area clock synchronization + + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); // Set SLEEPDEEP bit of Cortex System Control Register + + if(mode == WAIT_FOR_INT) + { + /* Wait For Interrupt */ + __WFI(); + } + else + { + /* Wait For Event */ + __SEV(); + __WFE(); + __WFE(); + } + + /* clear SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + +/****************************************************************************** +*@brief : Initialize the WakeupIO MSP: CLK, GPIO +*@param : none. +*@return: none +******************************************************************************/ +__weak void HAL_PMU_WakeupIO_MspInit(PMU_WakeUpIo_t wakeup_io) +{ + /* + NOTE : This function is implemented in user xxx_hal_msp.c + */ + + /* Prevent unused argument(s) compilation warning */ + UNUSED(NULL); +} + +/****************************************************************************** +* @brief : wakeup source select. +* @param : wakeup_io: wakeup source select(PMU_WAKEUP1 PMU_WAKEUP2 ...) +* @param : polarity: 0(high level), 1(low level). +* @return: none +******************************************************************************/ +void HAL_PMU_WakeupIOInit(PMU_WakeUpIo_t wakeup_io, PMU_WakeUpPolarity_t polarity) +{ + switch (wakeup_io) + { + case PMU_WAKEUP1: + case PMU_WAKEUP2: + case PMU_WAKEUP3: + case PMU_WAKEUP4: + case PMU_WAKEUP5: + { + HAL_PMU_WakeupIO_MspInit(wakeup_io); + /* Wakeup IO Filter Enable */ + __HAL_RCC_RTC_CLK_ENABLE(); + PMU->CTRL2 |= wakeup_io << PMU_CTRL2_WUXFILEN_Pos; + + /* Wakeup IO Enable */ + PMU->CTRL2 |= wakeup_io; + + if (polarity) + { + PMU->CTRL3 |= wakeup_io;//low level + } + else + { + PMU->CTRL3 &= (~wakeup_io);//high level + } + + } + break; + + default: break; + } +} + +/****************************************************************************** +* @brief : DeInitialize the Wakeup IO. +* @param : wakeup_io: wakeup source select(PMU_WAKEUP1 PMU_WAKEUP2 ...) +* @return: none +******************************************************************************/ +void HAL_PMU_WakeupIODeInit(PMU_WakeUpIo_t wakeup_io) +{ + /* Wakeup IO Filter Disable */ + PMU->CTRL2 &= ~(wakeup_io << PMU_CTRL2_WUXFILEN_Pos); + + /* Wakeup IO Disable */ + PMU->CTRL2 &= (~wakeup_io); +} + +/****************************************************************************** +* @brief : wakeup source select. +* @param : Wakeup_rtc: wakeup source select(RTC_WAKEUP_DATE...) +* @return: none +******************************************************************************/ +void HAL_PMU_StandbyWakeupRTCConfig(PMU_WakeUpRtc_t wakeup_rtc) +{ + switch (wakeup_rtc) + { + case STANDBY_WAKEUP_WUTIE: + case STANDBY_WAKEUP_STAMP2: + case STANDBY_WAKEUP_STAMP1: + case STANDBY_WAKEUP_32S: + case STANDBY_WAKEUP_ALARM: + case STANDBY_WAKEUP_1KHZ: + case STANDBY_WAKEUP_256HZ: + case STANDBY_WAKEUP_64HZ: + case STANDBY_WAKEUP_16HZ: + case STANDBY_WAKEUP_8HZ: + case STANDBY_WAKEUP_4HZ: + case STANDBY_WAKEUP_2HZ: + case STANDBY_WAKEUP_SEC: + case STANDBY_WAKEUP_MIN: + case STANDBY_WAKEUP_HOUR: + case STANDBY_WAKEUP_DATE: + { + //Enable RTC CLK + __HAL_RCC_RTC_CLK_ENABLE(); + + //Clear flags + SET_BIT(PMU->STCLR, (PMU_STCLR_CRTCWUF_Msk | PMU_STCLR_CSBF_Msk)); + + /* RTC domain write enable */ + SET_BIT(PMU->CTRL0,PMU_CTRL0_RTCWE); + RTC->SR = wakeup_rtc; + RTC->IE |= wakeup_rtc; + + }break; + + default: break; + } +} + +/****************************************************************************** +* @brief : Release the selected RTC wakeup source. +* @param : wakeup_rtc: wakeup source select(RTC_WAKEUP_DATE...) +* @return: none +******************************************************************************/ +void HAL_PMU_StandbyWakeupRTCRelease(PMU_WakeUpRtc_t wakeup_rtc) +{ + switch (wakeup_rtc) + { + case STANDBY_WAKEUP_WUTIE: + case STANDBY_WAKEUP_STAMP2: + case STANDBY_WAKEUP_STAMP1: + case STANDBY_WAKEUP_32S: + case STANDBY_WAKEUP_ALARM: + case STANDBY_WAKEUP_1KHZ: + case STANDBY_WAKEUP_256HZ: + case STANDBY_WAKEUP_64HZ: + case STANDBY_WAKEUP_16HZ: + case STANDBY_WAKEUP_8HZ: + case STANDBY_WAKEUP_4HZ: + case STANDBY_WAKEUP_2HZ: + case STANDBY_WAKEUP_SEC: + case STANDBY_WAKEUP_MIN: + case STANDBY_WAKEUP_HOUR: + case STANDBY_WAKEUP_DATE: + { + //Enable RTC CLK + __HAL_RCC_RTC_CLK_ENABLE(); + /* RTC domain write enable */ + SET_BIT(PMU->CTRL0,PMU_CTRL0_RTCWE); + + RTC->SR = wakeup_rtc; + RTC->IE &= (~wakeup_rtc); + + }break; + + default: break; + } +} + +/********************************************************************************* +* @brief : Check MCU have entered standby mode +* @param : none +* @return: 0: Not Enter Standby Mode,1: Entered Standby Mode +**********************************************************************************/ +bool HAL_PMU_CheckStandbyStatus(void) +{ + if (PMU->SR & PMU_SR_SBF_Msk) + { + return true; + } + else + { + return false; + } +} + +/****************************************************************************** +* @brief : Get MCU Wakeup Source. +* @param : none +* @return: Wakeup Source(PMU_SR_WUPFX_WKUP1PMU_SR_WUPFX_WKUP2 ...) +******************************************************************************/ +uint32_t HAL_PMU_GetWakeupSource(void) +{ + return PMU->SR; +} + +/****************************************************************************** +* @brief : Clear MCU Wakeup Status. +* @param : status:Wakeup Source(PMU_SR_WUPFX_WKUP1PMU_SR_WUPFX_WKUP2 ...) +* @return: none +******************************************************************************/ +void HAL_PMU_ClearWakeupStatus(uint32_t status) +{ + PMU->STCLR = status; +} + +/****************************************************************************** +* @brief : LVD Enable. +* @param : voltage: LVD threshold voltage selection (PMU_CTRL1_LVD_SEL_171~PMU_CTRL1_LVD_SEL_290) +* @param : filter: LVD filter time (PMU_CTRL1_FLT_TIME_1~PMU_CTRL1_FLT_TIME_4095) +* @param : filter_en: Digital filter enable (PMU_CTRL1_LVD_FLTEN) +* @return: none +******************************************************************************/ +void HAL_PMU_LvdEnable(uint32_t voltage, uint32_t filter, uint32_t filter_en) +{ + assert_param(IS_PMU_LVD_VOLTAGE(voltage)); + assert_param(IS_PMU_LVD_FILTER(filter)); + PMU->CTRL1 = ((voltage) | (PMU_CTRL1_LVDEN) | (filter) | (filter_en)); + HAL_SimpleDelay(100); +} + +/****************************************************************************** +* @brief : LVD disable. +* @param : none +* @return: none +******************************************************************************/ +void HAL_PMU_LvdDisable(void) +{ + PMU->CTRL1 &= (~PMU_CTRL1_LVDEN); +} + +/****************************************************************************** +* @brief : BOR Reset Enable. +* @param : voltage: BOR voltage selection (PMU_CTRL2_BOR_CFG_2V0~PMU_CTRL2_BOR_CFG_2V77) +* @return: none +******************************************************************************/ +void HAL_PMU_BorResetEnable(uint32_t voltage) +{ + assert_param(IS_PMU_BOR_VOLTAGE(voltage)); + + PMU->CTRL2 = (PMU->CTRL2 & (~(PMU_CTRL2_BORCFG))) | ((voltage) | (PMU_CTRL2_BOREN) | (PMU_CTRL2_BORRSTEN)); + HAL_SimpleDelay(100); +} + +/****************************************************************************** +* @brief : BOR Reset Disable. +* @param : none +* @return: none +******************************************************************************/ +void HAL_PMU_BorResetDisable(void) +{ + PMU->CTRL2 &= (~((PMU_CTRL2_BOREN) | (PMU_CTRL2_BORRSTEN))); + HAL_SimpleDelay(100); +} + +/****************************************************************************** +* @brief : Set the wake-up waiting time of Stop mode. +* @param : stopWaitTime: STOP wake-up waiting time +* @return: none +******************************************************************************/ +void HAL_PMU_StopWaitTime(uint32_t stopWaitTime) +{ + assert_param(IS_PMU_STOP_WAKE_WAIT(stopWaitTime)); + PMU->CTRL0 &= (~PMU_CTRL0_STOPWPT_Msk); + PMU->CTRL0 |= stopWaitTime << PMU_CTRL0_STOPWPT_Pos; +} + +/****************************************************************************** +* @brief : Set the wake-up waiting time of standby mode. +* @param : standbyWaitTime: standby wake-up waiting time +* @return: none +******************************************************************************/ +void HAL_PMU_StandbypWaitTime(uint32_t standbyWaitTime) +{ + assert_param(IS_PMU_STANDBY_WAKE_WAIT(standbyWaitTime)); + PMU->CTRL2 &= (~PMU_CTRL2_STDBYWPT_Msk); + PMU->CTRL2 |= standbyWaitTime << PMU_CTRL2_STDBYWPT_Pos; +} + +/****************************************************************************** +* @brief: STANDBY domain IO function selection. +* @param: PMU_Pin: specifies the STANDBY domain IO Pin. +* @param: PMU_Func: Specify the IO pin function of STANDBY domain. +* @return: None +******************************************************************************/ +void HAL_PMU_StandbyDomainPinConfig(uint32_t PMU_Pin, uint32_t PMU_Func) +{ + /* Check the parameters */ + assert_param(IS_PMU_PIN(PMU_Pin)); + assert_param(IS_PMU_PIN_FUNCTION(PMU_Func)); + + /* PC13 pin function selection */ + if(PMU_Pin == PMU_PIN_PC13) + { + /* Clear PC13_SEL bits */ + PMU->IOSEL &= (~PMU_IOSEL_PC13SEL_Msk); + + /* Set PC13_SEL bits according to PMU_Func value */ + PMU->IOSEL |= (PMU_Func << PMU_IOSEL_PC13SEL_Pos); + } + /* PC14 pin function selection */ + else if(PMU_Pin == PMU_PIN_PC14) + { + /* Clear PC14_SEL bits */ + PMU->IOSEL &= (~PMU_IOSEL_PC14SEL_Msk); + + /* Set PC14_SEL bits according to PMU_Func value */ + PMU->IOSEL |= (PMU_Func << PMU_IOSEL_PC14SEL_Pos); + } + /* PC15 pin function selection */ + else if(PMU_Pin == PMU_PIN_PC15) + { + /* Clear PC15_SEL bits */ + PMU->IOSEL &= (~PMU_IOSEL_PC15SEL_Msk); + + /* Set PC15_SEL bits according to PMU_Func value */ + PMU->IOSEL |= (PMU_Func << PMU_IOSEL_PC15SEL_Pos); + } + /* PI8 pin function selection */ + else + { + /* Clear PI8_SEL bits */ + PMU->IOSEL &= (~PMU_IOSEL_PI8SEL_Msk); + + /* Set PI8_SEL bits according to PMU_Func value */ + PMU->IOSEL |= (PMU_Func << PMU_IOSEL_PI8SEL_Pos); + + } +} + +/****************************************************************************** +* @brief: Set STANDBY domain IO value. +* @param: PMU_Pin: specifies the STANDBY domain IO Pin. +* @param: PMU_PinValue: specifies the STANDBY domain Pin Value. +* @return: None +******************************************************************************/ +void HAL_PMU_SetStandbyDomainPinValue(uint32_t PMU_Pin, uint32_t PMU_PinValue) +{ + /* Check the parameters */ + assert_param(IS_PMU_PIN(PMU_Pin)); + assert_param(IS_PMU_PIN_VALUE(PMU_PinValue)); + + /* PC13 pin function selection */ + if(PMU_Pin == PMU_PIN_PC13) + { + /* Clear PC13_Value bits */ + PMU->IOSEL &= (~PMU_IOSEL_PC13VALUE_Msk); + + /* Set PC13_Value bits according to PMU_Func value */ + PMU->IOSEL |= (PMU_PinValue << PMU_IOSEL_PC13VALUE_Pos); + } + /* PC14 pin function selection */ + else if(PMU_Pin == PMU_PIN_PC14) + { + /* Clear PC14_Value bits */ + PMU->IOSEL &= (~PMU_IOSEL_PC14VALUE_Msk); + + /* Set PC14_Value bits according to PMU_Func value */ + PMU->IOSEL |= (PMU_PinValue << PMU_IOSEL_PC14VALUE_Pos); + } + /* PC15 pin function selection */ + else if(PMU_Pin == PMU_PIN_PC15) + { + /* Clear PC15_Value bits */ + PMU->IOSEL &= (~PMU_IOSEL_PC15VALUE_Msk); + + /* Set PC15_Value bits according to PMU_Func value */ + PMU->IOSEL |= (PMU_PinValue << PMU_IOSEL_PC15VALUE_Pos); + } + /* PI8 pin function selection */ + else + { + /* Clear PI8_Value bits */ + PMU->IOSEL &= (~PMU_IOSEL_PI8VALUE_Msk); + + /* Set PI8_Value bits according to PMU_Func value */ + PMU->IOSEL |= (PMU_PinValue << PMU_IOSEL_PI8VALUE_Pos); + } +} + +/****************************************************************************** +* @brief: Get STANDBY domain IO value. +* @param: PMU_Pin: specifies the STANDBY domain IO Pin. +* @return: Pin Value +******************************************************************************/ +uint32_t HAL_PMU_GetStandbyDomainPinValue(uint32_t PMU_Pin) +{ + uint32_t tmp_value = 0; + /* Check the parameters */ + assert_param(IS_PMU_PIN(PMU_Pin)); + + /* get PC13 pin value */ + if(PMU_Pin == PMU_PIN_PC13) + { + tmp_value = ((PMU->IOSEL & PMU_IOSEL_PC13VALUE_Msk) >> PMU_IOSEL_PC13VALUE_Pos); + } + /* get PC14 pin value */ + else if(PMU_Pin == PMU_PIN_PC14) + { + tmp_value = ((PMU->IOSEL & PMU_IOSEL_PC14VALUE_Msk) >> PMU_IOSEL_PC14VALUE_Pos); + } + /* get PC15 pin value */ + else if(PMU_Pin == PMU_PIN_PC15) + { + tmp_value = ((PMU->IOSEL & PMU_IOSEL_PC15VALUE_Msk) >> PMU_IOSEL_PC15VALUE_Pos); + } + /* get PI8 pin value */ + else + { + tmp_value = ((PMU->IOSEL & PMU_IOSEL_PI8VALUE_Msk) >> PMU_IOSEL_PI8VALUE_Pos); + } + return tmp_value; +} + + +/****************************************************************************** +*@brief : PMU domain pin PC13 output type. +*@param : type: output type. +*@return: None +******************************************************************************/ +void HAL_PMU_StandbyDomainPinPC13OutputType(uint32_t type) +{ + /* Check the parameters */ + assert_param(IS_PMU_PIN_PC13_OUTPUT(type)); + + /* Clear PC13_Value bits */ + PMU->IOSEL &= (~PMU_IOSEL_PC13VALUE_Msk); + + /* Set PC13_Value bits according to type value */ + PMU->IOSEL |= (type << PMU_IOSEL_PC13VALUE_Pos); +} + +#endif + + + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_rcc.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_rcc.c new file mode 100644 index 0000000000..572ce43d9e --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_rcc.c @@ -0,0 +1,3087 @@ +/****************************************************************************** +*@file : hal_rcc.c +*@brief : RCC HAL module driver. +******************************************************************************/ +#include "hal.h" + +#ifdef HAL_RCC_MODULE_ENABLED + +__attribute__((weak)) void HAL_RCC_ReadyIRQHandler(void) +{ + // RCH clock ready + if ((RCC->CIR & (RCC_CIR_RCHRDYIE | RCC_CIR_RCHRDYIF)) == (RCC_CIR_RCHRDYIE | RCC_CIR_RCHRDYIF)) + { + RCC->CIR = (RCC->CIR & ~RCC_IT_CLEAR_FLAG_MASK) | RCC_CIR_RCHRDYIC; + HAL_RCC_RCHReadyCallback(); + } + + // XTH clock ready + if ((RCC->CIR & (RCC_CIR_XTHRDYIE | RCC_CIR_XTHRDYIF)) == (RCC_CIR_XTHRDYIE | RCC_CIR_XTHRDYIF)) + { + RCC->CIR = (RCC->CIR & ~RCC_IT_CLEAR_FLAG_MASK) | RCC_CIR_XTHRDYIC; + HAL_RCC_XTHReadyCallback(); + } + + // PLL1 clock ready + if ((RCC->CIR & (RCC_CIR_PLL1LOCKIE | RCC_CIR_PLL1LOCKIF)) == (RCC_CIR_PLL1LOCKIE | RCC_CIR_PLL1LOCKIF)) + { + RCC->CIR = (RCC->CIR & ~RCC_IT_CLEAR_FLAG_MASK) | RCC_CIR_PLL1LOCKIC; + HAL_RCC_PLL1ReadyCallback(); + } + + // PLL2 clock ready + if ((RCC->CIR & (RCC_CIR_PLL2LOCKIE | RCC_CIR_PLL2LOCKIF)) == (RCC_CIR_PLL2LOCKIE | RCC_CIR_PLL2LOCKIF)) + { + RCC->CIR = (RCC->CIR & ~RCC_IT_CLEAR_FLAG_MASK) | RCC_CIR_PLL2LOCKIC; + HAL_RCC_PLL2ReadyCallback(); + } + + // PLL3 clock ready + if ((RCC->CIR & (RCC_CIR_PLL3LOCKIE | RCC_CIR_PLL3LOCKIF)) == (RCC_CIR_PLL3LOCKIE | RCC_CIR_PLL3LOCKIF)) + { + RCC->CIR = (RCC->CIR & ~RCC_IT_CLEAR_FLAG_MASK) | RCC_CIR_PLL3LOCKIC; + HAL_RCC_PLL3ReadyCallback(); + } + + // RCL clock ready + if ((RCC->CIR & (RCC_CIR_RCLRDYIE | RCC_CIR_RCLRDYIF)) == (RCC_CIR_RCLRDYIE | RCC_CIR_RCLRDYIF)) + { + RCC->CIR = (RCC->CIR & ~RCC_IT_CLEAR_FLAG_MASK) | RCC_CIR_RCLRDYIC; + HAL_RCC_RCLReadyCallback(); + } + + // XTL clock ready + if ((RCC->CIR & (RCC_CIR_XTLRDYIE | RCC_CIR_XTLRDYIF)) == (RCC_CIR_XTLRDYIE | RCC_CIR_XTLRDYIF)) + { + RCC->CIR = (RCC->CIR & ~RCC_IT_CLEAR_FLAG_MASK) | RCC_CIR_XTLRDYIC; + HAL_RCC_XTLReadyCallback(); + } +} + +__attribute__((weak)) void HAL_RCC_XTHStopIRQHandler(void) +{ + // XTH stop + if ((RCC->CIR & (RCC_CIR_XTHSDIE | RCC_CIR_XTHSDF)) == (RCC_CIR_XTHSDIE | RCC_CIR_XTHSDF)) + { + RCC->CIR = (RCC->CIR & ~RCC_IT_CLEAR_FLAG_MASK) | RCC_CIR_XTHSDIC; + HAL_RCC_XTHStopCallback(); + } +} + +__attribute__((weak)) void HAL_RCC_XTLStopIRQHandler(void) +{ + // XTL stop + if ((RCC->CIR & (RCC_CIR_XTLSDIE | RCC_CIR_XTLSDF)) == (RCC_CIR_XTLSDIE | RCC_CIR_XTLSDF)) + { + RCC->STDBYCTRL &= ~RCC_STDBYCTRL_XTLSDEN; + RCC->STDBYCTRL &= ~RCC_STDBYCTRL_XTLEN; + RCC->CIR = (RCC->CIR & ~RCC_IT_CLEAR_FLAG_MASK) | RCC_CIR_XTLSDIC; + HAL_RCC_XTLStopCallback(); + } +} + +/****************************************************************************** +*@brief : RCH clock stable interrupt callback. +*@param : None +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_RCC_RCHReadyCallback(void) +{ +} + +/****************************************************************************** +*@brief : RCL clock stable interrupt callback. +*@param : None +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_RCC_RCLReadyCallback(void) +{ +} + +/****************************************************************************** +*@brief : XTH clock stable interrupt callback. +*@param : None +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_RCC_XTHReadyCallback(void) +{ +} + +/****************************************************************************** +*@brief : XTL clock stable interrupt callback. +*@param : None +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_RCC_XTLReadyCallback(void) +{ +} + +/****************************************************************************** +*@brief : PLL1 clock stable interrupt callback. +*@param : None +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_RCC_PLL1ReadyCallback(void) +{ +} + +/****************************************************************************** +*@brief : PLL2 clock stable interrupt callback. +*@param : None +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_RCC_PLL2ReadyCallback(void) +{ +} + +/****************************************************************************** +*@brief : PLL3 clock stable interrupt callback. +*@param : None +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_RCC_PLL3ReadyCallback(void) +{ +} + +/****************************************************************************** +*@brief : PLL3 clock stable interrupt callback. +*@param : None +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_RCC_XTHStopCallback(void) +{ +} + +/****************************************************************************** +*@brief : PLL3 clock stable interrupt callback. +*@param : None +*@return: None +******************************************************************************/ +__attribute__((weak)) void HAL_RCC_XTLStopCallback(void) +{ +} + +/****************************************************************************** +*@brief : Initializes the RCC Oscillators according to the specified parameters +* in the RCC_OscInitTypeDef. +*@param : RCC_OscInit: pointer to an RCC_OscInitTypeDef structure that contains +* the configuration information for the RCC Oscillators. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInit) +{ + /* Check the parameters */ + assert_param(IS_RCC_OSC_TYPE(RCC_OscInit->OscType)); + + /*------------------------------- RCH Configuration ------------------------*/ + if (RCC_OscInit->OscType & RCC_OSC_TYPE_RCH) + { + if (HAL_RCC_RCHConfig(RCC_OscInit->RCH, RCC_OscInit->RCHDiv16) != HAL_OK) + return HAL_ERROR; + } + + /*------------------------------- RCL Configuration ------------------------*/ + if (RCC_OscInit->OscType & RCC_OSC_TYPE_RCL) + { + if (HAL_RCC_RCLConfig(RCC_OscInit->RCL) != HAL_OK) + return HAL_ERROR; + } + + /*------------------------------- XTH Configuration ------------------------*/ + if (RCC_OscInit->OscType & RCC_OSC_TYPE_XTH) + { + if (HAL_RCC_XTHConfig(RCC_OscInit->XTH, RCC_OscInit->XTHBypass) != HAL_OK) + return HAL_ERROR; + } + + /*------------------------------- XTL Configuration ------------------------*/ + if (RCC_OscInit->OscType & RCC_OSC_TYPE_XTL) + { + if (HAL_RCC_XTLConfig(RCC_OscInit->XTL, RCC_OscInit->XTLBypass) != HAL_OK) + return HAL_ERROR; + } + + /*------------------------------- PLL1 Configuration ------------------------*/ + if (RCC_OscInit->OscType & RCC_OSC_TYPE_PLL1) + { + if (RCC_OscInit->PLL1.SSC == DISABLE) + { + if (HAL_RCC_PLL1Config(RCC_OscInit->PLL1.PLL, RCC_OscInit->PLL1.Source, RCC_OscInit->PLL1.PLLN, \ + RCC_OscInit->PLL1.PLLF, RCC_OscInit->PLL1.PLLP, RCC_OscInit->PLL1.PLLQ) != HAL_OK) + return HAL_ERROR; + } + else + { + if (HAL_RCC_PLL1SSCConfig(RCC_OscInit->PLL1.PLL, RCC_OscInit->PLL1.Source, RCC_OscInit->PLL1.PLLN, \ + RCC_OscInit->PLL1.PLLF, RCC_OscInit->PLL1.PLLP, RCC_OscInit->PLL1.PLLQ, \ + RCC_OscInit->PLL1.SSC, RCC_OscInit->PLL1.SSCMode, RCC_OscInit->PLL1.SSCSpectrum, \ + RCC_OscInit->PLL1.SSCStep) != HAL_OK) + return HAL_ERROR; + } + + if (HAL_RCC_PLL1PCLKConfig(RCC_OscInit->PLL1.PLLPCLK) != HAL_OK) + return HAL_ERROR; + + if (HAL_RCC_PLL1QCLKConfig(RCC_OscInit->PLL1.PLLQCLK) != HAL_OK) + return HAL_ERROR; + } + + /*------------------------------- PLL2 Configuration ------------------------*/ + if (RCC_OscInit->OscType & RCC_OSC_TYPE_PLL2) + { + if (RCC_OscInit->PLL1.SSC == DISABLE) + { + if (HAL_RCC_PLL2Config(RCC_OscInit->PLL2.PLL, RCC_OscInit->PLL2.Source, RCC_OscInit->PLL2.PLLN, \ + RCC_OscInit->PLL2.PLLF, RCC_OscInit->PLL2.PLLP, RCC_OscInit->PLL2.PLLQ) != HAL_OK) + return HAL_ERROR; + } + else + { + if (HAL_RCC_PLL2SSCConfig(RCC_OscInit->PLL2.PLL, RCC_OscInit->PLL2.Source, RCC_OscInit->PLL2.PLLN, \ + RCC_OscInit->PLL2.PLLF, RCC_OscInit->PLL2.PLLP, RCC_OscInit->PLL2.PLLQ, \ + RCC_OscInit->PLL1.SSC, RCC_OscInit->PLL1.SSCMode, RCC_OscInit->PLL1.SSCSpectrum, \ + RCC_OscInit->PLL1.SSCStep) != HAL_OK) + return HAL_ERROR; + } + + if (HAL_RCC_PLL2PCLKConfig(RCC_OscInit->PLL2.PLLPCLK) != HAL_OK) + return HAL_ERROR; + + if (HAL_RCC_PLL2QCLKConfig(RCC_OscInit->PLL2.PLLQCLK) != HAL_OK) + return HAL_ERROR; + } + + /*------------------------------- PLL3 Configuration ------------------------*/ + if (RCC_OscInit->OscType & RCC_OSC_TYPE_PLL3) + { + if (HAL_RCC_PLL3Config(RCC_OscInit->PLL3.PLL, RCC_OscInit->PLL3.Source, RCC_OscInit->PLL3.PLLN, \ + RCC_OscInit->PLL3.PLLF, RCC_OscInit->PLL3.PLLP, RCC_OscInit->PLL3.PLLQ) != HAL_OK) + return HAL_ERROR; + + if (HAL_RCC_PLL3PCLKConfig(RCC_OscInit->PLL3.PLLPCLK) != HAL_OK) + return HAL_ERROR; + + if (HAL_RCC_PLL3QCLKConfig(RCC_OscInit->PLL3.PLLQCLK) != HAL_OK) + return HAL_ERROR; + } + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Initializes the RCC Oscillators according to the specified parameters +* in the RCC_OscInitTypeDef. +*@param : RCC_OscInit: pointer to an RCC_OscInitTypeDef structure that contains +* the configuration information for the RCC Oscillators. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_RCHConfig(FunctionalState RCH, FunctionalState Div16) +{ + uint32_t temp; + uint32_t timeout; + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(RCH)); + + if (RCH == DISABLE) + { + if ((RCC->CCR1 & RCC_CCR1_SYSCLKSEL_1) == 0) + return (HAL_ERROR); + + if ((RCC->PLL1CR & (RCC_PLL1CR_PLL1SLEEP | RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1SRCSEL)) == RCC_PLL1CR_PLL1EN) + return (HAL_ERROR); + + if ((RCC->PLL2CR & (RCC_PLL2CR_PLL2SLEEP | RCC_PLL2CR_PLL2EN | RCC_PLL2CR_PLL2SRCSEL)) == RCC_PLL2CR_PLL2EN) + return (HAL_ERROR); + + if ((RCC->PLL3CR & (RCC_PLL3CR_PLL3SLEEP | RCC_PLL3CR_PLL3EN | RCC_PLL3CR_PLL3SRCSEL)) == RCC_PLL3CR_PLL3EN) + return (HAL_ERROR); + + /* disable RCH */ + RCC->RCHCR &= ~(RCC_RCHCR_RCHEN | RCC_RCHCR_RCHDIV); + HAL_SimpleDelay(2); + timeout = RCC_RCHP_UNREADY_TIMEOUT; + while (RCC->RCHCR & RCC_RCHCR_RCHRDY) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + } + else + { + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(Div16)); + + if (Div16 == DISABLE) + { + if ((RCC->PLL1CR & (RCC_PLL1CR_PLL1SLEEP | RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1SRCSEL)) == RCC_PLL1CR_PLL1EN) + return (HAL_ERROR); + + if ((RCC->PLL2CR & (RCC_PLL2CR_PLL2SLEEP | RCC_PLL2CR_PLL2EN | RCC_PLL2CR_PLL2SRCSEL)) == RCC_PLL2CR_PLL2EN) + return (HAL_ERROR); + + if ((RCC->PLL3CR & (RCC_PLL3CR_PLL3SLEEP | RCC_PLL3CR_PLL3EN | RCC_PLL3CR_PLL3SRCSEL)) == RCC_PLL3CR_PLL3EN) + return (HAL_ERROR); + + RCC->RCHCR &= ~RCC_RCHCR_RCHDIV; + } + + RCC->RCHCR |= RCC_RCHCR_RCHEN; + + HAL_SimpleDelay(5); + + timeout = RCC_RCH_READY_TIMEOUT; + while ((RCC->RCHCR & RCC_RCHCR_RCHRDY) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + if (Div16) + RCC->RCHCR |= RCC_RCHCR_RCHDIV; + + if ((RCC->CCR1 & RCC_CCR1_SYSCLKSEL) == RCC_SYSCLK_SOURCE_RCH) + { + temp = SystemCoreClock; + SystemCoreClock = HAL_RCC_GetSysCoreClockFreq(); + if (temp != SystemCoreClock) + { + HAL_InitTick(g_systickHandle.intPrio,g_systickHandle.msPeriod); + } + } + } + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Initializes the RCC Oscillators according to the specified parameters +* in the RCC_OscInitTypeDef. +*@param : RCC_OscInit: pointer to an RCC_OscInitTypeDef structure that contains +* the configuration information for the RCC Oscillators. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_RCLConfig(FunctionalState RCL) +{ + uint32_t timeout; + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(RCL)); + + if (RCL == DISABLE) + { + if ((RCC->STDBYCTRL & (RCC_STDBYCTRL_RTCEN | RCC_STDBYCTRL_RTCSEL)) == RCC_STDBYCTRL_RTCEN) + return (HAL_ERROR); + + /* disable RCL */ + RCC->STDBYCTRL = (RCC->STDBYCTRL & ~(RCC_STDBYCTRL_RCLDIS | RCC_STDBYCTRL_RCLEN)) | \ + (0x0AUL << RCC_STDBYCTRL_RCLDIS_Pos); + + HAL_SimpleDelay(2); + timeout = RCC_RCL_UNREADY_TIMEOUT; + while (RCC->STDBYCTRL & RCC_STDBYCTRL_RCLRDY) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + } + else + { + /* enable RCL */ + RCC->STDBYCTRL |= RCC_STDBYCTRL_RCLEN; + HAL_SimpleDelay(5); + /* Wait till RCL is ready */ + timeout = RCC_RCL_READY_TIMEOUT; + while (!(RCC->STDBYCTRL & RCC_STDBYCTRL_RCLRDY)) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + } + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Initializes the RCC Oscillators according to the specified parameters +* in the RCC_OscInitTypeDef. +*@param : RCC_OscInit: pointer to an RCC_OscInitTypeDef structure that contains +* the configuration information for the RCC Oscillators. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_XTHConfig(FunctionalState XTH, FunctionalState Bypass) +{ +// volatile uint32_t temp; + uint32_t timeout; + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(XTH)); + + if (DISABLE == XTH) + { + if ((RCC->CCR1 & RCC_CCR1_SYSCLKSEL) == RCC_CCR1_SYSCLKSEL_1) + return (HAL_ERROR); + + if ((RCC->PLL1CR & (RCC_PLL1CR_PLL1SLEEP | RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1SRCSEL)) == (RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1SRCSEL)) + return (HAL_ERROR); + + if ((RCC->PLL2CR & (RCC_PLL2CR_PLL2SLEEP | RCC_PLL2CR_PLL2EN | RCC_PLL2CR_PLL2SRCSEL)) == (RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1SRCSEL)) + return (HAL_ERROR); + + if ((RCC->PLL3CR & (RCC_PLL3CR_PLL3SLEEP | RCC_PLL3CR_PLL3EN | RCC_PLL3CR_PLL3SRCSEL)) == (RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1SRCSEL)) + return (HAL_ERROR); + + /* disable XTH */ + RCC->XTHCR &= ~RCC_XTHCR_XTHEN; + HAL_SimpleDelay(2); + timeout = RCC_XTH_UNREADY_TIMEOUT; + while (RCC->XTHCR & RCC_XTHCR_XTHRDY) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + } + else + { + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(Bypass)); + + if ((RCC->CCR1 & RCC_CCR1_SYSCLKSEL) == RCC_CCR1_SYSCLKSEL_1) + { + if (Bypass) + { + if ((RCC->XTHCR & RCC_XTHCR_XTHBYP) == 0) + return (HAL_ERROR); + } + else + { + if (RCC->XTHCR & RCC_XTHCR_XTHBYP) + return (HAL_ERROR); + } + } + + if (Bypass) + RCC->XTHCR |= RCC_XTHCR_XTHRDYTIME | RCC_XTHCR_XTHBYP | RCC_XTHCR_XTHEN; + else + RCC->XTHCR = (RCC->XTHCR & ~RCC_XTHCR_XTHBYP) | RCC_XTHCR_XTHRDYTIME | RCC_XTHCR_XTHEN; + + HAL_SimpleDelay(5); + timeout = RCC_XTH_READY_TIMEOUT; + while (!(RCC->XTHCR & RCC_XTHCR_XTHRDY)) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + } + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Initializes the RCC Oscillators according to the specified parameters +* in the RCC_OscInitTypeDef. +*@param : RCC_OscInit: pointer to an RCC_OscInitTypeDef structure that contains +* the configuration information for the RCC Oscillators. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_XTLConfig(FunctionalState XTL, FunctionalState Bypass) +{ + uint32_t timeout; + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(XTL)); + + if (DISABLE == XTL) + { + if ((RCC->STDBYCTRL & (RCC_STDBYCTRL_RTCEN | RCC_STDBYCTRL_RTCSEL)) == (RCC_STDBYCTRL_RTCEN | RCC_STDBYCTRL_RTCSEL)) + return (HAL_ERROR); + + /* disable XTL */ + RCC->STDBYCTRL &= ~RCC_STDBYCTRL_XTLEN; + HAL_SimpleDelay(5); + timeout = RCC_XTL_UNREADY_TIMEOUT; + while (RCC->STDBYCTRL & RCC_STDBYCTRL_XTLRDY) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + } + else + { + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(Bypass)); + + /* XTL oscillator bypass configuration */ + if (Bypass) + { + RCC->STDBYCTRL = (RCC->STDBYCTRL & ~RCC_STDBYCTRL_XTLDRV) | RCC_STDBYCTRL_XTLBYP | \ + RCC_STDBYCTRL_XTLDRV_1 | RCC_STDBYCTRL_XTLDRV_0 | RCC_STDBYCTRL_XTLEN; + } + else + { + RCC->STDBYCTRL = (RCC->STDBYCTRL & ~(RCC_STDBYCTRL_XTLBYP | RCC_STDBYCTRL_XTLDRV)) | \ + RCC_STDBYCTRL_XTLDRV_1 | RCC_STDBYCTRL_XTLDRV_0 | RCC_STDBYCTRL_XTLEN; + } + HAL_SimpleDelay(5); + timeout = RCC_XTL_READY_TIMEOUT; + while ((RCC->STDBYCTRL & RCC_STDBYCTRL_XTLRDY) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + RCC->STDBYCTRL |= RCC_STDBYCTRL_XTLDRV_2; + } + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Initializes the RCC Oscillators according to the specified parameters +* in the RCC_OscInitTypeDef. +*@param : RCC_OscInit: pointer to an RCC_OscInitTypeDef structure that contains +* the configuration information for the RCC Oscillators. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_PLL1Config(FunctionalState PLL1, uint32_t ClockSource, \ + uint32_t PLLN, uint32_t PLLF, uint32_t PLLP, uint32_t PLLQ) +{ + uint32_t lock; + uint32_t timeout; + #ifdef USE_FULL_ASSERT + double freq; + #endif + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(PLL1)); + + /* check whether the current configured clock is the system clock */ + if ((RCC->CCR1 & RCC_CCR1_SYSCLKSEL) == (RCC_CCR1_SYSCLKSEL_0 | RCC_CCR1_SYSCLKSEL_1)) + return (HAL_ERROR); + + if (PLL1 == DISABLE) + { + /* disable PLL1 */ + RCC->PLL1CR &= ~RCC_PLL1CR_PLL1EN; + /* enter sleep mode */ + RCC->PLL1CR |= RCC_PLL1CR_PLL1SLEEP; + HAL_SimpleDelay(15); + } + else + { + /* Check the parameters */ + assert_param(IS_RCC_PLL_CLOCK_SOURCE(ClockSource)); + assert_param(IS_RCC_PLL1_PLLN(PLLN)); + assert_param(IS_RCC_PLL1_PLLF(PLLF)); + assert_param(IS_RCC_PLL1_PLLP(PLLP)); + assert_param(IS_RCC_PLL1_PLLQ(PLLQ)); + + if (ClockSource == RCC_PLL_SOURCE_RCH_DIV16) + { + if ((RCC->RCHCR & (RCC_RCHCR_RCHDIV | RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) != \ + (RCC_RCHCR_RCHDIV | RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) + return (HAL_ERROR); + lock = RCC_PLL1CR_PLL1FREERUN; + #ifdef USE_FULL_ASSERT + freq = (double)4000000; + #endif + } + else + { + if ((RCC->XTHCR & (RCC_XTHCR_XTHRDY | RCC_XTHCR_XTHEN)) != (RCC_XTHCR_XTHRDY | RCC_XTHCR_XTHEN)) + return (HAL_ERROR); + lock = RCC_PLL1CR_PLL1LOCK; + #ifdef USE_FULL_ASSERT + freq = (double)XTH_VALUE; + #endif + } + + // FCLK_VCO=FCLKIN*F/N; FCLK_P=FCLK_VCO /P; FCLK_Q=FCLK_VCO /Q + + #ifdef USE_FULL_ASSERT + assert_param((freq >= 1000000) && (freq <= 132000000)); + freq = freq / PLLN; + assert_param((freq >= 1000000) && (freq <= 2000000)); + freq = freq * PLLF; + assert_param((freq >= 100000000) && (freq <= 550000000)); + assert_param(((freq / PLLP) >= 30000000) && ((freq / PLLP) <= 220000000)); + assert_param(((freq / PLLQ) >= 16000000) && ((freq / PLLQ) <= 220000000)); + #endif + + RCC->PLL1CR |= RCC_PLL1CR_PLL1LOCKSEL; + RCC->PLL1CR &= ~(RCC_PLL1CR_PLL1PCLKEN | RCC_PLL1CR_PLL1QCLKEN); + if (ClockSource == RCC_PLL_SOURCE_RCH_DIV16) + RCC->PLL1CR &= ~RCC_PLL1CR_PLL1SRCSEL; + else + RCC->PLL1CR |= RCC_PLL1CR_PLL1SRCSEL; + /* lock delay 400us */ + RCC->PLL1CR = (RCC->PLL1CR & ~RCC_PLL1CR_PLL1LOCKDLY) | \ + ((((uint32_t)(((double)400 * SystemCoreClock) / ((double)512 * 1000000))) \ + << RCC_PLL1CR_PLL1LOCKDLY_Pos) & RCC_PLL1CR_PLL1LOCKDLY); + /* enable PLL1 */ + RCC->PLL1CR |= RCC_PLL1CR_PLL1EN; + RCC->PLL1SCR = 0; + /* exit sleep mode */ + RCC->PLL1CR &= ~RCC_PLL1CR_PLL1SLEEP; + + HAL_SimpleDelay(15); + /* Wait till PLL is ready */ + timeout = RCC_PLL1_READY_TIMEOUT; + while ((RCC->PLL1CR & RCC_PLL1CR_PLL1FREERUN) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + RCC->PLL1CFR = (((PLLQ) << RCC_PLL1CFR_PLL1Q_Pos) & RCC_PLL1CFR_PLL1Q) | \ + (((((PLLP) >> 1) - 1) << RCC_PLL1CFR_PLL1P_Pos) & RCC_PLL1CFR_PLL1P) | \ + (((PLLN) << RCC_PLL1CFR_PLL1N_Pos) & RCC_PLL1CFR_PLL1N) | \ + (((PLLF) << RCC_PLL1CFR_PLL1F_Pos) & RCC_PLL1CFR_PLL1F); + + + if (ClockSource == RCC_PLL_SOURCE_XTH) + { + RCC->PLL1CR &= ~RCC_PLL1CR_PLL1LOCKSEL; + } + /* update pll */ + RCC->PLL1CR |= RCC_PLL1CR_PLL1UPDATEEN; + HAL_SimpleDelay(15); + /* Wait till PLL is ready */ + timeout = RCC_PLL1_READY_TIMEOUT; + while ((RCC->PLL1CR & lock) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + + + RCC->PLL1CR |= RCC_PLL1CR_PLL1PCLKEN; + } + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Initializes the RCC Oscillators according to the specified parameters +* in the RCC_OscInitTypeDef. +*@param : RCC_OscInit: pointer to an RCC_OscInitTypeDef structure that contains +* the configuration information for the RCC Oscillators. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_PLL1SSCConfig(FunctionalState PLL1, uint32_t ClockSource, \ + uint32_t PLLN, uint32_t PLLF, uint32_t PLLP, uint32_t PLLQ, \ + FunctionalState SSC, uint32_t Mode, uint32_t Spectrum, uint32_t Step) +{ + uint32_t lock; + uint32_t timeout; + #ifdef USE_FULL_ASSERT + double freq; + #endif + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(PLL1)); + + /* check whether the current configured clock is the system clock */ + if ((RCC->CCR1 & RCC_CCR1_SYSCLKSEL) == (RCC_CCR1_SYSCLKSEL_0 | RCC_CCR1_SYSCLKSEL_1)) + return (HAL_ERROR); + + if (PLL1 == DISABLE) + { + /* disable PLL1 */ + RCC->PLL1CR &= ~RCC_PLL1CR_PLL1EN; + RCC->PLL1SCR = 0; + /* enter sleep mode */ + RCC->PLL1CR |= RCC_PLL1CR_PLL1SLEEP; + HAL_SimpleDelay(15); + } + else + { + /* Check the parameters */ + assert_param(IS_RCC_PLL_CLOCK_SOURCE(ClockSource)); + assert_param(IS_RCC_PLL1_PLLN(PLLN)); + assert_param(IS_RCC_PLL1_PLLF(PLLF)); + assert_param(IS_RCC_PLL1_PLLP(PLLP)); + assert_param(IS_RCC_PLL1_PLLQ(PLLQ)); + + if (ClockSource == RCC_PLL_SOURCE_RCH_DIV16) + { + if ((RCC->RCHCR & (RCC_RCHCR_RCHDIV | RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) != \ + (RCC_RCHCR_RCHDIV | RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) + return (HAL_ERROR); + lock = RCC_PLL1CR_PLL1FREERUN; + #ifdef USE_FULL_ASSERT + freq = (double)4000000; + #endif + } + else + { + if ((RCC->XTHCR & (RCC_XTHCR_XTHRDY | RCC_XTHCR_XTHEN)) != (RCC_XTHCR_XTHRDY | RCC_XTHCR_XTHEN)) + return (HAL_ERROR); + lock = RCC_PLL1CR_PLL1LOCK; + #ifdef USE_FULL_ASSERT + freq = (double)XTH_VALUE; + #endif + } + + // FCLK_VCO=FCLKIN*F/N; FCLK_P=FCLK_VCO /P; FCLK_Q=FCLK_VCO /Q + + #ifdef USE_FULL_ASSERT + assert_param((freq >= 1000000) && (freq <= 132000000)); + freq = freq / PLLN; + assert_param((freq >= 1000000) && (freq <= 2000000)); + freq = freq * PLLF; + assert_param((freq >= 100000000) && (freq <= 550000000)); + assert_param(((freq / PLLP) >= 30000000) && ((freq / PLLP) <= 222000000)); + assert_param(((freq / PLLQ) >= 16000000) && ((freq / PLLQ) <= 222000000)); + #endif + + RCC->PLL1CR |= RCC_PLL1CR_PLL1LOCKSEL; + RCC->PLL1CR &= ~(RCC_PLL1CR_PLL1PCLKEN | RCC_PLL1CR_PLL1QCLKEN); + if (ClockSource == RCC_PLL_SOURCE_RCH_DIV16) + RCC->PLL1CR &= ~RCC_PLL1CR_PLL1SRCSEL; + else + RCC->PLL1CR |= RCC_PLL1CR_PLL1SRCSEL; + /* lock delay 400us */ + RCC->PLL1CR = (RCC->PLL1CR & ~RCC_PLL1CR_PLL1LOCKDLY) | \ + ((((uint32_t)(((double)400 * SystemCoreClock) / ((double)512 * 1000000))) \ + << RCC_PLL1CR_PLL1LOCKDLY_Pos) & RCC_PLL1CR_PLL1LOCKDLY); + /* enable PLL1 */ + RCC->PLL1CR |= RCC_PLL1CR_PLL1EN; + + if (SSC == DISABLE) + { + RCC->PLL1SCR = 0; + } + else + { + RCC->PLL1SCR = ((Step << RCC_PLL1SCR_PLL1SSCSTP_Pos) & RCC_PLL1SCR_PLL1SSCSTP) | \ + ((Spectrum << RCC_PLL1SCR_PLL1SSCPER_Pos) & RCC_PLL1SCR_PLL1SSCPER) | \ + Mode | RCC_PLL1SCR_PLL1SSCEN; + } + + /* exit sleep mode */ + RCC->PLL1CR &= ~RCC_PLL1CR_PLL1SLEEP; + + HAL_SimpleDelay(15); + /* Wait till PLL is ready */ + timeout = RCC_PLL1_READY_TIMEOUT; + while ((RCC->PLL1CR & RCC_PLL1CR_PLL1FREERUN) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + RCC->PLL1CFR = (((PLLQ) << RCC_PLL1CFR_PLL1Q_Pos) & RCC_PLL1CFR_PLL1Q) | \ + (((((PLLP) >> 1) - 1) << RCC_PLL1CFR_PLL1P_Pos) & RCC_PLL1CFR_PLL1P) | \ + (((PLLN) << RCC_PLL1CFR_PLL1N_Pos) & RCC_PLL1CFR_PLL1N) | \ + (((PLLF) << RCC_PLL1CFR_PLL1F_Pos) & RCC_PLL1CFR_PLL1F); + + if (ClockSource == RCC_PLL_SOURCE_XTH) + { + RCC->PLL1CR &= ~RCC_PLL1CR_PLL1LOCKSEL; + } + /* update pll */ + RCC->PLL1CR |= RCC_PLL1CR_PLL1UPDATEEN; + HAL_SimpleDelay(15); + /* Wait till PLL is ready */ + timeout = RCC_PLL1_READY_TIMEOUT; + while ((RCC->PLL1CR & lock) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + } + + return (HAL_OK); +} + +HAL_StatusTypeDef HAL_RCC_PLL1PCLKConfig(FunctionalState PLL1PCLK) +{ + /* check whether the current configured clock is the system clock */ + if ((RCC->CCR1 & RCC_CCR1_SYSCLKSEL) == (RCC_CCR1_SYSCLKSEL_1 | RCC_CCR1_SYSCLKSEL_0)) + return (HAL_ERROR); + + if (PLL1PCLK == DISABLE) + RCC->PLL1CR &= ~RCC_PLL1CR_PLL1PCLKEN; + else + RCC->PLL1CR |= RCC_PLL1CR_PLL1PCLKEN; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_RCC_PLL1QCLKConfig(FunctionalState PLL1QCLK) +{ + if (PLL1QCLK == DISABLE) + RCC->PLL1CR &= ~RCC_PLL1CR_PLL1QCLKEN; + else + RCC->PLL1CR |= RCC_PLL1CR_PLL1QCLKEN; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initializes the RCC Oscillators according to the specified parameters +* in the RCC_OscInitTypeDef. +*@param : RCC_OscInit: pointer to an RCC_OscInitTypeDef structure that contains +* the configuration information for the RCC Oscillators. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_PLL2Config(FunctionalState PLL2, uint32_t ClockSource, \ + uint32_t PLLN, uint32_t PLLF, uint32_t PLLP, uint32_t PLLQ) +{ + uint32_t lock; + uint32_t timeout; + #ifdef USE_FULL_ASSERT + double freq; + #endif + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(PLL2)); + + if (PLL2 == DISABLE) + { + /* disable PLL2 */ + RCC->PLL2CR &= ~RCC_PLL2CR_PLL2EN; + /* enter sleep mode */ + RCC->PLL2CR |= RCC_PLL2CR_PLL2SLEEP; + HAL_SimpleDelay(15); + } + else + { + /* Check the parameters */ + assert_param(IS_RCC_PLL_CLOCK_SOURCE(ClockSource)); + assert_param(IS_RCC_PLL2_PLLN(PLLN)); + assert_param(IS_RCC_PLL2_PLLF(PLLF)); + assert_param(IS_RCC_PLL2_PLLP(PLLP)); + assert_param(IS_RCC_PLL2_PLLQ(PLLQ)); + + if (ClockSource == RCC_PLL_SOURCE_RCH_DIV16) + { + if ((RCC->RCHCR & (RCC_RCHCR_RCHDIV | RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) != \ + (RCC_RCHCR_RCHDIV | RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) + return (HAL_ERROR); + lock = RCC_PLL2CR_PLL2FREERUN; + #ifdef USE_FULL_ASSERT + freq = (double)4000000; + #endif + } + else + { + if ((RCC_XTHCR_XTHRDY | RCC_XTHCR_XTHEN) != (RCC->XTHCR & (RCC_XTHCR_XTHRDY | RCC_XTHCR_XTHEN))) + return (HAL_ERROR); + lock = RCC_PLL2CR_PLL2LOCK; + #ifdef USE_FULL_ASSERT + freq = (double)XTH_VALUE; + #endif + } + + // FCLK_VCO=FCLKIN*F/N; FCLK_P=FCLK_VCO /P; FCLK_Q=FCLK_VCO /Q + #ifdef USE_FULL_ASSERT + assert_param((freq >= 1000000) && (freq <= 132000000)); + freq = freq / PLLN; + assert_param((freq >= 1000000) && (freq <= 2000000)); + freq = freq * PLLF; + assert_param((freq >= 100000000) && (freq <= 550000000)); + assert_param(((freq / PLLP) >= 30000000) && ((freq / PLLP) <= 220000000)); + assert_param(((freq / PLLQ) >= 16000000) && ((freq / PLLQ) <= 220000000)); + #endif + + RCC->PLL2CR |= RCC_PLL2CR_PLL2LOCKSEL; + RCC->PLL2CR &= ~(RCC_PLL2CR_PLL2PCLKEN | RCC_PLL2CR_PLL2QCLKEN); + if (ClockSource == RCC_PLL_SOURCE_RCH_DIV16) + RCC->PLL2CR &= ~RCC_PLL2CR_PLL2SRCSEL; + else + RCC->PLL2CR |= RCC_PLL2CR_PLL2SRCSEL; + /* lock delay 400us */ + RCC->PLL2CR = (RCC->PLL2CR & ~RCC_PLL2CR_PLL2LOCKDLY) | \ + ((((uint32_t)(((double)400 * SystemCoreClock) / ((double)512 * 1000000))) \ + << RCC_PLL2CR_PLL2LOCKDLY_Pos) & RCC_PLL2CR_PLL2LOCKDLY); + /* enable PLL2 */ + RCC->PLL2CR |= RCC_PLL2CR_PLL2EN; + RCC->PLL2SCR = 0; + /* exit sleep mode */ + RCC->PLL2CR &= ~RCC_PLL2CR_PLL2SLEEP; + HAL_SimpleDelay(15); + /* Wait till PLL is ready */ + timeout = RCC_PLL2_READY_TIMEOUT; + while ((RCC->PLL2CR & RCC_PLL2CR_PLL2FREERUN) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + + RCC->PLL2CFR = (((PLLQ) << RCC_PLL2CFR_PLL2Q_Pos) & RCC_PLL2CFR_PLL2Q) | \ + (((((PLLP) >> 1) - 1) << RCC_PLL2CFR_PLL2P_Pos) & RCC_PLL2CFR_PLL2P) | \ + (((PLLN) << RCC_PLL2CFR_PLL2N_Pos) & RCC_PLL2CFR_PLL2N) | \ + (((PLLF) << RCC_PLL2CFR_PLL2F_Pos) & RCC_PLL2CFR_PLL2F); + + if (ClockSource == RCC_PLL_SOURCE_XTH) + { + RCC->PLL2CR &= ~RCC_PLL2CR_PLL2LOCKSEL; + } + /* update pll */ + RCC->PLL2CR |= RCC_PLL2CR_PLL2UPDATEEN; + HAL_SimpleDelay(15); + /* Wait till PLL is ready */ + timeout = RCC_PLL2_READY_TIMEOUT; + while ((RCC->PLL2CR & lock) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + } + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Initializes the RCC Oscillators according to the specified parameters +* in the RCC_OscInitTypeDef. +*@param : RCC_OscInit: pointer to an RCC_OscInitTypeDef structure that contains +* the configuration information for the RCC Oscillators. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_PLL2SSCConfig(FunctionalState PLL2, uint32_t ClockSource, \ + uint32_t PLLN, uint32_t PLLF, uint32_t PLLP, uint32_t PLLQ, \ + FunctionalState SSC, uint32_t Mode, uint32_t Spectrum, uint32_t Step) +{ + uint32_t lock; + uint32_t timeout; + #ifdef USE_FULL_ASSERT + double freq; + #endif + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(PLL2)); + + if (PLL2 == DISABLE) + { + /* disable PLL2 */ + RCC->PLL2CR &= ~RCC_PLL2CR_PLL2EN; + /* enter sleep mode */ + RCC->PLL2CR |= RCC_PLL2CR_PLL2SLEEP; + HAL_SimpleDelay(15); + } + else + { + /* Check the parameters */ + assert_param(IS_RCC_PLL_CLOCK_SOURCE(ClockSource)); + assert_param(IS_RCC_PLL2_PLLN(PLLN)); + assert_param(IS_RCC_PLL2_PLLF(PLLF)); + assert_param(IS_RCC_PLL2_PLLP(PLLP)); + assert_param(IS_RCC_PLL2_PLLQ(PLLQ)); + + if (ClockSource == RCC_PLL_SOURCE_RCH_DIV16) + { + if ((RCC->RCHCR & (RCC_RCHCR_RCHDIV | RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) != \ + (RCC_RCHCR_RCHDIV | RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) + return (HAL_ERROR); + lock = RCC_PLL2CR_PLL2FREERUN; + #ifdef USE_FULL_ASSERT + freq = (double)4000000; + #endif + } + else + { + if ((RCC_XTHCR_XTHRDY | RCC_XTHCR_XTHEN) != (RCC->XTHCR & (RCC_XTHCR_XTHRDY | RCC_XTHCR_XTHEN))) + return (HAL_ERROR); + lock = RCC_PLL2CR_PLL2LOCK; + #ifdef USE_FULL_ASSERT + freq = (double)XTH_VALUE; + #endif + } + + // FCLK_VCO=FCLKIN*F/N; FCLK_P=FCLK_VCO /P; FCLK_Q=FCLK_VCO /Q + #ifdef USE_FULL_ASSERT + assert_param((freq >= 1000000) && (freq <= 132000000)); + freq = freq / PLLN; + assert_param((freq >= 1000000) && (freq <= 2000000)); + freq = freq * PLLF; + assert_param((freq >= 100000000) && (freq <= 550000000)); + assert_param(((freq / PLLP) >= 30000000) && ((freq / PLLP) <= 220000000)); + assert_param(((freq / PLLQ) >= 16000000) && ((freq / PLLQ) <= 220000000)); + #endif + + RCC->PLL2CR |= RCC_PLL2CR_PLL2LOCKSEL; + RCC->PLL2CR &= ~(RCC_PLL2CR_PLL2PCLKEN | RCC_PLL2CR_PLL2QCLKEN); + if (ClockSource == RCC_PLL_SOURCE_RCH_DIV16) + RCC->PLL2CR &= ~RCC_PLL2CR_PLL2SRCSEL; + else + RCC->PLL2CR |= RCC_PLL2CR_PLL2SRCSEL; + /* lock delay 400us */ + RCC->PLL2CR = (RCC->PLL2CR & ~RCC_PLL2CR_PLL2LOCKDLY) | \ + ((((uint32_t)(((double)400 * SystemCoreClock) / ((double)512 * 1000000))) \ + << RCC_PLL2CR_PLL2LOCKDLY_Pos) & RCC_PLL2CR_PLL2LOCKDLY); + /* enable PLL2 */ + RCC->PLL2CR |= RCC_PLL2CR_PLL2EN; + + if (SSC == DISABLE) + { + RCC->PLL2SCR = 0; + } + else + { + RCC->PLL2SCR = ((Step << RCC_PLL2SCR_PLL2SSCSTP_Pos) & RCC_PLL2SCR_PLL2SSCSTP) | \ + ((Spectrum << RCC_PLL2SCR_PLL2SSCPER_Pos) & RCC_PLL2SCR_PLL2SSCPER) | \ + Mode | RCC_PLL2SCR_PLL2SSCEN; + } + + /* exit sleep mode */ + RCC->PLL2CR &= ~RCC_PLL2CR_PLL2SLEEP; + HAL_SimpleDelay(15); + /* Wait till PLL is ready */ + timeout = RCC_PLL2_READY_TIMEOUT; + while ((RCC->PLL2CR & RCC_PLL2CR_PLL2FREERUN) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + + RCC->PLL2CFR = (((PLLQ) << RCC_PLL2CFR_PLL2Q_Pos) & RCC_PLL2CFR_PLL2Q) | \ + (((((PLLP) >> 1) - 1) << RCC_PLL2CFR_PLL2P_Pos) & RCC_PLL2CFR_PLL2P) | \ + (((PLLN) << RCC_PLL2CFR_PLL2N_Pos) & RCC_PLL2CFR_PLL2N) | \ + (((PLLF) << RCC_PLL2CFR_PLL2F_Pos) & RCC_PLL2CFR_PLL2F); + + if (ClockSource == RCC_PLL_SOURCE_XTH) + { + RCC->PLL2CR &= ~RCC_PLL2CR_PLL2LOCKSEL; + } + /* update pll */ + RCC->PLL2CR |= RCC_PLL2CR_PLL2UPDATEEN; + HAL_SimpleDelay(15); + /* Wait till PLL is ready */ + timeout = RCC_PLL2_READY_TIMEOUT; + while ((RCC->PLL2CR & lock) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + } + + return (HAL_OK); +} + +HAL_StatusTypeDef HAL_RCC_PLL2PCLKConfig(FunctionalState PLL2PCLK) +{ + if (PLL2PCLK == DISABLE) + RCC->PLL2CR &= ~RCC_PLL2CR_PLL2PCLKEN; + else + RCC->PLL2CR |= RCC_PLL2CR_PLL2PCLKEN; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_RCC_PLL2QCLKConfig(FunctionalState PLL2QCLK) +{ + if (DISABLE == PLL2QCLK) + RCC->PLL2CR &= ~RCC_PLL2CR_PLL2QCLKEN; + else + RCC->PLL2CR |= RCC_PLL2CR_PLL2QCLKEN; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initializes the RCC Oscillators according to the specified parameters +* in the RCC_OscInitTypeDef. +*@param : RCC_OscInit: pointer to an RCC_OscInitTypeDef structure that contains +* the configuration information for the RCC Oscillators. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_PLL3Config(FunctionalState PLL3, uint32_t ClockSource, \ + uint32_t PLLN, uint32_t PLLF, uint32_t PLLP, uint32_t PLLQ) +{ + uint32_t lock; + uint32_t timeout; + #ifdef USE_FULL_ASSERT + double freq; + #endif + + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(PLL3)); + + if (DISABLE == PLL3) + { + /* disable PLL3 */ + RCC->PLL3CR &= ~RCC_PLL3CR_PLL3EN; + /* enter sleep mode */ + RCC->PLL3CR |= RCC_PLL3CR_PLL3SLEEP; + } + else + { + /* Check the parameters */ + assert_param(IS_RCC_PLL_CLOCK_SOURCE(ClockSource)); + assert_param(IS_RCC_PLL3_PLLN(PLLN)); + assert_param(IS_RCC_PLL3_PLLF(PLLF)); + assert_param(IS_RCC_PLL3_PLLP(PLLP)); + assert_param(IS_RCC_PLL3_PLLQ(PLLQ)); + + if (RCC_PLL_SOURCE_RCH_DIV16 == ClockSource) + { + if ((RCC->RCHCR & (RCC_RCHCR_RCHDIV | RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) != \ + (RCC_RCHCR_RCHDIV | RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) + return (HAL_ERROR); + lock = RCC_PLL3CR_PLL3FREERUN; + #ifdef USE_FULL_ASSERT + freq = (double)4000000; + #endif + } + else + { + if ((RCC_XTHCR_XTHRDY | RCC_XTHCR_XTHEN) != (RCC->XTHCR & (RCC_XTHCR_XTHRDY | RCC_XTHCR_XTHEN))) + return (HAL_ERROR); + lock = RCC_PLL3CR_PLL3LOCK; + #ifdef USE_FULL_ASSERT + freq = (double)XTH_VALUE; + #endif + } + + // FCLK_VCO=FCLKIN*F/N; FCLK_P=FCLK_VCO /P; FCLK_Q=FCLK_VCO /Q + + #ifdef USE_FULL_ASSERT + assert_param((freq >= 1000000) && (freq <= 50000000)); + freq = freq / PLLN; + freq = freq * PLLF; + assert_param((freq >= 200000000) && (freq <= 500000000)); + assert_param(((freq / PLLP) >= 25000000) && ((freq / PLLP) <= 220000000)); + assert_param(((freq / PLLQ) >= 25000000) && ((freq / PLLQ) <= 220000000)); + #endif + + RCC->PLL3CR |= RCC_PLL3CR_PLL3LOCKSEL; + RCC->PLL3CR &= ~(RCC_PLL3CR_PLL3PCLKEN | RCC_PLL3CR_PLL3QCLKEN); + if (ClockSource == RCC_PLL_SOURCE_RCH_DIV16) + RCC->PLL3CR &= ~RCC_PLL3CR_PLL3SRCSEL; + else + RCC->PLL3CR |= RCC_PLL3CR_PLL3SRCSEL; + /* lock delay 110us */ + RCC->PLL3CR = (RCC->PLL3CR & ~RCC_PLL3CR_PLL3LOCKDLY) | \ + ((((uint32_t)(((double)110 * SystemCoreClock) / ((double)512 * 1000000))) \ + << RCC_PLL3CR_PLL3LOCKDLY_Pos) & RCC_PLL3CR_PLL3LOCKDLY); + /* enable PLL2 */ + RCC->PLL3CR |= RCC_PLL3CR_PLL3EN; + /* exit sleep mode */ + RCC->PLL3CR &= ~RCC_PLL3CR_PLL3SLEEP; + HAL_SimpleDelay(15); + /* Wait till PLL is ready */ + timeout = RCC_PLL3_READY_TIMEOUT; + while ((RCC->PLL3CR & RCC_PLL3CR_PLL3FREERUN) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + + RCC->PLL3CFR = ((((PLLQ) == 1 ? 0 : ((PLLQ) == 2 ? 1 : ((PLLQ) == 4 ? 2 : 3))) << RCC_PLL3CFR_PLL3Q_Pos) & RCC_PLL3CFR_PLL3Q) | \ + ((((PLLP) == 1 ? 0 : ((PLLP) == 2 ? 1 : ((PLLP) == 4 ? 2 : 3))) << RCC_PLL3CFR_PLL3P_Pos) & RCC_PLL3CFR_PLL3P) | \ + ((((PLLN) - 1) << RCC_PLL3CFR_PLL3N_Pos) & RCC_PLL3CFR_PLL3N) | \ + ((((PLLF) - 1) << RCC_PLL3CFR_PLL3F_Pos) & RCC_PLL3CFR_PLL3F); + + if (ClockSource == RCC_PLL_SOURCE_XTH) + { + RCC->PLL3CR &= ~RCC_PLL3CR_PLL3LOCKSEL; + } + /* update pll */ + RCC->PLL3CR |= RCC_PLL3CR_PLL3UPDATEEN; + HAL_SimpleDelay(15); + /* Wait till PLL is ready */ + timeout = RCC_PLL3_READY_TIMEOUT; + while ((RCC->PLL3CR & lock) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + } + + return (HAL_OK); +} + +HAL_StatusTypeDef HAL_RCC_PLL3PCLKConfig(FunctionalState PLL3PCLK) +{ + if (PLL3PCLK == DISABLE) + RCC->PLL3CR &= ~RCC_PLL3CR_PLL3PCLKEN; + else + RCC->PLL3CR |= RCC_PLL3CR_PLL3PCLKEN; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_RCC_PLL3QCLKConfig(FunctionalState PLL3QCLK) +{ + if (PLL3QCLK == DISABLE) + RCC->PLL3CR &= ~RCC_PLL3CR_PLL3QCLKEN; + else + RCC->PLL3CR |= RCC_PLL3CR_PLL3QCLKEN; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_RCC_ITConfig(uint32_t IT, FunctionalState NewStatus) +{ + /* Check the parameters */ + assert_param(IS_RCC_IT(IT)); + + if (NewStatus) + RCC->CIR |= ((IT & RCC_IT_READY_MASK) << 8) | ((IT & RCC_IT_STOP_MASK) >> 3); + else + RCC->CIR &= ~((((IT & RCC_IT_READY_MASK)) << 8) | ((IT & RCC_IT_STOP_MASK) >> 3)); + + return HAL_OK; +} + +uint32_t HAL_RCC_GetITFlag(uint32_t IT) +{ + /* Check the parameters */ + assert_param(IS_RCC_IT(IT)); + + if ((RCC->CIR & IT) == IT) + return true; + else + return false; +} + +HAL_StatusTypeDef HAL_RCC_ClearITFlag(uint32_t IT) +{ + /* Check the parameters */ + assert_param(IS_RCC_IT(IT)); + + RCC->CIR |= ((IT & RCC_IT_READY_MASK) << 16) | ( (IT & RCC_IT_STOP_MASK) >> 2); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initializes the CPU, AHB and APB buses clocks according to the +* specified parameters in the RCC_ClkInitTypeDef. +*@param : RCC_ClkInit: pointer to an RCC_ClkInitTypeDef structure that +* contains the configuration information for the RCC peripheral. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInit) +{ + /* Check the parameters */ + assert_param(IS_RCC_CLOCK_TYPE(RCC_ClkInit->ClockType)); + + /* first level frequency division of system clock */ + if (RCC_ClkInit->ClockType & RCC_CLOCK_TYPE_SYSDIV0) + { + if (HAL_RCC_SYSCLKDiv0Config(RCC_ClkInit->SYSCLKDiv0) != HAL_OK) + return HAL_ERROR; + } + + /* second level frequency division of system clock */ + if (RCC_ClkInit->ClockType & RCC_CLOCK_TYPE_SYSDIV1) + { + if (HAL_RCC_SYSCLKDiv1Config(RCC_ClkInit->SYSCLKDiv1) != HAL_OK) + return HAL_ERROR; + } + + /* frequency division of PCLK1 clock */ + if (RCC_ClkInit->ClockType & RCC_CLOCK_TYPE_PCLK1) + { + if (HAL_RCC_PCLK1DivConfig(RCC_ClkInit->PCLK1Div) != HAL_OK) + return HAL_ERROR; + } + + /* frequency division of PCLK2 clock */ + if (RCC_ClkInit->ClockType & RCC_CLOCK_TYPE_PCLK2) + { + if (HAL_RCC_PCLK2DivConfig(RCC_ClkInit->PCLK2Div) != HAL_OK) + return HAL_ERROR; + } + + /* frequency division of PCLK3 clock */ + if (RCC_ClkInit->ClockType & RCC_CLOCK_TYPE_PCLK3) + { + if (HAL_RCC_PCLK3DivConfig(RCC_ClkInit->PCLK3Div) != HAL_OK) + return HAL_ERROR; + } + + /* frequency division of PCLK4 clock */ + if (RCC_ClkInit->ClockType & RCC_CLOCK_TYPE_PCLK4) + { + if (HAL_RCC_PCLK4DivConfig(RCC_ClkInit->PCLK4Div) != HAL_OK) + return HAL_ERROR; + } + + /* system clok source configuration */ + if (RCC_ClkInit->ClockType & RCC_CLOCK_TYPE_SYSCLK) + { + if (HAL_RCC_SYSCLKSourceConfig(RCC_ClkInit->SYSCLKSource) != HAL_OK) + return HAL_ERROR; + } + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Switch the system clock. +*@param : SYSCLKSource: SYSCLK clock source. +* This parameter must be a value of @ref RCC_Sysclk_Source. +* @arg RCC_SYSCLKSOURCE_RCH: RCH clock selected as SYSCLK source +* @arg RCC_SYSCLKSOURCE_RCL: RCL clock selected as SYSCLK source +* @arg RCC_SYSCLKSOURCE_XTH: XTH clock selected as SYSCLK source +* @arg RCC_SYSCLKSOURCE_XTL: XTL clock selected as SYSCLK source +* @arg RCC_SYSCLKSOURCE_PLL1PCLK: PLL1PCLK clock selected as SYSCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_SYSCLKSourceConfig(uint32_t ClockSource) +{ + uint32_t temp; + + /* Check the parameters */ + assert_param(IS_RCC_SYSCLK_SOURCE(ClockSource)); + + if (ClockSource == RCC_SYSCLK_SOURCE_RCH) + { + /* Check whether the RCH clock is turned on and running stably */ + if ((RCC->RCHCR & (RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) != (RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) + return HAL_ERROR; + + /* system clok source configuration */ + RCC->CCR1 = RCC->CCR1 & ~RCC_CCR1_SYSCLKSEL; + } + else if (RCC_SYSCLK_SOURCE_XTH == ClockSource) + { + /* Check whether the XTH clock is turned on and running stably */ + if ((RCC->XTHCR & (RCC_XTHCR_XTHEN | RCC_XTHCR_XTHRDY)) != (RCC_XTHCR_XTHEN | RCC_XTHCR_XTHRDY)) + return HAL_ERROR; + + /* system clok source configuration */ + RCC->CCR1 = (RCC->CCR1 & ~RCC_CCR1_SYSCLKSEL) | RCC_CCR1_SYSCLKSEL_1; + } + else + { + /* Check whether the PLL clock is turned on and running stably */ + if (RCC->PLL1CR & RCC_PLL1CR_PLL1SRCSEL) + { + if ((RCC->PLL1CR & (RCC_PLL1CR_PLL1SLEEP | RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1PCLKEN | RCC_PLL1CR_PLL1LOCK)) != \ + (RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1PCLKEN | RCC_PLL1CR_PLL1LOCK)) + return HAL_ERROR; + } + else + { + if ((RCC->PLL1CR & (RCC_PLL1CR_PLL1SLEEP | RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1PCLKEN | RCC_PLL1CR_PLL1FREERUN)) != \ + (RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1PCLKEN | RCC_PLL1CR_PLL1FREERUN)) + return HAL_ERROR; + } + + /* system clok source configuration */ + RCC->CCR1 = (RCC->CCR1 & ~RCC_CCR1_SYSCLKSEL) | RCC_CCR1_SYSCLKSEL_1 | RCC_CCR1_SYSCLKSEL_0; + } + + temp = SystemCoreClock; + SystemCoreClock = HAL_RCC_GetSysCoreClockFreq(); + if (temp != SystemCoreClock) + { + HAL_InitTick(g_systickHandle.intPrio,g_systickHandle.msPeriod); + } + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_FLT_CLK_SOURCE_PCLK_DIV32: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_FLT_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_SYSCLKDiv0Config(uint32_t Div) +{ + uint32_t temp; + uint32_t timeout; + + /* Check the parameters */ + assert_param(IS_RCC_SYSCLK_DIV(Div)); + + RCC->CCR2 = (RCC->CCR2 & ~RCC_CCR2_SYSDIV0) | (((Div - 1) << RCC_CCR2_SYSDIV0_Pos) & RCC_CCR2_SYSDIV0); + HAL_SimpleDelay(5); + /* Wait till the update frequency division to complete */ + timeout = 256u; + while ((RCC->CCR2 & RCC_CCR2_DIVDONE) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + + temp = SystemCoreClock; + SystemCoreClock = HAL_RCC_GetSysCoreClockFreq(); + if (temp != SystemCoreClock) + { + HAL_InitTick(g_systickHandle.intPrio,g_systickHandle.msPeriod); + } + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_FLT_CLK_SOURCE_PCLK_DIV32: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_FLT_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_SYSCLKDiv1Config(uint32_t Div) +{ + uint32_t temp; + uint32_t timeout; + + /* Check the parameters */ + assert_param(IS_RCC_SYSCLK_DIV(Div)); + + RCC->CCR2 = (RCC->CCR2 & ~RCC_CCR2_SYSDIV1) | (((Div - 1) << RCC_CCR2_SYSDIV1_Pos) & RCC_CCR2_SYSDIV1); + + HAL_SimpleDelay(2); + + /* Wait till the update frequency division to complete */ + timeout = 256u; + while ((RCC->CCR2 & RCC_CCR2_DIVDONE) == 0) + { + if (timeout-- == 0) + return (HAL_TIMEOUT); + } + + temp = SystemCoreClock; + SystemCoreClock = HAL_RCC_GetSysCoreClockFreq(); + if (temp != SystemCoreClock) + { + HAL_InitTick(g_systickHandle.intPrio,g_systickHandle.msPeriod); + } + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_FLT_CLK_SOURCE_PCLK_DIV32: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_FLT_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_PCLK1DivConfig(uint32_t Div) +{ + /* Check the parameters */ + assert_param(IS_RCC_PCLK_DIV(Div)); + + RCC->CCR2 = (RCC->CCR2 & ~RCC_CCR2_PCLK1DIV) | ((Div == 1 ? 0 : \ + (Div == 2 ? 4 : \ + (Div == 4 ? 5 : \ + (Div == 8 ? 6 : 7)))) << RCC_CCR2_PCLK1DIV_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_FLT_CLK_SOURCE_PCLK_DIV32: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_FLT_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_PCLK2DivConfig(uint32_t Div) +{ + /* Check the parameters */ + assert_param(IS_RCC_PCLK_DIV(Div)); + + RCC->CCR2 = (RCC->CCR2 & ~RCC_CCR2_PCLK2DIV) | ((Div == 1 ? 0 : \ + (Div == 2 ? 4 : \ + (Div == 4 ? 5 : \ + (Div == 8 ? 6 : 7)))) << RCC_CCR2_PCLK2DIV_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_FLT_CLK_SOURCE_PCLK_DIV32: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_FLT_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_PCLK3DivConfig(uint32_t Div) +{ + /* Check the parameters */ + assert_param(IS_RCC_PCLK_DIV(Div)); + + RCC->CCR2 = (RCC->CCR2 & ~RCC_CCR2_PCLK3DIV) | ((Div == 1 ? 0 : \ + (Div == 2 ? 4 : \ + (Div == 4 ? 5 : \ + (Div == 8 ? 6 : 7)))) << RCC_CCR2_PCLK3DIV_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_FLT_CLK_SOURCE_PCLK_DIV32: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_FLT_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_PCLK4DivConfig(uint32_t Div) +{ + /* Check the parameters */ + assert_param(IS_RCC_PCLK_DIV(Div)); + + RCC->CCR2 = (RCC->CCR2 & ~RCC_CCR2_PCLK4DIV) | ((Div == 1 ? 0 : \ + (Div == 2 ? 4 : \ + (Div == 4 ? 5 : \ + (Div == 8 ? 6 : 7)))) << RCC_CCR2_PCLK4DIV_Pos); + + return (HAL_OK); +} + + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_FLT_CLK_SOURCE_PCLK_DIV32: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_FLT_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_HRNGSClockDivConfig(uint32_t Div) +{ + /* Check the parameters */ + assert_param(IS_RCC_HRNGS_CLK_DIV(Div)); + + /* FLTCLK clok source configuration */ + RCC->CCR2 = (RCC->CCR2 & ~RCC_CCR2_HRNGSDIV) | (((Div - 1) << RCC_CCR2_HRNGSDIV_Pos) & RCC_CCR2_HRNGSDIV); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_FLT_CLK_SOURCE_PCLK_DIV32: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_FLT_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_FLTClockSourceConfig(uint32_t ClockSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_FLT_CLK_SOURCE(ClockSource)); + + /* FLTCLK clok source configuration */ + RCC->CCR2 = (RCC->CCR2 & ~RCC_CCR2_FLTCLKSEL) | ((ClockSource << RCC_CCR2_FLTCLKSEL_Pos) & RCC_CCR2_FLTCLKSEL); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure LPUART1 clock source. +*@param : ClockSource: LPUART1 clock source. +* This parameter must be a value of @ref RCC_LPUART1_CLK_Source. +* @arg RCC_LPUART1_CLK_SOURCE_RCL : +* @arg RCC_LPUART1_CLK_SOURCE_XTL : +* @arg RCC_LPUART1_CLK_SOURCE_PCLK1_DIV4 : +* @arg RCC_LPUART1_CLK_SOURCE_PCLK1_DIV8 : +* @arg RCC_LPUART1_CLK_SOURCE_PCLK1_DIV16 : +* @arg RCC_LPUART1_CLK_SOURCE_PCLK1_DIV32 : +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_LPUART1ClockSourceConfig(uint32_t ClockSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_LPUART1_CLK_SOURCE(ClockSource)); + + /* FLTCLK clok source configuration */ + if (ClockSource <= RCC_LPUART1_CLK_SOURCE_XTL) + RCC->PERCFGR = (RCC->PERCFGR & ~(RCC_PERCFGR_LPUART1CKS | RCC_PERCFGR_LPUART1DIV)) | \ + (ClockSource << RCC_PERCFGR_LPUART1CKS_Pos); + else + RCC->PERCFGR = (RCC->PERCFGR & ~(RCC_PERCFGR_LPUART1CKS | RCC_PERCFGR_LPUART1DIV)) | \ + RCC_PERCFGR_LPUART1CKS_1 | ((ClockSource - 2) << RCC_PERCFGR_LPUART1DIV_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM1_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM1_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM1_CLK_SOURCE_RCH: RCH clock selected as FLTCLK source +* @arg RCC_LPTIM1_CLK_SOURCE_XTL: XTL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_LPTIM1ClockSourceConfig(uint32_t ClockSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_LPTIM1_CLK_SOURCE(ClockSource)); + + /* FLTCLK clok source configuration */ + RCC->PERCFGR = (RCC->PERCFGR & ~RCC_PERCFGR_LPTIM1CKS) | (ClockSource << RCC_PERCFGR_LPTIM1CKS_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM2_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM2_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM2_CLK_SOURCE_RCH: RCH clock selected as FLTCLK source +* @arg RCC_LPTIM2_CLK_SOURCE_XTL: XTL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_LPTIM2ClockSourceConfig(uint32_t ClockSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_LPTIM2_CLK_SOURCE(ClockSource)); + + /* FLTCLK clok source configuration */ + RCC->PERCFGR = (RCC->PERCFGR & ~RCC_PERCFGR_LPTIM2CKS) | (ClockSource << RCC_PERCFGR_LPTIM2CKS_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM345_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCH: RCH clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_XTL: XTL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_LPTIM3ClockSourceConfig(uint32_t ClockSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_LPTIM3_CLK_SOURCE(ClockSource)); + + /* FLTCLK clok source configuration */ + RCC->PERCFGR = (RCC->PERCFGR & ~RCC_PERCFGR_LPTIM345CKS) | (ClockSource << RCC_PERCFGR_LPTIM345CKS_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM345_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCH: RCH clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_XTL: XTL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_LPTIM4ClockSourceConfig(uint32_t ClockSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_LPTIM4_CLK_SOURCE(ClockSource)); + + /* FLTCLK clok source configuration */ + RCC->PERCFGR = (RCC->PERCFGR & ~RCC_PERCFGR_LPTIM345CKS) | (ClockSource << RCC_PERCFGR_LPTIM345CKS_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM345_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCH: RCH clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_XTL: XTL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_LPTIM5ClockSourceConfig(uint32_t ClockSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_LPTIM5_CLK_SOURCE(ClockSource)); + + /* FLTCLK clok source configuration */ + RCC->PERCFGR = (RCC->PERCFGR & ~RCC_PERCFGR_LPTIM345CKS) | (ClockSource << RCC_PERCFGR_LPTIM345CKS_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM6_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM6_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM6_CLK_SOURCE_RCH: RCH clock selected as FLTCLK source +* @arg RCC_LPTIM6_CLK_SOURCE_XTL: XTL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_LPTIM6ClockSourceConfig(uint32_t ClockSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_LPTIM6_CLK_SOURCE(ClockSource)); + + /* FLTCLK clok source configuration */ + RCC->PERCFGR = (RCC->PERCFGR & ~RCC_PERCFGR_LPTIM6CKS) | (ClockSource << RCC_PERCFGR_LPTIM6CKS_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_SDMMC_CLK_SOURCE_SYSCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_SDMMC_CLK_SOURCE_PLL2PCLK: PLL2P clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_SDMMCClockSourceConfig(uint32_t ClockSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_SDMMC_CLK_SOURCE(ClockSource)); + + /* FLTCLK clok source configuration */ + RCC->PERCFGR = (RCC->PERCFGR & ~RCC_PERCFGR_SDMMCCKS) | (ClockSource << RCC_PERCFGR_SDMMCCKS_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_SDIO_CLK_SOURCE_SYSCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_SDIO_CLK_SOURCE_PLL2_P_CLK: PLL2P clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_SDMMCSampleClockSourceConfig(uint32_t SampleClockSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_SDMMC_SCLK_SOURCE(SampleClockSource)); + + /* FLTCLK clok source configuration */ + RCC->PERCFGR = (RCC->PERCFGR & ~RCC_PERCFGR_SDMMCSCKS) | (SampleClockSource << RCC_PERCFGR_SDMMCSCKS_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_SDIO_CLK_SOURCE_SYS_CLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_SDIO_CLK_SOURCE_PLL2_P_CLK: PLL2P clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_LCDPiexlClockDivConfig(uint32_t Div) +{ + /* Check the parameters */ + assert_param(IS_RCC_LCD_CLK_DIV(Div)); + + /* FLTCLK clok source configuration */ + RCC->DCKCFG = (RCC->DCKCFG & ~RCC_DCKCFG_LCDDIV) | ((Div == 2 ? 0 : \ + (Div == 4 ? 1 : \ + (Div == 8 ? 2 : 3))) << RCC_DCKCFG_LCDDIV_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_RTC_CLK_SOURCE_RCL: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_RTC_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_RTCClockSourceConfig(uint32_t ClockSource) +{ + /* Check the parameters */ + assert_param(IS_RCC_RTC_CLK_SOURCE(ClockSource)); + + /* FLTCLK clok source configuration */ + RCC->STDBYCTRL = (RCC->STDBYCTRL & ~RCC_STDBYCTRL_RTCSEL) | (ClockSource << RCC_STDBYCTRL_RTCSEL_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Initializes the CPU, AHB and APB buses clocks according to the +* specified parameters in the RCC_ClkInitTypeDef. +*@param : RCC_ClkInit: pointer to an RCC_ClkInitTypeDef structure that +* contains the configuration information for the RCC peripheral. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetClock(RCC_ClkInitTypeDef *RCC_ClkInit) +{ + uint32_t temp; + + if (RCC_ClkInit == NULL) + return HAL_ERROR; + + HAL_RCC_GetSYSCLKSource(&RCC_ClkInit->SYSCLKSource); + + RCC_ClkInit->SYSCLKDiv0 = ((RCC->CCR2 & RCC_CCR2_SYSDIV0) >> RCC_CCR2_SYSDIV0_Pos) + 1; + RCC_ClkInit->SYSCLKDiv1 = ((RCC->CCR2 & RCC_CCR2_SYSDIV1) >> RCC_CCR2_SYSDIV1_Pos) + 1; + + temp = (RCC->CCR2 & RCC_CCR2_PCLK1DIV) >> RCC_CCR2_PCLK1DIV_Pos; + if (temp < 4) + temp = 1; + else + temp = 1 << (temp - 3); + RCC_ClkInit->PCLK1Div = temp; + + temp = (RCC->CCR2 & RCC_CCR2_PCLK2DIV) >> RCC_CCR2_PCLK2DIV_Pos; + if (temp < 4) + temp = 1; + else + temp = 1 << (temp - 3); + RCC_ClkInit->PCLK2Div = temp; + + temp = (RCC->CCR2 & RCC_CCR2_PCLK3DIV) >> RCC_CCR2_PCLK3DIV_Pos; + if (temp < 4) + temp = 1; + else + temp = 1 << (temp - 3); + RCC_ClkInit->PCLK3Div = temp; + + temp = (RCC->CCR2 & RCC_CCR2_PCLK4DIV) >> RCC_CCR2_PCLK4DIV_Pos; + if (temp < 4) + temp = 1; + else + temp = 1 << (temp - 3); + RCC_ClkInit->PCLK4Div = temp; + + RCC_ClkInit->ClockType = RCC_CLOCK_TYPE_SYSCLK | RCC_CLOCK_TYPE_SYSDIV0 | RCC_CLOCK_TYPE_SYSDIV1 | \ + RCC_CLOCK_TYPE_PCLK1 | RCC_CLOCK_TYPE_PCLK2 | RCC_CLOCK_TYPE_PCLK3 | RCC_CLOCK_TYPE_PCLK4; + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Switch the system clock. +*@param : SYSCLKSource: SYSCLK clock source. +* This parameter must be a value of @ref RCC_Sysclk_Source. +* @arg RCC_SYSCLKSOURCE_RCH: RCH clock selected as SYSCLK source +* @arg RCC_SYSCLKSOURCE_RCL: RCL clock selected as SYSCLK source +* @arg RCC_SYSCLKSOURCE_XTH: XTH clock selected as SYSCLK source +* @arg RCC_SYSCLKSOURCE_XTL: XTL clock selected as SYSCLK source +* @arg RCC_SYSCLKSOURCE_PLLCLK: PLL clock selected as SYSCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetSYSCLKSource(uint32_t *pClockSource) +{ + uint32_t source; + + if (pClockSource == NULL) + return HAL_ERROR; + + source = (RCC->CCR1 & RCC_CCR1_SYSCLKSEL) >> RCC_CCR1_SYSCLKSEL_Pos; + + if (source <= 1) + source = RCC_SYSCLK_SOURCE_RCH; + else if (source == 2) + source = RCC_SYSCLK_SOURCE_XTH; + else + source = RCC_SYSCLK_SOURCE_PLL1PCLK; + + *pClockSource = source; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_FLT_CLK_SOURCE_PCLK_DIV32: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_FLT_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetHRNGSlowClockDiv(uint32_t *pClockDiv) +{ + if (pClockDiv == NULL) + return HAL_ERROR; + + *pClockDiv = ((RCC->CCR2 & RCC_CCR2_HRNGSDIV) >> RCC_CCR2_HRNGSDIV_Pos) + 1; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_FLT_CLK_SOURCE_PCLK_DIV32: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_FLT_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetFLTClockSource(uint32_t *pClockSource) +{ + if (pClockSource == NULL) + return HAL_ERROR; + + *pClockSource = (RCC->CCR2 & RCC_CCR2_FLTCLKSEL) >> RCC_CCR2_FLTCLKSEL_Pos; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPUART1_CLK_SOURCE_RCL: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPUART1_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +* @arg RCC_LPUART1_CLK_SOURCE_PCLK: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetLPUART1ClockSource(uint32_t *pClockSource) +{ + uint32_t source; + + if (pClockSource == NULL) + return HAL_ERROR; + + source = (RCC->PERCFGR & RCC_PERCFGR_LPUART1CKS) >> RCC_PERCFGR_LPUART1CKS_Pos; + + if (source <= 1) + { + *pClockSource = source; + return HAL_OK; + } + + if (source == 2) + { + source = (RCC->PERCFGR & RCC_PERCFGR_LPUART1DIV) >> RCC_PERCFGR_LPUART1DIV_Pos; + *pClockSource = source + 2; + return HAL_OK; + } + + return HAL_ERROR; +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM1_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM1_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM1_CLK_SOURCE_RCH: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM1_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetLPTIM1ClockSource(uint32_t *pClockSource) +{ + if (pClockSource == NULL) + return HAL_ERROR; + + *pClockSource = (RCC->PERCFGR & RCC_PERCFGR_LPTIM1CKS) >> RCC_PERCFGR_LPTIM1CKS_Pos; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM2_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM2_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM2_CLK_SOURCE_RCH: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM2_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetLPTIM2ClockSource(uint32_t *pClockSource) +{ + if (pClockSource == NULL) + return HAL_ERROR; + + *pClockSource = (RCC->PERCFGR & RCC_PERCFGR_LPTIM2CKS) >> RCC_PERCFGR_LPTIM2CKS_Pos; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM345_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCH: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetLPTIM3ClockSource(uint32_t *pClockSource) +{ + if (pClockSource == NULL) + return HAL_ERROR; + + *pClockSource = (RCC->PERCFGR & RCC_PERCFGR_LPTIM345CKS) >> RCC_PERCFGR_LPTIM345CKS_Pos; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM345_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCH: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetLPTIM4ClockSource(uint32_t *pClockSource) +{ + if (pClockSource == NULL) + return HAL_ERROR; + + *pClockSource = (RCC->PERCFGR & RCC_PERCFGR_LPTIM345CKS) >> RCC_PERCFGR_LPTIM345CKS_Pos; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM345_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCH: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetLPTIM5ClockSource(uint32_t *pClockSource) +{ + if (pClockSource == NULL) + return HAL_ERROR; + + *pClockSource = (RCC->PERCFGR & RCC_PERCFGR_LPTIM345CKS) >> RCC_PERCFGR_LPTIM345CKS_Pos; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM6_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM6_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM6_CLK_SOURCE_RCH: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM6_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetLPTIM6ClockSource(uint32_t *pClockSource) +{ + if (pClockSource == NULL) + return HAL_ERROR; + + *pClockSource = (RCC->PERCFGR & RCC_PERCFGR_LPTIM6CKS) >> RCC_PERCFGR_LPTIM6CKS_Pos; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_SDIO_CLK_SOURCE_SYS_CLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_SDIO_CLK_SOURCE_PLL2_P_CLK: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetSDMMCClockSource(uint32_t *pClockSource) +{ + if (pClockSource == NULL) + return HAL_ERROR; + + *pClockSource = (RCC->PERCFGR & RCC_PERCFGR_SDMMCCKS) >> RCC_PERCFGR_SDMMCCKS_Pos; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_SDIO_CLK_SOURCE_SYS_CLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_SDIO_CLK_SOURCE_PLL2_P_CLK: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetSDMMCSampleClockSource(uint32_t *pClockSource) +{ + if (pClockSource == NULL) + return HAL_ERROR; + + *pClockSource = (RCC->PERCFGR & RCC_PERCFGR_SDMMCSCKS) >> RCC_PERCFGR_SDMMCSCKS_Pos; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_RTC_CLK_SOURCE_RCL: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_RTC_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RCC_GetRTCClockSource(uint32_t *pClockSource) +{ +// uint32_t source; + + if (pClockSource == NULL) + return HAL_ERROR; + + if (RCC->STDBYCTRL & RCC_STDBYCTRL_RTCSEL_1) + return HAL_ERROR; + + *pClockSource = (RCC->STDBYCTRL & RCC_STDBYCTRL_RTCSEL) >> RCC_STDBYCTRL_RTCSEL_Pos; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Returns RC64M infact value +*@return: RC64M val +******************************************************************************/ +uint32_t HAL_RCC_GetRCHTrimFreq(void) +{ + uint32_t freq; + + HAL_EFUSE_RpEnable(EFUSE1); + HAL_EFUSE_ReadBytes(EFUSE1, 0x1C, (uint8_t *)&freq, 4, 100000); + + if ((freq > 76800000) || (freq < 51200000)) + return 64000000; + else + return freq; +} + +/****************************************************************************** +*@brief : Returns RC32K infact value +*@return: RC32K val +******************************************************************************/ +uint32_t HAL_RCC_GetRCLTrimFreq(void) +{ + uint32_t freq; + + HAL_EFUSE_RpEnable(EFUSE1); + HAL_EFUSE_ReadBytes(EFUSE1, 0x20, (uint8_t *)&freq, 4, 100000); + + if ((freq > 39321) || (freq < 26214)) + return 32768; + else + return freq; +} + +/****************************************************************************** +*@brief : Returns RCH infact value +*@return: RCH val +******************************************************************************/ +uint32_t HAL_RCC_GetRCHFreq(void) +{ + uint32_t freq; + + if ((RCC->RCHCR & (RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) != (RCC_RCHCR_RCHEN | RCC_RCHCR_RCHRDY)) + return (0); + + freq = HAL_RCC_GetRCHTrimFreq(); + + if (RCC->RCHCR & RCC_RCHCR_RCHDIV) + freq = freq >> 4; + + return (freq); +} + +/****************************************************************************** +*@brief : Returns RCL infact value +*@return: RCL val +******************************************************************************/ +uint32_t HAL_RCC_GetRCLFreq(void) +{ + if ((RCC->STDBYCTRL & (RCC_STDBYCTRL_RCLEN | RCC_STDBYCTRL_RCLRDY)) != (RCC_STDBYCTRL_RCLEN | RCC_STDBYCTRL_RCLRDY)) + return (0); + + return (HAL_RCC_GetRCLTrimFreq()); +} + + +/****************************************************************************** +*@brief : Returns RCH infact value +*@return: RCH val +******************************************************************************/ +uint32_t HAL_RCC_GetXTHFreq(void) +{ + if ((RCC->XTHCR & (RCC_XTHCR_XTHEN | RCC_XTHCR_XTHRDY)) == (RCC_XTHCR_XTHEN | RCC_XTHCR_XTHRDY)) + return (XTH_VALUE); + else + return 0; +} + +/****************************************************************************** +*@brief : Returns RCH infact value +*@return: RCH val +******************************************************************************/ +uint32_t HAL_RCC_GetXTLFreq(void) +{ + if ((RCC->STDBYCTRL & (RCC_STDBYCTRL_XTLEN | RCC_STDBYCTRL_XTLRDY)) == (RCC_STDBYCTRL_XTLEN | RCC_STDBYCTRL_XTLRDY)) + return (32768U); + else + return (0); +} + +/****************************************************************************** +*@brief : Returns RCH infact value +*@return: RCH val +******************************************************************************/ +uint32_t HAL_RCC_GetPLL1Freq(void) +{ + uint32_t freq; + uint32_t plln; + uint32_t pllf; + + if (RCC->PLL1CR & RCC_PLL1CR_PLL1SRCSEL) + { + if ((RCC->PLL1CR & (RCC_PLL1CR_PLL1SLEEP | RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1LOCK | RCC_PLL1CR_PLL1PCLKEN)) != \ + (RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1LOCK | RCC_PLL1CR_PLL1PCLKEN)) + { + return (0); + } + freq = HAL_RCC_GetXTHFreq(); + } + else + { + if ((RCC->PLL1CR & (RCC_PLL1CR_PLL1SLEEP | RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1FREERUN | RCC_PLL1CR_PLL1PCLKEN)) != \ + (RCC_PLL1CR_PLL1EN | RCC_PLL1CR_PLL1FREERUN | RCC_PLL1CR_PLL1PCLKEN)) + { + return (0); + } + freq = HAL_RCC_GetRCHFreq(); + } + + if (freq == 0) + return (0); + + plln = (RCC->PLL1CFR & RCC_PLL1CFR_PLL1N_Msk) >> RCC_PLL1CFR_PLL1N_Pos; + if (plln == 0) + plln = 1; + + pllf = (RCC->PLL1CFR & RCC_PLL1CFR_PLL1F_Msk) >> RCC_PLL1CFR_PLL1F_Pos; + if (pllf < 50) + pllf = 50; + + freq = (uint32_t)((uint64_t)freq * pllf / plln); + + return (freq); +} + +/****************************************************************************** +*@brief : Returns RCH infact value +*@return: RCH val +******************************************************************************/ +uint32_t HAL_RCC_GetPLL1PFreq(void) +{ + uint32_t freq; + uint32_t pllp; + + freq = HAL_RCC_GetPLL1Freq(); + if (freq == 0) + return (0); + + pllp = (RCC->PLL1CFR & RCC_PLL1CFR_PLL1P_Msk) >> RCC_PLL1CFR_PLL1P_Pos; + pllp = (pllp + 1) << 1; + + freq = freq / pllp; + + return (freq); +} + +/****************************************************************************** +*@brief : Returns RCH infact value +*@return: RCH val +******************************************************************************/ +uint32_t HAL_RCC_GetPLL2Freq(void) +{ + uint32_t freq; + uint32_t plln; + uint32_t pllf; + + if (RCC->PLL2CR & RCC_PLL2CR_PLL2SRCSEL) + { + if ((RCC->PLL2CR & (RCC_PLL2CR_PLL2SLEEP | RCC_PLL2CR_PLL2EN | RCC_PLL2CR_PLL2LOCK | RCC_PLL2CR_PLL2PCLKEN)) != \ + (RCC_PLL2CR_PLL2EN | RCC_PLL2CR_PLL2LOCK | RCC_PLL2CR_PLL2PCLKEN)) + { + return (0); + } + freq = HAL_RCC_GetXTHFreq(); + } + else + { + if ((RCC->PLL2CR & (RCC_PLL2CR_PLL2SLEEP | RCC_PLL2CR_PLL2EN | RCC_PLL2CR_PLL2FREERUN | RCC_PLL2CR_PLL2PCLKEN)) != \ + (RCC_PLL2CR_PLL2EN | RCC_PLL2CR_PLL2FREERUN | RCC_PLL2CR_PLL2PCLKEN)) + { + return (0); + } + freq = HAL_RCC_GetRCHFreq(); + } + + if (freq == 0) + return (0); + + plln = (RCC->PLL2CFR & RCC_PLL2CFR_PLL2N_Msk) >> RCC_PLL2CFR_PLL2N_Pos; + if (plln == 0) + plln = 1; + + pllf = (RCC->PLL2CFR & RCC_PLL2CFR_PLL2F_Msk) >> RCC_PLL2CFR_PLL2F_Pos; + if (pllf < 50) + pllf = 50; + + freq = (uint32_t)((uint64_t)freq * pllf / plln); + + return (freq); +} + +/****************************************************************************** +*@brief : Returns RCH infact value +*@return: RCH val +******************************************************************************/ +uint32_t HAL_RCC_GetPLL2QFreq(void) +{ + uint32_t freq; + uint32_t pllq; + + freq = HAL_RCC_GetPLL2Freq(); + if (freq == 0) + return (0); + + pllq = (RCC->PLL2CFR & RCC_PLL2CFR_PLL2Q_Msk) >> RCC_PLL2CFR_PLL2Q_Pos; + if (pllq == 0) + pllq = 1; + + freq = freq / pllq; + + return (freq); +} + +/****************************************************************************** +*@brief : Returns RCH infact value +*@return: RCH val +******************************************************************************/ +uint32_t HAL_RCC_GetPLL2PFreq(void) +{ + uint32_t freq; + uint32_t pllp; + + freq = HAL_RCC_GetPLL2Freq(); + if (freq == 0) + return (0); + + pllp = (RCC->PLL2CFR & RCC_PLL2CFR_PLL2P_Msk) >> RCC_PLL2CFR_PLL2P_Pos; + pllp = (pllp + 1) << 1; + + freq = freq / pllp; + + return (freq); +} + +/****************************************************************************** +*@brief : Returns RCH infact value +*@return: RCH val +******************************************************************************/ +uint32_t HAL_RCC_GetPLL3Freq(void) +{ + uint32_t freq; + uint32_t plln; + uint32_t pllf; + + if (RCC->PLL3CR & RCC_PLL3CR_PLL3SRCSEL) + { + if ((RCC->PLL3CR & (RCC_PLL3CR_PLL3SLEEP | RCC_PLL3CR_PLL3EN | RCC_PLL3CR_PLL3LOCK | RCC_PLL3CR_PLL3QCLKEN)) != \ + (RCC_PLL3CR_PLL3EN | RCC_PLL3CR_PLL3LOCK | RCC_PLL3CR_PLL3QCLKEN)) + { + return (0); + } + freq = HAL_RCC_GetXTHFreq(); + } + else + { + if ((RCC->PLL3CR & (RCC_PLL3CR_PLL3SLEEP | RCC_PLL3CR_PLL3EN | RCC_PLL3CR_PLL3FREERUN | RCC_PLL3CR_PLL3QCLKEN)) != \ + (RCC_PLL3CR_PLL3EN | RCC_PLL3CR_PLL3FREERUN | RCC_PLL3CR_PLL3QCLKEN)) + { + return (0); + } + freq = HAL_RCC_GetRCHFreq(); + } + + if (freq == 0) + return (0); + + plln = ((RCC->PLL3CFR & RCC_PLL3CFR_PLL3N_Msk) >> RCC_PLL3CFR_PLL3N_Pos) + 1; + + pllf = ((RCC->PLL3CFR & RCC_PLL3CFR_PLL3F_Msk) >> RCC_PLL3CFR_PLL3F_Pos) + 1; + + freq = (uint32_t)((uint64_t)freq * pllf / plln); + + return (freq); +} + +/****************************************************************************** +*@brief : Returns RCH infact value +*@return: RCH val +******************************************************************************/ +uint32_t HAL_RCC_GetPLL3QFreq(void) +{ + uint32_t freq; + uint32_t pllq; + + freq = HAL_RCC_GetPLL3Freq(); + if (freq == 0) + return (0); + + pllq = (RCC->PLL3CFR & RCC_PLL3CFR_PLL3Q_Msk) >> RCC_PLL3CFR_PLL3Q_Pos; + if (pllq == 0) + pllq = 1; + else if (pllq == 1) + pllq = 2; + else if (pllq == 2) + pllq = 4; + else + pllq = 8; + + freq = freq / pllq; + + return (freq); +} + +/****************************************************************************** +*@brief : Returns RCH infact value +*@return: RCH val +******************************************************************************/ +uint32_t HAL_RCC_GetPLL3PFreq(void) +{ + uint32_t freq; + uint32_t pllp; + + freq = HAL_RCC_GetPLL3Freq(); + if (freq == 0) + return (0); + + pllp = (RCC->PLL3CFR & RCC_PLL3CFR_PLL3P_Msk) >> RCC_PLL3CFR_PLL3P_Pos; + if (pllp == 0) + pllp = 1; + else if (pllp == 1) + pllp = 2; + else if (pllp == 2) + pllp = 4; + else + pllp = 8; + + freq = freq / pllp; + + return (freq); +} + +/****************************************************************************** +*@brief : Returns the SYSCLK frequency +*@return: SYSCLK frequency +******************************************************************************/ +uint32_t HAL_RCC_GetSYSCLKFreq(void) +{ + uint32_t source; + + source = (RCC->CCR1 & RCC_CCR1_SYSCLKSEL) >> RCC_CCR1_SYSCLKSEL_Pos; + + if (source < 1) + return HAL_RCC_GetRCHFreq(); + + if (source == 2) + return HAL_RCC_GetXTHFreq(); + + return HAL_RCC_GetPLL1PFreq(); +} + +/****************************************************************************** +*@brief : Returns the SysCoreClock frequency +*@return: SysCoreClock frequency +******************************************************************************/ +uint32_t HAL_RCC_GetSysCoreClockFreq(void) +{ + uint32_t div; + uint32_t freq = 0U; + + freq = HAL_RCC_GetSYSCLKFreq(); + + /* first level frequency division of system clock */ + div = ((RCC->CCR2 & RCC_CCR2_SYSDIV0) >> RCC_CCR2_SYSDIV0_Pos) + 1; + + freq = freq / div; + + /* second level frequency division of system clock */ + div = ((RCC->CCR2 & RCC_CCR2_SYSDIV1) >> RCC_CCR2_SYSDIV1_Pos) + 1; + + freq = freq / div; + + SystemCoreClock = freq; + + return (freq); +} + +/****************************************************************************** +*@brief : Returns the FCLK (Core) frequency +*@return: FCLK frequency +******************************************************************************/ +uint32_t HAL_RCC_GetFCLKFreq(void) +{ + return SystemCoreClock; +} + +/****************************************************************************** +*@brief : Returns the HCLK (AHB CLK) frequency +*@return: HCLK frequency +******************************************************************************/ +uint32_t HAL_RCC_GetHCLKFreq(void) +{ + return SystemCoreClock; +} + +/****************************************************************************** +*@brief : Returns the PCLK1 (APB1 CLK) frequency +*@return: PCLK1 frequency +******************************************************************************/ +uint32_t HAL_RCC_GetPCLK1Freq(void) +{ + if ((RCC->CCR2 & RCC_CCR2_PCLK1DIV_2) == 0) + return (SystemCoreClock); + + return (SystemCoreClock >> (((RCC->CCR2 & (RCC_CCR2_PCLK1DIV_0 | RCC_CCR2_PCLK1DIV_1)) >> RCC_CCR2_PCLK1DIV_Pos) + 1)); +} + +/****************************************************************************** +*@brief : Returns the PCLK2 (APB2 CLK) frequency +*@return: PCLK2 frequency +******************************************************************************/ +uint32_t HAL_RCC_GetPCLK2Freq(void) +{ + if ((RCC->CCR2 & RCC_CCR2_PCLK2DIV_2) == 0) + return (SystemCoreClock); + + return (SystemCoreClock >> (((RCC->CCR2 & (RCC_CCR2_PCLK2DIV_0 | RCC_CCR2_PCLK2DIV_1)) >> RCC_CCR2_PCLK2DIV_Pos) + 1)); +} + +/****************************************************************************** +*@brief : Returns the PCLK2 (APB2 CLK) frequency +*@return: PCLK2 frequency +******************************************************************************/ +uint32_t HAL_RCC_GetPCLK3Freq(void) +{ + if ((RCC->CCR2 & RCC_CCR2_PCLK3DIV_2) == 0) + return (SystemCoreClock); + + return (SystemCoreClock >> (((RCC->CCR2 & (RCC_CCR2_PCLK3DIV_0 | RCC_CCR2_PCLK3DIV_1)) >> RCC_CCR2_PCLK3DIV_Pos) + 1)); +} + +/****************************************************************************** +*@brief : Returns the PCLK2 (APB2 CLK) frequency +*@return: PCLK2 frequency +******************************************************************************/ +uint32_t HAL_RCC_GetPCLK4Freq(void) +{ + if ((RCC->CCR2 & RCC_CCR2_PCLK4DIV_2) == 0) + return (SystemCoreClock); + + return (SystemCoreClock >> (((RCC->CCR2 & (RCC_CCR2_PCLK4DIV_0 | RCC_CCR2_PCLK4DIV_1)) >> RCC_CCR2_PCLK4DIV_Pos) + 1)); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_FLT_CLK_SOURCE_PCLK_DIV32: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_FLT_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_GetHRNGSClockFreq(void) +{ + return (SystemCoreClock / (((RCC->CCR2 & RCC_CCR2_HRNGSDIV) >> RCC_CCR2_HRNGSDIV_Pos) + 1)); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_FLT_CLK_SOURCE_PCLK_DIV32: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_FLT_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_GetFLTClockFreq(void) +{ + if ((RCC->CCR2 & RCC_CCR2_FLTCLKSEL) == 0) + return (HAL_RCC_GetPCLK1Freq() >> 5); + else + return (HAL_RCC_GetRCLFreq()); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPUART1_CLK_SOURCE_RCL: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPUART1_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +* @arg RCC_LPUART1_CLK_SOURCE_PCLK: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_GetLPUART1ClockFreq(void) +{ + uint32_t source; + + source = (RCC->PERCFGR & RCC_PERCFGR_LPUART1CKS) >> RCC_PERCFGR_LPUART1CKS_Pos; + + if (source == 0) + return (HAL_RCC_GetRCLFreq()); + + if (source == 1) + return (HAL_RCC_GetXTLFreq()); + + if (source == 2) + return (HAL_RCC_GetPCLK1Freq() >> (((RCC->PERCFGR & RCC_PERCFGR_LPUART1DIV) >> RCC_PERCFGR_LPUART1DIV_Pos) + 2)); + + return (0); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM1_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM1_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM1_CLK_SOURCE_RCH: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM1_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_GetLPTIM1ClockFreq(void) +{ + uint32_t source; + + source = (RCC->PERCFGR & RCC_PERCFGR_LPTIM1CKS) >> RCC_PERCFGR_LPTIM1CKS_Pos; + + if (source == 0) + return (HAL_RCC_GetPCLK1Freq()); + + if (source == 1) + return (HAL_RCC_GetRCLFreq()); + + if (source == 2) + return (HAL_RCC_GetRCHFreq()); + + return (HAL_RCC_GetXTLFreq()); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM2_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM2_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM2_CLK_SOURCE_RCH: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM2_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_GetLPTIM2ClockFreq(void) +{ + uint32_t source; + + source = (RCC->PERCFGR & RCC_PERCFGR_LPTIM2CKS) >> RCC_PERCFGR_LPTIM2CKS_Pos; + + if (source == 0) + return (HAL_RCC_GetPCLK1Freq()); + + if (source == 1) + return (HAL_RCC_GetRCLFreq()); + + if (source == 2) + return (HAL_RCC_GetRCHFreq()); + + return (HAL_RCC_GetXTLFreq()); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM345_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCH: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_GetLPTIM3ClockFreq(void) +{ + uint32_t source; + + source = (RCC->PERCFGR & RCC_PERCFGR_LPTIM345CKS) >> RCC_PERCFGR_LPTIM345CKS_Pos; + + if (source == 0) + return (HAL_RCC_GetPCLK3Freq()); + + if (source == 1) + return (HAL_RCC_GetRCLFreq()); + + if (source == 2) + return (HAL_RCC_GetRCHFreq()); + + return (HAL_RCC_GetXTLFreq()); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM345_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCH: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_GetLPTIM4ClockFreq(void) +{ + uint32_t source; + + source = (RCC->PERCFGR & RCC_PERCFGR_LPTIM345CKS) >> RCC_PERCFGR_LPTIM345CKS_Pos; + + if (source == 0) + return (HAL_RCC_GetPCLK3Freq()); + + if (source == 1) + return (HAL_RCC_GetRCLFreq()); + + if (source == 2) + return (HAL_RCC_GetRCHFreq()); + + return (HAL_RCC_GetXTLFreq()); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM345_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCL: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_RCH: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM345_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_GetLPTIM5ClockFreq(void) +{ + uint32_t source; + + source = (RCC->PERCFGR & RCC_PERCFGR_LPTIM345CKS) >> RCC_PERCFGR_LPTIM345CKS_Pos; + + if (source == 0) + return (HAL_RCC_GetPCLK3Freq()); + + if (source == 1) + return (HAL_RCC_GetRCLFreq()); + + if (source == 2) + return (HAL_RCC_GetRCHFreq()); + + return (HAL_RCC_GetXTLFreq()); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_LPTIM6_CLK_SOURCE_PCLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_LPTIM6_CLK_SOURCE_RCL: RCL selected as FLTCLK source +* @arg RCC_LPTIM6_CLK_SOURCE_RCH: RCL clock selected as FLTCLK source +* @arg RCC_LPTIM6_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_GetLPTIM6ClockFreq(void) +{ + uint32_t source; + + source = (RCC->PERCFGR & RCC_PERCFGR_LPTIM6CKS) >> RCC_PERCFGR_LPTIM6CKS_Pos; + + if (source == 0) + return (HAL_RCC_GetPCLK3Freq()); + + if (source == 1) + return (HAL_RCC_GetRCLFreq()); + + if (source == 2) + return (HAL_RCC_GetRCHFreq()); + + return (HAL_RCC_GetXTLFreq()); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_SDMMC_CLK_SOURCE_SYS_CLK: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_SDMMC_CLK_SOURCE_PLL2_P_CLK: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_GetSDMMCClockFreq(void) +{ + if ((RCC->PERCFGR & RCC_PERCFGR_SDMMCCKS) == 0) + return (HAL_RCC_GetHCLKFreq()); + else + return (HAL_RCC_GetPLL2PFreq()); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_RTC_CLK_SOURCE_RCL: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_RTC_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_GetLCDPiexlClockFreq(void) +{ + return (HAL_RCC_GetPLL2QFreq() >> (((RCC->DCKCFG & RCC_DCKCFG_LCDDIV) >> RCC_DCKCFG_LCDDIV_Pos) + 1)); +} + +/****************************************************************************** +*@brief : Configure FLTCLK (LVD and COMP) clock source. +*@param : ClockSource: LVD and COMP clock source. +* This parameter must be a value of @ref RCC_FLT_CLK_Source. +* @arg RCC_RTC_CLK_SOURCE_RCL: clock after pclk 32 frequency division selected as FLTCLK source +* @arg RCC_RTC_CLK_SOURCE_XTL: RCL clock selected as FLTCLK source +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_GetRTCClockFreq(void) +{ + uint32_t source; + + if ((RCC->STDBYCTRL & RCC_STDBYCTRL_RTCEN) == 0) + return (0); + + source = (RCC->STDBYCTRL & RCC_STDBYCTRL_RTCSEL) >> RCC_STDBYCTRL_RTCSEL_Pos; + + if (source == 0) + return (HAL_RCC_GetRCLFreq()); + + if (source == 1) + return (HAL_RCC_GetXTLFreq()); + + return (0); +} + +/****************************************************************************** +*@brief : Configure MCO output. +*@param : MCO_Init: pointer to an RCC_MCOInitTypeDef structure that contains +* the configuration information for the MCO output. +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_MCOConfig(RCC_MCOInitTypeDef *MCO_InitStruct) +{ + volatile uint32_t temp; + + /* Check the parameters */ + assert_param(IS_RCC_MCO(MCO_InitStruct->MCO)); + assert_param(IS_FUNCTIONAL_STATE(MCO_InitStruct->MCO1)); + assert_param(IS_FUNCTIONAL_STATE(MCO_InitStruct->MCO2)); + + temp = MCO_InitStruct->MCO; + + if (MCO_InitStruct->MCO1) + { + assert_param(IS_RCC_MCO1_DIV(MCO_InitStruct->MCO1Div)); + assert_param(IS_FUNCTIONAL_STATE(MCO_InitStruct->MCO1RevPol)); + + /* MCO1 clock polarity configuration */ + if (MCO_InitStruct->MCO1RevPol) + temp |= RCC_CLKOCR_MCO1POL; + + /* MCO1 division configuration */ + temp |= RCC_CLKOCR_MCO1SEL | RCC_CLKOCR_MCO1EN | ((MCO_InitStruct->MCO1Div - 1) << RCC_CLKOCR_MCO1DIV_Pos); + } + else + { + assert_param(IS_FUNCTIONAL_STATE(MCO_InitStruct->MCO1RevPol)); + + /* MCO1 clock polarity configuration */ + if (MCO_InitStruct->MCO1RevPol) + temp |= RCC_CLKOCR_MCO1POL; + } + + if (MCO_InitStruct->MCO2) + { + assert_param(IS_RCC_MCO2_DIV(MCO_InitStruct->MCO2Div)); + assert_param(IS_FUNCTIONAL_STATE(MCO_InitStruct->MCO2RevPol)); + + /* MCO1 clock polarity configuration */ + if (MCO_InitStruct->MCO2RevPol != DISABLE) + temp |= RCC_CLKOCR_MCO2POL; + + /* MCO1 division configuration */ + temp |= RCC_CLKOCR_MCO2EN | (((MCO_InitStruct->MCO2Div - 1) << RCC_CLKOCR_MCO2DIV_Pos) & RCC_CLKOCR_MCO2DIV); + } + else + { + assert_param(IS_FUNCTIONAL_STATE(MCO_InitStruct->MCO2RevPol)); + + /* MCO1 clock polarity configuration */ + if (MCO_InitStruct->MCO2RevPol != DISABLE) + temp |= RCC_CLKOCR_MCO2POL; + } + + RCC->CLKOCR = temp; + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure MCO1 output. +*@param : MCO_Init: pointer to an RCC_MCOInitTypeDef structure that contains +* the configuration information for the MCO output. +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_MCO1Config(uint32_t MCO, uint32_t NewStatus, uint32_t Div) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewStatus)); + + if (NewStatus == DISABLE) + { + RCC->CLKOCR = (RCC->CLKOCR & ~RCC_CLKOCR_MCO1EN) | RCC_CLKOCR_MCO1SEL; + return HAL_OK; + } + + assert_param(IS_RCC_MCO(MCO)); + assert_param(IS_RCC_MCO1_DIV(Div)); + + RCC->CLKOCR = (RCC->CLKOCR & ~(RCC_CLKOCR_MCO1DIV | RCC_CLKOCR_MCOCLKS)) | \ + RCC_CLKOCR_MCO1EN | RCC_CLKOCR_MCO1SEL | \ + ((Div - 1) << RCC_CLKOCR_MCO1DIV_Pos) | \ + (MCO << RCC_CLKOCR_MCOCLKS_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Configure MCO1 output. +*@param : MCO_Init: pointer to an RCC_MCOInitTypeDef structure that contains +* the configuration information for the MCO output. +*@return: HAL status +******************************************************************************/ +uint32_t HAL_RCC_MCO2Config(uint32_t MCO, uint32_t NewStatus, uint32_t Div) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewStatus)); + + if (DISABLE == NewStatus) + { + RCC->CLKOCR = RCC->CLKOCR & ~RCC_CLKOCR_MCO2EN; + return HAL_OK; + } + + assert_param(IS_RCC_MCO(MCO)); + assert_param(IS_RCC_MCO2_DIV(Div)); + + RCC->CLKOCR = (RCC->CLKOCR & ~(RCC_CLKOCR_MCO2DIV | RCC_CLKOCR_MCOCLKS)) | RCC_CLKOCR_MCO2EN | \ + ((Div - 1) << RCC_CLKOCR_MCO2DIV_Pos) | (MCO << RCC_CLKOCR_MCOCLKS_Pos); + + return (HAL_OK); +} + +/****************************************************************************** +*@brief : Software reset +*@return: None +******************************************************************************/ +void HAL_RCC_SoftwareReset(void) +{ + RCC->RCR &= ~RCC_RCR_SRST_MAP; +} + +/****************************************************************************** +*@brief : Standby software reset +*@return: None +******************************************************************************/ +void HAL_RCC_StandbyReset(void) +{ + /* check RTC clock source */ + RCC->STDBYCTRL &= ~RCC_STDBYCTRL_STDBYRST; +} + +/****************************************************************************** +*@brief : Software reset +*@return: None +******************************************************************************/ +void HAL_RCC_LockupResetConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState) + RCC->RCR |= RCC_RCR_LOCKRST_EN; + else + RCC->RCR &= ~RCC_RCR_LOCKRST_EN; +} + +/****************************************************************************** +*@brief : Software reset +*@return: None +******************************************************************************/ +void HAL_RCC_IWDTResetConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState) + RCC->RCR |= RCC_RCR_IWDTRST_EN; + else + RCC->RCR = (RCC->RCR & ~(RCC_RCR_IWDTRST_DIS | RCC_RCR_IWDTRST_EN)) | (0xB5UL << RCC_RCR_IWDTRST_DIS_Pos); +} + +/****************************************************************************** +*@brief : Software reset +*@return: None +******************************************************************************/ +void HAL_RCC_WDTResetConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState) + RCC->RCR |= RCC_RCR_WDTRST_EN; + else + RCC->RCR &= ~RCC_RCR_WDTRST_EN; +} + +/****************************************************************************** +*@brief : Software reset +*@return: None +******************************************************************************/ +void HAL_RCC_LVDResetConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState) + RCC->RCR |= RCC_RCR_LVDRST_EN; + else + RCC->RCR &= ~RCC_RCR_LVDRST_EN; +} + +/****************************************************************************** +*@brief : Software reset +*@return: None +******************************************************************************/ +uint32_t HAL_RCC_GetResetSource(void) +{ + return (RCC->RSR & RCC_RESET_SOURCE_MASK); +} + +/****************************************************************************** +*@brief : Software reset +*@return: None +******************************************************************************/ +void HAL_RCC_ClearAllResetSource(void) +{ + RCC->RSR = RCC_RSR_RSTFLAGCLR; +} + +#endif /* HAL_RCC_MODULE_ENABLED */ + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_rtc.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_rtc.c new file mode 100644 index 0000000000..3f0ae2056b --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_rtc.c @@ -0,0 +1,549 @@ + +/****************************************************************************** +* @file : HAL_RTC.c +* @version : 1.0 +* @date : 2022.10.25 +* @brief : RTC HAL module driver +* +* @history : +* 2022.10.25 lwq create +* +******************************************************************************/ +#include "hal.h" + +#ifdef HAL_RTC_MODULE_ENABLED + + + +/****************************************************************************** +* @brief : Initialize the RTC peripheral. +* @param : hrtc: Pointer to a RTC_ConfigTypeDef structure that contains +* the configuration information for the specified RTC module. +* @return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_RTC_Config(RTC_ConfigTypeDef *hrtc) +{ + /* Check RTC Parameter */ + assert_param(IS_RTC_CLOCKSRC(hrtc->ClockSource)); + assert_param(IS_RTC_COMPENSATION(hrtc->Compensation)); + assert_param(IS_RTC_COMPENSATION_VALUE(hrtc->CompensationValue)); + + /* Enable PMU CLK */ + __HAL_RCC_PMU_CLK_ENABLE(); + /* Enable RTC Moudle CLK */ + __HAL_RCC_RTC_CLK_ENABLE(); + + /* Enable RTC CLK */ + SET_BIT(RCC->STDBYCTRL, RCC_STDBYCTRL_RTCEN); + /* RTC domain write enable */ + SET_BIT(PMU->CTRL0,PMU_CTRL0_RTCWE); + + switch (hrtc->ClockSource) + { + case RTC_CLOCK_RC32K: + { + //RC32K Enable + RCC->STDBYCTRL |= RCC_STDBYCTRL_RCLEN; + while(!(RCC->STDBYCTRL & RCC_STDBYCTRL_RCLRDY)); + //RTC SEL RC32K + RCC->STDBYCTRL &= ~RCC_STDBYCTRL_RTCSEL; + + }break; + + case RTC_CLOCK_XTL: + { + RCC->STDBYCTRL = (RCC->STDBYCTRL & ~RCC_STDBYCTRL_XTLDRV) | (RCC_STDBYCTRL_XTLDRV_1 | RCC_STDBYCTRL_XTLDRV_0); + + RCC->STDBYCTRL |= RCC_STDBYCTRL_XTLEN; + while(!(RCC->STDBYCTRL & RCC_STDBYCTRL_XTLRDY)); + + //RTC SEL XTL + RCC->STDBYCTRL |= RCC_STDBYCTRL_RTCSEL_0; + }break; + + default: break; + } + + RTC->ADJUST = hrtc->Compensation | hrtc->CompensationValue; + + + return HAL_OK; +} + +/****************************************************************************** +* @brief : Set RTC current time. +* @param : time: Pointer to RTC_TimeTypeDef structure +* @return: none +******************************************************************************/ +void HAL_RTC_SetTime(RTC_TimeTypeDef *time) +{ + /* Check RTC Parameter */ + assert_param(IS_RTC_HOUR(time->Hour)); + assert_param(IS_RTC_MINUTES(time->Minute)); + assert_param(IS_RTC_SECONDS(time->Second)); + + + /* Write-Protect Disable */ + RTC->WP = RTC_WRITE_PROTECT_DISABLE; + + RTC->HOUR = time->Hour; + RTC->MIN = time->Minute; + RTC->SEC = time->Second; + + + /* Write-Protect Enable */ + RTC->WP = RTC_WRITE_PROTECT_ENABLE; +} + +/****************************************************************************** +* @brief : Get RTC current time. +* @param : time: Pointer to RTC_TimeTypeDef structure +* @return: none +******************************************************************************/ +void HAL_RTC_GetTime(RTC_TimeTypeDef *time) +{ + time->Hour = RTC->HOUR; + time->Minute = RTC->MIN; + time->Second = RTC->SEC; +} + + +/****************************************************************************** +* @brief : Set RTC current Date. +* @param : date: Pointer to RTC_DateTypeDef structure +* @return: none +******************************************************************************/ +void HAL_RTC_SetDate(RTC_DateTypeDef *date) +{ + /* Check RTC Parameter */ + assert_param(IS_RTC_YEAR(date->Year)); + assert_param(IS_RTC_MONTH(date->Month)); + assert_param(IS_RTC_DAY(date->Date)); + assert_param(IS_RTC_WEEKDAY(date->WeekDay)); + + + /* Write-Protect Disable */ + RTC->WP = RTC_WRITE_PROTECT_DISABLE; + + RTC->YEAR = date->Year; + RTC->MONTH = date->Month; + RTC->DAY = date->Date; + RTC->WEEK = date->WeekDay; + + + /* Write-Protect Enable */ + RTC->WP = RTC_WRITE_PROTECT_ENABLE; +} + +/****************************************************************************** +* @brief : Get RTC current Date. +* @param : date: Pointer to RTC_DateTypeDef structure +* @return: none +******************************************************************************/ +void HAL_RTC_GetDate(RTC_DateTypeDef *date) +{ + date->Year = RTC->YEAR; + date->Month = RTC->MONTH; + date->Date = RTC->DAY; + date->WeekDay = RTC->WEEK; +} + +/****************************************************************************** +* @brief : Alarm Config. +* @param : alarm: Pointer to RTC_AlarmTypeDef structure. +* @return: none +******************************************************************************/ +void HAL_RTC_AlarmConfig(RTC_AlarmTypeDef *alarm) +{ + uint32_t lu32_WeekDay; + + /* Check RTC Parameter */ + assert_param(IS_RTC_ALARM_MODE(alarm->u32_AlarmMode)); + assert_param(IS_RTC_ALARM_INT(alarm->u32_AlarmInterrupt)); + assert_param(IS_RTC_ALARM_DAY_MASK(alarm->u32_DayMask)); + assert_param(IS_RTC_ALARM_HOUR_MASK(alarm->u32_HourMask)); + assert_param(IS_RTC_ALARM_MIN_MASK(alarm->u32_MinMask)); + assert_param(IS_RTC_HOUR(alarm->u32_Hours)); + assert_param(IS_RTC_MINUTES(alarm->u32_Minutes)); + assert_param(IS_RTC_SECONDS(alarm->u32_Seconds)); + + if (alarm->u32_AlarmMode == RTC_ALM_ALM_WDS_WEEK) + { + assert_param(IS_RTC_ALARM_WEEKDAY(alarm->u32_AlarmWeek)); + lu32_WeekDay = alarm->u32_AlarmWeek; + } + else + { + assert_param(IS_RTC_DAY(alarm->u32_AlarmDay)); + lu32_WeekDay = alarm->u32_AlarmDay << RTC_ALM_ALMWEEK_ALMDAY_Pos; + } + + /* Coinfig Week/DayHourMinSec */ + RTC->ALM = alarm->u32_AlarmMode | lu32_WeekDay | alarm->u32_Hours << RTC_ALM_ALMHOUR_Pos | alarm->u32_Minutes << RTC_ALM_ALMMIN_Pos | alarm->u32_Seconds; + + /* Interrupt Enable */ + if (RTC_ALARM_INT_ENABLE == alarm->u32_AlarmInterrupt) + { + RTC->IE |= RTC_IE_ALM_IE; + } + + MODIFY_REG(RTC->CR, RTC_CR_ALM_MSKD, alarm->u32_DayMask); + + MODIFY_REG(RTC->CR, RTC_CR_ALM_MSKH, alarm->u32_HourMask); + + MODIFY_REG(RTC->CR, RTC_CR_ALM_MSKM, alarm->u32_MinMask); +} + +/****************************************************************************** +* @brief : Alarm Enable. +* @param : none. +* @return: none +******************************************************************************/ +void HAL_RTC_AlarmEnable(void) +{ + RTC->CR |= RTC_CR_ALM_EN; +} + +/****************************************************************************** +* @brief : Alarm Disable. +* @param : none. +* @return: none +******************************************************************************/ +void HAL_RTC_AlarmDisable(void) +{ + RTC->CR &= ~RTC_CR_ALM_EN; +} + + +/****************************************************************************** +* @brief : RTC Tamper Config. +* @param : temperx: RTC_TEMPER_1 or RTC_TEMPER_2 +* @param : temper: Pointer to RTC_TemperTypeDef structure +* @return: none +******************************************************************************/ +void HAL_RTC_Tamper(RTC_Temper_t temperx, RTC_TemperTypeDef *temper) +{ + + /* Check RTC Parameter */ + assert_param(IS_RTC_TEMP_EDGE(temper->u32_TemperEdge)); + assert_param(IS_RTC_TEMP_INT(temper->u32_InterruptEN)); + assert_param(IS_RTC_TEMP_CLEAR_BACKUP(temper->u32_ClearBackup)); + assert_param(IS_RTC_TEMP_FILTER(temper->u32_Filter)); + assert_param(IS_RTC_TEMP_FILTER_CLK(temper->u32_FilterClk)); + assert_param(IS_FUNCTIONAL_STATE(temper->u32_FilterEn)); + switch (temperx) + { + case RTC_TEMPER_1: + { + /* RTC domain write enable */ + SET_BIT(PMU->CTRL0,PMU_CTRL0_RTCWE); + + /* Configure PC13 as tamper function */ + __HAL_PMU_PC13_SEL(PMU_IOSEL_PC13_SEL_RTC_TAMPER); + + /* Clear Config */ + RTC->CR &= ~(RTC_CR_TAMP1RCLR | RTC_CR_TAMP1FCLR | RTC_CR_TAMP1FLTEN | RTC_CR_TAMP1FLT_Msk | RTC_CR_TS1EDGE | RTC_CR_TAMPFLTCLK_Msk); + + if(temper->u32_FilterEn == ENABLE) + { + RTC->CR |= RTC_CR_TAMP1FLTEN; + } + else + { + RTC->CR &= ~RTC_CR_TAMP1FLTEN; + } + /* Edge select */ + RTC->CR |= temper->u32_TemperEdge ? RTC_CR_TS1EDGE : 0x00; + /* Auto clear backup register */ + if (temper->u32_ClearBackup) + { + RTC->CR |= temper->u32_TemperEdge ? RTC_CR_TAMP1FCLR : RTC_CR_TAMP1RCLR; + } + /* Temper filter clock*/ + RTC->CR |= temper->u32_FilterClk; + + /* Temper filter */ + RTC->CR |= temper->u32_Filter << RTC_CR_TAMP1FLT_Pos; + + RTC->CR |= RTC_CR_TAMP1EN; + + HAL_SimpleDelay(2000); + + RTC->SR = (RTC_SR_STP1FIF | RTC_SR_STP1RIF); + RTC->IE &= (~(RTC_IE_STP1FIE | RTC_IE_STP1RIE)); + + /* Put Temper Interrupt enable here !!!*/ + if (temper->u32_InterruptEN) + { + RTC->IE |= temper->u32_TemperEdge ? RTC_IE_STP1FIE : RTC_IE_STP1RIE; + } + + }break; + + case RTC_TEMPER_2: + { + /* RTC domain write enable */ + SET_BIT(PMU->CTRL0,PMU_CTRL0_RTCWE); + + /* Configure PI8 as tamper function */ + __HAL_PMU_PI8_SEL(PMU_IOSEL_PI8_SEL_RTC_TAMPER); + + /* Clear Config */ + RTC->CR &= ~(RTC_CR_TAMP2RCLR | RTC_CR_TAMP2FCLR | RTC_CR_TAMP2FLTEN | RTC_CR_TAMP2FLT_Msk | RTC_CR_TS2EDGE | RTC_CR_TAMPFLTCLK_Msk); + + if(temper->u32_FilterEn == ENABLE) + { + RTC->CR |= RTC_CR_TAMP2FLTEN; + } + else + { + RTC->CR &= ~RTC_CR_TAMP2FLTEN; + } + + /* Edge select */ + RTC->CR |= temper->u32_TemperEdge ? RTC_CR_TS2EDGE : 0x00; + /* Auto clear backup register */ + if (temper->u32_ClearBackup) + { + RTC->CR |= temper->u32_TemperEdge ? RTC_CR_TAMP2FCLR : RTC_CR_TAMP2RCLR; + } + + /* Temper filter clock*/ + RTC->CR |= temper->u32_FilterClk; + + /* Temper filter */ + RTC->CR |= temper->u32_Filter << 19; + + RTC->CR |= RTC_CR_TAMP2EN; + + HAL_SimpleDelay(2000); + + RTC->SR = (RTC_SR_STP2FIF|RTC_SR_STP2RIF); + RTC->IE &= (~(RTC_IE_STP2FIE|RTC_IE_STP2RIE)); + + /* Temper Interrupt */ + if (temper->u32_InterruptEN) + { + RTC->IE |= temper->u32_TemperEdge ? RTC_IE_STP2FIE : RTC_IE_STP2RIE; + } + + }break; + + default: break; + } +} + +/****************************************************************************** +* @brief : RTC Tamper Enable. +* @param : temperx: RTC_TEMPER_1 or RTC_TEMPER_2 +* @return: none +******************************************************************************/ +void HAL_RTC_TamperEnable(RTC_Temper_t temperx) +{ + if (temperx == RTC_TEMPER_1) + { + RTC->CR |= RTC_CR_TAMP1EN; + } + else + { + RTC->CR |= RTC_CR_TAMP2EN; + } +} + +/****************************************************************************** +* @brief : RTC Tamper Disable. +* @param : temperx: RTC_TEMPER_1 or RTC_TEMPER_2 +* @return: none +******************************************************************************/ +void HAL_RTC_TamperDisable(RTC_Temper_t temperx) +{ + if (temperx == RTC_TEMPER_1) + { + RTC->CR &= ~RTC_CR_TAMP1EN; + } + else + { + RTC->CR &= ~RTC_CR_TAMP2EN; + } +} + +/****************************************************************************** +* @brief : Sets wakeup timer. +* @param : hrtcTimer: pointer to a RTC_HandleTypeDef structure +* @return: none +******************************************************************************/ +void HAL_RTC_SetWakeUpTimer(RTC_WUTimerTypeDef *hrtcTimer) +{ + /* Check the parameters */ + assert_param(IS_RTC_WAKEUP_CLOCK(hrtcTimer->u32_WuckSel)); + assert_param(IS_RTC_WAKEUP_COUNTER(hrtcTimer->WakeUpCounter)); + assert_param(IS_FUNCTIONAL_STATE(hrtcTimer->u32_InterruptEN)); + + //Disable WakeUp Timer + RTC->CR &= ~RTC_CR_WUTE; + + while(!(RTC->SR & RTC_SR_WUTWF)); + + RTC->WUTR = hrtcTimer->WakeUpCounter; + + RTC->CR &= ~RTC_CR_WUCKSEL_Msk; + RTC->CR |= hrtcTimer->u32_WuckSel; + + RTC->IE &= ~RTC_IE_WUTIE_Msk; + if(hrtcTimer->u32_InterruptEN == ENABLE) + { + RTC->IE |= RTC_IE_WUTIE; + } + + //Enable Wakeup Timer + RTC->CR |= RTC_CR_WUTE; + while(!(RTC->SR & RTC_SR_WUTWF)); + +} + +/****************************************************************************** +* @brief: Writes a data in a specified RTC Backup data register. +* @param: RTC_BKP_DR: RTC Backup data Register number. +* This parameter can be: RTC_BKP_DRx where x can be from 0 to 15 to +* specify the register. +* @param: Data: Data to be written in the specified RTC Backup data register. +* @return: None +******************************************************************************/ +void HAL_RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data) +{ + /* Check the parameters */ + assert_param(IS_RTC_BKP(RTC_BKP_DR)); + RTC->BAKUP[RTC_BKP_DR] = Data; +} + +/****************************************************************************** +* @brief: Reads data from the specified RTC Backup data Register. +* @param: RTC_BKP_DR: RTC Backup data Register number. +* This parameter can be: RTC_BKP_DRx where x can be from 0 to 15 to +* specify the register. +* @return: Read value +******************************************************************************/ +uint32_t HAL_RTC_ReadBackupRegister(uint32_t RTC_BKP_DR) +{ + uint32_t tmp = 0; + + /* Check the parameters */ + assert_param(IS_RTC_BKP(RTC_BKP_DR)); + + tmp = RTC->BAKUP[RTC_BKP_DR]; + + /* Read the specified register */ + return tmp; +} + + +/****************************************************************************** +* @brief: Enables or disables the specified RTC interrupts. +* @param: RTC_IT: specifies the RTC interrupt sources to be enabled or disabled. +* @param: NewState: new state of the specified RTC interrupts. +* This parameter can be: ENABLE or DISABLE. +* @return: None +******************************************************************************/ +void HAL_RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_RTC_IT_FLAG(RTC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the RTC_IT Interrupt in the RTC_IE */ + RTC->IE |= RTC_IT ; + } + else + { + /* Disable the RTC_IT Interrupt in the RTC_IE */ + RTC->IE &= (~RTC_IT); + } +} + +/****************************************************************************** +* @brief: Checks whether the specified RTC flag is set or not. +* @param: RTC_FLAG: specifies the flag to check. +* @return: The new state of RTC_FLAG (SET or RESET). +******************************************************************************/ +FlagStatus HAL_RTC_GetFlagStatus(uint32_t RTC_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_RTC_IT_FLAG(RTC_FLAG)); + + /* Return the status of the flag */ + if ((RTC->SR & RTC_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/****************************************************************************** +* @brief: Clears the RTC's pending flags. +* @param: RTC_FLAG: specifies the RTC flag to clear. +* @return: None +******************************************************************************/ +void HAL_RTC_ClearFlag(uint32_t RTC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_RTC_IT_FLAG(RTC_FLAG)); + + /* Clear the Flags in the RTC_ISR register */ + RTC->SR = RTC_FLAG; +} + +/****************************************************************************** +* @brief: Checks whether the specified RTC interrupt has occurred or not. +* @param: RTC_IT: specifies the RTC interrupt source to check. +* @return: The new state of RTC_IT (SET or RESET). +******************************************************************************/ +ITStatus HAL_RTC_GetITStatus(uint32_t RTC_IT) +{ + ITStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_RTC_IT_FLAG(RTC_IT)); + + /* Get the status of the Interrupt */ + if (((RTC->IE & RTC_IT) != (uint32_t)RESET) && ((RTC->SR & RTC_IT) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/****************************************************************************** +* @brief: Clears the RTC's interrupt pending bits. +* @param: RTC_IT: specifies the RTC interrupt pending bit to clear. +* @return: none +******************************************************************************/ +void HAL_RTC_ClearITPendingBit(uint32_t RTC_IT) +{ + /* Check the parameters */ + assert_param(IS_RTC_IT_FLAG(RTC_IT)); + + if((RTC->IE & RTC_IT)!= RESET) + { + /* Clear the interrupt pending bits in the RTC_SR register */ + RTC->SR = RTC_IT; + } +} + + +#endif + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sdmmc.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sdmmc.c new file mode 100644 index 0000000000..aa26c275d3 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sdmmc.c @@ -0,0 +1,1316 @@ +/* + ****************************************************************************** + * @file HAL_SDMMC.c + * @version V1.0.0 + * @date 2020 + * @brief SDIO HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Secure Digital Input/Output(SDIO) Peripheral. + * @ Initialization and de-initialization functions + * @ Peripheral Control functions + * @ Standard commnad process functions + ****************************************************************************** +*/ +#include "hal.h" + +#ifdef HAL_SDMMC_MODULE_ENABLED + +static const uint32_t BitWidthTbl[] = {SDMMC_BW_1, SDMMC_BW_4, SDMMC_BW_8, SDMMC_BW_1, SDMMC_BW_1, SDMMC_BW_4, SDMMC_BW_8}; + + + +static void sdmmc_set_blk_size(SDMMC_HandleTypeDef *hsdmmc, uint16_t BlkSize) +{ + hsdmmc->Instance->SDMMC_BLKSIZ = BlkSize; +} + + +void sdmmc_card_clk_en(SDMMC_HandleTypeDef *hsdmmc) +{ + hsdmmc->Instance->SDMMC_CLKENA |= (1<Init.Ch); + hsdmmc->Instance->SDMMC_CMD = (SDMMC_START_CMD | SDMMC_UPDATE_CLK_ONLY | SDMMC_WAIT_PRVDATA_END); + while((hsdmmc->Instance->SDMMC_CMD & SDMMC_START_CMD) != 0); +} + + +void sdmmc_card_clk_dis(SDMMC_HandleTypeDef *hsdmmc) +{ + hsdmmc->Instance->SDMMC_CLKENA &= (~(1<Init.Ch)); + hsdmmc->Instance->SDMMC_CMD = (SDMMC_START_CMD | SDMMC_UPDATE_CLK_ONLY | SDMMC_WAIT_PRVDATA_END); + while((hsdmmc->Instance->SDMMC_CMD & SDMMC_START_CMD) != 0); + +} + + +/********************************************************************************* +* Function : HAL_SDMMC_MspInit +* Description : Initialize the SDIO MSP. +* Input : hsdmmc: SDIO handle. +* Output : status +**********************************************************************************/ +__weak void HAL_SDMMC_MspInit(SDMMC_HandleTypeDef *hsdmmc) +{ + ; +} + + +__weak void HAL_SDMMC_Sel_IO_Voltage(uint8_t LDO_SEL) +{ + ; +} + + +/********************************************************************************* +* Function : HAL_SDMMC_MspDeInit +* Description : DeInitialize the SDMMC MSP. +* Input : hsdmmc: SDIO handle. +* Output : status +**********************************************************************************/ +void HAL_SDMMC_MspDeInit(SDMMC_HandleTypeDef *hsdmmc) +{ + /* + NOTE: This function should be modified, when the callback is needed, + the HAL_SDIO_MspDeInit can be implemented in the user file. + */ + ; +} + +/********************************************************************************* +* Function : HAL_SDMMC_Init +* Description : Initialize the SDIO according to the specified parameters +* in the SDMMC_InitTypeDef +* Input : hsdmmc: SDMMC handle. +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Init(SDMMC_HandleTypeDef *hsdmmc) +{ + int i; + +#ifdef USE_FULL_ASSERT + if(!IS_SDMMC_CH_VLD(hsdmmc->Init.Ch)) return HAL_ERROR; + if(!IS_SDMMC_ALL_INSTANCE(hsdmmc->Instance)) return HAL_ERROR; + if (!IS_SDMMC_VLD_MODE(hsdmmc->Init.TransMode)) return HAL_ERROR; + if(!IS_SDMMC_VLD_BW(hsdmmc->Init.TransBW)) return HAL_ERROR; +#endif + + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_SDMMC_MspInit(hsdmmc); + + HAL_RCC_SDMMCClockSourceConfig(SDMMC_CLK_SRC_SYS_CLK); + HAL_RCC_SDMMCSampleClockSourceConfig(SDMMC_SAMPLE_CLK_SDIO); + + hsdmmc->Instance->SDMMC_CTRL |= (SDMMC_CTRL_CTRL_RST | SDMMC_CTRL_FIFO_RST | SDMMC_CTRL_IDMA_RST); //reset SDIO Controller/FIFO/DMA + while(hsdmmc->Instance->SDMMC_CTRL & (SDMMC_CTRL_CTRL_RST | SDMMC_CTRL_FIFO_RST | SDMMC_CTRL_IDMA_RST)); + + hsdmmc->Instance->SDMMC_PWREN |= SDMMC_POWER_ON(hsdmmc->Init.Ch); + if(SD_IO_VCC_3V3==hsdmmc->Init.SDSigVoltage) + { + hsdmmc->Instance->SDMMC_CLKENA |= SDMMC_LOW_POWER(hsdmmc->Init.Ch); //low power mode + } + + hsdmmc->Instance->SDMMC_RINTSTS = 0x03FFFF; //clear all int status of current sdio channel + hsdmmc->Instance->SDMMC_UHS_REG = 0; + + +#ifdef SDMMC_INT_MODE + NVIC_ClearPendingIRQ(SDMMC_IRQn); + NVIC_EnableIRQ(SDMMC_IRQn); + hsdmmc->Instance->SDMMC_INTMASK = (0xFF|(1<Init.Ch)); //enable all int src of current sdio channel +// hsdmmc->Instance->SDMMC_INTMASK = (((1<<2)|(1<<11))|(1<Init.Ch)); //enable all int src of current sdio channel + hsdmmc->Instance->SDMMC_CTRL |= SDMMC_CTRL_INT_EN; +#endif + + if(hsdmmc->Init.IDmaEn) //IDMA enabled + { + hsdmmc->Instance->SDMMC_CTRL |= SDMMC_CTRL_USE_IDMA; + hsdmmc->Instance->SDMMC_BMOD = (SDMMC_BMOD_IDMA_PBL|SDMMC_BMOD_IDMA_EN); + } + + hsdmmc->Instance->SDMMC_CTYPE = (SDMMC_BW_1<Init.Ch); //Sigle wire mode while initialize + hsdmmc->Instance->SDMMC_TMOUT = SDMMC_TIMEOUT_RW | SDMMC_TIMEOUT_RESP ; //Set read data and wait response timeout value + hsdmmc->Instance->SDMMC_BLKSIZ = SDMMC_BLOCK_SIZE; + hsdmmc->Instance->SDMMC_FIFOTH = SDMMC_RX_LEVEL | SDMMC_TX_LEVEL; + hsdmmc->Instance->SDMMC_DEBNCE = SDMMC_DEBOUNCE_COUNT; + + if(hsdmmc->Init.CardType ==EMMC_CARD) + { + hsdmmc->SdEmmcRegInfo.rca = EMMC_RCA_VALUE; + hsdmmc->SdEmmcRegInfo.hcs = EMMC_HCS; + } + else + { + hsdmmc->SdEmmcRegInfo.rca = 0; + hsdmmc->SdEmmcRegInfo.hcs = SD_HCS; + } + + HAL_SDMMC_Sel_IO_Voltage(SD_IO_VCC_3V3); + + return HAL_OK; +} + + +void sdio_idma_desc_link(SDMMC_IDMA_DESC_INFO * sdio_idma_desc) +{ + uint32_t i; + SDMMC_IDMA_DESC_INFO *idam_desc; + + idam_desc = sdio_idma_desc; + + for(i=0; i<16; i++) + { + idam_desc->IDMA_Desc3_buf_addr2 = (uint32_t)(idam_desc+1); + idam_desc++; + } + idam_desc->IDMA_Desc3_buf_addr2 = 0; +} + + +/********************************************************************************* +* Function : HAL_SDMMC_SetClk +* Description : Set SDIO clock source and clock divide value +* Input : hsdmmc: SDMMC handle. +* div: divide value +* clk_src:clock source +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_SetClk(SDMMC_HandleTypeDef *hsdmmc, uint32_t div, uint32_t clk_src) +{ +// RCC->PER_CFGR = ((RCC->PER_CFGR & ~SDMMC_CLK_SRC_MSK) | SDMMC_CLK_SRC); + + hsdmmc->Instance->SDMMC_CLKENA &= ~(1<Init.Ch); //stop clk + hsdmmc->Instance->SDMMC_CMD = (SDMMC_START_CMD | SDMMC_UPDATE_CLK_ONLY | SDMMC_WAIT_PRVDATA_END); + while((hsdmmc->Instance->SDMMC_CMD & SDMMC_START_CMD) != 0); + + hsdmmc->Instance->SDMMC_CLKSRC = ((hsdmmc->Instance->SDMMC_CLKSRC & (~(3<<(hsdmmc->Init.Ch<<1))))| (clk_src<<(hsdmmc->Init.Ch<<1))); + hsdmmc->Instance->SDMMC_CLKDIV = ((hsdmmc->Instance->SDMMC_CLKDIV & (~(0xFF<<(clk_src<<3))))|(div<<(clk_src<<3))); + hsdmmc->Instance->SDMMC_CMD = (SDMMC_START_CMD | SDMMC_UPDATE_CLK_ONLY | SDMMC_WAIT_PRVDATA_END); + while((hsdmmc->Instance->SDMMC_CMD & SDMMC_START_CMD) != 0); + + hsdmmc->Instance->SDMMC_CLKENA |= (1<Init.Ch); //enable clk + hsdmmc->Instance->SDMMC_CMD = (SDMMC_START_CMD | SDMMC_UPDATE_CLK_ONLY | SDMMC_WAIT_PRVDATA_END); + while((hsdmmc->Instance->SDMMC_CMD & (SDMMC_START_CMD)) != 0); + + hsdmmc->Instance->SDMMC_CLKENA |= (1<Init.Ch); //enable clk + hsdmmc->Instance->SDMMC_CMD = (SDMMC_START_CMD | SDMMC_UPDATE_CLK_ONLY | SDMMC_WAIT_PRVDATA_END); + while((hsdmmc->Instance->SDMMC_CMD & (SDMMC_START_CMD)) != 0); + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd_NoDat +* Description : Send command without argument +* Input : hsdmmc: SDMMC handle. +* cmd: command +* cmd_arg:argument of current command +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd_NoDat(SDMMC_HandleTypeDef *hsdmmc, uint32_t cmd, uint32_t cmd_arg) +{ + while(hsdmmc->Instance->SDMMC_STATUS&(1<<9)); //wait idle + hsdmmc->Instance->SDMMC_RINTSTS = 0x03FFFF; + + hsdmmc->Instance->SDMMC_CMDARG = cmd_arg; + + hsdmmc->Instance->SDMMC_CMD = (cmd | (hsdmmc->Init.Ch<<16)); + +#ifdef SDMMC_INT_MODE + while(!(hsdmmc->Intflg&SDMMC_RINT_CMD_CMPLT)); //wait for fifo empty + hsdmmc->Intflg &= ~SDMMC_RINT_CMD_CMPLT; +#else + while(!(hsdmmc->Instance->SDMMC_RINTSTS&SDMMC_RINT_CMD_CMPLT)); //wait for command transfer completed + hsdmmc->Instance->SDMMC_RINTSTS = SDMMC_RINT_CMD_CMPLT; //clear flg +#endif + + if(cmd == CMD1_MATCH_VCC) //R3 + { + if(hsdmmc->Instance->SDMMC_RINTSTS & SDMMC_RINT_RESP_TIMOUT) + { + hsdmmc->Instance->SDMMC_RINTSTS = SDMMC_RINT_RESP_TIMOUT; + return HAL_ERROR; + } + } + else + { + //error:ack/ack_crc,ack_timeout + if(hsdmmc->Instance->SDMMC_RINTSTS & (SDMMC_RINT_RESP_ERR | SDMMC_RINT_RESP_CRC_ERR | SDMMC_RINT_RESP_TIMOUT)) + { + hsdmmc->Instance->SDMMC_RINTSTS = (SDMMC_RINT_RESP_ERR | SDMMC_RINT_RESP_CRC_ERR | SDMMC_RINT_RESP_TIMOUT); + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd_RdDat +* Description : command process which return data +* Input : hsdmmc: SDMMC handle. +* cmd: Command +* cmd_arg:Argument of current command +* length: Read data length +* buff: Read data buffer +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd_RdDat(SDMMC_HandleTypeDef *hsdmmc, uint32_t cmd, uint32_t cmd_arg, uint32_t length, uint32_t *buff) +{ + uint32_t i; + uint32_t mask; + uint32_t len, addr; + uint32_t idma_trans_cnt=0; + SDMMC_IDMA_DESC_INFO IdmaDesc[SDMMC_IDMA_DESC_NUM]; + + hsdmmc->Instance->SDMMC_CTRL |= (SDMMC_CTRL_FIFO_RST | SDMMC_CTRL_IDMA_RST); //reset SDIO FIFO/DMA + while(hsdmmc->Instance->SDMMC_CTRL & (SDMMC_CTRL_FIFO_RST | SDMMC_CTRL_IDMA_RST)); + + if(hsdmmc->Init.IDmaEn) + { + hsdmmc->Instance->SDMMC_CTRL = SDMMC_CTRL_IDMA_RST; + hsdmmc->Instance->SDMMC_BMOD |= SDMMC_BMOD_SWR; + len = length; + addr = (uint32_t)buff; + for(i=0; i=SDMMC_IDMA_MAX_SIZE)? SDMMC_IDMA_MAX_SIZE:len); + IdmaDesc[i].IDMA_Desc2_buf_addr1 = addr; + len -= IdmaDesc[i].IDMA_Desc1_buf_size; + addr += IdmaDesc[i].IDMA_Desc1_buf_size; + idma_trans_cnt++; + if(i==(SDMMC_IDMA_DESC_NUM-1)) + { + IdmaDesc[i].IDMA_Desc3_buf_addr2 = (uint32_t)&IdmaDesc[0]; + } + else + { + IdmaDesc[i].IDMA_Desc3_buf_addr2 = (uint32_t)&IdmaDesc[i+1]; + } + + if(0==len) + { + IdmaDesc[i].IDMA_Desc0_ctrl_stas &= ~SDMMC_IDMA_DESC_CHAINED; + IdmaDesc[i].IDMA_Desc0_ctrl_stas |= (SDMMC_IDMA_DESC_LAST); + break; + } + } + hsdmmc->Instance->SDMMC_CTRL |= SDMMC_CTRL_USE_IDMA; + hsdmmc->Instance->SDMMC_DBADDR = (uint32_t)IdmaDesc; + hsdmmc->Instance->SDMMC_IDINTEN |= SDMMC_IDINTEN_RI; + } + + while(hsdmmc->Instance->SDMMC_STATUS&(1<<9)); //wait idle + hsdmmc->Instance->SDMMC_RINTSTS = 0x03FFFF; //clear all int status + + hsdmmc->Instance->SDMMC_BYTCNT = length; + hsdmmc->Instance->SDMMC_CMDARG = cmd_arg; + hsdmmc->Instance->SDMMC_CMD = (cmd | (hsdmmc->Init.Ch<<16)); + +#ifdef SDMMC_INT_MODE + while(!(hsdmmc->Intflg&SDMMC_RINT_CMD_CMPLT)); //wait for fifo empty + hsdmmc->Intflg &= ~SDMMC_RINT_CMD_CMPLT; +#else + while(!(hsdmmc->Instance->SDMMC_RINTSTS&SDMMC_RINT_CMD_CMPLT)); //wait for command transfer completed + hsdmmc->Instance->SDMMC_RINTSTS = (SDMMC_RINT_CMD_CMPLT|(1<<(hsdmmc->Init.Ch+16))); + +#endif + + if(hsdmmc->Init.IDmaEn) + { + i=0; + while(idma_trans_cnt) + { + while(!(hsdmmc->Instance->SDMMC_IDSTS&SDMMC_IDSTS_RI)); + hsdmmc->Instance->SDMMC_IDSTS = SDMMC_IDSTS_RI; + + //error:ack/ack_crc,ack_timeout + if(hsdmmc->Instance->SDMMC_RINTSTS & (SDMMC_RINT_RESP_ERR | SDMMC_RINT_RESP_CRC_ERR | SDMMC_RINT_RESP_TIMOUT)) + { + hsdmmc->Instance->SDMMC_RINTSTS = (SDMMC_RINT_RESP_ERR | SDMMC_RINT_RESP_CRC_ERR | SDMMC_RINT_RESP_TIMOUT | (1<Init.Ch)); + return HAL_TIMEOUT; + } + + idma_trans_cnt--; + if(len) + { + IdmaDesc[i].IDMA_Desc0_ctrl_stas = (SDMMC_IDMA_DESC_OWN|SDMMC_IDMA_DESC_CHAINED); //addr2 include next descriptor address + IdmaDesc[i].IDMA_Desc1_buf_size = ((len>=SDMMC_IDMA_MAX_SIZE)? SDMMC_IDMA_MAX_SIZE:len); + IdmaDesc[i].IDMA_Desc2_buf_addr1 = addr; + len -= IdmaDesc[i].IDMA_Desc1_buf_size; + addr += IdmaDesc[i].IDMA_Desc1_buf_size; + idma_trans_cnt++; + if(i==(SDMMC_IDMA_DESC_NUM-1)) + { + IdmaDesc[i].IDMA_Desc3_buf_addr2 = (uint32_t)IdmaDesc; + } + else + { + IdmaDesc[i].IDMA_Desc3_buf_addr2 = (uint32_t)&IdmaDesc[i+1]; + } + + if(0==len) + { + IdmaDesc[i].IDMA_Desc0_ctrl_stas |= SDMMC_IDMA_DESC_LAST; + } + } + } + } + else + { + //error:ack/ack_crc,ack_timeout + if(hsdmmc->Instance->SDMMC_RINTSTS & (SDMMC_RINT_RESP_ERR | SDMMC_RINT_RESP_CRC_ERR | SDMMC_RINT_RESP_TIMOUT)) + { + hsdmmc->Instance->SDMMC_RINTSTS = (SDMMC_RINT_RESP_ERR | SDMMC_RINT_RESP_CRC_ERR | SDMMC_RINT_RESP_TIMOUT | (1<Init.Ch)); + return HAL_TIMEOUT; + } + + for(i=0;i<((length+3)>>2);i++) + { + while(hsdmmc->Instance->SDMMC_STATUS&SDMMC_FIFO_EMPTY); //wait while fifo is empty + buff[i] = hsdmmc->Instance->SDMMC_DATA; + } + } + +#ifdef SDMMC_INT_MODE + while(hsdmmc->Intflg&SDMMC_RINT_DAT_TRANS_CMPLT); //wait for data transfer completed + hsdmmc->Intflg &= ~SDMMC_RINT_DAT_TRANS_CMPLT; +#else + while(!(hsdmmc->Instance->SDMMC_RINTSTS & SDMMC_RINT_DAT_TRANS_CMPLT)); //wait for data transfer completed + hsdmmc->Instance->SDMMC_RINTSTS = (SDMMC_RINT_DAT_TRANS_CMPLT | (1<Init.Ch)); //clear flg +#endif + + while(hsdmmc->Instance->SDMMC_STATUS & (1<<9)); //Wait D0 idle + + if(hsdmmc->Instance->SDMMC_STATUS & 0x3FFE0000) //FIFO not empty + { + hsdmmc->Instance->SDMMC_CTRL |= SDMMC_CTRL_FIFO_RST; //Reset fifo + while(hsdmmc->Instance->SDMMC_CTRL & SDMMC_CTRL_FIFO_RST); + } + + mask = ((cmd ==CMD14_BUSTEST_R)? 0xA200 : 0xA280); + + if(hsdmmc->Instance->SDMMC_RINTSTS & mask) + { + hsdmmc->Instance->SDMMC_RINTSTS = (mask | (1<Init.Ch)); + return HAL_TIMEOUT; + } + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd_WrDat +* Description : command process which write data +* Input : hsdmmc: SDMMC handle. +* cmd: Command +* cmd_arg:Argument of current command +* length: Read data length +* buff: Read data buffer +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd_WrDat(SDMMC_HandleTypeDef *hsdmmc, uint32_t cmd, uint32_t cmd_arg, uint32_t length, uint32_t *buff) +{ + uint32_t i; + uint32_t len, addr; + uint32_t idma_trans_cnt=0; + SDMMC_IDMA_DESC_INFO IdmaDesc[SDMMC_IDMA_DESC_NUM]; + + if(hsdmmc->Init.IDmaEn) + { + hsdmmc->Instance->SDMMC_CTRL = SDMMC_CTRL_IDMA_RST; + hsdmmc->Instance->SDMMC_BMOD |= SDMMC_BMOD_SWR; + len = length; + addr = (uint32_t)buff; + for(i=0; i=SDMMC_IDMA_MAX_SIZE)? SDMMC_IDMA_MAX_SIZE:len); + IdmaDesc[i].IDMA_Desc2_buf_addr1 = addr; + len -= IdmaDesc[i].IDMA_Desc1_buf_size; + addr += IdmaDesc[i].IDMA_Desc1_buf_size; + idma_trans_cnt++; + if(i==(SDMMC_IDMA_DESC_NUM-1)) + { + IdmaDesc[i].IDMA_Desc3_buf_addr2 = (uint32_t)&IdmaDesc[0]; + } + else + { + IdmaDesc[i].IDMA_Desc3_buf_addr2 = (uint32_t)&IdmaDesc[i+1]; + } + if(0==len) + { + IdmaDesc[i].IDMA_Desc0_ctrl_stas &= ~SDMMC_IDMA_DESC_CHAINED; + IdmaDesc[i].IDMA_Desc0_ctrl_stas |= (SDMMC_IDMA_DESC_LAST); + break; + } + } + + hsdmmc->Instance->SDMMC_CTRL |= SDMMC_CTRL_USE_IDMA; + hsdmmc->Instance->SDMMC_DBADDR = (uint32_t)IdmaDesc; + hsdmmc->Instance->SDMMC_IDINTEN |= SDMMC_IDINTEN_TI; + } + + while(hsdmmc->Instance->SDMMC_STATUS&(1<<9)); //wait idle + hsdmmc->Instance->SDMMC_RINTSTS = 0x03FFFF; //clear all int status + + hsdmmc->Instance->SDMMC_BYTCNT = length; + hsdmmc->Instance->SDMMC_CMDARG = cmd_arg; + hsdmmc->Instance->SDMMC_CMD = (cmd | (hsdmmc->Init.Ch<<16)); + +#ifdef SDMMC_INT_MODE + while(!(hsdmmc->Intflg&SDMMC_RINT_CMD_CMPLT)); //wait for fifo empty + hsdmmc->Intflg &= ~SDMMC_RINT_CMD_CMPLT; +#else + while(!(hsdmmc->Instance->SDMMC_RINTSTS&SDMMC_RINT_CMD_CMPLT)); //wait for command transfer completed + hsdmmc->Instance->SDMMC_RINTSTS = (SDMMC_RINT_CMD_CMPLT | (1<<(hsdmmc->Init.Ch+16))); //clear flg +#endif + + if(hsdmmc->Init.IDmaEn) + { + i=0; + while(idma_trans_cnt) + { + while(!(hsdmmc->Instance->SDMMC_IDSTS&SDMMC_IDSTS_TI)); + hsdmmc->Instance->SDMMC_IDSTS = SDMMC_IDSTS_TI; + + //error:ack/ack_crc,ack_timeout + if(hsdmmc->Instance->SDMMC_RINTSTS & (SDMMC_RINT_RESP_ERR | SDMMC_RINT_RESP_CRC_ERR | SDMMC_RINT_RESP_TIMOUT)) + { + hsdmmc->Instance->SDMMC_RINTSTS = (SDMMC_RINT_RESP_ERR | SDMMC_RINT_RESP_CRC_ERR | SDMMC_RINT_RESP_TIMOUT | (1<Init.Ch)); + return HAL_TIMEOUT; + } + + idma_trans_cnt--; + if(len) + { + IdmaDesc[i].IDMA_Desc0_ctrl_stas = (SDMMC_IDMA_DESC_OWN|SDMMC_IDMA_DESC_CHAINED); //addr2 include next descriptor address + IdmaDesc[i].IDMA_Desc1_buf_size = ((len>=SDMMC_IDMA_MAX_SIZE)? SDMMC_IDMA_MAX_SIZE:len); + IdmaDesc[i].IDMA_Desc2_buf_addr1 = addr; + len -= IdmaDesc[i].IDMA_Desc1_buf_size; + addr += IdmaDesc[i].IDMA_Desc1_buf_size; + idma_trans_cnt++; + if(i==(SDMMC_IDMA_DESC_NUM-1)) + { + IdmaDesc[i].IDMA_Desc3_buf_addr2 = (uint32_t)&IdmaDesc[0]; + } + else + { + IdmaDesc[i].IDMA_Desc3_buf_addr2 = (uint32_t)&IdmaDesc[i+1]; + } + if(0==len) + { + IdmaDesc[i].IDMA_Desc0_ctrl_stas |= SDMMC_IDMA_DESC_LAST; + } + } + } + } + else + { + //error:ack/ack_crc,ack_timeout + if(hsdmmc->Instance->SDMMC_RINTSTS & (SDMMC_RINT_RESP_ERR | SDMMC_RINT_RESP_CRC_ERR | SDMMC_RINT_RESP_TIMOUT)) + { + hsdmmc->Instance->SDMMC_RINTSTS = (SDMMC_RINT_RESP_ERR | SDMMC_RINT_RESP_CRC_ERR | SDMMC_RINT_RESP_TIMOUT | (1<Init.Ch)); + return HAL_TIMEOUT; + } + + for(i=0;i<((length+3)>>2);i++) + { + while(!(hsdmmc->Instance->SDMMC_STATUS&SDMMC_FIFO_TX_LEV_DOWN)); //wait while fifo level is low than tx level + hsdmmc->Instance->SDMMC_DATA = buff[i]; + } + } + +#ifdef SDMMC_INT_MODE + while(hsdmmc->Intflg&SDMMC_RINT_DAT_TRANS_CMPLT); //wait for fifo empty + hsdmmc->Intflg &= ~SDMMC_RINT_DAT_TRANS_CMPLT; +#else + while(!(hsdmmc->Instance->SDMMC_RINTSTS & SDMMC_RINT_DAT_TRANS_CMPLT)); //wait for command transfer completed + hsdmmc->Instance->SDMMC_RINTSTS = (SDMMC_RINT_DAT_TRANS_CMPLT | (1<Init.Ch)); //clear flg +#endif + + hsdmmc->Instance->SDMMC_CTRL |= SDMMC_CTRL_FIFO_RST; //Reset fifo + while(hsdmmc->Instance->SDMMC_STATUS & (1<<9)); //Wait card idle + + if(cmd !=CMD19_BUSTEST_W) + { + if(hsdmmc->Instance->SDMMC_RINTSTS & (SDMMC_RINT_DAT_CRC_ERR | SDMMC_RINT_EBIT_WCRC_ERR)) + { + hsdmmc->Instance->SDMMC_RINTSTS = (SDMMC_RINT_DAT_CRC_ERR | SDMMC_RINT_EBIT_WCRC_ERR | (1<Init.Ch)); + return HAL_ERROR; + } + } + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd0_GoIdle +* Description : command process which write data +* Input : hsdmmc: SDMMC handle. +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd0_GoIdle(SDMMC_HandleTypeDef *hsdmmc) +{ + uint32_t cmd_arg; + + cmd_arg = ((hsdmmc->Init.CardType==EMMC_CARD)? 0xF0F0F0F0 : 0); + return HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD0_GO_IDLE, cmd_arg); +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd1_SendOp +* Description : +* Input : hsdmmc: SDMMC handle. +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd1_SendOp(SDMMC_HandleTypeDef *hsdmmc) +{ + uint32_t cmd_arg; + uint32_t i, t=0; + uint32_t resp_tbl[10]; + + if(hsdmmc->Init.CardType != EMMC_CARD) return 0xFF; + + cmd_arg= (hsdmmc->SdEmmcRegInfo.hcs<<30)|EMMC_VDD_WINDOW; + + while(1) + { + if(HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD1_MATCH_VCC, cmd_arg)) + { + return HAL_ERROR; + } + + if(t<10) + { + resp_tbl[t++] = hsdmmc->Instance->SDMMC_RESP0; + } + if(hsdmmc->Instance->SDMMC_RESP0 & (1UL<<31)) //Wait internal power up routine finish + { + for(i=0; iInstance->SDMMC_RESP0>>30)&0x01) != hsdmmc->SdEmmcRegInfo.hcs) //capacity is not compatible + { + hsdmmc->SdEmmcRegInfo.hcs = ((hsdmmc->Instance->SDMMC_RESP0>>30)&0x01); + } + + hsdmmc->SdEmmcRegInfo.ocr = hsdmmc->Instance->SDMMC_RESP0; + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd2_GetCid +* Description : +* Input : hsdmmc: SDMMC handle. +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd2_GetCid(SDMMC_HandleTypeDef *hsdmmc) +{ + if(HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD2_CID, 0)) //enter pre idle state + { + return HAL_ERROR; + } + + hsdmmc->SdEmmcRegInfo.cid[0] = hsdmmc->Instance->SDMMC_RESP0; + hsdmmc->SdEmmcRegInfo.cid[1] = hsdmmc->Instance->SDMMC_RESP1; + hsdmmc->SdEmmcRegInfo.cid[2] = hsdmmc->Instance->SDMMC_RESP2; + hsdmmc->SdEmmcRegInfo.cid[3] = hsdmmc->Instance->SDMMC_RESP3; + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd3_Rca +* Description : +* Input : hsdmmc: SDMMC handle. +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd3_Rca(SDMMC_HandleTypeDef *hsdmmc) +{ + uint32_t result; + uint32_t cmd_arg; + + cmd_arg = ((hsdmmc->Init.CardType==EMMC_CARD)? (hsdmmc->SdEmmcRegInfo.rca<<16) : 0); + + if(0!=(result=HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD3_RCA, cmd_arg))) + { + return result; + } + + if(hsdmmc->Init.CardType == SD_CARD) + { + hsdmmc->SdEmmcRegInfo.rca = (hsdmmc->Instance->SDMMC_RESP0>>16); + } + + return HAL_OK; +} + + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd5_Sleep +* Description : Switch eMMC card to sleep/awake mode. +* Input : hsdmmc: SDMMC handle. +* sleep_awake: 1-sleep 0-awake +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd5_Sleep(SDMMC_HandleTypeDef *hsdmmc, uint8_t sleep_awake) +{ + uint32_t cmd_arg; + + if(hsdmmc->Init.CardType == SD_CARD) + { + return HAL_OK; + } + + cmd_arg = (sleep_awake? (hsdmmc->SdEmmcRegInfo.rca|(1<<15)) : hsdmmc->SdEmmcRegInfo.rca); + + return HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD5_SLEEP, cmd_arg); +} + + + +/********************************************************************************* +* Function : HAL_EMMC_Cmd6_Switch +* Description : +* Input : hsdmmc: SDMMC handle. +* Output : status +**********************************************************************************/ + +HAL_StatusTypeDef HAL_EMMC_Cmd6_Switch(SDMMC_HandleTypeDef *hsdmmc, uint8_t index, uint8_t Val) +{ + uint32_t cmd_arg; + + cmd_arg = (MMC_SWITCH_MODE_WRITE_BYTE<<24) | (index<<16) | (Val<<8); + return HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD6_SWTICH, cmd_arg); +} + + +HAL_StatusTypeDef HAL_SD_Cmd6_Switch(SDMMC_HandleTypeDef *hsdmmc, uint32_t cmd_arg, uint32_t *pRespBuf) +{ + uint32_t result=0; + + if(NULL == pRespBuf) + { + return 0x02; + } + sdmmc_set_blk_size(hsdmmc, 64); + result = HAL_SDMMC_Cmd_RdDat(hsdmmc, CMD6_SWTICH, cmd_arg, 64, pRespBuf); + sdmmc_set_blk_size(hsdmmc, SDMMC_BLOCK_SIZE); + + if(result) + { + return 0x01; + } + return 0; +} + +//switch access mode of SD card +HAL_StatusTypeDef HAL_SD_Cmd6_Switch_AM(SDMMC_HandleTypeDef *hsdmmc, uint8_t AccessMode) +{ + uint32_t result=0; + uint32_t cmd_arg; + uint8_t tmp_buf[64]; + + //bit31: 0-check mode 1-switch mode + cmd_arg = ((1UL<<31) | 0x00000000 | (AccessMode<<0) | (3<<12)); //DDR50 mode and 800mA limit + +#if 0 + if(0!=(result=HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD6_SWTICH, cmd_arg))) +#else + sdmmc_set_blk_size(hsdmmc, 64); + if(0!=(result=HAL_SDMMC_Cmd_RdDat(hsdmmc, (CMD6_SWTICH|(1<<9)), cmd_arg, 64, (uint32_t *)tmp_buf))) +#endif + { + return result; + } + + sdmmc_set_blk_size(hsdmmc, SDMMC_BLOCK_SIZE); + if(SD_ACCESS_MODE_DDR50==AccessMode) + { + hsdmmc->Instance->SDMMC_UHS_REG |= (1UL<<(hsdmmc->Init.Ch+16)); + } + else + { + hsdmmc->Instance->SDMMC_UHS_REG &= (~(1UL<<(hsdmmc->Init.Ch+16))); + } + + return 0; +} + + +//send tuning pattern +HAL_StatusTypeDef HAL_SD_Cmd19_Tuning_Pattern(SDMMC_HandleTypeDef *hsdmmc) +{ + uint32_t result=0; + + if(0!=(result=HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD19_BUSTEST_W, 0))) + { + return result; + } + + return 0; +} + + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd6_SwitchBitW +* Description : +* Input : hsdmmc: SDMMC handle. +* bus_width: destinate bus width +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd6_SwitchBitW(SDMMC_HandleTypeDef *hsdmmc, uint32_t bus_width) +{ + uint32_t result=0; + uint32_t cmd_arg; + uint32_t temp; + + if((bus_width)==SDMMC_TRANS_BW_4) cmd_arg = 0x03B70100; + else if ((bus_width)==SDMMC_TRANS_BW_8) cmd_arg = 0x03B70200; + else if ((bus_width)==SDMMC_TRANS_DDR_4) cmd_arg = 0x03B70500; + else if ((bus_width)==SDMMC_TRANS_DDR_8) cmd_arg = 0x03B70600; + else return 0x01; + + result=HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD6_SWTICH, cmd_arg); + if(result) + { + return 0x02; + } + + hsdmmc->Instance->SDMMC_CTYPE &= ~((1UL<Init.Ch) | (1UL<<(16+hsdmmc->Init.Ch))); + hsdmmc->Instance->SDMMC_CTYPE |= (BitWidthTbl[hsdmmc->Init.TransBW]<Init.Ch); + + if(SDMMC_MODE_DDR==hsdmmc->Init.TransMode) + { + hsdmmc->Instance->SDMMC_UHS_REG |= (1<<(hsdmmc->Init.Ch+16)); + } + + return HAL_OK; +} + + +HAL_StatusTypeDef HAL_SD_Acmd6_set_bus_width(SDMMC_HandleTypeDef *hsdmmc, uint32_t bus_width) +{ + uint32_t result=0; + uint32_t cmd_arg; + uint32_t temp; + + result=HAL_SDMMC_cmd55_app(hsdmmc); + if(result) + { + return 0x01; + } + + if((bus_width&0x03)==SDMMC_TRANS_BW_1) cmd_arg = 0x00; + else if ((bus_width&0x03)==SDMMC_TRANS_BW_4) cmd_arg = 0x02; + else return 0x02; + + result=HAL_SDMMC_Cmd_NoDat(hsdmmc, ACMD6_SET_BUS_WIDTH, cmd_arg); + if(result) + { + return 0x03; + } + + hsdmmc->Instance->SDMMC_CTYPE &= ~((1UL<Init.Ch) | (1UL<<(16+hsdmmc->Init.Ch))); + hsdmmc->Instance->SDMMC_CTYPE |= (BitWidthTbl[hsdmmc->Init.TransBW]<Init.Ch); + + return 0; +} + + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd7_Sel +* Description : +* Input : hsdmmc: SDMMC handle. +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd7_Sel(SDMMC_HandleTypeDef *hsdmmc) +{ + uint32_t cmd_arg; + + cmd_arg = hsdmmc->SdEmmcRegInfo.rca<<16; + return HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD7_SELECT_CARD, cmd_arg); +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd8_GetExtCsd +* Description : +* Input : hsdmmc: SDMMC handle. +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd8_GetExtCsd(SDMMC_HandleTypeDef *hsdmmc, uint32_t *buff) +{ + uint32_t cmd_arg; + uint32_t result=0; + + if(hsdmmc->Init.CardType==EMMC_CARD) + { + cmd_arg = 0; + return HAL_SDMMC_Cmd_RdDat(hsdmmc, CMD8_EXT_CSD_EMMC, cmd_arg, 512, buff); + } + else + { + cmd_arg = ((1<<8)|0xAA); //2.7V~3.3V + if(0!=(result=HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD8_EXT_CSD_SD, cmd_arg))) + { + return result; + } + + if(hsdmmc->Instance->SDMMC_RESP0 != cmd_arg) + { + return HAL_ERROR; //VCC out of range + } + } + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd9_GetCsd +* Description : +* Input : hsdmmc: SDMMC handle. +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd9_GetCsd(SDMMC_HandleTypeDef *hsdmmc) +{ + uint32_t result=0; + + if(0!=(result=HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD9_CSD, (hsdmmc->SdEmmcRegInfo.rca<<16)))) + { + return result; + } + + hsdmmc->SdEmmcRegInfo.csd[0] = hsdmmc->Instance->SDMMC_RESP0; + hsdmmc->SdEmmcRegInfo.csd[1] = hsdmmc->Instance->SDMMC_RESP1; + hsdmmc->SdEmmcRegInfo.csd[2] = hsdmmc->Instance->SDMMC_RESP2; + hsdmmc->SdEmmcRegInfo.csd[3] = hsdmmc->Instance->SDMMC_RESP3; + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd11_SwitchVoltage +* Description : switch to 1.8V bus signal level, only for SD card +* Input : hsdmmc: SDMMC handle. +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd11_SwitchVoltage(SDMMC_HandleTypeDef *hsdmmc) +{ + if(hsdmmc->Init.CardType==EMMC_CARD) + { + return HAL_OK; + } + + while(hsdmmc->Instance->SDMMC_STATUS&(1<<9)); //wait idle + hsdmmc->Instance->SDMMC_RINTSTS = 0x03FFFF; + hsdmmc->Instance->SDMMC_CMDARG = 0; + hsdmmc->Instance->SDMMC_CMD = (CMD11_SWITCH_VOLTAGE | (hsdmmc->Init.Ch<<16)); + + //wait for Volt_switch_int + HAL_Delay(2); + if(!(hsdmmc->Instance->SDMMC_RINTSTS & SDMMC_RINT_DTO_VSHINT)) //Wait IO voltage switch interrupt flg + { + return HAL_TIMEOUT; + } + hsdmmc->Instance->SDMMC_RINTSTS = SDMMC_RINT_DTO_VSHINT; //clear Volt_switch_int flg + + //stop clk + hsdmmc->Instance->SDMMC_CLKENA &= (~(1<Init.Ch)); + hsdmmc->Instance->SDMMC_CMD = (SDMMC_START_CMD | SDMMC_UPDATE_CLK_ONLY | (1<<28)); + + //switch voltage + HAL_SDMMC_Sel_IO_Voltage(SD_IO_VCC_1V8); + hsdmmc->Instance->SDMMC_UHS_REG |= (1<Init.Ch); + HAL_Delay(5); + + //start clk + hsdmmc->Instance->SDMMC_CLKENA |= (1<Init.Ch); + HAL_Delay(1); + hsdmmc->Instance->SDMMC_CMD = (SDMMC_START_CMD | SDMMC_UPDATE_CLK_ONLY | (1<<28)); + HAL_Delay(1); + + while(!(hsdmmc->Instance->SDMMC_RINTSTS&SDMMC_RINT_CMD_CMPLT)); //wait for command transfer completed + hsdmmc->Instance->SDMMC_RINTSTS = (SDMMC_RINT_CMD_CMPLT|SDMMC_RINT_DTO_VSHINT); //clear Command done flg + + return 0; +} + + +HAL_StatusTypeDef HAL_SDMMC_Cmd12_StopStream(SDMMC_HandleTypeDef *hsdmmc) +{ + uint32_t cmd_arg; + + cmd_arg= hsdmmc->SdEmmcRegInfo.rca<<16; + + return HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD12_STOP_STEARM, cmd_arg); +} + + + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd16_SetBlkLen +* Description : +* Input : hsdmmc: SDMMC handle. +* block_size: +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd16_SetBlkLen(SDMMC_HandleTypeDef *hsdmmc, uint32_t block_size) +{ + return HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD16_SET_BLOCKLEN, block_size); +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd17_RdSingle +* Description : read single block +* Input : hsdmmc: SDMMC handle. +* block_size: +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd17_RdSingle(SDMMC_HandleTypeDef *hsdmmc, uint32_t blk_addr, uint32_t *buff) +{ + uint32_t addr; + + addr = ((hsdmmc->SdEmmcRegInfo.hcs==STANDRAD_CAPACITY)? blk_addr*SDMMC_BLOCK_SIZE : blk_addr); + + return HAL_SDMMC_Cmd_RdDat(hsdmmc, CMD17_READ_SINGLE, addr, SDMMC_BLOCK_SIZE, buff); +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd18_RdMul +* Description : read multiple block +* Input : hsdmmc: SDMMC handle. +* block_size: +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd18_RdMul(SDMMC_HandleTypeDef *hsdmmc, uint32_t blk_addr, uint32_t blk_num, uint32_t *buff) +{ + uint32_t addr; + + addr = ((hsdmmc->SdEmmcRegInfo.hcs==STANDRAD_CAPACITY)? blk_addr*SDMMC_BLOCK_SIZE : blk_addr); + + return HAL_SDMMC_Cmd_RdDat(hsdmmc, CMD18_READ_MUL, addr, blk_num*SDMMC_BLOCK_SIZE, buff); +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd24_WrSingle +* Description : write single block +* Input : hsdmmc: SDMMC handle. +* block_size: +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd24_WrSingle(SDMMC_HandleTypeDef *hsdmmc, uint32_t blk_addr, uint32_t *buff) +{ + uint32_t addr; + + addr = ((hsdmmc->SdEmmcRegInfo.hcs==STANDRAD_CAPACITY)? blk_addr*SDMMC_BLOCK_SIZE : blk_addr); + + return HAL_SDMMC_Cmd_WrDat(hsdmmc, CMD24_WRITE_SINGLE, addr, SDMMC_BLOCK_SIZE, buff); +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd25_WrMul +* Description : write single block +* Input : hsdmmc: SDMMC handle. +* block_size: +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd25_WrMul(SDMMC_HandleTypeDef *hsdmmc, uint32_t blk_addr, uint32_t blk_num, uint32_t *buff) +{ + uint32_t addr; + + addr = ((hsdmmc->SdEmmcRegInfo.hcs==STANDRAD_CAPACITY)? blk_addr*SDMMC_BLOCK_SIZE : blk_addr); + + return HAL_SDMMC_Cmd_WrDat(hsdmmc, CMD25_WRITE_MUL, addr, blk_num*SDMMC_BLOCK_SIZE, buff); +} + +/********************************************************************************* +* Function : HAL_SDMMC_Cmd28_Erase +* Description : erase destinate block +* Input : hsdmmc: SDMMC handle. +* block_size: +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Cmd28_Erase(SDMMC_HandleTypeDef *hsdmmc, uint32_t blk_start_addr, uint32_t blk_num) +{ + uint32_t cmd; + uint32_t addr; + uint32_t result; + + cmd = ((hsdmmc->Init.CardType==EMMC_CARD)? CMD35_ERASESD_START : CMD32_ERASESD_START); + addr = ((hsdmmc->SdEmmcRegInfo.hcs==STANDRAD_CAPACITY)? blk_start_addr*SDMMC_BLOCK_SIZE : blk_start_addr); + if(0!=(result=HAL_SDMMC_Cmd_NoDat(hsdmmc, cmd, addr))) + { + return result; + } + + cmd = ((hsdmmc->Init.CardType==EMMC_CARD)? CMD36_ERASESD_END : CMD33_ERASESD_END); + addr += ((hsdmmc->SdEmmcRegInfo.hcs==STANDRAD_CAPACITY)? ((blk_num-1)*SDMMC_BLOCK_SIZE) : ((blk_num-1))); + if(0!=(result=HAL_SDMMC_Cmd_NoDat(hsdmmc, cmd, addr))) + { + return result; + } + + return HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD38_ERASE, 0); +} + +/********************************************************************************* +* Function : HAL_SDMMC_cmd55_app +* Description : +* Input : hsdmmc: SDMMC handle. +* block_size: +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_cmd55_app(SDMMC_HandleTypeDef *hsdmmc) +{ + return HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD55_APP, (hsdmmc->SdEmmcRegInfo.rca<<16)); +} + +/********************************************************************************* +* Function : HAL_SDMMC_Acmd6_SetBusW +* Description : erase destinate block +* Input : hsdmmc: SDMMC handle. +* block_size: +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Acmd6_SetBusW(SDMMC_HandleTypeDef *hsdmmc) +{ + uint32_t result=0; + uint32_t cmd_arg; + + if(0!= (result=HAL_SDMMC_cmd55_app(hsdmmc))) + { + return result; + } + + if(hsdmmc->Init.TransBW==SDMMC_TRANS_BW_1) + { + cmd_arg = 0x00; + } + else if(hsdmmc->Init.TransBW==SDMMC_TRANS_BW_4) + { + cmd_arg = 0x02; + } + else + { + return HAL_ERROR; + } + + if(0!=(result=HAL_SDMMC_Cmd_NoDat(hsdmmc, ACMD6_SET_BUS_WIDTH, cmd_arg))) + { + return result; + } + + hsdmmc->Instance->SDMMC_CTYPE &= ~((1UL<Init.Ch) | (1UL<<(16+hsdmmc->Init.Ch))); + hsdmmc->Instance->SDMMC_CTYPE |= (BitWidthTbl[hsdmmc->Init.TransBW]<Init.Ch); + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_SDMMC_Acmd41_SendCond +* Description : erase destinate block +* Input : hsdmmc: SDMMC handle. +* block_size: +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SDMMC_Acmd41_SendCond(SDMMC_HandleTypeDef *hsdmmc, uint8_t power_level) +{ + uint32_t result=0; + uint32_t arg; + + while(1) + { + if(0!=(result=HAL_SDMMC_cmd55_app(hsdmmc))) + { + return result; + } + + if(SD_IO_VCC_3V3==power_level) + { + arg = (hsdmmc->SdEmmcRegInfo.hcs<<30)|SD_VDD_WINDOW; + } + else + { + arg = (hsdmmc->SdEmmcRegInfo.hcs<<30)|SD_VDD_WINDOW|(1<<24)|(1<<28); + } + + if(0!=(result=HAL_SDMMC_Cmd_NoDat(hsdmmc, ACMD41_SEND_COND, arg))) + { + return result; + } + + if(hsdmmc->Instance->SDMMC_RESP0 & (1UL<<31)) + { + break; + } + } + + if(((hsdmmc->Instance->SDMMC_RESP0>>30)&0x01) != hsdmmc->SdEmmcRegInfo.hcs) //capacity is not accordance + { + hsdmmc->SdEmmcRegInfo.hcs = ((hsdmmc->Instance->SDMMC_RESP0>>30)&0x01); + } + + hsdmmc->SdEmmcRegInfo.ocr = hsdmmc->Instance->SDMMC_RESP0; + + if(SD_IO_VCC_1V8==power_level) + { + if(!(hsdmmc->Instance->SDMMC_RESP0&(1<<24))) //SD card not support 1.8V signal voltage + { + hsdmmc->Init.SDSigVoltage = SD_IO_VCC_3V3; + } + } + + return HAL_OK; +} + + +HAL_StatusTypeDef HAL_SDMMC_Acmd51_SendScr(SDMMC_HandleTypeDef *hsdmmc, uint8_t *pScr) +{ + uint32_t result=0; + uint32_t arg; + uint32_t scrbuf[2]; + + while(1) + { + if(0!=(result=HAL_SDMMC_cmd55_app(hsdmmc))) + { + return result; + } + + if(0!=(result=HAL_SDMMC_Cmd_RdDat(hsdmmc, ACMD51_GET_SCR, 0, 2, (uint32_t *)pScr))) + { + return result; + } + + if(hsdmmc->Instance->SDMMC_RESP0 & (1UL<<31)) + { + break; + } + } + + if(((hsdmmc->Instance->SDMMC_RESP0>>30)&0x01) != hsdmmc->SdEmmcRegInfo.hcs) //capacity is not accordance + { + hsdmmc->SdEmmcRegInfo.hcs = ((hsdmmc->Instance->SDMMC_RESP0>>30)&0x01); + } + + hsdmmc->SdEmmcRegInfo.ocr = hsdmmc->Instance->SDMMC_RESP0; + + return HAL_OK; +} + + +/********************************************************************************* +* Function : HAL_MMC_Enum +* Description : erase destinate block +* Input : hsdmmc: SDMMC handle. +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_EMMC_Enum(SDMMC_HandleTypeDef *hsdmmc, uint32_t SrcClk) +{ + uint32_t result=0; + uint32_t div; + +// div=(SrcClk/400000)+4; //set SDIO bus clock to (0~400KHz) + div=(SrcClk/100000)+4; //set SDIO bus clock to (0~400KHz) +// div=div/2; + + if(0!=(result = HAL_SDMMC_SetClk(hsdmmc, div, SDMMC_CLK_SRC_DIV0))) + { + return result; + } + + if(0!=(result = HAL_SDMMC_Cmd0_GoIdle(hsdmmc))) + { + return result; + } + + if(0!=(result = HAL_SDMMC_Cmd1_SendOp(hsdmmc))) + { + return result; + } + + if(0!=(result = HAL_SDMMC_Cmd2_GetCid(hsdmmc))) + { + return result; + } + + if(0!=(result = HAL_SDMMC_Cmd3_Rca(hsdmmc))) + { + return result; + } + + div = SrcClk/hsdmmc->Init.BusClk; + if(SrcClk%hsdmmc->Init.BusClk) + { + div++; + } + printfS("SDMMC CLK= %d Mhz\n", (SrcClk/div)/1000000); + + return HAL_SDMMC_SetClk(hsdmmc, div, SDMMC_CLK_SRC_DIV1); +} + +/********************************************************************************* +* Function : HAL_SD_Enum +* Description : +* Input : hsdmmc: SDMMC handle. +* Output : status +**********************************************************************************/ +HAL_StatusTypeDef HAL_SD_Enum(SDMMC_HandleTypeDef *hsdmmc, uint32_t SrcClk) +{ + uint32_t result=0; + uint32_t div; + + div=(SrcClk/400000)+4; //set SDIO bus clock to (0~400KHz) + div=div/2; + + if(0!=(result = HAL_SDMMC_SetClk(hsdmmc, div, SDMMC_CLK_SRC_DIV0))) + { + return result; + } + + if(0!=(result = HAL_SDMMC_Cmd0_GoIdle(hsdmmc))) + { + return result; + } + + if(0!=(result = HAL_SDMMC_Cmd8_GetExtCsd(hsdmmc, NULL))) + { + return result; + } + + if(0!=(result = HAL_SDMMC_Acmd41_SendCond(hsdmmc, hsdmmc->Init.SDSigVoltage))) + { + return result; + } + + if(SD_IO_VCC_1V8==hsdmmc->Init.SDSigVoltage) //use only while switch to 1.8V + { + if(0!=(result = HAL_SDMMC_Cmd11_SwitchVoltage(hsdmmc))) + { + return result; + } + } + + if(0!=(result = HAL_SDMMC_Cmd2_GetCid(hsdmmc))) + { + return result; + } + + return HAL_SDMMC_Cmd3_Rca(hsdmmc); +} + + + +#endif + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_spi.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_spi.c new file mode 100644 index 0000000000..c098a7bc51 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_spi.c @@ -0,0 +1,1663 @@ +/****************************************************************************** +*@file : hal_spi.c +*@brief : This file provides firmware functions to manage the SPI HAL module +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ +#include "hal_spi.h" + +#ifdef HAL_SPI_MODULE_ENABLED + +/****************************************************************************** +*@brief : SPI interrupt handler +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@return: None +*@note : Execute HAL_SPI_IRQHandler funcion in SRAM may speed up the TXFIFO/RXFIFO operation +******************************************************************************/ +__weak void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi) +{ + if ( (hspi->Instance->STATUS & SPI_STATUS_RX_FIFO_NOT_EMPTY) && ((hspi->Instance->IE) & SPI_IE_RX_FIFO_NOT_EMPTY_EN) ) + { + do{ + if (hspi->Rx_Count < hspi->Rx_Size) + { + hspi->Rx_Buffer[hspi->Rx_Count++] = hspi->Instance->DAT; + } + else break; + }while (hspi->Instance->STATUS & SPI_STATUS_RX_FIFO_NOT_EMPTY); + } + + if ( (hspi->Instance->STATUS & SPI_STATUS_TX_FIFO_HALF_EMPTY) && ((hspi->Instance->IE) & SPI_IE_TX_FIFO_HALF_EMPTY_EN) ) + { + while (!(hspi->Instance->STATUS & SPI_STATUS_TX_FIFO_FULL)) + { + if(hspi->Tx_Count < hspi->Tx_Size) + { + hspi->Instance->DAT = hspi->Tx_Buffer[hspi->Tx_Count++]; + } + else + { + /* Disable TxFIFO half empty interrupt */ + CLEAR_BIT(hspi->Instance->IE, SPI_IE_TX_FIFO_HALF_EMPTY_EN); + break; + } + } + } + + if ((hspi->Instance->STATUS & SPI_STATUS_TX_BATCH_DONE) && ((hspi->Instance->IE) & SPI_IE_TX_BATCH_DONE_EN) ) + { + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(hspi->Instance, SPI_STATUS_TX_BATCH_DONE); + + /* Disable TX Batch Done Interrupt, Tx FIFO half empty Interrupt */ + CLEAR_BIT(hspi->Instance->IE, SPI_IE_TX_BATCH_DONE_EN | SPI_IE_TX_FIFO_HALF_EMPTY_EN); + + if ( (hspi->Init.SPI_Mode == SPI_MODE_MASTER) && (hspi->KeepCS == false) ) + { + /* CS de-active */ + __HAL_SPI_CS_RELEASE(hspi); + } + + /* Tx Disable */ + CLEAR_BIT(hspi->Instance->TX_CTL, SPI_TX_CTL_EN); + CLEAR_BIT(hspi->Instance->TX_CTL, SPI_TX_CTL_DMA_REQ_EN); + + hspi->TxState = SPI_TX_STATE_IDLE; + } + + if ( (hspi->Instance->STATUS & SPI_STATUS_RX_BATCH_DONE) && ((hspi->Instance->IE) & SPI_STATUS_RX_BATCH_DONE) ) + { + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(hspi->Instance, SPI_STATUS_RX_BATCH_DONE); + + /* Disable RX Batch Done Interrupt, RXFIFO not Empty interrupt */ + CLEAR_BIT(hspi->Instance->IE, SPI_IE_RX_BATCH_DONE_EN | SPI_IE_RX_FIFO_NOT_EMPTY_EN); + + while (hspi->Instance->STATUS & SPI_STATUS_RX_FIFO_NOT_EMPTY) + { + if (hspi->Rx_Count < hspi->Rx_Size) + { + hspi->Rx_Buffer[hspi->Rx_Count++] = hspi->Instance->DAT; + } + else break; + } + ///////////// + + if ( (hspi->Init.SPI_Mode == SPI_MODE_MASTER) && (hspi->KeepCS == false) ) + { + /* CS de-active */ + __HAL_SPI_CS_RELEASE(hspi); + } + + /* Rx Disable */ + CLEAR_BIT(hspi->Instance->RX_CTL, SPI_RX_CTL_DMA_REQ_EN); + CLEAR_BIT(hspi->Instance->RX_CTL, SPI_RX_CTL_EN); + + hspi->RxState = SPI_RX_STATE_IDLE; + } +} + +/****************************************************************************** +*@brief : Init low level of SPI module: GPIO, CLK, NVIC +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@return: None +******************************************************************************/ +__weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) +{ + /* + NOTE : This function is implemented in user xxx_hal_msp.c + */ + + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); +} + +/****************************************************************************** +*@brief : SPI De-Initialize the SPI clock, GPIO, IRQ. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@return: None +******************************************************************************/ +__weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) +{ + /* + NOTE : This function is implemented in user xxx_hal_msp.c + */ + + /* Prevent unused argument(s) compilation warning */ + UNUSED(hspi); +} + +/****************************************************************************** +*@brief : Initialize the SPI module with parameters +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi) +{ + /* Check SPI Parameter */ + assert_param (IS_SPI_ALL_INSTANCE(hspi->Instance)); + assert_param (IS_SPI_ALL_MODE(hspi->Init.SPI_Mode)); + assert_param (IS_SPI_WORK_MODE(hspi->Init.SPI_Work_Mode)); + assert_param (IS_SPI_X_MODE(hspi->Init.X_Mode)); + assert_param (IS_SPI_FIRST_BIT(hspi->Init.First_Bit)); + + if(hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + assert_param (IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRate_Prescaler)); + } + else + { + assert_param (IS_SPI_INSTANCE_SLAVE_MODE(hspi->Instance)); + } + + if(hspi->Init.X_Mode == SPI_4X_MODE) + { + assert_param (IS_SPI_INSTANCE_4X_MODE(hspi->Instance)); + } + + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_SPI_MspInit(hspi); + + /* Automatic change direction */ + hspi->Instance->CTL |= (SPI_CTL_IO_MODE); + + /* Set SPI Work mode */ + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + SET_BIT(hspi->Instance->CTL, SPI_CTL_MST_MODE); + MODIFY_REG(hspi->Instance->RX_CTL, SPI_RX_CTL_SSHIFT_Msk, hspi->Init.Master_SShift); + + assert_param(IS_SPI_CS_SEL(hspi->CSx)); + + if((hspi->CSx == SPI_CS_CS1) || (hspi->CSx == SPI_CS_CS2)) + { + //SET_BIT(hspi->Instance->CS, SPI_CSMAP_EN); + + hspi->Instance->CS = SPI_CSMAP_EN; + } + else + { + //CLEAR_BIT(hspi->Instance->CS, SPI_CSMAP_EN); + + hspi->Instance->CS = 0; + } + } + else + { + CLEAR_BIT(hspi->Instance->CTL, SPI_CTL_MST_MODE); + + if(hspi->Init.Slave_SofteCs_En == SPI_SLAVE_SOFT_CS_ENABLE) + { + SET_BIT(hspi->Instance->CTL, SPI_CTL_SWCS_EN); + SET_BIT(hspi->Instance->CTL, SPI_CTL_SWCS); //Soft CS set to HIGH. + } + else + CLEAR_BIT(hspi->Instance->CTL, SPI_CTL_SWCS_EN); + + hspi->Instance->BATCH = (hspi->Instance->BATCH & (~0x000FFFFFU)) | (1 << 0); + + hspi->Instance->TX_CTL |= SPI_TX_CTL_MODE | (0x88 << 8); // dummy data = 0x88 + + //if (hspi->Init.X_Mode != SPI_1X_MODE) + { + hspi->Instance->CTL |= SPI_CTL_SFILTER | SPI_CTL_CS_FILTER; + } + + /* Slave Alternate Enable */ + hspi->Instance->CTL |= SPI_CTL_SLAVE_EN; + + /* Slave Mode Enable Rx By Default */ + hspi->Instance->RX_CTL |= SPI_RX_CTL_EN; + } + + /* Set SPI First Bit */ + if (hspi->Init.First_Bit == SPI_FIRSTBIT_LSB) + SET_BIT(hspi->Instance->CTL, SPI_CTL_LSB_FIRST); + else + CLEAR_BIT(hspi->Instance->CTL, SPI_CTL_LSB_FIRST); + + /* Set SPI Work Mode */ + hspi->Instance->CTL = ((hspi->Instance->CTL) & (~(SPI_CTL_CPHA | SPI_CTL_CPOL))) | (hspi->Init.SPI_Work_Mode); + + /* Set SPI X_Mode */ + hspi->Instance->CTL = ((hspi->Instance->CTL) & (~SPI_CTL_X_MODE)) | (hspi->Init.X_Mode); + + /* Set SPI BaudRate Prescaler */ + hspi->Instance->BAUD = ((hspi->Instance->BAUD) & (~0x0000FFFF)) | (hspi->Init.BaudRate_Prescaler); + + /* Disable All Interrupt */ + hspi->Instance->IE = 0x00000000; + + assert_param(hspi->Instance->STATUS != 0); + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_SPI_MEMACCInit(SPI_HandleTypeDef* hspi, SPI_MemACCInitTypeDef* MemACCParam) +{ + SPI_TypeDef* SPIx; + assert_param (IS_SPI_MEM_INSTANCE(hspi->Instance)); + assert_param (hspi->Init.SPI_Mode == SPI_MODE_MASTER); + + SPIx = hspi->Instance; + + SPIx->ALTER_BYTE = MemACCParam->MemAlterByte; + SPIx->CMD = MemACCParam->MemCMD; + SPIx->MEMO_ACC = MemACCParam->MemACC; + SPIx->CS_TOUT_VAL = MemACCParam->MemCSTimeout; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : e-Initialize the SPI peripheral +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi) +{ + /* Check the SPI handle allocation */ + if (hspi == NULL) + { + return HAL_ERROR; + } + + /* Check SPI Instance parameter */ + assert_param (IS_SPI_ALL_INSTANCE(hspi->Instance)); + + hspi->RxState = SPI_RX_STATE_IDLE; + hspi->TxState = SPI_TX_STATE_IDLE; + + /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ + HAL_SPI_MspDeInit(hspi); + + hspi->Rx_Size = 0; + hspi->Tx_Size = 0; + hspi->Rx_Count = 0; + hspi->Tx_Count = 0; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_SPI_Switch_CS(SPI_HandleTypeDef *hspi, uint8_t CSx) +{ + assert_param(IS_SPI_CS_SEL(CSx)); + + hspi->CSx = CSx; + + if((hspi->CSx == SPI_CS_CS1) || (hspi->CSx == SPI_CS_CS2)) + { + SET_BIT(hspi->Instance->CS, SPI_CSMAP_EN); + } + else + { + CLEAR_BIT(hspi->Instance->CS, SPI_CSMAP_EN); + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Transmits an amount of data by loop mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@param : Timeout : Transmit Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +static HAL_StatusTypeDef _HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + uint32_t i; + uint32_t send_cnt = 0; + uint32_t recv_cnt = 0; + __IO uint32_t uiTimeout; + HAL_StatusTypeDef Status = HAL_OK; + SPI_TypeDef* SPIx = hspi->Instance; + + /* Check SPI Parameter */ + assert_param (IS_SPI_ALL_INSTANCE(SPIx)); + + if(!Size) return HAL_ERROR; + if (pData == NULL) return HAL_ERROR; + + hspi->Tx_Count = 0; + hspi->Tx_Size = Size; + hspi->Tx_Buffer = pData; + + uiTimeout = Timeout; + + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + /* Tx Enable */ + hspi->Instance->TX_CTL |= SPI_TX_CTL_EN; + /* Rx Disable */ + hspi->Instance->RX_CTL &= (~SPI_RX_CTL_EN); + + /* Clear TX FIFO */ + __SPI_TXFIFO_RESET(SPIx); + + /* Set Data Size */ + SPIx->BATCH = Size; + + while((!(SPIx->STATUS & SPI_STATUS_TX_FIFO_FULL)) && (Size > send_cnt)) + { + SPIx->DAT = pData[send_cnt++]; + } + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Transmit Start */ + __HAL_SPI_TRANSSTART_CS_LOW(hspi); + } + + while(Size > send_cnt) + { + /* Wait Tx FIFO Not Full */ + if(!(SPIx->STATUS & SPI_STATUS_TX_FIFO_FULL)) + { + SPIx->DAT = pData[send_cnt++]; + uiTimeout = Timeout; + } + else + { + /* Wait Timeout */ + if(uiTimeout) + { + uiTimeout--; + if(uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + } + + /* Wait Transmit Done */ + while (!(SPIx->STATUS & SPI_STATUS_TX_BATCH_DONE)); + +End: + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + /* Tx Disable */ + CLEAR_BIT(hspi->Instance->TX_CTL, SPI_TX_CTL_EN); + + hspi->Tx_Count = send_cnt; + + return Status; +} + +/****************************************************************************** +*@brief : Transmits an amount of data by loop mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@param : Timeout : Transmit Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status; + + Status = _HAL_SPI_Transmit(hspi, pData, Size, Timeout); + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Transmit End */ + __HAL_SPI_CS_RELEASE(hspi); + } + + return Status; +} + +/****************************************************************************** +*@brief : Transmits an amount of data by loop mode witch CS kept low(Master mode). +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@param : Timeout : Transmit Timeout +*@return: HAL_StatusTypeDef +*@note : CS will NOT kept low if transmitting is timed out. +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_TransmitKeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status; + + Status = _HAL_SPI_Transmit(hspi, pData, Size, Timeout); + + if ( (hspi->Init.SPI_Mode == SPI_MODE_MASTER) && (Status == HAL_TIMEOUT) ) + { + /* Transmit End */ + __HAL_SPI_CS_RELEASE(hspi); + } + + return Status; +} + +/****************************************************************************** +*@brief : Receive an amount of data by loop mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@param : Timeout : Receive Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +static HAL_StatusTypeDef _HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + __IO uint32_t uiTimeout; + uint32_t i; + uint32_t recv_cnt = 0; + + SPI_TypeDef* SPIx = hspi->Instance; + + HAL_StatusTypeDef Status = HAL_OK; + + /* Check SPI Parameter */ + assert_param (IS_SPI_ALL_INSTANCE(SPIx)); + + if (pData == NULL) return HAL_ERROR; + + hspi->Rx_Count = 0; + hspi->Rx_Size = Size; + hspi->Rx_Buffer = pData; + uiTimeout = Timeout; + + /* Clear RX FIFO */ + __SPI_RXFIFO_RESET(SPIx); + + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + SPIx->RX_CTL |= SPI_RX_CTL_EN; + SPIx->TX_CTL &= ~SPI_TX_CTL_EN; //tx_en = 0, why send 88? + + SPIx->BATCH = 1; + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Set Data Size */ + SPIx->BATCH = Size; + /* Receive Start */ + __HAL_SPI_TRANSSTART_CS_LOW(hspi); + } + + while ( Size > recv_cnt ) + { + if (!READ_BIT(SPIx->STATUS, SPI_STATUS_RX_FIFO_EMPTY)) + { + pData[recv_cnt++] = SPIx->DAT; + uiTimeout = Timeout; + + } + else + { + if(uiTimeout) + { + uiTimeout--; + if (uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + } + + /* Wait Transmit Done */ + while (!(SPIx->STATUS & SPI_STATUS_RX_BATCH_DONE)); + +End: + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + /* Rx Disable */ + CLEAR_BIT(SPIx->RX_CTL, SPI_RX_CTL_EN); + + hspi->Rx_Count = recv_cnt; + + return Status; +} + +/****************************************************************************** +*@brief : Receive an amount of data by loop mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@param : Timeout : Receive Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status; + + Status = _HAL_SPI_Receive(hspi, pData, Size, Timeout); + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Receive End */ + __HAL_SPI_CS_RELEASE(hspi); + } + + return Status; +} + +/****************************************************************************** +*@brief : Receive an amount of data by loop mode witch CS contorl. +* This function is same as HAL_SPI_Receive except that it will +* control the CS state according to the param Init.KeepCS at the end of transmission +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@param : Timeout : Receive Timeout +*@param : CSState : The CS control State at the end of current transmission. +* This param can be a value of: +* CS_RELEASE: Relase the CS Pin at the end of transmission(CS release to HIGH) +* CS_HOLD : Keep the CS Pin for next transmission(CS keep LOW) +*@return: HAL_StatusTypeDef +*@note : It will always release CS when transmission is timed out. +* This function can be compatible with HAL_SPI_Receive by always setting Init.KeepCS to false. +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_ReceiveKeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status; + + Status = _HAL_SPI_Receive(hspi, pData, Size, Timeout); + + if ( (hspi->Init.SPI_Mode == SPI_MODE_MASTER) && (Status == HAL_TIMEOUT) ) + { + /* Receive End */ + __HAL_SPI_CS_RELEASE(hspi); + } + + return Status; +} + +/****************************************************************************** +*@brief : SPI Wire Config +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : X_Mode : 1x/2x/4x Mode, see@ref X_MODE +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_Wire_Config(SPI_HandleTypeDef *hspi, uint32_t X_Mode) +{ + /* Check SPI Parameter */ + assert_param (IS_SPI_ALL_INSTANCE(hspi->Instance)); + + /* Set SPI X_Mode */ + hspi->Instance->CTL = ((hspi->Instance->CTL) & (~SPI_CTL_X_MODE)) | X_Mode; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Transmits an amount of data by IT mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef _HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size) +{ + SPI_TypeDef* SPIx = hspi->Instance; + /* Check SPI Parameter */ + assert_param (IS_SPI_ALL_INSTANCE(SPIx)); + + /* Tx machine is running */ + if (hspi->TxState != SPI_TX_STATE_IDLE) + { + return HAL_ERROR; + } + + hspi->Tx_Size = Size; + hspi->Tx_Buffer = pData; + hspi->Tx_Count = 0; + + /* Clear TX FIFO */ + __SPI_TXFIFO_RESET(SPIx); + + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + /* Set Data Size */ + SPIx->BATCH = Size; + + /* Tx Enable */ + SPIx->TX_CTL |= SPI_TX_CTL_EN; + /* Rx Disable */ + SPIx->RX_CTL &= (~SPI_RX_CTL_EN); + + while (hspi->Tx_Count < hspi->Tx_Size) + { + if (!(SPIx->STATUS & SPI_STATUS_TX_FIFO_FULL)) + SPIx->DAT = hspi->Tx_Buffer[hspi->Tx_Count++]; + else + break; + } + + /* Enable Tx FIFO half empty Interrupt and Tx batch done Interrupt*/ + SET_BIT(SPIx->IE, (SPI_IE_TX_FIFO_HALF_EMPTY_EN | SPI_IE_TX_BATCH_DONE_EN)); + + /* Set machine is Sending */ + hspi->TxState = SPI_TX_STATE_SENDING; + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Transmit Start */ + __HAL_SPI_TRANSSTART_CS_LOW(hspi); + } + + return HAL_OK; +} + + +/****************************************************************************** +*@brief : Transmits an amount of data by IT mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size) +{ + assert_param(hspi); + + hspi->KeepCS = false; + + return _HAL_SPI_Transmit_IT(hspi, pData, Size); +} + +/****************************************************************************** +*@brief : Transmits an amount of data by IT mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_Transmit_IT_KeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size) +{ + assert_param(hspi); + + if(hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + hspi->KeepCS = true; + } + + return _HAL_SPI_Transmit_IT(hspi, pData, Size); +} + +/****************************************************************************** +*@brief : Receive an amount of data by IT mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@return: HAL_StatusTypeDef +******************************************************************************/ +static HAL_StatusTypeDef _HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size) +{ + SPI_TypeDef* SPIx = hspi->Instance; + + /* Check SPI Parameter */ + assert_param (IS_SPI_ALL_INSTANCE(SPIx)); + + /* Rx machine is running */ + if (hspi->RxState != SPI_RX_STATE_IDLE) + { + return HAL_ERROR; + } + + /* Clear RX FIFO */ + __SPI_RXFIFO_RESET(SPIx); + + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + /* Rx Enable */ + SPIx->RX_CTL |= SPI_RX_CTL_EN; + + /* Set Data Size */ + SPIx->BATCH = Size; + + hspi->Rx_Size = Size; + hspi->Rx_Buffer = pData; + hspi->Rx_Count = 0; + + /* Enable Rx FIFO Not Empty Interrupt */ + SET_BIT(SPIx->IE, SPI_IE_RX_FIFO_NOT_EMPTY_EN | SPI_IE_RX_BATCH_DONE_EN); + + /* Set Slave machine is receiving */ + hspi->RxState = SPI_RX_STATE_RECEIVING; + + if(hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Receive Start */ + __HAL_SPI_TRANSSTART_CS_LOW(hspi); + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data by IT mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size) +{ + assert_param(hspi); + + hspi->KeepCS = false; + + return _HAL_SPI_Receive_IT(hspi, pData, Size); +} + +/****************************************************************************** +*@brief : Receive an amount of data by IT mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_Receive_IT_KeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size) +{ + assert_param(hspi); + + if(hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + hspi->KeepCS = true; + } + + return _HAL_SPI_Receive_IT(hspi, pData, Size); +} + +#ifdef HAL_DMA_MODULE_ENABLED +/****************************************************************************** +*@brief : Transmits an amount of data by DMA mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef _HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size) +{ + SPI_TypeDef* SPIx = hspi->Instance; + + /* Check SPI Parameter */ + assert_param (IS_SPI_ALL_INSTANCE(SPIx)); + + /* Rx machine is running */ + if (hspi->TxState != SPI_TX_STATE_IDLE) + { + return HAL_ERROR; + } + + /* Clear TX FIFO */ + __SPI_TXFIFO_RESET(SPIx); + + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + /* Enable Tx Batch Done Interrupt */ + SET_BIT(SPIx->IE, SPI_STATUS_TX_BATCH_DONE); + + /* Set Data Size */ + SPIx->BATCH = Size; + + /* Tx FIFO */ + SPIx->TX_CTL &= ~SPI_TX_CTL_DMA_LEVEL; + SPIx->TX_CTL |= SPI_TX_CTL_DMA_LEVEL_0; + + /* Tx Enable */ + SPIx->TX_CTL |= SPI_TX_CTL_EN; + /* Rx Disable */ + SPIx->RX_CTL &= (~SPI_RX_CTL_EN); + + /* Set machine is Sending */ + hspi->TxState = SPI_TX_STATE_SENDING; + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Transmit Start */ + __HAL_SPI_TRANSSTART_CS_LOW(hspi); + } + + HAL_DMA_Start(hspi->HDMA_Tx, (uint32_t)pData, (uint32_t)&SPIx->DAT, Size); + + SPIx->TX_CTL |= SPI_TX_CTL_DMA_REQ_EN; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size) +{ + assert_param(hspi); + + hspi->KeepCS = false; + + return _HAL_SPI_Transmit_DMA(hspi, pData, Size); +} + +HAL_StatusTypeDef HAL_SPI_Transmit_DMA_KeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size) +{ + assert_param(hspi); + + hspi->KeepCS = false; + + return _HAL_SPI_Transmit_DMA(hspi, pData, Size); +} + +/****************************************************************************** +*@brief : Receive an amount of data by DMA mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef _HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size) +{ + SPI_TypeDef* SPIx = hspi->Instance; + + /* Check SPI Parameter */ + assert_param (IS_SPI_ALL_INSTANCE(hspi->Instance)); + + /* Rx machine is running */ + if (hspi->RxState != SPI_RX_STATE_IDLE) + { + return HAL_ERROR; + } + + /* Clear RX FIFO */ + __SPI_RXFIFO_RESET(SPIx); + + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + /* Enable Rx Batch Done Interrupt */ + SET_BIT(hspi->Instance->IE, SPI_STATUS_RX_BATCH_DONE); + + /* Set Data Size */ + hspi->Instance->BATCH = Size; + + /* Rx Enable */ + hspi->Instance->RX_CTL |= SPI_RX_CTL_EN; + /* Rx FIFO */ + hspi->Instance->RX_CTL |= SPI_RX_CTL_DMA_LEVEL_0; + + /* Set Slave machine is receiving */ + hspi->RxState = SPI_RX_STATE_RECEIVING; + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Receive Start */ + __HAL_SPI_TRANSSTART_CS_LOW(hspi); + } + + HAL_DMA_Start(hspi->HDMA_Rx, (uint32_t)&hspi->Instance->DAT, (uint32_t)pData, Size); + + hspi->Instance->RX_CTL |= SPI_RX_CTL_DMA_REQ_EN; + + return HAL_OK; +} + +HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size) +{ + assert_param(hspi); + + hspi->KeepCS = false; + + return _HAL_SPI_Receive_DMA(hspi, pData, Size); +} + +HAL_StatusTypeDef HAL_SPI_Receive_DMA_KeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size) +{ + assert_param(hspi); + + if(hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + hspi->KeepCS = true; + } + + return _HAL_SPI_Receive_DMA(hspi, pData, Size); +} +#endif + +/****************************************************************************** +*@brief : Transmits and recieve an amount of data in loop mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pTxData : Pointer to transmit data buffer +*@param : pRxData : Pointer to recieve data buffer +*@param : Size : Amount of data to be sent and receive +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint32_t Size, uint32_t Timeout) +{ + uint32_t i; + __IO uint32_t uiTimeout; + uint32_t send_cnt = 0; + uint32_t recv_cnt = 0; + HAL_StatusTypeDef Status = HAL_OK; + SPI_TypeDef * SPIx = hspi->Instance; + + /* Check SPI Parameter */ + assert_param (IS_SPI_ALL_INSTANCE(SPIx)); + + if ((pTxData == NULL)||(pRxData == NULL)) return HAL_ERROR; + + hspi->Tx_Count = 0; + hspi->Rx_Count = 0; + hspi->Tx_Buffer = pTxData; + hspi->Rx_Buffer = pRxData; + hspi->Tx_Size = Size; + hspi->Rx_Size = Size; + uiTimeout = Timeout; + + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + /* Tx Enable */ + SPIx->TX_CTL |= SPI_TX_CTL_EN; + + /* Rx Enable */ + SPIx->RX_CTL |= SPI_RX_CTL_EN; + + /* Clear TX/RX FIFO */ + __SPI_TXFIFO_RESET(SPIx); + __SPI_RXFIFO_RESET(SPIx); + + while((!(SPIx->STATUS & SPI_STATUS_TX_FIFO_FULL)) && (Size > send_cnt)) + { + SPIx->DAT = pTxData[send_cnt++]; + } + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Set Data Size */ + SPIx->BATCH = Size; + + /* Transmit Start */ + __HAL_SPI_TRANSSTART_CS_LOW(hspi); + + while(1) + { + if(Size > send_cnt) + { + /* Wait Tx FIFO Not Full */ + if(!(SPIx->STATUS & SPI_STATUS_TX_FIFO_FULL)) + { + SPIx->DAT = pTxData[send_cnt++]; + uiTimeout = Timeout; + } + } + + /* Wait Rx FIFO Not Empty */ + if(!(SPIx->STATUS & SPI_STATUS_RX_FIFO_EMPTY)) + { + pRxData[recv_cnt++] = SPIx->DAT; + uiTimeout = Timeout; + } + + if(Size == recv_cnt) + break; + + /* Wait Timeout */ + if(uiTimeout) + { + uiTimeout--; + if(uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + + } + else + { + while(1) + { + /* Wait Rx FIFO Not Empty */ + if(Size > recv_cnt) + { + if((!(SPIx->STATUS & SPI_STATUS_RX_FIFO_EMPTY))) + { + pRxData[recv_cnt++] = SPIx->DAT; + uiTimeout = Timeout; + } + } + /* Wait Tx FIFO Not Full */ + if(Size > send_cnt) + { + if(!(SPIx->STATUS & SPI_STATUS_TX_FIFO_FULL)) + { + SPIx->DAT = pTxData[send_cnt++]; + uiTimeout = Timeout; + } + } + + if(Size == recv_cnt && Size == send_cnt) + break; + + /* Wait Timeout */ + if(uiTimeout) + { + uiTimeout--; + if(uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + } + + /* Wait Transmit Done */ + while (!(SPIx->STATUS & SPI_STATUS_TX_BATCH_DONE)); + + Status = HAL_OK; + +End: + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + /* Tx Disable */ + SPIx->TX_CTL &= (~SPI_TX_CTL_EN); + + /* Rx Disable */ + SPIx->RX_CTL &= (~SPI_RX_CTL_EN); + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Transmit End */ + __HAL_SPI_CS_RELEASE(hspi); + } + + hspi->Tx_Count = send_cnt; + hspi->Rx_Count = recv_cnt; + + return Status; +} + +/****************************************************************************** +*@brief : Get Tx state. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@return: SPI Tx State +******************************************************************************/ +uint8_t HAL_SPI_GetTxState(SPI_HandleTypeDef *hspi) +{ + return hspi->TxState; +} + +/****************************************************************************** +*@brief : Get Rx state. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@return: SPI Rx State +******************************************************************************/ +uint8_t HAL_SPI_GetRxState(SPI_HandleTypeDef *hspi) +{ + return hspi->RxState; +} + +////////////////////////////////////////////////////////////////////////////////// +static void HAL_SPI_CloseTx(SPI_HandleTypeDef* hspi) +{ + /* Tx Disable */ + hspi->Instance->TX_CTL &= (~SPI_TX_CTL_EN); + + /* Disable TxFIFO half empty interrupt */ + CLEAR_BIT(hspi->Instance->IE, SPI_IE_TX_FIFO_HALF_EMPTY_EN | SPI_IE_TX_BATCH_DONE_EN); + + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(hspi->Instance, SPI_STATUS_BATCH_DONE); + + __SPI_TXFIFO_RESET(hspi->Instance); + + /* Set machine is DILE */ + hspi->TxState = SPI_TX_STATE_IDLE; + + if(hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + __HAL_SPI_CS_RELEASE(hspi); + } +} + +static void HAL_SPI_CloseRx(SPI_HandleTypeDef* hspi) +{ + /* Rx Disable */ + hspi->Instance->RX_CTL &= (~SPI_RX_CTL_EN); + + /* Disable RxFIFO not empty interrupt */ + CLEAR_BIT(hspi->Instance->IE, SPI_IE_RX_FIFO_NOT_EMPTY_EN | SPI_IE_RX_BATCH_DONE_EN); + + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(hspi->Instance, SPI_STATUS_BATCH_DONE); + + __SPI_RXFIFO_RESET(hspi->Instance); + + /* Set machine is DILE */ + hspi->RxState = SPI_RX_STATE_IDLE; + + if(hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + __HAL_SPI_CS_RELEASE(hspi); + } +} + +HAL_StatusTypeDef HAL_SPI_WaitTxTimeout(SPI_HandleTypeDef *hspi, uint32_t timeout) +{ + HAL_StatusTypeDef status = HAL_OK; + + while(hspi->TxState != SPI_TX_STATE_IDLE) + { + /* Wait Timeout */ + if(timeout) + { + timeout--; + if(timeout == 0) + { + status = HAL_TIMEOUT; + break; + } + } + } + + if(status == HAL_TIMEOUT) + { + HAL_SPI_CloseTx(hspi); + } + + return status; +} + +HAL_StatusTypeDef HAL_SPI_WaitRxTimeout(SPI_HandleTypeDef *hspi, uint32_t timeout) +{ + HAL_StatusTypeDef status = HAL_OK; + + while(hspi->RxState != SPI_RX_STATE_IDLE) + { + /* Wait Timeout */ + if(timeout) + { + timeout--; + if(timeout == 0) + { + status = HAL_TIMEOUT; + break; + } + } + } + + if(status == HAL_TIMEOUT) + { + HAL_SPI_CloseRx(hspi); + } + + return status; +} + +/*--------------------------------------------------------------------------------------*/ +/****************************************************************************** +*@brief : Transmits and recieve an amount of data in loop mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pTxData : Pointer to transmit data buffer +*@param : pRxData : Pointer to recieve data buffer +*@param : Size : Amount of data to be sent and receive +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_TransmitReceiveNoneBatch(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint32_t Size, uint32_t Timeout) +{ + uint32_t i; + __IO uint32_t uiTimeout; + uint32_t send_cnt = 0; + uint32_t recv_cnt = 0; + HAL_StatusTypeDef Status = HAL_OK; + SPI_TypeDef * SPIx = hspi->Instance; + + /* Check SPI Parameter */ + assert_param (IS_SPI_ALL_INSTANCE(SPIx)); + + if ((pTxData == NULL)||(pRxData == NULL)) return HAL_ERROR; + + hspi->Tx_Count = 0; + hspi->Rx_Count = 0; + hspi->Tx_Buffer = pTxData; + hspi->Rx_Buffer = pRxData; + hspi->Tx_Size = Size; + hspi->Rx_Size = Size; + uiTimeout = Timeout; + + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + /* Tx Enable */ + SPIx->TX_CTL |= SPI_TX_CTL_EN; + + /* Rx Enable */ + SPIx->RX_CTL |= SPI_RX_CTL_EN; + + /* Clear TX/RX FIFO */ + __SPI_TXFIFO_RESET(SPIx); + __SPI_RXFIFO_RESET(SPIx); + + while((!(SPIx->STATUS & SPI_STATUS_TX_FIFO_FULL)) && (Size > send_cnt)) + { + SPIx->DAT = pTxData[send_cnt++]; + } + + /* Set Data Size */ + SPIx->BATCH = 0; + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Transmit Start */ + __HAL_SPI_TRANSSTART_CS_LOW(hspi); + + while(1) + { + if(Size > send_cnt) + { + /* Wait Tx FIFO Not Full */ + if(!(SPIx->STATUS & SPI_STATUS_TX_FIFO_FULL)) + { + SPIx->DAT = pTxData[send_cnt++]; + uiTimeout = Timeout; + } + } + + /* Wait Rx FIFO Not Empty */ + if(!(SPIx->STATUS & SPI_STATUS_RX_FIFO_EMPTY)) + { + pRxData[recv_cnt++] = SPIx->DAT; + uiTimeout = Timeout; + } + + if(Size == recv_cnt) + break; + + /* Wait Timeout */ + if(uiTimeout) + { + uiTimeout--; + if(uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + + } + else + { + while(1) + { + /* Wait Rx FIFO Not Empty */ + if(Size > recv_cnt) + { + if((!(SPIx->STATUS & SPI_STATUS_RX_FIFO_EMPTY))) + { + pRxData[recv_cnt++] = SPIx->DAT; + uiTimeout = Timeout; + } + } + /* Wait Tx FIFO Not Full */ + if(Size > send_cnt) + { + if(!(SPIx->STATUS & SPI_STATUS_TX_FIFO_FULL)) + { + SPIx->DAT = pTxData[send_cnt++]; + uiTimeout = Timeout; + } + } + + if(Size == recv_cnt && Size == send_cnt) + break; + + /* Wait Timeout */ + if(uiTimeout) + { + uiTimeout--; + if(uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + } + +End: +// /* Clear Batch Done Flag */ +// __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + + /* Rx Disable */ + SPIx->RX_CTL &= (~SPI_RX_CTL_EN); + + /* Tx Disable */ + SPIx->TX_CTL &= (~SPI_TX_CTL_EN); + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Transmit End */ + __HAL_SPI_CS_RELEASE(hspi); + } + + hspi->Tx_Count = send_cnt; + hspi->Rx_Count = recv_cnt; + + return Status; +} + +/****************************************************************************** +*@brief : Transmits an amount of data by loop mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to be sent +*@param : Timeout : Transmit Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +static HAL_StatusTypeDef _HAL_SPI_TransmitNoneBatch(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + uint32_t i; + uint32_t send_cnt = 0; + uint32_t recv_cnt = 0; + __IO uint32_t uiTimeout; + HAL_StatusTypeDef Status = HAL_OK; + SPI_TypeDef* SPIx = hspi->Instance; + + /* Check SPI Parameter */ + assert_param (IS_SPI_ALL_INSTANCE(SPIx)); + + if(!Size) return HAL_ERROR; + if (pData == NULL) return HAL_ERROR; + + hspi->Tx_Count = 0; + hspi->Tx_Size = Size; + hspi->Tx_Buffer = pData; + + uiTimeout = Timeout; + + /* Clear Batch Done Flag */ +// __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + /* Tx Enable */ + hspi->Instance->TX_CTL |= SPI_TX_CTL_EN; + /* Rx Disable */ + hspi->Instance->RX_CTL &= (~SPI_RX_CTL_EN); + + /* Clear TX FIFO */ + __SPI_TXFIFO_RESET(SPIx); + + SPIx->BATCH = 0; + + while((!(SPIx->STATUS & SPI_STATUS_TX_FIFO_FULL)) && (Size > send_cnt)) + { + SPIx->DAT = pData[send_cnt++]; + } + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Transmit Start */ + __HAL_SPI_TRANSSTART_CS_LOW(hspi); + } + + while(Size > send_cnt) + { + /* Wait Tx FIFO Not Full */ + if(!(SPIx->STATUS & SPI_STATUS_TX_FIFO_FULL)) + { + SPIx->DAT = pData[send_cnt++]; + uiTimeout = Timeout; + } + else + { + /* Wait Timeout */ + if(uiTimeout) + { + uiTimeout--; + if(uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + } + +End: + while(!(SPIx->STATUS & SPI_STATUS_TX_FIFO_EMPTY)); + while(READ_BIT(SPIx->STATUS, SPI_STATUS_TX_BUSY)); + + /* Tx Disable */ + CLEAR_BIT(hspi->Instance->TX_CTL, SPI_TX_CTL_EN); + + hspi->Tx_Count = send_cnt; + + return Status; +} + +HAL_StatusTypeDef HAL_SPI_TransmitNoneBatch(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status; + + Status = _HAL_SPI_TransmitNoneBatch(hspi, pData, Size, Timeout); + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Transmit End */ + __HAL_SPI_CS_RELEASE(hspi); + } + + return Status; +} + +HAL_StatusTypeDef HAL_SPI_TransmitNoneBatchKeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status; + + Status = _HAL_SPI_TransmitNoneBatch(hspi, pData, Size, Timeout); + + if ( (hspi->Init.SPI_Mode == SPI_MODE_MASTER) && (Status == HAL_TIMEOUT) ) + { + /* Transmit End */ + __HAL_SPI_CS_RELEASE(hspi); + } + + return Status; +} + +/****************************************************************************** +*@brief : Receive an amount of data by loop mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@param : Timeout : Receive Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +static HAL_StatusTypeDef _HAL_SPI_ReceiveNoneBatch(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + __IO uint32_t uiTimeout; + uint32_t i; + uint32_t recv_cnt = 0; + + SPI_TypeDef* SPIx = hspi->Instance; + + HAL_StatusTypeDef Status = HAL_OK; + + /* Check SPI Parameter */ + assert_param (IS_SPI_ALL_INSTANCE(SPIx)); + + if (pData == NULL) return HAL_ERROR; + + hspi->Rx_Count = 0; + hspi->Rx_Size = Size; + hspi->Rx_Buffer = pData; + uiTimeout = Timeout; + + /* Clear RX FIFO */ + __SPI_RXFIFO_RESET(SPIx); + + /* Clear Batch Done Flag */ + __SPI_CLEAR_FLAG(SPIx, SPI_STATUS_BATCH_DONE); + + SPIx->RX_CTL |= SPI_RX_CTL_EN; + SPIx->TX_CTL &= ~SPI_TX_CTL_EN; //tx_en = 0, why send 88? + + SPIx->BATCH = 0; + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Receive Start */ + __HAL_SPI_TRANSSTART_CS_LOW(hspi); + } + + while ( Size > recv_cnt ) + { + if (!READ_BIT(SPIx->STATUS, SPI_STATUS_RX_FIFO_EMPTY)) + { + pData[recv_cnt++] = SPIx->DAT; + uiTimeout = Timeout; + + } + else + { + if(uiTimeout) + { + uiTimeout--; + if (uiTimeout == 0) + { + Status = HAL_TIMEOUT; + goto End; + } + } + } + } + +End: + /* Rx Disable */ + CLEAR_BIT(SPIx->RX_CTL, SPI_RX_CTL_EN); + + hspi->Rx_Count = recv_cnt; + + return Status; +} + +/****************************************************************************** +*@brief : Receive an amount of data by loop mode. +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@param : Timeout : Receive Timeout +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_ReceiveNoneBatch(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status; + +// Status = _HAL_SPI_ReceiveNoneBatch(hspi, pData, Size, Timeout); + if(((hspi->Instance->CTL & SPI_CTL_X_MODE_Msk) == SPI_1X_MODE) && (hspi->Instance->CTL & SPI_CTL_MST_MODE)) + Status = HAL_SPI_TransmitReceiveNoneBatch(hspi, pData, pData, Size, Timeout); + else + Status = _HAL_SPI_ReceiveNoneBatch(hspi, pData, Size, Timeout); + + if (hspi->Init.SPI_Mode == SPI_MODE_MASTER) + { + /* Receive End */ + __HAL_SPI_CS_RELEASE(hspi); + } + + return Status; +} + +/****************************************************************************** +*@brief : Receive an amount of data by loop mode witch CS contorl. +* This function is same as HAL_SPI_Receive except that it will +* control the CS state according to the param Init.KeepCS at the end of transmission +* +*@param : hspi: a pointer of SPI_HandleTypeDef structure which contains +* the configuration information for the specified SPI. +*@param : pData : Pointer to data buffer +*@param : Size : Amount of data to receive +*@param : Timeout : Receive Timeout +*@param : CSState : The CS control State at the end of current transmission. +* This param can be a value of: +* CS_RELEASE: Relase the CS Pin at the end of transmission(CS release to HIGH) +* CS_HOLD : Keep the CS Pin for next transmission(CS keep LOW) +*@return: HAL_StatusTypeDef +*@note : It will always release CS when transmission is timed out. +* This function can be compatible with HAL_SPI_Receive by always setting Init.KeepCS to false. +******************************************************************************/ +HAL_StatusTypeDef HAL_SPI_ReceiveNoneBatchKeepCS(SPI_HandleTypeDef *hspi, uint8_t *pData, uint32_t Size, uint32_t Timeout) +{ + HAL_StatusTypeDef Status; + + Status = _HAL_SPI_Receive(hspi, pData, Size, Timeout); + + if ( (hspi->Init.SPI_Mode == SPI_MODE_MASTER) && (Status == HAL_TIMEOUT) ) + { + /* Receive End */ + __HAL_SPI_CS_RELEASE(hspi); + } + + return Status; +} + +#endif //HAL_SPI_MODULE_ENABLED + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_timer.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_timer.c new file mode 100644 index 0000000000..1920480835 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_timer.c @@ -0,0 +1,2055 @@ +/*********************************************************************** + * Filename : hal_lpuart.c + * Description : lpuart driver source file + * Author(s) : xwl + * version : V1.0 + * Modify date : 2019-11-19 + ***********************************************************************/ +#include "hal.h" + +#ifdef HAL_TIMER_MODULE_ENABLED + +static void TIMER_ETR_SetConfig(TIM_TypeDef* TIMx, uint32_t TIM_ExtTRGPrescaler, + uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter); +static void TIMER_TI1FP1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); +static void TIMER_TI2FP2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); +static void TIMER_IC1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t filter); +static void TIMER_IC2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t filter); +static void TIMER_IC3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t filter); +static void TIMER_IC4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t filter); + +__weak void HAL_TIM_Update_Event_Callback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PeriodElapsedCallback could be implemented in the user file + */ +} + +__weak void HAL_TIM_Trig_Event_Callback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PeriodElapsedCallback could be implemented in the user file + */ +} + +__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_CaptureCallback could be implemented in the user file + */ +} + +/** + * @brief Output Compare callback in non-blocking mode + * @param htim TIM OC handle + * @retval None + */ +__weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file + */ +} + +/** + * @brief PWM Pulse finished callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file + */ +} + +void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) +{ + /* Capture compare 1 event */ + if( (htim->Instance->SR & (TIMER_SR_CC1IF|TIMER_SR_CC1OF) ) != RESET) + { + if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) != RESET) + { + __HAL_TIM_CLEAR_FLAG(htim, (TIMER_SR_CC1IF|TIMER_SR_CC1OF) ); + + htim->activeChannel = HAL_TIM_ACTIVE_CHANNEL_1; + + /* Input capture event */ + if( ((htim->Instance->CCMR1) & (BIT0|BIT1) ) != 0x00U) + { + HAL_TIM_IC_CaptureCallback(htim); + } + /* Output compare event */ + else + { + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); + } + htim->activeChannel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + + } + } + /* Capture compare 2 event */ + if( (htim->Instance->SR & (TIMER_SR_CC2IF|TIMER_SR_CC2OF) ) != RESET) + { + if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) != RESET) + { + __HAL_TIM_CLEAR_FLAG(htim, (TIMER_SR_CC2IF|TIMER_SR_CC2OF) ); + htim->activeChannel = HAL_TIM_ACTIVE_CHANNEL_2; + /* Input capture event */ + if((htim->Instance->CCMR1 & (BIT8|BIT9) ) != 0x00U) + { + HAL_TIM_IC_CaptureCallback(htim); + } + /* Output compare event */ + else + { + + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); + } + htim->activeChannel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* Capture compare 3 event */ + if( (htim->Instance->SR & (TIMER_SR_CC3IF|TIMER_SR_CC3OF) ) != RESET) + { + if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) != RESET) + { + __HAL_TIM_CLEAR_FLAG(htim, (TIMER_SR_CC3IF|TIMER_SR_CC3OF) ); + htim->activeChannel = HAL_TIM_ACTIVE_CHANNEL_3; + /* Input capture event */ + if((htim->Instance->CCMR2 & (BIT0|BIT1)) != 0x00U) + { + HAL_TIM_IC_CaptureCallback(htim); + } + /* Output compare event */ + else + { + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); + } + htim->activeChannel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + /* Capture compare 4 event */ + if( (htim->Instance->SR & (TIMER_SR_CC4IF|TIMER_SR_CC4OF) ) != RESET) + { + if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) != RESET) + { + __HAL_TIM_CLEAR_FLAG(htim, (TIMER_SR_CC4IF|TIMER_SR_CC4OF) ); + htim->activeChannel = HAL_TIM_ACTIVE_CHANNEL_4; + /* Input capture event */ + if((htim->Instance->CCMR2 & (BIT8|BIT9) ) != 0x00U) + { + HAL_TIM_IC_CaptureCallback(htim); + } + /* Output compare event */ + else + { + HAL_TIM_OC_DelayElapsedCallback(htim); + HAL_TIM_PWM_PulseFinishedCallback(htim); + } + htim->activeChannel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; + } + } + + + /* TIM Update event */ + if(__HAL_TIM_GET_FLAG(htim, TIMER_SR_UIF) != RESET) + { + if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) != RESET) + { + __HAL_TIM_CLEAR_FLAG(htim, TIMER_SR_UIF); + HAL_TIM_Update_Event_Callback(htim); + } + } + + + if(__HAL_TIM_GET_FLAG(htim, TIMER_SR_TIF) != RESET) + { + if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_TRIGGER) != RESET) + { + __HAL_TIM_CLEAR_FLAG(htim, TIMER_SR_TIF); + HAL_TIM_Trig_Event_Callback(htim); + } + } + +} + +/********************************************************************************* +* Function : HAL_TIMER_MSP_Init +* Description : MSP init, mainly about clock, nvic +* Input : timer handler +* Output : 0: success; else:error +* Author : xwl +**********************************************************************************/ +__weak uint32_t HAL_TIMER_MSP_Init(TIM_HandleTypeDef * htim) +{ + uint32_t Timer_Instance; + + + Timer_Instance = (uint32_t)(htim->Instance); + + switch(Timer_Instance) + { + case TIM1_BASE_ADDR: + + __HAL_RCC_TIM1_CLK_ENABLE(); + __HAL_RCC_TIM1_RESET(); + NVIC_ClearPendingIRQ(TIM1_BRK_UP_TRG_COM_IRQn); + NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn); + break; + + case TIM2_BASE_ADDR: + + __HAL_RCC_TIM2_CLK_ENABLE(); + __HAL_RCC_TIM2_RESET(); + NVIC_ClearPendingIRQ(TIM2_IRQn); + NVIC_EnableIRQ(TIM2_IRQn); + break; + + case TIM3_BASE_ADDR: + + __HAL_RCC_TIM3_CLK_ENABLE(); + __HAL_RCC_TIM3_RESET(); + NVIC_ClearPendingIRQ(TIM3_IRQn); + NVIC_EnableIRQ(TIM3_IRQn); + break; + + case TIM4_BASE_ADDR: + __HAL_RCC_TIM4_CLK_ENABLE(); + __HAL_RCC_TIM4_RESET(); + NVIC_ClearPendingIRQ(TIM4_IRQn); + NVIC_EnableIRQ(TIM4_IRQn); + break; + + case TIM5_BASE_ADDR: + __HAL_RCC_TIM5_CLK_ENABLE(); + __HAL_RCC_TIM5_RESET(); + NVIC_ClearPendingIRQ(TIM5_IRQn); + NVIC_EnableIRQ(TIM5_IRQn); + break; + + case TIM6_BASE_ADDR: + __HAL_RCC_TIM6_CLK_ENABLE(); + __HAL_RCC_TIM6_RESET(); + NVIC_ClearPendingIRQ(TIM6_IRQn); + NVIC_EnableIRQ(TIM6_IRQn); + break; + + case TIM7_BASE_ADDR: + __HAL_RCC_TIM7_CLK_ENABLE(); + __HAL_RCC_TIM7_RESET(); + NVIC_ClearPendingIRQ(TIM7_IRQn); + NVIC_EnableIRQ(TIM7_IRQn); + break; + + case TIM8_BASE_ADDR: + __HAL_RCC_TIM8_CLK_ENABLE(); + __HAL_RCC_TIM8_RESET(); + NVIC_ClearPendingIRQ(TIM8_BRK_UP_TRG_COM_IRQn); + NVIC_EnableIRQ(TIM8_BRK_UP_TRG_COM_IRQn); + break; + + case TIM9_BASE_ADDR: + __HAL_RCC_TIM9_CLK_ENABLE(); + __HAL_RCC_TIM9_RESET(); + NVIC_ClearPendingIRQ(TIM9_IRQn); + NVIC_EnableIRQ(TIM9_IRQn); + break; + + case TIM10_BASE_ADDR: + __HAL_RCC_TIM10_CLK_ENABLE(); + __HAL_RCC_TIM10_RESET(); + NVIC_ClearPendingIRQ(TIM10_IRQn); + NVIC_EnableIRQ(TIM10_IRQn); + break; + + case TIM11_BASE_ADDR: + __HAL_RCC_TIM11_CLK_ENABLE(); + __HAL_RCC_TIM11_RESET(); + NVIC_ClearPendingIRQ(TIM11_IRQn); + NVIC_EnableIRQ(TIM11_IRQn); + break; + + case TIM12_BASE_ADDR: + __HAL_RCC_TIM12_CLK_ENABLE(); + __HAL_RCC_TIM12_RESET(); + NVIC_ClearPendingIRQ(TIM12_IRQn); + NVIC_EnableIRQ(TIM12_IRQn); + break; + + case TIM13_BASE_ADDR: + __HAL_RCC_TIM13_CLK_ENABLE(); + __HAL_RCC_TIM13_RESET(); + NVIC_ClearPendingIRQ(TIM13_IRQn); + NVIC_EnableIRQ(TIM13_IRQn); + break; + + case TIM14_BASE_ADDR: + __HAL_RCC_TIM14_CLK_ENABLE(); + __HAL_RCC_TIM14_RESET(); + NVIC_ClearPendingIRQ(TIM14_IRQn); + NVIC_EnableIRQ(TIM14_IRQn); + break; + + case TIM15_BASE_ADDR: + __HAL_RCC_TIM15_CLK_ENABLE(); + __HAL_RCC_TIM15_RESET(); + NVIC_ClearPendingIRQ(TIM15_IRQn); + NVIC_EnableIRQ(TIM15_IRQn); + break; + + case TIM16_BASE_ADDR: + __HAL_RCC_TIM16_CLK_ENABLE(); + __HAL_RCC_TIM16_RESET(); + NVIC_ClearPendingIRQ(TIM16_IRQn); + NVIC_EnableIRQ(TIM16_IRQn); + break; + + case TIM17_BASE_ADDR: + __HAL_RCC_TIM17_CLK_ENABLE(); + __HAL_RCC_TIM17_RESET(); + NVIC_ClearPendingIRQ(TIM17_IRQn); + NVIC_EnableIRQ(TIM17_IRQn); + break; + + case TIM18_BASE_ADDR: + __HAL_RCC_TIM18_CLK_ENABLE(); + __HAL_RCC_TIM18_RESET(); + NVIC_ClearPendingIRQ(TIM18_IRQn); + NVIC_EnableIRQ(TIM18_IRQn); + break; + + case TIM19_BASE_ADDR: + __HAL_RCC_TIM19_CLK_ENABLE(); + __HAL_RCC_TIM19_RESET(); + NVIC_ClearPendingIRQ(TIM19_IRQn); + NVIC_EnableIRQ(TIM19_IRQn); + break; + + case TIM20_BASE_ADDR: + __HAL_RCC_TIM20_CLK_ENABLE(); + __HAL_RCC_TIM20_RESET(); + NVIC_ClearPendingIRQ(TIM20_BRK_UP_TRG_COM_IRQn); + NVIC_EnableIRQ(TIM20_BRK_UP_TRG_COM_IRQn); + break; + + case TIM21_BASE_ADDR: + __HAL_RCC_TIM21_CLK_ENABLE(); + __HAL_RCC_TIM21_RESET(); + NVIC_ClearPendingIRQ(TIM21_IRQn); + NVIC_EnableIRQ(TIM21_IRQn); + break; + + case TIM22_BASE_ADDR: + __HAL_RCC_TIM22_CLK_ENABLE(); + __HAL_RCC_TIM22_RESET(); + NVIC_ClearPendingIRQ(TIM22_IRQn); + NVIC_EnableIRQ(TIM22_IRQn); + break; + + case TIM23_BASE_ADDR: + __HAL_RCC_TIM23_CLK_ENABLE(); + __HAL_RCC_TIM23_RESET(); + NVIC_ClearPendingIRQ(TIM23_IRQn); + NVIC_EnableIRQ(TIM23_IRQn); + break; + + case TIM24_BASE_ADDR: + __HAL_RCC_TIM24_CLK_ENABLE(); + __HAL_RCC_TIM24_RESET(); + NVIC_ClearPendingIRQ(TIM24_IRQn); + NVIC_EnableIRQ(TIM24_IRQn); + break; + + case TIM25_BASE_ADDR: + __HAL_RCC_TIM25_CLK_ENABLE(); + __HAL_RCC_TIM25_RESET(); + NVIC_ClearPendingIRQ(TIM25_IRQn); + NVIC_EnableIRQ(TIM25_IRQn); + break; + + default: + return HAL_ERROR; + } + + return HAL_OK; +} + + +__weak uint32_t HAL_TIMER_Base_MspDeInit(TIM_HandleTypeDef * htim) +{ + uint32_t Timer_Instance; + + + Timer_Instance = (uint32_t)(htim->Instance); + + switch(Timer_Instance) + { + case TIM1_BASE_ADDR: + __HAL_RCC_TIM1_CLK_ENABLE(); + NVIC_ClearPendingIRQ(TIM1_BRK_UP_TRG_COM_IRQn); + NVIC_DisableIRQ(TIM1_BRK_UP_TRG_COM_IRQn); + break; + + case TIM2_BASE_ADDR: + __HAL_RCC_TIM2_CLK_ENABLE(); + NVIC_ClearPendingIRQ(TIM2_IRQn); + NVIC_DisableIRQ(TIM2_IRQn); + break; + + case TIM3_BASE_ADDR: + __HAL_RCC_TIM3_CLK_ENABLE(); + NVIC_ClearPendingIRQ(TIM3_IRQn); + NVIC_DisableIRQ(TIM3_IRQn); + break; + + case TIM4_BASE_ADDR: + __HAL_RCC_TIM4_CLK_ENABLE(); + NVIC_ClearPendingIRQ(TIM4_IRQn); + NVIC_DisableIRQ(TIM4_IRQn); + break; + + case TIM6_BASE_ADDR: + __HAL_RCC_TIM6_CLK_ENABLE(); + NVIC_ClearPendingIRQ(TIM6_IRQn); + NVIC_DisableIRQ(TIM6_IRQn); + break; + + case TIM7_BASE_ADDR: + __HAL_RCC_TIM7_CLK_ENABLE(); + NVIC_ClearPendingIRQ(TIM7_IRQn); + NVIC_DisableIRQ(TIM7_IRQn); + break; + + case TIM8_BASE_ADDR: +// System_Module_Disable(EN_TIM8); +// NVIC_ClearPendingIRQ(TIM8_BRK_UP_TRG_COM_IRQn); +// NVIC_DisableIRQ(TIM8_BRK_UP_TRG_COM_IRQn); + break; + + case TIM15_BASE_ADDR: + __HAL_RCC_TIM15_CLK_ENABLE(); + NVIC_ClearPendingIRQ(TIM15_IRQn); + NVIC_DisableIRQ(TIM15_IRQn); + break; + + case TIM16_BASE_ADDR: + __HAL_RCC_TIM16_CLK_ENABLE(); + NVIC_ClearPendingIRQ(TIM16_IRQn); + NVIC_DisableIRQ(TIM16_IRQn); + break; + + case TIM17_BASE_ADDR: + __HAL_RCC_TIM17_CLK_ENABLE(); + NVIC_ClearPendingIRQ(TIM17_IRQn); + NVIC_DisableIRQ(TIM17_IRQn); + break; + + default: + return HAL_ERROR; + } + + return HAL_OK; +} + + +/********************************************************************************* +* Function : HAL_TIMER_Slave_Mode_Config +* Description : configure timer in slave mode +* Input : + htim: timer handler + sSlaveConfig: slave mode parameter strcture + SlaveMode: TIM_SLAVE_MODE_DIS, TIM_SLAVE_MODE_ENC1... + InputTrigger: TIM_TS_ITR0, TIM_TS_ITR1... + TriggerPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING... + TriggerPrescaler: TIM_ETR_PRESCALER_1, TIM_ETR_PRESCALER_2... +* Output : 0: success; else:error +* Author : xwl +**********************************************************************************/ +uint32_t HAL_TIMER_Slave_Mode_Config(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig) +{ + /*reset SMS and TS bits*/ + htim->Instance->SMCR &= (~(BIT0|BIT1|BIT2|TIM_SMCR_TS_Msk)); + /*SET SMS bits*/ + htim->Instance->SMCR |= (sSlaveConfig->SlaveMode & (BIT0|BIT1|BIT2) ); + /*SET TS bits*/ + htim->Instance->SMCR |= (sSlaveConfig->InputTrigger); + + switch (sSlaveConfig->InputTrigger) + { + case TIM_TS_TI1FP1: + TIMER_TI1FP1_ConfigInputStage(htim->Instance, sSlaveConfig->TriggerPolarity, sSlaveConfig->TriggerFilter); + break; + + case TIM_TS_TI2FP2: + TIMER_TI2FP2_ConfigInputStage(htim->Instance, sSlaveConfig->TriggerPolarity, sSlaveConfig->TriggerFilter); + break; + + case TIM_TS_ETRF: + TIMER_ETR_SetConfig(htim->Instance, sSlaveConfig->TriggerPrescaler, sSlaveConfig->TriggerPolarity, sSlaveConfig->TriggerFilter); + break; + + case TIM_TS_TI1F_ED: + htim->Instance->CR2 |= BIT7; //ch1/2/3 xor to TI1 + break; + + case TIM_TS_ITR0: + case TIM_TS_ITR1: + case TIM_TS_ITR2: + case TIM_TS_ITR3: + case TIM_TS_ITR4: + case TIM_TS_ITR5: + case TIM_TS_ITR6: + case TIM_TS_ITR7: + case TIM_TS_ITR8: + case TIM_TS_ITR9: + case TIM_TS_ITR10: + // don't need do anything here + break; + + default: + return 1; + } + + return 0; +} + +/********************************************************************************* +* Function : HAL_TIMER_Master_Mode_Config +* Description : configure timer in master mode +* Input : + TIMx: timer instance + sMasterConfig: master mode parameter structure + MasterSlaveMode: TIM_TRGO_RESET, TIM_TRGO_ENABLE... + MasterOutputTrigger: TIM_MASTERSLAVEMODE_DISABLE, TIM_MASTERSLAVEMODE_ENABLE +* Output : 0: success; else:error +* Author : xwl +**********************************************************************************/ +uint32_t HAL_TIMER_Master_Mode_Config(TIM_TypeDef *TIMx, TIM_MasterConfigTypeDef * sMasterConfig) +{ + /*reset bits*/ + TIMx->SMCR &= (~BIT7); + TIMx->CR2 &= (~(BIT4|BIT5|BIT6)); + + TIMx->SMCR |= sMasterConfig->MasterSlaveMode; + TIMx->CR2 |= sMasterConfig->MasterOutputTrigger; + + /* If the timer supports ADC synchronization through TRGO2, set the master mode selection 2 */ + if (IS_TIM_TRGO2_INSTANCE(TIMx)) + { + /* Clear the MMS2 bits */ + TIMx->CR2 &= (~(BIT20|BIT21|BIT22|BIT23)); + /* Select the TRGO2 source*/ + TIMx->CR2 |= (sMasterConfig->MasterOutputTrigger2 & (BIT20|BIT21|BIT22|BIT23) ) ; + } + + return 0; +} + +/********************************************************************************* +* Function : HAL_TIMER_Output_Config +* Description : configure output parameter +* Input : + TIMx: timer instance + Output_Config: output configration parameter structure + OCMode: OUTPUT_MODE_FROZEN, OUTPUT_MODE_MATCH_HIGH... + Pulse: write to ccrx register + OCPolarity: OC channel output polarity: OUTPUT_POL_ACTIVE_HIGH, OUTPUT_POL_ACTIVE_LOW + OCNPolarity: OCN channel output polarity: OUTPUT_POL_ACTIVE_HIGH, OUTPUT_POL_ACTIVE_LOW + OCFastMode: OUTPUT_FAST_MODE_DISABLE, OUTPUT_FAST_MODE_ENABLE + OCIdleState: OC channel idle state, OUTPUT_IDLE_STATE_0, OUTPUT_IDLE_STATE_1 + OCNIdleState: OCN channel idle state, OUTPUT_IDLE_STATE_0, OUTPUT_IDLE_STATE_1 + Channel: TIM_CHANNEL_1, TIM_CHANNEL_2... +* Output : 0: success; else:error +* Author : xwl +**********************************************************************************/ +uint32_t HAL_TIMER_Output_Config(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef * Output_Config, uint32_t Channel) +{ + + switch(Channel) + { + case TIM_CHANNEL_1: + TIMx->CCER &= (~BIT0); //disable OC1 + if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCPolarity) + { + TIMx->CCER &= (~BIT1); + } + else + { + TIMx->CCER |= (BIT1); + } + + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER &= (~BIT2); //disable OC1N + + if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCNPolarity) + { + TIMx->CCER &= (~BIT3); + } + else + { + TIMx->CCER |= (BIT3); + } + } + + TIMx->CCMR1 &= (~0x00FFU); // reset low 8 bits + TIMx->CCR1 = Output_Config->Pulse; + if (OUTPUT_FAST_MODE_ENABLE == Output_Config->OCFastMode) + { + TIMx->CCMR1 |= (BIT2); + } + TIMx->CCMR1 |= (BIT3); // preload enable + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + if (OUTPUT_IDLE_STATE_0 == Output_Config->OCIdleState) + { + TIMx->CR2 &= (~BIT8); + } + else + { + TIMx->CR2 |= BIT8; + } + + if (OUTPUT_IDLE_STATE_0 == Output_Config->OCNIdleState) + { + TIMx->CR2 &= (~BIT9); + } + else + { + TIMx->CR2 |= BIT9; + } + + } + TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT4|BIT5|BIT6))) | (Output_Config->OCMode << 4); + break; + + case TIM_CHANNEL_2: + TIMx->CCER &= (~BIT4); //disable OC2 + if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCPolarity) + { + TIMx->CCER &= (~BIT5); + } + else + { + TIMx->CCER |= (BIT5); + } + + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER &= (~BIT6); //disable OC2N + + if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCNPolarity) + { + TIMx->CCER &= (~BIT7); + } + else + { + TIMx->CCER |= (BIT7); + } + } + + TIMx->CCMR1 &= (~0xFF00U); // reset high 8 bits + TIMx->CCR2 = Output_Config->Pulse; // write value to ccr before preload enable + if (OUTPUT_FAST_MODE_ENABLE == Output_Config->OCFastMode) + { + TIMx->CCMR1 |= (BIT10); + } + TIMx->CCMR1 |= (BIT11); // preload enable + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + if (OUTPUT_IDLE_STATE_0 == Output_Config->OCIdleState) + { + TIMx->CR2 &= (~BIT10); + } + else + { + TIMx->CR2 |= BIT10; + } + + if (OUTPUT_IDLE_STATE_0 == Output_Config->OCNIdleState) + { + TIMx->CR2 &= (~BIT11); + } + else + { + TIMx->CR2 |= BIT11; + } + + } + TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT12|BIT13|BIT14))) | (Output_Config->OCMode << 12); + break; + + case TIM_CHANNEL_3: + TIMx->CCER &= (~BIT8); //disable OC3 + if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCPolarity) + { + TIMx->CCER &= (~BIT9); + } + else + { + TIMx->CCER |= (BIT9); + } + + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER &= (~BIT10); //disable OC3N + + if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCNPolarity) + { + TIMx->CCER &= (~BIT11); + } + else + { + TIMx->CCER |= (BIT11); + } + } + + TIMx->CCMR2 &= (~0x00FF); // reset low 8 bits + TIMx->CCMR2 |= (BIT3); // preload enable + if (OUTPUT_FAST_MODE_ENABLE == Output_Config->OCFastMode) + { + TIMx->CCMR2 |= (BIT2); + } + + TIMx->CCR3 = Output_Config->Pulse; + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + if (OUTPUT_IDLE_STATE_0 == Output_Config->OCIdleState) + { + TIMx->CR2 &= (~BIT12); + } + else + { + TIMx->CR2 |= BIT12; + } + + if (OUTPUT_IDLE_STATE_0 == Output_Config->OCNIdleState) + { + TIMx->CR2 &= (~BIT13); + } + else + { + TIMx->CR2 |= BIT13; + } + + } + TIMx->CCMR2 = (TIMx->CCMR2 & (~(BIT4|BIT5|BIT6))) | (Output_Config->OCMode << 4); + break; + + case TIM_CHANNEL_4: + TIMx->CCER &= (~BIT12); //disable OC4 + if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCPolarity) + { + TIMx->CCER &= (~BIT13); + } + else + { + TIMx->CCER |= (BIT13); + } + + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER &= (~BIT14); //disable OC4N + + if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCNPolarity) + { + TIMx->CCER &= (~BIT15); + } + else + { + TIMx->CCER |= (BIT15); + } + } + + TIMx->CCMR2 &= (~0xFF00); // reset high 8 bits + TIMx->CCR4 = Output_Config->Pulse; + if (OUTPUT_FAST_MODE_ENABLE == Output_Config->OCFastMode) + { + TIMx->CCMR2 |= (BIT10); // fast mode + } + TIMx->CCMR2 |= (BIT11); // preload enable + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + if (OUTPUT_IDLE_STATE_0 == Output_Config->OCIdleState) + { + TIMx->CR2 &= (~BIT14); + } + else + { + TIMx->CR2 |= BIT14; + } + + } + TIMx->CCMR2 = (TIMx->CCMR2 & (~(BIT12|BIT13|BIT14))) | (Output_Config->OCMode << 12); + break; + + case TIM_CHANNEL_5: + TIMx->CCER &= (~BIT16); //disable OC5 + if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCPolarity) + { + TIMx->CCER &= (~BIT17); + } + else + { + TIMx->CCER |= (BIT17); + } + + TIMx->CCMR3 &= (~0x00FF); // reset low 8 bits + TIMx->CCMR3 |= (BIT3); // preload enable + if (OUTPUT_FAST_MODE_ENABLE == Output_Config->OCFastMode) + { + TIMx->CCMR3 |= (BIT2); + } + + TIMx->CCR5 = Output_Config->Pulse; + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + if (OUTPUT_IDLE_STATE_0 == Output_Config->OCIdleState) + { + TIMx->CR2 &= (~BIT16); + } + else + { + TIMx->CR2 |= BIT16; + } + } + TIMx->CCMR3 = (TIMx->CCMR3 & (~(BIT4|BIT5|BIT6))) | (Output_Config->OCMode << 4); + break; + + case TIM_CHANNEL_6: + TIMx->CCER &= (~BIT20); //disable OC6 + if (OUTPUT_POL_ACTIVE_HIGH == Output_Config->OCPolarity) + { + TIMx->CCER &= (~BIT21); + } + else + { + TIMx->CCER |= (BIT21); + } + + TIMx->CCMR3 &= (~0xFF00); // reset high 8 bits + TIMx->CCR6 = Output_Config->Pulse; + if (OUTPUT_FAST_MODE_ENABLE == Output_Config->OCFastMode) + { + TIMx->CCMR3 |= (BIT10); // fast mode + } + TIMx->CCMR3 |= (BIT11); // preload enable + + if (IS_TIM_BREAK_INSTANCE(TIMx)) + { + if (OUTPUT_IDLE_STATE_0 == Output_Config->OCIdleState) + { + TIMx->CR2 &= (~BIT18); + } + else + { + TIMx->CR2 |= BIT18; + } + + } + TIMx->CCMR3 = (TIMx->CCMR3 & (~(BIT12|BIT13|BIT14))) | (Output_Config->OCMode << 12); + break; + + default: + return 1; // error parameter + } + + return 0; +} + + +/********************************************************************************* +* Function : HAL_TIMER_Capture_Config +* Description : configure capture parameters +* Input : + TIMx: timer instance + Capture_Config: capture configuration parameter strcture + ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING... + ICSelection: TIM_ICSELECTION_DIRECTTI, TIM_ICSELECTION_INDIRECTTI + ICFilter: TIM_IC1_FILTER_LVL(x), TIM_IC2_FILTER_LVL(x), x:0-15 + ICPrescaler: TIM_IC1_PRESCALER_1, TIM_IC2_PRESCALER_1... + Channel: channel id, TIM_CHANNEL_1, TIM_CHANNEL_2... +* Output : 0: success; else:error +* Author : xwl +**********************************************************************************/ +uint32_t HAL_TIMER_Capture_Config(TIM_TypeDef *TIMx, TIM_IC_InitTypeDef * Capture_Config, uint32_t Channel) +{ + switch(Channel) + { + case TIM_CHANNEL_1: + TIMER_IC1_SetConfig(TIMx, Capture_Config->ICPolarity, Capture_Config->ICSelection, Capture_Config->TIFilter); + + /* Reset the IC1PSC Bits */ + TIMx->CCMR1 &= (~BIT2|BIT3); + /* Set the IC1PSC value */ + TIMx->CCMR1 |= Capture_Config->ICPrescaler; + break; + + case TIM_CHANNEL_2: + TIMER_IC2_SetConfig(TIMx, Capture_Config->ICPolarity, Capture_Config->ICSelection, Capture_Config->TIFilter); + + + /* Reset the IC2PSC Bits */ + TIMx->CCMR1 &= (~BIT10|BIT11); + /* Set the IC2PSC value */ + TIMx->CCMR1 |= Capture_Config->ICPrescaler; + break; + + case TIM_CHANNEL_3: + TIMER_IC3_SetConfig(TIMx, Capture_Config->ICPolarity, Capture_Config->ICSelection, Capture_Config->TIFilter); + + /* Reset the IC3PSC Bits */ + TIMx->CCMR2 &= (~BIT2|BIT3); + /* Set the IC3PSC value */ + TIMx->CCMR2 |= Capture_Config->ICPrescaler; + + break; + + case TIM_CHANNEL_4: + TIMER_IC4_SetConfig(TIMx, Capture_Config->ICPolarity, Capture_Config->ICSelection, Capture_Config->TIFilter); + + /* Reset the IC4PSC Bits */ + TIMx->CCMR2 &= (~BIT10|BIT11); + /* Set the IC4PSC value */ + TIMx->CCMR2 |= Capture_Config->ICPrescaler; + break; + + default: + return 1; + } + + return 0; +} + + + +/********************************************************************************* +* Function : HAL_TIMER_SelectClockSource +* Description : select timer counter source, internal or external +* Input: + htim : timer handler + sClockSourceConfig: configuration parameters, includes following members: + ClockSource: TIM_CLOCKSOURCE_ITR0, TIM_CLOCKSOURCE_ETR... + ClockPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING... + ClockPrescaler: TIM_ETR_PRESCALER_1, TIM_ETR_PRESCALER_2... + ClockFilter: TIM_ETR_FILTER_LVL(x), TIM_IC1_FILTER_LVL(x), TIM_IC2_FILTER_LVL(x) +* Output : HAL_ERROR:error, HAL_OK:OK +* Author : xwl +**********************************************************************************/ +HAL_StatusTypeDef HAL_TIMER_SelectClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef * sClockSourceConfig) +{ + htim->Instance->SMCR &= (~(BIT0|BIT1|BIT2)); + + switch (sClockSourceConfig->ClockSource) + { +// case TIM_CLOCKSOURCE_INT: +// { +// // do nothing here +// break; +// } + case TIM_CLOCKSOURCE_ETR: + { + + /* Configure the ETR Clock source */ + TIMER_ETR_SetConfig(htim->Instance, + sClockSourceConfig->ClockPrescaler, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + /* Enable the External clock mode2 */ + htim->Instance->SMCR |= BIT14; // ECE=1,external clock mode 2 + break; + } + + case TIM_CLOCKSOURCE_TI1FP1: + { + + TIMER_TI1FP1_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + + MODIFY_REG(htim->Instance->SMCR, TIM_SMCR_TS_Msk, TIM_CLOCKSOURCE_TI1FP1); //Clock source select TI1FP1 + + htim->Instance->SMCR |= (BIT0|BIT1|BIT2); // select external clock mode 1 + break; + } + + case TIM_CLOCKSOURCE_TI2FP2: + { + TIMER_TI2FP2_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + + MODIFY_REG(htim->Instance->SMCR, TIM_SMCR_TS_Msk, TIM_CLOCKSOURCE_TI2FP2); //Clock source select TI2FP2 + + htim->Instance->SMCR |= (BIT0|BIT1|BIT2); // select external clock mode 1 + break; + } + case TIM_CLOCKSOURCE_TI1F_ED: + case TIM_CLOCKSOURCE_ITR0: + case TIM_CLOCKSOURCE_ITR1: + case TIM_CLOCKSOURCE_ITR2: + case TIM_CLOCKSOURCE_ITR3: + case TIM_CLOCKSOURCE_ITR4: + case TIM_CLOCKSOURCE_ITR5: + case TIM_CLOCKSOURCE_ITR6: + case TIM_CLOCKSOURCE_ITR7: + case TIM_CLOCKSOURCE_ITR8: + case TIM_CLOCKSOURCE_ITR9: + case TIM_CLOCKSOURCE_ITR10: + { + MODIFY_REG(htim->Instance->SMCR, TIM_SMCR_TS_Msk, sClockSourceConfig->ClockSource); //Clock source set + + htim->Instance->SMCR |= (BIT0|BIT1|BIT2); //select external clock mode 1 + break; + } + + default: + return HAL_ERROR; + } + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_TIMER_Base_Init +* Description : timer base initiation +* Input : timer handler +* Output : 0: success; else:error +* Author : xwl +**********************************************************************************/ +uint32_t HAL_TIMER_Base_Init(TIM_HandleTypeDef * htim) +{ + + htim->Instance->CR1 = BIT2; // CEN=0, URS=1, OPM = 0 + + //up/down/center mode + htim->Instance->CR1 = (htim->Instance->CR1 & (~(BIT4|BIT5|BIT6))) | ((htim->Init.CounterMode) & (BIT4|BIT5|BIT6)); + + if (htim->Init.ARRPreLoadEn) + { + htim->Instance->CR1 |= (BIT7); + } + else + { + htim->Instance->CR1 &= (~BIT7); + } + + htim->Instance->ARR = htim->Init.Period; + htim->Instance->PSC = htim->Init.Prescaler; + if (IS_TIM_REPETITION_COUNTER_INSTANCE(htim->Instance)) + { + htim->Instance->RCR = htim->Init.RepetitionCounter; + } + htim->Instance->EGR = BIT0; // no UIF generated because URS=1 + + + htim->Instance->CR1 = (htim->Instance->CR1 & (~(BIT8|BIT9))) | ((htim->Init.ClockDivision) & (BIT8|BIT9)); + + htim->Instance->CR1 &= (~BIT2); //URS = 0 + + return 0; +} + +/********************************************************************************* +* Function : HAL_TIMER_Base_DeInit +* Description : timer base deinitiation, disable Timer, turn off module clock and nvic +* Input : timer handler +* Output : HAL_OK: success; HAL_ERROR:error +* Author : xwl +**********************************************************************************/ +HAL_StatusTypeDef HAL_TIMER_Base_DeInit(TIM_HandleTypeDef *htim) +{ + htim->Instance->CR1 &= (~BIT0); + + HAL_TIMER_Base_MspDeInit(htim); + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_TIMER_Base_Start +* Description : start timer +* Input : timer instance +* Output : none +* Author : xwl +**********************************************************************************/ +void HAL_TIMER_Base_Start(TIM_TypeDef *TIMx) +{ + if (0 == IS_TIM_SLAVE_INSTANCE(TIMx) ) + { + TIMx->CR1 |= BIT0; + return; + } + + if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) ) + { + TIMx->CR1 |= BIT0; + return; + } + + return; +} +#ifdef HAL_DMA_MODULE_ENABLED +/********************************************************************************* +* Function : HAL_TIMER_Base_Start_DMA +* Description : start timer, +* Input : timer instance +* Output : HAL status +* Author : xwl +**********************************************************************************/ +HAL_StatusTypeDef HAL_TIMER_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t start_addr, uint32_t transfer_size) +{ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_UPDATE_INDEX], start_addr, (uint32_t)(&(htim->Instance->ARR)), transfer_size)) + { + return HAL_ERROR; + } + + if (0 == IS_TIM_SLAVE_INSTANCE(htim->Instance) ) + { + htim->Instance->CR1 |= BIT0; + return HAL_OK; + } + + if (TIM_SLAVE_MODE_TRIG != (htim->Instance->SMCR & (BIT0|BIT1|BIT2) ) ) + { + htim->Instance->CR1 |= BIT0; + return HAL_OK; + } + + return HAL_OK; +} +#endif +/********************************************************************************* +* Function : HAL_TIMER_Base_Stop +* Description : stop timer +* Input : timer handler +* Output : none +* Author : xwl +**********************************************************************************/ +HAL_StatusTypeDef HAL_TIMER_Base_Stop(TIM_TypeDef *TIMx) +{ + TIMx->CR1 &= (~BIT0); + HAL_TIM_DISABLE_IT_EX(TIMx, TIM_IT_UPDATE); + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_TIMER_OnePulse_Init +* Description : start timer with one pulse mode +* Input : + htim: timer handler + mode: 0 means normal mode, 1 means one pulse mode +* Output : HAL_OK, success; HAL_ERROR, fail +* Author : xwl +**********************************************************************************/ +HAL_StatusTypeDef HAL_TIMER_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t mode) +{ + /* Check the TIM handle allocation */ + if(htim == NULL) + { + return HAL_ERROR; + } + + HAL_TIMER_Base_Init(htim); + + /*reset the OPM Bit */ + htim->Instance->CR1 &= (~BIT3); + if (0 != mode) + { + /*set the OPM Bit */ + htim->Instance->CR1 |= BIT3; + } + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_TIM_PWM_Output_Start +* Description : start timer output +* Input : + TIMx: timer instance + Channel: TIM_CHANNEL_1, TIM_CHANNEL_2... +* Output : : 0: success; else:error +* Author : xwl +**********************************************************************************/ +uint32_t HAL_TIM_PWM_Output_Start(TIM_TypeDef *TIMx, uint32_t Channel) +{ + + switch(Channel) + { + case TIM_CHANNEL_1: + TIMx->CCER |= BIT0; + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER |= BIT2; + } + break; + + case TIM_CHANNEL_2: + TIMx->CCER |= BIT4; + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER |= BIT6; + } + break; + + case TIM_CHANNEL_3: + TIMx->CCER |= BIT8; + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER |= BIT10; + } + break; + + case TIM_CHANNEL_4: + TIMx->CCER |= BIT12; + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER |= BIT14; + } + break; + + case TIM_CHANNEL_5: + TIMx->CCER |= BIT16; + break; + + case TIM_CHANNEL_6: + TIMx->CCER |= BIT20; + break; + + default: + return 1; + } + + if(IS_TIM_BREAK_INSTANCE(TIMx) != 0) + { + /* Enable the main output */ + TIMx->BDTR |= BIT15; + } + + if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) ) + { + TIMx->CR1 |= BIT0; + } + + return 0; +} +/********************************************************************************* +* Function : HAL_TIM_PWM_Output_Stop +* Description : stop timer pwm output +* Input : + TIMx: timer instance + Channel: TIM_CHANNEL_1, TIM_CHANNEL_2... +* Output : : 0: success; else:error +* Author : xwl +**********************************************************************************/ +HAL_StatusTypeDef HAL_TIM_PWM_Output_Stop(TIM_TypeDef *TIMx, uint32_t Channel) +{ + + switch(Channel) + { + case TIM_CHANNEL_1: + TIMx->CCER &= (~(BIT0 | BIT2)); + break; + + case TIM_CHANNEL_2: + TIMx->CCER &= (~(BIT4 | BIT6)); + break; + + case TIM_CHANNEL_3: + TIMx->CCER &= (~(BIT8 | BIT10)); + break; + + case TIM_CHANNEL_4: + TIMx->CCER &= (~(BIT12)); + break; + + case TIM_CHANNEL_5: + TIMx->CCER &= (~(BIT16)); + break; + + case TIM_CHANNEL_6: + TIMx->CCER &= (~(BIT20)); + break; + + default: + return HAL_ERROR; + } + + if(IS_TIM_BREAK_INSTANCE(TIMx) != 0) + { + /* Enable the main output */ + TIMx->BDTR &= (~BIT15); + } + + if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) ) + { + TIMx->CR1 &= (~BIT0); + } + + /* Return function status */ + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_TIMER_OC_Start +* Description : start timer output +* Input : + TIMx: timer instance + Channel: TIM_CHANNEL_1, TIM_CHANNEL_2... +* Output : : 0: success; else:error +* Author : xwl +**********************************************************************************/ +uint32_t HAL_TIMER_OC_Start(TIM_TypeDef *TIMx, uint32_t Channel) +{ + + switch(Channel) + { + case TIM_CHANNEL_1: + TIMx->CCER |= BIT0; + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER |= BIT2; + } + break; + + case TIM_CHANNEL_2: + TIMx->CCER |= BIT4; + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER |= BIT6; + } + break; + + case TIM_CHANNEL_3: + TIMx->CCER |= BIT8; + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER |= BIT10; + } + break; + + case TIM_CHANNEL_4: + TIMx->CCER |= BIT12; + break; + + case TIM_CHANNEL_5: + TIMx->CCER |= BIT16; + break; + + case TIM_CHANNEL_6: + TIMx->CCER |= BIT20; + break; + + default: + return 1; + } + + if(IS_TIM_BREAK_INSTANCE(TIMx) != 0) + { + /* Enable the main output */ + TIMx->BDTR |= BIT15; + } + + if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) ) + { + TIMx->CR1 |= BIT0; + } + + return 0; +} + +/********************************************************************************* +* Function : HAL_TIMER_OCxN_Start +* Description : start timer OCxN output +* Input : + TIMx: timer instance + Channel: TIM_CHANNEL_1, TIM_CHANNEL_2... +* Output : : 0: success; else:error +* Author : xwl +**********************************************************************************/ +uint32_t HAL_TIMER_OCxN_Start(TIM_TypeDef *TIMx, uint32_t Channel) +{ + + switch(Channel) + { + case TIM_CHANNEL_1: + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER |= BIT2; + } + break; + + case TIM_CHANNEL_2: + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER |= BIT6; + } + break; + + case TIM_CHANNEL_3: + if (IS_TIM_CCXN_INSTANCE(TIMx, Channel) ) + { + TIMx->CCER |= BIT10; + } + break; + + case TIM_CHANNEL_4: + TIMx->CCER |= BIT12; + break; + + default: + return 1; + } + + if(IS_TIM_BREAK_INSTANCE(TIMx) != 0) + { + /* Enable the main output */ + TIMx->BDTR |= BIT15; + } + + if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) ) + { + TIMx->CR1 |= BIT0; + } + + return 0; +} + +/********************************************************************************* +* Function : HAL_TIMER_OC_Stop +* Description : stop timer output +* Input : + TIMx: timer instance + Channel: TIM_CHANNEL_1, TIM_CHANNEL_2... +* Output : : 0: success; else:error +* Author : xwl +**********************************************************************************/ +HAL_StatusTypeDef HAL_TIMER_OC_Stop(TIM_TypeDef *TIMx, uint32_t Channel) +{ + + switch(Channel) + { + case TIM_CHANNEL_1: + TIMx->CCER &= (~(BIT0 | BIT2)); + break; + + case TIM_CHANNEL_2: + TIMx->CCER &= (~(BIT4 | BIT6)); + break; + + case TIM_CHANNEL_3: + TIMx->CCER &= (~(BIT8 | BIT10)); + break; + + case TIM_CHANNEL_4: + TIMx->CCER &= (~(BIT12)); + break; + + case TIM_CHANNEL_5: + TIMx->CCER &= (~(BIT16)); + break; + + case TIM_CHANNEL_6: + TIMx->CCER &= (~(BIT20)); + break; + + default: + return HAL_ERROR; + } + + if(IS_TIM_BREAK_INSTANCE(TIMx) != 0) + { + /* Enable the main output */ + TIMx->BDTR &= (~BIT15); + } + + if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) ) + { + TIMx->CR1 &= (~BIT0); + } + + /* Return function status */ + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_TIM_Capture_Start +* Description : start timer capture +* Input : + TIMx: timer instance + Channel: TIM_CHANNEL_1, TIM_CHANNEL_2... +* Output : : 0: success; else:error +* Author : xwl +**********************************************************************************/ +uint32_t HAL_TIM_Capture_Start(TIM_TypeDef *TIMx, uint32_t Channel) +{ + + switch(Channel) + { + case TIM_CHANNEL_1: + TIMx->CCER |= BIT0; + break; + + case TIM_CHANNEL_2: + TIMx->CCER |= BIT4; + break; + + case TIM_CHANNEL_3: + TIMx->CCER |= BIT8; + break; + + case TIM_CHANNEL_4: + TIMx->CCER |= BIT12; + break; + + default: + return 1; + } + + if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) ) + { + TIMx->CR1 |= BIT0; + } + + return 0; +} + + +/********************************************************************************* +* Function : HAL_TIM_Capture_Stop +* Description : stop timer capture +* Input : + TIMx: timer instance + Channel: TIM_CHANNEL_1, TIM_CHANNEL_2... +* Output : : 0: success; else:error +* Author : xwl +**********************************************************************************/ +uint32_t HAL_TIM_Capture_Stop(TIM_TypeDef *TIMx, uint32_t Channel) +{ + + switch(Channel) + { + case TIM_CHANNEL_1: + TIMx->CCER &= (~BIT0); + break; + + case TIM_CHANNEL_2: + TIMx->CCER &= (~BIT4); + break; + + case TIM_CHANNEL_3: + TIMx->CCER &= (~BIT8); + break; + + case TIM_CHANNEL_4: + TIMx->CCER &= (~BIT12); + break; + + default: + return 1; + } + + if (TIM_SLAVE_MODE_TRIG != (TIMx->SMCR & (BIT0|BIT1|BIT2) ) ) + { + TIMx->CR1 &= (~BIT0); + } + + return 0; +} + + +/********************************************************************************* +* Function : HAL_TIMEx_ETRSelection +* Description : select ETR signal, it can ben GPIO, COMP1_OUT, COMP2_OUT, ADC analog watchdog output +* Input : + htim: timer handler + ETRSelection: ETR_SELECT_GPIO, ETR_SELECT_IN1... +* Output : HAL_OK, Success; HAL_ERROR:Fail +* Author : xwl +**********************************************************************************/ +HAL_StatusTypeDef HAL_TIMEx_ETRSelection(TIM_HandleTypeDef *htim, uint32_t ETRSelection) +{ + HAL_StatusTypeDef status = HAL_OK; + + htim->Instance->AF1 &= (~ETR_SELECT_MASK); + htim->Instance->AF1 |= ETRSelection; + + return status; +} + +/********************************************************************************* +* Function : HAL_TIMER_ReadCapturedValue +* Description : read capture value as channel +* Input : + htim: timer handler + Channel: TIM_CHANNEL_1, TIM_CHANNEL_2... +* Output : capture value +* Author : xwl +**********************************************************************************/ +uint32_t HAL_TIMER_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t capture_data = 0U; + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Return the capture 1 value */ + capture_data = htim->Instance->CCR1; + break; + } + case TIM_CHANNEL_2: + { + /* Return the capture 2 value */ + capture_data = htim->Instance->CCR2; + break; + } + case TIM_CHANNEL_3: + { + /* Return the capture 3 value */ + capture_data = htim->Instance->CCR3; + break; + } + case TIM_CHANNEL_4: + { + /* Return the capture 4 value */ + capture_data = htim->Instance->CCR4; + break; + } + default: + break; + } + + return capture_data; +} + +/********************************************************************************* +* Function : HAL_TIMER_GenerateEvent +* Description : Generate event by software +* Input: + htim : timer handler + EventSource: TIM_EVENTSOURCE_UPDATE, TIM_EVENTSOURCE_CC1... +* Output : HAL_ERROR:error, HAL_OK:OK +* Author : xwl +**********************************************************************************/ +HAL_StatusTypeDef HAL_TIMER_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource) +{ + htim->Instance->EGR = EventSource; + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_TIMER_Clear_Capture_Flag +* Description : clear capture flag as channel id +* Input : + htim: timer handler + Channel: TIM_CHANNEL_1, TIM_CHANNEL_2... +* Output : capture value +* Author : xwl +**********************************************************************************/ +void HAL_TIMER_Clear_Capture_Flag(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + switch (Channel) + { + case TIM_CHANNEL_1: + { + htim->Instance->SR &= (~(BIT1|BIT9)); + break; + } + case TIM_CHANNEL_2: + { + htim->Instance->SR &= (~(BIT2|BIT10)); + break; + } + case TIM_CHANNEL_3: + { + htim->Instance->SR &= (~(BIT3|BIT11)); + break; + } + case TIM_CHANNEL_4: + { + htim->Instance->SR &= (~(BIT4|BIT12)); + break; + } + default: + break; + } +} + +/********************************************************************************* +* Function : TIMER_ETR_SetConfig +* Description : configure ETR channel polarity, prescaler and filter +* Input: + TIMx : timer instance + TIM_ExtTRGPrescaler: TIM_ETR_PRESCALER_1, TIM_ETR_PRESCALER_2... + TIM_ExtTRGPolarity: TIM_ETR_POLAIRTY_HIGH, TIM_ETR_POLAIRTY_LOW + ExtTRGFilter: TIM_ETR_FILTER_LVL(x), x=0-15 +* Output : none +* Author : xwl +**********************************************************************************/ +static void TIMER_ETR_SetConfig(TIM_TypeDef* TIMx, uint32_t TIM_ExtTRGPrescaler, uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) +{ + /* Reset the ETR Bits */ + TIMx->SMCR &= (~0xFF00U); + + /* Set the Prescaler, the Filter value and the Polarity */ + TIMx->SMCR |= (TIM_ExtTRGPrescaler | TIM_ExtTRGPolarity | ExtTRGFilter); +} + +/********************************************************************************* +* Function : TIMER_TI1FP1_ConfigInputStage +* Description : configure TI1FP1 channel polarity and filter +* Input: + TIMx : timer instance + TIM_ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING... + Filter: TIM_TI1_FILTER_LVL(x), x=0-15 +* Output : none +* Author : xwl +**********************************************************************************/ +static void TIMER_TI1FP1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t Filter) +{ + TIMx->CCER &= (~BIT0); //Disable the Channel 1: Reset the CC1E Bit + TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT0|BIT1)) | BIT0); // CH1 as input + + TIMx->CCMR1 &= (~0xF0U); // reset TI1 filter + TIMx->CCMR1 |= Filter; + + if(TIM_SLAVE_CAPTURE_ACTIVE_RISING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC1_SLAVE_CAPTURE_POL_RISING; + } + else if (TIM_SLAVE_CAPTURE_ACTIVE_FALLING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC1_SLAVE_CAPTURE_POL_FALLING; + } + else + { + TIMx->CCER |= TIM_CC1_SLAVE_CAPTURE_POL_BOTH; + } +} + +/********************************************************************************* +* Function : TIMER_TI2FP2_ConfigInputStage +* Description : configure TI2FP2 channel polarity and filter +* Input: + TIMx : timer instance + TIM_ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING... + Filter: TIM_TI2_FILTER_LVL(x), x=0-15 +* Output : none +* Author : xwl +**********************************************************************************/ +static void TIMER_TI2FP2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t Filter) +{ + TIMx->CCER &= (~BIT4); //Disable the Channel 2: Reset the CC2E Bit + TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT8|BIT9)) | BIT8); // CH2 as input + + TIMx->CCMR1 &= (~0xF000U); // reset TI2 filter + TIMx->CCMR1 |= Filter; + + if(TIM_SLAVE_CAPTURE_ACTIVE_RISING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC2_SLAVE_CAPTURE_POL_RISING; + } + else if (TIM_SLAVE_CAPTURE_ACTIVE_FALLING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC2_SLAVE_CAPTURE_POL_FALLING; + } + else + { + TIMx->CCER |= TIM_CC2_SLAVE_CAPTURE_POL_BOTH; + } +} + +/********************************************************************************* +* Function : TIMER_IC1_SetConfig +* Description : configure TI1FP1 or TI2FP1 channel polarity and filter +* Input: + TIMx : timer instance + TIM_ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING... + Filter: TIM_TI1_FILTER_LVL(x), x=0-15 +* Output : none +* Author : xwl +**********************************************************************************/ +void TIMER_IC1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t Filter) +{ + /* Disable the Channel 1: Reset the CC1E Bit */ + TIMx->CCER &= (~BIT0); + + if(TIM_SLAVE_CAPTURE_ACTIVE_RISING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC1_SLAVE_CAPTURE_POL_RISING; + } + else if (TIM_SLAVE_CAPTURE_ACTIVE_FALLING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC1_SLAVE_CAPTURE_POL_FALLING; + } + else if (TIM_SLAVE_CAPTURE_ACTIVE_RISING_FALLING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC1_SLAVE_CAPTURE_POL_BOTH; + } + + if(TIM_ICSELECTION_DIRECTTI == TIM_ICSelection) + { + TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT0|BIT1))) | BIT0; + TIMx->CCMR1 &= (~0xF0U); + } + else + { + TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT0|BIT1))) | BIT1; + TIMx->CCMR1 &= (~0xF000U); + } + + TIMx->CCMR1 |= Filter; + +} + +/********************************************************************************* +* Function : TIMER_IC2_SetConfig +* Description : configure TI1FP2 or TI2FP2 channel polarity and filter +* Input: + TIMx : timer instance + TIM_ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING... + Filter: TIM_TI2_FILTER_LVL(x), x=0-15 +* Output : none +* Author : xwl +**********************************************************************************/ +static void TIMER_IC2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t Filter) +{ + /* Disable the Channel 2, Reset the CC2E Bit */ + TIMx->CCER &= (~BIT4); + if(TIM_SLAVE_CAPTURE_ACTIVE_RISING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC2_SLAVE_CAPTURE_POL_RISING; + } + else if (TIM_SLAVE_CAPTURE_ACTIVE_FALLING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC2_SLAVE_CAPTURE_POL_FALLING; + } + else if (TIM_SLAVE_CAPTURE_ACTIVE_RISING_FALLING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC2_SLAVE_CAPTURE_POL_BOTH; + } + + if(TIM_ICSELECTION_DIRECTTI == TIM_ICSelection) + { + TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT8|BIT9))) | BIT8; + TIMx->CCMR1 &= (~0xF000U); + } + else + { + TIMx->CCMR1 = (TIMx->CCMR1 & (~(BIT8|BIT9))) | BIT9; + TIMx->CCMR1 &= (~0xF0U); + } + + TIMx->CCMR1 |= Filter; + +} + +/********************************************************************************* +* Function : TIMER_IC3_SetConfig +* Description : configure TI3FP3 or TI4FP3 channel polarity and filter +* Input: + TIMx : timer instance + TIM_ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING... + Filter: TIM_TI3_FILTER_LVL(x), x=0-15 +* Output : none +* Author : xwl +**********************************************************************************/ +static void TIMER_IC3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t Filter) +{ + /* Disable the Channel 3, Reset the CC3E Bit */ + TIMx->CCER &= (~BIT8); + + if(TIM_SLAVE_CAPTURE_ACTIVE_RISING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC3_SLAVE_CAPTURE_POL_RISING; + } + else if (TIM_SLAVE_CAPTURE_ACTIVE_FALLING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC3_SLAVE_CAPTURE_POL_FALLING; + } + else if (TIM_SLAVE_CAPTURE_ACTIVE_RISING_FALLING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC3_SLAVE_CAPTURE_POL_BOTH; + } + + if(TIM_ICSELECTION_DIRECTTI == TIM_ICSelection) + { + TIMx->CCMR2 = (TIMx->CCMR2 & (~(BIT0|BIT1))) | BIT0; + TIMx->CCMR2 &= (~0xF0U); + } + else + { + TIMx->CCMR2 = (TIMx->CCMR2 & (~(BIT0|BIT1))) | BIT1; + TIMx->CCMR2 &= (~0xF000U); + } + + + TIMx->CCMR2 |= Filter; +} + + +/********************************************************************************* +* Function : TIMER_IC4_SetConfig +* Description : configure TI3FP4 or TI4FP4 channel polarity and filter +* Input: + TIMx : timer instance + TIM_ICPolarity: TIM_SLAVE_CAPTURE_ACTIVE_RISING, TIM_SLAVE_CAPTURE_ACTIVE_FALLING... + Filter: TIM_TI4_FILTER_LVL(x), x=0-15 +* Output : none +* Author : xwl +**********************************************************************************/ +static void TIMER_IC4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t Filter) +{ + /* Disable the Channel 3, Reset the CC3E Bit */ + TIMx->CCER &= (~BIT12); + + if(TIM_SLAVE_CAPTURE_ACTIVE_RISING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC4_SLAVE_CAPTURE_POL_RISING; + } + else if (TIM_SLAVE_CAPTURE_ACTIVE_FALLING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC4_SLAVE_CAPTURE_POL_FALLING; + } + else if (TIM_SLAVE_CAPTURE_ACTIVE_RISING_FALLING == TIM_ICPolarity) + { + TIMx->CCER |= TIM_CC4_SLAVE_CAPTURE_POL_BOTH; + } + + if(TIM_ICSELECTION_DIRECTTI == TIM_ICSelection) + { + TIMx->CCMR2 = (TIMx->CCMR2 & (~(BIT8|BIT9))) | BIT8; + TIMx->CCMR2 &= (~0xF000U); + } + else + { + TIMx->CCMR2 = (TIMx->CCMR2 & (~(BIT8|BIT9))) | BIT9; + TIMx->CCMR2 &= (~0xF0U); + } + + TIMx->CCMR2 |= Filter; + +} + + + + + + + + +/********************************************************************************* +* Function : HAL_TIMER_64_Base_Init +* Description : start 64 bit timer +* Input : timer instance +* Output : none +* Author : xwl +**********************************************************************************/ +void HAL_TIMER_64_Base_Init(TIM_64_HandleTypeDef *htim) +{ + + htim->Instance->CTRL = htim->Instance->CTRL & (~(0x7FU << 1)); + htim->Instance->CTRL |= ( (htim->Init.Cnt_Mode << 1) | (htim->Init.Prescaler << 2) ); + + htim->Instance->CTRL = (htim->Instance->CTRL & (~(1U << 9) ) ) | (htim->Init.ARR_Preload_En << 9); + + if (TIM_64_ARR_MODE == htim->Init.Cnt_Mode) + { + htim->Instance->ARR_LOW = htim->Init.Period_Low; + htim->Instance->ARR_HIGH = htim->Init.Period_High; + htim->Instance->CTRL |= BIT10; // Load ARR value + } + + htim->Instance->CNT_LOW = htim->Init.Count_Low; + htim->Instance->CNT_HIGH = htim->Init.Count_High; + + htim->Instance->CTRL |= BIT11; // Load Initial count value + + return; +} + +/********************************************************************************* +* Function : HAL_TIMER_64_Enable_Interrupt +* Description : enable 64 bit timer interrupt +* Input : timer instance +* Output : none +* Author : xwl +**********************************************************************************/ +void HAL_TIMER_64_Enable_Interrupt(TIM_64BIT_TypeDef *TIMx) +{ + TIMx->CTRL |= BIT8; + + return; +} + + +/********************************************************************************* +* Function : HAL_TIMER_64_Base_Start +* Description : start 64 bit timer +* Input : timer instance +* Output : none +* Author : xwl +**********************************************************************************/ +void HAL_TIMER_64_Base_Start(TIM_64BIT_TypeDef *TIMx) +{ + TIMx->CTRL |= BIT0; + + return; +} + + +/********************************************************************************* +* Function : HAL_TIMER_64_Base_Start +* Description : start 64 bit timer +* Input : timer instance +* Output : none +* Author : xwl +**********************************************************************************/ +long long HAL_TIMER_64_Base_Read_Count(TIM_64BIT_TypeDef *TIMx) +{ + volatile long long low, high, high_2; + + while(1) + { + high = TIMx->CNT_HIGH; + low = TIMx->CNT_LOW; + high_2 = TIMx->CNT_HIGH; + + if (high_2 == high) + { + break; + } + } + + + return (high << 32) + low; +} + +#endif + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_timer_ex.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_timer_ex.c new file mode 100644 index 0000000000..1db1deb733 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_timer_ex.c @@ -0,0 +1,282 @@ +/*********************************************************************** + * Filename : hal_timer_ex.c + * Description : TIMER driver source file + * Author(s) : xwl + * version : V1.0 + * Modify date : 2021-04-02 + ***********************************************************************/ +#include "hal.h" + +#ifdef HAL_TIMER_MODULE_ENABLED + +/********************************************************************************* +* Function : HAL_TIMER_ConfigBreakDeadTime +* Description : configure deadtime parameter +* Input : timer handler, break and deadtime configuration +* Output : none +* Author : xwl +**********************************************************************************/ +void HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, TIM_BreakDeadTimeConfigTypeDef * sBreakDeadTimeConfig) +{ + /* Keep this variable initialized to 0 as it is used to configure BDTR register */ + uint32_t break_deadtime_reg = 0U; + + /* Set the BDTR bits */ + MODIFY_REG(break_deadtime_reg, TIM_BDTR_DTG, sBreakDeadTimeConfig->DeadTime); + MODIFY_REG(break_deadtime_reg, TIM_BDTR_LOCK, sBreakDeadTimeConfig->LockLevel); + MODIFY_REG(break_deadtime_reg, TIM_BDTR_OSSI, sBreakDeadTimeConfig->OffStateIDLEMode); + MODIFY_REG(break_deadtime_reg, TIM_BDTR_OSSR, sBreakDeadTimeConfig->OffStateRunMode); + MODIFY_REG(break_deadtime_reg, TIM_BDTR_BKE, sBreakDeadTimeConfig->BreakState); + MODIFY_REG(break_deadtime_reg, TIM_BDTR_BKP, sBreakDeadTimeConfig->BreakPolarity); + MODIFY_REG(break_deadtime_reg, TIM_BDTR_AOE, sBreakDeadTimeConfig->AutomaticOutput); + MODIFY_REG(break_deadtime_reg, TIM_BDTR_BKF, (sBreakDeadTimeConfig->BreakFilter << TIM_BDTR_BKF_Pos)); + + /* Set TIMx_BDTR */ + htim->Instance->BDTR = break_deadtime_reg; + +} + +/********************************************************************************* +* Function : HAL_TIMEx_ConfigBreakInput +* Description : Configures the break input source. +* Input : + htim: timer handler + BreakInput: TIM_BREAKINPUT_BRK + sBreakInputConfig: Break input source configuration +* Output : +* Author : xwl +**********************************************************************************/ +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, TIMEx_BreakInputConfigTypeDef *sBreakInputConfig) +{ + uint32_t tmporx; + uint32_t bkin_enable_mask; + uint32_t bkin_polarity_mask; + uint32_t bkin_enable_bitpos; + uint32_t bkin_polarity_bitpos; + + switch(sBreakInputConfig->Source) + { + case TIM_BREAKINPUTSOURCE_BKIN: + { + bkin_enable_mask = TIM1_AF1_BKINE; + bkin_enable_bitpos = TIM1_AF1_BKINE_Pos; + bkin_polarity_mask = TIM1_AF1_BKINP; + bkin_polarity_bitpos = TIM1_AF1_BKINP_Pos; + break; + } + case TIM_BREAKINPUTSOURCE_COMP1: + { + bkin_enable_mask = TIM1_AF1_BKCMP1E; + bkin_enable_bitpos = TIM1_AF1_BKCMP1E_Pos; + bkin_polarity_mask = TIM1_AF1_BKCMP1P; + bkin_polarity_bitpos = TIM1_AF1_BKCMP1P_Pos; + break; + } + case TIM_BREAKINPUTSOURCE_COMP2: + { + bkin_enable_mask = TIM1_AF1_BKCMP2E; + bkin_enable_bitpos = TIM1_AF1_BKCMP2E_Pos; + bkin_polarity_mask = TIM1_AF1_BKCMP2P; + bkin_polarity_bitpos = TIM1_AF1_BKCMP2P_Pos; + break; + } + case TIM_BREAKINPUTSOURCE_COMP3: + { + bkin_enable_mask = TIM1_AF1_BKCMP3E; + bkin_enable_bitpos = TIM1_AF1_BKCMP3E_Pos; + bkin_polarity_mask = TIM1_AF1_BKCMP3P; + bkin_polarity_bitpos = TIM1_AF1_BKCMP3P_Pos; + break; + } + case TIM_BREAKINPUTSOURCE_COMP4: + { + bkin_enable_mask = TIM1_AF1_BKCMP4E; + bkin_enable_bitpos = TIM1_AF1_BKCMP4E_Pos; + bkin_polarity_mask = TIM1_AF1_BKCMP4P; + bkin_polarity_bitpos = TIM1_AF1_BKCMP4P_Pos; + break; + } + + default: + { + bkin_enable_mask = 0U; + bkin_enable_bitpos = 0U; + bkin_polarity_mask = 0U; + bkin_polarity_bitpos = 0U; + return HAL_ERROR; + } + } + + /* Get the TIMx_AF1 register value */ + tmporx = htim->Instance->AF1; + + /* Enable the break input */ + tmporx &= ~bkin_enable_mask; + tmporx |= (sBreakInputConfig->Enable << bkin_enable_bitpos) & bkin_enable_mask; + + /* Set the break input polarity */ + tmporx &= ~bkin_polarity_mask; + tmporx |= (sBreakInputConfig->Polarity << bkin_polarity_bitpos) & bkin_polarity_mask; + + /* Set TIMx_AF1 */ + htim->Instance->AF1 = tmporx; + + return HAL_OK; +} + + +/********************************************************************************* +* Function : HAL_TIMEx_ConfigCommutEvent +* Description : Configure the TIM commutation event sequence. This function is mandatory to use the commutation event + in order to update the configuration at each commutation detection on the TRGI input of the Timer. +* Input : + htim: timer handler + InputTrigger: TIM_TS_ITR0, TIM_TS_ITR1... + CommutationSource: TIM_COMMUTATION_TRGI, TIM_COMMUTATION_SOFTWARE +* Output : +* Author : xwl +**********************************************************************************/ +void HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +{ + + if ((InputTrigger == TIM_TS_ITR0) || \ + (InputTrigger == TIM_TS_ITR1) || \ + (InputTrigger == TIM_TS_ITR2) || \ + (InputTrigger == TIM_TS_ITR3) || \ + (InputTrigger == TIM_TS_ITR4) || \ + (InputTrigger == TIM_TS_ITR5) || \ + (InputTrigger == TIM_TS_ITR6) || \ + (InputTrigger == TIM_TS_ITR7) || \ + (InputTrigger == TIM_TS_ITR8) || \ + (InputTrigger == TIM_TS_ITR9) || \ + (InputTrigger == TIM_TS_ITR10)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= (~TIM_SMCR_TS_Msk); + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Disable Commutation Interrupt */ + HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); + + /* Disable Commutation DMA request */ + HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); + +} + +/********************************************************************************* +* Function : HAL_TIMEx_ConfigCommutEvent +* Description : Configure the TIM commutation event sequence. This function is mandatory to use the commutation event + in order to update the configuration at each commutation detection on the TRGI input of the Timer. +* Input : + htim: timer handler + Channel: specifies the TIM Channel + TISelection specifies the timer input source. + please refer the define. + For example for TIM1: +* For TIM1 this parameter can be one of the following values: +* TIM_TIM1_TI1_GPIO: TIM1 TI1 is connected to GPIO +* TIM_TIM1_TI1_COMP1: TIM1 TI1 is connected to COMP1 output +* TIM_TIM1_TI1_COMP2: TIM1 TI1 is connected to COMP2 output +* TIM_TIM1_TI1_COMP3: TIM1 TI1 is connected to COMP3 output +* TIM_TIM1_TI1_COMP4: TIM1 TI1 is connected to COMP4 output +* Output : HAL status +**********************************************************************************/ +HAL_StatusTypeDef HAL_TIMEx_TISelection(TIM_HandleTypeDef *htim, uint32_t TISelection, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + switch (Channel) + { + case TIM_CHANNEL_1: + MODIFY_REG(htim->Instance->TISEL, TIM_TISEL_TI1SEL, TISelection); + break; + case TIM_CHANNEL_2: + MODIFY_REG(htim->Instance->TISEL, TIM_TISEL_TI2SEL, TISelection); + break; + case TIM_CHANNEL_3: + MODIFY_REG(htim->Instance->TISEL, TIM_TISEL_TI3SEL, TISelection); + break; + case TIM_CHANNEL_4: + MODIFY_REG(htim->Instance->TISEL, TIM_TISEL_TI4SEL, TISelection); + break; + default: + status = HAL_ERROR; + break; + } + + return status; +} + +/********************************************************************************* +* Function : HAL_TIMEx_Encoder_MspInit +* Description : Initializes Encoder MSP. +* Input : + htim: timer handler +* Output : None +**********************************************************************************/ +__WEAK void HAL_TIMEx_Encoder_MspInit(TIM_HandleTypeDef *htim) +{ + +} + +/********************************************************************************* +* Function : HAL_TIMEx_Encoder_MspDeInit +* Description : DeInitializes Encoder MSP. +* Input : + htim: timer handler +* Output : None +**********************************************************************************/ +__WEAK void HAL_TIMEx_Encoder_MspDeInit(TIM_HandleTypeDef *htim) +{ + +} + +/********************************************************************************* +* Function : HAL_TIMEx_HallSensor_Init +* Description : Configure the TIM encoder mode. +* Input : + htim: timer handler + EncoderMode: TIM encoder mode, only can be: TIM_SLAVE_MODE_ENC1, TIM_SLAVE_MODE_ENC2, TIM_SLAVE_MODE_ENC3; +* Output : HAL status +**********************************************************************************/ +HAL_StatusTypeDef HAL_TIMEx_Encoder_Init(TIM_HandleTypeDef *htim, uint8_t EncoderMode) +{ + + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIMEx_Encoder_MspInit(htim); + + /* Configure the encoder mode */ + htim->Instance->SMCR = (htim->Instance->SMCR & ~(BIT0|BIT1|BIT2) | EncoderMode); + + return HAL_OK; +} + +/********************************************************************************* +* Function : HAL_TIMEx_Encoder_Enable +* Description : Enable the TIM encoder. +* Input : + htim: timer handler +* Output : HAL status +**********************************************************************************/ +HAL_StatusTypeDef HAL_TIMEx_Encoder_Enable(TIM_HandleTypeDef *htim) +{ + + /* Enable the TIM */ + htim->Instance->CR1 |= BIT0; + + return HAL_OK; +} + +uint32_t HAL_TIMEx_Encoder_GetValue(TIM_HandleTypeDef *htim) +{ + return ((uint32_t)htim->Instance->CNT); +} + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_tkey .c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_tkey .c new file mode 100644 index 0000000000..504988d04f --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_tkey .c @@ -0,0 +1,720 @@ +/****************************************************************************** +*@file : hal_tkey.c +*@brief : TKEY HAL module driver. +******************************************************************************/ +#include "hal.h" + + +#ifdef HAL_TKEY_MODULE_ENABLED + + +/****************************************************************************** +*@brief : TKEY interrupt handler +*@param : None. +*@return: None +******************************************************************************/ +__weak void HAL_TKEY_IRQHandler(void) +{ + /* + NOTE: This function should be modified, when the callback is needed + */ + + /* For Example */ + if(SET == HAL_TKEY_GetITStatus(TKEY_IT_FLAG_EOC)) //Scanning completed + { + HAL_TKEY_ClearITPendingBit(TKEY_IT_FLAG_EOC); + } + + if(SET == HAL_TKEY_GetITStatus(TKEY_IT_FLAG_YESTOUCH)) //Key touch event has occurred + { + HAL_TKEY_ClearITPendingBit(TKEY_IT_FLAG_YESTOUCH); + } + + if(SET == HAL_TKEY_GetITStatus(TKEY_IT_FLAG_TIMEOUT)) //Channel scan timeout + { + HAL_TKEY_ClearITPendingBit(TKEY_IT_FLAG_TIMEOUT); + } + + if(SET == HAL_TKEY_GetFlagStatus(TKEY_IT_FLAG_BUSY)) //Channel scan busy + { + TKEY->CR |= TKEY_CR_START; + } + + if(SET == HAL_TKEY_GetITStatus(TKEY_IT_FLAG_DONE)) //Comparator flipping completed + { + HAL_TKEY_ClearITPendingBit(TKEY_IT_FLAG_DONE); + } + + if(SET == HAL_TKEY_GetITStatus(TKEY_IT_FLAG_CHG)) //Each charge is completed + { + HAL_TKEY_ClearITPendingBit(TKEY_IT_FLAG_CHG); + } + + if(SET == HAL_TKEY_GetITStatus(TKEY_IT_FLAG_CHGDONE)) //Charging frequency reaches the set number of times + { + HAL_TKEY_ClearITPendingBit(TKEY_IT_FLAG_CHGDONE); + } + + if(SET == HAL_TKEY_GetITStatus(TKEY_IT_FLAG_MEOC)) //Mutual inductance mode channel scan completed + { + HAL_TKEY_ClearITPendingBit(TKEY_IT_FLAG_MEOC); + } + +} + + +/****************************************************************************** +*@brief : Initialize the TKEY MSP: GPIO, CLK, NVIC +*@param : htkey: a pointer of TKEY_HandleTypeDef structure which contains +* the configuration information for the specified TKEY. +*@return: None +******************************************************************************/ +__weak void HAL_TKEY_MspInit(TKEY_HandleTypeDef* htkey) +{ + /* + NOTE : This function is implemented in user xxx_hal_msp.c + */ + + /* Prevent unused argument(s) compilation warning */ + UNUSED(htkey); +} + +/****************************************************************************** +*@brief : TKEY De-Initialize the TKEY clock, GPIO, IRQ. +*@param : htkey: a pointer of TKEY_HandleTypeDef structure which contains +* the configuration information for the specified TKEY. +*@return: None +******************************************************************************/ +__weak void HAL_TKEY_MspDeInit(TKEY_HandleTypeDef* htkey) +{ + /* + NOTE : This function is implemented in user xxx_hal_msp.c + */ + + /* Prevent unused argument(s) compilation warning */ + UNUSED(htkey); +} + + +/****************************************************************************** +*@brief : Initialize the TKEY module with parameters +*@param : hospi: a pointer of TKEY_HandleTypeDef structure which contains +* the configuration information for the specified TKEY. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_TKEY_Init(TKEY_HandleTypeDef* htkey) +{ + uint32_t u32RegTemp; + + /* Check the TKEY handle allocation */ + if (htkey == NULL) + { + return HAL_ERROR; + } + + /* Check TKEY Parameter */ + assert_param(IS_TKEY_MODE(htkey->Init.Mode)); + assert_param(IS_TKEY_WORK_MODE(htkey->Init.WorkMode)); + assert_param(IS_TKEY_SCAN_MODE(htkey->Init.ScanMode)); + assert_param(IS_TKEY_SHIELD(htkey->Init.ShieldEn)); + assert_param(IS_TKEY_FILTER(htkey->Init.FilterNum)); + assert_param(IS_TKEY_VLDO(htkey->Init.Vldo)); + assert_param(IS_TKEY_VREF(htkey->Init.Vref)); + assert_param(IS_TKEY_SPREAD(htkey->Init.SpreadEn)); + assert_param(IS_TKEY_SMAPLE(htkey->Init.SampleNum)); + assert_param(IS_TKEY_CHANNEL_STATE(htkey->Init.ChannelEn)); + + assert_param(IS_TKEY_RADOM_JITTER(htkey->Timing.RandomJitterNum)); + assert_param(IS_TKEY_SCAN_INTERVAL(htkey->Timing.ScanInterval)); + assert_param(IS_TKEY_SCAN_CLK_PRESCALE(htkey->Timing.ScanClkPrescale)); + assert_param(IS_TKEY_SCAN_CLK_SW1HSW2L(htkey->Timing.ScanClkSW1HSW2L)); + assert_param(IS_TKEY_SCAN_CLK_SW1LSW2H(htkey->Timing.ScanClkSW1LSW2H)); + assert_param(IS_TKEY_SCAN_TIMEOUT_PWM_CYCLE(htkey->Timing.TimeoutOrPwmCycle)); + assert_param(IS_TKEY_CSDISCHARGETIME_CMPWAITTIME(htkey->Timing.DischargeTimeOrCMPWaitTime)); +// assert_param(IS_TKEY_SCAN_CLK_SOURCE(htkey->Timing.ScanClkSrc)); +// assert_param(IS_TKEY_CTRL_CLK_SOURCE(htkey->Timing.CtrlClkSrc)); + + /* Init the low level hardware : GPIO, CLOCK, NVIC, DMA */ + HAL_TKEY_MspInit(htkey); + + /* Check if the Tkey scan is busy */ + while(TKEY->SR & TKEY_SR_BUSY); + + /* disable the Tkey scan */ + TKEY->CR &= ~(TKEY_CR_START); + + /*---------------------------- TKEY CR Configuration -----------------*/ + u32RegTemp = ( htkey->Init.Mode | htkey->Init.WorkMode | htkey->Init.ScanMode | \ + htkey->Init.ShieldEn | htkey->Init.SpreadEn); + if(htkey->Init.SpreadEn == TKEY_SPREAD_ENABLE) + { + u32RegTemp |= htkey->Timing.RandomJitterNum; + } + TKEY->CR = u32RegTemp; + + /*---------------------------- TKEY CFGR1 Configuration -----------------*/ + TKEY->CFGR1 = ( htkey->Init.FilterNum | htkey->Init.SampleNum | htkey->Init.Vldo | htkey->Init.Vref); + + /*---------------------------- TKEY INTVLR Configuration -----------------*/ + TKEY->INTVLR = (htkey->Timing.ScanInterval); + + /*---------------------------- TKEY DIVR Scan CLK div Configuration -----------------*/ + TKEY->DIVR = (TKEY->DIVR & (~TKEY_DIVR_SCANCLKDIV_Msk)) | (htkey->Timing.ScanClkPrescale << TKEY_DIVR_SCANCLKDIV_Pos); + + /*---------------------------- TKEY SCCR Configuration -----------------*/ + TKEY->SCCR = ((htkey->Timing.ScanClkSW1HSW2L << TKEY_SCCR_SW1H_Pos) | htkey->Timing.ScanClkSW1LSW2H); + + /*---------------------------- TKEY TSETR Configuration -----------------*/ + u32RegTemp = ( htkey->Timing.TimeoutOrPwmCycle<< TKEY_TSETR_TSET_Pos) | (htkey->Timing.DischargeTimeOrCMPWaitTime <TSETR = u32RegTemp; + + /*---------------------------- TKEY CXENR Configuration -----------------*/ + TKEY->CXENR = (htkey->Init.ChannelEn); + + + /* Enable channel overall control */ + TKEY->CR |= TKEY_CR_CHEN; + + /* Enable TKEY module */ + TKEY->CR |= TKEY_CR_TKEN; + + /* TKEY's internal simulation module requires 10us to stabilize */ + HAL_SimpleDelay(10000);//ӳʱ + + return HAL_OK; +} + +/****************************************************************************** +*@brief : De-Initialize the OSPI peripheral +*@param : hospi: a pointer of OSPI_HandleTypeDef structure which contains +* the configuration information for the specified OSPI. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_TKEY_DeInit(TKEY_HandleTypeDef* htkey) +{ + /* Check the TKEY handle allocation */ + if (htkey == NULL) + { + return HAL_ERROR; + } + + htkey->Init.Mode = 0; + htkey->Init.WorkMode = 0; + htkey->Init.ScanMode = 0; + htkey->Init.ShieldEn = 0;; + htkey->Init.FilterNum = 0; + htkey->Init.Vldo = 0; + htkey->Init.Vref = 0; + htkey->Init.SpreadEn = 0; + htkey->Init.ChannelEn = 0; + + htkey->Timing.RandomJitterNum = 0; + htkey->Timing.ScanInterval = 0; + htkey->Timing.ScanClkPrescale = 0; + htkey->Timing.ScanClkSW1HSW2L = 0; + htkey->Timing.ScanClkSW1LSW2H = 0; + htkey->Timing.TimeoutOrPwmCycle = 0; + + /*Check if the Tkey scan is busy*/ + while(TKEY->SR & TKEY_SR_BUSY); + + /*disable the Tkey scan*/ + TKEY->CR &= ~(TKEY_CR_START); + + /*disable the Tkey moudle*/ + TKEY->CR &= ~TKEY_CR_TKEN; + + /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ + HAL_TKEY_MspDeInit(htkey); + + + return HAL_OK; +} + +/****************************************************************************** +*@brief : TKEY module enable or disable +*@param : NewState: Specify the new state of the TKEY module. +*@return: None +******************************************************************************/ +void HAL_TKEY_EnableDisable(uint32_t NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState == DISABLE) + { + TKEY->CR &= ~TKEY_CR_TKEN; + } + else + { + TKEY->CR |= TKEY_CR_TKEN; + HAL_SimpleDelay(10000);//ӳʱ + } +} + +/****************************************************************************** +*@brief : TKEY start to scan +*@param : None. +*@return: None +******************************************************************************/ +void HAL_TKEY_StartScan(void) +{ + /*Start the Tkey scan*/ + TKEY->CR |= TKEY_CR_START; + /* Waiting for START flag to turn to 0 */ + while(TKEY->CR & TKEY_CR_START); +} + + +/****************************************************************************** +*@brief : TKEY stop to scan +*@param : None. +*@return: None +******************************************************************************/ +void HAL_TKEY_StopScan(void) +{ + /* Waiting for BUSY flag to be 0 when stopping scanning */ + while(TKEY->SR & TKEY_SR_BUSY); + /*disable the Tkey scan*/ + TKEY->CR &= ~(TKEY_CR_START); +} + +/****************************************************************************** +*@brief : Read the count number of the all channels +*@param : pScanCount : Pointing to the channel scan count buffer. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_TKEY_ReadChannelCount(uint16_t *pScanCount) +{ + uint8_t temp; + uint32_t u32RegTemp; + + if(pScanCount == NULL) + { + return HAL_ERROR; + } + + u32RegTemp = TKEY->CXENR; + + if(u32RegTemp == 0) + { + return HAL_ERROR; + } + for(temp = 0; temp < 16; temp++) + { + if (u32RegTemp & 0x01) + { + *pScanCount++ = TKEY->CH[temp]; + } + u32RegTemp >>= 1; + if(u32RegTemp == 0) + { + break; + } + } + return HAL_OK; +} + +/****************************************************************************** +*@brief : Read the count number of the last channel +*@param : None. +*@return: The scan count result of the last channel or button touch event channel +******************************************************************************/ +uint16_t HAL_TKEY_ReadLastChannelCount(void) +{ + return TKEY->DR; +} + +/****************************************************************************** +*@brief : Get the scanning channel number in normal mode or +* the channel number for scanning timeout +* get the key touch channel number in automatic mode +*@param : None. +*@return: channel number +******************************************************************************/ +uint8_t HAL_TKEY_GetSacnTimeoutAutoChannelNumber(void) +{ + return ((TKEY->SR & TKEY_SR_CHNUM_Msk)>> TKEY_SR_CHNUM_Pos); +} + + +/****************************************************************************** +*@brief : Parameter configuration for automatic mode +*@param : pBaseline: Pointing to the channel baseline buffer +*@param : pThreshold: Pointing to the channel threshold buffer +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_TKEY_AutoConfig(TKEY_AutoConfigTypeDef *hauto) +{ + uint8_t temp; + uint32_t u32RegTemp; + + /* Check the parameters */ + assert_param(IS_TKEY_FILTER(hauto->FilterNum)); + + u32RegTemp = TKEY->CXENR; + + if(u32RegTemp == 0) + { + return HAL_ERROR; + } + for(temp = 0; temp < 16; temp++) + { + if (u32RegTemp & 0x01) + { + /* Set the baseline value for channel x */ + TKEY->CH[temp] = hauto->Baseline[temp]; + + /* Set the threshold value for channel x */ + TKEY->TH[temp] = hauto->Threshold[temp]; + } + u32RegTemp >>= 1; + if(u32RegTemp == 0) + { + break; + } + } + + /* Set hardware filtering times */ + TKEY->CFGR1 = (TKEY->CFGR1 & (~(TKEY_CFGR1_FLTSEL_Msk))) | hauto->FilterNum; + + /* Enable automatic mode */ + TKEY->CR |= TKEY_CR_AUTO; + + return HAL_OK; +} + + +/****************************************************************************** +*@brief : CSA mode parameter configuration +*@param : hcsa: a pointer of TKEY_CSAConfigTypeDef structure which contains +* the CSA mode configuration information for the specified TKEY. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_TKEY_CSAConfig(TKEY_CSAConfigTypeDef* hcsa) +{ + /* Check the parameters */ + assert_param(IS_TKEY_CHGNUMDONE(hcsa->ChargeNumDoneEn)); + assert_param(IS_TKEY_CHGEACHDONE(hcsa->ChargeEachDoneEN)); + assert_param(IS_TKEY_CSDISCHARGETIME_CMPWAITTIME(hcsa->DischargeTime)); + assert_param(IS_TKEY_COMPFILTERNUM(hcsa->ComparerFilterNum)); + assert_param(IS_TKEY_COMPFILTER(hcsa->ComparerFilterEN)); + assert_param(IS_TKEY_CHARGENUM(hcsa->ChargeNum)); + assert_param(IS_TKEY_CHARGEDONEWAITTIME(hcsa->ChargeDoneWaitTime)); + + /* Cs capacitor discharge time */ + TKEY->TSETR = (TKEY->TSETR & (~TKEY_TSETR_CST_Msk)) | hcsa->DischargeTime; + + /* Comparator filtering settings */ + if(hcsa->ComparerFilterEN == TKEY_COMPFILTER_ENABLE) + { + TKEY->CFLTR = (hcsa->ComparerFilterNum << TKEY_CFLTR_CFLTNUM_Pos | hcsa->ComparerFilterEN); + } + else + { + TKEY->CFLTR = hcsa->ComparerFilterEN; + } + + /* Charging numbers setting */ + TKEY->NSETR = hcsa->ChargeNum; + + /* Set the waiting time after reaching the set number of charges */ + TKEY->TWAITR = hcsa->ChargeDoneWaitTime; + + /* Enable charging times to reach the function, enable each charge to complete the function*/ + TKEY->CR = (TKEY->CR & (~(TKEY_CR_CHGDONEEN_Msk | TKEY_CR_CHGEN_Msk))) | hcsa->ChargeNumDoneEn | hcsa->ChargeEachDoneEN; + + return HAL_OK; +} + + +/****************************************************************************** +*@brief : CSD mode parameter configuration +*@param : hcsd: a pointer of TKEY_CSDConfigTypeDef structure which contains +* the CSD mode configuration information for the specified TKEY. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_TKEY_CSDConfig(TKEY_CSDConfigTypeDef* hcsd) +{ + /* Check the parameters */ + assert_param(IS_TKEY_DISMS(hcsd->DischargeMode)); + assert_param(IS_TKEY_PRECHARGE(hcsd->PrechargeEn)); + assert_param(IS_TKEY_DISCHARGECURRENT(hcsd->DischargeCurrent)); + assert_param(IS_TKEY_DISCHARGERES(hcsd->DischargeRes)); + assert_param(IS_TKEY_SAMPLEBITCLKDIV(hcsd->SampleBitClkDiv)); + + /* Set discharge current and resistance */ + TKEY->CFGR2 = (hcsd->DischargeCurrent << TKEY_CFGR2_IDISSEL_Pos) | (hcsd->DischargeRes); + + /* Set clock division for sampling bit streams */ + TKEY->DIVR = (TKEY->DIVR & (~TKEY_DIVR_SMPCLKDIV_Msk)) | hcsd->SampleBitClkDiv; + + /* Set discharge mode, enable precharge */ + TKEY->CR = (TKEY->CR & (~(TKEY_CR_DISMS_Msk | TKEY_CR_PCEN_Msk))) | (hcsd->DischargeMode) | (hcsd->PrechargeEn); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Mutual inductance mode parameter configuration +*@param : hmutual: a pointer of TKEY_MutualConfigTypeDef structure which contains +* the CSD Mutual inductance configuration information for the specified TKEY. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_TKEY_MutualConfig(TKEY_MutualConfigTypeDef* hmutual) +{ + /* Check the parameters */ + assert_param(IS_TKEY_MUTUAL_DELAY_TIME(hmutual->MutualDelayTime)); + assert_param(IS_TKEY_MUTUAL_DELAY_STATE(hmutual->MutualDelayEn)); + assert_param(IS_TKEY_MUTUAL_RESET(hmutual->MutualResetEn)); + assert_param(IS_TKEY_MUTUAL_CHANNEL_STATE(hmutual->MutualChannelEn)); + + /* Disable mutual inductance mode */ + TKEY->MUTUALR &= ~TKEY_MUTUALR_MUTUALEN; + + /* clear MTXDLY MTXDLYEN MTXRST bits */ + TKEY->MUTUALR &= ~(TKEY_MUTUALR_MTXDLY_Msk | TKEY_MUTUALR_MTXDLYEN_Msk | TKEY_MUTUALR_MTXRST_Msk); + + /* set MTXDLY MTXDLYEN MTXRST bits */ + TKEY->MUTUALR |= (hmutual->MutualDelayTime << TKEY_MUTUALR_MTXDLY_Pos) | (hmutual->MutualDelayEn) | (hmutual->MutualResetEn); + + /* Enable mutual inductance transmission channel */ + if(hmutual->MutualChannelEn > 0xffff) + { + TKEY->TXENR[0] = hmutual->MutualChannelEn & 0xffff; + TKEY->TXENR[1] = (hmutual->MutualChannelEn >> 16) & 0x3ff; + } + else + { + TKEY->TXENR[0] = hmutual->MutualChannelEn; + } + + /* Enable mutual inductance mode */ + TKEY->MUTUALR |= TKEY_MUTUALR_MUTUALEN; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : TKEY mutual inductance mode enable or disable +*@param : NewState: Specify the new state of the TKEY mutual inductance mode. +*@return: None +******************************************************************************/ +void HAL_TKEY_MutualEnableDisable(uint32_t NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState == DISABLE) + { + TKEY->MUTUALR &= ~TKEY_MUTUALR_MUTUALEN; + } + else + { + TKEY->MUTUALR |= TKEY_MUTUALR_MUTUALEN; + } +} + + +/****************************************************************************** +*@brief : TKEY automatic mode enable or disable +*@param : NewState: Specify the new state of the TKEY automatic mode. +*@return: None +******************************************************************************/ +void HAL_TKEY_AutoEnableDisable(uint32_t NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState == DISABLE) + { + TKEY->CR &= ~TKEY_CR_AUTO; + } + else + { + TKEY->CR |= TKEY_CR_AUTO; + } +} + +/****************************************************************************** +*@brief : Set resistance compensation +*@param : res: Compensated resistance. +*@return: None +******************************************************************************/ +void HAL_TKEY_ResCompensate(uint8_t res) +{ + /* Check the parameters */ + assert_param(IS_TKEY_RESCOMPENSTATE(res)); + TKEY->CFGR1 = (TKEY->CFGR1 & (~TKEY_CFGR1_RCPSEL_Msk)) | (res << TKEY_CFGR1_RCPSEL_Pos); +} + +/****************************************************************************** +*@brief : Set capacitance compensation +*@param : cap: Compensated capacitance. +*@return: None +******************************************************************************/ +void HAL_TKEY_CapCompensate(uint8_t cap) +{ + /* Check the parameters */ + assert_param(IS_TKEY_CAPCOMPENSTATE(cap)); + TKEY->CFGR1 = (TKEY->CFGR1 & (~TKEY_CFGR1_CCPSEL_Msk)) | (cap << TKEY_CFGR1_CCPSEL_Pos); +} + + +/****************************************************************************** +*@brief : Set the interval time between two sets of scans +*@param : time : the interval time. +*@return: None +******************************************************************************/ +void HAL_TKEY_ScanIntervalConfig(uint16_t time) +{ + /* Check TKEY Parameter */ + assert_param(IS_TKEY_SCAN_INTERVAL(time)); + /* TKEY INTVLR Configuration */ + TKEY->INTVLR = time; +} + + +/****************************************************************************** +*@brief : Read the interval time between two sets of scans +*@param : None. +*@return: the interval time +******************************************************************************/ +uint16_t HAL_TKEY_ReadScanInterval(void) +{ + return TKEY->INTVLR; +} + +/****************************************************************************** +*@brief : Enables or disables the specified TKEY interrupts. +*@param : irq: specifies the TKEY interrupt sources to be enabled or disabled. +*@param : NewState: new state of the specified TKEY interrupts. +* This parameter can be: ENABLE or DISABLE. +*@return: None. +******************************************************************************/ +void HAL_TKEY_ITConfig(uint32_t irq, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + assert_param(IS_TKEY_IT_FLAG(irq)); + + if (NewState != DISABLE) + { + /* Enable the selected TKEY interrupts */ + TKEY->IER |= irq; + } + else + { + /* Disable the selected TKEY interrupts */ + TKEY->IER &= (~irq); + } +} + +/****************************************************************************** +*@brief : Checks whether the specified TKEY flag is set or not. +*@param : flag: specifies the flag to check. +*@return: The new state of flag (SET or RESET). +******************************************************************************/ +FlagStatus HAL_TKEY_GetFlagStatus(uint32_t flag) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_TKEY_IT_FLAG(flag)); + + /* Check the status of the specified TKEY flag */ + if ((TKEY->SR & flag) != RESET) + { + /* flag is set */ + bitstatus = SET; + } + else + { + /* flag is reset */ + bitstatus = RESET; + } + /* Return the TKEY_FLAG status */ + return bitstatus; +} + +/****************************************************************************** +*@brief : Clears the TKEY's pending flags. +*@param : flag: specifies the flag to clear. +*@return: None +******************************************************************************/ +void HAL_TKEY_ClearFlag(uint32_t flag) +{ + /* Check the parameters */ + assert_param(IS_TKEY_IT_FLAG(flag)); + + /* Clear the selected TKEY flags */ + TKEY->SR = flag; +} + +/****************************************************************************** +*@brief : Checks whether the specified TKEY interrupt has occurred or not. +*@param : irq: specifies the TKEY interrupt source to check. +*@return: The new state of irq (SET or RESET). +******************************************************************************/ +ITStatus HAL_TKEY_GetITStatus(uint32_t irq) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + + /* Check the parameters */ + assert_param(IS_TKEY_IT_FLAG(irq)); + + /* Get the irq enable bit status */ + enablestatus = (TKEY->IER & irq) ; + + /* Check the status of the specified TKEY interrupt */ + if (((TKEY->SR & irq) != RESET) && enablestatus) + { + /* irq is set */ + bitstatus = SET; + } + else + { + /* irq is reset */ + bitstatus = RESET; + } + /* Return the irq status */ + return bitstatus; +} + +/****************************************************************************** +*@brief : Clears the TKEY's interrupt pending bits. +*@param : irq: specifies the TKEY interrupt pending bit to clear. +*@return: None +******************************************************************************/ +void HAL_TKEY_ClearITPendingBit(uint32_t irq) +{ + /* Check the parameters */ + assert_param(IS_TKEY_IT_FLAG(irq)); + + if((TKEY->IER & irq)!= RESET) + { + /* Clear the interrupt pending bits in the TKEY_SR register */ + TKEY->SR = irq; + } +} + + +/****************************************************************************** +*@brief : Get enabled TKEY interrupt. +*@param : None. +*@return: TKEY interrupt enabled. +******************************************************************************/ +uint16_t HAL_TKEY_GetIT(void) +{ + /* Return the irq */ + return TKEY->IER; +} + +#endif + + + + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_uart.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_uart.c new file mode 100644 index 0000000000..1c5fd57055 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_uart.c @@ -0,0 +1,1255 @@ +/****************************************************************************** +* @file : hal_uart.c +* @brief : UART HAL module driver. +* This file provides firmware functions to manage the following +* functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (UART). +* @ver : V1.0.0 +* @date : 2020 +******************************************************************************/ +#include "hal.h" + + +#ifdef HAL_UART_MODULE_ENABLED + +UART_TypeDef *g_DebugUart = NULL; //printf UARTx + +/* Private function prototypes -----------------------------------------------*/ +static void UART_Config_BaudRate(UART_HandleTypeDef *huart); +static HAL_StatusTypeDef HAL_UART_Wait_Tx_Done(UART_HandleTypeDef *huart); + +__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); +__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); +__weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart); +__weak void HAL_UART_IdleCallback(UART_HandleTypeDef *huart); +/****************************************************************************** +*@brief : Handle UART interrupt request +* +*@param : huart: uart handle with UART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) +{ + uint32_t isrflags; + uint32_t ieits; + uint32_t errorflags; + uint16_t *pbuf_16; + + assert_param(IS_UART_ALL_INSTANCE(huart->Instance)); + + isrflags = READ_REG(huart->Instance->ISR); + ieits = READ_REG(huart->Instance->IE); + + errorflags =(isrflags & (uint32_t)(UART_ISR_PEI | UART_ISR_OEI | UART_ISR_FEI | UART_ISR_BEI)); + + /* which isr actually occured */ + isrflags &= ieits; + + /* TXI */ + if (isrflags & UART_ISR_TXI) + { + /* Clear TXI Status */ + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_TXI); + + pbuf_16 = (uint16_t *)huart->TxData; + + for(;;) + { + if(huart->TxCount == huart->TxSize) + { + huart->TxBusy = false; + + /* Disable TX interrupt && error interrupt*/ + CLEAR_BIT(huart->Instance->IE, UART_IE_TXI | + UART_IE_OEI | UART_IE_BEI | UART_IE_PEI | UART_IE_FEI); + + HAL_UART_TxCpltCallback(huart); + return; + } + + if (READ_BIT(huart->Instance->FR, UART_FR_TXFF)) + { + break; + } + + if (huart->Init.WordLength == UART_WORDLENGTH_9B) + { + huart->Instance->DR = (uint16_t)(pbuf_16[huart->TxCount++] & 0x01FFU); + } + else + { + huart->Instance->DR = huart->TxData[huart->TxCount++]; + } + } + } + + /* RXI */ + if (isrflags & UART_ISR_RXI) + { + /* Clear RXI Status */ + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_RXI); + + pbuf_16 = (uint16_t *)huart->RxData; + + while(huart->RxCount < huart->RxSize ) + { + if(!READ_BIT(huart->Instance->FR, UART_FR_RXFE)) + { + /* Store Data in buffer */ + if (huart->Init.WordLength == UART_WORDLENGTH_9B) + { + pbuf_16[huart->RxCount++] = (uint16_t)(huart->Instance->DR & 0x1FFU); + } + else + { + huart->RxData[huart->RxCount++] = (uint8_t)huart->Instance->DR; + } + } + else + { + break; + } + } + + if(huart->RxCount == huart->RxSize ) + { + huart->RxBusy = false; + + /* Disable RX and RTI interrupt && error interrupt*/ + CLEAR_BIT(huart->Instance->IE, (UART_IE_RXI | UART_IE_IDLEI | + UART_IE_OEI | UART_IE_BEI | UART_IE_PEI | UART_IE_FEI)); + + HAL_UART_RxCpltCallback(huart); + } + } + /* IDLEI */ + else if(isrflags & UART_ISR_IDLEI) + { + /*clear IDLE Status */ + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_IDLEI); + + pbuf_16 = (uint16_t *)huart->RxData; + + while(!READ_BIT(huart->Instance->FR, UART_FR_RXFE)) + { + if (huart->Init.WordLength == UART_WORDLENGTH_9B) + { + pbuf_16[huart->RxCount++] = (uint16_t)(huart->Instance->DR & 0x1FFU); + } + else + { + huart->RxData[huart->RxCount++] = (uint8_t)huart->Instance->DR; + } + } + + huart->RxBusy = false; + + /* Disable RX and RTI interrupt && error interrupt*/ + CLEAR_BIT(huart->Instance->IE, (UART_IE_RXI | UART_IE_IDLEI | + UART_IE_OEI | UART_IE_BEI | UART_IE_PEI | UART_IE_FEI)); + + + + HAL_UART_IdleCallback(huart); + } + + if(isrflags & UART_ISR_TCI) + { + /*clear IDLE Status */ + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_TCI); + } + + /* if some errors occurred */ + if(errorflags != 0) + { + /* UART parity error interrupt occurred */ + if (((errorflags & UART_ISR_PEI) != 0)) + { + /* Clear parity error status */ + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_PEI); + huart->ErrorCode |= HAL_UART_ERROR_PE; + } + + /* UART break error interrupt occurred */ + if (((errorflags & UART_ISR_BEI) != 0)) + { + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_BEI); + huart->ErrorCode |= HAL_UART_ERROR_NE; + } + + /* UART frame error interrupt occurred */ + if (((errorflags & UART_ISR_FEI) != 0)) + { + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_FEI); + huart->ErrorCode |= HAL_UART_ERROR_FE; + } + + /* UART Over-Run interrupt occurred */ + if (((errorflags & UART_ISR_OEI) != 0)) + { + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_OEI); + huart->ErrorCode |= HAL_UART_ERROR_ORE; + } + + HAL_UART_ErrorCallback(huart); + } +} + + +/****************************************************************************** +*@brief : wait Tx FIFO empty +* +*@param : huart: uart handle with UART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +static HAL_StatusTypeDef HAL_UART_Wait_Tx_Done(UART_HandleTypeDef *huart) +{ + + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + /* wait TX not busy*/ + while(READ_BIT(huart->Instance->FR, UART_FR_BUSY)); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initialize the UART MSP: CLK, GPIO, NVIC +* +*@param : huart: uart handle with UART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart) +{ + /* + NOTE : This function is implemented in user xxx_hal_msp.c + */ + + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); +} + +/****************************************************************************** +*@brief : Initialize the UART DE Pin for RS485 +* +*@param : huart: uart handle with UART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_UART_RS485Msp_Init(UART_HandleTypeDef *huart) +{ + /* + NOTE : This function is implemented in user xxx_hal_msp.c + */ + + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); +} + +/****************************************************************************** +*@brief : Initialize the UART according to the specified parameters in huart. +* +*@param : huart: uart handle with UART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) +{ + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + assert_param (IS_UART_WORDLENGTH(huart->Init.WordLength)); + assert_param (IS_UART_STOPBITS(huart->Init.StopBits)); + assert_param (IS_UART_PARITY(huart->Init.Parity)); + assert_param (IS_UART_MODE(huart->Init.Mode)); + assert_param (IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl)); + + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_UART_MspInit(huart); + + /* Config BaudRate */ + UART_Config_BaudRate(huart); + + /* Set the UART Communication parameters */ + huart->Instance->CR3 = huart->Init.WordLength | UART_CR3_FEN | huart->Init.StopBits | huart->Init.Parity | (5<Instance->CR1 = huart->Init.HwFlowCtl | huart->Init.Mode; + + if (huart->Init.Mode == UART_MODE_HALF_DUPLEX) + { + SET_BIT(huart->Instance->CR2, UART_CR2_HDSEL); + } + + __HAL_UART_ENABLE(huart); + + huart->ErrorCode = HAL_UART_ERROR_NONE; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initialize the UART RS485 according to the specified parameters in huart. +* +*@param : huart: uart handle with UART parameters. +*@param : de_polarity: RS485 DE Pin polarity. see @UART_RS485_DE_POL_Enum +*@param : deat_time: the time between the DE Pin activated and data transmiting. +*@param : dedt_time: the time between the last transmiting of data and the DE Pin de-activated. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_RS485_Init(UART_HandleTypeDef *huart, UART_RS485_DE_POL_Enum de_polarity, uint8_t deat_time, uint8_t dedt_time) +{ + assert_param(IS_RS485_INSTANCE(huart->Instance)); + + if(HAL_UART_Init(huart) == HAL_OK) + { + UART_TypeDef *instance = huart->Instance; + + /* uart RTS can not be used in RS485DE. + clear bit UART RTSen */ + CLEAR_BIT(instance->CR1, UART_CR1_RTSEN); + + HAL_UART_RS485Msp_Init(huart); + + SET_BIT(instance->BCNT, UART_BCNT_DEM); + + /* config DE Pin polarity */ + MODIFY_REG(instance->BCNT, UART_BCNT_DEP, (de_polarity << UART_BCNT_DEP_Pos)); + + /* config deat time */ + MODIFY_REG(instance->BCNT, UART_BCNT_DEAT, (deat_time << UART_BCNT_DEAT_Pos)); + + /* config dedt time */ + MODIFY_REG(instance->BCNT, UART_BCNT_DEDT, (dedt_time << UART_BCNT_DEDT_Pos)); + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initialize the UART IRDA Mode according to the specified parameters in huart. +* +*@param : huart: uart handle with UART parameters. +*@param : is_lowpwr: config IRDA low power mode. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_IRDA_Init(UART_HandleTypeDef *huart, bool is_lowpwr) +{ + assert_param(IS_IRDA_INSTANCE(huart->Instance)); + + if(HAL_UART_Init(huart) == HAL_OK) + { + uint32_t Uart_Clk; + UART_TypeDef *instance = huart->Instance; + + if(instance == USART1) + { + Uart_Clk = HAL_RCC_GetPCLK2Freq(); + } + else + { + Uart_Clk = HAL_RCC_GetPCLK1Freq(); + } + + SET_BIT(instance->CR1, UART_CR1_SIREN); + + if(is_lowpwr) + { + SET_BIT(instance->CR1, UART_CR1_SIRLP); + instance->GTPR = (uint8_t)(Uart_Clk / (115200 * 16)); + } + else + { + CLEAR_BIT(instance->CR1, UART_CR1_SIRLP); + } + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + + +/****************************************************************************** +*@brief : Initialize the Multi-UART Communication Mode +* according to the specified parameters in huart. +* +*@param : huart: uart handle with UART parameters. +*@param : addr: uart address +*@param : wakeupMode: UART waked up by idle line or address mark, +* see @UART_WakeupMode_Enum for more information +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t addr, UART_WakeupMode_Enum wakeupMode) +{ + if(HAL_UART_Init(huart) == HAL_OK) + { + /* config uart addr mode & addr */ + if(IS_UART_7BIT_ADDR_MODE(addr)) + { + SET_BIT(huart->Instance->CR2, UART_CR2_ADDM7); + } + else + { + CLEAR_BIT(huart->Instance->CR2, UART_CR2_ADDM7); + } + MODIFY_REG(huart->Instance->CR2, UART_CR2_ADDR, (addr << UART_CR2_ADDR_Pos)); + + /* config uart wakeup mode */ + MODIFY_REG(huart->Instance->CR2, UART_CR2_WAKE, (wakeupMode << UART_CR2_WAKE_Pos)); + } + else + { + return HAL_ERROR; + } + + __HAL_UART_ENABLE(huart); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : DeInitialize the UART MSP +* +*@param : huart: uart handle with UART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) +{ + /* + NOTE : This function is implemented in user xxx_hal_msp.c + */ + + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); +} + +/****************************************************************************** +*@brief : DeInitialize the UART module +* +*@param : huart: uart handle with UART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) +{ + + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + /* DeInit the low level hardware : GPIO, CLOCK, NVIC */ + HAL_UART_MspDeInit(huart); + + return HAL_OK; + +} + +/****************************************************************************** +*@brief : Send an amount of data by loop mode within timeout period. +* +*@param : huart: uart handle with UART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to be sent. +*@param : timeout: Timeout duration, unit MS, 1(ms)~~0xFFFFFFFF(wait forever) +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size, uint32_t timeout) +{ + uint16_t *pbuf_16; + uint32_t Start_Tick; + + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + if ((buf == NULL) || (size == 0U)) + { + return HAL_ERROR; + } + + huart->TxCount = 0; + huart->TxData = buf; + pbuf_16 = (uint16_t *)huart->TxData; + + SET_BIT(huart->Instance->CR1, UART_CR1_TXE); + + if (huart->Init.Mode == UART_MODE_HALF_DUPLEX) + { + /* disable RX in half-duplex mode */ + CLEAR_BIT(huart->Instance->CR1, UART_CR1_RXE); + } + + Start_Tick = HAL_GetTick(); + + while (size--) + { + if (huart->Init.WordLength == UART_WORDLENGTH_9B) + { + huart->Instance->DR = (uint16_t)(pbuf_16[huart->TxCount++] & 0x01FFU); + } + else + { + huart->Instance->DR = huart->TxData[huart->TxCount++]; + } + while (huart->Instance->FR & UART_FR_TXFF) + { + if ((HAL_GetTick() - Start_Tick) > timeout) + { + return HAL_TIMEOUT; + } + } + } + + HAL_UART_Wait_Tx_Done(huart); + + if (huart->Init.Mode == UART_MODE_HALF_DUPLEX) + { + SET_BIT(huart->Instance->CR1, UART_CR1_RXE); + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data by loop mode within timeout period. +* +*@param : huart: uart handle with UART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to receive. +*@param : timeout: Timeout duration, unit MS, 1(ms)~~0xFFFFFFFF(wait forever) +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size, uint32_t timeout) +{ + uint16_t *pbuf_16; + uint32_t Start_Tick; + + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + if ((buf == NULL) || (size == 0U)) + { + return HAL_ERROR; + } + + huart->RxCount = 0; + huart->RxData = buf; + pbuf_16 = (uint16_t *)huart->RxData; + + /* In case RXE is disabled in transmit funtion */ + SET_BIT(huart->Instance->CR1, UART_CR1_RXE); + + Start_Tick = HAL_GetTick(); + + while (size--) + { + while(huart->Instance->FR & UART_FR_RXFE) + { + if ((HAL_GetTick() - Start_Tick) > timeout) + { + return HAL_TIMEOUT; + } + } + + /* Store Data in buffer */ + if (huart->Init.WordLength == UART_WORDLENGTH_9B) + { + pbuf_16[huart->RxCount++] = (uint16_t)(huart->Instance->DR & 0x1FFU); + } + else + { + huart->RxData[huart->RxCount++] = (uint8_t)huart->Instance->DR; + } + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data to Idle line or BCNT time. +* +*@param : huart: uart handle with UART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to receive. +*@param : rece_mode: by idle line, or by bit value count reached +*@param : timeout: BCNT value(relative to UART baudrate), when UART BaudRate = 115200, + then set timeout = 115200,it is approximately 1 second. MAX BCNT value can be 0xFFFFFF. +* Only used when 'rece_mode' = RECEIVE_TOBCNT +* when 'rece_mode' = RECEIVE_TOIDLE, it is meaningless. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_Receive_To_IDLEorBCNT(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size, + UART_Receive_Mode_Enum rece_mode, uint32_t timeout) +{ + uint16_t *pbuf_16; +// uint32_t Start_Tick; + + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + if ((buf == NULL) || (size == 0U)) + { + return HAL_ERROR; + } + + huart->RxCount = 0; + huart->RxData = buf; + pbuf_16 = (uint16_t *)huart->RxData; + + /* In case RXE is disabled in transmit funtion */ + SET_BIT(huart->Instance->CR1, UART_CR1_RXE); + + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_IDLEI | UART_ISR_BCNTI); + + if(rece_mode == RECEIVE_TOBCNT) + { + MODIFY_REG(huart->Instance->BCNT, UART_BCNT_BCNTVALUE, timeout); + SET_BIT(huart->Instance->BCNT, UART_BCNT_AUTO_START_EN); + } + + while (size--) + { + while(huart->Instance->FR & UART_FR_RXFE) + { + if(rece_mode == RECEIVE_TOBCNT) + { + if(READ_BIT(huart->Instance->ISR, UART_ISR_BCNTI)) + { + CLEAR_BIT(huart->Instance->BCNT, UART_BCNT_AUTO_START_EN); + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_BCNTI); + return HAL_TIMEOUT; + } + } + else + { + if(READ_BIT(huart->Instance->ISR, UART_ISR_IDLEI)) + { + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_IDLEI); + while(READ_BIT(huart->Instance->ISR, UART_ISR_IDLEI)) + { + CLEAR_STATUS(huart->Instance->ISR, 0); + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_IDLEI); + } + return HAL_TIMEOUT; + } + } + } + + /* Store Data in buffer */ + if (huart->Init.WordLength == UART_WORDLENGTH_9B) + { + pbuf_16[huart->RxCount++] = (uint16_t)(huart->Instance->DR & 0x1FFU); + } + else + { + huart->RxData[huart->RxCount++] = (uint8_t)huart->Instance->DR; + } + } + + CLEAR_BIT(huart->Instance->BCNT, UART_BCNT_AUTO_START_EN); + return HAL_OK; +} + +/****************************************************************************** +*@brief : Send an amount of data in interrupt mode. +* +*@param : huart: uart handle with UART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to send. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size) +{ + uint16_t *pbuf_16; + + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + if (huart->TxBusy == true) + { + return HAL_BUSY; + } + + if (size == 0 || buf == NULL) + { + return HAL_ERROR; + } + + huart->TxSize = size; + huart->TxCount = 0; + huart->TxData = buf; + huart->TxBusy = true; + pbuf_16 = (uint16_t *)huart->TxData; + + SET_BIT(huart->Instance->CR1, UART_CR1_TXE); + + if (huart->Init.Mode == UART_MODE_HALF_DUPLEX) + { + /* disable RX in half-duplex mode */ + CLEAR_BIT(huart->Instance->CR1, UART_CR1_RXE); + } + + /* Clear TXI Status */ + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_TXI); + /* FIFO Enable */ + SET_BIT(huart->Instance->CR3, UART_CR3_FEN); + /*FIFO Select*/ + __HAL_UART_TXI_FIFO_LEVEL_SET(huart->Instance, UART_TX_FIFO_1_2); + + for(;;) + { + /*Data Size less than 16Byte */ + if(size == huart->TxCount) + { + huart->TxBusy = false; + + while ((huart->Instance->FR & UART_FR_BUSY)){} + + HAL_UART_TxCpltCallback(huart); + + return HAL_OK; + } + if(READ_BIT(huart->Instance->FR, UART_FR_TXFF)) + { + break; + } + + if (huart->Init.WordLength == UART_WORDLENGTH_9B) + { + huart->Instance->DR = (uint16_t)(pbuf_16[huart->TxCount++] & 0x01FFU); + } + else + { + huart->Instance->DR = huart->TxData[huart->TxCount++]; + } + } + + /* Enable TX interrupt */ + SET_BIT(huart->Instance->IE, UART_IE_TXI); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data in interrupt mode. +* +*@param : huart: uart handle with UART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to receive. +*@return: HAL_StatusTypeDef +*@note : HAL_UART_Receive_IT() function will stop receiving data when: + 1. Total amount of data have been received. + 2. Idle line occured.(You can use __HAL_UART_Resume_Receive_IT(__HANDLE__) Macro + in HAL_UART_IdleCallback() fucntion in user code to resume receving data + if you still want to recive all the size of data) + + There will be already datas in UART FIFO before call this function. + use __HAL_UART_FIFO_FLUSH(__HANDLE__) macro before calling HAL_UART_Receive_IT() + to flush FIFO if the data is useless. +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size) +{ + uint16_t *pbuf_16; + + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + if (huart->RxBusy == true) + { + return HAL_BUSY; + } + + if (size == 0 || buf == NULL) + { + return HAL_ERROR; + } + + huart->RxSize = size; + huart->RxCount = 0; + huart->RxData = buf; + huart->RxBusy = true; + pbuf_16 = (uint16_t *)huart->RxData; + + SET_BIT(huart->Instance->CR1, UART_CR1_RXE); + + /* FIFO Enable */ + SET_BIT(huart->Instance->CR3, UART_CR3_FEN); + /*FIFO Select*/ + __HAL_UART_RXI_FIFO_LEVEL_SET(huart->Instance, UART_RX_FIFO_1_4); + + /* Clear RXI && IDLEI Status */ + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_RXI | UART_ISR_IDLEI); + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_PEI | UART_ISR_BEI | UART_ISR_OEI | UART_ISR_FEI); + + /* In case there are datas(which exceeded the FIFO LEVEL of triggering RXI ISR) already in UART FIFO before enabling RXI IE */ + while (size--) + { + if(huart->Instance->FR & UART_FR_RXFE) + { + goto start_recv_it; + } + if (huart->Init.WordLength == UART_WORDLENGTH_9B) + { + pbuf_16[huart->RxCount++] = (uint16_t)(huart->Instance->DR & 0x1FFU); + } + else + { + huart->RxData[huart->RxCount++] = (uint8_t)huart->Instance->DR; + } + } + + /* have been received all the size of data */ + HAL_UART_RxCpltCallback(huart); + return HAL_OK; + +start_recv_it: + /* Enable the UART Errors interrupt */ + SET_BIT(huart->Instance->IE, UART_IE_OEI | UART_IE_BEI | UART_IE_PEI | UART_IE_FEI); + /* Enable RX and RTI interrupt */ + SET_BIT(huart->Instance->IE, UART_IE_RXI | UART_IE_IDLEI); + + return HAL_OK; +} + +#ifdef HAL_DMA_MODULE_ENABLED +/****************************************************************************** +*@brief : Send an amount of data in DMA mode. +* +*@param : huart: uart handle with UART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to send. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size) +{ + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + if (huart->TxBusy == true) + { + return HAL_BUSY; + } + + if (size == 0 || buf == NULL) + { + return HAL_ERROR; + } + + huart->TxSize = size; + huart->TxCount = 0; + huart->TxData = buf; + huart->TxBusy = true; + + SET_BIT(huart->Instance->CR1, UART_CR1_TXE); + + if (huart->Init.Mode == UART_MODE_HALF_DUPLEX) + { + /* disable RX in half-duplex mode */ + CLEAR_BIT(huart->Instance->CR1, UART_CR1_RXE); + } + + SET_BIT(huart->Instance->CR1, UART_CR1_TXDMAE); + + __HAL_UART_TXI_FIFO_LEVEL_SET(huart->Instance, UART_TX_FIFO_1_16); + + if (HAL_DMA_Start_IT(huart->HDMA_Tx, (uint32_t)buf, (uint32_t)(&huart->Instance->DR), size)) + { + CLEAR_BIT(huart->Instance->CR1, UART_CR1_TXDMAE); + return HAL_ERROR; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data in DMA mode. +* +*@param : huart: uart handle with UART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to receive. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size) +{ + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + if (huart->RxBusy == true) + { + return HAL_BUSY; + } + + if (size == 0 || buf == NULL) + { + return HAL_ERROR; + } + + huart->RxSize = size; + huart->RxCount = 0; + huart->RxData = buf; + huart->RxBusy = true; + + /* In case RXE is disabled in transmit funtion */ + SET_BIT(huart->Instance->CR1, UART_CR1_RXE); + + CLEAR_STATUS(huart->Instance->ISR, UART_ISR_IDLEI); + + SET_BIT(huart->Instance->CR1, UART_CR1_RXDMAE); + + __HAL_UART_RXI_FIFO_LEVEL_SET(huart->Instance, UART_RX_FIFO_1_16); + + SET_BIT(huart->Instance->IE, UART_IE_IDLEI); + + /* Enable the UART Errors interrupt */ + SET_BIT(huart->Instance->IE, UART_IE_OEI | UART_IE_BEI | UART_IE_PEI | UART_IE_FEI); + + if (HAL_DMA_Start_IT(huart->HDMA_Rx, (uint32_t)(&huart->Instance->DR), (uint32_t)buf, size)) + { + CLEAR_BIT(huart->Instance->CR1, UART_CR1_RXDMAE); + CLEAR_BIT(huart->Instance->IE, UART_IE_IDLEI | UART_IE_OEI | UART_IE_BEI | UART_IE_PEI | UART_IE_FEI); + return HAL_ERROR; + } + + return HAL_OK; +} +#endif + +/****************************************************************************** +*@brief : Tx Transfer completed callbacks. +* +*@param : huart: uart handle with UART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) +{ + /* + NOTE: This function Should be modified, when the callback is needed, + the HAL_UART_TxCpltCallback could be implemented in the user file. + */ +} + +/****************************************************************************** +*@brief : Rx Transfer completed callbacks. +* +*@param : huart: uart handle with UART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) +{ + /* + NOTE: This function Should be modified, when the callback is needed, + the HAL_UART_RxCpltCallback could be implemented in the user file. + */ +} + +/****************************************************************************** +*@brief : Rx Transfer idleline callbacks. +* +*@param : huart: uart handle with UART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_UART_IdleCallback(UART_HandleTypeDef *huart) +{ + /* + NOTE: This function Should be modified, when the callback is needed, + the HAL_UART_RxCpltCallback could be implemented in the user file. + */ +} + +/****************************************************************************** +*@brief : Recv Error callbacks. +* +*@param : huart: uart handle with UART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) +{ + /* + NOTE: This function Should be modified, when the callback is needed, + the HAL_UART_ErrorCallback could be implemented in the user file. + */ +} + +/****************************************************************************** +*@brief : Config UART BaudRate +* +*@param : huart: uart handle with UART parameters. +*@return: None +******************************************************************************/ +static void UART_Config_BaudRate(UART_HandleTypeDef *huart) +{ + uint32_t pclk; + uint32_t ibaud, fbaud; + uint64_t tmp; + + if (USART1 == huart->Instance) + { + pclk = HAL_RCC_GetPCLK2Freq(); + } + else + { + pclk = HAL_RCC_GetPCLK1Freq(); + } + + /* Integral part */ + ibaud = pclk / (huart->Init.BaudRate * 16); + + /* Fractional part */ + tmp = pclk % (huart->Init.BaudRate * 16); + tmp = (tmp * 1000000) / (huart->Init.BaudRate * 16); + fbaud = (tmp * 64 + 500000) / 1000000; + + if (fbaud >= 64) + { + MODIFY_REG(huart->Instance->BRR, UART_BRR_IBAUD_Msk, ((ibaud + 1) << UART_BRR_IBAUD_Pos)); + MODIFY_REG(huart->Instance->BRR, UART_BRR_FBAUD_Msk, (0 << UART_BRR_FBAUD_Pos)); + } + else + { + MODIFY_REG(huart->Instance->BRR, UART_BRR_IBAUD_Msk, (ibaud << UART_BRR_IBAUD_Pos)); + MODIFY_REG(huart->Instance->BRR, UART_BRR_FBAUD_Msk, (fbaud << UART_BRR_FBAUD_Pos)); + } +} + +/****************************************************************************** +*@brief : Return the uart State +* +*@param : huart: uart handle with UART parameters. +*@return: HAL_BUSY or HAL_OK +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart) +{ + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + if(huart->TxBusy || huart->RxBusy) + { + return HAL_BUSY; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Return the uart Error +* +*@param : huart: uart handle with UART parameters. +*@return: uart errcode +******************************************************************************/ +uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart) +{ + return huart->ErrorCode; +} + +#ifdef HAL_DMA_MODULE_ENABLED +/****************************************************************************** +*@brief : Abort ongoing transfers(blocking mode) +* +*@param : huart: uart handle with UART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) +{ + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + /*disble all interrupt*/ + huart->Instance->IE =0x00; + + /* Disable the UART DMA Tx request if enable */ + if(READ_BIT(huart->Instance->CR1, UART_CR1_TXDMAE)) + { + CLEAR_BIT(huart->Instance->CR1, UART_CR1_TXDMAE); + + /* Abort the UART Tx Channel */ + if(huart->HDMA_Tx) + { + /*Set the UART DMA Abort callback to Null */ + huart->HDMA_Tx->XferCpltCallback =NULL; + + if(HAL_DMA_Abort(huart->HDMA_Tx)!=HAL_OK) + { + return HAL_TIMEOUT; + } + } + } + + /* Disable the UART DMA Rx request if enable */ + if(READ_BIT(huart->Instance->CR1, UART_CR1_RXDMAE)) + { + CLEAR_BIT(huart->Instance->CR1, UART_CR1_RXDMAE); + + /* Abort the UART Rx Channel */ + if(huart->HDMA_Rx) + { + /*Set the UART DMA Abort callback to Null */ + huart->HDMA_Rx->XferCpltCallback =NULL; + + if(HAL_DMA_Abort(huart->HDMA_Rx)!=HAL_OK) + { + return HAL_TIMEOUT; + } + } + } + + /*Reset Tx and Rx Transfer size*/ + huart->TxSize = 0; + huart->RxSize = 0; + + /* Restore huart->TxBusy and huart->RxBusy to Ready */ + huart->TxBusy = false; + huart->RxBusy = false; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Pause the UART DMA Transfer +* +*@param : huart: uart handle with UART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) +{ + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + if(READ_BIT(huart->Instance->CR1, UART_CR1_TXDMAE)) + { + /* Disable the UART DMA Tx request */ + CLEAR_BIT(huart->Instance->CR1, UART_CR1_TXDMAE); + } + + if (READ_BIT(huart->Instance->CR1, UART_CR1_RXDMAE)) + { + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(huart->Instance->IE, UART_IE_OEI | UART_IE_PEI | UART_IE_BEI | UART_IE_FEI); + + /* Disable the UART DMA Rx request */ + CLEAR_BIT(huart->Instance->CR1, UART_CR1_RXDMAE); + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Resume the UART DMA Transfer +* +*@param : huart: uart handle with UART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) +{ + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + if (huart->TxBusy == false) + { + /* Enable the UART DMA Tx request */ + SET_BIT(huart->Instance->CR1, UART_CR1_TXDMAE); + } + + if (huart->RxBusy == false) + { + /* Reenable PE and ERR (Frame error, noise error, overrun error) interrupts */ + SET_BIT(huart->Instance->IE, UART_IE_OEI | UART_IE_PEI | UART_IE_BEI | UART_IE_FEI); + + /* Enable the UART DMA Rx request */ + SET_BIT(huart->Instance->CR1, UART_CR1_RXDMAE); + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Stop the UART DMA Transfer +* +*@param : huart: uart handle with UART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart) +{ + assert_param (IS_UART_ALL_INSTANCE(huart->Instance)); + + if(huart->Instance->CR1 & UART_CR1_TXDMAE) + { + CLEAR_BIT(huart->Instance->CR1, UART_CR1_TXDMAE); + if(huart->HDMA_Tx != NULL) + { + HAL_DMA_Abort(huart->HDMA_Tx); + } + + CLEAR_BIT(huart->Instance->IE, (UART_IE_TXI)); + } + + if(huart->Instance->CR1 & UART_CR1_RXDMAE) + { + CLEAR_BIT(huart->Instance->CR1, UART_CR1_RXDMAE); + if(huart->HDMA_Rx != NULL) + { + HAL_DMA_Abort(huart->HDMA_Rx); + } + + CLEAR_BIT(huart->Instance->IE, (UART_IE_RXI | UART_IE_PEI)); + + CLEAR_BIT(huart->Instance->IE, UART_IE_IDLEI); + } + + return HAL_OK; +} +#endif + +/****************************************************************************** +*@brief : uart module enter into mute mode +* +*@param : huart: uart handle with UART parameters. +*@return: HAL_OK +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart) +{ + SET_BIT(huart->Instance->CR2, UART_CR2_RWU); + return HAL_OK; +} + +/****************************************************************************** +*@brief : uart module exit from mute mode +* +*@param : huart: uart handle with UART parameters. +*@return: HAL_OK +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart) +{ + CLEAR_BIT(huart->Instance->CR2, UART_CR2_RWU); + return HAL_OK; +} + +/****************************************************************************** +*@brief : which uart instance is selected for debug using +* +*@param : UARTx: UART instance. +*@return: None +******************************************************************************/ +void HAL_UART_SetDebugUart(UART_TypeDef *UARTx) +{ + if(UARTx != NULL) + { + assert_param (IS_UART_ALL_INSTANCE(UARTx)); + } + g_DebugUart = UARTx; +} +#if defined ( __CC_ARM ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) + +/****************************************************************************** +*@brief : re-direct fputc to uart port +* +*@param : ch: character to send +*@param : f: a pointer to FILE struct, no use in uart re-directing +*@return: character sent +******************************************************************************/ +__weak int fputc(int ch, FILE *f) +{ + if(g_DebugUart) + { + g_DebugUart->DR = ch; + while ((g_DebugUart->FR & UART_FR_BUSY)); + } + return ch; +} +#elif defined (__GNUC__) + +__weak int __io_putchar(int ch) +{ + g_DebugUart->DR = ch; + while ((g_DebugUart->FR & UART_FR_BUSY)); + return ch; +} + +#endif +#endif //HAL_UART_MODULE_ENABLED + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_uart_7816m.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_uart_7816m.c new file mode 100644 index 0000000000..2a00c0a64c --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_uart_7816m.c @@ -0,0 +1,281 @@ +/****************************************************************************** +* @file : hal_uart_7816m.c +* @brief : UART HAL module driver for ISO7816 Master. +* This file provides firmware functions to manage the following +* functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (UART). +* @ver : V1.0.0 +* @date : 2020 +******************************************************************************/ +#include "hal.h" + +#ifdef HAL_UART_7816M_MODULE_ENABLED + +/****************************************************************************** +*@brief : Config baudrate of 7816 clk +* +*@param : uartx_instance: which uart instance +*@param : clk_hz: uart module clk freq +*@param : baud_rate: 7816 clk baudrate +*@return: None +******************************************************************************/ +static void uart_set_baud_rate(UART_TypeDef *uartx_instance, uint32_t clk_hz, uint32_t baud_rate) +{ + uint32_t temp, divider, remainder, fraction; + + temp = 16 * baud_rate; + divider = clk_hz / temp; + remainder = clk_hz % temp; + temp = 1 + (128 * remainder) / temp; + fraction = temp / 2; + + uartx_instance->BRR = (divider<<6)| fraction; +} + +/****************************************************************************** +*@brief : Initialize the UART MSP: CLK, GPIO, NVIC +* +*@param : huart: uart handle with UART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_UART_7816M_MspInit(UART_HandleTypeDef* huart) +{ + GPIO_InitTypeDef GPIO_InitStruct ={0}; + + UART_TypeDef *instance = huart->Instance; + + if(instance == USART1) + { + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_USART1_CLK_ENABLE(); + + /*7816 IO: PA9*/ + GPIO_InitStruct.Pin = GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Drive = GPIO_DRIVE_LEVEL3; + GPIO_InitStruct.Alternate = GPIO_FUNCTION_1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*7816 RST: PA10*/ + GPIO_InitStruct.Pin = GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Drive = GPIO_DRIVE_LEVEL3; + GPIO_InitStruct.Alternate = GPIO_FUNCTION_1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*7816 CLK: PA8*/ + GPIO_InitStruct.Pin = GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Drive = GPIO_DRIVE_LEVEL3; + GPIO_InitStruct.Alternate = GPIO_FUNCTION_6; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + NVIC_ClearPendingIRQ(USART1_IRQn); + NVIC_EnableIRQ(USART1_IRQn); + } + else if(instance == USART2) + { + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_USART2_CLK_ENABLE(); + + + /*7816 IO: PB3*/ + GPIO_InitStruct.Pin = GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Drive = GPIO_DRIVE_LEVEL3; + GPIO_InitStruct.Alternate = GPIO_FUNCTION_5; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + + /*7816 RST: PB4*/ + GPIO_InitStruct.Pin = GPIO_PIN_4; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Drive = GPIO_DRIVE_LEVEL3; + GPIO_InitStruct.Alternate = GPIO_FUNCTION_0; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*7816 CLK: PB5*/ + GPIO_InitStruct.Pin = GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Drive = GPIO_DRIVE_LEVEL3; + GPIO_InitStruct.Alternate = GPIO_FUNCTION_5; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + NVIC_ClearPendingIRQ(USART2_IRQn); + NVIC_EnableIRQ(USART2_IRQn); + } +} + +/****************************************************************************** +*@brief : Initialize the UART 7816 Master mode + according to the specified parameters in huart. +* +*@param : huart: uart handle with UART parameters. +*@param : clk_psc: clk divison for 7816 clock output. +*@param : guard_time: 7816 Guard Time. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_7816M_Init(UART_HandleTypeDef *huart, uint32_t clk_psc, uint32_t guard_time) +{ + uint32_t uart_clk_hz, j = 0; + volatile uint8_t temp; + + UART_TypeDef *instance = huart->Instance; + + if(!huart) + { + return HAL_ERROR; + } + + if (USART1 == huart->Instance) + { + uart_clk_hz = HAL_RCC_GetPCLK2Freq(); + } + else + { + uart_clk_hz = HAL_RCC_GetPCLK1Freq(); + } + + HAL_UART_7816M_MspInit(huart); + + + __HAL_UART_DISABLE(huart); + + uart_set_baud_rate(instance, uart_clk_hz, huart->Init.BaudRate); + + + instance->CR3 = UART_WORDLENGTH_8B | UART_STOPBITS_1 | UART_PARITY_NONE | UART_TX_FIFO_1_16 | UART_RX_FIFO_1_16; //FIFO off + + SET_BIT(instance->CR3, UART_CR3_PEN); //1 parity bit + SET_BIT(instance->CR3, UART_CR3_EPS); //even + + SET_BIT(instance->CR2, UART_CR2_SCEN | UART_CR2_NACK | UART_CR2_HDSEL); //SC EN, NACK, 1 wire mode + + MODIFY_REG(instance->GTPR, UART_GTPR_PSC, (clk_psc << UART_GTPR_PSC_Pos)); //PSC 48MHz/((5+1)*2) = 12 about 4MHz + + MODIFY_REG(instance->GTPR, UART_GTPR_GT, (guard_time << UART_GTPR_GT_Pos)); + + instance->CR1 = (UART_CR1_RXE | UART_CR1_TXE |UART_CR1_UARTEN); //enable uart,rxe + + return HAL_OK; + +} + +/****************************************************************************** +*@brief : Receive an amount of data by loop mode within timeout period. +* +*@param : huart: uart handle with UART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to receive. +*@param : timeout: BCNT value +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_7816M_Receive(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size, uint32_t timeout) +{ + uint8_t i; + uint8_t errortimes; + volatile uint8_t temp; + HAL_StatusTypeDef err = HAL_OK; + + errortimes = 0; + + SET_BIT(huart->Instance->CR1, UART_CR1_RXE); + + huart->Instance->BCNT &= ~0x0A000000; //clear DEM and AUTO_START_EN + huart->Instance->BCNT = (huart->Instance->BCNT & ~0xFFFFFF) | timeout; + huart->Instance->BCNT |= 0x03000000; + + huart->ErrorCode = HAL_UART_ERROR_NONE; + + for (i = 0; i < size;) + { + while (((huart->Instance->FR & UART_FR_RXFE)==UART_FR_RXFE) && ((huart->Instance->ISR & UART_ISR_PEI)==0))//No data and no Parity Error + { + if(huart->Instance->ISR & UART_ISR_BCNTI) + { + SET_BIT(huart->Instance->ISR, UART_ISR_BCNTI); + err = HAL_TIMEOUT; + goto rxend; + } + } + if((huart->Instance->ISR & UART_ISR_PEI))//PE error + { + huart->Instance->ISR = UART_ISR_PEI; + errortimes++; + if(errortimes > 3) + { + huart->ErrorCode |= HAL_UART_ERROR_PE; + err = HAL_ERROR; + goto rxend; + } + + while ((huart->Instance->FR & UART_FR_RXFE)==UART_FR_RXFE) //No data + { + ; + } + + while ((huart->Instance->FR & UART_FR_RXFE)!= UART_FR_RXFE) //have data + { + temp = huart->Instance->DR; + } + } + else + { + buf[i] = huart->Instance->DR; + i++; + } + } + +rxend: + + huart->RxCount = i; + return err; +} + +/****************************************************************************** +*@brief : Send an amount of data by loop mode within timeout period. +* +*@param : huart: uart handle with UART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to be sent. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_UART_7816M_Transmit(UART_HandleTypeDef *huart, uint8_t *buf, uint32_t size) +{ + uint8_t i; + uint8_t errortimes; + HAL_StatusTypeDef err = HAL_OK; + + CLEAR_BIT(huart->Instance->CR1, UART_CR1_RXE); + + huart->TxCount = 0; + + for (i = 0; i < size; i++) + { + huart->Instance->DR = *buf++; + + while (huart->Instance->FR & UART_FR_TXFF) + { + if (huart->Instance->ISR & UART_ISR_FEI) //FE error + { + err = HAL_ERROR; + goto txend; + } + } + } + +txend: + + + + huart->TxCount = i; + + return err; +} + +#endif //HAL_UART_7816M_MODULE_ENABLED diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_uart_ex.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_uart_ex.c new file mode 100644 index 0000000000..869be9aaaf --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_uart_ex.c @@ -0,0 +1,239 @@ +/****************************************************************************** +*@file : hal_uart_ex.c +*@brief : This file provides firmware functions to manage the UART LIN HAL module driver +*@ver : 1.0.0 +*@date : 2022.10.20 +******************************************************************************/ +#include "hal.h" + +/****************************************************************************** +*@brief : Uart lin master transmit data +* +*@param : huart: a pointer of UART_HandleTypeDef structure which contains +* the configuration information for the specified UART. +*@param : Lin_Version: LIN version ,should be UART_LIN_V1D3 or UART_LIN_V2DX. +*@param : Lin_Id: LIN id +*@param : pData: point to the transmit data buffer. +*@param : Size: Transmit buffer Size. +*@return: None +******************************************************************************/ +void HAL_UART_LIN_Master_Transmit(UART_HandleTypeDef *huart, uint8_t Lin_Version, uint8_t Lin_Id, uint8_t *pData, uint8_t Size) +{ + uint8_t Lin_P0,Lin_P1,ucI; + uint16_t Lin_Check_Sum = 0; + + if((Size>8)||(pData == 0)) + return; + + CLEAR_BIT(huart->Instance->IE, UART_IE_LBDI); + huart->Instance->CR1 = 0x0101; //disable uart_rx + + MODIFY_REG(huart->Instance->BCNT, UART_BCNT_BCNTVALUE_Msk, (13)<Instance->BCNT, UART_BCNT_BCNTSTART); + SET_BIT(huart->Instance->CR3, UART_CR3_BRK); + + while(!(READ_BIT(huart->Instance->ISR, UART_ISR_BCNTI))){} //Check BCNTI. + CLEAR_BIT(huart->Instance->CR3, UART_CR3_BRK); + huart->Instance->ISR = UART_ISR_BCNTI; + + HAL_UART_Transmit(huart, (uint8_t*)"\x55", 1, 0); //Transmit sync field + + Lin_Id &= 0x3F; //Lin address check, 0-63. + Lin_P0 = (Lin_Id^(Lin_Id>>1)^(Lin_Id>>2)^(Lin_Id>>4))&0x01; //P0 = ID0^ID1^ID2^ID4 + Lin_P1 = (~((Lin_Id>>1)^(Lin_Id>>3)^(Lin_Id>>4)^(Lin_Id>>5)))&0x01; //P1 = ~(ID1^ID3^ID4^ID5) + Lin_Id = Lin_Id | (Lin_P0<<6) | (Lin_P1<<7); + + HAL_UART_Transmit(huart, &Lin_Id, 1, 0); //Transmit pid field + + if((Lin_Version==UART_LIN_V2DX)&&(Lin_Id !=0x3C && Lin_Id!=0x3D)) + Lin_Check_Sum = Lin_Id; //LIN 2.X check sum calc with PID. + + if(Size) + { + for(ucI=0;ucI0xFF) + Lin_Check_Sum = ((Lin_Check_Sum>>8)+Lin_Check_Sum)&0xFF; + } + Lin_Check_Sum = (~Lin_Check_Sum) & 0xFF; + + HAL_UART_Transmit(huart, pData, Size, 0); //Transmit data field + + HAL_UART_Transmit(huart, (uint8_t*)&Lin_Check_Sum, 1, 0); //Transmit Lin_Check_Sum field + } +} + +/****************************************************************************** +*@brief : Uart lin slave transmit data +* +*@param : huart: a pointer of UART_HandleTypeDef structure which contains +* the configuration information for the specified UART. +*@param : Lin_Version: LIN version ,should be UART_LIN_V1D3 or UART_LIN_V2DX. +*@param : Lin_Id: LIN id +*@param : pData: point to the transmit data buffer. +*@param : Size: Transmit buffer Size. +*@return: None +******************************************************************************/ +void HAL_UART_LIN_Slave_Transmit(UART_HandleTypeDef *huart, uint8_t Lin_Version, uint8_t Lin_Id, uint8_t *pData, uint8_t Size) +{ + uint8_t ucI; + uint16_t Lin_Check_Sum = 0; + + if((Size>8)||(pData == 0)) + return; + + CLEAR_BIT(huart->Instance->IE, UART_IE_LBDI);//disable LBDI int + huart->Instance->CR1 = 0x0101; //disable uart_rx + + if((Lin_Version==UART_LIN_V2DX)&&(Lin_Id !=0x3C && Lin_Id!=0x3D)) + Lin_Check_Sum = Lin_Id; //LIN 2.X check sum calc with PID. + + for(ucI=0;ucI0xFF) + Lin_Check_Sum = ((Lin_Check_Sum>>8)+Lin_Check_Sum)&0xFF; + } + Lin_Check_Sum = (~Lin_Check_Sum) & 0xFF; + + HAL_UART_Transmit(huart, pData, Size, 0); //Transmit data field + + HAL_UART_Transmit(huart, (uint8_t*)&Lin_Check_Sum, 1, 0); //Transmit Lin_Check_Sum field +} + +/****************************************************************************** +*@brief : Uart lin master receive data +* +*@param : huart: a pointer of UART_HandleTypeDef structure which contains +* the configuration information for the specified UART. +*@param : Lin_Version: LIN version ,should be UART_LIN_V1D3 or UART_LIN_V2DX. +*@param : Lin_Id: LIN id +*@param : pData: point to the transmit data buffer. +*@param : Timeout: timeout. +*@return: RxSize +******************************************************************************/ +uint8_t HAL_UART_LIN_Master_Receive(UART_HandleTypeDef *huart, uint8_t Lin_Version, uint8_t Lin_Id, uint8_t *pData, uint32_t Timeout) +{ + uint8_t ucI,RxSize; + uint8_t Lin_Rx_Buf[16]; + uint16_t Lin_Check_Sum = 0; + + if(pData == 0) + return 0; + + huart->Instance->CR3 = 0x48E0; //FIFO send and receive number is 8 + //8 data bit,1 stop bit,0 verify bit,enable FIFO + huart->Instance->CR1 = 0x0201; //disable uart_tx + huart->Instance->IE = 0x00; //Disable all interrupt + huart->Instance->ISR = 0x7fff; //clear int + + HAL_UART_Receive(huart, Lin_Rx_Buf, sizeof(Lin_Rx_Buf), Timeout); + + if((Lin_Version==UART_LIN_V2DX)&&(Lin_Id !=0x3C && Lin_Id!=0x3D)) + Lin_Check_Sum = Lin_Id; //LIN 2.X check sum calc with PID. + + if(huart->RxCount) + { + for(ucI=0;ucI<(huart->RxCount-1);ucI++) + { + Lin_Check_Sum += Lin_Rx_Buf[ucI]; + if(Lin_Check_Sum>0xFF) + Lin_Check_Sum = ((Lin_Check_Sum>>8)+Lin_Check_Sum)&0xFF; + } + Lin_Check_Sum = (~Lin_Check_Sum) & 0xFF; + if((uint8_t)Lin_Check_Sum == Lin_Rx_Buf[ucI]) + { + RxSize = huart->RxCount; + memcpy(pData, (uint8_t*)Lin_Rx_Buf, RxSize); + } + else + RxSize = 0xFF; + } + else + RxSize = 0; + + return RxSize; +} + +/****************************************************************************** +*@brief : Uart lin slave receive data +* +*@param : huart: a pointer of UART_HandleTypeDef structure which contains +* the configuration information for the specified UART. +*@param : Lin_Version: LIN version ,should be UART_LIN_V1D3 or UART_LIN_V2DX. +*@param : Lin_Id: LIN id +*@param : pData: point to the transmit data buffer. +*@param : Timeout: timeout. +*@return: RxSize +******************************************************************************/ +uint8_t HAL_UART_LIN_Slave_Receive(UART_HandleTypeDef *huart, uint8_t Lin_Version, uint8_t *pData, uint32_t Timeout) +{ + uint8_t ucI,RxSize; + uint8_t Lin_Rx_Buf[16]; + uint16_t Lin_Check_Sum = 0; + uint32_t u32_Timeout; + + if(pData == 0) + return 0; + + huart->Instance->CR3 = 0x48E0; //FIFO send and receive number is 8 + //8 data bit,1 stop bit,0 verify bit,enable FIFO + huart->Instance->CR1 = 0x0201; //disable uart_tx + huart->Instance->IE = 0x00; //Disable all interrupt + huart->Instance->ISR = 0x7fff; //clear int + + if (Timeout == 0) + { + while(!READ_BIT(huart->Instance->ISR, UART_ISR_LBDI)); + } + else + { + u32_Timeout = Timeout * 0xFF; + + while(!READ_BIT(huart->Instance->ISR, UART_ISR_LBDI)) + { + if (u32_Timeout-- == 0) + { + return 0; + } + } + } + SET_BIT(huart->Instance->ISR, UART_ISR_LBDI); + + HAL_UART_Receive(huart, Lin_Rx_Buf, sizeof(Lin_Rx_Buf), Timeout); //waitting rx completed. + + if(huart->RxCount > 3) + { + if((Lin_Version==UART_LIN_V2DX)&&(Lin_Rx_Buf[2] !=0x3C && Lin_Rx_Buf[2]!=0x3D)) + Lin_Check_Sum = Lin_Rx_Buf[2]; //LIN 2.X check sum calc with PID. + + if(huart->RxCount) + { + for(ucI=3;ucI<(huart->RxCount-1);ucI++) + { + Lin_Check_Sum += Lin_Rx_Buf[ucI]; + if(Lin_Check_Sum>0xFF) + Lin_Check_Sum = ((Lin_Check_Sum>>8)+Lin_Check_Sum)&0xFF; + } + Lin_Check_Sum = (~Lin_Check_Sum) & 0xFF; + if((uint8_t)Lin_Check_Sum == Lin_Rx_Buf[ucI]) + { + RxSize = huart->RxCount; + memcpy(pData, (uint8_t*)Lin_Rx_Buf, RxSize); + } + else + RxSize = 0xFF; + } + } + else if(huart->RxCount<=3) + { + RxSize = huart->RxCount; + memcpy(pData, (uint8_t*)Lin_Rx_Buf, RxSize); + } + else + RxSize = 0; + + return RxSize; +} diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_usart.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_usart.c new file mode 100644 index 0000000000..c7acefd204 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_usart.c @@ -0,0 +1,1141 @@ +/****************************************************************************** +* @file : hal_usart.c +* @brief : USART HAL module driver. +* This file provides firmware functions to manage the following +* functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (USART). +* @ver : V1.0.0 +* @date : 2020 +******************************************************************************/ +#include "hal.h" + + +#ifdef HAL_USART_MODULE_ENABLED + +#define USART_DUMMY_DATA ((uint16_t) 0xFFFF) + +/* Private function prototypes -----------------------------------------------*/ +static void USART_Config_BaudRate(USART_HandleTypeDef *husart); +static void USART_SetConfig(USART_HandleTypeDef *husart); +static HAL_StatusTypeDef HAL_USART_Wait_Tx_Done(USART_HandleTypeDef *husart); +static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t flag, FlagStatus status, + uint32_t tick_start, uint32_t timeout); + +__weak void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart); +__weak void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart); +__weak void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart); +__weak void HAL_USART_IdleCallback(USART_HandleTypeDef *husart); +/****************************************************************************** +*@brief : Handle USART interrupt request +* +*@param : husart: usart handle with USART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_USART_IRQHandler(USART_HandleTypeDef *husart) +{ + uint32_t isrflags; + uint32_t ieits; + uint32_t errorflags; + uint16_t *pbuf_16; + + assert_param(IS_USART_ALL_INSTANCE(husart->Instance)); + + isrflags = READ_REG(husart->Instance->ISR); + ieits = READ_REG(husart->Instance->IE); + + errorflags =(isrflags & (uint32_t)(USART_ISR_PEI | USART_ISR_OEI | USART_ISR_FEI | USART_ISR_BEI)); + + /* which isr actually occured */ + isrflags &= ieits; + + /* TXI */ + if (isrflags & USART_ISR_TXI) + { + /* Clear TXI Status */ + CLEAR_STATUS(husart->Instance->ISR, USART_ISR_TXI); + + pbuf_16 = (uint16_t *)husart->TxData; + + for(;;) + { + if(husart->TxCount == husart->TxSize) + { + husart->TxBusy = false; + + /* Disable TX interrupt && error interrupt*/ + CLEAR_BIT(husart->Instance->IE, USART_IE_TXI | + USART_IE_OEI | USART_IE_BEI | USART_IE_PEI | USART_IE_FEI); + + HAL_USART_TxCpltCallback(husart); + return; + } + + if (READ_BIT(husart->Instance->FR, USART_FR_TXFF)) + { + break; + } + + if (husart->Init.WordLength == USART_WORDLENGTH_9B) + { + husart->Instance->DR = (uint16_t)(pbuf_16[husart->TxCount++] & 0x01FFU); + } + else + { + husart->Instance->DR = husart->TxData[husart->TxCount++]; + } + } + } + + /* RXI */ + if (isrflags & USART_ISR_RXI) + { + /* Clear RXI Status */ + CLEAR_STATUS(husart->Instance->ISR, USART_ISR_RXI); + + pbuf_16 = (uint16_t *)husart->RxData; + + while(husart->RxCount < husart->RxSize ) + { + if(!READ_BIT(husart->Instance->FR, USART_FR_RXFE)) + { + /* Store Data in buffer */ + if (husart->Init.WordLength == USART_WORDLENGTH_9B) + { + pbuf_16[husart->RxCount++] = (uint16_t)(husart->Instance->DR & 0x1FFU); + } + else + { + husart->RxData[husart->RxCount++] = (uint8_t)husart->Instance->DR; + } + } + else + { + break; + } + } + + if(husart->RxCount == husart->RxSize ) + { + husart->RxBusy = false; + + /* Disable RX and RTI interrupt && error interrupt*/ + CLEAR_BIT(husart->Instance->IE, (USART_IE_RXI | USART_IE_IDLEI | + USART_IE_OEI | USART_IE_BEI | USART_IE_PEI | USART_IE_FEI)); + + HAL_USART_RxCpltCallback(husart); + } + } + /* IDLEI */ + else if(isrflags & USART_ISR_IDLEI) + { + /*clear IDLE Status */ + CLEAR_STATUS(husart->Instance->ISR, USART_ISR_IDLEI); + + pbuf_16 = (uint16_t *)husart->RxData; + + while(!READ_BIT(husart->Instance->FR, USART_FR_RXFE)) + { + if (husart->Init.WordLength == USART_WORDLENGTH_9B) + { + pbuf_16[husart->RxCount++] = (uint16_t)(husart->Instance->DR & 0x1FFU); + } + else + { + husart->RxData[husart->RxCount++] = (uint8_t)husart->Instance->DR; + } + } + + husart->RxBusy = false; + + /* Disable RX and RTI interrupt && error interrupt*/ + CLEAR_BIT(husart->Instance->IE, (USART_IE_RXI | USART_IE_IDLEI | + USART_IE_OEI | USART_IE_BEI | USART_IE_PEI | USART_IE_FEI)); + + + + HAL_USART_IdleCallback(husart); + } + + /* if some errors occurred */ + if(errorflags != 0) + { + /* USART parity error interrupt occurred */ + if (((errorflags & USART_ISR_PEI) != 0)) + { + /* Clear parity error status */ + CLEAR_STATUS(husart->Instance->ISR, USART_ISR_PEI); + husart->ErrorCode |= HAL_USART_ERROR_PE; + } + + /* USART break error interrupt occurred */ + if (((errorflags & USART_ISR_BEI) != 0)) + { + CLEAR_STATUS(husart->Instance->ISR, USART_ISR_BEI); + husart->ErrorCode |= HAL_USART_ERROR_NE; + } + + /* USART frame error interrupt occurred */ + if (((errorflags & USART_ISR_FEI) != 0)) + { + CLEAR_STATUS(husart->Instance->ISR, USART_ISR_FEI); + husart->ErrorCode |= HAL_USART_ERROR_FE; + } + + /* USART Over-Run interrupt occurred */ + if (((errorflags & USART_ISR_OEI) != 0)) + { + CLEAR_STATUS(husart->Instance->ISR, USART_ISR_OEI); + husart->ErrorCode |= HAL_USART_ERROR_ORE; + } + + HAL_USART_ErrorCallback(husart); + } +} + + +/****************************************************************************** +*@brief : wait Tx FIFO empty +* +*@param : husart: usart handle with USART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +static HAL_StatusTypeDef HAL_USART_Wait_Tx_Done(USART_HandleTypeDef *husart) +{ + + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); + + /* wait TX not busy*/ + while(READ_BIT(husart->Instance->FR, USART_FR_BUSY)); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initialize the USART MSP: CLK, GPIO, NVIC +* +*@param : husart: usart handle with USART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_USART_MspInit(USART_HandleTypeDef *husart) +{ + /* + NOTE : This function is implemented in user xxx_hal_msp.c + */ + + /* Prevent unused argument(s) compilation warning */ + UNUSED(husart); +} + +/****************************************************************************** +*@brief : Initialize the USART according to the specified parameters in husart. +* +*@param : husart: usart handle with USART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart) +{ + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); +// assert_param (IS_USART_WORDLENGTH(husart->Init.WordLength)); +// assert_param (IS_USART_STOPBITS(husart->Init.StopBits)); +// assert_param (IS_USART_PARITY(husart->Init.Parity)); +// assert_param (IS_USART_MODE(husart->Init.Mode)); +// assert_param(IS_USART_POLARITY(husart->Init.CLKPolarity)); +// assert_param(IS_USART_PHASE(husart->Init.CLKPhase)); +// assert_param(IS_USART_LASTBIT(husart->Init.CLKLastBit)); +// assert_param (IS_USART_HARDWARE_FLOW_CONTROL(husart->Init.HwFlowCtl)); + +#if 1 + if(husart->Instance == USART1) + __HAL_RCC_USART1_RESET(); + else if(husart->Instance == USART2) + __HAL_RCC_USART2_RESET(); +#endif + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + HAL_USART_MspInit(husart); + +// /* Config BaudRate */ +// USART_Config_BaudRate(husart); + + /* Set the USART Communication parameters */ + USART_SetConfig(husart); + + + /* In USART mode, the following bits must be kept cleared: + - LINEN bit in the USART_CR2 register + - HDSEL, SCEN and IREN bits in the USART_CR3 register */ + //CLEAR_BIT(husart->Instance->CR2, USART_CR2_LINEN); + CLEAR_BIT(husart->Instance->CR2, (USART_CR2_SCEN | USART_CR2_HDSEL)); + CLEAR_BIT(husart->Instance->CR1, (USART_CR1_SIREN)); +// /* Set the USART Communication parameters */ +// husart->Instance->CR3 = husart->Init.WordLength | USART_CR3_FEN | husart->Init.StopBits | husart->Init.Parity; +// husart->Instance->CR1 = husart->Init.HwFlowCtl | husart->Init.Mode; +// +// if (husart->Init.Mode == USART_MODE_HALF_DUPLEX) +// { +// SET_BIT(husart->Instance->CR2, USART_CR2_HDSEL); +// } + + __HAL_USART_ENABLE(husart); + + husart->ErrorCode = HAL_USART_ERROR_NONE; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : DeInitialize the USART MSP +* +*@param : husart: usart handle with USART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_USART_MspDeInit(USART_HandleTypeDef *husart) +{ + /* + NOTE : This function is implemented in user xxx_hal_msp.c + */ + + /* Prevent unused argument(s) compilation warning */ + UNUSED(husart); +} + +/****************************************************************************** +*@brief : DeInitialize the USART module +* +*@param : husart: usart handle with USART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_USART_DeInit(USART_HandleTypeDef *husart) +{ + + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); + + /* DeInit the low level hardware : GPIO, CLOCK, NVIC */ + HAL_USART_MspDeInit(husart); + + return HAL_OK; + +} + +/****************************************************************************** +*@brief : Send an amount of data by loop mode within timeout period. +* +*@param : husart: usart handle with USART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to be sent. +*@param : timeout: Timeout duration, unit MS, 1(ms)~~0xFFFFFFFF(wait forever) +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, uint8_t *buf, uint32_t size, uint32_t timeout) +{ + uint16_t *pbuf_16; + uint32_t Start_Tick; + + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); + + if ((buf == NULL) || (size == 0U)) + { + return HAL_ERROR; + } + + + + husart->TxCount = 0; + husart->TxData = buf; + pbuf_16 = (uint16_t *)husart->TxData; + + SET_BIT(husart->Instance->CR1, USART_CR1_TXE); + CLEAR_BIT(husart->Instance->CR1, USART_CR1_RXE);//add 0204 + + Start_Tick = HAL_GetTick(); + + while (size--) + { + if (husart->Init.WordLength == UART_WORDLENGTH_9B) + { + husart->Instance->DR = (uint16_t)(pbuf_16[husart->TxCount++] & 0x01FFU); + } + else + { + husart->Instance->DR = husart->TxData[husart->TxCount++]; + } + while (husart->Instance->FR & USART_FR_TXFF) + { + if ((HAL_GetTick() - Start_Tick) > timeout) + { + return HAL_TIMEOUT; + } + } + } + + HAL_USART_Wait_Tx_Done(husart); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data by loop mode within timeout period. +* +*@param : husart: usart handle with USART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to receive. +*@param : timeout: Timeout duration, unit MS, 1(ms)~~0xFFFFFFFF(wait forever) +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *buf, uint32_t size, uint32_t timeout) +{ + uint16_t *pbuf_16; + uint32_t Start_Tick; + + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); + + if ((buf == NULL) || (size == 0U)) + { + return HAL_ERROR; + } + + husart->RxCount = 0; + husart->RxData = buf; + pbuf_16 = (uint16_t *)husart->RxData; + + /* In case RXE is disabled in transmit funtion */ + SET_BIT(husart->Instance->CR1, USART_CR1_RXE); + + Start_Tick = HAL_GetTick(); + + while (size--) + { + while (husart->Instance->FR & USART_FR_TXFF) + { + if ((HAL_GetTick() - Start_Tick) > timeout) + { + return HAL_TIMEOUT; + } + } + + //husart->Instance->DR = (USART_DUMMY_DATA & (uint16_t)0x1FF); + + husart->Instance->DR = (USART_DUMMY_DATA & 0xFF); + + while(husart->Instance->FR & USART_FR_RXFE) + { + if ((HAL_GetTick() - Start_Tick) > timeout) + { + return HAL_TIMEOUT; + } + } + + /* Store Data in buffer */ + if (husart->Init.WordLength == UART_WORDLENGTH_9B) + { + pbuf_16[husart->RxCount++] = (uint16_t)(husart->Instance->DR & 0x1FFU); + } + else + { + husart->RxData[husart->RxCount++] = (uint8_t)husart->Instance->DR; + } + } + + return HAL_OK; +} + +#if 0 +HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout) +{ + uint8_t *pbuf_8 = NULL; + uint16_t *pbuf_16 = NULL; + uint8_t *prxdata8bits; + uint16_t *prxdata16bits; + uint16_t uhMask; + uint32_t tickstart; + + //if (husart->State == HAL_USART_STATE_READY) + { + if ((pRxData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + + husart->RxCount = 0; + + if (husart->Init.WordLength == USART_WORDLENGTH_9B) + { + pbuf_16 = (uint16_t *) buf; + } + else + { + pbuf_8 = buf; + } + + /* Process Locked */ + //__HAL_LOCK(husart); + + //husart->ErrorCode = HAL_USART_ERROR_NONE; + //husart->State = HAL_USART_STATE_BUSY_RX; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + //husart->RxXferSize = Size; + //husart->RxXferCount = Size; + + /* Computation of USART mask to apply to RDR register */ + //USART_MASK_COMPUTATION(husart); + //uhMask = husart->Mask; + + /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */ + if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) + { + prxdata8bits = NULL; + prxdata16bits = (uint16_t *) pRxData; + } + else + { + prxdata8bits = pRxData; + prxdata16bits = NULL; + } + + /* as long as data have to be received */ + while (husart->RxXferCount > 0U) + { + if (husart->SlaveMode == USART_SLAVEMODE_DISABLE) + { + /* Wait until TXE flag is set to send dummy byte in order to generate the + * clock for the slave to send data. + * Whatever the frame length (7, 8 or 9-bit long), the same dummy value + * can be written for all the cases. */ + if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x0FF); + } + + /* Wait for RXNE Flag */ + if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + + if (prxdata8bits == NULL) + { + *prxdata16bits = (uint16_t)(husart->Instance->RDR & uhMask); + prxdata16bits++; + } + else + { + *prxdata8bits = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU)); + prxdata8bits++; + } + + husart->RxXferCount--; + + } + + /* Clear SPI slave underrun flag and discard transmit data */ + if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) + { + __HAL_USART_CLEAR_UDRFLAG(husart); + __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); + } + + /* At end of Rx process, restore husart->State to Ready */ + husart->State = HAL_USART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(husart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} +#endif +/****************************************************************************** +*@brief : Send an amount of data in interrupt mode. +* +*@param : husart: usart handle with USART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to send. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *husart, uint8_t *buf, uint32_t size) +{ + uint16_t *pbuf_16; + + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); + + if (husart->TxBusy == true) + { + return HAL_BUSY; + } + + if (size == 0 || buf == NULL) + { + return HAL_ERROR; + } + + husart->TxSize = size; + husart->TxCount = 0; + husart->TxData = buf; + husart->TxBusy = true; + + SET_BIT(husart->Instance->CR1, USART_CR1_TXE); + /* Clear TXI Status */ + CLEAR_STATUS(husart->Instance->ISR, USART_ISR_TXI); + /* FIFO Enable */ + SET_BIT(husart->Instance->CR3, USART_CR3_FEN); + /*FIFO Select*/ + __USART_TXI_FIFO_LEVEL_SET(USART_TX_FIFO_1_2); + + for(;;) + { + /*Data Size less than 16Byte */ + if(size == husart->TxCount) + { + husart->TxBusy = false; + + while ((husart->Instance->FR & USART_FR_BUSY)){} + + HAL_USART_TxCpltCallback(husart); + + return HAL_OK; + } + if(READ_BIT(husart->Instance->FR, USART_FR_TXFF)) + { + break; + } + if (husart->Init.WordLength == USART_WORDLENGTH_9B) + { + husart->Instance->DR = (uint16_t)(pbuf_16[husart->TxCount++] & 0x01FFU); + } + else + { + husart->Instance->DR = husart->TxData[husart->TxCount++]; + } + } + + /* Enable TX interrupt */ + SET_BIT(husart->Instance->IE, USART_IE_TXI); + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data in interrupt mode. +* +*@param : husart: usart handle with USART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to receive. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *buf, uint32_t size) +{ + uint16_t *pbuf_16; + + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); + + if (husart->RxBusy == true) + { + return HAL_BUSY; + } + + if (size == 0 || buf == NULL) + { + return HAL_ERROR; + } + + husart->RxSize = size; + husart->RxCount = 0; + husart->RxData = buf; + husart->RxBusy = true; + pbuf_16 = (uint16_t *)husart->RxData; + + SET_BIT(husart->Instance->CR1, USART_CR1_RXE); + /* FIFO Enable */ + SET_BIT(husart->Instance->CR3, USART_CR3_FEN); + /*FIFO Select*/ + __USART_RXI_FIFO_LEVEL_SET(USART_RX_FIFO_1_2); + /* Clear RXI && IDLEI Status */ + CLEAR_STATUS(husart->Instance->ISR, USART_ISR_RXI | USART_ISR_IDLEI); + CLEAR_STATUS(husart->Instance->ISR, UART_ISR_PEI | UART_ISR_BEI | UART_ISR_OEI | UART_ISR_FEI); + /* Enable the USART Errors interrupt */ + SET_BIT(husart->Instance->IE, USART_IE_OEI | USART_IE_BEI | USART_IE_PEI | USART_IE_FEI); + /* Enable RX and RTI interrupt */ + SET_BIT(husart->Instance->IE, USART_IE_RXI | USART_IE_IDLEI); + + return HAL_OK; +} + +#ifdef HAL_DMA_MODULE_ENABLED +/****************************************************************************** +*@brief : Send an amount of data in DMA mode. +* +*@param : husart: usart handle with USART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to send. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *husart, uint8_t *buf, uint32_t size) +{ + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); + + if (husart->TxBusy == true) + { + return HAL_BUSY; + } + + if (size == 0 || buf == NULL) + { + return HAL_ERROR; + } + + husart->TxSize = size; + husart->TxCount = 0; + husart->TxData = buf; + husart->TxBusy = true; + + SET_BIT(husart->Instance->CR1, USART_CR1_TXE); + + SET_BIT(husart->Instance->CR1, USART_CR1_TXDMAE); + + __USART_TXI_FIFO_LEVEL_SET(USART_TX_FIFO_1_16); + + if (HAL_DMA_Start_IT(husart->HDMA_Tx, (uint32_t)buf, (uint32_t)(&husart->Instance->DR), size)) + { + CLEAR_BIT(husart->Instance->CR1, UART_CR1_TXDMAE); + return HAL_ERROR; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Receive an amount of data in DMA mode. +* +*@param : husart: usart handle with USART parameters. +*@param : buf: Pointer to data buffer. +*@param : size: Amount of data elements to receive. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *buf, uint32_t size) +{ + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); + + if (husart->RxBusy == true) + { + return HAL_BUSY; + } + + if (size == 0 || buf == NULL) + { + return HAL_ERROR; + } + + husart->RxSize = size; + husart->RxCount = 0; + husart->RxData = buf; + husart->RxBusy = true; + + /* In case RXE is disabled in transmit funtion */ + SET_BIT(husart->Instance->CR1, USART_CR1_RXE); + + CLEAR_STATUS(husart->Instance->ISR, USART_ISR_IDLEI); + + SET_BIT(husart->Instance->CR1, USART_CR1_RXDMAE); + + __USART_RXI_FIFO_LEVEL_SET(USART_RX_FIFO_1_16); + + SET_BIT(husart->Instance->IE, USART_IE_IDLEI); + + /* Enable the USART Errors interrupt */ + SET_BIT(husart->Instance->IE, USART_IE_OEI | USART_IE_BEI | USART_IE_PEI | USART_IE_FEI); + + if (HAL_DMA_Start_IT(husart->HDMA_Rx, (uint32_t)(&husart->Instance->DR), (uint32_t)buf, size)) + { + CLEAR_BIT(husart->Instance->CR1, UART_CR1_RXDMAE); + CLEAR_BIT(husart->Instance->IE, UART_IE_IDLEI | UART_IE_OEI | UART_IE_BEI | UART_IE_PEI | UART_IE_FEI); + return HAL_ERROR; + } + + return HAL_OK; +} +#endif + +/****************************************************************************** +*@brief : Tx Transfer completed callbacks. +* +*@param : husart: usart handle with USART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart) +{ + /* + NOTE: This function Should be modified, when the callback is needed, + the HAL_USART_TxCpltCallback could be implemented in the user file. + */ +} + +/****************************************************************************** +*@brief : Rx Transfer completed callbacks. +* +*@param : husart: usart handle with USART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart) +{ + /* + NOTE: This function Should be modified, when the callback is needed, + the HAL_USART_RxCpltCallback could be implemented in the user file. + */ +} + +/****************************************************************************** +*@brief : Rx Transfer idleline callbacks. +* +*@param : husart: usart handle with USART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_USART_IdleCallback(USART_HandleTypeDef *husart) +{ + /* + NOTE: This function Should be modified, when the callback is needed, + the HAL_USART_RxCpltCallback could be implemented in the user file. + */ +} + +/****************************************************************************** +*@brief : Recv Error callbacks. +* +*@param : husart: usart handle with USART parameters. +*@return: None +******************************************************************************/ +__weak void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart) +{ + /* + NOTE: This function Should be modified, when the callback is needed, + the HAL_USART_ErrorCallback could be implemented in the user file. + */ +} + + +/****************************************************************************** +*@brief : Return the usart State +* +*@param : husart: usart handle with USART parameters. +*@return: HAL_BUSY or HAL_OK +******************************************************************************/ +HAL_StatusTypeDef HAL_USART_GetState(USART_HandleTypeDef *husart) +{ + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); + + if(husart->TxBusy || husart->RxBusy) + { + return HAL_BUSY; + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Return the usart Error +* +*@param : husart: usart handle with USART parameters. +*@return: usart errcode +******************************************************************************/ +uint32_t HAL_USART_GetError(USART_HandleTypeDef *husart) +{ + return husart->ErrorCode; +} + +#ifdef HAL_DMA_MODULE_ENABLED +/****************************************************************************** +*@brief : Abort ongoing transfers(blocking mode) +* +*@param : husart: usart handle with USART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_USART_Abort(USART_HandleTypeDef *husart) +{ + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); + + /*disble all interrupt*/ + husart->Instance->IE =0x00; + + /* Disable the USART DMA Tx request if enable */ + if(READ_BIT(husart->Instance->CR1, USART_CR1_TXDMAE)) + { + CLEAR_BIT(husart->Instance->CR1, USART_CR1_TXDMAE); + + /* Abort the USART Tx Channel */ + if(husart->HDMA_Tx) + { + /*Set the USART DMA Abort callback to Null */ + husart->HDMA_Tx->XferCpltCallback =NULL; + + if(HAL_DMA_Abort(husart->HDMA_Tx)!=HAL_OK) + { + return HAL_TIMEOUT; + } + } + } + + /* Disable the USART DMA Rx request if enable */ + if(READ_BIT(husart->Instance->CR1, USART_CR1_RXDMAE)) + { + CLEAR_BIT(husart->Instance->CR1, USART_CR1_RXDMAE); + + /* Abort the USART Rx Channel */ + if(husart->HDMA_Rx) + { + /*Set the USART DMA Abort callback to Null */ + husart->HDMA_Rx->XferCpltCallback =NULL; + + if(HAL_DMA_Abort(husart->HDMA_Rx)!=HAL_OK) + { + return HAL_TIMEOUT; + } + } + } + + /*Reset Tx and Rx Transfer size*/ + husart->TxSize = 0; + husart->RxSize = 0; + + /* Restore husart->TxBusy and husart->RxBusy to Ready */ + husart->TxBusy = false; + husart->RxBusy = false; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Pause the USART DMA Transfer +* +*@param : husart: usart handle with USART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *husart) +{ + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); + + if(READ_BIT(husart->Instance->CR1, USART_CR1_TXDMAE)) + { + /* Disable the USART DMA Tx request */ + CLEAR_BIT(husart->Instance->CR1, USART_CR1_TXDMAE); + } + + if (READ_BIT(husart->Instance->CR1, USART_CR1_RXDMAE)) + { + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + CLEAR_BIT(husart->Instance->IE, USART_IE_OEI | USART_IE_PEI | USART_IE_BEI | USART_IE_FEI); + + /* Disable the USART DMA Rx request */ + CLEAR_BIT(husart->Instance->CR1, USART_CR1_RXDMAE); + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Resume the USART DMA Transfer +* +*@param : husart: usart handle with USART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *husart) +{ + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); + + if (husart->TxBusy == false) + { + /* Enable the USART DMA Tx request */ + SET_BIT(husart->Instance->CR1, USART_CR1_TXDMAE); + } + + if (husart->RxBusy == false) + { + /* Reenable PE and ERR (Frame error, noise error, overrun error) interrupts */ + SET_BIT(husart->Instance->IE, USART_IE_OEI | USART_IE_PEI | USART_IE_BEI | USART_IE_FEI); + + /* Enable the USART DMA Rx request */ + SET_BIT(husart->Instance->CR1, USART_CR1_RXDMAE); + } + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Stop the USART DMA Transfer +* +*@param : husart: usart handle with USART parameters. +*@return: HAL_StatusTypeDef +******************************************************************************/ +HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *husart) +{ + assert_param (IS_USART_ALL_INSTANCE(husart->Instance)); + + if(husart->Instance->CR1 & USART_CR1_TXDMAE) + { + CLEAR_BIT(husart->Instance->CR1, USART_CR1_TXDMAE); + if(husart->HDMA_Tx != NULL) + { + HAL_DMA_Abort(husart->HDMA_Tx); + } + + CLEAR_BIT(husart->Instance->IE, (USART_IE_TXI)); + } + + if(husart->Instance->CR1 & USART_CR1_RXDMAE) + { + CLEAR_BIT(husart->Instance->CR1, USART_CR1_RXDMAE); + if(husart->HDMA_Rx != NULL) + { + HAL_DMA_Abort(husart->HDMA_Rx); + } + + CLEAR_BIT(husart->Instance->IE, (USART_IE_RXI | USART_IE_PEI)); + + CLEAR_BIT(husart->Instance->IE, USART_IE_IDLEI); + } + + return HAL_OK; +} +#endif + +/** + * @brief Handle USART Communication Timeout. + * @param husart USART handle. + * @param Flag Specifies the USART flag to check. + * @param Status the Flag status (SET or RESET). + * @param Tickstart Tick start value + * @param Timeout timeout duration. + * @retval HAL status + */ +static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t flag, FlagStatus status, + uint32_t tick_start, uint32_t timeout) +{ + /* Wait until flag is set */ + while ((__HAL_USART_GET_FLAG(husart, flag) ? SET : RESET) == status) + { + /* Check for the Timeout */ + if (timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - tick_start) > timeout) || (timeout == 0U)) + { + //husart->State = HAL_USART_STATE_READY; + + /* Process Unlocked */ + //__HAL_UNLOCK(husart); + + return HAL_TIMEOUT; + } + } + } + return HAL_OK; +} + +/****************************************************************************** +*@brief : Config USART BaudRate +* +*@param : husart: usart handle with USART parameters. +*@return: None +******************************************************************************/ +static void USART_Config_BaudRate(USART_HandleTypeDef *husart) +{ + uint32_t pclk; + uint32_t ibaud, fbaud; + uint64_t tmp; + + if (USART1 == husart->Instance) + { + pclk = HAL_RCC_GetPCLK2Freq(); + } + else + { + pclk = HAL_RCC_GetPCLK1Freq(); + } + + /* Integral part */ + ibaud = pclk / (husart->Init.BaudRate * 16); + + /* Fractional part */ + tmp = pclk % (husart->Init.BaudRate * 16); + tmp = (tmp * 1000000) / (husart->Init.BaudRate * 16); + fbaud = (tmp * 64 + 500000) / 1000000; + + if (fbaud >= 64) + { + MODIFY_REG(husart->Instance->BRR, USART_BRR_IBAUD_Msk, ((ibaud + 1) << USART_BRR_IBAUD_Pos)); + MODIFY_REG(husart->Instance->BRR, USART_BRR_FBAUD_Msk, (0 << USART_BRR_FBAUD_Pos)); + } + else + { + MODIFY_REG(husart->Instance->BRR, USART_BRR_IBAUD_Msk, (ibaud << USART_BRR_IBAUD_Pos)); + MODIFY_REG(husart->Instance->BRR, USART_BRR_FBAUD_Msk, (fbaud << USART_BRR_FBAUD_Pos)); + } +} + +/** + * @brief Configures the USART peripheral. + * @param husart Pointer to a USART_HandleTypeDef structure that contains + * the configuration information for the specified USART module. + * @retval None + */ +static void USART_SetConfig(USART_HandleTypeDef *husart) +{ + uint32_t tmpreg = 0x00U; + uint32_t pclk; + + /* Check the parameters */ + assert_param(IS_USART_POLARITY(husart->Init.CLKPolarity)); + assert_param(IS_USART_PHASE(husart->Init.CLKPhase)); + assert_param(IS_USART_LASTBIT(husart->Init.CLKLastBit)); + assert_param(IS_USART_BAUDRATE(husart->Init.BaudRate)); + assert_param(IS_USART_WORDLENGTH(husart->Init.WordLength)); + assert_param(IS_USART_STOPBITS(husart->Init.StopBits)); + assert_param(IS_USART_PARITY(husart->Init.Parity)); + assert_param(IS_USART_MODE(husart->Init.Mode)); + + /* The LBCL, CPOL and CPHA bits have to be selected when both the transmitter and the + receiver are disabled (TE=RE=0) to ensure that the clock pulses function correctly. */ + CLEAR_BIT(husart->Instance->CR1, (USART_CR1_TXE | USART_CR1_RXE)); + + /*---------------------------- USART CR2 Configuration ---------------------*/ + tmpreg = husart->Instance->CR2; + /* Clear CLKEN, CPOL, CPHA and LBCL bits */ + tmpreg &= (uint32_t)~((uint32_t)(USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_CLKEN | USART_CR2_LBCL)); + /* Configure the USART Clock, CPOL, CPHA and LastBit -----------------------*/ + /* Set CPOL bit according to husart->Init.CLKPolarity value */ + /* Set CPHA bit according to husart->Init.CLKPhase value */ + /* Set LBCL bit according to husart->Init.CLKLastBit value */ + tmpreg |= (uint32_t)(USART_CLOCK_ENABLE | husart->Init.CLKPolarity | + husart->Init.CLKPhase | husart->Init.CLKLastBit); + /* Write to USART CR2 */ + WRITE_REG(husart->Instance->CR2, (uint32_t)tmpreg); + + /*-------------------------- USART CR3 Configuration -----------------------*/ + tmpreg = husart->Instance->CR3; + + /* Clear M, PCE, PS, TE, RE and OVER8 bits */ + tmpreg &= (uint32_t)~((uint32_t)(USART_CR3_WLEN | USART_CR3_PEN | USART_CR3_SPS | USART_CR3_EPS| \ + USART_CR3_STP2)); + + /* Configure the USART Word Length, Parity and mode, stop bits */ + tmpreg |= (uint32_t)husart->Init.WordLength | husart->Init.Parity | husart->Init.StopBits; + + /* Write to USART CR1 */ + WRITE_REG(husart->Instance->CR3, (uint32_t)tmpreg); + + + husart->Instance->CR1 = husart->Init.Mode; + + /* Clear CTSE and RTSE bits */ + CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RTSEN | USART_CR1_CTSEN)); + + USART_Config_BaudRate(husart); +} + +#endif //HAL_USART_MODULE_ENABLED + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_wdt.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_wdt.c new file mode 100644 index 0000000000..5bc9429c90 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_wdt.c @@ -0,0 +1,118 @@ + +/****************************************************************************** +*@file : hal_wdt.c +*@brief : WDT HAL module driver. +******************************************************************************/ + +#include "hal.h" + +#ifdef HAL_WDT_MODULE_ENABLED + + +/****************************************************************************** +*@brief : WDT interrupt request. +*@param : hwdt: pointer to a WDT_HandleTypeDef structure that contains +* the configuration information for the specified WDT module. +*@return: None +******************************************************************************/ +void HAL_WDT_IRQHandler(WDT_HandleTypeDef *hwdt) +{ + /* Check the parameters */ + assert_param(IS_WDT_ALL_INSTANCE(hwdt->Instance)); + + HAL_WDT_Callback(hwdt); +} + + +/****************************************************************************** +*@brief : WDT interrupt callback. +*@param : hwdt: pointer to a WDT_HandleTypeDef structure that contains +* the configuration information for the specified WDT module. +*@return: None +******************************************************************************/ +__weak void HAL_WDT_Callback(WDT_HandleTypeDef *hwdt) +{ + UNUSED(hwdt); +} + +/****************************************************************************** +*@brief : Initialize the WDG according to the specified. +* parameters in the WDG_InitTypeDef of associated handle. +*@param : hwdt: pointer to a WDT_HandleTypeDef structure that contains +* the configuration information for the specified WDT module. +*@return: HAL status +******************************************************************************/ +HAL_StatusTypeDef HAL_WDT_Init(WDT_HandleTypeDef *hwdt) +{ + /* Check the WWDG handle allocation */ + if (hwdt == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_WDT_ALL_INSTANCE(hwdt->Instance)); + assert_param(IS_WDT_PRESCALER(hwdt->Init.Prescaler)); + assert_param(IS_WDT_MODE(hwdt->Init.Mode)); + + HAL_WDT_MspInit(hwdt); + + /* disable the WDT */ + hwdt->Instance->CTRL &= ~WDT_CTRL_EN; + + /* Set WDG Prescaler and Mode*/ + hwdt->Instance->CTRL &= ~(WDT_CTRL_DIVISOR | WDT_CTRL_MODE); + hwdt->Instance->CTRL |= hwdt->Init.Prescaler | hwdt->Init.Mode; + + /* Set WDG load */ + hwdt->Instance->LOAD = hwdt->Init.Load; + + /* Set WDG interrupt clear time */ + if (hwdt->Init.Mode == WDT_MODE_INTERRUPT) + { + assert_param(IS_WDT_INTCLRTIME(hwdt->Init.IntClrTime)); + hwdt->Instance->INTCLRTIME = hwdt->Init.IntClrTime; + } + + /* enable the WDT */ + hwdt->Instance->CTRL |= WDT_CTRL_EN; + + return HAL_OK; +} + +/****************************************************************************** +*@brief : Initialize the WDT MSP. +*@param : hwdt: pointer to a WDT_HandleTypeDef structure that contains +* the configuration information for the specified WDT module. +*@return: None +******************************************************************************/ +__weak void HAL_WDT_MspInit(WDT_HandleTypeDef * hwdt) +{ + UNUSED(hwdt); +} + + + + +/****************************************************************************** +*@brief : Refresh the WDT. +*@param : hwdt: pointer to a WDT_HandleTypeDef structure that contains +* the configuration information for the specified WDT module. +*@return: None +******************************************************************************/ + +/** + * @brief Refresh the WWDG. + * @param hwwdg pointer to a WWDG_HandleTypeDef structure that contains + * the configuration information for the specified WWDG module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_WDT_Refresh(WDT_HandleTypeDef *hwdt) +{ + hwdt->Instance->FEED = WDT_CMD_FEED_WATCHDOG; + + return HAL_OK; +} + +#endif /* HAL_WDT_MODULE_ENABLED */ + diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/SConscript b/bsp/acm32/acm32h5xx-nucleo/libraries/SConscript new file mode 100644 index 0000000000..812c529fde --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/SConscript @@ -0,0 +1,35 @@ +import rtconfig +Import('RTT_ROOT') +from building import * + +# get current directory +cwd = GetCurrentDir() + +src = Split(""" +Device/System_ACM32F4.c +HAL_Driver/Src/HAL_EFlash.c +HAL_Driver/Src/HAL_DMA.c +HAL_Driver/Src/HAL_GPIO.c +HAL_Driver/Src/HAL_UART.c +HAL_Driver/Src/HAL_EXTI.c +""") + + +libpath = ['.', cwd + '/Device', cwd + '/HAL_Driver/Src'] +libs = ['System_Accelerate', 'HAL_EFlash_EX'] + +if rtconfig.PLATFORM in ['gcc']: + src += ['Device/startup_ACM32F4_gcc.s'] +elif rtconfig.PLATFORM in ['armcc', 'armclang']: + src += ['Device/Startup_ACM32F4.s'] +elif rtconfig.PLATFORM in ['iccarm']: + src += ['Device/Startup_ACM32F4_iar.s'] + +path = [cwd + '/HAL_Driver/Inc', + cwd + '/Device', + cwd + '/CMSIS'] + +group = DefineGroup('ACM32_HAL', src, depend = [''], CPPPATH = path, LIBS = libs, LIBPATH = libpath) + +Return('group') + diff --git a/bsp/acm32/acm32h5xx-nucleo/project.ewp b/bsp/acm32/acm32h5xx-nucleo/project.ewp new file mode 100644 index 0000000000..1ddd37ba82 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/project.ewp @@ -0,0 +1,2324 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + ACM32_HAL + + $PROJ_DIR$\libraries\HAL_Driver\Src\HAL_UART.c + + + $PROJ_DIR$\libraries\HAL_Driver\Src\HAL_EXTI.c + + + $PROJ_DIR$\libraries\HAL_Driver\Src\HAL_DMA.c + + + $PROJ_DIR$\libraries\Device\Startup_ACM32F4_iar.s + + + $PROJ_DIR$\libraries\Device\System_ACM32F4.c + + + $PROJ_DIR$\libraries\HAL_Driver\Src\HAL_GPIO.c + + + $PROJ_DIR$\libraries\HAL_Driver\Src\HAL_EFlash.c + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Compiler + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdlib.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstring.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\ctime.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cunistd.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cwchar.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\environ.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_close.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_lseek.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_mem.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_open.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_read.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_remove.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_write.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscalls.c + + + + CPU + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m33\context_iar.S + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m33\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m33\syscall_iar.S + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m33\trustzone.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\core\device.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + + Drivers + + $PROJ_DIR$\drivers\drv_gpio.c + + + $PROJ_DIR$\drivers\board.c + + + $PROJ_DIR$\drivers\drv_uart.c + + + + Finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\scheduler_up.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + POSIX + + diff --git a/bsp/acm32/acm32h5xx-nucleo/project.eww b/bsp/acm32/acm32h5xx-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/project.uvoptx b/bsp/acm32/acm32h5xx-nucleo/project.uvoptx new file mode 100644 index 0000000000..4d4630dcdc --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/project.uvoptx @@ -0,0 +1,1296 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + ACM32H5XX_RTT + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 14 + + + + + + + + + + + BIN\CMSIS_AGDI_V8M.DLL + + + + 0 + UL2V8M + -UV0VVV123 -O206 -S0 -C0 -P00 -N00("ARM CoreSight SW-DP") -D00(1BE12AEB) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20008000 -FC8000 -FN1 -FF0ACM32H5_SPI_FLASH -FS08002000 -FL0FFE000 + + + 0 + CMSIS_AGDI_V8M + -X"CMSIS-DAP Debugger HS" -U202112A1 -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(1BE12AEB) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO3 -FD20008000 -FC8000 -FN1 -FF0ACM32H5_SPI_FLASH -FS08002000 -FL0FFE000 + + + 0 + DLGTARM + (6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + + + + + + + 0 + 1 + gu32_DataBackup + + + 1 + 1 + gu8_EncrptionData + + + 2 + 1 + lp32_Data + + + 3 + 1 + str_GPIOAB + + + 4 + 1 + str_SCU + + + 5 + 1 + gu32_GPIOCD + + + 6 + 1 + gu32_GPIOAB + + + 7 + 1 + gu8_TxBuffer + + + 8 + 1 + UART1_Handle + + + 9 + 1 + gu8_RxBuffer + + + 10 + 1 + DMA1 + + + 11 + 1 + gu32_APBClock,0x0A + + + 12 + 1 + gu32_SystemClock,0x0A + + + 13 + 1 + shell + + + 14 + 1 + new_device + + + 15 + 1 + cfg,0x10 + + + 16 + 1 + serial,0x10 + + + 17 + 1 + GPIO_Init + + + 18 + 1 + index + + + 19 + 1 + g_DebugUart + + + 20 + 1 + uart + + + 21 + 1 + c + + + 22 + 1 + urb + + + 23 + 1 + hport + + + 24 + 1 + g_usbhost_bus + + + 25 + 1 + bus + + + 26 + 1 + chan_intstatus + + + 27 + 1 + g_dwc2_hcd + + + 28 + 1 + ret + + + 29 + 1 + child + + + 30 + 1 + object + + + 31 + 1 + g_usbd_core + + + 32 + 1 + path + + + 33 + 1 + disk + + + 34 + 1 + mnt_parent + + + 35 + 1 + mnt + + + 36 + 1 + msc_class + + + 37 + 1 + g_msc_class + + + + + 1 + 1 + 0x40021000 + 0 + + + + + 2 + 8 + file + 0 + + + + + 3 + 0 + g_msc_buf + 0 + + + + + 4 + 1 + 0x20008668 + 0 + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + ACM32_HAL + 0 + 0 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + .\libraries\Device\Templates\ARM\startup_acm32h5xx.s + startup_acm32h5xx.s + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + .\libraries\Device\system_acm32h5xx.c + system_acm32h5xx.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + .\libraries\Device\system_accelerate.c + system_accelerate.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + .\libraries\HAL_Driver\Src\hal.c + hal.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + .\libraries\HAL_Driver\Src\hal_cortex.c + hal_cortex.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + .\libraries\HAL_Driver\Src\hal_rcc.c + hal_rcc.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_UART.c + HAL_UART.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_DMA.c + HAL_DMA.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_EXTI.c + HAL_EXTI.c + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + libraries\HAL_Driver\Src\HAL_GPIO.c + HAL_GPIO.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + .\libraries\HAL_Driver\Src\hal_fmc.c + hal_fmc.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + .\libraries\HAL_Driver\Src\hal_efuse.c + hal_efuse.c + 0 + 0 + + + + + Applications + 1 + 0 + 0 + 0 + + 2 + 13 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + 2 + 14 + 1 + 0 + 0 + 0 + .\applications\acm32h5xx_it.c + acm32h5xx_it.c + 0 + 0 + + + + + Compiler + 0 + 0 + 0 + 0 + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + CPU + 0 + 0 + 0 + 0 + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 4 + 25 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m33\context_rvds.S + context_rvds.S + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m33\cpuport.c + cpuport.c + 0 + 0 + + + 4 + 27 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m33\syscall_rvds.S + syscall_rvds.S + 0 + 0 + + + 4 + 28 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m33\trustzone.c + trustzone.c + 0 + 0 + + + + + DeviceDrivers + 1 + 0 + 0 + 0 + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion_up.c + completion_up.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion_comm.c + completion_comm.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\condvar.c + condvar.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 5 + 37 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 5 + 38 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 5 + 39 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\pin\dev_pin.c + dev_pin.c + 0 + 0 + + + 5 + 40 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\dev_serial.c + dev_serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 6 + 41 + 1 + 0 + 0 + 0 + drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + drivers\drv_uart.c + drv_uart.c + 0 + 0 + + + 6 + 43 + 1 + 0 + 0 + 0 + .\drivers\drv_dma.c + drv_dma.c + 0 + 0 + + + 6 + 44 + 1 + 0 + 0 + 0 + .\board\board.c + board.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 1 + 0 + 0 + 0 + + 8 + 49 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 8 + 50 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 8 + 53 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 8 + 54 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 8 + 55 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 8 + 56 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 8 + 57 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 8 + 58 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 8 + 59 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_comm.c + scheduler_comm.c + 0 + 0 + + + 8 + 60 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 8 + 61 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + 8 + 62 + 1 + 0 + 0 + 0 + ..\..\..\src\defunct.c + defunct.c + 0 + 0 + + + 8 + 63 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu_up.c + cpu_up.c + 0 + 0 + + + 8 + 64 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstring.c + kstring.c + 0 + 0 + + + 8 + 65 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kstdio.c + kstdio.c + 0 + 0 + + + 8 + 66 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\kerrno.c + kerrno.c + 0 + 0 + + + 8 + 67 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsscanf.c + rt_vsscanf.c + 0 + 0 + + + 8 + 68 + 1 + 0 + 0 + 0 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + rt_vsnprintf_tiny.c + 0 + 0 + + + +
diff --git a/bsp/acm32/acm32h5xx-nucleo/project.uvprojx b/bsp/acm32/acm32h5xx-nucleo/project.uvprojx new file mode 100644 index 0000000000..be42efbc2e --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/project.uvprojx @@ -0,0 +1,791 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + ACM32H5XX_RTT + 0x4 + ARM-ADS + 6160000::V6.16::ARMCLANG + 6160000::V6.16::ARMCLANG + 1 + + + ACM32H5XX + Aisinochip + Aisinochip.ACM32H5XX.1.0.1 + https://www.Aisinochip.com/ + IRAM(0x20008000,0x00050000) IRAM2(0x20000000,0x00008000) IROM(0x08002000,0x001FE000) CPUTYPE("Cortex-M33") FPU3(SFPU) DSP CDECP(0xFF) CLOCK(12000000) ELITTLE + + + UL2V8M(-S0 -C0 -P0 -FD20008000 -FC8000 -FN1 -FF0ACM32H5_SPI_FLASH -FS08002000 -FL01FE000 -FP0($$Device:ACM32H5XX$Flash\ACM32H5_SPI_FLASH.FLM)) + 0 + + + + + + + + + + + $$Device:ACM32H5XX$ACM32H5XX.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\ + ACM32H5XX + 1 + 0 + 1 + 1 + 1 + .\build\keil\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + fromelf.exe --bin --output ./build/ACM32F4.bin ./build/ACM32F4.axf + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + + + + SARMV8M.DLL + + TCM.DLL + -pCM33 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 0 + 1 + 4102 + + 1 + BIN\UL2V8M.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M33" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 255 + 1 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20008000 + 0x50000 + + + 1 + 0x8002000 + 0x1fe000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8002000 + 0x800000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20008000 + 0x50000 + + + 0 + 0x20000000 + 0x8000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 6 + 4 + 1 + 1 + 0 + 0 + 0 + + + RT_USING_LIBC, __STDC_NO_ATOMICS__ , __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_ARM_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, VECT_TAB_SPI_FLASH, __DSP_PRESENT, VECT_TAB_QSPI7_FLASH + + ..\..\..\components\libc\posix\io\poll;..\..\..\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\drivers\include;libraries\HAL_Driver\Inc;libraries\CMSIS;applications;..\..\..\components\drivers\include;libraries\Device;..\..\..\libcpu\arm\common;..\..\..\components\libc\compilers\common\extension\fcntl\octal;.;..\..\..\components\libc\posix\ipc;..\..\..\components\finsh;..\..\..\components\libc\posix\io\epoll;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\posix\io\eventfd;..\..\..\libcpu\arm\cortex-m33;..\..\..\components\drivers\include;..\..\..\components\drivers\include;drivers;.\board;.\drivers\config;.\drivers\Inc;..\..\..\components\gui\lvgl_9_0_0\src\core;..\..\..\components\gui\lvgl_9_0_0\src\draw;..\..\..\components\gui\lvgl_9_0_0\src\draw\acm32_dma2d;..\..\..\components\gui\lvgl_9_0_0\src\font;..\..\..\components\gui\lvgl_9_0_0\src\hal;..\..\..\components\gui\lvgl_9_0_0\src\layouts;..\..\..\components\gui\lvgl_9_0_0\src\layouts\flex;..\..\..\components\gui\lvgl_9_0_0\src\layouts\grid;..\..\..\components\gui\lvgl_9_0_0\src\libs\barcode;..\..\..\components\gui\lvgl_9_0_0\src\libs\bmp;..\..\..\components\gui\lvgl_9_0_0\src\libs\ffmpeg;..\..\..\components\gui\lvgl_9_0_0\src\libs\freetype;..\..\..\components\gui\lvgl_9_0_0\src\libs\fsdrv;..\..\..\components\gui\lvgl_9_0_0\src\libs\gif;..\..\..\components\gui\lvgl_9_0_0\src\libs\png;..\..\..\components\gui\lvgl_9_0_0\src\libs\qrcode;..\..\..\components\gui\lvgl_9_0_0\src\libs\rlottie;..\..\..\components\gui\lvgl_9_0_0\src\libs\sjpg;..\..\..\components\gui\lvgl_9_0_0\src\libs\tiny_ttf;..\..\..\components\gui\lvgl_9_0_0\src\misc;..\..\..\components\gui\lvgl_9_0_0\src\others\file_explorer;..\..\..\components\gui\lvgl_9_0_0\src\others\fragment;..\..\..\components\gui\lvgl_9_0_0\src\others\gridnav;..\..\..\components\gui\lvgl_9_0_0\src\others\ime;..\..\..\components\gui\lvgl_9_0_0\src\others\imgfont;..\..\..\components\gui\lvgl_9_0_0\src\others\monkey;..\..\..\components\gui\lvgl_9_0_0\src\others\msg;..\..\..\components\gui\lvgl_9_0_0\src\others\snapshot;..\..\..\components\gui\lvgl_9_0_0\src\themes\basic;..\..\..\components\gui\lvgl_9_0_0\src\themes\default;..\..\..\components\gui\lvgl_9_0_0\src\themes\mono;..\..\..\components\gui\lvgl_9_0_0\src\themes;..\..\..\components\gui\lvgl_9_0_0\src;..\..\..\components\gui\lvgl_9_0_0\src\widgets\animimg;..\..\..\components\gui\lvgl_9_0_0\src\widgets\arc;..\..\..\components\gui\lvgl_9_0_0\src\widgets\bar;..\..\..\components\gui\lvgl_9_0_0\src\widgets\btn;..\..\..\components\gui\lvgl_9_0_0\src\widgets\btnmatrix;..\..\..\components\gui\lvgl_9_0_0\src\widgets\calendar;..\..\..\components\gui\lvgl_9_0_0\src\widgets\canvas;..\..\..\components\gui\lvgl_9_0_0\src\widgets\chart;..\..\..\components\gui\lvgl_9_0_0\src\widgets\checkbox;..\..\..\components\gui\lvgl_9_0_0\src\widgets\colorwheel;..\..\..\components\gui\lvgl_9_0_0\src\widgets\dropdown;..\..\..\components\gui\lvgl_9_0_0\src\widgets\img;..\..\..\components\gui\lvgl_9_0_0\src\widgets\imgbtn;..\..\..\components\gui\lvgl_9_0_0\src\widgets\keyboard;..\..\..\components\gui\lvgl_9_0_0\src\widgets\label;..\..\..\components\gui\lvgl_9_0_0\src\widgets\led;..\..\..\components\gui\lvgl_9_0_0\src\widgets\line;..\..\..\components\gui\lvgl_9_0_0\src\widgets\list;..\..\..\components\gui\lvgl_9_0_0\src\widgets\menu;..\..\..\components\gui\lvgl_9_0_0\src\widgets\meter;..\..\..\components\gui\lvgl_9_0_0\src\widgets\msgbox;..\..\..\components\gui\lvgl_9_0_0\src\widgets\objx_templ;..\..\..\components\gui\lvgl_9_0_0\src\widgets\roller;..\..\..\components\gui\lvgl_9_0_0\src\widgets\slider;..\..\..\components\gui\lvgl_9_0_0\src\widgets\span;..\..\..\components\gui\lvgl_9_0_0\src\widgets\spinbox;..\..\..\components\gui\lvgl_9_0_0\src\widgets\spinner;..\..\..\components\gui\lvgl_9_0_0\src\widgets\switch;..\..\..\components\gui\lvgl_9_0_0\src\widgets\table;..\..\..\components\gui\lvgl_9_0_0\src\widgets\tabview;..\..\..\components\gui\lvgl_9_0_0\src\widgets\textarea;..\..\..\components\gui\lvgl_9_0_0\src\widgets\tileview;..\..\..\components\gui\lvgl_9_0_0\src\widgets\win;.\applications\lvgl;..\..\..\components\gui\lvgl_9_0_0\env_support\rt-thread;.\packages\CherryUSB-master\class\hub;.\packages\CherryUSB-master\common;.\packages\CherryUSB-master\core;.\packages\CherryUSB-master\port\acm32H5;.\packages\CherryUSB-master\class\hid;.\packages\CherryUSB-master\class\msc;.\packages\CherryUSB-master\class\audio;..\..\..\components\dfs\dfs_v2\include;..\..\..\components\dfs\dfs_v2\src;..\..\..\components\dfs\dfs_v2\filesystems\elmfat;..\..\..\components\dfs\dfs_v2\filesystems\devfs;..\..\..\components\libc\compilers\common\extension\sys + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + + + + C:\Keil\ARM\INC\ARM + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + .\Project_user_xflash.sct + + + + + + + + + + + ACM32_HAL + + + startup_acm32h5xx.s + 2 + .\libraries\Device\Templates\ARM\startup_acm32h5xx.s + + + system_acm32h5xx.c + 1 + .\libraries\Device\system_acm32h5xx.c + + + system_accelerate.c + 1 + .\libraries\Device\system_accelerate.c + + + hal.c + 1 + .\libraries\HAL_Driver\Src\hal.c + + + hal_cortex.c + 1 + .\libraries\HAL_Driver\Src\hal_cortex.c + + + hal_rcc.c + 1 + .\libraries\HAL_Driver\Src\hal_rcc.c + + + HAL_UART.c + 1 + libraries\HAL_Driver\Src\HAL_UART.c + + + HAL_DMA.c + 1 + libraries\HAL_Driver\Src\HAL_DMA.c + + + HAL_EXTI.c + 1 + libraries\HAL_Driver\Src\HAL_EXTI.c + + + HAL_GPIO.c + 1 + libraries\HAL_Driver\Src\HAL_GPIO.c + + + hal_fmc.c + 1 + .\libraries\HAL_Driver\Src\hal_fmc.c + + + hal_efuse.c + 1 + .\libraries\HAL_Driver\Src\hal_efuse.c + + + + + Applications + + + main.c + 1 + applications\main.c + + + acm32h5xx_it.c + 1 + .\applications\acm32h5xx_it.c + + + + + Compiler + + + syscall_mem.c + 1 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + + + syscalls.c + 1 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + + + cctype.c + 1 + ..\..\..\components\libc\compilers\common\cctype.c + + + cstdlib.c + 1 + ..\..\..\components\libc\compilers\common\cstdlib.c + + + cstring.c + 1 + ..\..\..\components\libc\compilers\common\cstring.c + + + ctime.c + 1 + ..\..\..\components\libc\compilers\common\ctime.c + + + cunistd.c + 1 + ..\..\..\components\libc\compilers\common\cunistd.c + + + cwchar.c + 1 + ..\..\..\components\libc\compilers\common\cwchar.c + + + + + CPU + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m33\context_rvds.S + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m33\cpuport.c + + + syscall_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m33\syscall_rvds.S + + + trustzone.c + 1 + ..\..\..\libcpu\arm\cortex-m33\trustzone.c + + + + + DeviceDrivers + + + device.c + 1 + ..\..\..\components\drivers\core\device.c + + + completion_up.c + 1 + ..\..\..\components\drivers\ipc\completion_up.c + + + completion_comm.c + 1 + ..\..\..\components\drivers\ipc\completion_comm.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\ipc\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\ipc\pipe.c + + + condvar.c + 1 + ..\..\..\components\drivers\ipc\condvar.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\ipc\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\ipc\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\ipc\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\ipc\workqueue.c + + + dev_pin.c + 1 + ..\..\..\components\drivers\pin\dev_pin.c + + + dev_serial.c + 1 + ..\..\..\components\drivers\serial\dev_serial.c + + + + + Drivers + + + drv_gpio.c + 1 + drivers\drv_gpio.c + + + drv_uart.c + 1 + drivers\drv_uart.c + + + drv_dma.c + 1 + .\drivers\drv_dma.c + + + board.c + 1 + .\board\board.c + + + + + Finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + msh_parse.c + 1 + ..\..\..\components\finsh\msh_parse.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler_up.c + 1 + ..\..\..\src\scheduler_up.c + + + scheduler_comm.c + 1 + ..\..\..\src\scheduler_comm.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + defunct.c + 1 + ..\..\..\src\defunct.c + + + cpu_up.c + 1 + ..\..\..\src\cpu_up.c + + + kstring.c + 1 + ..\..\..\src\klibc\kstring.c + + + kstdio.c + 1 + ..\..\..\src\klibc\kstdio.c + + + kerrno.c + 1 + ..\..\..\src\klibc\kerrno.c + + + rt_vsscanf.c + 1 + ..\..\..\src\klibc\rt_vsscanf.c + + + rt_vsnprintf_tiny.c + 1 + ..\..\..\src\klibc\rt_vsnprintf_tiny.c + + + + + + + + + + + + + RTE\USB\USBD_Config_MSC_0.h + + + + + + + + + + + project + 0 + 1 + + + + +
diff --git a/bsp/acm32/acm32h5xx-nucleo/project_flash.BAT b/bsp/acm32/acm32h5xx-nucleo/project_flash.BAT new file mode 100644 index 0000000000..81ded61659 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/project_flash.BAT @@ -0,0 +1,152 @@ +SET PATH=C:\Keil_v5\ARM\ARMCLANG\Bin;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin;C:\Program Files (x86)\CodeSourcery\Sourcery_CodeBench_Lite_for_ARM_EABI\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Strawberry\c\bin;C:\Strawberry\perl\site\bin;C:\Strawberry\perl\bin;C:\Program Files\TortoiseSVN\bin;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files\Git\cmd;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Qt\Qt5.12.0\5.12.0\msvc2015_64\bin;C:\Qt\Qt5.12.0\Tools\QtCreator\bin;C:\Program Files\IDM Computer Solutions\UltraEdit;C:\Program Files\CMake\bin;C:\openssl\openssl-1.1.1j;C:\Program Files\NASM;C:\Program Files (x86)\GnuWin32\bin;C:\WinDDK\7600.16385.1\bin\x86\ia64;C:\Program Files\Microsoft VS Code\bin;C:\Program Files (x86)\WinMerge;C:\Users\peter\AppData\Local\Programs\Python\Python38\Scripts\;C:\Users\peter\AppData\Local\Programs\Python\Python38\;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin;C:\Program Files (x86)\Microsoft Visual Studio\Common\Tools\WinNT;C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Program Files (x86)\Microsoft Visual Studio\Common\Tools;C:\Program Files (x86)\Microsoft Visual Studio\VC98\bin;C:\Qt\Qt5.12.0\5.12.0\msvc2015_64\bin;C:\Qt\Qt5.12.0\Tools\QtCreator\bin;C:\openssl\openssl-1.1.1j;C:\Program Files\NASM;C:\Program Files (x86)\GnuWin32\bin;C:\WinDDK\7600.16385.1\bin\x86\ia64;C:\Users\peter\MSYS2;C:\Users\peter\MSYS2\mingw64\bin;C:\Users\peter\MSYS2\mingw32\bin +SET CPU_TYPE=ACM32H5XX +SET CPU_VENDOR=Aisinochip +SET UV2_TARGET=project_flash +SET CPU_CLOCK=0x00B71B00 +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\startup_acm32h5xx._ac" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\main._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\main._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\main.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\app_usbd._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\app_usbd._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\app_usbd.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\app_dcmi._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\app_dcmi._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\app_dcmi.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\app_disp._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\app_disp._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\app_disp.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\app_sdcard._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\APP_SD~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\app_sdcard.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\app_net._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\app_net._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\app_net.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\acm32h5xx_it._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\ACM32H~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\acm32h5xx_it.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\acm32h5xx_hal_msp._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\ACM32H~2._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\acm32h5xx_hal_msp.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\acm32h5xx_coreboard._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\ACM32H~3._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\acm32h5xx_coreboard.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\acm32h5xx_eth_for_cyclone_tcp_mii_lan8710_single_packet._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\ACM32H~4._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\acm32h5xx_eth_for_cyclone_tcp_mii_lan8710_single_packet.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\usbd_core._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\USBD_C~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\usbd_core.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\usbd_ctlreq._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\USBD_C~2._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\usbd_ctlreq.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\usbd_ioreq._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\USBD_I~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\usbd_ioreq.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\usbd_conf._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\USBD_C~3._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\usbd_conf.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\usbd_bulk_transfer._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\USBD_B~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\usbd_bulk_transfer.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\usbd_desc._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\USBD_D~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\usbd_desc.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\bsp_disp._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\bsp_disp._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\bsp_disp.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\bsp_sdcard._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\BSP_SD~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\bsp_sdcard.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\bsp_sdram._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\BSP_SD~2._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\bsp_sdram.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\bsp_usbd._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\bsp_usbd._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\bsp_usbd.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\bsp_dcmi._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\bsp_dcmi._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\bsp_dcmi.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\bsp_i2c._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\bsp_i2c._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\bsp_i2c.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\bsp_ov2640._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\BSP_OV~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\bsp_ov2640.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\hal._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_eth._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\hal_eth._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_eth.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_rcc._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\hal_rcc._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_rcc.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_cortex._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\HAL_CO~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_cortex.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_exti._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\hal_exti._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_exti.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_gpio._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\hal_gpio._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_gpio.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_dma._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\hal_dma._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_dma.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_uart._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\hal_uart._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_uart.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_fmc._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\hal_fmc._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_fmc.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_sdmmc._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\HAL_SD~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_sdmmc.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_dcmi._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\hal_dcmi._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_dcmi.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_dma2d._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\HAL_DM~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_dma2d.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_ltdc._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\hal_ltdc._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_ltdc.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\ll_usb._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\ll_usb._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\ll_usb.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_pcd._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\hal_pcd._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_pcd.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_pcd_ex._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\HAL_PC~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_pcd_ex.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\hal_i2c._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\hal_i2c._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\hal_i2c.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\system_acm32h5xx._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\SYSTEM~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\system_acm32h5xx.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\irq_armv8mml._ac" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\rtx_delay._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\RTX_DE~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\rtx_delay.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\rtx_evflags._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\RTX_EV~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\rtx_evflags.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\rtx_evr._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\rtx_evr._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\rtx_evr.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\rtx_kernel._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\RTX_KE~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\rtx_kernel.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\rtx_lib._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\rtx_lib._ip" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\rtx_lib.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\rtx_memory._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\RTX_ME~1._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\objects\rtx_memory.__i" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @".\listings\rtx_mempool._ll" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmClang.exe" @"listings\RTX_ME~2._IP" +"C:\Keil_v5\ARM\ARMCLANG\Bin\ArmLink" --Via ".\Objects\Project.lnp" +"C:\Keil_v5\ARM\ARMCLANG\Bin\fromelf.exe" ".\Objects\Project.axf" --i32combined --output ".\Objects\Project.hex" diff --git a/bsp/acm32/acm32h5xx-nucleo/rtconfig.h b/bsp/acm32/acm32h5xx-nucleo/rtconfig.h new file mode 100644 index 0000000000..cb8d6d2a14 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/rtconfig.h @@ -0,0 +1,346 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Project Configuration */ + +#define __RT_IPC_SOURCE__ + + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 8 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_HOOK_USING_FUNC_PTR +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 512 +//#define RT_USING_TIMER_SOFT +//#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 512 + +/* kservice optimization */ + +#define RT_USING_DEBUG +#define RT_DEBUGING_COLOR +#define RT_DEBUGING_CONTEXT + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_CPUS_NR 1 +#define RT_USING_DEVICE +#define RT_USING_DEVICE_OPS +#define RT_USING_POSIX_DEVIO +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_BACKTRACE_LEVEL_MAX_NR 32 +#define RT_VER_NUM 0x50002 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 +#define RT_USING_MSH +#define RT_USING_FINSH +#define FINSH_USING_MSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_CMD_SIZE 80 +#define MSH_USING_BUILT_IN_COMMANDS +#define FINSH_USING_DESCRIPTION +#define FINSH_ARG_MAX 10 +#define FINSH_USING_OPTION_COMPLETION + +/* DFS: device virtual file system */ + + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 +#define RT_USING_SERIAL +#define RT_USING_SERIAL_V1 +//#define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN +#define RT_USING_SDRAM +//#define RT_USING_SDMMC + +/* Using USB */ +#define RT_USING_OTG +#ifdef RT_USING_OTG + #define RT_USING_USB_HOST + #ifdef RT_USING_USB_HOST + #define PKG_CHERRYUSB_HOST + #endif + + #define RT_USING_USB_DEVICE + +#endif + + +/* C/C++ and POSIX layer */ + +/* ISO-ANSI C layer */ + +/* Timezone and Daylight Saving Time */ + +#define RT_LIBC_USING_LIGHT_TZ_DST +#define RT_LIBC_TZ_DEFAULT_HOUR 8 +#define RT_LIBC_TZ_DEFAULT_MIN 0 +#define RT_LIBC_TZ_DEFAULT_SEC 0 + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + + +/* Network */ + + +/* Utilities */ + + +/* RT-Thread Utestcases */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + + +/* XML: Extensible Markup Language */ + + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + +//#define PKG_USING_LVGL + #ifdef PKG_USING_LVGL + #define PKG_LVGL_THREAD_PRIO 5 + #define PKG_LVGL_THREAD_STACK_SIZE (1024*16)//4096 + #define PKG_LVGL_DISP_REFR_PERIOD 5 + #define PKG_LVGL_VER_NUM 0x99999 + #define PKG_USING_GUI_GUIDER_DEMO + #endif + +/*info config to spi flash*/ +#define PKG_DISP_UPDATE_REFR_PERIOD 100 + +/* u8g2: a monochrome graphic library */ + + +/* tools packages */ + + +/* system packages */ + +/* enhanced kernel services */ + + +/* acceleration: Assembly language or algorithmic acceleration packages */ + + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + + +/* Micrium: Micrium software products porting for RT-Thread */ + + +/* peripheral libraries and drivers */ + +/* sensors drivers */ + + +/* touch drivers */ + + +/* Kendryte SDK */ + + +/* AI packages */ + + +/* Signal Processing and Control Algorithm Packages */ + + +/* miscellaneous packages */ + +/* project laboratory */ + +/* samples: kernel and components samples */ + + +/* entertainment: terminal games and other interesting software packages */ + + +/* Arduino libraries */ + + +/* Projects and Demos */ + + +/* Sensors */ + + +/* Display */ + + +/* Timing */ + + +/* Data Processing */ + + +/* Data Storage */ + +/* Communication */ + + +/* Device Control */ + + +/* Other */ + + +/* Signal IO */ + + +/* Uncategorized */ + +/* Hardware Drivers Config */ + +#define SOC_ACM32F403RET7 + +/* ACM32F403RET7 */ + +#define SOC_SRAM_START_ADDR 0x20008000 +#define SOC_SRAM_SIZE 320 +#define SOC_FLASH_START_ADDR 0x00000000 +#define SOC_FLASH_SIZE 0x8000 + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +/* Hardware GPIO */ + +#define BSP_USING_GPIOA +#define BSP_USING_GPIOB +#define BSP_USING_GPIOC +#define BSP_USING_GPIOD +#define BSP_USING_GPIOE +#define BSP_USING_GPIOF +#define BSP_USING_GPIOG +#define BSP_USING_GPIOH + + +/* Hardware USART */ + +#define BSP_USING_UART1 +/* +#define BSP_USING_UART2 +#define BSP_UART2_RX_USING_DMA +#define BSP_UART2_TX_USING_DMA +#define BSP_USING_UART3 +#define BSP_UART3_RX_USING_DMA +#define BSP_UART3_TX_USING_DMA +#define BSP_USING_UART4 +#define BSP_UART4_RX_USING_DMA +#define BSP_UART4_TX_USING_DMA +*/ + +/* Hardware I2C */ + + +/* Hardware I2S */ + + +/* Hardware CAN */ + + +/* Hardware TIMER */ + + +/* Hardware LTDC */ + + +/* Hardware DMA2D */ + + +/* Hardware DCMI */ +//#define BSP_USING_DCMI +//#define BSP_USING_OV2640 + + +/* Hardware SDRAM */ +//#define BSP_USING_SDRAM1 + + +/* Hardware WDT */ + + +/* Hardware SPI */ + + +/* Hardware CRYPTO */ + + +/* Hardware memory operation using DMA, include memset() and memcpy() */ +#define RT_USING_HW_MEM_OPERATION + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/acm32/acm32h5xx-nucleo/rtconfig.py b/bsp/acm32/acm32h5xx-nucleo/rtconfig.py new file mode 100644 index 0000000000..55e06a0552 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/rtconfig.py @@ -0,0 +1,144 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m33' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR + +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'/opt/gcc-arm-none-eabi-6_2-2016q4/bin' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armclang' + EXEC_PATH = r'D:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iccarm' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' +#BUILD = 'release' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=' + CPU + ' -mthumb -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,Reset_Handler -T drivers/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armclang': + # toolchains + CC = 'armclang' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu ' + CPU + CFLAGS = ' -xc -std=c99 --target=arm-arm-none-eabi -mcpu=cortex-m33 -mfpu=fpv5-sp-d16 -mfloat-abi=hard -c' + CFLAGS += ' -fno-rtti -funsigned-char -fshort-enums -fshort-wchar -D__MICROLIB -mlittle-endian -ffunction-sections' + + AFLAGS = ' --cpu=Cortex-M33 --fpu=FPv5-SP --li --pd "__MICROLIB SETA 1" --pd "__UVISION_VERSION SETA 531" --pd "ARMCM33_DSP_FP SETA 1"' + + LFLAGS = ' --cpu=Cortex-M33 --info sizes --info totals --info unused --info veneers --list ./build/ACM32F4.map --scatter ./build/ACM32F4.sct' + LFLAGS += ' --library_type=microlib --strict' + LFLAGS += ' --summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols' + + EXEC_PATH += '/ARM/ARMCLANG/bin' + + if BUILD == 'debug': + CFLAGS += ' -gdwarf-3 -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -gdwarf-3 -O1' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iccarm': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --debug' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=' + CPU + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu ' + CPU + AFLAGS += ' --fpu VFPv4_sp' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + CXXFLAGS = CFLAGS + LFLAGS = ' --config "drivers/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' diff --git a/bsp/acm32/acm32h5xx-nucleo/template.ewp b/bsp/acm32/acm32h5xx-nucleo/template.ewp new file mode 100644 index 0000000000..bbd1adf10c --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/template.ewp @@ -0,0 +1,2074 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/template.eww b/bsp/acm32/acm32h5xx-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/acm32/acm32h5xx-nucleo/template.uvoptx b/bsp/acm32/acm32h5xx-nucleo/template.uvoptx new file mode 100644 index 0000000000..6668d384aa --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/template.uvoptx @@ -0,0 +1,321 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + ACM32F4XX + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 7 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 14 + + + + + + + + + + + BIN\CMSIS_AGDI_V8M.DLL + + + + 0 + CMSIS_AGDI_V8M + -X"CMSIS-DAP AISINOCHIP V1.0" -UCMSIS-DAP AISINOCHIP V1.0 -O206 -S10 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(1BE12AEB) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0ACM32F4_eflash -FS00 -FL080000 + + + 0 + UL2V8M + -UV0VVV123 -O206 -S0 -C0 -P00 -N00("ARM CoreSight SW-DP") -D00(1BE12AEB) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0ACM32F4_eflash -FS00 -FL080000 + + + 0 + DLGTARM + (6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + + + + + + 0 + 0 + 69 + 1 +
10834
+ 0 + 0 + 0 + 0 + 0 + 1 + Z:\Aisinochip\rt-thread\bsp\RT_Thread_v3.13\bsp\uart.c + + \\ACM32F4\../RT_Thread_v3.13/bsp/uart.c\69 +
+ + 1 + 0 + 140 + 1 +
21958
+ 0 + 0 + 0 + 0 + 0 + 1 + Z:\Aisinochip\rt-thread\bsp\RT_Thread_v3.13\components\finsh\shell.c + + \\ACM32F4\../RT_Thread_v3.13/components/finsh/shell.c\140 +
+
+ + + 0 + 1 + gu32_DataBackup + + + 1 + 1 + gu8_EncrptionData + + + 2 + 1 + lp32_Data + + + 3 + 1 + str_GPIOAB + + + 4 + 1 + str_SCU + + + 5 + 1 + gu32_GPIOCD + + + 6 + 1 + gu32_GPIOAB + + + 7 + 1 + gu8_TxBuffer + + + 8 + 1 + UART1_Handle + + + 9 + 1 + gu8_RxBuffer + + + 10 + 1 + DMA1 + + + 11 + 1 + gu32_APBClock,0x0A + + + 12 + 1 + gu32_SystemClock,0x0A + + + 13 + 1 + shell + + + + + 1 + 1 + shell + 0 + + + + + 2 + 1 + 0x40010800 + 0 + + + + + 3 + 1 + 0x10080800 + 0 + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + +
+
+ +
diff --git a/bsp/acm32/acm32h5xx-nucleo/template.uvprojx b/bsp/acm32/acm32h5xx-nucleo/template.uvprojx new file mode 100644 index 0000000000..f7bcb79435 --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/template.uvprojx @@ -0,0 +1,401 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + ACM32F4XX + 0x4 + ARM-ADS + 6140000::V6.14::ARMCLANG + 1 + + + ARMCM33_DSP_FP + ARM + ARM.CMSIS.5.7.0 + http://www.keil.com/pack/ + IRAM(0x20000000,0x00020000) IRAM2(0x20200000,0x00020000) IROM(0x00000000,0x00200000) IROM2(0x00200000,0x00200000) CPUTYPE("Cortex-M33") FPU3(SFPU) DSP CLOCK(12000000) ESEL ELITTLE + + + UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000) + 0 + $$Device:ARMCM33_DSP_FP$Device\ARM\ARMCM33\Include\ARMCM33_DSP_FP.h + + + + + + + + + + + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\ + ACM32F4XX + 1 + 0 + 1 + 1 + 1 + .\build\keil\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf.exe --bin --output ./build/ACM32F4.bin ./build/ACM32F4.axf + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + + + + + SARMV8M.DLL + -MPU + TCM.DLL + -pCM33 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 0 + 1 + 4102 + + 1 + BIN\UL2V8M.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M33" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 1 + 1 + 8 + 1 + 1 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x0 + 0x200000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x200000 + + + 1 + 0x200000 + 0x200000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x20200000 + 0x20000 + + + + + + 1 + 2 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 3 + 3 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + + + + + + + + + + + <Project Info> + 0 + 1 + + + + +
-- Gitee From c8706cf6a36004ec671798b24cc27f53c81f98cb Mon Sep 17 00:00:00 2001 From: ynorthwest <11157436+ynorthwest@user.noreply.gitee.com> Date: Fri, 27 Dec 2024 17:05:13 +0800 Subject: [PATCH 2/3] code layout adjust --- .../libraries/Device/System_ACM32F0x0.c | 38 - .../libraries/HAL_Driver/Src/HAL_UART.c | 22 - .../acm32f0x0-nucleo/project.uvguix.aisino | 1905 +++++++++++++++++ bsp/acm32/acm32f0x0-nucleo/project.uvoptx | 10 +- bsp/acm32/acm32f0x0-nucleo/project.uvprojx | 2 +- .../libraries/HAL_Driver/Src/HAL_UART.c | 22 - .../acm32f4xx-nucleo/project.uvguix.aisino | 1860 ++++++++++++++++ bsp/acm32/acm32f4xx-nucleo/project.uvprojx | 6 +- .../applications/lvgl/lv_port_disp.c | 59 +- bsp/acm32/acm32h5xx-nucleo/board/board.c | 43 - bsp/acm32/acm32h5xx-nucleo/drivers/drv_dma.c | 120 -- bsp/acm32/acm32h5xx-nucleo/drivers/drv_gpio.c | 2 - .../libraries/HAL_Driver/Inc/hal.h | 6 +- .../libraries/HAL_Driver/Inc/hal_uart.h | 37 - .../libraries/HAL_Driver/Inc/hal_usart.h | 22 - .../libraries/HAL_Driver/Src/HAL_HCD.c | 28 +- .../libraries/HAL_Driver/Src/LL_USB.c | 7 - .../libraries/HAL_Driver/Src/hal.c | 281 --- .../libraries/HAL_Driver/Src/hal_aes_spi1.c | 4 - .../libraries/HAL_Driver/Src/hal_dma2d.c | 20 +- .../libraries/HAL_Driver/Src/hal_fdcan.c | 134 -- .../libraries/HAL_Driver/Src/hal_lpuart.c | 12 +- .../libraries/HAL_Driver/Src/hal_sdmmc.c | 4 - .../libraries/HAL_Driver/Src/hal_usart.c | 119 +- .../acm32h5xx-nucleo/project.uvguix.aisino | 1860 ++++++++++++++++ bsp/acm32/acm32h5xx-nucleo/project.uvoptx | 6 +- bsp/acm32/acm32h5xx-nucleo/project.uvprojx | 4 +- 27 files changed, 5646 insertions(+), 987 deletions(-) create mode 100644 bsp/acm32/acm32f0x0-nucleo/project.uvguix.aisino create mode 100644 bsp/acm32/acm32f4xx-nucleo/project.uvguix.aisino create mode 100644 bsp/acm32/acm32h5xx-nucleo/project.uvguix.aisino diff --git a/bsp/acm32/acm32f0x0-nucleo/libraries/Device/System_ACM32F0x0.c b/bsp/acm32/acm32f0x0-nucleo/libraries/Device/System_ACM32F0x0.c index 352f93fd59..fff2ffdc38 100644 --- a/bsp/acm32/acm32f0x0-nucleo/libraries/Device/System_ACM32F0x0.c +++ b/bsp/acm32/acm32f0x0-nucleo/libraries/Device/System_ACM32F0x0.c @@ -24,44 +24,6 @@ volatile uint32_t gu32_SystemCount; #define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field. This value must be a multiple of 0x200. */ /******************************************************************************/ -#if 0 -/********************************************************************************* -* Function : HardFault_Handler -* Description : Hard Fault handle, while(1) loop, wait for debug -* Input : none -* Output : none -* Author : xwl -**********************************************************************************/ -void HardFault_Handler(void) -{ - while(1); -} - -/********************************************************************************* -* Function : SysTick_Handler -* Description : System tick handler -* Input : none -* Output : none -* Author : Chris_Kyle -**********************************************************************************/ -void SysTick_Handler(void) -{ - gu32_SystemCount++; -} - -/********************************************************************************* -* Function : System_SysTick_Init -* Description : System Tick Init. Period is 1 ms -* Input : none -* Output : none -* Author : Chris_Kyle -**********************************************************************************/ -void System_SysTick_Init(void) -{ - gu32_SystemCount = 0; - SysTick_Config(gu32_SystemClock / 1000); //1ms/tick -} -#endif /********************************************************************************* * Function : System_SysTick_Off * Description : Turn off System Tick diff --git a/bsp/acm32/acm32f0x0-nucleo/libraries/HAL_Driver/Src/HAL_UART.c b/bsp/acm32/acm32f0x0-nucleo/libraries/HAL_Driver/Src/HAL_UART.c index 7634e6d7d4..3e08ffa55c 100644 --- a/bsp/acm32/acm32f0x0-nucleo/libraries/HAL_Driver/Src/HAL_UART.c +++ b/bsp/acm32/acm32f0x0-nucleo/libraries/HAL_Driver/Src/HAL_UART.c @@ -877,25 +877,3 @@ HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) return HAL_OK; } -#if 0 -/********************************************************************************* -* Function : fputc -* Description : -* Input : -* Output : -* Author : Chris_Kyle Data : 2020 -**********************************************************************************/ -int fputc(int ch, FILE *f) -{ - if (Uart_Debug == NULL) - { - return 0; - } - - Uart_Debug->DR = ch; - - while ((Uart_Debug->FR & UART_FR_BUSY)); - - return ch; -} -#endif diff --git a/bsp/acm32/acm32f0x0-nucleo/project.uvguix.aisino b/bsp/acm32/acm32f0x0-nucleo/project.uvguix.aisino new file mode 100644 index 0000000000..c3ae45a801 --- /dev/null +++ b/bsp/acm32/acm32f0x0-nucleo/project.uvguix.aisino @@ -0,0 +1,1905 @@ + + + + -6.1 + +
### uVision Project, (C) Keil Software
+ + + + + + + + + + 38003 + Registers + 115 88 + + + 346 + Code Coverage + 665 160 + + + 204 + Performance Analyzer + 825 + + + + + + 35141 + Event Statistics + + 200 50 700 + + + 1506 + Symbols + + 56 56 56 + + + 1936 + Watch 1 + + 200 133 133 + + + 1937 + Watch 2 + + 200 133 133 + + + 1935 + Call Stack + Locals + + 200 133 133 + + + 2506 + Trace Data + + 75 135 130 95 70 230 200 150 + + + 466 + Source Browser + 500 + 300 + + + + + + + + 1 + 1 + 0 + 0 + -1 + + + + + + + 44 + 2 + 3 + + -32000 + -32000 + + + -1 + -1 + + + 0 + 349 + 1374 + 525 + + + + 0 + + 651 + 0100000004000000010000000100000001000000010000000000000002000000000000000100000001000000000000002800000028000000010000000400000003000000010000005B433A5C64656C6574655C6769745F746573745C72742D7468726561645C6273705C61636D33325C61636D3332663078302D6E75636C656F5C6C69627261726965735C48414C5F4472697665725C5372635C48414C5F554152542E63000000000A48414C5F554152542E6300000000C5D4F200FFFFFFFF5A433A5C64656C6574655C6769745F746573745C72742D7468726561645C6273705C61636D33325C61636D3332663078302D6E75636C656F5C6C69627261726965735C48414C5F4472697665725C5372635C48414C5F4932432E63000000000948414C5F4932432E6300000000FFDC7800FFFFFFFF5B433A5C64656C6574655C6769745F746573745C72742D7468726561645C6273705C61636D33325C61636D3332663078302D6E75636C656F5C6C69627261726965735C4465766963655C53797374656D5F41434D3332463078302E63000000001253797374656D5F41434D3332463078302E6300000000BECEA100FFFFFFFF55433A5C64656C6574655C6769745F746573745C72742D7468726561645C6273705C61636D33325C61636D3332663078302D6E75636C656F5C6C69627261726965735C434D5349535C636D7369735F61726D63632E68000000000D636D7369735F61726D63632E6800000000F0A0A100FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD50001000000000000000200000013010000660000005605000022020000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + AE0000004F000000F1030000B3000000 + + + 16 + AE00000066000000F1030000CA000000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000000C010000F2010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000000C010000F2010000 + + + 16 + 560000006D0000001F010000F2010000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000000C010000F2010000 + + + 16 + 560000006D0000001F010000F2010000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000000C010000F2010000 + + + 16 + 560000006D0000001F010000F2010000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 03000000260200005305000095020000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000005E010000F1030000D3010000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 199 + 199 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000260200005305000095020000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 35141 + 35141 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000D2000000F2010000 + + + 16 + 560000006D0000001F010000F2010000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000260200005305000095020000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000260200005305000095020000 + + + 16 + 560000006D0000001F010000F2010000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 463 + 463 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000260200005305000095020000 + + + 16 + 560000006D0000001F010000F2010000 + + + + 466 + 466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000260200005305000095020000 + + + 16 + 560000006D0000001F010000F2010000 + + + + 470 + 470 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 560000006D0000004E020000CE000000 + + + + 50000 + 50000 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50001 + 50001 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50002 + 50002 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50003 + 50003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50004 + 50004 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50005 + 50005 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50006 + 50006 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50007 + 50007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50008 + 50008 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50009 + 50009 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50010 + 50010 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50011 + 50011 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50012 + 50012 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50013 + 50013 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50014 + 50014 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50015 + 50015 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50016 + 50016 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50017 + 50017 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50018 + 50018 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 50019 + 50019 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 966 + 0 + 8192 + 0 + + 16 + 0000000000000000D10300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000AE02000056050000C1020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 476 + 0 + 8192 + 1 + + 16 + 000000001C000000E701000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 612 + 0 + 8192 + 2 + + 16 + 00000000380000006F02000054000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 824 + 824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 560000006D00000000010000FA000000 + + + + 3312 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFAE000000B3000000F1030000B7000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000AE00000066000000F1030000CA000000AE0000004F000000F1030000B30000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF430300004F000000470300006B010000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C30000018000400000000000004703000066000000F103000082010000470300004F000000F10300006B01000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF0F0100004F000000130100000B020000010000000200001004000000010000002DFFFFFF78040000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000000000066000000D500000022020000000000004F0000000F0100000B0200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF000000005A010000F10300005E01000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000018000800000000000000000000075010000F1030000EA010000000000005E010000F1030000D301000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFF90100005E010000FD010000D301000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF000000000B020000560500000F020000010000000100001004000000010000000EFEFFFF62000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000000000002602000056050000C5020000000000000F02000056050000AE0200000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657301000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2880 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE8030000000000000000000000000000000000000000000000010000000100000096000000020020500000000011486172644661756C745F48616E646C657296000000000000001400075F5F504B4842540005236966203011486172644661756C745F48616E646C65720373657415757362685F636F6E74726F6C5F7472616E736665720F63616C635F736D325F6469676573740B63616C635F736D325F64690D7365745F7370695F73706565640D73655F736D335F66696E6973680D73655F736D335F7570646174650B73655F736D335F696E69740A7370695F6465696E69740D73655F6170695F6465696E6974107370695F7472616E736665725F6170700E7472616E736665725F6D7574657804646C79620F757362685F6875625F7468726561640B7573625F68635F696E69740E647763325F636F72655F696E69740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 978 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000000941434D333246307830960000000000000001000941434D333246307830000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2373 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1366 + 768 + + + + + + 1 + 0 + + 100 + 3 + + libraries\HAL_Driver\Src\HAL_UART.c + 0 + 857 + 879 + 1 + + 0 + + + libraries\HAL_Driver\Src\HAL_I2C.c + 0 + 1 + 1 + 1 + + 0 + + + libraries\Device\System_ACM32F0x0.c + 53 + 22 + 38 + 1 + + 0 + + + libraries\CMSIS\cmsis_armcc.h + 18 + 708 + 721 + 1 + + 0 + + + + +
diff --git a/bsp/acm32/acm32f0x0-nucleo/project.uvoptx b/bsp/acm32/acm32f0x0-nucleo/project.uvoptx index 75fbc3c919..f7579ffea9 100644 --- a/bsp/acm32/acm32f0x0-nucleo/project.uvoptx +++ b/bsp/acm32/acm32f0x0-nucleo/project.uvoptx @@ -181,7 +181,7 @@ ACM32_HAL - 0 + 1 0 0 0 @@ -345,7 +345,7 @@ 1 14 1 - 0 + 1 0 0 libraries\Device\System_ACM32F0x0.c @@ -481,7 +481,7 @@ DeviceDrivers - 1 + 0 0 0 0 @@ -669,7 +669,7 @@ Drivers - 1 + 0 0 0 0 @@ -865,7 +865,7 @@ Kernel - 1 + 0 0 0 0 diff --git a/bsp/acm32/acm32f0x0-nucleo/project.uvprojx b/bsp/acm32/acm32f0x0-nucleo/project.uvprojx index af94e4bbc0..97e83c10e0 100644 --- a/bsp/acm32/acm32f0x0-nucleo/project.uvprojx +++ b/bsp/acm32/acm32f0x0-nucleo/project.uvprojx @@ -16,7 +16,7 @@ ARMCM0 ARM - ARM.CMSIS.5.8.0 + ARM.CMSIS.5.9.0 http://www.keil.com/pack/ IRAM(0x20000000,0x00020000) IROM(0x00000000,0x00040000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE diff --git a/bsp/acm32/acm32f4xx-nucleo/libraries/HAL_Driver/Src/HAL_UART.c b/bsp/acm32/acm32f4xx-nucleo/libraries/HAL_Driver/Src/HAL_UART.c index 14530ea921..f345210ebc 100644 --- a/bsp/acm32/acm32f4xx-nucleo/libraries/HAL_Driver/Src/HAL_UART.c +++ b/bsp/acm32/acm32f4xx-nucleo/libraries/HAL_Driver/Src/HAL_UART.c @@ -879,26 +879,4 @@ HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) return HAL_OK; } -#if 0 -/********************************************************************************* -* Function : fputc -* Description : -* Input : -* Output : -* Author : Chris_Kyle Data : 2020 -**********************************************************************************/ -__weak int fputc(int ch, FILE *f) -{ - if (Uart_Debug == NULL) - { - return 0; - } - - Uart_Debug->DR = ch; - - while ((Uart_Debug->FR & UART_FR_BUSY)); - - return ch; -} -#endif diff --git a/bsp/acm32/acm32f4xx-nucleo/project.uvguix.aisino b/bsp/acm32/acm32f4xx-nucleo/project.uvguix.aisino new file mode 100644 index 0000000000..3202329daa --- /dev/null +++ b/bsp/acm32/acm32f4xx-nucleo/project.uvguix.aisino @@ -0,0 +1,1860 @@ + + + + -6.1 + +
### uVision Project, (C) Keil Software
+ + + + + + + + + + 38003 + Registers + 115 45 + + + 346 + Code Coverage + 665 160 + + + 204 + Performance Analyzer + 825 + + + + + + 35141 + Event Statistics + + 200 50 700 + + + 1506 + Symbols + + 56 56 56 + + + 1936 + Watch 1 + + 200 133 133 + + + 1937 + Watch 2 + + 200 133 133 + + + 1935 + Call Stack + Locals + + 200 133 133 + + + 2506 + Trace Data + + 75 135 130 95 70 230 200 150 + + + 466 + Source Browser + 500 + 300 + + + + + + + + 1 + 1 + 0 + 0 + -1 + + + + + + + 44 + 2 + 3 + + -32000 + -32000 + + + -1 + -1 + + + 0 + 349 + 1374 + 525 + + + + 0 + + 60 + 010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000000000000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + AE0000004F000000F1030000B3000000 + + + 16 + AE00000066000000F1030000CA000000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000A7000000FE010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000A7000000FE010000 + + + 16 + 2200000039000000EB000000BE010000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 22000000390000001A0200009A000000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 22000000390000001A0200009A000000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 22000000390000001A0200009A000000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 22000000390000001A0200009A000000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 22000000390000001A0200009A000000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 22000000390000001A0200009A000000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 22000000390000001A0200009A000000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 22000000390000001A0200009A000000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 22000000390000001A0200009A000000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000A7000000FE010000 + + + 16 + 2200000039000000EB000000BE010000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000A7000000FE010000 + + + 16 + 2200000039000000EB000000BE010000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000002F02000056050000AE020000 + + + 16 + 22000000390000001A0200009A000000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000005E010000F1030000D3010000 + + + 16 + 22000000390000001A0200009A000000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200005305000095020000 + + + 16 + 22000000390000001A0200009A000000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 22000000390000001A0200009A000000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 22000000390000001A0200009A000000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 22000000390000001A0200009A000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 22000000390000001A0200009A000000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 22000000390000001A0200009A000000 + + + + 35141 + 35141 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 22000000390000001A0200009A000000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000A7000000FE010000 + + + 16 + 2200000039000000EB000000BE010000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200005305000095020000 + + + 16 + 22000000390000001A0200009A000000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200005305000095020000 + + + 16 + 2200000039000000EB000000BE010000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 463 + 463 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200005305000095020000 + + + 16 + 2200000039000000EB000000BE010000 + + + + 466 + 466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200005305000095020000 + + + 16 + 2200000039000000EB000000BE010000 + + + + 470 + 470 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 22000000390000001A0200009A000000 + + + + 50000 + 50000 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50001 + 50001 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50002 + 50002 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50003 + 50003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50004 + 50004 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50005 + 50005 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50006 + 50006 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50007 + 50007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50008 + 50008 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50009 + 50009 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50010 + 50010 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50011 + 50011 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50012 + 50012 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50013 + 50013 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50014 + 50014 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50015 + 50015 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50016 + 50016 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50017 + 50017 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50018 + 50018 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 50019 + 50019 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 966 + 0 + 8192 + 0 + + 16 + 0000000000000000D10300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000AE02000056050000C1020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 476 + 0 + 8192 + 1 + + 16 + 000000001C000000E701000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 612 + 0 + 8192 + 2 + + 16 + 00000000380000006F02000054000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 824 + 824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 2200000039000000CC000000C6000000 + + + + 3312 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFAE000000B3000000F1030000B7000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000AE00000066000000F1030000CA000000AE0000004F000000F1030000B30000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF430300004F000000470300006B010000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C30000018000400000000000004703000066000000F103000082010000470300004F000000F10300006B01000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFAA0000004F000000AE00000017020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000000000066000000AA0000002E020000000000004F000000AA000000170200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF000000005A010000F10300005E01000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000018000800000000000000000000075010000F1030000EA010000000000005E010000F1030000D301000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFF90100005E010000FD010000D301000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF0000000017020000560500001B020000010000000100001004000000010000000EFEFFFF62000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000000000003202000056050000C5020000000000001B02000056050000AE0200000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2900 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000400020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000004000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000004000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE8030000000004000000000000000000000000000000000000010000000100000096000000020020500000000011486172644661756C745F48616E646C65729600000000000000140011486172644661756C745F48616E646C65720523696620300373657415757362685F636F6E74726F6C5F7472616E736665720F63616C635F736D325F6469676573740B63616C635F736D325F64690D7365745F7370695F73706565640D73655F736D335F66696E6973680D73655F736D335F7570646174650B73655F736D335F696E69740A7370695F6465696E69740D73655F6170695F6465696E6974107370695F7472616E736665725F6170700E7472616E736665725F6D7574657804646C79620F757362685F6875625F7468726561640B7573625F68635F696E69740E647763325F636F72655F696E69740A72745F70696E5F6F7073116C765F706F72745F646973705F696E69740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000004001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 978 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000000941434D333246345858960000000000000001000941434D333246345858000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2373 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1366 + 768 + + + + +
diff --git a/bsp/acm32/acm32f4xx-nucleo/project.uvprojx b/bsp/acm32/acm32f4xx-nucleo/project.uvprojx index 017b833936..5d05475bbb 100644 --- a/bsp/acm32/acm32f4xx-nucleo/project.uvprojx +++ b/bsp/acm32/acm32f4xx-nucleo/project.uvprojx @@ -10,14 +10,14 @@ ACM32F4XX 0x4 ARM-ADS - 6160000::V6.16::ARMCLANG - 6160000::V6.16::ARMCLANG + 6150000::V6.15::ARMCLANG + 6150000::V6.15::ARMCLANG 1 ARMCM33_DSP_FP ARM - ARM.CMSIS.5.8.0 + ARM.CMSIS.5.9.0 http://www.keil.com/pack/ IRAM(0x20000000,0x00020000) IRAM2(0x20200000,0x00020000) IROM(0x00000000,0x00200000) IROM2(0x00200000,0x00200000) CPUTYPE("Cortex-M33") FPU3(SFPU) DSP CLOCK(12000000) ESEL ELITTLE diff --git a/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_port_disp.c b/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_port_disp.c index c747e33f4c..c5e302a7f3 100644 --- a/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_port_disp.c +++ b/bsp/acm32/acm32h5xx-nucleo/applications/lvgl/lv_port_disp.c @@ -26,11 +26,7 @@ static struct rt_device_graphic_info info; static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ -#define LVGL_BUF_PIX_SIZE ((LV_HOR_RES_MAX * LV_VER_RES_MAX) / 4) //1/8 full screen - -//static lv_disp_drv_t g_disp_drv; - -//rt_int8_t g_aisinochip_logo_img_buf[LV_HOR_RES_MAX * LV_VER_RES_MAX * (LV_COLOR_DEPTH/8)] SDRAM1_BANK0; +#define LVGL_BUF_PIX_SIZE ((LV_HOR_RES_MAX * LV_VER_RES_MAX) / 4) //1/4 full screen static void lcd_fb_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) @@ -45,54 +41,6 @@ static void lcd_fb_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_colo } -#if 0 -void load_disp_img(void) -{ - static rt_device_t spi_flash_device = RT_NULL; - rt_err_t result; - rt_uint32_t len, addr, offset, rd_pct_size=256; - - spi_flash_device = rt_device_find("spi11"); - if (spi_flash_device == 0) - { - LOG_E("spi_flash_device error!"); - return; - } - - result = rt_device_open(spi_flash_device, 0); - if (result != RT_EOK) - { - LOG_E("error!"); - return; - } - - len = (320*240)*2; - addr = 0; - offset = 0; - - len = (320*240)*2; - addr = (320*240)*2; - offset = 0; - -#if 0 - while(len) - { - result = rt_device_read(spi_flash_device, addr, (dma2d_front_layer_buf+offset), rd_pct_size); - if (result != rd_pct_size) - { - LOG_E("error!"); - return; - } - - offset += rd_pct_size; - addr += rd_pct_size; - len -= rd_pct_size; - } -#endif -} -#endif - - #ifdef rt_align rt_align(RT_ALIGN_SIZE) #else @@ -104,9 +52,6 @@ lv_color_t lv_disp_buf1[LVGL_BUF_PIX_SIZE]; // SDRAM1_BANK2; void lv_port_disp_init(void) { rt_err_t result; -// static lv_color_t lv_disp_buf1[DISP_BUF_SIZE]; - -// load_disp_img(); lcd_device = rt_device_find("lcd"); if (lcd_device == 0) @@ -151,8 +96,6 @@ void lv_port_disp_init(void) /*Finally register the driver*/ lv_disp_drv_register(&disp_drv); - -// g_disp_drv = disp_drv; } diff --git a/bsp/acm32/acm32h5xx-nucleo/board/board.c b/bsp/acm32/acm32h5xx-nucleo/board/board.c index 2becec8ee9..d957a646a7 100644 --- a/bsp/acm32/acm32h5xx-nucleo/board/board.c +++ b/bsp/acm32/acm32h5xx-nucleo/board/board.c @@ -47,7 +47,6 @@ void SysTick_Handler(void) */ void rt_hw_board_init(void) { -#if 1 /* init hal library */ #if (INS_ACCELERATE_ENABLE == 1) System_EnableIAccelerate(); @@ -55,8 +54,6 @@ void rt_hw_board_init(void) #if (DATA_ACCELERATE_ENABLE == 1) System_EnableDAccelerate(); -#endif - #endif HAL_Init(); @@ -81,7 +78,6 @@ void rt_hw_board_init(void) rt_components_board_init(); #endif -#if 1 rt_kprintf("************************************************************\r\n"); rt_kprintf("HCK: %u\r\n", HAL_RCC_GetHCLKFreq()); rt_kprintf("PCLK1: %u\r\n", HAL_RCC_GetPCLK1Freq()); @@ -90,45 +86,6 @@ void rt_hw_board_init(void) rt_kprintf("PCLK4: %u\r\n", HAL_RCC_GetPCLK4Freq()); rt_kprintf("\r\n"); rt_kprintf("************************************************************\r\n"); -#endif - - -#if 1 -{ - GPIO_InitTypeDef GPIO_InitStruct ={0}; - - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - - //SD card power control pin - GPIO_InitStruct.Pin = (GPIO_PIN_4|GPIO_PIN_5); - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Alternate = GPIO_FUNCTION_0; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_1; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, 0); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 0); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 0); - -#if 0 - while(1) - { - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, 0); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 0); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 0); - - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, 1); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 1); - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 1); - } - #endif -} -#endif - } diff --git a/bsp/acm32/acm32h5xx-nucleo/drivers/drv_dma.c b/bsp/acm32/acm32h5xx-nucleo/drivers/drv_dma.c index c5f9b49e2e..27cf1a8d39 100644 --- a/bsp/acm32/acm32h5xx-nucleo/drivers/drv_dma.c +++ b/bsp/acm32/acm32h5xx-nucleo/drivers/drv_dma.c @@ -108,53 +108,10 @@ void *dma_memcpy(void *dst, const void *src, rt_ubase_t count) return dst; } - -#if 0 void *dma_memset(void *s, int c, uint32_t count) { static uint32_t Val; uint32_t cnt=count; -// uint32_t Addr = (((uint32_t)s+3)&(~3)); - rt_base_t level; - - if(0==count) - { - return s; - } - - printf("%08x %08x %08x", s, c, count); -// while(0==(DMAAddr->RAWINTTCSTATUS&(1<INTTCCLR = ((1<INTERRCLR = ((1<CXSRCADDR = &c; - MEMSET_DMA_INSTANCE->CXDESTADDR = s; - MEMSET_DMA_INSTANCE->CXCTRL = (DMA_CXCTRL_RITEN - | (1<CXCONFIG = ((1<<0)|(1<<11)); -// MEMSET_DMA_INSTANCE->CXCONFIG = 1; - - while(0==(DMAAddr->RAWINTTCSTATUS&(1<RAWINTTCSTATUS&(1<INTTCCLR = ((1<INTERRCLR = ((1<=4) - { - MEMSET_DMA_INSTANCE->CXSRCADDR = &Val; - MEMSET_DMA_INSTANCE->CXDESTADDR = Addr; - MEMSET_DMA_INSTANCE->CXCTRL = (DMA_CXCTRL_RITEN - | (1<>2)); -// MEMSET_DMA_INSTANCE->CXCONFIG = ((1<<0)|(1<<11)); - MEMSET_DMA_INSTANCE->CXCONFIG = 1; - } - - if(((uint32_t)s)&3) //head align - { - ((uint8_t *)s)[0] = (uint8_t)c; - ((uint8_t *)s)[1] = (uint8_t)c; - ((uint8_t *)s)[2] = (uint8_t)c; - } - - if(cnt&3) //tail align - { - *((uint8_t *)(Addr+cnt-1)) = (uint8_t)c; - *((uint8_t *)(Addr+cnt-2)) = (uint8_t)c; - *((uint8_t *)(Addr+cnt-3)) = (uint8_t)c; - } - - while(0==(DMAAddr->RAWINTTCSTATUS&(1<Instance; uint32_t USBx_BASE = (uint32_t)USBx; uint32_t i, interrupt; @@ -539,7 +537,6 @@ void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd) } } -#if 1 /* Handle Connection event Interrupt */ if (__HAL_PCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_SRQINT)) { @@ -548,7 +545,6 @@ void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd) __HAL_PCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_SRQINT); } -#endif /* Handle Host Port Interrupts */ if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HPRTINT)) @@ -574,7 +570,6 @@ void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd) interrupt = USB_HC_ReadInterrupt(hhcd->Instance); for (i = 0U; i < hhcd->Init.Host_channels; i++) { -#if 1 if(interrupt&0x01) { if((USBx_HC(i)->HCCHAR & USB_OTG_HCCHAR_EPDIR) == USB_OTG_HCCHAR_EPDIR) @@ -593,20 +588,6 @@ void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd) { break; } - -#else - if((interrupt & (1UL << (i & 0xFU))) != 0U) - { - if ((USBx_HC(i)->HCCHAR & USB_OTG_HCCHAR_EPDIR) == USB_OTG_HCCHAR_EPDIR) - { - HCD_HC_IN_IRQHandler(hhcd, (uint8_t)i); - } - else - { - HCD_HC_OUT_IRQHandler(hhcd, (uint8_t)i); - } - } -#endif } __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_HCINT); } @@ -621,8 +602,6 @@ void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd) USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL); } } - - #endif } /** @@ -1613,10 +1592,7 @@ static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd) * @retval None */ static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd) -{ - -#if 1 - +{ USB_OTG_GlobalTypeDef *USBx = hhcd->Instance; uint32_t USBx_BASE = (uint32_t)USBx; __IO uint32_t hprt0, hprt0_dup; @@ -1692,8 +1668,6 @@ static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd) /* Clear Port Interrupts */ USBx_HPRT0 = hprt0_dup; - -#endif } diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/LL_USB.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/LL_USB.c index 245c2b0980..a64e5eca9e 100644 --- a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/LL_USB.c +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/LL_USB.c @@ -1550,17 +1550,10 @@ HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM; } -#if 0 - /* Enable interrupts matching to the Host mode ONLY */ - USBx->GINTMSK |= (USB_OTG_GINTMSK_PRTIM | USB_OTG_GINTMSK_HCIM | \ - USB_OTG_GINTSTS_DISCINT | \ - USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM); -#else /* Enable interrupts matching to the Host mode ONLY */ USBx->GINTMSK |= (USB_OTG_GINTMSK_PRTIM | USB_OTG_GINTMSK_HCIM | \ USB_OTG_GINTMSK_SOFM | USB_OTG_GINTSTS_DISCINT | \ USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM); -#endif return HAL_OK; } diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal.c index e5e11e5e9c..4329471051 100644 --- a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal.c +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal.c @@ -122,287 +122,6 @@ __attribute__((weak)) HAL_StatusTypeDef HAL_InitTick(uint32_t intPrio, uint32_t return HAL_OK; } -#if 0 - -/****************************************************************************** -*@brief : This function is called to increment a global variable "g_msTick" -* In the default implementation, this variable is incremented each 1ms in SysTick ISR. -* This function is declared as __weak to be overwritten in case of other implementations in user file. -*@param : none -*@return: none -******************************************************************************/ -__attribute__((weak)) void HAL_IncTick(void) -{ - g_msTick += g_systickHandle.msPeriod; -} - - -/****************************************************************************** -*@brief : Provides a tick value in millisecond -* This function is declared as __weak to be overwritten in case of other implementations in user file. -*@return: none -******************************************************************************/ -__attribute__((weak)) uint32_t HAL_GetTick(void) -{ - return (g_msTick); -} - - -/****************************************************************************** -*@brief : Set new SysTick period in ms -*@return: Status -******************************************************************************/ -HAL_StatusTypeDef HAL_SetTickMsPeriod(int msPeriod) -{ - HAL_StatusTypeDef status = HAL_OK; - - if (g_systickHandle.msPeriod != msPeriod) - { - status = HAL_InitTick(g_systickHandle.intPrio, g_systickHandle.msPeriod); - } - - return status; -} - -/****************************************************************************** -*@brief : Return SysTick period -*@return: SysTick period in ms -******************************************************************************/ -uint32_t HAL_GetTickMsPeriod(void) -{ - return g_systickHandle.msPeriod; -} - - -/****************************************************************************** -*@brief : This function provides minimum delay (in milliseconds) based on variable incremented -* This function is declared as __weak to be overwritten in case of other implementations in user file. -*@param : Delay: specifies the delay time length, in milliseconds. -*@return: none -******************************************************************************/ -__attribute__((weak)) void HAL_Delay(uint32_t msDelay) -{ - uint32_t tickstart = HAL_GetTick(); - uint32_t wait = msDelay; - - /* Add a freq to guarantee minimum wait */ - if (wait < (HAL_MAX_DELAY- (uint32_t)(g_systickHandle.msPeriod))) - { - wait += (uint32_t)(g_systickHandle.msPeriod); - } - - while((HAL_GetTick() - tickstart) < wait) - { - } -} - -/****************************************************************************** -*@brief : Suspend Tick increment -*@param : none -*@return: none -******************************************************************************/ -__attribute__((weak)) void HAL_SuspendTick(void) -{ - SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; - SCB->ICSR = SCB_ICSR_PENDSTCLR_Msk; -} - -/****************************************************************************** -*@brief : Resume Tick increment -*@param : none -*@return: none -******************************************************************************/ -__attribute__((weak)) void HAL_ResumeTick(void) -{ - SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; -} - - -/****************************************************************************** -*@brief : SysTickʱʱʱжϹرҲɼʱ100MHzʱʱʱ32룬ʱԴơ -*@param : clks: ʱclks -*@ret : -******************************************************************************/ -void HAL_DelayClks(uint32_t clks) -{ - uint32_t clktickStart, clktickNow; - uint32_t count; - - clktickStart = SysTick->VAL; - count = 0; - while(1) - { - clktickNow = SysTick->VAL; - - if(clktickNow <= clktickStart) - count += clktickStart - clktickNow; - else - count += clktickStart + g_systickHandle.period - clktickNow; - - if(count >= clks) - return; - clktickStart = clktickNow; - } -} - -/****************************************************************************** -*@brief : ΢ʱʱжϹرҲɼʱʱ70ҡ -*@param : us: ʱ΢ -*@ret : -******************************************************************************/ -void HAL_DelayUs(uint32_t us) -{ - while(us>1000000) - { - HAL_DelayClks(g_systickHandle.freq); - us -= 1000000; - } - HAL_DelayClks(g_systickHandle.clkPerUs * us); -} - -/****************************************************************************** -*@brief : ʱʱжϹرҲɼʱʱ49ҡ -*@param : ms: ʱĺ -*@ret : -******************************************************************************/ -void HAL_DelayMs(uint32_t ms) -{ - while(ms>1000) - { - HAL_DelayClks(g_systickHandle.freq); - ms -= 1000; - } - HAL_DelayClks(g_systickHandle.clkPerMs * ms); -} - - -/****************************************************************************** -*@brief : delay񡣻ȡǰtickʼdelay handle -*@param : hdelay: delay handle -*@ret : -******************************************************************************/ -void HAL_StartDelay(HAL_DelayHandleTypeDef *hdelay) -{ - do - { - hdelay->mstickLatest = g_msTick; - hdelay->clktickLatest = SysTick->VAL; - } - while(g_msTick != hdelay->mstickLatest); - - hdelay->clkCount = 0; - hdelay->msCount = 0; -} - -/****************************************************************************** -*@brief : delay -*@param : hdelay: delay handle -*@ret : -******************************************************************************/ -void HAL_UpdateDelay(HAL_DelayHandleTypeDef *hdelay) -{ - uint32_t clktickNow, mstickNow,mstickNext; - - do - { - mstickNow = g_msTick; - clktickNow = SysTick->VAL; - } - while(g_msTick != mstickNow); - - mstickNext = hdelay->mstickLatest + g_systickHandle.msPeriod; - - if(mstickNow < mstickNext) - { - if(clktickNow <= hdelay->clktickLatest) - { - hdelay->clkCount += hdelay->clktickLatest - clktickNow; - } - else - { - hdelay->clkCount += hdelay->clktickLatest + g_systickHandle.period - clktickNow; - } - } - else - { - hdelay->clkCount += hdelay->clktickLatest + g_systickHandle.period - clktickNow; - hdelay->msCount += mstickNow - mstickNext; - } - - hdelay->clktickLatest = clktickNow; - hdelay->mstickLatest = mstickNow; - - if(hdelay->clkCount >= g_systickHandle.period) - { - hdelay->clkCount -= g_systickHandle.period; - hdelay->msCount += g_systickHandle.msPeriod; - } -} - - -/****************************************************************************** -*@brief : delayʼǰʱclkӳ١ʱ70ҡʱжϹرպҲʹá -* ʱжϹرգÿʱҪHAL_UpdateDelay߱1ϣ -* ᵼ·صʱʱʵʱƫС -* ʱжϿûơ -*@param : hdelay: delay handle -*@ret : ΢ӳ -******************************************************************************/ -uint32_t HAL_GetClkDelay(HAL_DelayHandleTypeDef *hdelay) -{ - HAL_UpdateDelay(hdelay); - - return hdelay->clkCount + hdelay->msCount * g_systickHandle.clkPerMs; -} - -/****************************************************************************** -*@brief : delayʼǰʱ΢ӳ١ʱ70ҡʱжϹرպҲʹá -* ʱжϹرգÿʱҪHAL_UpdateDelay߱1ϣ -* ᵼ·صʱʱʵʱƫС -* ʱжϿûơ -*@param : hdelay: delay handle -*@ret : ΢ӳ -******************************************************************************/ -uint32_t HAL_GetUsDelay(HAL_DelayHandleTypeDef *hdelay) -{ - uint32_t us; - HAL_UpdateDelay(hdelay); - - us = (hdelay->clkCount * g_systickHandle.usPer65536Clk ) >> 16; - us += hdelay->msCount * 1000; - return us; -} - -/****************************************************************************** -*@brief : delayʼǰʱĺӳ١ʱжϹرպҲʹá -* ʱжϹرգÿʱҪHAL_UpdateDelay߱1ϣ -* ᵼ·صʱʱʵʱƫС -* ʱжϿûơ -*@param : hdelay: delay handle -*@ret : ӳ -******************************************************************************/ -uint32_t HAL_GetMsDelay(HAL_DelayHandleTypeDef *hdelay) -{ - HAL_UpdateDelay(hdelay); - - return hdelay->msCount; -} - - -/****************************************************************************** -*@brief : Returns the unique device identifier (UID based on 128 bits) -*@param : UID: buffer of uid -*@return: none -******************************************************************************/ -void HAL_GetUID(uint32_t *UID) -{ - ; -} - - -#endif - - /****************************************************************************** *@brief : ͨwhileѭʱ diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_aes_spi1.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_aes_spi1.c index 9ddd354ee4..b4c914fae0 100644 --- a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_aes_spi1.c +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_aes_spi1.c @@ -808,7 +808,6 @@ uint32_t aes_crypt_security_u8( return AES_SPI_PASS; } -#if 1 void aes_crypt_normal( uint32_t *indata, uint32_t *outdata, @@ -907,9 +906,6 @@ void aes_crypt_normal( } -#endif - - void aes_crypt_normal_u8( uint8_t *indata, uint8_t *outdata, diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dma2d.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dma2d.c index 4bedacd3ed..11d610e2e7 100644 --- a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dma2d.c +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_dma2d.c @@ -653,16 +653,6 @@ HAL_StatusTypeDef HAL_DMA2D_CLUTLoad(DMA2D_HandleTypeDef *hdma2d, DMA2D_CLUTCfgT /* Enable the CLUT loading for the foreground */ SET_BIT(hdma2d->Instance->FGPFCCR, DMA2D_FGPFCCR_START); - - -#if 0 -{ - int i; - - for(i=0; i<1024; i++) - ((uint32_t *)(DMA2D_BASE_ADDR+0x0800))[i] = 0; -} -#endif } @@ -1302,15 +1292,7 @@ HAL_StatusTypeDef HAL_DMA2D_ConfigLayer(DMA2D_HandleTypeDef *hdma2d, uint32_t La } /* Configure the foreground DMA2D layer */ else - { - #if 0 - if(pLayerCfg->InputColorMode == DMA2D_INPUT_YCBCR) - { - regValue |= (pLayerCfg->ChromaSubSampling << DMA2D_POSITION_FGPFCCR_CSS); - regMask |= DMA2D_FGPFCCR_CSS; - } - #endif - + { /* Write DMA2D FGPFCCR register */ MODIFY_REG(hdma2d->Instance->FGPFCCR, regMask, regValue); diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_fdcan.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_fdcan.c index 6f81f060af..ac83c22465 100644 --- a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_fdcan.c +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_fdcan.c @@ -222,29 +222,6 @@ HAL_StatusTypeDef HAL_FDCAN_Init(FDCAN_HandleTypeDef *hfdcan) HAL_StatusTypeDef HAL_FDCAN_Start(FDCAN_HandleTypeDef *hfdcan) { -#if 0 - if (hfdcan->State == HAL_FDCAN_STATE_READY) - { - /* Change FDCAN peripheral state */ - hfdcan->State = HAL_FDCAN_STATE_BUSY; - - /* Request leave initialisation */ - __HAL_FDCAN_EXIT_RESET_STATE(hfdcan); - - /* Reset the FDCAN ErrorCode */ - hfdcan->ErrorCode = ERR_FDCAN_NONE; - - /* Return function status */ - return HAL_OK; - } - else - { - /* Update error code */ - hfdcan->ErrorCode |= HAL_FDCAN_ERROR_NOT_READY; - - return HAL_ERROR; - } -#endif /* Request leave initialisation */ __HAL_FDCAN_EXIT_RESET_STATE(hfdcan); @@ -257,78 +234,6 @@ HAL_StatusTypeDef HAL_FDCAN_Start(FDCAN_HandleTypeDef *hfdcan) HAL_StatusTypeDef HAL_FDCAN_Stop(FDCAN_HandleTypeDef *hfdcan) { -#if 0 - uint32_t Counter = 0U; - - if (hfdcan->State == HAL_FDCAN_STATE_BUSY) - { - /* Request initialisation */ - SET_BIT(hfdcan->Instance->CCCR, FDCAN_CCCR_INIT); - - /* Wait until the INIT bit into CCCR register is set */ - while ((hfdcan->Instance->CCCR & FDCAN_CCCR_INIT) == 0U) - { - /* Check for the Timeout */ - if (Counter > FDCAN_TIMEOUT_COUNT) - { - /* Update error code */ - hfdcan->ErrorCode |= HAL_FDCAN_ERROR_TIMEOUT; - - /* Change FDCAN state */ - hfdcan->State = HAL_FDCAN_STATE_ERROR; - - return HAL_ERROR; - } - - /* Increment counter */ - Counter++; - } - - /* Reset counter */ - Counter = 0U; - - /* Exit from Sleep mode */ - CLEAR_BIT(hfdcan->Instance->CCCR, FDCAN_CCCR_CSR); - - /* Wait until FDCAN exits sleep mode */ - while ((hfdcan->Instance->CCCR & FDCAN_CCCR_CSA) == FDCAN_CCCR_CSA) - { - /* Check for the Timeout */ - if (Counter > FDCAN_TIMEOUT_COUNT) - { - /* Update error code */ - hfdcan->ErrorCode |= HAL_FDCAN_ERROR_TIMEOUT; - - /* Change FDCAN state */ - hfdcan->State = HAL_FDCAN_STATE_ERROR; - - return HAL_ERROR; - } - - /* Increment counter */ - Counter++; - } - - /* Enable configuration change */ - SET_BIT(hfdcan->Instance->CCCR, FDCAN_CCCR_CCE); - - /* Reset Latest Tx FIFO/Queue Request Buffer Index */ - hfdcan->LatestTxFifoQRequest = 0U; - - /* Change FDCAN peripheral state */ - hfdcan->State = HAL_FDCAN_STATE_READY; - - /* Return function status */ - return HAL_OK; - } - else - { - /* Update error code */ - hfdcan->ErrorCode |= HAL_FDCAN_ERROR_NOT_STARTED; - - return HAL_ERROR; - } -#endif return HAL_OK; } @@ -336,45 +241,6 @@ HAL_StatusTypeDef HAL_FDCAN_Stop(FDCAN_HandleTypeDef *hfdcan) HAL_StatusTypeDef HAL_FDCAN_ConfigFilter(FDCAN_HandleTypeDef *hfdcan, FDCAN_FilterTypeDef *sFilterConfig) { -#if 0 - assert_param(IS_FDCAN_ALL_INSTANCE(hfdcan->Instance)); - assert_param(IS_FILTER_ID_TYPE(sFilterConfig->IdType)); - assert_param(IS_VALID_FILTER_INDEX(sFilterConfig->FilterIndex)); - - __HAL_FDCAN_ENTER_RESET_STATE(hfdcan); - - //MODIFY_REG(hfdcan->Instance->ACFCR.w, FDCAN_ACFCR_ACFADR_Msk, sFilterConfig->FilterIndex << FDCAN_ACFCR_ACFADR_Pos); - hfdcan->Instance->ACFCR.b.ACFADR = sFilterConfig->FilterIndex; - - /* select ACODE */ - //CLEAR_BIT(hfdcan->Instance->ACFCR.w, FDCAN_ACFCR_SELMASK); - hfdcan->Instance->ACFCR.b.SELMASK = 0; - hfdcan->Instance->ACODR.b.ACM = sFilterConfig->FilerCode & 0x1FFFFFFF; - /* select AMASK */ - //SET_BIT(hfdcan->Instance->ACFCR.w, FDCAN_ACFCR_SELMASK); - hfdcan->Instance->ACFCR.b.SELMASK = 1; - hfdcan->Instance->ACODR.b.ACM = sFilterConfig->FilerMask & 0x1FFFFFFF; - - if(sFilterConfig->IdType == FDCAN_STANDARD_ID) - { - hfdcan->Instance->ACODR.b.AIDEE = 1; - hfdcan->Instance->ACODR.b.AIDE = 0; - } - else if(sFilterConfig->IdType == FDCAN_EXTENDED_ID) - { - hfdcan->Instance->ACODR.b.AIDEE = 1; - hfdcan->Instance->ACODR.b.AIDE = 1; - } - else - { - hfdcan->Instance->ACODR.b.AIDEE = 0; - } - - __HAL_FDCAN_EXIT_RESET_STATE(hfdcan); - - //SET_BIT(hfdcan->Instance->ACFCR.w, sFilterConfig->FilterIndex << FDCAN_ACFCR_AE_Pos); - hfdcan->Instance->ACFCR.b.AE |= 1 << sFilterConfig->FilterIndex; -#endif return HAL_OK; } diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_lpuart.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_lpuart.c index dffd33aeff..f51b72daac 100644 --- a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_lpuart.c +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_lpuart.c @@ -290,7 +290,7 @@ HAL_StatusTypeDef HAL_LPUART_SetBaudRate(LPUART_HandleTypeDef *hlpuart, uint32_t uint32_t bits; uint32_t ClockNum; uint32_t iBaudRate; -#if 1 + const uint16_t fBaudRate[4][13] = { // 0 1 2 3 4 5 6 7 8 9 10 11 12 @@ -299,16 +299,6 @@ HAL_StatusTypeDef HAL_LPUART_SetBaudRate(LPUART_HandleTypeDef *hlpuart, uint32_t {0x0000, 0x0020, 0x0088, 0x0124, 0x0252, 0x02AA, 0x0355, 0x0575, 0x0776, 0x0777, 0x07DF, 0x07FF, 0x0000}, {0x0000, 0x0040, 0x0108, 0x0248, 0x02A4, 0x0554, 0x0AAA, 0x0AEA, 0x0DB6, 0x0EEE, 0x0F7B, 0x0FDF, 0x0FFF},//start+8bit+pol+2end }; -#else - const uint16_t fBaudRate[4][12] = - { -// 0 1 2 3 4 5 6 7 8 9 10 11 12 - {0x0000, 0x0010, 0x0044, 0x0092, 0x00AA, 0x0155, 0x01B6, 0x01DD, 0x01EF, 0x0000, 0x0000, 0x0000},//start+7bit+end - {0x0000, 0x0020, 0x0084, 0x0124, 0x014A, 0x02AA, 0x02B5, 0x036D, 0x03DE, 0x03DF, 0x0000, 0x0000}, - {0x0000, 0x0020, 0x0088, 0x0124, 0x0252, 0x02AA, 0x0355, 0x0575, 0x0776, 0x0777, 0x07DF, 0x0000}, - {0x0000, 0x0040, 0x0108, 0x0248, 0x02A4, 0x0554, 0x0AAA, 0x0AEA, 0x0DB6, 0x0EEE, 0x0F7B, 0x0FDF},//start+8bit+pol+2end - }; -#endif /* Check the parameters */ assert_param(IS_LPUART_HANDLE(hlpuart)); diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sdmmc.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sdmmc.c index aa26c275d3..20355bab3a 100644 --- a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sdmmc.c +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sdmmc.c @@ -724,12 +724,8 @@ HAL_StatusTypeDef HAL_SD_Cmd6_Switch_AM(SDMMC_HandleTypeDef *hsdmmc, uint8_t Acc //bit31: 0-check mode 1-switch mode cmd_arg = ((1UL<<31) | 0x00000000 | (AccessMode<<0) | (3<<12)); //DDR50 mode and 800mA limit -#if 0 - if(0!=(result=HAL_SDMMC_Cmd_NoDat(hsdmmc, CMD6_SWTICH, cmd_arg))) -#else sdmmc_set_blk_size(hsdmmc, 64); if(0!=(result=HAL_SDMMC_Cmd_RdDat(hsdmmc, (CMD6_SWTICH|(1<<9)), cmd_arg, 64, (uint32_t *)tmp_buf))) -#endif { return result; } diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_usart.c b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_usart.c index c7acefd204..44e1b734ea 100644 --- a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_usart.c +++ b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_usart.c @@ -243,12 +243,12 @@ HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart) // assert_param(IS_USART_LASTBIT(husart->Init.CLKLastBit)); // assert_param (IS_USART_HARDWARE_FLOW_CONTROL(husart->Init.HwFlowCtl)); -#if 1 + if(husart->Instance == USART1) __HAL_RCC_USART1_RESET(); else if(husart->Instance == USART2) __HAL_RCC_USART2_RESET(); -#endif + /* Init the low level hardware : GPIO, CLOCK, NVIC */ HAL_USART_MspInit(husart); @@ -437,121 +437,6 @@ HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *buf, u return HAL_OK; } -#if 0 -HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout) -{ - uint8_t *pbuf_8 = NULL; - uint16_t *pbuf_16 = NULL; - uint8_t *prxdata8bits; - uint16_t *prxdata16bits; - uint16_t uhMask; - uint32_t tickstart; - - //if (husart->State == HAL_USART_STATE_READY) - { - if ((pRxData == NULL) || (Size == 0U)) - { - return HAL_ERROR; - } - - - husart->RxCount = 0; - - if (husart->Init.WordLength == USART_WORDLENGTH_9B) - { - pbuf_16 = (uint16_t *) buf; - } - else - { - pbuf_8 = buf; - } - - /* Process Locked */ - //__HAL_LOCK(husart); - - //husart->ErrorCode = HAL_USART_ERROR_NONE; - //husart->State = HAL_USART_STATE_BUSY_RX; - - /* Init tickstart for timeout management */ - tickstart = HAL_GetTick(); - - //husart->RxXferSize = Size; - //husart->RxXferCount = Size; - - /* Computation of USART mask to apply to RDR register */ - //USART_MASK_COMPUTATION(husart); - //uhMask = husart->Mask; - - /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */ - if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE)) - { - prxdata8bits = NULL; - prxdata16bits = (uint16_t *) pRxData; - } - else - { - prxdata8bits = pRxData; - prxdata16bits = NULL; - } - - /* as long as data have to be received */ - while (husart->RxXferCount > 0U) - { - if (husart->SlaveMode == USART_SLAVEMODE_DISABLE) - { - /* Wait until TXE flag is set to send dummy byte in order to generate the - * clock for the slave to send data. - * Whatever the frame length (7, 8 or 9-bit long), the same dummy value - * can be written for all the cases. */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x0FF); - } - - /* Wait for RXNE Flag */ - if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - if (prxdata8bits == NULL) - { - *prxdata16bits = (uint16_t)(husart->Instance->RDR & uhMask); - prxdata16bits++; - } - else - { - *prxdata8bits = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU)); - prxdata8bits++; - } - - husart->RxXferCount--; - - } - - /* Clear SPI slave underrun flag and discard transmit data */ - if (husart->SlaveMode == USART_SLAVEMODE_ENABLE) - { - __HAL_USART_CLEAR_UDRFLAG(husart); - __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST); - } - - /* At end of Rx process, restore husart->State to Ready */ - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} -#endif /****************************************************************************** *@brief : Send an amount of data in interrupt mode. * diff --git a/bsp/acm32/acm32h5xx-nucleo/project.uvguix.aisino b/bsp/acm32/acm32h5xx-nucleo/project.uvguix.aisino new file mode 100644 index 0000000000..8cb193063e --- /dev/null +++ b/bsp/acm32/acm32h5xx-nucleo/project.uvguix.aisino @@ -0,0 +1,1860 @@ + + + + -6.1 + +
### uVision Project, (C) Keil Software
+ + + + + + + + + + 38003 + Registers + 115 45 + + + 346 + Code Coverage + 665 160 + + + 204 + Performance Analyzer + 825 + + + + + + 35141 + Event Statistics + + 200 50 700 + + + 1506 + Symbols + + 56 56 56 + + + 1936 + Watch 1 + + 200 133 133 + + + 1937 + Watch 2 + + 200 133 133 + + + 1935 + Call Stack + Locals + + 200 133 133 + + + 2506 + Trace Data + + 75 135 130 95 70 230 200 150 + + + 466 + Source Browser + 500 + 300 + + + + + + + + 1 + 1 + 0 + 0 + -1 + + + + + + + 44 + 2 + 3 + + -32000 + -32000 + + + -1 + -1 + + + 0 + 349 + 1374 + 525 + + + + 0 + + 60 + 010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000000000000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + AE0000004F000000F1030000B3000000 + + + 16 + 8A000000A10000008202000002010000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000DB00000015020000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000DB00000015020000 + + + 16 + 8A000000A10000005301000026020000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0000000072010000F1030000D3010000 + + + 16 + 8A000000A10000008202000002010000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000A9010000 + + + 16 + 8A000000A10000008202000002010000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000A9010000 + + + 16 + 8A000000A10000008202000002010000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000A9010000 + + + 16 + 8A000000A10000008202000002010000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 4A03000066000000EE030000C3000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 8A000000A10000008202000002010000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 0300000075010000EE030000BA010000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000A9010000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000A9010000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000A9010000 + + + 16 + 8A000000A10000008202000002010000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000A9010000 + + + 16 + 8A000000A10000008202000002010000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000A9010000 + + + 16 + 8A000000A10000008202000002010000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000A9010000 + + + 16 + 8A000000A10000008202000002010000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000DB00000015020000 + + + 16 + 8A000000A10000005301000026020000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000DB00000015020000 + + + 16 + 8A000000A10000005301000026020000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000004602000056050000AE020000 + + + 16 + 8A000000A10000008202000002010000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000005E010000F1030000D3010000 + + + 16 + 8A000000A10000008202000002010000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000049020000EE0300007D020000 + + + 16 + 8A000000A10000008202000002010000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + AE00000063000000F1030000B3000000 + + + 16 + 8A000000A10000008202000002010000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 8A000000A10000008202000002010000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4703000063000000F10300006B010000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0000000072010000F1030000C2010000 + + + 16 + 8A000000A10000008202000002010000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 8A000000A10000008202000002010000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 8A000000A10000008202000002010000 + + + + 35141 + 35141 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + AE00000063000000F1030000B3000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 8A000000A10000008202000002010000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000A7000000BA010000 + + + 16 + 8A000000A10000005301000026020000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0000000046020000F103000096020000 + + + 16 + 8A000000A10000008202000002010000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000049020000EE0300007D020000 + + + 16 + 8A000000A10000005301000026020000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000A9010000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000A9010000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 463 + 463 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000049020000EE0300007D020000 + + + 16 + 8A000000A10000005301000026020000 + + + + 466 + 466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000049020000EE0300007D020000 + + + 16 + 8A000000A10000005301000026020000 + + + + 470 + 470 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000EE0300009A000000 + + + 16 + 8A000000A10000008202000002010000 + + + + 50000 + 50000 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50001 + 50001 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50002 + 50002 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50003 + 50003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50004 + 50004 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50005 + 50005 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50006 + 50006 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50007 + 50007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50008 + 50008 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50009 + 50009 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50010 + 50010 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50011 + 50011 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50012 + 50012 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50013 + 50013 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50014 + 50014 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50015 + 50015 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50016 + 50016 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50017 + 50017 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50018 + 50018 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 50019 + 50019 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE030000EA000000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + 0000000000000000D10300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000AE02000056050000C1020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 32767 + 0 + 8192 + 1 + + 16 + 000000001C000000E701000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 2 + + 16 + 00000000380000006F02000054000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 824 + 824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000075010000EE030000A9010000 + + + 16 + 8A000000A1000000340100002E010000 + + + + 3312 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFAE000000B3000000F1030000B7000000000000000100001004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000008A000000A10000008202000002010000AE0000004F000000F1030000B30000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF430300004F000000470300006B010000000000000200001004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C30000018000400000000000008A000000A1000000340100002E010000470300004F000000F10300006B01000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFDE0000004F000000E20000002E020000010000000200001004000000010000002EFFFFFF79040000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000008A000000A1000000340100002E010000000000004F000000DE0000002E0200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF000000005A010000F10300005E01000000000000010000100400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000018000800000000000008A000000A1000000340100002E010000000000005E010000F1030000D301000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFF90100005E010000FD010000D301000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF000000002E0200005605000032020000010000000100001004000000010000000EFEFFFF62000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF01000077940000018000800000010000008A000000A10000008202000002010000000000003202000056050000AE0200000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2556 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000400020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000004000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000004000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000040000000000000000000000000000000000000100000001000000960000000200205000000000075F5F504B48425496000000000000000100075F5F504B48425400000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000004001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000000000000010000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65FF7F0000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 986 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000002001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000000D41434D3332483558585F525454960000000000000001000D41434D3332483558585F525454000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64FF7F0000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2373 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000000000000100000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000000000000100000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000000000000100000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000000000000100000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F720100000000000000000000000100000001000000000000000000000001000000000000000000054465627567FF7F0000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1366 + 768 + + + + +
diff --git a/bsp/acm32/acm32h5xx-nucleo/project.uvoptx b/bsp/acm32/acm32h5xx-nucleo/project.uvoptx index 4d4630dcdc..796336dcf0 100644 --- a/bsp/acm32/acm32h5xx-nucleo/project.uvoptx +++ b/bsp/acm32/acm32h5xx-nucleo/project.uvoptx @@ -567,7 +567,7 @@ Applications - 1 + 0 0 0 0 @@ -783,7 +783,7 @@ DeviceDrivers - 1 + 0 0 0 0 @@ -1047,7 +1047,7 @@ Kernel - 1 + 0 0 0 0 diff --git a/bsp/acm32/acm32h5xx-nucleo/project.uvprojx b/bsp/acm32/acm32h5xx-nucleo/project.uvprojx index be42efbc2e..863e8e1f13 100644 --- a/bsp/acm32/acm32h5xx-nucleo/project.uvprojx +++ b/bsp/acm32/acm32h5xx-nucleo/project.uvprojx @@ -10,8 +10,8 @@ ACM32H5XX_RTT 0x4 ARM-ADS - 6160000::V6.16::ARMCLANG - 6160000::V6.16::ARMCLANG + 6150000::V6.15::ARMCLANG + 6150000::V6.15::ARMCLANG 1 -- Gitee From cc41a590890d34a4e8179c9f6c4ca655c3f536e2 Mon Sep 17 00:00:00 2001 From: ynorthwest <11157436+ynorthwest@user.noreply.gitee.com> Date: Tue, 31 Dec 2024 10:36:15 +0800 Subject: [PATCH 3/3] add algorithm --- .../HAL_Driver/Src/hal_aes_20230713.lib | Bin 0 -> 35978 bytes .../HAL_Driver/Src/hal_cordic_20231027.lib | Bin 0 -> 37012 bytes .../HAL_Driver/Src/hal_hrng_20230712.lib | Bin 0 -> 8238 bytes .../HAL_Driver/Src/hal_sha1_20230713.lib | Bin 0 -> 21106 bytes .../HAL_Driver/Src/hal_sha256_20230713.lib | Bin 0 -> 11670 bytes .../acm32h5xx-nucleo/project.uvguix.aisino | 1860 ----------------- 6 files changed, 1860 deletions(-) create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_aes_20230713.lib create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_cordic_20231027.lib create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_hrng_20230712.lib create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sha1_20230713.lib create mode 100644 bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sha256_20230713.lib delete mode 100644 bsp/acm32/acm32h5xx-nucleo/project.uvguix.aisino diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_aes_20230713.lib b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_aes_20230713.lib new file mode 100644 index 0000000000000000000000000000000000000000..3b2b0ce578384cce1dccd137300c9915b8fbff1b GIT binary patch literal 35978 zcmd6Q34B!5+4s5k&Yet>$z({_2{?p3LP*#IL`*^mAp{Hwn>I8PAYq~bVh9L`7$YLZ z4aHit>d?2gwN)$B9krlE>t50-wblC4O$C<*bd`C zJI{H}bC!GO&do4%Ms4%T$jp@Sp~NH4#X7Y6912aGrY*uLLWn*>7_a=_F01MqYd4G9 zy7e_{>ej4l-dwYCT~jx{X2VobT3B9FIJ>H*s;*^T-R3TA&El!jNBxGiE8_%f(J_TJ ztLkeL7_D5nVr9*mb*t)X*4MR2gO$yjn_9rF+|b<6;zZ)MiPuXoOO&o%*Sw~-(dEq% z&`9@U7ON+6>_g@3IW=>a*29*4%o#$sxiFDtg)@RMgGpCI7l(6?`5hydgESzVAwm7LBW3${BPRXl-P&D z(=+@>PMiLBVT9cCBsu*l|tg{AhjbXiOX~I2{aNv;qra!PjO* zaGr6kJRj!S|J9hsU(jKQ1;F=^y~9cVb_YF&h&3kEuUaoeZu`HUg!a(O-=&!^-WQDqf&7zU!s znihE(QSt0KG!0QbceyD!L^X6;cw6Mk$d<@v#AdZ$5SiWKu`dXZiab%2-M%^!Ejp+D z+mSs*S?#}z>?#`2E|SgNCiXZJdz^y>3PTdbXcK$f{LdqyS5DtmVeRjDRvZ$cBPWD7 za>5jnmlKccuIaHI`}>smOS~oQb=s-Sc>gome}Ucf&_CZ#8%pv@a-@gQrh8%{xU;Cf zJq*eKRolJ~lnJW3{WvHK)YA6Q=6hluP?harP&TOf?fXD^L6x>22bBbBR(oj6Jux4s zneAav$)KjS?*o+rYEt`gP^qBCw}-C0C*}v0(;fzu25Ln6K2QNrq4wjT(m@SszbA%% zCEL4g*fED38rBgK!En=@ zSsfvxSNP}&@%*)sg44n{965~hbKsvlVdgozw%YS9x^6#qJumic?|Bjb@Hri=tKrXc z9>)H*l2IKVQ=IENhlF9`6VKobEI^3K}Xp&QzOC21s$#7gQtuX z@2Q}7YWRcp@51j#sIx-IOxUztewx09}bN4kT1H#(fcG52bcX@Uj_ve=wdlkGzjAa=tSL1aEg z=nG$RRNMjYUR)KE(SkQ{X9(lfuf0IFEACztOFr!RDA{-sJ8*lm=B1%ZPdX%LDEe>W9?Q%WgxZy;=J}`3gW!}WGdne<}*@8 zh<*%3vbNqeb2itEsURq-B$5rAMCqIF^I5zMxn*HYZ zz}GVREx?Fe(~3Rpv`D6>sbTao`B&J}5o-qX(0bAkdEsB-8gL-edeRh4pnc*rXhZA= z?HBnal#4q$!c|9+rxYhgNh(Li1L?1R?Zb3o9(QtJe}vm>+zlOW2)ydS{T617Uwo93 zdLza(6|*657h_E9^LXsCPEV(zMIrJd>~Uvg@0_qRQceX^D0wy3TQI_RVp&1P^=hm? zc)wt79DSB}h&$XEj=s(l$5+!_pj=~LvOY1|MUk_wP^UibOPn>D#Ej2G4@x>(>lw#P ztkFJQ)@XWsje6s2^f$4ot%x+I04w!LXRTcl3J*N`o7jxQ#<_XzLz##4f{r`5N-)28 ze}s{=FoxE<*dyPK`9kkv)n5ByQgFxd?;J25JRQl4Tpr=Nd?b?ke5hoaTA3A?2j(@w zDaHj!n3W&3SE%`uA8C$!7TF(p{e+S6`U%U@Ek2UiVzO?Hvj;8aam0=LrIRI^XDCO$ZhMQu+P}$X(Nl7=wdWCjf{qof}#WF%S#WI7b9|@zN#K<=G za28d}o?7x#IWKjeoHdb{33selwIhd!6n#k@>FhDs5fR%+v>O*(cxK_lP8NTz_S$L7ruTmp zSH6XjS21R{;_M5ygIysth?+Dy!$ZO1GV|+Pe;iKmGE$z_G5IM8X?3)GI z406LdJQnGRk=J6ry!ANy^B%!DnD-gZz4MkHHFC@jBT&#$e2vKdG3NP#qpUZp!;tm( zspK8puR7>CM65aall7L8;C^)&KdrnQ^RP6bU?q4e@cE)(WkF#qJFf_yDq_P5R)ZVX zRMcUTYq~;l7C8|qxD;buE!z#Lc*|qH8S5iFKO)bc$#dINa-HF>kDo)h%R2Q$4zA*| zCL)qOn%D01=l!FIg;99RabI2$8wuJ>a_CWc#G(!-3ee22yjMrg_=!y3t2-$BuI|+x z3GdYz1^O${Q-vcHj#4-bh@HU|adwB{6WJGa7|CKpKlB?ucEd;5oLm^o36q*VyD&CN zQsyb2iM)}{D~t`#`})7yn*#KvygKG7FYYir=uJ7IDENajl0ey;f|`>@TI5JV^660( zM?q1CCk6c}K${q)kqSpiEb6e65KloxEJx<9BBpcbm7~m7i#n1#6|v!A(2a?KoZYS zSjE6t5JxuimC8s+88VV>;D(1W&m^~j9AdImOiue~yUW<@VrCM?=IS%oFf)*Sa`eg% z^tEySV+E)Ee$U<951>76jP2EK-?N}2Ve93&brd z#JSu-aF05fl2;xvhGiUoO|D^IMKCW7ee_ir)8|XPNuFO1@IBduE^BR6io}-04XpAD{i3SpVa*JH&<&;pFz$Pl%7zy^8$AejQ_M9K6`Qd@9Os-IM@ac4~iiwya2ysKQk(#AmrgT z%zy-jgn=lQX!1l!WJ&o~3E7U^7bP*;Vf@ho5S0$&iIP}?Vx#&nPmc}th1w7c2}4jU zak(c-Vz|Tjq9n#Tj6X_ZDvBYh3IIitTu3NKk(EiXT^pXzrVar*UzD*d>(qggNB53b zWvRmLLG_){9UN;@YB8YcqNT^qa3!|jgItqgJu&~FZ zG2e!$B;=u-J>D{DSV3S;MFIz!!aOgGfRBhK=0Hx_~f<3u>S z4=6<#1>qAoI&y82Xml7~lti<`_`7B1OQK+&nP5bLvpn1ZdLe;|a8i;>2urZTGBMrz z3#H)hgIEbPGz4e7Ji2?X7I_d2;4=Ki7HUq<19=baraM>t5 zsA#(cgQWR_Oo$RW13h8_G^ARjW@41MNopoS zLu#AUOo|dY|2$$6G^BP)&EzQYMyZ($4XN9tW=fQJhty1ghSc3sb6%9V55*(SgN796 zped$Ci9bNW<8f$6?U$NqQR1UgGYuM22c>3ul=x$*nGOx9BT{pIl=za=oDU7DH>74p zl=yS0nE?%{x25KSDDhpXxd0kczmuAoQR4ejGZPw8ToI+KILIXw~dMG~! z7enb`C}|gTRD?+=XWxDLOT&c(ZP@dLYq~V7AncRm;==%^yWHAHg-iytcr>8Gk|c!k z&|#CwL&16=?33h@*8tknLg}f|Sx$saD46nMC-8?-yeI_?ur24Z#O7{C!SW;AjY9iZ zfbU6h1p!~{DSI>~4|hxyS4r4{!fsVXN$o>{f)n@|6i30RjyVc~7qK`BQUg&? zgP=2171aacn4yk5bOgoVN>O^a4D5!O%^|hyc9V3zgd=hoB~5G=y@G>!1&3TEyxCET z`l8RlxVTr4itH#OVGMAi69ba@(St=ih?0f`xLi`iaSX=A+9jnwM@e^SngrUSurHF` zy$bpv58dz1&Mju=*egt4-8p}}7aK%p-_qmKUO~v+U0ckqu^(`vyW@{XMz`)4*? z%Mw?4qS`VE%rJispYXIblc0@FF{xWW??v?gC40~E>F(6fn*>pC$7EdBk{>%{Fa#5#Wzpm(nddHH-CfkOegJlyT%L82}WPW7b+ zA<@+r%IeM@w{$qB$&DyZEPFw%kbajo0ocUZgAB=5NeL)P>spNheJAZGP#V^pGQ4NA(V#>lCd}yma@mc zL-C6ywMSopO^uR|QPShmUO~vSqdF&v=E{Bi2D#J!5@vdAg8z;1Psz3}{vpqfb`OW< zJ%uC9yN5$_4$wxF&LAnJo6E|6Gz<+XU*Q>=J7xlEYA4Mg8Rzg#pFUwGR z7<*cMh=Se`I#6WqNStvPUzEh(9L67|vqjQbx8CKTIgX{=2k|fsB=4f)8y}e)QRJqn zSFmK@Tpl`4d9a$KElEs8k#6lM$pX##q9lto>y45u)ogNQ~0!%io_cIrGmmGiHbo|LE(x-MV3@h*qEpo zA{7+2Br4943JST^;PPn5G1-J2-5)oC=v`B9xYQ(O?$ z$uh;vDD$&P*1a%F2G==XcDxB3p;m3&zXG(WK_?JY5vm7b(IFWUK%<*$5kD;i|kmP%s^+riD5~(%i zwV&+C2=h9FH-q9o5~HZ4l>bIk^#BpFtGXC#w?7-jABC`sP?NjACLMEEtV z85ZZgP825$Lt?|6_c|S1WAy%olwTMn(mm(4ZiZ{4>yXheL!ez(9r@p(;Nv5KpW%3$ zSRo%TWuPJygdr%7f)p>nP!NvB6{LI~sel)G=*uvfOHuIgkf2+sl&u7$vr77%?vMoS zw=znKgNe$7Ptg-bQW+)nISLd6w(Tg`91nN%x!`dxOwi3&#h;-;!AEGilT}et!)2RQ z1ns)}O>zdRIXzoSw@zP{cJ>7?ia68I5K9^F7c$)G2RcsgD953BYYD3QM_c9?(vX*6eU^lcwSGIcdGtQ(c(QG zO8BHARmggzFv6hAE? zM1ZJINv5jZyME zis~oqAf$lVb@vM0mWQ5EWEP-cneubN3KZ<;{wN7&rd9Bn`gRnU5O$%+EuX}0hw;e| zm@hg^_iw)-SB)%WBdbvGft=8YBEL!_(d;n3D2c5OkJYU)AGjZ|~utb5QU}+atf!&T|-Fl*9yw@kghEC_rHqfIM_|ec%S7 z;2St?*29-^m9RJ_tw_m3I|zegxA1g8%5l;v@(cvSLYR)iK2=0Xl{*ST7{yV5kVkh9 z^2xdOu+ZgUq1!{xPiLGMD%~+ux;#|6J#>HdfB`uks@xu`Tpp_29=Z=%DDL5_ojw05 z{qoR#QVkl9Ez>5DtA{`G4-5&nUL^>WS-5&nUL^>X-+#ddE zBAq(%L>j$}5rItG3IzKN3iL7-_rr{zB&@*P%nJuhPdz`??2nbwSIo_{0%Vb@;n2=Z zO$BMELylc7uC{R_lxd``td{2eIqrKVTOI{gP7R?McZxqR#ANCaxd9TIk zEfni~Pts^>yvKK|Hq7@3-(Jm3@OXUpYG$Ix=liy1CVBk6`!zG!6ZHL1GgCaheUEGA zJWqe$Va-hSWcm0Vi0tb$Psn#vGt;q`r64$YJ76sT1(pO?hj<5s-@H}4&ov?qE&*XI z_a(t#49Fmf+dvE=k&OWx2_kJChm8nZ#nma3_egZ6NLg zA+RKccoM}}z6(pq{AM~I!WAL}^PA7$ocBTVE-9FNTqGfHv zU~OTuj`bQy-n1JtJ@O{s=-ZpoY&7}}lt`ogA(ERo?gE>z^Hk7S{sg6^vgwT9!;NgT zR5qG{&D{xI@fU!XjhD*CGgpHDD(aZ?9DYCe739kt-tWb|FZps~5C(K0a|w}%pqLjK zX3$u|tcro0YpozgQnAP|Q@;*RYTkL|ypwgm3pMAFxfCYHV8Ys|r$ETTkZ$^7P7S9` z*zlx2f!358pLFB&d+~y`p%b-IDcqD^vMaOo)IAP666HaE? zuiId<5EDz8^mh6s*X1PG7|Y*B?5T~g_!Eh*gZL{5(R(ZdxDWH{0*8?EN_Of#8HwmS zi;7mGUzJ4a`z`AvmrGJkCE1rYIbG#cs)ou~{w56`brSkxG%FMOm@}1p2v8>UafiPf z{9b0^3CDgQwwnJU|D=p1<8JUWwx=XN*t~VdgH#`s)scS>CzE+dPOQu)V9hCDJ}cFk zxBIbqxcGHxD*r#0tz~iPn1^NEAxsw!^8_YLE(~Sb7J-myJBQmGA7SuQj(O7X3}gj9 z#hppPUyWYDH2pTmtpaaz$m;*2s}E%L!?5N6nO_)oY7i4f?wBPYxMPMqa=UB+E4NG8 z;?H3YfiQ!nM}~+SPhs{lJ*hv_AwC*!gAwsdi6OKZW%deMw|bm7?uHN9jUkMK_y1;& zX{SB`v5esp5Uv=e;g5c03`6OX9|g=~MzRcO9~fj+n7=YS&i*(BoUwcn20C>O>MbYn zEQkgWqW4NphEh|_wo;ROVIODnFqwW~^W66en(b0kZWoQ5Dd&)K%I)f$ayNEPx#!Ve zWBCWHzTBiZ<9)O(r`%U%V;LiYYRc6({0-pclnXody|H=ADOW24%Ge2B2Dn1<@hP`b zR*z4)h$)x+Q?Qm(u3oA$2V|%zr}#45ZOUb`TDCTXd6N6y%^1U9!dT{OIILv82J*^y zFXjn?6y`0k*^LpGSIGxJ@G2P!%1h)+VC5xJx@@KS0Ssvh7NT_d2k52CA#}Ny`bVL^ z7kcS#>OghTT{uWxbU%SadOU|Uj-ZAN;+L3tjQTKLyp4z+L$I=mTXfV?|2Fl1LlY*R z3`qTkgb-rX8!OPIUF6(E$0$zr`*9rZP;N`7_ z!#kng>4Ycu?XX~Y*$i)&M|X>gL%i7|lk3Y? zA>JZ+BsWV&xLZ~S8{)Md+c#Uw%!T!D$=@z{=jvP`gUX}$A*YeKFq7l`Lyyec4d7)^ z4?Fzp;AK$z9sBfQDyRcaPz%A!y!|LKs7GY=cu2#< zLf{I;?}bn968d-%^cyJr8jPP{^g-EsDEzjA-{A0@r7uvtut{;*y@?7Y?Z#H=F`on`)0v_BWcyP_}2+Ol`8B?T~wQfz*y0vv{Tc(E!o7aTMHZ;~X zhw9fghi0!?QMYPU-Kx-(-27>wMeEizP7l>KuUXkxyLNTxE0gQao49gCUfyz%n>)VC z|HaJ>8|#|akLT|tIrR9d=9Sg@_m5VJ;_1~D&Fe0$TiLR{y12P^^}4k+rIV}kbLUos zP_dzYGw8xu^CwOyoxE&W4c$}~&#P%(x2CgNr+U`9=DMPFwau%lXK$)q)6`hEz8XI@ z6&e>p9h@5*R;;dDTfGWDP*pv@c;2|e%K7RSnexSkwd)&JuSFLd*0zWZI8B^T)1tK9 zf4`}6R;8${suYE#Mfo*zD=MoNNqT~do*1Vq;x_rBu#=fUrn5#xk-NquU3=E7%6x&- z1pN75WzDRTIhA78+<3#Y=FMIZZ#mA;kz$kPLrlO#9P6AtoBuuBvUR73(&%NaU}Ebq@c^NNuwm|EU;$=SR&}uG@e)A!+=o z8ELw5|CpF)lAb7b|N2?e`sS5Tt#1*Hb!$aKw`%&=#$0vWzb*Dpe<4lR|MDM3OZb5^ z*N>U$pGMPOoF7d4&wummvbxO;YX#0V?Ctt1YMW|+&2{THG`5K5wX0MH*KSxNTI$v` z)vVZ1UtiZOYHA8AD+@2KshWGq?3zUvSIn-d!52@?7}cz}Osr^JxAHRSa$Qqhb8Sn* zI;3)=XewUcQp{m&!hRwN=@gokEzLFS#7YcPyoYj#>lH4`TaZ?B~JK9Ovt_yVGrkzw{W`-pxhZ#(>$&~8uwkH<_rt+hgK6v4C*W(57Z1voByg>G72Y(YKuW%ynP;2cdOI`MHr?kkDao}B?|6J(F^tZNt%hNns2K2N z+r7QHw!h2{pt5(Y?a#9V6y#EnOpW!IZB$v?jWVzGw{5v3;BtW-D8=)3+h5Le01-%9 zR;E7BG!vTKC7bMH2hP}LsnblEY}a)*y`{Es>A>n{aHW?DKua_K&med3IW!ZC~fL ze!Z>CPVrg~7;RqbEzs#+Yrk>OwkO(YW9;p@%3!X^#XQPIq^jisV?2Uk`Qs`0<>tfpR;^dQr65BjD9W0)}-#@40s03ap%OVp4wj z{$y>xntPOW%EVH=?B3x19{{p$rJyxuz)oECuO{SM783H`TkBc>21IUHecQUExJ>bcu(V_}zt^t8pD^Icnbtsiea1{c;5 ztBl+;Tkqw5`8xdhqfy)bw%2-aD{|$vK7h!!4qYwHehrx|Tg}8wPg{*<<~+;#Z*Fbl z-nZYXw=HWFSJ%aDq%Z>C-zvAx9oRaPtT)Yr-g{wrS>9MX!`ei{)Ur9S+=Pa$hcOjw zYoB?LF5PWK(3YKwY^HhHv+L}%OVQsM_0OWxH!u?hS?`-|tL!^X%e06-HOY6tj+s z`f_W#oX%x-7B*g7n=?==OKo#*OfI*x#@HG8c5||VZIdiPHkiulp7;(^L z4((;%4%wOCvInDeVf_>>46>d=XuYt85gNtl?`0gvKI|^V^X$R%>_Kzm+#qxd_ONR} zS{NnP!4VJE%QIKDfhaS533nead7yvdN@tzC;=yKU;r_j37h-+FQ@dfb8AlO(V813TB-W*tK!a20sla|}}pYFG1Y zh7(FPgEkH!-G1viWGn!u{(4TpL$clHWV_HqF02Dv>N#N^W?#KlyK5XG>@0hj$^;-` zAiJRT5SEY(DHlm>Gul)V<(MWWQQ6gZ3!Qh_I$KVdNRRiRDAdc`sQYN)BHZn1}~U5Z(b!fQ|uqPb_mXfAQ*hy zaFIEXhF~zH%-V_QGBItyr9X}Bh&S4}FYf`d5HjJ@%EelI8XcIAt}L)Kb8LGDOYY7jtg)w& z+lAO-zKZ~GNqip*QC7FDufT^jBG(>14ay>V3>2(FhiFZS1n|HFWs;yKD*P%gH6Ne*V zvbpA6oaFdhjXgVNmrQTM72%E~tgRE9@QDy>>zhd!;y+^8F>UWj%C%=+E2ryB-qxVy zE@-{$Sl;QAJIM!E;Npu7#V7ZIhp)JoqyB3jCk;NZVbAygnqK903I{I0`?Fs8_E76m zG6N+OSU?fZskpbcmX_I-d3GPPTZ#62!n2JW*DYsmsIB`4&fAiC{qhw=Rz++p553)p z;k_pr8#9{SZYOW&zVgmS)Wjy7-1R>5u`acrXYIqNjoFTR&p7p7QuXkVqU$kCeHlWz zN1Wn&iSfh2V~tzz45;%^-=rvkCA?yLf*vmcxDE?%=wF_o$G5|-!@^TJz6H~HxSv|# zH6{F=)Vu^ep9^*#7Ji;>YJwhLle-QJ|ER~f1U?Mu7GBs`mY~n;qMs;cC+H`3(N7T*67+m>*m+oZot|&9bsp0@Nl;d|{$AKcU)Y5& z?!uRJ;mf-4YoQ@m}A9#V94{?YlfL8W-EI>W6dxp%D>Q|J}mhu!Vf$0e2$u7 zP8S=&^C0vxXNr{|NNc_V1m8^3`~@Jm>NF2h3pj1MfUI{3kox0F4!0twpYuZ<)N|!g&m#x#K5PV1 zz6D76{lJvT&Y$g5&iE+jm-v+P%WdM16dnZ9?l6#c{8F8I#zTBiA>4=@ypSRhZ;nXB zYae4lq+q#~68Vw=j+~)Ne!dU|;8Uhi3i&W+Jn>0Mj02Bn6Y{6Lh$GQH@gjwn5i!1R zD!dqV$hRrvi^RD56+cy&jQL1@0uh7!4TZl_NZ%&r#kmSgh?pPi6dq9cn!*o=m@k9y zQYNub;cA6F)LE`_weoQV1PoWhet%%3sH3Go(%{qda&`5P5Jt8g&-O!+$sM`t?x0)=}N zKBdr$oY1~P;Y)oSz5%gN&L21Urtm|B0mM%G|57+(pu?Y1xEMO>FDGI> z{8Hf(T#CsbP#9BqA!L;QUSS#5j*0TH!laPH=PA5c;r$BVP0#FBBI=PfYpj`P`FXywF-ADyhkDbVubadPe4dHHCL5}>_@cts6~3wPU4`=cgL4xr(2!_=^?4T=8p&Xm5wYJxc$5#Xqk2 zLkeG4a(VqjT%VA~rtxPY+Oxbs$dicRGZo)Y@xv59O7T+^7Abj&;wu%uMDZ&WU$6LP zg>6K%e~Z$8NAW*W{0l@}Bi>Z}Zxnt&M0_0z<#if-GOxqHUJA1mj#4;5;Y=c~HS&56 z`$gnO;ySDJs}vtme2d~YDSo@+cPjpN#qU-8_Y^*^@OhCjS?Q-KezxN0Dt@uzFIId5 z5qW4<@+%d7jflAKP<&M34;4N`M7beV>SY9Z>qm6#o;2KU4BwDE_|{|9i#% zN%5a4o_jm}1&HWRhT?}PK3nm*il3nPnF`AkE+yjLtXA<2MEF~y_|1yHO7UM){7s6# zQ}OpG{`-o5Nbyf8{#nJptoYXz|0~7+M)4;Ueoh>Un;hPsqn~`?jBy1OpQZSa;>RjJ zPw_JpU!eGM#aAf4M&Vk8TayMej#h}C%Y6ZtLy10xNQ>lg`z{f;-4a6zhbzoeI7#7Dg)UDHWeTemMu?ctjS8C-wkT{>xLx5+g*PhPtMG1x`xM@%@P364D%`K|QH6&U9#Qy` z!q*hOt?*ri#})oT;fD%8Rv1(GH-&tN!~XFv%85RO{CjcoL4~~)hKRU-9IjB_Z+o0y z{^NZlU%2Pz_(=+<5`DP;QdmI5o>Z)`l<3EE8if@^%!Ne?ml1>Nz8x4QkL&*`g%M(J z=lKhIDnVqfV?!)4!q1G@*?v9UgiOL*{}4E z5{Ej!_(c0R$s;c^KIGwl7!Ud{#|Qm>j(YT$e^AbT^3R;vKmJq>`!xx+?9T)0{_@AD z!}$3}fsFh8WFX=ljk+AayHS_p7UOdV#PuQSGMHmt2*clMCvaH#j(bJwnGsmqzwMY zf1*9E?a7O4fWFL5CP8>P5cMlW#Z0aC6_|nNH(G!#8nul zsRF0-c*>u`vpnTbCOJ9&55rSCiK0nLG*MQNXZ_E|Pmm&c)_<9lFGbE-l6gGmVN?3o zj&ax{u`R}ry_>NQV}H~Kwo-XKiZf|!k@A?NP=l^=7X)4Huw};&ZMWO8Yid)PFc4dI zJQi)oYZSI)QGmjuw9c_x0Gc)|tXGBNZZ`t{5)^%Ce{&&#UA)~R;8|byOWVzc%-wE< zt6hBjjkn7`R&=-f8gzUME-pv$cCP^KZg(u0 zC+SEX+TR-R?sos6+QlVJ9@?$}oV(qyt6khi$J>1Ylf~Wc$6!8pTqXE>+Odo0na>E> zUtB^H?D$g~?sg-tc5#`Fx7)i*o<9b^UHKyDe(*adcYpZ|k?rDkMIPFYfAr~Yx5?Em zz6OZ5ySht%H-Yb|UH(hj0?MeVP!OJ1sNrybhx(Ej-QKkoQ;y8Q8Zz4rGlr@!%avkLzB{jff?zk9m$ zcQ^d8O|IW86z%US$6tKD+>HgvJkW-R_Qz+z?)dI^#mAp|(Ej)xAj8q?`aTfuJxlw` zhLPLfe)!|OV|*bL?T_C9;Qx4hZ>#ud!$bS~J7~AR!>;(Ul^y#v76ty|@g0Xhet)hH z?Qb*$ZhtSq-zLZy-*6NipAFg_-wbRPY=<^Hv_H1#_E%8v*wNoeWygB`obiaqR}6ns zAlHZXm)T`JO5soEkFo3c{?ujuZB_BnhKKg|QJ49*%oSgbvSWPrJO1MFZHK?-A=8KU zcV8EOVfc%{i2dal==iod{^H|XicOF0(1wThx221}mt67XDm&KWAEdj-m(N7>A7i`y z@iPzpkGH!FpD9>Bk489jyZo%^9=D^ecJq}T>s{Do+`{m8jE>Zy{Y`f4;_Xhw2Fd#T z?v01G%kMJ2Z@b#%dZHcc9Y=BZw*daakm*DFdlv$CKaRtno-dqV+TV{syYsS7#i!?> z_II$0zYbS?Q(gYNsNjz8e)y|^ULV>YKS#Rbi@D;P4rAJ}zrXF0znF@THaxVy-*m~J zZ?#jO^KXW-qrVFf91-Tufr}9Hq7Uuwudri3;s@-m7#8Q^xliNXPnyob=x#tH+IfvG@f^fIH|5E3D0=8R(qTA)~o#{IC@Vye} z^FC=FTDP)`zlsgc_mT8hjH3N*Q2z9~Sz3zE@l>jV{#ec^)OHul7h<-uA!xhDls~O% zgPr@J9givyNNbbB;X6CneMK`sZO0#+&@|P@VaIzXedti%hs>QnZuWeh!v2<_=>Gm1 zGFNr++C@TKjJ2*0tvd$7?JtP?`<*bNzj74qk3Ry4|KrE#T7e&7a@x@QB%&Obj6t0wTo6wSz^$6oxzifuaToiV%^P6*ZVQBoYWs0-{o-zEN6j z)uNUDeG9Gl7oX)SRqmCx)?$5>dVSDpEmd04BBe@uss6uj@3qhDb25_*7WIFB*R6BD zv-Vl*TWhbg_dff~oD&9&t!=AsIw5yh++T_v(d@h1c)X;ftkkH~PESB<2q^=&ir~? zhd)BE))%8!>x^~LGc`XcpeeX)AAzG%H#U%bd?6B63wkJqd9#p~7j;`M5M@p`qs zc)eO*yk4y@Ua!^{FIy1^)>Qc-HC4VaO_eW3Q{@ZLRQaMaRld+nl`pQ&=UmtLqS7_K zpmdEdCSBtTN!R!y(lx$-bd4{b%D@8%0`VGUN#~gcW0=Q;^L7bN5Og*7iX<b_U05+qK9nTtJJ20@?J2Q^(2w~BqBBMp{Hy?-L}1Xs-R}u-U3zV z?=K!_`R-`Jzs~BNf0y?FM4OVg_*06v{8Qqc_9^k!d`i5F4j`}0Yd!XRMhVVqJr2OU zw*OIh{ZHCazPrZ(nAdt7fO)OQ0hrf%9DsSP$0wiH#$#R!pSElHgqbzh)%1>!$Gldc zuYBBQJy{@EK1#gu71R_o=g2JPofjWR`R?8Y`@+8s@LBUY_+0d_`Mmx8P#(tUxQ*{e zdSR4?3Y<|o#2KYSHgS~JR7|P43bXt;%$sC#GDRGw1smZ~;jTx1uuYM9g z9F_ay$y`sCKk^BE?N_V*MPJ3AVY|vdLtoQALtizYp|3^z?+cfOI6ejVU!jDme#@~{o5X@pVuWU0S~rroNKVB;$0Lxv(@3_f2drcF;} zm+9ddK^_THzfeR5{CWJMKX%zEG9HC}K!a{Z=z6&JHHw6>_@p1#|2q|jnDh|%Rc!k7 z9HSMd6RhI&loRO}j9=st8Sqbg8TX!27-C!#M&gscKk}E*keW`Y5yjN~@slvteZhzf z_)p>go;-$nhmOuaI2y?>=zn;A@6hS}l?wM#ryQ(Qq#q!XKc?qbqv)FlhkEujyV016 ze=#yPuxN7{NnylxbLr*+Zsobav_cs-E z))Qi3Qp^ilMU7R=vx?Fx-?P%9YQc&lOP|av-bboDRiP!NE)XPyzk*HVIBbSPEBt;m zt1$ehXq3z8Yk2sbsEYQ)5iRVDW<~p0;oWFX^l&S@7tM0yxnrgu{ zy`HAcxp!I9X4kaYHPwP^x`w99bDy=Q%U#puuBjGW)5mGLD)$3xy2>?O<(g{2HGPhz z_vd~Ipij>IuIc@*sTPcBB^-t3{DG#=VhG*tso?v)*FAsXk4aE)t>Xc9Q zky*)*P4$r($t9adviYId36^ZWkIYJjY`%}oNG{noNVXyrBdLyTg^$cihHQn8%t(fe zck`h+*OP2bD0UrCcgi)EY#=+(8Zn=dNJ_@sOd3C=`KD0p->vy3pZO-AxshD+Cu#ml zDE6i`f5m71iqG6guK90hzB?4_8Ij<3`^<+%*Xl6jpUjSrFm62cE2^R@|jop z%#GxlPoVjdaO`DkzQmf3;+bBe&5Z%?`a*NQMuU~%SO`}V-BDKh3|4kBXr{p(;aHJ1 zxWi{~M<;`2G}sW1&9nv^dDq?x4Y2;n>~Q;4PoQTb&FZ zp~1)D*srX?$3BCPI~hDpgThGcLu*hNkuIgvS{PxMGHE?mr}Z@&jEuzM$a)1cKT;dS zPQm`9q?{j`G1W*(f)-8iE(xk5u{Ipm1l5M%7E54cOHl1ZU zMz#biIuZ0nTO$ufV*Rouf(H%3iI8;@jBE)W>_qTo61*0PHCck!48eCSfsrl2Yn=#2 zkRUrN_LwEe&SKVMf3O5bwglN(!6cqcg3_#5-a*oYQbRBTvTlNrEkS7~f-^}lCo6W2 zC75FfuCxS3wght=f*O4q=aXPXR&2c`SYZfWu>?j2!I?NO&`dU=P7_>6f(==*Fuv*4 z{a}M3_zGm*1S4C54V?(CA;H^Ov00YjZA0)4OJHP6@OCGHTS(9^8oS35^o#1V@SG(u zvL)yj4L0Fk5>!NE_yyK9p~4Uhz$#TY!N``Nq7%X6Bu!WqHcg1W|rhQ@~Y$VAEL_^j5}mND_#wgvSq zwF~FP&mPfuTv>fxaq%3LNDK@7U(wdQq_M4i7$4U*`@?3o)mJ%Biq@-&F;&yrTF-5) z?`W^8Xseyqy0CiEh^i5ZnH5v2ONvX&s>V$?wXAf~h}pBNNrUR7e)7(72$r>ePxUL&wcHRZW;Rqf#wi*xo#EAsW`a zutP1zrmVEOL(QBu?(|tR)$HnuakIvqGF6>vcVvsdeTlGv;DJ@MWQrX(1#@+6V{Kit3XS8mU79E!t)h7BzN2yJ&;?~>D!cbV zr{<_0k=&eog|7|6eZz;S{-MIqp`pV`9T`31deqIdKSXX+5mq}OVjJJ9K4Ox%DmoL+WeN#L4ASs&@VVQ2#3o(k!(e5#sHb|IUvQ@O>YC%2J^TW2&Y! zHn&tS8Bv8{%+G|%aZ^vO8sEIIDv_vaURd9c~ z=)SgoL0M_jh^0#*hL!vBPrbrDw#tgADC%*8&^r`8IQPmN` z8lD{OJs10tdDzL09F~ao8y3xjM!#%>q3mJdFxs3X8zf}&qPY_HQUcr26Vqx-SgdT__k%j_a}!hU1Ps(`2Ly+-||p0zI1#aUZmT5btr@Ou5$RM zr8ya|8@@X-;k!QrzMmVu$1>r2#_-Max*nQ_u7@qU-dx@FCP(fwgj+$_e@Zl#JvrJR zosZbL^KCbT$-bP5@One|UM7SeWkUG(Z|GBU6~;`r5#AKmr?~3~UpItzWJ36$OUO=> zs>z!T;ZI0d*-Z|Ajq#|5n2w%;F@Ewt?`YX14HA-bz8qDMiLlRGb}vLjEQpR*mE zB=U6jZqpMGMyE^b!-n%&a28fZ^HW|@Ur%!0DxB|U=futGE*0t3hV;X(NLL)>1^Tz8 zCeT|BA}RZ9D$?IC)oHx#pe`bPFiE;aNH=#$y1|hCqASwZlB9PE>ANKDI}JSty#+l7 zTlAc{y5~%ee9MsT>5BA<9IyF%&oj-xDTmEZcQO0@d8YX}T{S;RxowB*GQUf&b`f${=Tb7_asTLwxrke1Zld9@?Sc1^S|4(i{{_m z(`)`K9n$=bU6DRvNT2G8^ra-}T1)yaNz+ZID-G%2I+OC2*kAaBn=M)DeeYcq)M&aME||i8h$_M6@F`& zED_a5&GWhJlRSvMh&n_K!cVx#a!7I)dl6Nre$1~6yi(}xaVMepMO$aD0#&;LG2j!0{sWdtd&F0>_7{+kN>P8aQ68 zYJK@D4jeC2_(IkxWzIhHGg3X^%O4+uPL_xotxodgZ*=k?_9FPPaUF=2FEOoChf3pI|&rs#Q{GAavewKQ|S96w6il{lN&6l4!f#Wsmbl>rs z!0~!@h%bNjich_=aHNLRo$5@9&&YS_V|Ei!^VDyA`JHDEX^g1(>PBCF=Le3rs?&Y> zHGhc5Dn(Sg`lGLZw%bF(f1bMAm*4XO$1hZ4eEH?GvB?rq7po0P5qlT=q=>pywfORP zsd`58Qvl77x?4pt|8U>REX!i>T|> zwZ8mbA2_~Bo#xB$s=)DE)a$pPG->Po)<=1=3M)O3}JpsP80r}p5d|yC*ARs@a z)*&BEF@F!~6OO1BTv90W_lZ8?Y&8V=NXk9bPP8v6=c#o#A4$2F8jJQNUrdk{6;QPd^j{I z4^@A_v7}tA`k=p1HtjD{FZ$X)QhnFg{?TfN#AEU^R`v1a<3x3bul?gyoy24GC#rwK z8T}b~k{T=ijXXu|6aSpK`-G>ejpEr2pJWpkde-_m{MTvuO0`h@8~GZQkoFt-TJ@gzH}duBBJpqJRq6z3zmacIuZVvm zoAFf?hBFjC?x_)N)Ck`i5u?UD!F)kZLMTPDOe&He(u(>?y)1u<4iotZL0Q%m#YH|! zaG>BZf`bK%1cwMF1d9dvdJam_a6wr%6tPpI6tQy=dD4j|2$tiKbnFhRKwkqE0~zYD zi3%$*$Uv5&@fqr!l%d|F4D}{ws8^Yx9wvp1+B+>ny%|dXb~@~93M*ga3m69u!?J>> zvRIZEMOcQgYjmqOJ43y*GSsWeQ16@!^=dNI!{ExOy$$B|B>XCT$q`gJN`0IsvBaHDkiiq)7OT_rQnwU`PAtJ`#HX_Df6tRbgE0rLQ zRO$>O#@}+{7^Qwl#Q1xWi1GK|#B%f#%wOU0N}VdWgotr;tKic_jFy9v5K7xoaRd}9R|Aw2*JVeAPRN?t%KB9aS zHJjs|D{Q;#_luM7xKHbCq77QvRvbzbN=SBF@AYY53-7F$a z7dMN18xi_Xvnd=DF z4;SQp702Ubk@*f1^-mYMPOw$*LL$cPnLZ9n3^8P^ZM}j{Ve2R#1{;bGbiLiTF zX?lI}x0xJ`|a+IM6PFzDIw2V}bZ3!J&d;{+!P&LAG6RF%jLMCdn(tmjGaUMBK)h=Y~lyCd{>ClUH< zM1Dl@DZ%H7nAcww`As79-x7I`AjdHIdJ!@IA1d+y;#|yoB9{q{6P!xKbz-*2HN?4? zpG0mG{9@QfL&ca+tz8oTW`U!rSSdR6C$Rmi*8!ht5f_znk z*WGhOo=b$@xgswS`2vxz61bTwk#`Vbw^L-k zI6_%pPtl&-9*}|kiMYrO5cyal^oEK&TIAzJo+3D#h;>1o$mbGaw@~B@M7~Jmm4Y`D zv3|Hy#*yI1eu;?n(y=0!5TQ3hQ!tTc+KPB?dMgEQ8o5VWwN0IjsVYgT0EUXJc0)ik2(==A_j zsm2;2uJcHN#wH?yYY|*T#C5qta49ja)H1>4L|jKN6TFIu#;g>)j(802Qv`1!qLHfw zZzC3A-6yz~h{mrITu;Px=wZPP#A2m33T`6eIUA^bVg7*%&c`{#lW;#Eh)3D=yxCWYbAoW^>Ld%Zpf&Zb<2 zb%|gN5#zK$u!&fM^DnrFh;h{+$nQTnUX}?KG7smXJ;boWU&=S~5Mq}3UXsU=Qr-V2 z$#FDU_kV<_?Gcjh|4kyd5c8B;D)KU7zEW3-ypmX;)J-C-aKMC+As1E#PPVl6+pSu$d?f@4xUs%_{w8` z(BID_X3KfVk^JRK9`bO$7#I5S4kG%m_K$wMf_&(&uM*KuzXC4yPrhK!e)%jB{qaby z>(LKeiE-qEc$88F@X2|%hIoup>xt-JitEiHw2O%TbQ=-e{_zr099 zKRLVy5dEWph<?`E=j}2g&etnMoTmhG#Pf405$EM)Vhyg-_{pE=;Syqlf?`8s-Qs!G zwRLrEjZ0JlZyt51M1AXm1$cc_CGZ|XqPC->t+{S-M`OE6v^BPfK^xw@VvR9x?`U%m zHZPppsuBxZI~o%wPd$BTdq-{keD`=u^Fq9;kR+SiR=dDg(b8J)e+wZ24;{62D$#!a z0^-1qMA>L=OZB!yZ$}$W2Hm){xnZepO@c2zOfdiC5Z|Jc7uU4+^qQ^~bKjZf7Z8ml;}Ea(~n?8H7a5BGV-ajH6o*Yi&n~fcgrC8?p6=+r}2|Kl0m+^^<(lq zLg!m=%k;KXZ%gzxBMzOv;Th#mv{L4;TL#Hrw|dA@8b8S+8RV~9KPG>}b^i3WOm9o| zw#3wTmlbm8{FQa5>1w6SU$+dBzi#!ACD94`Ngl}{f8F{q`76`;(_6ee&BcMTQYH>Vw7Hmg#M& z-j?Vs?j$lVYoUtU9Ivda$NdNH6KugPlrC7}EAHb~Mi<2==MN5AEhc$@SZTI@~IG#qw1dJnYIF`!qHlyeH9R(w{HxC~c>-S~oxqdf0esLS<`Mn4CxUS!F2&w$8HhP}lW#X6p zh{gK733{&IEsoy;(PO+LVc`0`EREkGM$hxRN&MorUKi_kFm_zOTOGd#Lz8;+`$5?6 zm*3f>YVS^?=lRWoOnduOyY_SmT#BQ^V+*d{NigEU928|3v=7M$MO3mXi|@PdJKcv^}8>P-}Oe%^IM5Y zllBAfVX=PKLC^KO&+&Vd=+W+i!1(2NT&dc-C@_BS62AlK6vg`GvpcTetW!;VoF|VK zJ^CFJ7{BY%_$>~M-+khD5I9(@-ywnVo9Fl)EPC|&4D8)JXMrG9dp8+9FVC}}NBbgt zSghZT&~w|{*YW!m(WBkfIG?WHsx*F=8$HkOI`KP{PEo91emCm+J;L#u5Iy?+Ek3T_ zhtv4|wbAqZW+9)nw-<5i_c_$Leg`^!OK^;Ow9CV_+x5%8jGOBE8#a2L-wN?t1`ZbM z_oKl09pd=q8o>J9g5X@gmEcP?U;U@i^ZZ^Ve(^P@F4pf8&~w{6-0^#y<98(*?fShg zjo(X*p67Rq__c4nSicuR&-FXj@yqtu_ErYwjjd_?jt|Tm{BD@%318ppV*Q>Fm^UgM zzkEK;`ppZ>8-6zuz@_p5L3q z@A!bXJ2fzGR5^Z6a{PXX#=7m@p2qLH zM$c<+9OsdKCk6ce33_gO8yvrVu0^_$q{7wn@9Sl9!Z;RuX*LB;k z_*;V8-WKrLK1xdJvG7?8=y~m3D}L=iNo`|1op1qJ!$+h4{m#l!H@sdtbpGp=(&C`bNrs}_#KIU z2vQ+IIV)VTBc8Fhj4BR^(gQ4g8UFrCp?fCr}67Kq4md5W!qv!eEAb!sZw08sa zT)#Ise$RIN^3Qs^emAA@yDTt%`Ro$@$6Ioyu)nY@4UFH_j$iyV<(=OFf$Kj1b%<1X z?jN}BmqU+!Yw%&Qeh&^@_wRE2)`}kOmYa34w{D*VzH><=#quo+TvykDFAg29*Xr@1 z9{J8PeBSwZSmL7&i{<-TfNzTvU!&-ekL`2M$41C4B$8tJ#-bkot8%H|>clq>bvC}k z44)U@V8lT`)M2rF{Q`V@ocNkWk9IV6c9ApBEp$cc35Y zu-N!s3h*6)35|L@9}7f}@}|J}y(>+88w2BVAo$|2CtoW*HhS@62=#Mkcdon`pE{PCT0#z!3%8{gLgd@W9Vi$#xi z1u$^qTbU-lJm|USx5J6=JcsYkm=E0Z%V*5!hdL}azPF&~^4;LXcfRP+?)kvH!7oZu zsRc88QtOh=uLA2Opak z>RTJ^s*Q)?xi{`evBz+le0nPmM`v^zV)dp#&*zsnV~CG_e~6FuTZ(;agI)FaLFPG2 z?z7lq3GDm$s!)MGM813Rv3%v&r%f?FEZ;m9;|*ig79Qj05J9W=2RN8$mE;)p&X#?9 zXz(z*XOKE9{5~4tEYbot)T6B}R*%hkslDqM8 zms&0bGIe9tk^{SS5(7c=0F25;>pXx2ag;P@Wv4O{Cjn~1b(|ta(9}pDHe4e=Xt{Bm z#;*E(cW0KDjOqlSk2Lq2@0>H|%$++kckXh}&51%XeYE;eXsxvSXsPbMhC<@9F6Yg>E|B3kzkk`o3e)eXn*F@>!MXzLn+4O61$fzrMEu!s{z;t~&k9rM)Z5Q`M8}`WZyN;LqL`f*GF& zZX_ee$K;ghjYSey>26j#3Yx*QPc=PrGr`I$=?r%>PPRtO`Rz*yD$$8t^m zZ!mLeF|xHUv&CBhdjMnq0_xuLu*H?rZwC&DeVjoN)>f`ATl=gPE2w@X_B{QDs1qyy zwS4jCdsZy#)`2{(8y!n=<%aZN^AmG7Y;Z&v=ZlLnywLal#Cqj@>Cvl;3w^K5?Mja~ z%dY$W`=ei%VUFR67dJX;E$M;rmJN?sOZs@M&^IvNoW^YM)){7kx6UvNf}s^lU=9Rn z3taKw$Hd0mKv2-*&Ju z6k9Zii>&;+N6yNNuc5Mt9@*loeUX*>OC)gdK~zc|x(z;_SPj;VwN1*dt>3=0w!yl6 zyAZNY3^$?qHh^7wq~^m4eQ2_3YD!hLS=hD1O(eZFc&l}L-kZwa&{ej=hmozuK~L8C4L8v<*d^rlQd4$ovxC@3jyS_jA!Mk% zL4=#wcB1CanmeGVqvH1MhSpyvGUGNV9f(mISEJstgHfB*nylj6HXj5ffI&pB#2^83 zM+w9vQ2qff_D#6-;lard$iO4=ZA-lbMFSQ8V+r*OLw;ig)QTbRSe5D>L*B)HR*5uT zoBy@y)fPjpSzFW|LxgNroQ0m7C3mSKhDaGw#|^P%s~R&TAluX(hA4SJ#SE#C?aDP| zlk8F%Ln>vjI%i0gyjh($q+0f=M+~WvgX%903Cbb$RYNw*sQNoYYUQZaRP zdO4x~#gGOWQ~zd2qnuQ)8PX(E3TwY~+goH>y=}-=nN`;e*(T@ICJeeaI@@JY)fv(( z7u7aHcF23xZbMq+vihJQJLLs+(2!m7LDg-@4f0`8!3dl7;PM}MY*t_8PXL<&k}d4R zxcm`{oC*Xg<=p`l1@SsE84&6=LlS|2*pvc0i((zEOadycDg+V^gP!>U6!uOY9<|~K zrXgmh-o?&*iT0j5aSc-WI%zMd*u2F02kFMSQS*7OkQyPnnS<8z=D(A$4}30E&?2rB!0omcN;{ek*gjtcj+Hgcqs z3|(0XtqOSiVhEFhJ9#S#_wM~DM!0u=7KPg;_1q-?!DoLI`j=6-(&kWJK&eN3zwl{M z4DuaA;hn>v$I?d@lT;~ctu-Yvw+=li4>JQ5o%A{hBAwRp?Y}Fje7u4aO7bB*hw)K850Y+`OHiXJ`qh+74=wBrrB&#h(2mCF%OzTKwEG%&85TnP&;*sMg#zbVeoH#Oa z>{K~(nJ|zhrF0%CC-+!6d)aYKE9Ng*#v(mkCou>U<3qTPMx$W^$4m5diFX(%sXMf~ zv!w2fl+>M6N1`Ji0Srb)cthg!_~5{u@yPgC6r&x9k1x%+gYLBO6w%`tW$!!EsLKx{ znNAeEr_qatG2<5Fcrb3k`y}*zO|Jjoe7`C0 z5u7OE{a6hBBUoAqH!+nFRzIqd4yXOFP|19u=q?_d?d%j44Vz9@iYmLhvX-Y3xkYXj z+pT76ht*>3w02p$`lb!g8iZEZrO-r@$wgI54&0PEh`;AU`d#|2Wj?%#`Z zKk(bRFZemPg=Q2Z+$RQV>px|ELOx($2#6cO1LBh~<4gQEwVMgtT2QRWk=Tfv$;Quh z$IxSzNVNadiP%6U7jv9gCYQ`Eq+D(l>;4ZGGT0I34-LBKGD**Ydx;S9#T1^2lV*D_c@vZ7D>$JayR#rd$roOvF(E}GM>}wytZ2zg{RM^qV ziBcDWcDJK;k09|da3L|q=k6IL_u0{_rt$ylWIu7A^Avi6 z;1!3SvVSHnUpNr;I?ac%PHyBx(Gn1Ec;7*W+xSTMvd@kuX-pp4_|fXG*4X(Y)~eX} zT;h>$RlLJXncA4;XV=*Mv!2=NM0Smx3vX3y(I{rt*c(@ksM%ucI*#ubpV*?s$LPOn z9S^PJd&L4YOvyFfC~d({rBz-b#zDxrrW<9I_%qG9rW<9@>k;i-7>)Rr`cEJ^*L0&S z^?$#&YH;2teNu@1dRX^Y!V$9HJMsZBTy&AJe}D)(R;WN4Z#N+Rqvi~Obl$!q8<2|} zxQ&QU9F7F}ULrQMcFq4#BM*MG^LvJv(s)+m$2I=B#?NbfLgOWkS2RAa@uwPJ)%d1H z4hr*Z*4U!)LmIm@_G>()@h**NjSCv@*Z66Tk81pi#&2uAX*{6Oo3F6*cV_za zX&lrzq%o>-RO7hDNg~E7r7=xJ=dv2-h1zp zjynwVv}t~Th&;WT-%LcFAD;h)0Qt`}ah|`#BMDY|dA-PZH5? zi3oq;6x^(XSj|4ncUSul|+5Nx4%CGx5aKRKYzbJhO0;`Po@~l3cg#`aeuu zFMip_J3D&W6UAa7Gqq53=SxvbX>l5yp{B&S%sQA|t;XMSnc!|M!R`S#2oUV24q(dp); zi^71|A&pYAE%Tv6`%lC*s?_a||w4;?K+Xq5t;}6Yrl&e&xJR!@%}Dzfg?d zi>UkaF8cDKTE1VNBbe97vj{+)5mViUia*{mg0#V@6@{lt=4C%ZD5edn;$;jJe?u~2 zs^5ab)M=~0q`T}}sK)jrZ2r7oM&3s-Hq6U+h{^jo)J+>y#WR>ppJzpjv3&;IAFme& zz7^;gk7qs;kLNVDX-A<<)L>4n>mTjhC;WaXoC%Jxffm|Wp3w;KA-E<=FEuL>1Yr#XO$yUdCf-Umg&$$!6X*#9P>=lzCI%>Divb$`4Ih_}x-@r~`5 k@bkxe5b-!hjJFrX#N!`&e9gs^I8!|a9ph}#e)Yir1OA@-$N&HU literal 0 HcmV?d00001 diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sha1_20230713.lib b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sha1_20230713.lib new file mode 100644 index 0000000000000000000000000000000000000000..c99d18a27a051ef7bed58bc2f9ddcfeb490d159e GIT binary patch literal 21106 zcmc(HeRx#Wwf8>f%$ZCw!(@_xBq6{MkS}4#2VkTWCm)0m0)!A0Y-kcfLV_WQNr2EI zAc8{lDuQjTZ5e94y|z~iws^0XS4G=uwR&w(UyH3(-qzbkq539>bgZquzu!Ll%$$7K zw}0H{x%wt*fcM zbBl=CSktkwzPmBbm$tOkw~ETbl9Ht>mc)z8>bsgnQgeN4ZC7)BZm8XgHFti&HF>#L z&&|yb2A#3x=H$$uKR+1E%PGjslQGsM?Ot3_s%aVmw2~&Ki#R7l^-@`G&Xq7-ftE+VFFi->9eb*uZot^PMd| zuM1DuIInA-;$@fLEPVd*xSOo{3k%YwA3)2jU2*aCl(pfPE^n}G%Z_EA%zm%G_|S>M ziwk`}zo`4(jEZ3RvRF~nFE+dcI;nYC^WDvp&85U!nt6RjUbPm|Srwg8R~5ao($$~rs)|kt zZw*&PC)KrvyTdEbU+ON3P70g(wO73y6=Bi;oju3B>+JLo=v2Torog~#a(-Bd;ZwA>w-%JfF8)5bj zTldnAcJ1Yr$I*+ip4)w?;kcOkR@4_j4kG6uA41-P@v7^4Pi*UZPp`hFM5}u=y|C`R zbiL)4I@g6n?U_3Lf=AQpF_%QJU({h9iNJ{`-|fGZlTOXKmA9O@wRBI*!P2KceAe^Z z=;*-V(!hnEik0W9I-eg1C#)*Ge({SaeKDFY%s0feQ;S!g(P-oD1O3+u?*)%;Oi#cn z)?N{l(#|FH?=%tzV0n@_y*PbLRI9iyeeU*>8dq-j_ST*|icW5Sr01jU182ByQ~UIR zERhk_f?T~t)k%HjSs771hwJy&YNJojrL3shJCLQVm234t|87ya*!zk&op>QZl_dR`Pz*8s;|9t>+#C0ER3-}V)I;q22}PxwmrmY#Xf)K>QQcyz4SXFhy3G3k_k_&){;k_%3+>@V;t{Kc;!o_$BRnO^qf10zQ%~6uT9n0N#{)THT(HX zQB7Qz?#jKRsJ}icdp4zS9Lln=J8H?5=-0BWaZw@rH4XiGfLtJ@+J$}%%6>hFetoigkQ2>eaDORGjq?OhkfUZi%Pya?g4lMZND+oz&?$>og6^lPDbCl zF8JL30nOyu@NRl#RPzm_yYeGN&)5I?%>9o-DkemYj%U)fnaSI|ee1H8q)&)y0e$8* z+g*L%%mN+sl<3=Ed(RADMw)?v!sG*|wOla})(d9W*FR8?wx+VJX9vP=#E{UFq5U9F z#t|&NMqTg4?AIE$t{>BNj6lZe|&gKqr2&Z!n&gBm65KibY zPG_MX!s#5wsVs~`IH3bLn{!-;o)?Eo{iW_hWy#?g<{|XUwDIVd_ev87vRuK^8KvRu z@H9qVRys-c%bw7vSHn}@D;1|_WR%Gg7uJmnBYmQ1VdJ!20Y{~t`BA=%CQL1>~f9k2k|B|g+DBeu|1bfJKXy2yzT7b0t7HLfy!o?0HH zZqX%DT;n1Ipjj=^;#0KjVXe^CW@JsQBD5jXomC?$2BcyY;R>Z#6=4)vmVjVes2XNL zhm_SA5GzerG%*L+5S^|F3EujFF(dOqu!F$3BP2>JCLuzi%wjx|6(Fud)i8OVS*C`TXE!WV4Lg)fJ{!eJSc%% zgiK`1EmAWr0f7T+2}qS%0>TY30jV!r0>ZYK0EA4=HXRY#ZLW%t3LztOg5BmSIjt%z z0l{u_RfJTlB_P;s4(}`uKg}b~`2d;*xfVbZAnO1eK9Jo2S^|lyOitIojA;cCp%wY_ zN0D|A3c*$!?$`uKgUE(R5fKvE7NbQ-OtBa}LV`|1&5+%($YNX(64oqDG36{RwynUN3REjvcB;AFBVEw%p*8RAjUCduyC#5z_4+7gm3WKCQ@1u#7>nGdoo&XTM^ z)W*+JXSls_b&`xTrtS!u>W-kv z+Cj(E9idb12%Rikm&qCWPf>!Lg>KQ|<_z zEJMFPu1+!*I^~Yg$ujh};_4(Btqh%VN9bf7p_7$y<6?&%UwEsIxa@`J7GSE5xa_r; zsQA@KTwH;3k$v%^bw^w*DMC&jRJ!(vi-i@)ejyFQ0JKrgGA>H5IO2&FvVhsN3WvH% zo<}Q=3_=Bh*2I@s%47#b+J~%8eM@T{OPQQnSAfTnPq4IjfXQTQ1;AONwMr5*kc|S~ zuVIBR1aK<=iK|Su0cy-ghUiCts72x`ldZ+=!D?pME#jL{>_>*57XhDIB(5^q2B`H% zWKEt$gG9Cmyk&U>5?UZlOp-lVMerk=qEqBfijWLg62cWqk~b+rGE1@flOl9`7BYMz zEI`KHo)!s%D3#@v(iL26M@vAnm+1kq2^j-L*o*YH1@`mYUqQ2GCu!v?sv;rAt7lE!|_7GmT zN(r1-C?%Ye0zB{ z_rVBp(V3IVcjC*Eo*N;)E9ruWMC>5CSQycPS&|M%h+N3JC>hqZBiqe&*v)g;&3D+H z>##d-m|eD+E!!MEoVGuP2-J*Nk2|SXV#+~azOVO_Mr``FHO5PV}bVz zUOgR7YTD8?{2ZAimZn|p#SSqQ1Xkh{=q>VkQIbH?>s5r8)rQ_*e&c*#Q$wk(JDtCb9}9o&5viCy!p^r&Vs*a!n@pNKG9s> zRW|ci&Es8fGk?>3-WHqrR10{w+RSI#XfHQTX$@oMz1wCqJo@HX4bSiRfZVKeD^k9WJxWavA+yKN>@-{ZaA zX2$9Jym#45mVUtdb(?GoOTHdF0#d7rSEH7<|$8JoGz<@3H^GuOKU-aeaI>l*F-t<9`+rF-A8nHyYL z!t*Y;QJkcofY2BDLCJ^9+WL1q*kQEFKLO+uck5C6`d(~X0csrvk*uxyj)ba*04Xz2 z{1Xy9yq^MLRph;tw*C<;CD?lm5V#v9Pm_2Y#ET$O{sQ845LS)RAhh+{-O%7Y$!-$I zLG+S13*u`aQZ%@H41|1UZ9NTL|7|QmZ8Q5iZ9Fb7OZH(XrQHLzFD4zWRlVY1R=*Zw z#&8wCPPUb1M;GkJaxHXUX027PgNuM?p#_ z_RxtjA0otwlHn?O(^4Xmxf4`cqr~E4UKa4VQmS;-5kMp2UkF-UpE~00J-4 zM2as7^As(nLcu7D$uA%iQB!Of!L0tRQrDM{g>EImZoQ(DF%iJ5TS z>Y=Bky$!Nd8o80=(~`U?PRf3hrNT22l}F9QWgX%!nVl;vTOz5^AsIu&f4bZ(z4;+(O9t&`44k2c7WboWBT zbX~!5;2om2{!vyrpEkxP#NQ-ILup?CE8{=U_%T^sc#A5uKb^<$j(HS98Tj~))e*yBxix#yVk|A-*Pw+^$Mkgz`z5qhHH926pHIehZ8wSvUY)x%y z(g2-Hc3VHhWV=nM9rv$K1@jR~rGL+ZkO3V9AuH^)D+t-)@3O`xXyXQJzpa*?Jz945 zA~+;F`|BWNXOH8SiF;(BeQE?sQq;~l4TRh|lR(Iw^8-{kMpco17l(hQS`;%mDexTv z(nHAF`ll&P)Us<))61!lsBs!)?+2e|@ti8z{|bIwTs|3_pqyo1jVome&k{6gy{sFh z>B-u9d9F<1_cBEN-{2;QOudyzSMcH;ftZOHa-YrCAkZtq9_HZp&8+R0hQU#WJY-Mf(QMdq(1XW|$# zu`ig~ERZjJNp4d-pFuP6%wghI#pLw2xP41Uds|~$_kv(y=awMZme$73AU@3uF5a@C zapT6ujlub$+-ri>?d`1#g7uwS8d~eyHU+;lukq^qh7CD6>qRIuXUJbkXUn$6&aOH9 zw$q~LtnO^6iG8%$AW9b0RCcy+Zfxl8swwHL-_+h#TQ;vIH?*`eh?*@;J3to}FVD{_ zo40mtt^7u`WLa%z`<8gMxVX5zv$3eXzH?*E;-2~~9j%RBHD!gX%Yw6mt4o&Q+SS>B zYirAfO^t1{`PC>q>1wW7Ub1X`21A>M}O`c6?>TUb?9xUP2f(i;}n zRDvO*o=GwK3i>q=4E_wKTtE#rRbV-#cUK(q-c-i6=v6f>D4JpQIPBO8^B^PTw zrZ}h;+qWcD#q;MbM<=YUF2l95q9WIZQj1+}@p(2_#d)eY-zv^8wuDIw*gR^svN>gvMkHLFG0 z^1|ZUWsBEAO_KP0*dnAdXGP2!hphmk#?O}3x618XyF0daiP7B#N;&HsLY$hSv6m8}ZV!skMGnuDs^S zYrd#jyhLnh>FyF6TQ)Uzb;G5N^r)kxzPo;Dn;=-cB^Li3dqm+fY&`Xi^&47*RtT~< zFO+kQFdN!C(SftKZA2BVyu>~WoVh&I4w(?pl54Sw5eK1 z!=Wv>ZZ+Ja^A!(|B|d#}3761z`hB=vk+04GGI765S2Th9W|2Q|mv+0p-`MAppAOk# z?xjWk(Uje0?04o#-0dtXA4 zzh;W90OY=0;-7Mtc8A_;9CRHpZ+G98u-~&UvB*E&smFc$bM$h84tw0!M`*L>N)K)= z#m^zdSMQ(rM-g}=AZtT5Zm=Wo-J*Cw&9cUp*4l0JYS8!0#TA7smedrrwAF+{H7#uo zty}To|L5B)Y24P*AQjehVSNb4VE{+Ex;J70gqrbKP}DbU$J{dMGPiNJR3EU_2Rrg9+A@=VXZrtQj?$aPm}$$+6f~PwZl+k*kfiOa z&)qg>shP6e^zAWID$HcJCupX+IR>T--bf0Wrm?NuOsrTjbA{=fH9Kc1^g%iGTjT&G zx{aRlzpIr91v5}(CYDNDb4D<=-=xwCj26|<;0W&RAKYB(3OYF0U$^n@u5w2511)5Z z@+>laD@;?*#sK{<-R+ooPidMtHt9BV4*EzKPohqy+jvfEGH0zY0~O|&GBY9H95chr zEHx91#B#Us=q}C{Yg!oxG|VL7G}9ON`5AU<;KIiLUb0vv5h8p zC>hWYgWjv0g_HlFvjJ?dZsYrygQ^>_kmOonyddH1paMFpxsBVj(4daTKRhwBlZ;n) z9X0*?%{j)8(UpGVWekAN_zCDtqv~~Q5ZuN|l#X#5zeI6DzBL4j&78?$L5Q(oDMx>2 zxJMq1eRBPCD6Gvx`Z+wF!E67&q4Q-Fq2dx%ox6@iq))V&7N^KQNqb*-o~xvD_SM zOs7+8L+0dV<}7Y4ps*!I=!bC8^Og7IXCG{F}J@q|}Y zj%46T!QMe~`9v?KVc-Mdn+M7HR3V-WJYnb=BzHb>U~f#0D}yrdgvFT*`Tcpk#E_3{ zoO~$GfHLrndL5AWZoH>W)eVt>_Q~^}HWh=&`$qD-k4@DR#rGA@`_@$57kgF!R^B&v zs`|WtP1OUq^S0{q{xwxk6R#n&I zDge$ww}*i_z#jpr_fv)2(0CF$X%`XYd`?52pY$fF;h70Xzf66UH>r9(3cs$(j}o(S zL7Iu@Ty$N>Wwt^-CnA4@hyw0Dq?wxX^PJ$P8MRR z;wu$iudr3&4u!WVl=Bt#jw${Tg{Kt$Lg8x)|Bu2C6n>)6!}$z5V-)iFD)~7I7b;w; zkRMi2-k`8U;mr!=dV%~KihoeyqY9r=_@Y9-x1_!QQg~4z-+{B-$8`nd{z;swkmnuw zu)^yVepz9g!mlbkpir(;)O$ej#})DoGVSqwG4XYU?<>4SMD}tWV-05#v03LTT%fRo zh{$FkvZ3?$5+@tUgBKq@)!lMd*pzx%^(+c|(o>lkcrxgDz5&iap;$KtzS;hZR;eaatNb&f0 z0J5Ho2!GRv=(l`TzEEK~5$&y4e3QaRg|qT;Vo{2awEQn-Q$JDU`Kl?Xe%3Xdo}rsOAxh~pVm z{!4|gD#WoM*A!okTPtky>asDdHpIS%T*q(dL?{NnFR8bk=4++Du` zxMPdN&UXACOZ6f9KUI=7hZwfrI!@^h6$o6e=4C!F^LUxdOFl1oyyWtdgIW3yr$w0W znCh|gaH$agj50f6S;+K7TuEce$TU}>4Ok{J-GJ**Jw6+;ldV^Y0_b(@Re}y6mSM~n zTdx9TII=_-nd#1JEWJF?)L~}5H2Canw+Celk?myLOSJT2?Q;KMeLF5&kH7n!?cVEX z7h6HB-3g$b?LGm%4cSh%z0oLe#yblP+hrR}wjQ>cLG6Cq(Jr>9Si8qSJKN>H&o=C2 z+xs>OoN+wpu!n6fX73izFcIq)o)7eoI!v~`n?XD6J?yZD?J{PM&#Pb})~`HYwt=^k zZEwSn@pxXf%YI<8_4s?w+3rb4yZGrIYuAhV&UX92&=)(|_V~gTf3bKMLLldnQndB{ z2Hx536OMM--_&D0{%afj#p31fDW0u%vhDFZai_hX!yaShe8%ls%-#PH(@Uf1^UNl8+N?B@4#Qozo)S% z=pS{MZ2y8o>}6pypdRgIDLwLsEqgKlo`=1MP;MvN-d#iNO@Y1XP@+AqMcY5#kKixn zUk4gtJJeya?eYG_IUW@b|AI=7^;TH(RM=Cg2Zei3ZYP+LiG6C*EWm%SBkoVNWW3rk z{`+WWyVYoSEy@_jWMn&zIgUCY#o=+-BW))fvH=H8y|0ZI;?HbACA;1C!8_Z17@Oqt z*!5$p>UIooMImk@D8HkfYl_+CI z^+9@bW(%=c=@4u^-j|ZLQ#bUS$(B8eLY!|Mwv2kQf7^{hTQ54qULW*=wh(%@tCvvb zjQ2G-cL;L!Ur6b3zPvlcUO$90C{W2Z{mu}38%u>KgAVPnuk8LSMV~r`U1VL2pin?N JnMyAJ{C^-16$=0W literal 0 HcmV?d00001 diff --git a/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sha256_20230713.lib b/bsp/acm32/acm32h5xx-nucleo/libraries/HAL_Driver/Src/hal_sha256_20230713.lib new file mode 100644 index 0000000000000000000000000000000000000000..21a89ec011b23e0bcd16c8ba7512ae7cbb3e51ac GIT binary patch literal 11670 zcmb_idwf*Yoj>>9xigd8Wb%e21enAKfe#FM@sI*0nPJEa5|Z$U1d~ZJkO_G?88Et5 zA%us@Y6QDdWp~utTJ3&Xx~;W~mRBo6Ypv}n)oT6FZfkkeN^nJdRQCHj_nhSNaCiUM z1LuB!-{0?de&=`2J@?$lBzr+1+}5!uc9#3fl5e4=Y(2W&1%(B|qa~IxW=B1Ey;@#c z-CSQ@S~z=7b45=m!h{?N2YUL~^@h8pqKa8OSM;?9B0;OhAL41Y*@g9i%8T1tk6nz({>8=hg-T1!g>XR`j`Qn&daPr_~NhdDqg-T%Q#qT7Q1*$J*)E&9F^|qHTo+>9K*qyeV zgoln_vboick_*gr9DSB`obeM5b{rO(qaDQ65V!K>+Ri7~mGcRZAGx9NQg&kFr70~LzM8WaQ?{P{k+<>EjeT3s zp44vgy_#Ne>Bg2@FXbeb%*gSVU$S+fW;tI=n692r&|iHMo-GYofBOqN#B$%f4se7aA`_9-pTq?fjgq^qGVEzWZe#B)bk z&Dpx}iIEb=^3tcv3R?SG)wkGGH|E4XlIL`ui(%9J^Zl1U{^D}Jzm(&>=kH;Um&O0) zOh!KEjuGMxMEK}GYRSOaXq%URCgYD26w1Vl7>6wDrgU)sX@8tw_qz*9{LUQe zp`~*m8=0|rdGij<%Z|;&IaP2L6*uqa^)t@wBd{iolqT#vq!cP6CEC2aoYuBhDa+BIjrCtozCy^3A>NSDzhz z?wfBvcV^Ael{bwfjWj+rc=PTzZq546-e(eTAKX@u`_r$+t%$5W82;k>?{0qD z{?22Ok;jf42|f0w?Mn`RaO|ItB)sxOTyF1-Gc%tZid4Sy%>Jg|?fhg@-SS0yyN?xo z`}kCC|I7C@9{SKYb!^E)PrtFe?dSIO)25|vi+z6TyzB{{&%0+VO^KgZ-_Rc$d?B`T zljp?IE!$># zxs$4IFQ59{i~Eaz5SMjR<+E=ttNHo9H6QkRI{r5JV5GP0n**r>$A_Hi%ey|kd~o<& zSM5_Df8&#b7Y1%Sb{WMy6O28KjYeU$1W%&c*oR7OR2r?05hxY5oIpA*zs7MAtZr0| zC9x<8IVMq}B;=Yzjgm0WBwCb&MJBODN${COkCISn5_^<{T9Y`UB&;-vGfF~}Nn)ZT zw3;L~NI)r!k|g?C<*tO#2zJK*d&f92~V2DdCdZ&bC3?B&cf{G%xE6O!Z8XX zFLKt&`!!T}yWmaY>!=D_WobwjD0#6qJPQpP#=uNsBD!&)*BeM-X-?E^%$T+LduDS5 zW)er6lfu%R=+({Vqbu|5EZ<|3XUEP!>h{>=35pTCeveI_rnoWHsy#M&z7np`uGwRg z=Pvnb!!76lU9Ut)e7RMcz6Kv+<3If^Y+RY3`WJ&$h5p3pS z1A%N)cg?9wgq1cLg*A2pHk%@jyvX(82AhG3h3Em)nj$smGesPEkqyehHlv~e*W(~f z#Lbb_63}*{uoa}GV)cpz#|}S3N|JJ;D@E5_iQ^}@l9UzW8B>dy=Bh}!Ib*)@6+=zOhN~zQ zDOi2ktRiKuft_Ot1jNsU-y*|+#zCTCEQ07v;KrD70L_IEI#zs&Vi=}q#Pi@p=D|B| zHusJn^@h&nK~l-~lJrN)G78X7g3i=*5)v&29@?0iadQS^NpKi%Dk!hyV)&2I6i|yb zm7FPB8tF+GckiIW3R1pSmXU<3bG%29u@~^@={ip_V@!W@h8t;S>KF-45%oEN=1h_- zF@;+T%`pk!bU4>Q6|)|PJt~|h ztFgn{CB>k-Q7I`tRhV(JB%diZ!z;<>iqoi(k8()`1Q*(`PN@7#-Nt{}4T$UtWtv2E?em(~-wbsaxBtdO3rbv>gt~NZ9B&khCu_VcA zi}4jnQq*?CD@m%_VN^+yrgj;1l8jUPj9VlbuSSekNz&B;ycLUdGSs__+a$?UHyd|I zGC>_OHcOJF?lg8vGEv>d;{0Iov;^oON-c4&1dpLUPN8aRY_V=_xy^`z@L|{6nDH%1 z8f-S>yOON1IgKAkveFi3ydcRcTcUAPlGV0Uwq>yk9he;%08(`BQq}4+xCgBbUH}PEf*=%q;sHr44=>#=%oFIjGz4t`jjNx&UpTxQ&%Z7K;I=Rr;})U=}umasyGxa zL200gPEgj;G*5Q&IbMP`e2%*z@HyTKf#w*K7^Gke#Uw7I1elu)5maUEBVP=GIr}Z}_f1Y|WnTvWXw062G4K&(Dm1f`XbsZ?%}NTIrKre{uV>4gB{C;PvVR{@ zbesJr0H-oGjdbfrp$82rbPZ4$GJ!u~kVsj};_dD3>+K2lMCQ9o!`*J8p{`)qjc=3g z#oevJ_V!@Adyc2zCU-+`Z`XWxAl%*773f*-UNbv5x2UZ(KYuOrcxGMo-xm&T3Wob< z(Kk&~o>d=iYqETg( zwXP5L%rw84BAfn>rlr2BnWc40$3DYu?CB4!@4=u$JrUO2Tv}IG+SpuQam(W7hQ`{( z&CRUNTgNuSSX9^?VRiL&thBtWpt+*9uD*fGg%-JJRIVNMDPW~zq>#v1i`p`4i(=W@ z>#ZwbI25wl#dXbI|B^c9tr+dtTeW!EXwRdB0tsSv$H{2toQ?KA>Uc#f>ff}~dFK=_ z#kf~Dl;c=iU0oo-Z_;{`7fLYIg+g6qs*Aj)x`@=?>Z%%m&s#+UV)YHavc_g_LtQl{ z*xTH2M_RI{HQg3tB;zqb}v9{D_3f!4i z!DzJ6bKBMt2=kLT59bh{ZNrwsahfk>dDhY^_EG_(JYtG~1gdr2S| zXbmx?6r#7#lYbM_+j_&8xS8EWMR<&KEOoLNE!OE`NlLPss;05=*f2AcOl1Ogx=Ct| zlB-NnJW2xE)77XrAm9T6-4*B+$A-sQagSN5bu;AB~&s^~Yv=O5!S8bD^*WW3b zcYaeblH-ovQSTx$I}$*Y3th99{eA6USDuisEs?U=*L=RS8TmV zr9aY+mE`GQ$TrZ{T~ydHdtd+*cNB|jhxrc$Q|Zi#Lb z==h*-EQ4G@kZrHjXH@EwarEeAgCtL{)Jr^ij7LwlFVl4`QmH3uMrD;L#uQIqrY9Ha z8QR85yY@E1C)>3jD;_=G`JNsJe|1ipuDqbyEu(k^qZl8%U7v-%nD)K9EA>pf_Bv9U zu}n{_*3-&$N0FX3P0yUJJG2;&UHit}9zDmdy{oL#Gtfq>v=8ayhjb0{6niz$qi5OM zIiK!K+N}*1NuVDPYskFHP({CCrDvZ>>=KCynP!_CC*-@Yg=_@*FOL1NocfR zBPGXD1RB&Gb}gpznw%2t+V9|#vy9Txo5TGudw5B$x<|YB6DA1r|%(SMZ**Ige&a)347E*W65mX753y&8wnb|;8}~t@DagM zv@5QB@~4kSV?|>*V+4|hooOMEriAvXWL4u|t%=hnspOR@& z0A-=QkY49WM|)GU>SD(%4rF&(#z%Z9sw~9oMSI$}l2vp3bWZLApOwnkK43nO%5)oJ z^r0(uocRMqEIu?e5C?7sPJ*7wbetxN6r0Z26yPjO+jL+)FrV~k=I;{}r;|9^-$e+% zoe=GY2{Um(nU1H}b|AIuA{3`(I!-rIVpw==rofc~doeE3Kaa5x{#oE8EHUD11@060 z0(6*u_JP0~@aRo^mB6nG{I0+ggvjdyfobq1o-eRU;B5l;34ERqdH-IZhWi?EP^RK$ zM)xumH$9p^LYh()ud6f_#B&I-jHe1-M2PcKA$YC87J=OY?-aO0;KKr+5cpkzF9@W& z74`Rqz&{H7K;Y*BV`!c!Pk}cG%on&&V5PuS0^0@NCh%^7_Y2%BkiO(l{C^X8NZ>01 z-xBzqzz+q|U5whr3(OQaRUmz9Av=9cAzUM{L*Pb%g90BExKH3S0)Hg%rviT`kiG*@ zT)Ow;rpPW6Vr|9HdV@ZZ5GOlT@X3PTAb5em1wvmUc$MHag5M(et%8RH?-qPO@Vf-x zA^81*|C8X43jQrZEJpgILHQjN__Dy)1imHkj{-j+L_2z$rSZklbp%WmI9VX=A*7!z zutZ>$z!rfU1l}%itH2);;yODh_)CPy^Mv593;w3y?+F|c`i}(1&sw~ljS%^yi0imm z=obp~3tUbJzea&ULR`1Kg5OSvJpMuO9fIF4_#=WpCOCbrp?C)f5$6wrpB9MAi?17` z%MnB7>jzzMq`jNwo3>^`Y?*vsvIM#b5jR&Lx1$laV=d;99()ENI^p{UIPK>YFCy#% zgy?*);QI&>m+uRR^C5Ax|986X&~5>(bNC-4grD_Y%F`Zf-MGFv(ApXfZekw(7UgN{ z?e50M2IdI|yF7TR^#lh(?E~ECvAhJywkq=6Tmz9vIMli^66`mdoAL37RCv{4 zqPPA?*lG;*tn0mQU)TH@7Eg$B^jzQc<+++KY-8;$!w{yP-bm21WZ8vh{(ZRX^4g?jLgK%xKVAU}!0p0-|k!5FjQ{nPqt(8fHN z>`0&$ct zXJO6B0y8gk-y|7Jlb2$F60mf6;lFx7vihwSHUjBK&l!lU_W)#Tyg0g4eI3=B-#p9->E*a& zeqV#m8ZXO|ANk98^c#yczY@e7f?XCF?_M}r zBIC7P70+kMkM=+r?+eIq9Ub2*i1#SCEHd7wP+0S;M!a(9C_j2Dkn!GvY|XC&Czj?z zzB$NvwEtP-J#5L3&Wnt<6v3?d^&uYZt+L2?6>ze~+lP4a{L-_aj5p1UH#&cR68V`= z?xr8bzVWJf|7yuE)e`UTW;}Xa;^nWjkfD=B=J$s1lls5HkWb%aM3GH?4Z%8&AEMvm z@S%C8$96dmI)}0iM3w~wJ=@75#e1QUGTGk7GxBG+N6I2?+n})ad)H*lA3CFcX%CS7 zc0rbHAhMHq_poj|($)c+HQufp%zGroqkE`~cPC_OBV*VxxqqiQ6oqV5-2$bbh8yx? z=wy+8X%I-3r5t|NB5kxcp_@KwBR~2zRu<_;_hl)Q?J4;EP&xr=98{izlXblBSjL+J zyBzN`SH)Y6ce=mI#REUt7d^LI - - - -6.1 - -
### uVision Project, (C) Keil Software
- - - - - - - - - - 38003 - Registers - 115 45 - - - 346 - Code Coverage - 665 160 - - - 204 - Performance Analyzer - 825 - - - - - - 35141 - Event Statistics - - 200 50 700 - - - 1506 - Symbols - - 56 56 56 - - - 1936 - Watch 1 - - 200 133 133 - - - 1937 - Watch 2 - - 200 133 133 - - - 1935 - Call Stack + Locals - - 200 133 133 - - - 2506 - Trace Data - - 75 135 130 95 70 230 200 150 - - - 466 - Source Browser - 500 - 300 - - - - - - - - 1 - 1 - 0 - 0 - -1 - - - - - - - 44 - 2 - 3 - - -32000 - -32000 - - - -1 - -1 - - - 0 - 349 - 1374 - 525 - - - - 0 - - 60 - 010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000000000000 - - - - 0 - Build - - -1 - -1 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - AE0000004F000000F1030000B3000000 - - - 16 - 8A000000A10000008202000002010000 - - - - 1005 - 1005 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000DB00000015020000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 109 - 109 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000DB00000015020000 - - - 16 - 8A000000A10000005301000026020000 - - - - 1465 - 1465 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0000000072010000F1030000D3010000 - - - 16 - 8A000000A10000008202000002010000 - - - - 1466 - 1466 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000075010000EE030000A9010000 - - - 16 - 8A000000A10000008202000002010000 - - - - 1467 - 1467 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000075010000EE030000A9010000 - - - 16 - 8A000000A10000008202000002010000 - - - - 1468 - 1468 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000075010000EE030000A9010000 - - - 16 - 8A000000A10000008202000002010000 - - - - 1506 - 1506 - 0 - 0 - 0 - 0 - 32767 - 0 - 16384 - 0 - - 16 - 4A03000066000000EE030000C3000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 1913 - 1913 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B100000066000000EE0300009A000000 - - - 16 - 8A000000A10000008202000002010000 - - - - 1935 - 1935 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 0300000075010000EE030000BA010000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 1936 - 1936 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000075010000EE030000A9010000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 1937 - 1937 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000075010000EE030000A9010000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 1939 - 1939 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000075010000EE030000A9010000 - - - 16 - 8A000000A10000008202000002010000 - - - - 1940 - 1940 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000075010000EE030000A9010000 - - - 16 - 8A000000A10000008202000002010000 - - - - 1941 - 1941 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000075010000EE030000A9010000 - - - 16 - 8A000000A10000008202000002010000 - - - - 1942 - 1942 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000075010000EE030000A9010000 - - - 16 - 8A000000A10000008202000002010000 - - - - 195 - 195 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000DB00000015020000 - - - 16 - 8A000000A10000005301000026020000 - - - - 196 - 196 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000DB00000015020000 - - - 16 - 8A000000A10000005301000026020000 - - - - 197 - 197 - 1 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 000000004602000056050000AE020000 - - - 16 - 8A000000A10000008202000002010000 - - - - 198 - 198 - 0 - 0 - 0 - 0 - 32767 - 0 - 32768 - 0 - - 16 - 000000005E010000F1030000D3010000 - - - 16 - 8A000000A10000008202000002010000 - - - - 199 - 199 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000049020000EE0300007D020000 - - - 16 - 8A000000A10000008202000002010000 - - - - 203 - 203 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - AE00000063000000F1030000B3000000 - - - 16 - 8A000000A10000008202000002010000 - - - - 204 - 204 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B100000066000000EE0300009A000000 - - - 16 - 8A000000A10000008202000002010000 - - - - 221 - 221 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 00000000000000000000000000000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 2506 - 2506 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4703000063000000F10300006B010000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 2507 - 2507 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0000000072010000F1030000C2010000 - - - 16 - 8A000000A10000008202000002010000 - - - - 343 - 343 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B100000066000000EE0300009A000000 - - - 16 - 8A000000A10000008202000002010000 - - - - 346 - 346 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B100000066000000EE0300009A000000 - - - 16 - 8A000000A10000008202000002010000 - - - - 35141 - 35141 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - AE00000063000000F1030000B3000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35824 - 35824 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B100000066000000EE0300009A000000 - - - 16 - 8A000000A10000008202000002010000 - - - - 35885 - 35885 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35886 - 35886 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35887 - 35887 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35888 - 35888 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35889 - 35889 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35890 - 35890 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35891 - 35891 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35892 - 35892 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35893 - 35893 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35894 - 35894 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35895 - 35895 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35896 - 35896 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35897 - 35897 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35898 - 35898 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35899 - 35899 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35900 - 35900 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35901 - 35901 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35902 - 35902 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35903 - 35903 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35904 - 35904 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 35905 - 35905 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 38003 - 38003 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000066000000A7000000BA010000 - - - 16 - 8A000000A10000005301000026020000 - - - - 38007 - 38007 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0000000046020000F103000096020000 - - - 16 - 8A000000A10000008202000002010000 - - - - 436 - 436 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000049020000EE0300007D020000 - - - 16 - 8A000000A10000005301000026020000 - - - - 437 - 437 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000075010000EE030000A9010000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 440 - 440 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000075010000EE030000A9010000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 463 - 463 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000049020000EE0300007D020000 - - - 16 - 8A000000A10000005301000026020000 - - - - 466 - 466 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000049020000EE0300007D020000 - - - 16 - 8A000000A10000005301000026020000 - - - - 470 - 470 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - B100000066000000EE0300009A000000 - - - 16 - 8A000000A10000008202000002010000 - - - - 50000 - 50000 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50001 - 50001 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50002 - 50002 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50003 - 50003 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50004 - 50004 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50005 - 50005 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50006 - 50006 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50007 - 50007 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50008 - 50008 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50009 - 50009 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50010 - 50010 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50011 - 50011 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50012 - 50012 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50013 - 50013 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50014 - 50014 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50015 - 50015 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50016 - 50016 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50017 - 50017 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50018 - 50018 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 50019 - 50019 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 4A03000066000000EE030000EA000000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 59392 - 59392 - 1 - 0 - 0 - 0 - 32767 - 0 - 8192 - 0 - - 16 - 0000000000000000D10300001C000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59393 - 0 - 1 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 00000000AE02000056050000C1020000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59399 - 59399 - 1 - 0 - 0 - 0 - 32767 - 0 - 8192 - 1 - - 16 - 000000001C000000E701000038000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 59400 - 59400 - 0 - 0 - 0 - 0 - 32767 - 0 - 8192 - 2 - - 16 - 00000000380000006F02000054000000 - - - 16 - 0A0000000A0000006E0000006E000000 - - - - 824 - 824 - 0 - 0 - 0 - 0 - 32767 - 0 - 4096 - 0 - - 16 - 0300000075010000EE030000A9010000 - - - 16 - 8A000000A1000000340100002E010000 - - - - 3312 - 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFAE000000B3000000F1030000B7000000000000000100001004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000008A000000A10000008202000002010000AE0000004F000000F1030000B30000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF430300004F000000470300006B010000000000000200001004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C30000018000400000000000008A000000A1000000340100002E010000470300004F000000F10300006B01000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFDE0000004F000000E20000002E020000010000000200001004000000010000002EFFFFFF79040000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000008A000000A1000000340100002E010000000000004F000000DE0000002E0200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF000000005A010000F10300005E01000000000000010000100400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000018000800000000000008A000000A1000000340100002E010000000000005E010000F1030000D301000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFF90100005E010000FD010000D301000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF000000002E0200005605000032020000010000000100001004000000010000000EFEFFFF62000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF01000077940000018000800000010000008A000000A10000008202000002010000000000003202000056050000AE0200000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 - - - 59392 - File - - 2556 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000400020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000004000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000004000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000040000000000000000000000000000000000000100000001000000960000000200205000000000075F5F504B48425496000000000000000100075F5F504B48425400000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000004001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000000000000010000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65FF7F0000 - - - 1423 - 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 1423 - 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 - - - - 59399 - Build - - 986 - 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000002001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000000D41434D3332483558585F525454960000000000000001000D41434D3332483558585F525454000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64FF7F0000 - - - 583 - 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 583 - 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 - - - - 59400 - Debug - - 2373 - 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000000000000100000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000000000000100000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000000000000100000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000000000000100000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F720100000000000000000000000100000001000000000000000000000001000000000000000000054465627567FF7F0000 - - - 898 - 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 - - - 898 - 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 - - - - 0 - 1366 - 768 - - - - -
-- Gitee