From b77241935c9a90145fff6e8625cea7f192ddf1b0 Mon Sep 17 00:00:00 2001 From: Yaochenger <75192526+Yaochenger@users.noreply.github.com> Date: Wed, 28 Dec 2022 02:24:02 +0800 Subject: [PATCH] =?UTF-8?q?[bsp][ch32v208]=E6=B7=BB=E5=8A=A0ch32v208BSP,?= =?UTF-8?q?=E5=90=88=E5=B9=B6libcpu/riscv=20=E4=B8=ADch=E7=B3=BB=E5=88=97?= =?UTF-8?q?=E7=9A=84port=E6=96=87=E4=BB=B6=20(#6780)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【1】添加ch32v208-r0 bsp 【2】合并libcpu/riscv 下ch系列mcu的port文件 --- bsp/wch/risc-v/Libraries/Kconfig | 5 + .../risc-v/Libraries/ch32_drivers/drv_gpio.c | 9 + .../risc-v/Libraries/ch32_drivers/drv_usart.c | 42 +- .../ch32v20x_libraries/.ignore_format.yml | 7 + .../Libraries/ch32v20x_libraries/SConscript | 12 + .../ch32v20x_libraries/bmsis/SConscript | 79 + .../bmsis/include/ch32v20x_conf.h | 40 + .../bmsis/include/ch32v20x_it.h | 21 + .../bmsis/include/core_riscv.h | 327 ++ .../ch32v20x_libraries/bmsis/include/debug.h | 36 + .../bmsis/include/system_ch32v20x.h | 30 + .../bmsis/source/ch32v20x_it.c | 49 + .../bmsis/source/core_riscv.c | 397 ++ .../ch32v20x_libraries/bmsis/source/debug.c | 193 + .../bmsis/source/startup_ch32v20x_D8W.S | 285 + .../bmsis/source/system_ch32v20x.c | 962 ++++ .../ch32v208_hal/SConscript | 78 + .../ch32v208_hal/include/ch32v20x.h | 4817 +++++++++++++++++ .../ch32v208_hal/include/ch32v20x_adc.h | 218 + .../ch32v208_hal/include/ch32v20x_bkp.h | 91 + .../ch32v208_hal/include/ch32v20x_can.h | 358 ++ .../ch32v208_hal/include/ch32v20x_crc.h | 31 + .../ch32v208_hal/include/ch32v20x_dbgmcu.h | 50 + .../ch32v208_hal/include/ch32v20x_dma.h | 182 + .../ch32v208_hal/include/ch32v20x_exti.h | 93 + .../ch32v208_hal/include/ch32v20x_flash.h | 142 + .../ch32v208_hal/include/ch32v20x_gpio.h | 189 + .../ch32v208_hal/include/ch32v20x_i2c.h | 199 + .../ch32v208_hal/include/ch32v20x_iwdg.h | 48 + .../ch32v208_hal/include/ch32v20x_misc.h | 43 + .../ch32v208_hal/include/ch32v20x_opa.h | 72 + .../ch32v208_hal/include/ch32v20x_pwr.h | 62 + .../ch32v208_hal/include/ch32v20x_rcc.h | 255 + .../ch32v208_hal/include/ch32v20x_rtc.h | 96 + .../ch32v208_hal/include/ch32v20x_spi.h | 218 + .../ch32v208_hal/include/ch32v20x_tim.h | 506 ++ .../ch32v208_hal/include/ch32v20x_usart.h | 185 + .../ch32v208_hal/include/ch32v20x_wwdg.h | 39 + .../ch32v208_hal/source/ch32v20x_adc.c | 1208 +++++ .../ch32v208_hal/source/ch32v20x_bkp.c | 242 + .../ch32v208_hal/source/ch32v20x_can.c | 1228 +++++ .../ch32v208_hal/source/ch32v20x_crc.c | 97 + .../ch32v208_hal/source/ch32v20x_dbgmcu.c | 98 + .../ch32v208_hal/source/ch32v20x_dma.c | 430 ++ .../ch32v208_hal/source/ch32v20x_exti.c | 180 + .../ch32v208_hal/source/ch32v20x_flash.c | 965 ++++ .../ch32v208_hal/source/ch32v20x_gpio.c | 671 +++ .../ch32v208_hal/source/ch32v20x_i2c.c | 972 ++++ .../ch32v208_hal/source/ch32v20x_iwdg.c | 120 + .../ch32v208_hal/source/ch32v20x_misc.c | 107 + .../ch32v208_hal/source/ch32v20x_opa.c | 84 + .../ch32v208_hal/source/ch32v20x_pwr.c | 400 ++ .../ch32v208_hal/source/ch32v20x_rcc.c | 1018 ++++ .../ch32v208_hal/source/ch32v20x_rtc.c | 373 ++ .../ch32v208_hal/source/ch32v20x_spi.c | 638 +++ .../ch32v208_hal/source/ch32v20x_tim.c | 2351 ++++++++ .../ch32v208_hal/source/ch32v20x_usart.c | 806 +++ .../ch32v208_hal/source/ch32v20x_wwdg.c | 139 + bsp/wch/risc-v/ch32v103r-evt/rtconfig.py | 8 +- bsp/wch/risc-v/ch32v208v-r0/.config | 980 ++++ bsp/wch/risc-v/ch32v208v-r0/Kconfig | 21 + bsp/wch/risc-v/ch32v208v-r0/README_zh.md | 108 + bsp/wch/risc-v/ch32v208v-r0/SConscript | 15 + bsp/wch/risc-v/ch32v208v-r0/SConstruct | 64 + .../ch32v208v-r0/applications/SConscript | 15 + .../risc-v/ch32v208v-r0/applications/main.c | 30 + bsp/wch/risc-v/ch32v208v-r0/board/Kconfig | 579 ++ bsp/wch/risc-v/ch32v208v-r0/board/SConscript | 17 + bsp/wch/risc-v/ch32v208v-r0/board/board.c | 84 + bsp/wch/risc-v/ch32v208v-r0/board/board.h | 28 + .../board/linker_scripts/link.lds | 194 + .../risc-v/ch32v208v-r0/figures/ch32v208.png | Bin 0 -> 1590139 bytes .../risc-v/ch32v208v-r0/figures/config.png | Bin 0 -> 25714 bytes bsp/wch/risc-v/ch32v208v-r0/figures/dist.png | Bin 0 -> 70589 bytes bsp/wch/risc-v/ch32v208v-r0/figures/end.png | Bin 0 -> 12047 bytes .../risc-v/ch32v208v-r0/figures/import.png | Bin 0 -> 90174 bytes .../risc-v/ch32v208v-r0/figures/prefix.png | Bin 0 -> 53293 bytes bsp/wch/risc-v/ch32v208v-r0/figures/scons.png | Bin 0 -> 62879 bytes .../ch32v208v-r0/figures/sconscompile.jpg | Bin 0 -> 70352 bytes bsp/wch/risc-v/ch32v208v-r0/figures/set.png | Bin 0 -> 17318 bytes .../risc-v/ch32v208v-r0/figures/success.png | Bin 0 -> 87836 bytes bsp/wch/risc-v/ch32v208v-r0/figures/tool.png | Bin 0 -> 233354 bytes .../risc-v/ch32v208v-r0/figures/toolchain.png | Bin 0 -> 80573 bytes .../risc-v/ch32v208v-r0/figures/toolset.png | Bin 0 -> 36462 bytes .../ch32v208v-r0/figures/vscode-terminal.png | Bin 0 -> 44862 bytes .../risc-v/ch32v208v-r0/figures/windows.png | Bin 0 -> 56403 bytes bsp/wch/risc-v/ch32v208v-r0/rtconfig.h | 237 + bsp/wch/risc-v/ch32v208v-r0/rtconfig.py | 70 + bsp/wch/risc-v/ch32v307v-r1/rtconfig.py | 2 +- libcpu/risc-v/SConscript | 4 +- libcpu/risc-v/{ch32v3 => ch32}/SConscript | 0 libcpu/risc-v/{ch32v3 => ch32}/context_gcc.S | 4 + libcpu/risc-v/{ch32v3 => ch32}/cpuport.c | 31 +- libcpu/risc-v/{ch32v1 => ch32}/cpuport.h | 0 .../risc-v/{ch32v3 => ch32}/interrupt_gcc.S | 8 +- libcpu/risc-v/ch32v1/SConscript | 14 - libcpu/risc-v/ch32v1/context_gcc.S | 211 - libcpu/risc-v/ch32v1/cpuport.c | 199 - libcpu/risc-v/ch32v1/interrupt_gcc.S | 191 - libcpu/risc-v/ch32v3/cpuport.h | 44 - 100 files changed, 25076 insertions(+), 675 deletions(-) create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/.ignore_format.yml create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/SConscript create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/SConscript create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/ch32v20x_conf.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/ch32v20x_it.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/core_riscv.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/debug.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/system_ch32v20x.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/ch32v20x_it.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/core_riscv.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/debug.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/startup_ch32v20x_D8W.S create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/system_ch32v20x.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/SConscript create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_adc.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_bkp.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_can.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_crc.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_dbgmcu.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_dma.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_exti.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_flash.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_gpio.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_i2c.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_iwdg.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_misc.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_opa.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_pwr.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_rcc.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_rtc.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_spi.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_tim.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_usart.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_wwdg.h create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_adc.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_bkp.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_can.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_crc.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_dbgmcu.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_dma.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_exti.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_flash.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_gpio.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_i2c.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_iwdg.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_misc.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_opa.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_pwr.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_rcc.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_rtc.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_spi.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_tim.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_usart.c create mode 100644 bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_wwdg.c create mode 100644 bsp/wch/risc-v/ch32v208v-r0/.config create mode 100644 bsp/wch/risc-v/ch32v208v-r0/Kconfig create mode 100644 bsp/wch/risc-v/ch32v208v-r0/README_zh.md create mode 100644 bsp/wch/risc-v/ch32v208v-r0/SConscript create mode 100644 bsp/wch/risc-v/ch32v208v-r0/SConstruct create mode 100644 bsp/wch/risc-v/ch32v208v-r0/applications/SConscript create mode 100644 bsp/wch/risc-v/ch32v208v-r0/applications/main.c create mode 100644 bsp/wch/risc-v/ch32v208v-r0/board/Kconfig create mode 100644 bsp/wch/risc-v/ch32v208v-r0/board/SConscript create mode 100644 bsp/wch/risc-v/ch32v208v-r0/board/board.c create mode 100644 bsp/wch/risc-v/ch32v208v-r0/board/board.h create mode 100644 bsp/wch/risc-v/ch32v208v-r0/board/linker_scripts/link.lds create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/ch32v208.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/config.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/dist.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/end.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/import.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/prefix.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/scons.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/sconscompile.jpg create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/set.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/success.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/tool.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/toolchain.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/toolset.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/vscode-terminal.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/figures/windows.png create mode 100644 bsp/wch/risc-v/ch32v208v-r0/rtconfig.h create mode 100644 bsp/wch/risc-v/ch32v208v-r0/rtconfig.py rename libcpu/risc-v/{ch32v3 => ch32}/SConscript (100%) rename libcpu/risc-v/{ch32v3 => ch32}/context_gcc.S (98%) rename libcpu/risc-v/{ch32v3 => ch32}/cpuport.c (88%) rename libcpu/risc-v/{ch32v1 => ch32}/cpuport.h (100%) rename libcpu/risc-v/{ch32v3 => ch32}/interrupt_gcc.S (97%) delete mode 100644 libcpu/risc-v/ch32v1/SConscript delete mode 100644 libcpu/risc-v/ch32v1/context_gcc.S delete mode 100644 libcpu/risc-v/ch32v1/cpuport.c delete mode 100644 libcpu/risc-v/ch32v1/interrupt_gcc.S delete mode 100644 libcpu/risc-v/ch32v3/cpuport.h diff --git a/bsp/wch/risc-v/Libraries/Kconfig b/bsp/wch/risc-v/Libraries/Kconfig index 70931c692b..298f56a9aa 100644 --- a/bsp/wch/risc-v/Libraries/Kconfig +++ b/bsp/wch/risc-v/Libraries/Kconfig @@ -5,6 +5,11 @@ config SOC_RISCV_SERIES_CH32V1 bool select ARCH_RISCV select SOC_RISCV_FAMILY_CH32 + +config SOC_RISCV_SERIES_CH32V2 + bool + select ARCH_RISCV + select SOC_RISCV_FAMILY_CH32 config SOC_RISCV_SERIES_CH32V3 bool diff --git a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_gpio.c b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_gpio.c index d4a925c6ae..4495a0c2b1 100644 --- a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_gpio.c +++ b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_gpio.c @@ -431,12 +431,21 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) pin_irq_hdr(bit2bitno(GPIO_Pin)); } +#if defined (SOC_RISCV_SERIES_CH32V2) +void EXTI0_IRQHandler(void) __attribute__((interrupt())); +void EXTI1_IRQHandler(void) __attribute__((interrupt())); +void EXTI2_IRQHandler(void) __attribute__((interrupt())); +void EXTI3_IRQHandler(void) __attribute__((interrupt())); +void EXTI4_IRQHandler(void) __attribute__((interrupt())); +void EXTI9_5_IRQHandler(void) __attribute__((interrupt())); +#else void EXTI0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void EXTI1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void EXTI2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void EXTI3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void EXTI4_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void EXTI9_5_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#endif void EXTI0_IRQHandler(void) { diff --git a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_usart.c b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_usart.c index e409acc637..dd79dda1a3 100644 --- a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_usart.c +++ b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_usart.c @@ -369,7 +369,11 @@ static const struct rt_uart_ops ch32_uart_ops = }; #ifdef BSP_USING_UART1 +#if defined (SOC_RISCV_SERIES_CH32V2) +void USART1_IRQHandler(void) __attribute__((interrupt())); +#else void USART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#endif void USART1_IRQHandler(void) { GET_INT_SP(); @@ -381,7 +385,11 @@ void USART1_IRQHandler(void) #endif #ifdef BSP_USING_UART2 +#if defined (SOC_RISCV_SERIES_CH32V2) +void USART2_IRQHandler(void) __attribute__((interrupt())); +#else void USART2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#endif void USART2_IRQHandler(void) { GET_INT_SP(); @@ -393,7 +401,11 @@ void USART2_IRQHandler(void) #endif #ifdef BSP_USING_UART3 +#if defined (SOC_RISCV_SERIES_CH32V2) +void USART3_IRQHandler(void) __attribute__((interrupt())); +#else void USART3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#endif void USART3_IRQHandler(void) { GET_INT_SP(); @@ -405,7 +417,11 @@ void USART3_IRQHandler(void) #endif #ifdef BSP_USING_UART4 -void UART4_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#if defined (SOC_RISCV_SERIES_CH32V2) +void USART4_IRQHandler(void) __attribute__((interrupt())); +#else +void USART4_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#endif void UART4_IRQHandler(void) { GET_INT_SP(); @@ -417,7 +433,11 @@ void UART4_IRQHandler(void) #endif #ifdef BSP_USING_UART5 -void UART5_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#if defined (SOC_RISCV_SERIES_CH32V2) +void USART5_IRQHandler(void) __attribute__((interrupt())); +#else +void USART5_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#endif void UART5_IRQHandler(void) { GET_INT_SP(); @@ -429,7 +449,11 @@ void UART5_IRQHandler(void) #endif #ifdef BSP_USING_UART6 -void UART6_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#if defined (SOC_RISCV_SERIES_CH32V2) +void USART6_IRQHandler(void) __attribute__((interrupt())); +#else +void USART6_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#endif void UART6_IRQHandler(void) { GET_INT_SP(); @@ -441,7 +465,11 @@ void UART6_IRQHandler(void) #endif #ifdef BSP_USING_UART7 -void UART7_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#if defined (SOC_RISCV_SERIES_CH32V2) +void USART7_IRQHandler(void) __attribute__((interrupt())); +#else +void USART7_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#endif void UART7_IRQHandler(void) { GET_INT_SP(); @@ -453,7 +481,11 @@ void UART7_IRQHandler(void) #endif #ifdef BSP_USING_UART8 -void UART8_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#if defined (SOC_RISCV_SERIES_CH32V2) +void USART8_IRQHandler(void) __attribute__((interrupt())); +#else +void USART8_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +#endif void UART8_IRQHandler(void) { GET_INT_SP(); diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/.ignore_format.yml b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/.ignore_format.yml new file mode 100644 index 0000000000..4114abf9b5 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/.ignore_format.yml @@ -0,0 +1,7 @@ +# 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: +- bmsis +- ch32v208_hal diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/SConscript b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/SConscript new file mode 100644 index 0000000000..ca95be14e2 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/SConscript @@ -0,0 +1,12 @@ +import os +from building import * + +objs = [] +cwd = GetCurrentDir() +list = os.listdir(cwd) + +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + objs = objs + SConscript(os.path.join(item, 'SConscript')) + +Return('objs') diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/SConscript b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/SConscript new file mode 100644 index 0000000000..08fcbe8b8c --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/SConscript @@ -0,0 +1,79 @@ +#-*- encoding: utf-8 -*- + +import os +from building import * +Import('RTT_ROOT') +Import('rtconfig') + +#--------------------------------------------------------------------------------- +# Package configuration +#--------------------------------------------------------------------------------- +PKGNAME = "bmsis" +VERSION = "v1.0.0" +DEPENDS = [""] +#DEPENDS = ["PKG_USING_RW007"] + +#--------------------------------------------------------------------------------- +# Compile the configuration +# +# SOURCES: Need to compile c and c++ source, auto search when SOURCES is empty +# +# LOCAL_CPPPATH: Local file path (.h/.c/.cpp) +# LOCAL_CCFLAGS: Local compilation parameter +# LOCAL_ASFLAGS: Local assembly parameters +# +# CPPPATH: Global file path (.h/.c/.cpp), auto search when LOCAL_CPPPATH/CPPPATH +# is empty # no pass!!! +# CCFLAGS: Global compilation parameter +# ASFLAGS: Global assembly parameters +# +# CPPDEFINES: Global macro definition +# LOCAL_CPPDEFINES: Local macro definition +# +# LIBS: Specify the static library that need to be linked +# LIBPATH: Specify the search directory for the library file (.lib/.a) +# +# LINKFLAGS: Link options +#--------------------------------------------------------------------------------- +SOURCES = Glob("./source/*.c") +SOURCES += Glob("./source/startup_ch32v20x_D8W.S") + +LOCAL_CPPPATH = [] +LOCAL_CCFLAGS = "" +LOCAL_ASFLAGS = "" + +CPPPATH = [GetCurrentDir(), os.path.join(GetCurrentDir(), 'include')] +CCFLAGS = "" +ASFLAGS = "" + +CPPDEFINES = [] +LOCAL_CPPDEFINES = [] + +LIBS = [] +LIBPATH = [] + +LINKFLAGS = "" + +SOURCES_IGNORE = [] +CPPPATH_IGNORE = [] + +#--------------------------------------------------------------------------------- +# Main target +#--------------------------------------------------------------------------------- +objs = DefineGroup(name = PKGNAME, src = SOURCES, depend = DEPENDS, + CPPPATH = CPPPATH, + CCFLAGS = CCFLAGS, + ASFLAGS = ASFLAGS, + LOCAL_CPPPATH = LOCAL_CPPPATH, + LOCAL_CCFLAGS = LOCAL_CCFLAGS, + LOCAL_ASFLAGS = LOCAL_ASFLAGS, + CPPDEFINES = CPPDEFINES, + LOCAL_CPPDEFINES = LOCAL_CPPDEFINES, + LIBS = LIBS, + LIBPATH = LIBPATH, + LINKFLAGS = LINKFLAGS) + +Return("objs") +#--------------------------------------------------------------------------------- +# End +#--------------------------------------------------------------------------------- diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/ch32v20x_conf.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/ch32v20x_conf.h new file mode 100644 index 0000000000..6142fd8c6a --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/ch32v20x_conf.h @@ -0,0 +1,40 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_conf.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : Library configuration file. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_CONF_H +#define __CH32V20x_CONF_H + +#include "ch32v20x_adc.h" +#include "ch32v20x_bkp.h" +#include "ch32v20x_can.h" +#include "ch32v20x_crc.h" +#include "ch32v20x_dbgmcu.h" +#include "ch32v20x_dma.h" +#include "ch32v20x_exti.h" +#include "ch32v20x_flash.h" +#include "ch32v20x_gpio.h" +#include "ch32v20x_i2c.h" +#include "ch32v20x_iwdg.h" +#include "ch32v20x_pwr.h" +#include "ch32v20x_rcc.h" +#include "ch32v20x_rtc.h" +#include "ch32v20x_spi.h" +#include "ch32v20x_tim.h" +#include "ch32v20x_usart.h" +#include "ch32v20x_wwdg.h" +#include "ch32v20x_it.h" +#include "ch32v20x_misc.h" + + +#endif /* __CH32V20x_CONF_H */ + + + + + diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/ch32v20x_it.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/ch32v20x_it.h new file mode 100644 index 0000000000..c750e9be44 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/ch32v20x_it.h @@ -0,0 +1,21 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_it.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains the headers of the interrupt handlers. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_IT_H +#define __CH32V20x_IT_H + +#include "debug.h" + +#define GET_INT_SP() asm("csrrw sp,mscratch,sp") +#define FREE_INT_SP() asm("csrrw sp,mscratch,sp") + + +#endif /* __CH32V20x_IT_H */ + + diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/core_riscv.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/core_riscv.h new file mode 100644 index 0000000000..6591159043 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/core_riscv.h @@ -0,0 +1,327 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : core_riscv.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : RISC-V Core Peripheral Access Layer Header File for CH32V20x + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CORE_RISCV_H__ +#define __CORE_RISCV_H__ + +/* IO definitions */ +#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 */ + +/* Standard Peripheral Library old types (maintained for legacy purpose) */ +typedef __I uint64_t vuc64; /* Read Only */ +typedef __I uint32_t vuc32; /* Read Only */ +typedef __I uint16_t vuc16; /* Read Only */ +typedef __I uint8_t vuc8; /* Read Only */ + +typedef const uint64_t uc64; /* Read Only */ +typedef const uint32_t uc32; /* Read Only */ +typedef const uint16_t uc16; /* Read Only */ +typedef const uint8_t uc8; /* Read Only */ + +typedef __I int64_t vsc64; /* Read Only */ +typedef __I int32_t vsc32; /* Read Only */ +typedef __I int16_t vsc16; /* Read Only */ +typedef __I int8_t vsc8; /* Read Only */ + +typedef const int64_t sc64; /* Read Only */ +typedef const int32_t sc32; /* Read Only */ +typedef const int16_t sc16; /* Read Only */ +typedef const int8_t sc8; /* Read Only */ + +typedef __IO uint64_t vu64; +typedef __IO uint32_t vu32; +typedef __IO uint16_t vu16; +typedef __IO uint8_t vu8; + +typedef uint64_t u64; +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + +typedef __IO int64_t vs64; +typedef __IO int32_t vs32; +typedef __IO int16_t vs16; +typedef __IO int8_t vs8; + +typedef int64_t s64; +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; + +typedef enum {NoREADY = 0, READY = !NoREADY} ErrorStatus; + +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; + +#define RV_STATIC_INLINE static inline + +/* memory mapped structure for Program Fast Interrupt Controller (PFIC) */ +typedef struct{ + __I uint32_t ISR[8]; + __I uint32_t IPR[8]; + __IO uint32_t ITHRESDR; + __IO uint32_t RESERVED; + __IO uint32_t CFGR; + __I uint32_t GISR; + uint8_t VTFIDR[4]; + uint8_t RESERVED0[12]; + __IO uint32_t VTFADDR[4]; + uint8_t RESERVED1[0x90]; + __O uint32_t IENR[8]; + uint8_t RESERVED2[0x60]; + __O uint32_t IRER[8]; + uint8_t RESERVED3[0x60]; + __O uint32_t IPSR[8]; + uint8_t RESERVED4[0x60]; + __O uint32_t IPRR[8]; + uint8_t RESERVED5[0x60]; + __IO uint32_t IACTR[8]; + uint8_t RESERVED6[0xE0]; + __IO uint8_t IPRIOR[256]; + uint8_t RESERVED7[0x810]; + __IO uint32_t SCTLR; +}PFIC_Type; + +/* memory mapped structure for SysTick */ +typedef struct +{ + __IO u32 CTLR; + __IO u32 SR; + __IO u64 CNT; + __IO u64 CMP; +}SysTick_Type; + + +#define PFIC ((PFIC_Type *) 0xE000E000 ) +#define NVIC PFIC +#define NVIC_KEY1 ((uint32_t)0xFA050000) +#define NVIC_KEY2 ((uint32_t)0xBCAF0000) +#define NVIC_KEY3 ((uint32_t)0xBEEF0000) + +#define SysTick ((SysTick_Type *) 0xE000F000) + +/* risc-v specific functions */ +RV_STATIC_INLINE void __enable_irq() { __asm volatile ("csrw 0x800, %0" : : "r" (0x6088) ); } +RV_STATIC_INLINE void __disable_irq() { __asm volatile ("csrw 0x800, %0" : : "r" (0x6000) ); } +RV_STATIC_INLINE void __NOP() { __asm volatile ("nop"); } + + + +/* ########################## NVIC functions #################################### */ + +/******************************************************************************* +* Function Name : NVIC_EnableIRQ +* Description : Enable Interrupt +* Input : IRQn: Interrupt Numbers +* Return : None +*******************************************************************************/ +RV_STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn){ + NVIC->IENR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + +/******************************************************************************* +* Function Name : NVIC_DisableIRQ +* Description : Disable Interrupt +* Input : IRQn: Interrupt Numbers +* Return : None +*******************************************************************************/ +RV_STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->IRER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + +/******************************************************************************* +* Function Name : NVIC_GetStatusIRQ +* Description : Get Interrupt Enable State +* Input : IRQn: Interrupt Numbers +* Return : 1: Interrupt Enable +* 0: Interrupt Disable +*******************************************************************************/ +RV_STATIC_INLINE uint32_t NVIC_GetStatusIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->ISR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); +} + +/******************************************************************************* +* Function Name : NVIC_GetPendingIRQ +* Description : Get Interrupt Pending State +* Input : IRQn: Interrupt Numbers +* Return : 1: Interrupt Pending Enable +* 0: Interrupt Pending Disable +*******************************************************************************/ +RV_STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->IPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); +} + +/******************************************************************************* +* Function Name : NVIC_SetPendingIRQ +* Description : Set Interrupt Pending +* Input : IRQn: Interrupt Numbers +* Return : None +*******************************************************************************/ +RV_STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->IPSR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + +/******************************************************************************* +* Function Name : NVIC_ClearPendingIRQ +* Description : Clear Interrupt Pending +* Input : IRQn: Interrupt Numbers +* Return : None +*******************************************************************************/ +RV_STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->IPRR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + +/******************************************************************************* +* Function Name : NVIC_GetActive +* Description : Get Interrupt Active State +* Input : IRQn: Interrupt Numbers +* Return : 1: Interrupt Active +* 0: Interrupt No Active +*******************************************************************************/ +RV_STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return((uint32_t)((NVIC->IACTR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); +} + +/******************************************************************************* +* Function Name : NVIC_SetPriority +* Description : Set Interrupt Priority +* Input : IRQn: Interrupt Numbers +* priority: bit7:pre-emption priority +* bit6-bit4: subpriority +* Return : None +*******************************************************************************/ +RV_STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint8_t priority) +{ + NVIC->IPRIOR[(uint32_t)(IRQn)] = priority; +} + +/******************************************************************************* +* Function Name : __WFI +* Description : Wait for Interrupt +* Input : None +* Return : None +*******************************************************************************/ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __WFI(void) +{ + NVIC->SCTLR &= ~(1<<3); // wfi + asm volatile ("wfi"); +} + +/******************************************************************************* +* Function Name : __WFE +* Description : Wait for Events +* Input : None +* Return : None +*******************************************************************************/ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __WFE(void) +{ + uint32_t t; + + t = NVIC->SCTLR; + NVIC->SCTLR |= (1<<3)|(1<<5); // (wfi->wfe)+(__sev) + NVIC->SCTLR = (NVIC->SCTLR & ~(1<<5)) | ( t & (1<<5)); + asm volatile ("wfi"); + asm volatile ("wfi"); +} + +/******************************************************************************* +* Function Name : SetVTFIRQ +* Description : Set VTF Interrupt +* Input : addr��VTF interrupt service function base address. +* IRQn��Interrupt Numbers +* num��VTF Interrupt Numbers +* NewState: DISABLE or ENABLE +* Return : None +*******************************************************************************/ +RV_STATIC_INLINE void SetVTFIRQ(uint32_t addr, IRQn_Type IRQn, uint8_t num, FunctionalState NewState){ + if(num > 3) return ; + + if (NewState != DISABLE) + { + NVIC->VTFIDR[num] = IRQn; + NVIC->VTFADDR[num] = ((addr&0xF00FFFFE)|0x1); + } + else{ + NVIC->VTFIDR[num] = IRQn; + NVIC->VTFADDR[num] = ((addr&0xF00FFFFE)&(~0x1)); + } +} + +/******************************************************************************* +* Function Name : NVIC_SystemReset +* Description : Initiate a system reset request +* Input : None +* Return : None +*******************************************************************************/ +RV_STATIC_INLINE void NVIC_SystemReset(void) +{ + NVIC->CFGR = NVIC_KEY3|(1<<7); +} + + + +/* Core_Exported_Functions */ +extern uint32_t __get_FFLAGS(void); +extern void __set_FFLAGS(uint32_t value); +extern uint32_t __get_FRM(void); +extern void __set_FRM(uint32_t value); +extern uint32_t __get_FCSR(void); +extern void __set_FCSR(uint32_t value); +extern uint32_t __get_MSTATUS(void); +extern void __set_MSTATUS(uint32_t value); +extern uint32_t __get_MISA(void); +extern void __set_MISA(uint32_t value); +extern uint32_t __get_MIE(void); +extern void __set_MIE(uint32_t value); +extern uint32_t __get_MTVEC(void); +extern void __set_MTVEC(uint32_t value); +extern uint32_t __get_MSCRATCH(void); +extern void __set_MSCRATCH(uint32_t value); +extern uint32_t __get_MEPC(void); +extern void __set_MEPC(uint32_t value); +extern uint32_t __get_MCAUSE(void); +extern void __set_MCAUSE(uint32_t value); +extern uint32_t __get_MTVAL(void); +extern void __set_MTVAL(uint32_t value); +extern uint32_t __get_MIP(void); +extern void __set_MIP(uint32_t value); +extern uint32_t __get_MCYCLE(void); +extern void __set_MCYCLE(uint32_t value); +extern uint32_t __get_MCYCLEH(void); +extern void __set_MCYCLEH(uint32_t value); +extern uint32_t __get_MINSTRET(void); +extern void __set_MINSTRET(uint32_t value); +extern uint32_t __get_MINSTRETH(void); +extern void __set_MINSTRETH(uint32_t value); +extern uint32_t __get_MVENDORID(void); +extern uint32_t __get_MARCHID(void); +extern uint32_t __get_MIMPID(void); +extern uint32_t __get_MHARTID(void); +extern uint32_t __get_SP(void); + + +#endif + + + + + diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/debug.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/debug.h new file mode 100644 index 0000000000..efce13c64a --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/debug.h @@ -0,0 +1,36 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : debug.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for UART +* Printf , Delay functions. +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* SPDX-License-Identifier: Apache-2.0 +*******************************************************************************/ +#ifndef __DEBUG_H +#define __DEBUG_H + +#include "stdio.h" +#include "ch32v20x.h" + +/* UART Printf Definition */ +#define DEBUG_UART1 1 +#define DEBUG_UART2 2 +#define DEBUG_UART3 3 + +/* DEBUG UATR Definition */ +#define DEBUG DEBUG_UART1 +//#define DEBUG DEBUG_UART2 +//#define DEBUG DEBUG_UART3 + + +void Delay_Init(void); +void Delay_Us (uint32_t n); +void Delay_Ms (uint32_t n); +void USART_Printf_Init(uint32_t baudrate); + +#endif + + + diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/system_ch32v20x.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/system_ch32v20x.h new file mode 100644 index 0000000000..1020832b3f --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/include/system_ch32v20x.h @@ -0,0 +1,30 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : system_ch32v20x.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : CH32V20x Device Peripheral Access Layer System Header File. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __SYSTEM_ch32v20x_H +#define __SYSTEM_ch32v20x_H + +#ifdef __cplusplus + extern "C" { +#endif + +extern uint32_t SystemCoreClock; /* System Clock Frequency (Core Clock) */ + +/* System_Exported_Functions */ +extern void SystemInit(void); +extern void SystemCoreClockUpdate(void); + +#ifdef __cplusplus +} +#endif + +#endif /*__CH32V20x_SYSTEM_H */ + + + diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/ch32v20x_it.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/ch32v20x_it.c new file mode 100644 index 0000000000..768cf57af6 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/ch32v20x_it.c @@ -0,0 +1,49 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_it.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : Main Interrupt Service Routines. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#include "ch32v20x_it.h" +#include "board.h" +#include +void NMI_Handler(void) __attribute__((interrupt())); +void HardFault_Handler(void) __attribute__((interrupt())); + +/********************************************************************* + * @fn NMI_Handler + * + * @brief This function handles NMI exception. + * + * @return none + */ +void NMI_Handler(void) +{ + GET_INT_SP(); + rt_interrupt_enter(); + rt_kprintf(" NMI Handler\r\n"); + rt_interrupt_leave(); + FREE_INT_SP(); +} + +/********************************************************************* + * @fn HardFault_Handler + * + * @brief This function handles Hard Fault exception. + * + * @return none + */ +void HardFault_Handler(void) +{ + GET_INT_SP(); + rt_interrupt_enter(); + rt_kprintf(" hardfult\r\n"); + rt_interrupt_leave(); + FREE_INT_SP(); + +} + + diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/core_riscv.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/core_riscv.c new file mode 100644 index 0000000000..0a176917be --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/core_riscv.c @@ -0,0 +1,397 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : core_riscv.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : RISC-V Core Peripheral Access Layer Source File + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#include + +/* define compiler specific symbols */ +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */ + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + +#endif + + +/** + * @brief Return the Floating-Point Accrued Exceptions + */ +uint32_t __get_FFLAGS(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "fflags" : "=r" (result) ); + return (result); +} + +/** + * @brief Set the Floating-Point Accrued Exceptions + */ +void __set_FFLAGS(uint32_t value) +{ + __ASM volatile ("csrw fflags, %0" : : "r" (value) ); +} + +/** + * @brief Return the Floating-Point Dynamic Rounding Mode + */ +uint32_t __get_FRM(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "frm" : "=r" (result) ); + return (result); +} + +/** + * @brief Set the Floating-Point Dynamic Rounding Mode + */ +void __set_FRM(uint32_t value) +{ + __ASM volatile ("csrw frm, %0" : : "r" (value) ); +} + +/** + * @brief Return the Floating-Point Control and Status Register + */ +uint32_t __get_FCSR(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "fcsr" : "=r" (result) ); + return (result); +} + +/** + * @brief Set the Floating-Point Control and Status Register + */ +void __set_FCSR(uint32_t value) +{ + __ASM volatile ("csrw fcsr, %0" : : "r" (value) ); +} + +/** + * @brief Return the Machine Status Register + */ +uint32_t __get_MSTATUS(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mstatus" : "=r" (result) ); + return (result); +} + +/** + * @brief Set the Machine Status Register + */ +void __set_MSTATUS(uint32_t value) +{ + __ASM volatile ("csrw mstatus, %0" : : "r" (value) ); +} + +/** + * @brief Return the Machine ISA Register + */ +uint32_t __get_MISA(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "misa" : "=r" (result) ); + return (result); +} + +/** + * @brief Set the Machine ISA Register + */ +void __set_MISA(uint32_t value) +{ + __ASM volatile ("csrw misa, %0" : : "r" (value) ); +} + +/** + * @brief Return the Machine Interrupt Enable Register + */ +uint32_t __get_MIE(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mie" : "=r" (result) ); + return (result); +} + +/** + * @brief Set the Machine ISA Register + */ +void __set_MIE(uint32_t value) +{ + __ASM volatile ("csrw mie, %0" : : "r" (value) ); +} + + +/** + * @brief Return the Machine Trap-Vector Base-Address Register + */ +uint32_t __get_MTVEC(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mtvec" : "=r" (result) ); + return (result); +} + +/** + * @brief Set the Machine Trap-Vector Base-Address Register + */ +void __set_MTVEC(uint32_t value) +{ + __ASM volatile ("csrw mtvec, %0" : : "r" (value) ); +} + +/** + * @brief Return the Machine Seratch Register + */ +uint32_t __get_MSCRATCH(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mscratch" : "=r" (result) ); + return (result); +} + +/** + * @brief Set the Machine Seratch Register + */ +void __set_MSCRATCH(uint32_t value) +{ + __ASM volatile ("csrw mscratch, %0" : : "r" (value) ); +} + +/** + * @brief Return the Machine Exception Program Register + */ +uint32_t __get_MEPC(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mepc" : "=r" (result) ); + return (result); +} + +/** + * @brief Set the Machine Exception Program Register + */ +void __set_MEPC(uint32_t value) +{ + __ASM volatile ("csrw mepc, %0" : : "r" (value) ); +} + +/** + * @brief Return the Machine Cause Register + */ +uint32_t __get_MCAUSE(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mcause" : "=r" (result) ); + return (result); +} + +/** + * @brief Set the Machine Cause Register + */ +void __set_MCAUSE(uint32_t value) +{ + __ASM volatile ("csrw mcause, %0" : : "r" (value) ); +} + +/** + * @brief Return the Machine Trap Value Register + */ +uint32_t __get_MTVAL(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mtval" : "=r" (result) ); + return (result); +} + +/** + * @brief Set the Machine Trap Value Register + */ +void __set_MTVAL(uint32_t value) +{ + __ASM volatile ("csrw mtval, %0" : : "r" (value) ); +} + +/** + * @brief Return the Machine Interrupt Pending Register + */ +uint32_t __get_MIP(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mip" : "=r" (result) ); + return (result); +} + +/** + * @brief Set the Machine Interrupt Pending Register + */ +void __set_MIP(uint32_t value) +{ + __ASM volatile ("csrw mip, %0" : : "r" (value) ); +} + +/** + * @brief Return Lower 32 bits of Cycle counter + */ +uint32_t __get_MCYCLE(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mcycle" : "=r" (result) ); + return (result); +} + +/** + * @brief Set Lower 32 bits of Cycle counter + */ +void __set_MCYCLE(uint32_t value) +{ + __ASM volatile ("csrw mcycle, %0" : : "r" (value) ); +} + +/** + * @brief Return Upper 32 bits of Cycle counter + */ +uint32_t __get_MCYCLEH(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mcycleh" : "=r" (result) ); + return (result); +} + +/** + * @brief Set Upper 32 bits of Cycle counter + */ +void __set_MCYCLEH(uint32_t value) +{ + __ASM volatile ("csrw mcycleh, %0" : : "r" (value) ); +} + +/** + * @brief Return Lower 32 bits of Instructions-retired counter + */ +uint32_t __get_MINSTRET(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "minstret" : "=r" (result) ); + return (result); +} + +/** + * @brief Set Lower 32 bits of Instructions-retired counter + */ +void __set_MINSTRET(uint32_t value) +{ + __ASM volatile ("csrw minstret, %0" : : "r" (value) ); +} + +/** + * @brief Return Upper 32 bits of Instructions-retired counter + */ +uint32_t __get_MINSTRETH(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "minstreth" : "=r" (result) ); + return (result); +} + +/** + * @brief Set Upper 32 bits of Instructions-retired counter + */ +void __set_MINSTRETH(uint32_t value) +{ + __ASM volatile ("csrw minstreth, %0" : : "r" (value) ); +} + +/** + * @brief Return Vendor ID Register + */ +uint32_t __get_MVENDORID(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mvendorid" : "=r" (result) ); + return (result); +} + +/** + * @brief Return Machine Architecture ID Register + */ +uint32_t __get_MARCHID(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "marchid" : "=r" (result) ); + return (result); +} + +/** + * @brief Return Machine Implementation ID Register + */ +uint32_t __get_MIMPID(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mimpid" : "=r" (result) ); + return (result); +} + +/** + * @brief Return Hart ID Register + */ +uint32_t __get_MHARTID(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mhartid" : "=r" (result) ); + return (result); +} + +/** + * @brief Return SP Register + */ +uint32_t __get_SP(void) +{ + uint32_t result; + + asm volatile ( + "mv %0," "sp" + : "=r"(result) + : + ); + return (result); +} + + + diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/debug.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/debug.c new file mode 100644 index 0000000000..b9ef9b40e6 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/debug.c @@ -0,0 +1,193 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : debug.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for UART +* Printf , Delay functions. +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* SPDX-License-Identifier: Apache-2.0 +*******************************************************************************/ +#include "debug.h" + +static uint8_t p_us = 0; +static uint16_t p_ms = 0; + +/********************************************************************* + * @fn Delay_Init + * + * @brief Initializes Delay Funcation. + * + * @return none + */ +void Delay_Init(void) +{ + p_us = SystemCoreClock / 8000000; + p_ms = (uint16_t)p_us * 1000; +} + +/********************************************************************* + * @fn Delay_Us + * + * @brief Microsecond Delay Time. + * + * @param n - Microsecond number. + * + * @return None + */ +void Delay_Us(uint32_t n) +{ + uint32_t i; + + SysTick->SR &= ~(1 << 0); + i = (uint32_t)n * p_us; + + SysTick->CMP = i; + SysTick->CTLR |= (1 << 4) | (1 << 5) | (1 << 0); + + while((SysTick->SR & (1 << 0)) != (1 << 0)) + ; + SysTick->CTLR &= ~(1 << 0); +} + +/********************************************************************* + * @fn Delay_Ms + * + * @brief Millisecond Delay Time. + * + * @param n - Millisecond number. + * + * @return None + */ +void Delay_Ms(uint32_t n) +{ + uint32_t i; + + SysTick->SR &= ~(1 << 0); + i = (uint32_t)n * p_ms; + + SysTick->CMP = i; + SysTick->CTLR |= (1 << 4) | (1 << 5) | (1 << 0); + + while((SysTick->SR & (1 << 0)) != (1 << 0)) + ; + SysTick->CTLR &= ~(1 << 0); +} + +/********************************************************************* + * @fn USART_Printf_Init + * + * @brief Initializes the USARTx peripheral. + * + * @param baudrate - USART communication baud rate. + * + * @return None + */ +void USART_Printf_Init(uint32_t baudrate) +{ + GPIO_InitTypeDef GPIO_InitStructure; + USART_InitTypeDef USART_InitStructure; + +#if(DEBUG == DEBUG_UART1) + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOA, &GPIO_InitStructure); + +#elif(DEBUG == DEBUG_UART2) + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOA, &GPIO_InitStructure); + +#elif(DEBUG == DEBUG_UART3) + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOB, &GPIO_InitStructure); + +#endif + + USART_InitStructure.USART_BaudRate = baudrate; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Tx; + +#if(DEBUG == DEBUG_UART1) + USART_Init(USART1, &USART_InitStructure); + USART_Cmd(USART1, ENABLE); + +#elif(DEBUG == DEBUG_UART2) + USART_Init(USART2, &USART_InitStructure); + USART_Cmd(USART2, ENABLE); + +#elif(DEBUG == DEBUG_UART3) + USART_Init(USART3, &USART_InitStructure); + USART_Cmd(USART3, ENABLE); + +#endif +} + +/********************************************************************* + * @fn _write + * + * @brief Support Printf Function + * + * @param *buf - UART send Data. + * size - Data length + * + * @return size: Data length + */ +__attribute__((used)) int _write(int fd, char *buf, int size) +{ + int i; + + for(i = 0; i < size; i++) + { +#if(DEBUG == DEBUG_UART1) + while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); + USART_SendData(USART1, *buf++); +#elif(DEBUG == DEBUG_UART2) + while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); + USART_SendData(USART2, *buf++); +#elif(DEBUG == DEBUG_UART3) + while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); + USART_SendData(USART3, *buf++); +#endif + } + + return size; +} + +/********************************************************************* + * @fn _sbrk + * + * @brief Change the spatial position of data segment. + * + * @return size: Data length + */ +void *_sbrk(ptrdiff_t incr) +{ + extern char _end[]; + extern char _heap_end[]; + static char *curbrk = _end; + + if ((curbrk + incr < _end) || (curbrk + incr > _heap_end)) + return NULL - 1; + + curbrk += incr; + return curbrk - incr; +} + + + diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/startup_ch32v20x_D8W.S b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/startup_ch32v20x_D8W.S new file mode 100644 index 0000000000..565d522bc1 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/startup_ch32v20x_D8W.S @@ -0,0 +1,285 @@ +;/********************************** (C) COPYRIGHT ******************************* +;* File Name : startup_ch32v20x_D8W.s +;* Author : WCH +;* Version : V1.0.0 +;* Date : 2021/06/06 +;* Description : CH32V208x +;* vector table for eclipse toolchain. +;* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +;* SPDX-License-Identifier: Apache-2.0 +;*******************************************************************************/ + + .section .init,"ax",@progbits + .global _start + .align 1 +_start: + j handle_reset + .word 0x00000013 + .word 0x00000013 + .word 0x00000013 + .word 0x00000013 + .word 0x00000013 + .word 0x00000013 + .word 0x00000013 + .word 0x00000013 + .word 0x00000013 + .word 0x00000013 + .word 0x00000013 + .word 0x00000013 + .word 0x00100073 + .section .vector,"ax",@progbits + .align 1 +_vector_base: + .option norvc; + .word _start + .word 0 + .word NMI_Handler /* NMI */ + .word HardFault_Handler /* Hard Fault */ + .word 0 + .word Ecall_M_Mode_Handler /* Ecall M Mode */ + .word 0 + .word 0 + .word Ecall_U_Mode_Handler /* Ecall U Mode */ + .word Break_Point_Handler /* Break Point */ + .word 0 + .word 0 + .word SysTick_Handler /* SysTick */ + .word 0 + .word SW_handler /* SW */ + .word 0 + /* External Interrupts */ + .word WWDG_IRQHandler /* Window Watchdog */ + .word PVD_IRQHandler /* PVD through EXTI Line detect */ + .word TAMPER_IRQHandler /* TAMPER */ + .word RTC_IRQHandler /* RTC */ + .word FLASH_IRQHandler /* Flash */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line 0 */ + .word EXTI1_IRQHandler /* EXTI Line 1 */ + .word EXTI2_IRQHandler /* EXTI Line 2 */ + .word EXTI3_IRQHandler /* EXTI Line 3 */ + .word EXTI4_IRQHandler /* EXTI Line 4 */ + .word DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */ + .word DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */ + .word DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */ + .word DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */ + .word DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */ + .word DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */ + .word DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */ + .word ADC1_2_IRQHandler /* ADC1_2 */ + .word USB_HP_CAN1_TX_IRQHandler /* USB HP and CAN1 TX */ + .word USB_LP_CAN1_RX0_IRQHandler /* USB LP and CAN1RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* EXTI Line 9..5 */ + .word TIM1_BRK_IRQHandler /* TIM1 Break */ + .word TIM1_UP_IRQHandler /* TIM1 Update */ + .word TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* EXTI Line 15..10 */ + .word RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */ + .word USBWakeUp_IRQHandler /* USB Wake up from suspend */ + .word USBHD_IRQHandler /* USBHD Break */ + .word USBHDWakeUp_IRQHandler /* USBHD Wake up from suspend */ + .word ETH_IRQHandler /* ETH global */ + .word ETHWakeUp_IRQHandler /* ETH Wake up */ + .word BB_IRQHandler /* BLE BB */ + .word LLE_IRQHandler /* BLE LLE */ + .word TIM5_IRQHandler /* TIM5 */ + .word UART4_IRQHandler /* UART4 */ + .word DMA1_Channel8_IRQHandler /* DMA1 Channel8 */ + .word OSC32KCal_IRQHandler /* OSC32KCal */ + .word OSCWakeUp_IRQHandler /* OSC Wake Up */ + + .option rvc; + + .section .text.vector_handler, "ax", @progbits + .weak NMI_Handler /* NMI */ + .weak HardFault_Handler /* Hard Fault */ + .weak Ecall_M_Mode_Handler /* Ecall M Mode */ + .weak Ecall_U_Mode_Handler /* Ecall U Mode */ + .weak Break_Point_Handler /* Break Point */ + .weak SysTick_Handler /* SysTick */ + .weak SW_handler /* SW */ + .weak WWDG_IRQHandler /* Window Watchdog */ + .weak PVD_IRQHandler /* PVD through EXTI Line detect */ + .weak TAMPER_IRQHandler /* TAMPER */ + .weak RTC_IRQHandler /* RTC */ + .weak FLASH_IRQHandler /* Flash */ + .weak RCC_IRQHandler /* RCC */ + .weak EXTI0_IRQHandler /* EXTI Line 0 */ + .weak EXTI1_IRQHandler /* EXTI Line 1 */ + .weak EXTI2_IRQHandler /* EXTI Line 2 */ + .weak EXTI3_IRQHandler /* EXTI Line 3 */ + .weak EXTI4_IRQHandler /* EXTI Line 4 */ + .weak DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */ + .weak DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */ + .weak DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */ + .weak DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */ + .weak DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */ + .weak DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */ + .weak DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */ + .weak ADC1_2_IRQHandler /* ADC1_2 */ + .weak USB_HP_CAN1_TX_IRQHandler /* USB HP and CAN1 TX */ + .weak USB_LP_CAN1_RX0_IRQHandler /* USB LP and CAN1RX0 */ + .weak CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .weak CAN1_SCE_IRQHandler /* CAN1 SCE */ + .weak EXTI9_5_IRQHandler /* EXTI Line 9..5 */ + .weak TIM1_BRK_IRQHandler /* TIM1 Break */ + .weak TIM1_UP_IRQHandler /* TIM1 Update */ + .weak TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */ + .weak TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .weak TIM2_IRQHandler /* TIM2 */ + .weak TIM3_IRQHandler /* TIM3 */ + .weak TIM4_IRQHandler /* TIM4 */ + .weak I2C1_EV_IRQHandler /* I2C1 Event */ + .weak I2C1_ER_IRQHandler /* I2C1 Error */ + .weak I2C2_EV_IRQHandler /* I2C2 Event */ + .weak I2C2_ER_IRQHandler /* I2C2 Error */ + .weak SPI1_IRQHandler /* SPI1 */ + .weak SPI2_IRQHandler /* SPI2 */ + .weak USART1_IRQHandler /* USART1 */ + .weak USART2_IRQHandler /* USART2 */ + .weak USART3_IRQHandler /* USART3 */ + .weak EXTI15_10_IRQHandler /* EXTI Line 15..10 */ + .weak RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */ + .weak USBWakeUp_IRQHandler /* USB Wakeup from suspend */ + .weak USBHD_IRQHandler /* USBHD */ + .weak USBHDWakeUp_IRQHandler /* USBHD Wake Up */ + .weak ETH_IRQHandler /* ETH global */ + .weak ETHWakeUp_IRQHandler /* ETHWakeUp */ + .weak BB_IRQHandler /* BLE BB */ + .weak LLE_IRQHandler /* BLE LLE */ + .weak TIM5_IRQHandler /* TIM5 */ + .weak UART4_IRQHandler /* UART4 */ + .weak DMA1_Channel8_IRQHandler /* DMA1 Channel8 */ + .weak OSC32KCal_IRQHandler /* OSC32 KCal */ + .weak OSCWakeUp_IRQHandler /* OSC Wake Up */ + +NMI_Handler: 1: j 1b +HardFault_Handler: 1: j 1b +Ecall_M_Mode_Handler: 1: j 1b +Ecall_U_Mode_Handler: 1: j 1b +Break_Point_Handler: 1: j 1b +SysTick_Handler: 1: j 1b +SW_handler: 1: j 1b +WWDG_IRQHandler: 1: j 1b +PVD_IRQHandler: 1: j 1b +TAMPER_IRQHandler: 1: j 1b +RTC_IRQHandler: 1: j 1b +FLASH_IRQHandler: 1: j 1b +RCC_IRQHandler: 1: j 1b +EXTI0_IRQHandler: 1: j 1b +EXTI1_IRQHandler: 1: j 1b +EXTI2_IRQHandler: 1: j 1b +EXTI3_IRQHandler: 1: j 1b +EXTI4_IRQHandler: 1: j 1b +DMA1_Channel1_IRQHandler: 1: j 1b +DMA1_Channel2_IRQHandler: 1: j 1b +DMA1_Channel3_IRQHandler: 1: j 1b +DMA1_Channel4_IRQHandler: 1: j 1b +DMA1_Channel5_IRQHandler: 1: j 1b +DMA1_Channel6_IRQHandler: 1: j 1b +DMA1_Channel7_IRQHandler: 1: j 1b +ADC1_2_IRQHandler: 1: j 1b +USB_HP_CAN1_TX_IRQHandler: 1: j 1b +USB_LP_CAN1_RX0_IRQHandler: 1: j 1b +CAN1_RX1_IRQHandler: 1: j 1b +CAN1_SCE_IRQHandler: 1: j 1b +EXTI9_5_IRQHandler: 1: j 1b +TIM1_BRK_IRQHandler: 1: j 1b +TIM1_UP_IRQHandler: 1: j 1b +TIM1_TRG_COM_IRQHandler: 1: j 1b +TIM1_CC_IRQHandler: 1: j 1b +TIM2_IRQHandler: 1: j 1b +TIM3_IRQHandler: 1: j 1b +TIM4_IRQHandler: 1: j 1b +I2C1_EV_IRQHandler: 1: j 1b +I2C1_ER_IRQHandler: 1: j 1b +I2C2_EV_IRQHandler: 1: j 1b +I2C2_ER_IRQHandler: 1: j 1b +SPI1_IRQHandler: 1: j 1b +SPI2_IRQHandler: 1: j 1b +USART1_IRQHandler: 1: j 1b +USART2_IRQHandler: 1: j 1b +USART3_IRQHandler: 1: j 1b +EXTI15_10_IRQHandler: 1: j 1b +RTCAlarm_IRQHandler: 1: j 1b +USBWakeUp_IRQHandler: 1: j 1b +USBHD_IRQHandler: 1: j 1b +USBHDWakeUp_IRQHandler: 1: j 1b +ETH_IRQHandler: 1: j 1b +ETHWakeUp_IRQHandler: 1: j 1b +BB_IRQHandler: 1: j 1b +LLE_IRQHandler: 1: j 1b +TIM5_IRQHandler: 1: j 1b +UART4_IRQHandler: 1: j 1b +DMA1_Channel8_IRQHandler: 1: j 1b +OSC32KCal_IRQHandler: 1: j 1b +OSCWakeUp_IRQHandler: 1: j 1b + + .section .text.handle_reset,"ax",@progbits + .weak handle_reset + .align 1 +handle_reset: +.option push +.option norelax + la gp, __global_pointer$ +.option pop +1: + la sp, _eusrstack +2: + /* Load data section from flash to RAM */ + la a0, _data_lma + la a1, _data_vma + la a2, _edata + bgeu a1, a2, 2f +1: + lw t0, (a0) + sw t0, (a1) + addi a0, a0, 4 + addi a1, a1, 4 + bltu a1, a2, 1b +2: + /* Clear bss section */ + la a0, _sbss + la a1, _ebss + bgeu a0, a1, 2f +1: + sw zero, (a0) + addi a0, a0, 4 + bltu a0, a1, 1b +2: + li t0, 0x1f + csrw 0xbc0, t0 + + /* Enable nested and hardware stack */ + li t0, 0x2 + csrw 0x804, t0 + + /* Enable interrupt */ + li t0, 0x1800 + csrs mstatus, t0 + + la t0, _vector_base + ori t0, t0, 3 + csrw mtvec, t0 + + jal SystemInit + la t0, entry + csrw mepc, t0 + mret + + diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/system_ch32v20x.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/system_ch32v20x.c new file mode 100644 index 0000000000..0e8eabc378 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/bmsis/source/system_ch32v20x.c @@ -0,0 +1,962 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : system_ch32v20x.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : CH32V20x Device Peripheral Access Layer System Source File. + * For HSE = 32Mhz (CH32V208x/CH32V203RBT6) + * For HSE = 8Mhz (other CH32V203x) + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *********************************************************************************/ +#include "ch32v20x.h" + +/* +* Uncomment the line corresponding to the desired System clock (SYSCLK) frequency (after +* reset the HSI is used as SYSCLK source). +* If none of the define below is enabled, the HSI is used as System clock source. +*/ +//#define SYSCLK_FREQ_HSE HSE_VALUE +//#define SYSCLK_FREQ_48MHz_HSE 48000000 +//#define SYSCLK_FREQ_56MHz_HSE 56000000 +//#define SYSCLK_FREQ_72MHz_HSE 72000000 +//#define SYSCLK_FREQ_96MHz_HSE 96000000 +//#define SYSCLK_FREQ_120MHz_HSE 120000000 +#define SYSCLK_FREQ_144MHz_HSE 144000000 +//#define SYSCLK_FREQ_HSI HSI_VALUE +//#define SYSCLK_FREQ_48MHz_HSI 48000000 +//#define SYSCLK_FREQ_56MHz_HSI 56000000 +//#define SYSCLK_FREQ_72MHz_HSI 72000000 +//#define SYSCLK_FREQ_96MHz_HSI 96000000 +//#define SYSCLK_FREQ_120MHz_HSI 120000000 +//#define SYSCLK_FREQ_144MHz_HSI 144000000 + +/* Clock Definitions */ +#ifdef SYSCLK_FREQ_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_48MHz_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_56MHz_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_72MHz_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_96MHz_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_96MHz_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_120MHz_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_120MHz_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_144MHz_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_144MHz_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_48MHz_HSI +uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz_HSI; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_56MHz_HSI +uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz_HSI; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_72MHz_HSI +uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz_HSI; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_96MHz_HSI +uint32_t SystemCoreClock = SYSCLK_FREQ_96MHz_HSI; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_120MHz_HSI +uint32_t SystemCoreClock = SYSCLK_FREQ_120MHz_HSI; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_144MHz_HSI +uint32_t SystemCoreClock = SYSCLK_FREQ_144MHz_HSI; /* System Clock Frequency (Core Clock) */ +#else +uint32_t SystemCoreClock = HSI_VALUE; /* System Clock Frequency (Core Clock) */ + +#endif + +__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + + +/* system_private_function_proto_types */ +static void SetSysClock(void); + +#ifdef SYSCLK_FREQ_HSE +static void SetSysClockToHSE( void ); +#elif defined SYSCLK_FREQ_48MHz_HSE +static void SetSysClockTo48_HSE( void ); +#elif defined SYSCLK_FREQ_56MHz_HSE +static void SetSysClockTo56_HSE( void ); +#elif defined SYSCLK_FREQ_72MHz_HSE +static void SetSysClockTo72_HSE( void ); +#elif defined SYSCLK_FREQ_96MHz_HSE +static void SetSysClockTo96_HSE( void ); +#elif defined SYSCLK_FREQ_120MHz_HSE +static void SetSysClockTo120_HSE( void ); +#elif defined SYSCLK_FREQ_144MHz_HSE +static void SetSysClockTo144_HSE( void ); +#elif defined SYSCLK_FREQ_48MHz_HSI +static void SetSysClockTo48_HSI( void ); +#elif defined SYSCLK_FREQ_56MHz_HSI +static void SetSysClockTo56_HSI( void ); +#elif defined SYSCLK_FREQ_72MHz_HSI +static void SetSysClockTo72_HSI( void ); +#elif defined SYSCLK_FREQ_96MHz_HSI +static void SetSysClockTo96_HSI( void ); +#elif defined SYSCLK_FREQ_120MHz_HSI +static void SetSysClockTo120_HSI( void ); +#elif defined SYSCLK_FREQ_144MHz_HSI +static void SetSysClockTo144_HSI( void ); + +#endif + +/********************************************************************* + * @fn SystemInit + * + * @brief Setup the microcontroller system Initialize the Embedded Flash Interface, + * the PLL and update the SystemCoreClock variable. + * + * @return none + */ +void SystemInit (void) +{ + RCC->CTLR |= (uint32_t)0x00000001; + RCC->CFGR0 &= (uint32_t)0xF8FF0000; + RCC->CTLR &= (uint32_t)0xFEF6FFFF; + RCC->CTLR &= (uint32_t)0xFFFBFFFF; + RCC->CFGR0 &= (uint32_t)0xFF80FFFF; + RCC->INTR = 0x009F0000; + SetSysClock(); +} + + +/********************************************************************* + * @fn SystemCoreClockUpdate + * + * @brief Update SystemCoreClock variable according to Clock Register Values. + * + * @return none + */ +void SystemCoreClockUpdate (void) +{ + uint32_t tmp = 0, pllmull = 0, pllsource = 0, Pll_6_5 = 0; + + tmp = RCC->CFGR0 & RCC_SWS; + + switch (tmp) + { + case 0x00: + SystemCoreClock = HSI_VALUE; + break; + case 0x04: + SystemCoreClock = HSE_VALUE; + break; + case 0x08: + pllmull = RCC->CFGR0 & RCC_PLLMULL; + pllsource = RCC->CFGR0 & RCC_PLLSRC; + pllmull = ( pllmull >> 18) + 2; + + if(pllmull == 17) pllmull = 18; + + if (pllsource == 0x00) + { + if(EXTEN->EXTEN_CTR & EXTEN_PLL_HSI_PRE){ + SystemCoreClock = HSI_VALUE * pllmull; + } + else{ + SystemCoreClock = (HSI_VALUE >> 1) * pllmull; + } + } + else + { +#if defined (CH32V20x_D8W) + if((RCC->CFGR0 & (3<<22)) == (3<<22)) + { + SystemCoreClock = ((HSE_VALUE>>1)) * pllmull; + } + else +#endif + if ((RCC->CFGR0 & RCC_PLLXTPRE) != (uint32_t)RESET) + { +#if defined (CH32V20x_D8) || defined (CH32V20x_D8W) + SystemCoreClock = ((HSE_VALUE>>2) >> 1) * pllmull; +#else + SystemCoreClock = (HSE_VALUE >> 1) * pllmull; +#endif + } + else + { +#if defined (CH32V20x_D8) || defined (CH32V20x_D8W) + SystemCoreClock = (HSE_VALUE>>2) * pllmull; +#else + SystemCoreClock = HSE_VALUE * pllmull; +#endif + } + } + + if(Pll_6_5 == 1) SystemCoreClock = (SystemCoreClock / 2); + + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + + tmp = AHBPrescTable[((RCC->CFGR0 & RCC_HPRE) >> 4)]; + SystemCoreClock >>= tmp; +} + +/********************************************************************* + * @fn SetSysClock + * + * @brief Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClock(void) +{ +#ifdef SYSCLK_FREQ_HSE + SetSysClockToHSE(); +#elif defined SYSCLK_FREQ_48MHz_HSE + SetSysClockTo48_HSE(); +#elif defined SYSCLK_FREQ_56MHz_HSE + SetSysClockTo56_HSE(); +#elif defined SYSCLK_FREQ_72MHz_HSE + SetSysClockTo72_HSE(); +#elif defined SYSCLK_FREQ_96MHz_HSE + SetSysClockTo96_HSE(); +#elif defined SYSCLK_FREQ_120MHz_HSE + SetSysClockTo120_HSE(); +#elif defined SYSCLK_FREQ_144MHz_HSE + SetSysClockTo144_HSE(); +#elif defined SYSCLK_FREQ_48MHz_HSI + SetSysClockTo48_HSI(); +#elif defined SYSCLK_FREQ_56MHz_HSI + SetSysClockTo56_HSI(); +#elif defined SYSCLK_FREQ_72MHz_HSI + SetSysClockTo72_HSI(); +#elif defined SYSCLK_FREQ_96MHz_HSI + SetSysClockTo96_HSI(); +#elif defined SYSCLK_FREQ_120MHz_HSI + SetSysClockTo120_HSI(); +#elif defined SYSCLK_FREQ_144MHz_HSI + SetSysClockTo144_HSI(); + +#endif + + /* If none of the define above is enabled, the HSI is used as System clock + * source (default after reset) + */ +} + + +#ifdef SYSCLK_FREQ_HSE + +/********************************************************************* + * @fn SetSysClockToHSE + * + * @brief Sets HSE as System clock source and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockToHSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV1; + + /* Select HSE as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_HSE; + + /* Wait till HSE is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x04) + { + } + } + else + { + /* If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} + +#elif defined SYSCLK_FREQ_48MHz_HSE + +/********************************************************************* + * @fn SetSysClockTo48_HSE + * + * @brief Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo48_HSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSE * 6 = 48 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL6); + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } + } + else + { + /* + * If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} + +#elif defined SYSCLK_FREQ_56MHz_HSE + +/********************************************************************* + * @fn SetSysClockTo56_HSE + * + * @brief Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo56_HSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSE * 7 = 56 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL7); + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } + } + else + { + /* + * If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} + +#elif defined SYSCLK_FREQ_72MHz_HSE + +/********************************************************************* + * @fn SetSysClockTo72_HSE + * + * @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo72_HSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | + RCC_PLLMULL)); + + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL9); + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } + } + else + { + /* + * If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} + + +#elif defined SYSCLK_FREQ_96MHz_HSE + +/********************************************************************* + * @fn SetSysClockTo96_HSE + * + * @brief Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo96_HSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSE * 12 = 96 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | + RCC_PLLMULL)); + + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12); + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } + } + else + { + /* + * If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} + + +#elif defined SYSCLK_FREQ_120MHz_HSE + +/********************************************************************* + * @fn SetSysClockTo120_HSE + * + * @brief Sets System clock frequency to 120MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo120_HSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if(HSEStatus == (uint32_t)0x01) + { +#if defined (CH32V20x_D8W) + RCC->CFGR0 |= (uint32_t)(3<<22); + /* HCLK = SYSCLK/2 */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV2; +#else + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; +#endif + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSE * 15 = 120 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_PLLSRC | RCC_PLLXTPRE | + RCC_PLLMULL)); + + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL15); + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } + } + else + { + /* + * If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} +#elif defined SYSCLK_FREQ_144MHz_HSE + +/********************************************************************* + * @fn SetSysClockTo144_HSE + * + * @brief Sets System clock frequency to 144MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo144_HSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSE * 18 = 144 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | + RCC_PLLMULL)); + + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL18); + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } + } + else + { + /* + * If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} + +#elif defined SYSCLK_FREQ_48MHz_HSI + +/********************************************************************* + * @fn SetSysClockTo48_HSI + * + * @brief Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo48_HSI(void) +{ + EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; + + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSI * 6 = 48 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL6); + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } +} + +#elif defined SYSCLK_FREQ_56MHz_HSI + +/********************************************************************* + * @fn SetSysClockTo56_HSI + * + * @brief Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo56_HSI(void) +{ + EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; + + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSI * 7 = 48 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL7); + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } +} + +#elif defined SYSCLK_FREQ_72MHz_HSI + +/********************************************************************* + * @fn SetSysClockTo72_HSI + * + * @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo72_HSI(void) +{ + EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; + + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSI * 9 = 72 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL9); + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } +} + + +#elif defined SYSCLK_FREQ_96MHz_HSI + +/********************************************************************* + * @fn SetSysClockTo96_HSI + * + * @brief Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo96_HSI(void) +{ + EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; + + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSI * 12 = 96 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL12); + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } +} + + +#elif defined SYSCLK_FREQ_120MHz_HSI + +/********************************************************************* + * @fn SetSysClockTo120_HSI + * + * @brief Sets System clock frequency to 120MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo120_HSI(void) +{ + EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; + + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSI * 15 = 120 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_PLLSRC | RCC_PLLXTPRE | + RCC_PLLMULL)); + + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL15); + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } +} +#elif defined SYSCLK_FREQ_144MHz_HSI + +/********************************************************************* + * @fn SetSysClockTo144_HSI + * + * @brief Sets System clock frequency to 144MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo144_HSI(void) +{ + EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; + + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSI * 18 = 144 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL18); + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } +} + + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/SConscript b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/SConscript new file mode 100644 index 0000000000..841b6e7ca9 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/SConscript @@ -0,0 +1,78 @@ +#-*- encoding: utf-8 -*- + +import os +from building import * +Import('RTT_ROOT') +Import('rtconfig') + +#--------------------------------------------------------------------------------- +# Package configuration +#--------------------------------------------------------------------------------- +PKGNAME = "ch32v208_hal" +VERSION = "v1.0.0" +DEPENDS = [""] + +#--------------------------------------------------------------------------------- +# Compile the configuration +# +# SOURCES: Need to compile c and c++ source, auto search when SOURCES is empty +# +# LOCAL_CPPPATH: Local file path (.h/.c/.cpp) +# LOCAL_CCFLAGS: Local compilation parameter +# LOCAL_ASFLAGS: Local assembly parameters +# +# CPPPATH: Global file path (.h/.c/.cpp), auto search when LOCAL_CPPPATH/CPPPATH +# is empty # no pass!!! +# CCFLAGS: Global compilation parameter +# ASFLAGS: Global assembly parameters +# +# CPPDEFINES: Global macro definition +# LOCAL_CPPDEFINES: Local macro definition +# +# LIBS: Specify the static library that need to be linked +# LIBPATH: Specify the search directory for the library file (.lib/.a) +# +# LINKFLAGS: Link options +#--------------------------------------------------------------------------------- +CWD = GetCurrentDir() +SOURCES = Glob("./source/*.c") + +LOCAL_CPPPATH = [] +LOCAL_CCFLAGS = "" +LOCAL_ASFLAGS = "" + +CPPPATH = [GetCurrentDir(), os.path.join(GetCurrentDir(), 'include')] +CCFLAGS = "" +ASFLAGS = "" + +CPPDEFINES = [] +LOCAL_CPPDEFINES = [] + +LIBS = [] +LIBPATH = [] + +LINKFLAGS = "" + +SOURCES_IGNORE = [] +CPPPATH_IGNORE = [] + +#--------------------------------------------------------------------------------- +# Main target +#--------------------------------------------------------------------------------- +objs = DefineGroup(name = PKGNAME, src = SOURCES, depend = DEPENDS, + CPPPATH = CPPPATH, + CCFLAGS = CCFLAGS, + ASFLAGS = ASFLAGS, + LOCAL_CPPPATH = LOCAL_CPPPATH, + LOCAL_CCFLAGS = LOCAL_CCFLAGS, + LOCAL_ASFLAGS = LOCAL_ASFLAGS, + CPPDEFINES = CPPDEFINES, + LOCAL_CPPDEFINES = LOCAL_CPPDEFINES, + LIBS = LIBS, + LIBPATH = LIBPATH, + LINKFLAGS = LINKFLAGS) + +Return("objs") +#--------------------------------------------------------------------------------- +# End +#--------------------------------------------------------------------------------- diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x.h new file mode 100644 index 0000000000..6e6045c0f7 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x.h @@ -0,0 +1,4817 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : CH32V20x Device Peripheral Access Layer Header File. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_H +#define __CH32V20x_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(CH32V20x_D8W) && !defined(CH32V20x_D8) && !defined(CH32V20x_D6) +//#define CH32V20x_D6 /* CH32V203F6-CH32V203F8-CH32V203G6-CH32V203G8-CH32V203K6-CH32V203K8-CH32V203C6-CH32V203C8 */ +//#define CH32V20x_D8 /* CH32V203RBT6 */ +#define CH32V20x_D8W /* CH32V208 */ + +#endif + +#define __MPU_PRESENT 0 /* Other CH32 devices does not provide an MPU */ +#define __Vendor_SysTickConfig 0 /* Set to 1 if different SysTick Config is used */ + +#if defined(CH32V20x_D8) || defined(CH32V20x_D8W) + #define HSE_VALUE ((uint32_t)32000000) /* Value of the External oscillator in Hz */ +#else + #define HSE_VALUE ((uint32_t)8000000) /* Value of the External oscillator in Hz */ +#endif + +/* In the following line adjust the External High Speed oscillator (HSE) Startup Timeout value */ +#define HSE_STARTUP_TIMEOUT ((uint16_t)0x1000) /* Time out for HSE start up */ + +#define HSI_VALUE ((uint32_t)8000000) /* Value of the Internal oscillator in Hz */ + +/* Interrupt Number Definition, according to the selected device */ +typedef enum IRQn +{ + /****** RISC-V Processor Exceptions Numbers *******************************************************/ + NonMaskableInt_IRQn = 2, /* 2 Non Maskable Interrupt */ + EXC_IRQn = 3, /* 3 Exception Interrupt */ + Ecall_M_Mode_IRQn = 5, /* 5 Ecall M Mode Interrupt */ + Ecall_U_Mode_IRQn = 8, /* 8 Ecall U Mode Interrupt */ + Break_Point_IRQn = 9, /* 9 Break Point Interrupt */ + SysTicK_IRQn = 12, /* 12 System timer Interrupt */ + Software_IRQn = 14, /* 14 software Interrupt */ + + /****** RISC-V specific Interrupt Numbers *********************************************************/ + WWDG_IRQn = 16, /* Window WatchDog Interrupt */ + PVD_IRQn = 17, /* PVD through EXTI Line detection Interrupt */ + TAMPER_IRQn = 18, /* Tamper Interrupt */ + RTC_IRQn = 19, /* RTC global Interrupt */ + FLASH_IRQn = 20, /* FLASH global Interrupt */ + RCC_IRQn = 21, /* RCC global Interrupt */ + EXTI0_IRQn = 22, /* EXTI Line0 Interrupt */ + EXTI1_IRQn = 23, /* EXTI Line1 Interrupt */ + EXTI2_IRQn = 24, /* EXTI Line2 Interrupt */ + EXTI3_IRQn = 25, /* EXTI Line3 Interrupt */ + EXTI4_IRQn = 26, /* EXTI Line4 Interrupt */ + DMA1_Channel1_IRQn = 27, /* DMA1 Channel 1 global Interrupt */ + DMA1_Channel2_IRQn = 28, /* DMA1 Channel 2 global Interrupt */ + DMA1_Channel3_IRQn = 29, /* DMA1 Channel 3 global Interrupt */ + DMA1_Channel4_IRQn = 30, /* DMA1 Channel 4 global Interrupt */ + DMA1_Channel5_IRQn = 31, /* DMA1 Channel 5 global Interrupt */ + DMA1_Channel6_IRQn = 32, /* DMA1 Channel 6 global Interrupt */ + DMA1_Channel7_IRQn = 33, /* DMA1 Channel 7 global Interrupt */ + ADC_IRQn = 34, /* ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 35, /* USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 36, /* USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 37, /* CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 38, /* CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 39, /* External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 40, /* TIM1 Break Interrupt */ + TIM1_UP_IRQn = 41, /* TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 42, /* TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 43, /* TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 44, /* TIM2 global Interrupt */ + TIM3_IRQn = 45, /* TIM3 global Interrupt */ + TIM4_IRQn = 46, /* TIM4 global Interrupt */ + I2C1_EV_IRQn = 47, /* I2C1 Event Interrupt */ + I2C1_ER_IRQn = 48, /* I2C1 Error Interrupt */ + I2C2_EV_IRQn = 49, /* I2C2 Event Interrupt */ + I2C2_ER_IRQn = 50, /* I2C2 Error Interrupt */ + SPI1_IRQn = 51, /* SPI1 global Interrupt */ + SPI2_IRQn = 52, /* SPI2 global Interrupt */ + USART1_IRQn = 53, /* USART1 global Interrupt */ + USART2_IRQn = 54, /* USART2 global Interrupt */ + USART3_IRQn = 55, /* USART3 global Interrupt */ + EXTI15_10_IRQn = 56, /* External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 57, /* RTC Alarm through EXTI Line Interrupt */ + USBWakeUp_IRQn = 58, /* USB Device WakeUp from suspend through EXTI Line Interrupt */ + USBHD_IRQn = 59, /* USBHD global Interrupt */ + USBHDWakeUp_IRQn = 60, /* USB Host/Device WakeUp Interrupt */ + +#ifdef CH32V20x_D6 + UART4_IRQn = 61, /* UART4 global Interrupt */ + DMA1_Channel8_IRQn = 62, /* DMA1 Channel 8 global Interrupt */ + +#elif defined(CH32V20x_D8) + ETH_IRQn = 61, /* ETH global Interrupt */ + ETHWakeUp_IRQn = 62, /* ETH WakeUp Interrupt */ + TIM5_IRQn = 65, /* TIM5 global Interrupt */ + UART4_IRQn = 66, /* UART4 global Interrupt */ + DMA1_Channel8_IRQn = 67, /* DMA1 Channel 8 global Interrupt */ + OSC32KCal_IRQn = 68, /* OSC32K global Interrupt */ + OSCWakeUp_IRQn = 69, /* OSC32K WakeUp Interrupt */ + +#elif defined(CH32V20x_D8W) + ETH_IRQn = 61, /* ETH global Interrupt */ + ETHWakeUp_IRQn = 62, /* ETH WakeUp Interrupt */ + BB_IRQn = 63, /* BLE BB global Interrupt */ + LLE_IRQn = 64, /* BLE LLE global Interrupt */ + TIM5_IRQn = 65, /* TIM5 global Interrupt */ + UART4_IRQn = 66, /* UART4 global Interrupt */ + DMA1_Channel8_IRQn = 67, /* DMA1 Channel 8 global Interrupt */ + OSC32KCal_IRQn = 68, /* OSC32K global Interrupt */ + OSCWakeUp_IRQn = 69, /* OSC32K WakeUp Interrupt */ +#endif + +} IRQn_Type; + +#define HardFault_IRQn EXC_IRQn +#define ADC1_2_IRQn ADC_IRQn + +#include +#include "core_riscv.h" +#include "system_ch32v20x.h" + +/* Standard Peripheral Library old definitions (maintained for legacy purpose) */ +#define HSI_Value HSI_VALUE +#define HSE_Value HSE_VALUE +#define HSEStartUp_TimeOut HSE_STARTUP_TIMEOUT + +/* Analog to Digital Converter */ +typedef struct +{ + __IO uint32_t STATR; + __IO uint32_t CTLR1; + __IO uint32_t CTLR2; + __IO uint32_t SAMPTR1; + __IO uint32_t SAMPTR2; + __IO uint32_t IOFR1; + __IO uint32_t IOFR2; + __IO uint32_t IOFR3; + __IO uint32_t IOFR4; + __IO uint32_t WDHTR; + __IO uint32_t WDLTR; + __IO uint32_t RSQR1; + __IO uint32_t RSQR2; + __IO uint32_t RSQR3; + __IO uint32_t ISQR; + __IO uint32_t IDATAR1; + __IO uint32_t IDATAR2; + __IO uint32_t IDATAR3; + __IO uint32_t IDATAR4; + __IO uint32_t RDATAR; +} ADC_TypeDef; + +/* Backup Registers */ +typedef struct +{ + uint32_t RESERVED0; + __IO uint16_t DATAR1; + uint16_t RESERVED1; + __IO uint16_t DATAR2; + uint16_t RESERVED2; + __IO uint16_t DATAR3; + uint16_t RESERVED3; + __IO uint16_t DATAR4; + uint16_t RESERVED4; + __IO uint16_t DATAR5; + uint16_t RESERVED5; + __IO uint16_t DATAR6; + uint16_t RESERVED6; + __IO uint16_t DATAR7; + uint16_t RESERVED7; + __IO uint16_t DATAR8; + uint16_t RESERVED8; + __IO uint16_t DATAR9; + uint16_t RESERVED9; + __IO uint16_t DATAR10; + uint16_t RESERVED10; + __IO uint16_t OCTLR; + uint16_t RESERVED11; + __IO uint16_t TPCTLR; + uint16_t RESERVED12; + __IO uint16_t TPCSR; + uint16_t RESERVED13[5]; + __IO uint16_t DATAR11; + uint16_t RESERVED14; + __IO uint16_t DATAR12; + uint16_t RESERVED15; + __IO uint16_t DATAR13; + uint16_t RESERVED16; + __IO uint16_t DATAR14; + uint16_t RESERVED17; + __IO uint16_t DATAR15; + uint16_t RESERVED18; + __IO uint16_t DATAR16; + uint16_t RESERVED19; + __IO uint16_t DATAR17; + uint16_t RESERVED20; + __IO uint16_t DATAR18; + uint16_t RESERVED21; + __IO uint16_t DATAR19; + uint16_t RESERVED22; + __IO uint16_t DATAR20; + uint16_t RESERVED23; + __IO uint16_t DATAR21; + uint16_t RESERVED24; + __IO uint16_t DATAR22; + uint16_t RESERVED25; + __IO uint16_t DATAR23; + uint16_t RESERVED26; + __IO uint16_t DATAR24; + uint16_t RESERVED27; + __IO uint16_t DATAR25; + uint16_t RESERVED28; + __IO uint16_t DATAR26; + uint16_t RESERVED29; + __IO uint16_t DATAR27; + uint16_t RESERVED30; + __IO uint16_t DATAR28; + uint16_t RESERVED31; + __IO uint16_t DATAR29; + uint16_t RESERVED32; + __IO uint16_t DATAR30; + uint16_t RESERVED33; + __IO uint16_t DATAR31; + uint16_t RESERVED34; + __IO uint16_t DATAR32; + uint16_t RESERVED35; + __IO uint16_t DATAR33; + uint16_t RESERVED36; + __IO uint16_t DATAR34; + uint16_t RESERVED37; + __IO uint16_t DATAR35; + uint16_t RESERVED38; + __IO uint16_t DATAR36; + uint16_t RESERVED39; + __IO uint16_t DATAR37; + uint16_t RESERVED40; + __IO uint16_t DATAR38; + uint16_t RESERVED41; + __IO uint16_t DATAR39; + uint16_t RESERVED42; + __IO uint16_t DATAR40; + uint16_t RESERVED43; + __IO uint16_t DATAR41; + uint16_t RESERVED44; + __IO uint16_t DATAR42; + uint16_t RESERVED45; +} BKP_TypeDef; + +/* Controller Area Network TxMailBox */ +typedef struct +{ + __IO uint32_t TXMIR; + __IO uint32_t TXMDTR; + __IO uint32_t TXMDLR; + __IO uint32_t TXMDHR; +} CAN_TxMailBox_TypeDef; + +/* Controller Area Network FIFOMailBox */ +typedef struct +{ + __IO uint32_t RXMIR; + __IO uint32_t RXMDTR; + __IO uint32_t RXMDLR; + __IO uint32_t RXMDHR; +} CAN_FIFOMailBox_TypeDef; + +/* Controller Area Network FilterRegister */ +typedef struct +{ + __IO uint32_t FR1; + __IO uint32_t FR2; +} CAN_FilterRegister_TypeDef; + +/* Controller Area Network */ +typedef struct +{ + __IO uint32_t CTLR; + __IO uint32_t STATR; + __IO uint32_t TSTATR; + __IO uint32_t RFIFO0; + __IO uint32_t RFIFO1; + __IO uint32_t INTENR; + __IO uint32_t ERRSR; + __IO uint32_t BTIMR; + uint32_t RESERVED0[88]; + CAN_TxMailBox_TypeDef sTxMailBox[3]; + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; + uint32_t RESERVED1[12]; + __IO uint32_t FCTLR; + __IO uint32_t FMCFGR; + uint32_t RESERVED2; + __IO uint32_t FSCFGR; + uint32_t RESERVED3; + __IO uint32_t FAFIFOR; + uint32_t RESERVED4; + __IO uint32_t FWR; + uint32_t RESERVED5[8]; + CAN_FilterRegister_TypeDef sFilterRegister[28]; +} CAN_TypeDef; + +/* CRC Calculation Unit */ +typedef struct +{ + __IO uint32_t DATAR; + __IO uint8_t IDATAR; + uint8_t RESERVED0; + uint16_t RESERVED1; + __IO uint32_t CTLR; +} CRC_TypeDef; + +/* DMA Channel Controller */ +typedef struct +{ + __IO uint32_t CFGR; + __IO uint32_t CNTR; + __IO uint32_t PADDR; + __IO uint32_t MADDR; +} DMA_Channel_TypeDef; + +/* DMA Controller */ +typedef struct +{ + __IO uint32_t INTFR; + __IO uint32_t INTFCR; +} DMA_TypeDef; + +/* External Interrupt/Event Controller */ +typedef struct +{ + __IO uint32_t INTENR; + __IO uint32_t EVENR; + __IO uint32_t RTENR; + __IO uint32_t FTENR; + __IO uint32_t SWIEVR; + __IO uint32_t INTFR; +} EXTI_TypeDef; + +/* FLASH Registers */ +typedef struct +{ + __IO uint32_t ACTLR; + __IO uint32_t KEYR; + __IO uint32_t OBKEYR; + __IO uint32_t STATR; + __IO uint32_t CTLR; + __IO uint32_t ADDR; + __IO uint32_t RESERVED; + __IO uint32_t OBR; + __IO uint32_t WPR; + __IO uint32_t MODEKEYR; +} FLASH_TypeDef; + +/* Option Bytes Registers */ +typedef struct +{ + __IO uint16_t RDPR; + __IO uint16_t USER; + __IO uint16_t Data0; + __IO uint16_t Data1; + __IO uint16_t WRPR0; + __IO uint16_t WRPR1; + __IO uint16_t WRPR2; + __IO uint16_t WRPR3; +} OB_TypeDef; + +/* General Purpose I/O */ +typedef struct +{ + __IO uint32_t CFGLR; + __IO uint32_t CFGHR; + __IO uint32_t INDR; + __IO uint32_t OUTDR; + __IO uint32_t BSHR; + __IO uint32_t BCR; + __IO uint32_t LCKR; +} GPIO_TypeDef; + +/* Alternate Function I/O */ +typedef struct +{ + __IO uint32_t ECR; + __IO uint32_t PCFR1; + __IO uint32_t EXTICR[4]; + uint32_t RESERVED0; + __IO uint32_t PCFR2; +} AFIO_TypeDef; + +/* Inter Integrated Circuit Interface */ +typedef struct +{ + __IO uint16_t CTLR1; + uint16_t RESERVED0; + __IO uint16_t CTLR2; + uint16_t RESERVED1; + __IO uint16_t OADDR1; + uint16_t RESERVED2; + __IO uint16_t OADDR2; + uint16_t RESERVED3; + __IO uint16_t DATAR; + uint16_t RESERVED4; + __IO uint16_t STAR1; + uint16_t RESERVED5; + __IO uint16_t STAR2; + uint16_t RESERVED6; + __IO uint16_t CKCFGR; + uint16_t RESERVED7; + __IO uint16_t RTR; + uint16_t RESERVED8; +} I2C_TypeDef; + +/* Independent WatchDog */ +typedef struct +{ + __IO uint32_t CTLR; + __IO uint32_t PSCR; + __IO uint32_t RLDR; + __IO uint32_t STATR; +} IWDG_TypeDef; + +/* Power Control */ +typedef struct +{ + __IO uint32_t CTLR; + __IO uint32_t CSR; +} PWR_TypeDef; + +/* Reset and Clock Control */ +typedef struct +{ + __IO uint32_t CTLR; + __IO uint32_t CFGR0; + __IO uint32_t INTR; + __IO uint32_t APB2PRSTR; + __IO uint32_t APB1PRSTR; + __IO uint32_t AHBPCENR; + __IO uint32_t APB2PCENR; + __IO uint32_t APB1PCENR; + __IO uint32_t BDCTLR; + __IO uint32_t RSTSCKR; + + __IO uint32_t AHBRSTR; + __IO uint32_t CFGR2; +} RCC_TypeDef; + +/* Real-Time Clock */ +typedef struct +{ + __IO uint16_t CTLRH; + uint16_t RESERVED0; + __IO uint16_t CTLRL; + uint16_t RESERVED1; + __IO uint16_t PSCRH; + uint16_t RESERVED2; + __IO uint16_t PSCRL; + uint16_t RESERVED3; + __IO uint16_t DIVH; + uint16_t RESERVED4; + __IO uint16_t DIVL; + uint16_t RESERVED5; + __IO uint16_t CNTH; + uint16_t RESERVED6; + __IO uint16_t CNTL; + uint16_t RESERVED7; + __IO uint16_t ALRMH; + uint16_t RESERVED8; + __IO uint16_t ALRML; + uint16_t RESERVED9; +} RTC_TypeDef; + +/* Serial Peripheral Interface */ +typedef struct +{ + __IO uint16_t CTLR1; + uint16_t RESERVED0; + __IO uint16_t CTLR2; + uint16_t RESERVED1; + __IO uint16_t STATR; + uint16_t RESERVED2; + __IO uint16_t DATAR; + uint16_t RESERVED3; + __IO uint16_t CRCR; + uint16_t RESERVED4; + __IO uint16_t RCRCR; + uint16_t RESERVED5; + __IO uint16_t TCRCR; + uint16_t RESERVED6; + __IO uint16_t I2SCFGR; + uint16_t RESERVED7; + __IO uint16_t I2SPR; + uint16_t RESERVED8; + __IO uint16_t HSCR; + uint16_t RESERVED9; +} SPI_TypeDef; + +/* TIM */ +typedef struct +{ + __IO uint16_t CTLR1; + uint16_t RESERVED0; + __IO uint16_t CTLR2; + uint16_t RESERVED1; + __IO uint16_t SMCFGR; + uint16_t RESERVED2; + __IO uint16_t DMAINTENR; + uint16_t RESERVED3; + __IO uint16_t INTFR; + uint16_t RESERVED4; + __IO uint16_t SWEVGR; + uint16_t RESERVED5; + __IO uint16_t CHCTLR1; + uint16_t RESERVED6; + __IO uint16_t CHCTLR2; + uint16_t RESERVED7; + __IO uint16_t CCER; + uint16_t RESERVED8; + __IO uint16_t CNT; + uint16_t RESERVED9; + __IO uint16_t PSC; + uint16_t RESERVED10; + __IO uint16_t ATRLR; + uint16_t RESERVED11; + __IO uint16_t RPTCR; + uint16_t RESERVED12; + __IO uint16_t CH1CVR; + uint16_t RESERVED13; + __IO uint16_t CH2CVR; + uint16_t RESERVED14; + __IO uint16_t CH3CVR; + uint16_t RESERVED15; + __IO uint16_t CH4CVR; + uint16_t RESERVED16; + __IO uint16_t BDTR; + uint16_t RESERVED17; + __IO uint16_t DMACFGR; + uint16_t RESERVED18; + __IO uint16_t DMAADR; + uint16_t RESERVED19; +} TIM_TypeDef; + +/* Universal Synchronous Asynchronous Receiver Transmitter */ +typedef struct +{ + __IO uint16_t STATR; + uint16_t RESERVED0; + __IO uint16_t DATAR; + uint16_t RESERVED1; + __IO uint16_t BRR; + uint16_t RESERVED2; + __IO uint16_t CTLR1; + uint16_t RESERVED3; + __IO uint16_t CTLR2; + uint16_t RESERVED4; + __IO uint16_t CTLR3; + uint16_t RESERVED5; + __IO uint16_t GPR; + uint16_t RESERVED6; +} USART_TypeDef; + +/* Window WatchDog */ +typedef struct +{ + __IO uint32_t CTLR; + __IO uint32_t CFGR; + __IO uint32_t STATR; +} WWDG_TypeDef; + +/* Enhanced Registers */ +typedef struct +{ + __IO uint32_t EXTEN_CTR; +} EXTEN_TypeDef; + +/* OPA Registers */ +typedef struct +{ + __IO uint32_t CR; +} OPA_TypeDef; + +/* USBFS Registers */ +typedef struct +{ + __IO uint8_t BASE_CTRL; + __IO uint8_t UDEV_CTRL; + __IO uint8_t INT_EN; + __IO uint8_t DEV_ADDR; + __IO uint8_t Reserve0; + __IO uint8_t MIS_ST; + __IO uint8_t INT_FG; + __IO uint8_t INT_ST; + __IO uint32_t RX_LEN; + __IO uint8_t UEP4_1_MOD; + __IO uint8_t UEP2_3_MOD; + __IO uint8_t UEP5_6_MOD; + __IO uint8_t UEP7_MOD; + __IO uint32_t UEP0_DMA; + __IO uint32_t UEP1_DMA; + __IO uint32_t UEP2_DMA; + __IO uint32_t UEP3_DMA; + __IO uint32_t UEP4_DMA; + __IO uint32_t UEP5_DMA; + __IO uint32_t UEP6_DMA; + __IO uint32_t UEP7_DMA; + __IO uint16_t UEP0_TX_LEN; + __IO uint8_t UEP0_TX_CTRL; + __IO uint8_t UEP0_RX_CTRL; + __IO uint16_t UEP1_TX_LEN; + __IO uint8_t UEP1_TX_CTRL; + __IO uint8_t UEP1_RX_CTRL; + __IO uint16_t UEP2_TX_LEN; + __IO uint8_t UEP2_TX_CTRL; + __IO uint8_t UEP2_RX_CTRL; + __IO uint16_t UEP3_TX_LEN; + __IO uint8_t UEP3_TX_CTRL; + __IO uint8_t UEP3_RX_CTRL; + __IO uint16_t UEP4_TX_LEN; + __IO uint8_t UEP4_TX_CTRL; + __IO uint8_t UEP4_RX_CTRL; + __IO uint16_t UEP5_TX_LEN; + __IO uint8_t UEP5_TX_CTRL; + __IO uint8_t UEP5_RX_CTRL; + __IO uint16_t UEP6_TX_LEN; + __IO uint8_t UEP6_TX_CTRL; + __IO uint8_t UEP6_RX_CTRL; + __IO uint16_t UEP7_TX_LEN; + __IO uint8_t UEP7_TX_CTRL; + __IO uint8_t UEP7_RX_CTRL; + __IO uint32_t Reserve1; + __IO uint32_t OTG_CR; + __IO uint32_t OTG_SR; +} USBOTG_FS_TypeDef; + +typedef struct +{ + __IO uint8_t BASE_CTRL; + __IO uint8_t HOST_CTRL; + __IO uint8_t INT_EN; + __IO uint8_t DEV_ADDR; + __IO uint8_t Reserve0; + __IO uint8_t MIS_ST; + __IO uint8_t INT_FG; + __IO uint8_t INT_ST; + __IO uint16_t RX_LEN; + __IO uint16_t Reserve1; + __IO uint8_t Reserve2; + __IO uint8_t HOST_EP_MOD; + __IO uint16_t Reserve3; + __IO uint32_t Reserve4; + __IO uint32_t Reserve5; + __IO uint32_t HOST_RX_DMA; + __IO uint32_t HOST_TX_DMA; + __IO uint32_t Reserve6; + __IO uint32_t Reserve7; + __IO uint32_t Reserve8; + __IO uint32_t Reserve9; + __IO uint32_t Reserve10; + __IO uint16_t Reserve11; + __IO uint16_t HOST_SETUP; + __IO uint8_t HOST_EP_PID; + __IO uint8_t Reserve12; + __IO uint8_t Reserve13; + __IO uint8_t HOST_RX_CTRL; + __IO uint16_t HOST_TX_LEN; + __IO uint8_t HOST_TX_CTRL; + __IO uint8_t Reserve14; + __IO uint32_t Reserve15; + __IO uint32_t Reserve16; + __IO uint32_t Reserve17; + __IO uint32_t Reserve18; + __IO uint32_t Reserve19; + __IO uint32_t OTG_CR; + __IO uint32_t OTG_SR; +} USBOTG_FS_HOST_TypeDef; + +#if defined(CH32V20x_D8) || defined(CH32V20x_D8W) +/* ETH10M Registers */ +typedef struct +{ + __IO uint8_t reserved1; + __IO uint8_t reserved2; + __IO uint8_t reserved3; + __IO uint8_t EIE; + + __IO uint8_t EIR; + __IO uint8_t ESTAT; + __IO uint8_t ECON2; + __IO uint8_t ECON1; + + __IO uint16_t ETXST; + __IO uint16_t ETXLN; + + __IO uint16_t ERXST; + __IO uint16_t ERXLN; + + __IO uint32_t HTL; + __IO uint32_t HTH; + + __IO uint8_t ERXFON; + __IO uint8_t MACON1; + __IO uint8_t MACON2; + __IO uint8_t MABBIPG; + + __IO uint16_t EPAUS; + __IO uint16_t MAMXFL; + + __IO uint16_t MIRD; + __IO uint16_t reserved4; + + __IO uint8_t MIERGADR; + __IO uint8_t MISTAT; + __IO uint16_t MIWR; + + __IO uint32_t MAADRL; + + __IO uint16_t MAADRH; + __IO uint16_t reserved5; +} ETH10M_TypeDef; +#endif + +#if defined(CH32V20x_D8) || defined(CH32V20x_D8W) +/* OSC Registers */ +typedef struct +{ + __IO uint32_t HSE_CAL_CTRL; + __IO uint32_t Reserve0; + __IO uint16_t Reserve1; + __IO uint16_t LSI32K_TUNE; + __IO uint32_t Reserve2; + __IO uint32_t Reserve3; + __IO uint32_t Reserve4; + __IO uint32_t Reserve5; + __IO uint8_t Reserve6; + __IO uint8_t LSI32K_CAL_CFG; + __IO uint16_t Reserve7; + __IO uint16_t LSI32K_CAL_STATR; + __IO uint8_t LSI32K_CAL_OV_CNT; + __IO uint8_t LSI32K_CAL_CTRL; +} OSC_TypeDef; + +#endif + +/* Peripheral memory map */ +#define FLASH_BASE ((uint32_t)0x08000000) /* FLASH base address in the alias region */ +#define SRAM_BASE ((uint32_t)0x20000000) /* SRAM base address in the alias region */ +#define PERIPH_BASE ((uint32_t)0x40000000) /* Peripheral base address in the alias region */ + +#define APB1PERIPH_BASE (PERIPH_BASE) +#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) +#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) + +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) +#define BKP_BASE (APB1PERIPH_BASE + 0x6C00) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000) + +#define AFIO_BASE (APB2PERIPH_BASE + 0x0000) +#define EXTI_BASE (APB2PERIPH_BASE + 0x0400) +#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) +#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) +#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) +#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) +#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) +#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) +#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2800) +#define TIM1_BASE (APB2PERIPH_BASE + 0x2C00) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) +#define USART1_BASE (APB2PERIPH_BASE + 0x3800) + +#define DMA1_BASE (AHBPERIPH_BASE + 0x0000) +#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x0008) +#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x001C) +#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x0030) +#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x0044) +#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x0058) +#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x006C) +#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x0080) +#define DMA1_Channel8_BASE (AHBPERIPH_BASE + 0x0094) +#define RCC_BASE (AHBPERIPH_BASE + 0x1000) +#define FLASH_R_BASE (AHBPERIPH_BASE + 0x2000) +#define CRC_BASE (AHBPERIPH_BASE + 0x3000) +#define EXTEN_BASE (AHBPERIPH_BASE + 0x3800) +#define OPA_BASE (AHBPERIPH_BASE + 0x3804) +#define ETH10M_BASE (AHBPERIPH_BASE + 0x8000) + +#define USBFS_BASE ((uint32_t)0x50000000) + +#define OB_BASE ((uint32_t)0x1FFFF800) + +#if defined(CH32V20x_D8) || defined(CH32V20x_D8W) +#define OSC_BASE (AHBPERIPH_BASE + 0x202C) +#endif + +/* Peripheral declaration */ +#define TIM2 ((TIM_TypeDef *)TIM2_BASE) +#define TIM3 ((TIM_TypeDef *)TIM3_BASE) +#define TIM4 ((TIM_TypeDef *)TIM4_BASE) +#define TIM5 ((TIM_TypeDef *)TIM5_BASE) +#define RTC ((RTC_TypeDef *)RTC_BASE) +#define WWDG ((WWDG_TypeDef *)WWDG_BASE) +#define IWDG ((IWDG_TypeDef *)IWDG_BASE) +#define SPI2 ((SPI_TypeDef *)SPI2_BASE) +#define USART2 ((USART_TypeDef *)USART2_BASE) +#define USART3 ((USART_TypeDef *)USART3_BASE) +#define UART4 ((USART_TypeDef *)UART4_BASE) +#define I2C1 ((I2C_TypeDef *)I2C1_BASE) +#define I2C2 ((I2C_TypeDef *)I2C2_BASE) +#define CAN1 ((CAN_TypeDef *)CAN1_BASE) +#define BKP ((BKP_TypeDef *)BKP_BASE) +#define PWR ((PWR_TypeDef *)PWR_BASE) + +#define AFIO ((AFIO_TypeDef *)AFIO_BASE) +#define EXTI ((EXTI_TypeDef *)EXTI_BASE) +#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *)GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *)GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *)GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *)GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *)GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *)GPIOG_BASE) +#define ADC1 ((ADC_TypeDef *)ADC1_BASE) +#define ADC2 ((ADC_TypeDef *)ADC2_BASE) +#define TKey1 ((ADC_TypeDef *)ADC1_BASE) +#define TKey2 ((ADC_TypeDef *)ADC2_BASE) +#define TIM1 ((TIM_TypeDef *)TIM1_BASE) +#define SPI1 ((SPI_TypeDef *)SPI1_BASE) +#define USART1 ((USART_TypeDef *)USART1_BASE) + +#define DMA1 ((DMA_TypeDef *)DMA1_BASE) +#define DMA1_Channel1 ((DMA_Channel_TypeDef *)DMA1_Channel1_BASE) +#define DMA1_Channel2 ((DMA_Channel_TypeDef *)DMA1_Channel2_BASE) +#define DMA1_Channel3 ((DMA_Channel_TypeDef *)DMA1_Channel3_BASE) +#define DMA1_Channel4 ((DMA_Channel_TypeDef *)DMA1_Channel4_BASE) +#define DMA1_Channel5 ((DMA_Channel_TypeDef *)DMA1_Channel5_BASE) +#define DMA1_Channel6 ((DMA_Channel_TypeDef *)DMA1_Channel6_BASE) +#define DMA1_Channel7 ((DMA_Channel_TypeDef *)DMA1_Channel7_BASE) +#define DMA1_Channel8 ((DMA_Channel_TypeDef *)DMA1_Channel8_BASE) +#define RCC ((RCC_TypeDef *)RCC_BASE) +#define FLASH ((FLASH_TypeDef *)FLASH_R_BASE) +#define CRC ((CRC_TypeDef *)CRC_BASE) +#define USBOTG_FS ((USBOTG_FS_TypeDef *)USBFS_BASE) +#define USBOTG_H_FS ((USBOTG_FS_HOST_TypeDef *)USBFS_BASE) +#define EXTEN ((EXTEN_TypeDef *)EXTEN_BASE) +#define OPA ((OPA_TypeDef *)OPA_BASE) +#define ETH10M ((ETH10M_TypeDef *)ETH10M_BASE) + +#define OB ((OB_TypeDef *)OB_BASE) + +#if defined(CH32V20x_D8) || defined(CH32V20x_D8W) +#define OSC ((OSC_TypeDef *)OSC_BASE) +#endif + + +/******************************************************************************/ +/* Peripheral Registers Bits Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* Analog to Digital Converter */ +/******************************************************************************/ + +/******************** Bit definition for ADC_STATR register ********************/ +#define ADC_AWD ((uint8_t)0x01) /* Analog watchdog flag */ +#define ADC_EOC ((uint8_t)0x02) /* End of conversion */ +#define ADC_JEOC ((uint8_t)0x04) /* Injected channel end of conversion */ +#define ADC_JSTRT ((uint8_t)0x08) /* Injected channel Start flag */ +#define ADC_STRT ((uint8_t)0x10) /* Regular channel Start flag */ + +/******************* Bit definition for ADC_CTLR1 register ********************/ +#define ADC_AWDCH ((uint32_t)0x0000001F) /* AWDCH[4:0] bits (Analog watchdog channel select bits) */ +#define ADC_AWDCH_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_AWDCH_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_AWDCH_2 ((uint32_t)0x00000004) /* Bit 2 */ +#define ADC_AWDCH_3 ((uint32_t)0x00000008) /* Bit 3 */ +#define ADC_AWDCH_4 ((uint32_t)0x00000010) /* Bit 4 */ + +#define ADC_EOCIE ((uint32_t)0x00000020) /* Interrupt enable for EOC */ +#define ADC_AWDIE ((uint32_t)0x00000040) /* Analog Watchdog interrupt enable */ +#define ADC_JEOCIE ((uint32_t)0x00000080) /* Interrupt enable for injected channels */ +#define ADC_SCAN ((uint32_t)0x00000100) /* Scan mode */ +#define ADC_AWDSGL ((uint32_t)0x00000200) /* Enable the watchdog on a single channel in scan mode */ +#define ADC_JAUTO ((uint32_t)0x00000400) /* Automatic injected group conversion */ +#define ADC_DISCEN ((uint32_t)0x00000800) /* Discontinuous mode on regular channels */ +#define ADC_JDISCEN ((uint32_t)0x00001000) /* Discontinuous mode on injected channels */ + +#define ADC_DISCNUM ((uint32_t)0x0000E000) /* DISCNUM[2:0] bits (Discontinuous mode channel count) */ +#define ADC_DISCNUM_0 ((uint32_t)0x00002000) /* Bit 0 */ +#define ADC_DISCNUM_1 ((uint32_t)0x00004000) /* Bit 1 */ +#define ADC_DISCNUM_2 ((uint32_t)0x00008000) /* Bit 2 */ + +#define ADC_DUALMOD ((uint32_t)0x000F0000) /* DUALMOD[3:0] bits (Dual mode selection) */ +#define ADC_DUALMOD_0 ((uint32_t)0x00010000) /* Bit 0 */ +#define ADC_DUALMOD_1 ((uint32_t)0x00020000) /* Bit 1 */ +#define ADC_DUALMOD_2 ((uint32_t)0x00040000) /* Bit 2 */ +#define ADC_DUALMOD_3 ((uint32_t)0x00080000) /* Bit 3 */ + +#define ADC_JAWDEN ((uint32_t)0x00400000) /* Analog watchdog enable on injected channels */ +#define ADC_AWDEN ((uint32_t)0x00800000) /* Analog watchdog enable on regular channels */ + +/******************* Bit definition for ADC_CTLR2 register ********************/ +#define ADC_ADON ((uint32_t)0x00000001) /* A/D Converter ON / OFF */ +#define ADC_CONT ((uint32_t)0x00000002) /* Continuous Conversion */ +#define ADC_CAL ((uint32_t)0x00000004) /* A/D Calibration */ +#define ADC_RSTCAL ((uint32_t)0x00000008) /* Reset Calibration */ +#define ADC_DMA ((uint32_t)0x00000100) /* Direct Memory access mode */ +#define ADC_ALIGN ((uint32_t)0x00000800) /* Data Alignment */ + +#define ADC_JEXTSEL ((uint32_t)0x00007000) /* JEXTSEL[2:0] bits (External event select for injected group) */ +#define ADC_JEXTSEL_0 ((uint32_t)0x00001000) /* Bit 0 */ +#define ADC_JEXTSEL_1 ((uint32_t)0x00002000) /* Bit 1 */ +#define ADC_JEXTSEL_2 ((uint32_t)0x00004000) /* Bit 2 */ + +#define ADC_JEXTTRIG ((uint32_t)0x00008000) /* External Trigger Conversion mode for injected channels */ + +#define ADC_EXTSEL ((uint32_t)0x000E0000) /* EXTSEL[2:0] bits (External Event Select for regular group) */ +#define ADC_EXTSEL_0 ((uint32_t)0x00020000) /* Bit 0 */ +#define ADC_EXTSEL_1 ((uint32_t)0x00040000) /* Bit 1 */ +#define ADC_EXTSEL_2 ((uint32_t)0x00080000) /* Bit 2 */ + +#define ADC_EXTTRIG ((uint32_t)0x00100000) /* External Trigger Conversion mode for regular channels */ +#define ADC_JSWSTART ((uint32_t)0x00200000) /* Start Conversion of injected channels */ +#define ADC_SWSTART ((uint32_t)0x00400000) /* Start Conversion of regular channels */ +#define ADC_TSVREFE ((uint32_t)0x00800000) /* Temperature Sensor and VREFINT Enable */ + +/****************** Bit definition for ADC_SAMPTR1 register *******************/ +#define ADC_SMP10 ((uint32_t)0x00000007) /* SMP10[2:0] bits (Channel 10 Sample time selection) */ +#define ADC_SMP10_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_SMP10_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_SMP10_2 ((uint32_t)0x00000004) /* Bit 2 */ + +#define ADC_SMP11 ((uint32_t)0x00000038) /* SMP11[2:0] bits (Channel 11 Sample time selection) */ +#define ADC_SMP11_0 ((uint32_t)0x00000008) /* Bit 0 */ +#define ADC_SMP11_1 ((uint32_t)0x00000010) /* Bit 1 */ +#define ADC_SMP11_2 ((uint32_t)0x00000020) /* Bit 2 */ + +#define ADC_SMP12 ((uint32_t)0x000001C0) /* SMP12[2:0] bits (Channel 12 Sample time selection) */ +#define ADC_SMP12_0 ((uint32_t)0x00000040) /* Bit 0 */ +#define ADC_SMP12_1 ((uint32_t)0x00000080) /* Bit 1 */ +#define ADC_SMP12_2 ((uint32_t)0x00000100) /* Bit 2 */ + +#define ADC_SMP13 ((uint32_t)0x00000E00) /* SMP13[2:0] bits (Channel 13 Sample time selection) */ +#define ADC_SMP13_0 ((uint32_t)0x00000200) /* Bit 0 */ +#define ADC_SMP13_1 ((uint32_t)0x00000400) /* Bit 1 */ +#define ADC_SMP13_2 ((uint32_t)0x00000800) /* Bit 2 */ + +#define ADC_SMP14 ((uint32_t)0x00007000) /* SMP14[2:0] bits (Channel 14 Sample time selection) */ +#define ADC_SMP14_0 ((uint32_t)0x00001000) /* Bit 0 */ +#define ADC_SMP14_1 ((uint32_t)0x00002000) /* Bit 1 */ +#define ADC_SMP14_2 ((uint32_t)0x00004000) /* Bit 2 */ + +#define ADC_SMP15 ((uint32_t)0x00038000) /* SMP15[2:0] bits (Channel 15 Sample time selection) */ +#define ADC_SMP15_0 ((uint32_t)0x00008000) /* Bit 0 */ +#define ADC_SMP15_1 ((uint32_t)0x00010000) /* Bit 1 */ +#define ADC_SMP15_2 ((uint32_t)0x00020000) /* Bit 2 */ + +#define ADC_SMP16 ((uint32_t)0x001C0000) /* SMP16[2:0] bits (Channel 16 Sample time selection) */ +#define ADC_SMP16_0 ((uint32_t)0x00040000) /* Bit 0 */ +#define ADC_SMP16_1 ((uint32_t)0x00080000) /* Bit 1 */ +#define ADC_SMP16_2 ((uint32_t)0x00100000) /* Bit 2 */ + +#define ADC_SMP17 ((uint32_t)0x00E00000) /* SMP17[2:0] bits (Channel 17 Sample time selection) */ +#define ADC_SMP17_0 ((uint32_t)0x00200000) /* Bit 0 */ +#define ADC_SMP17_1 ((uint32_t)0x00400000) /* Bit 1 */ +#define ADC_SMP17_2 ((uint32_t)0x00800000) /* Bit 2 */ + +/****************** Bit definition for ADC_SAMPTR2 register *******************/ +#define ADC_SMP0 ((uint32_t)0x00000007) /* SMP0[2:0] bits (Channel 0 Sample time selection) */ +#define ADC_SMP0_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_SMP0_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_SMP0_2 ((uint32_t)0x00000004) /* Bit 2 */ + +#define ADC_SMP1 ((uint32_t)0x00000038) /* SMP1[2:0] bits (Channel 1 Sample time selection) */ +#define ADC_SMP1_0 ((uint32_t)0x00000008) /* Bit 0 */ +#define ADC_SMP1_1 ((uint32_t)0x00000010) /* Bit 1 */ +#define ADC_SMP1_2 ((uint32_t)0x00000020) /* Bit 2 */ + +#define ADC_SMP2 ((uint32_t)0x000001C0) /* SMP2[2:0] bits (Channel 2 Sample time selection) */ +#define ADC_SMP2_0 ((uint32_t)0x00000040) /* Bit 0 */ +#define ADC_SMP2_1 ((uint32_t)0x00000080) /* Bit 1 */ +#define ADC_SMP2_2 ((uint32_t)0x00000100) /* Bit 2 */ + +#define ADC_SMP3 ((uint32_t)0x00000E00) /* SMP3[2:0] bits (Channel 3 Sample time selection) */ +#define ADC_SMP3_0 ((uint32_t)0x00000200) /* Bit 0 */ +#define ADC_SMP3_1 ((uint32_t)0x00000400) /* Bit 1 */ +#define ADC_SMP3_2 ((uint32_t)0x00000800) /* Bit 2 */ + +#define ADC_SMP4 ((uint32_t)0x00007000) /* SMP4[2:0] bits (Channel 4 Sample time selection) */ +#define ADC_SMP4_0 ((uint32_t)0x00001000) /* Bit 0 */ +#define ADC_SMP4_1 ((uint32_t)0x00002000) /* Bit 1 */ +#define ADC_SMP4_2 ((uint32_t)0x00004000) /* Bit 2 */ + +#define ADC_SMP5 ((uint32_t)0x00038000) /* SMP5[2:0] bits (Channel 5 Sample time selection) */ +#define ADC_SMP5_0 ((uint32_t)0x00008000) /* Bit 0 */ +#define ADC_SMP5_1 ((uint32_t)0x00010000) /* Bit 1 */ +#define ADC_SMP5_2 ((uint32_t)0x00020000) /* Bit 2 */ + +#define ADC_SMP6 ((uint32_t)0x001C0000) /* SMP6[2:0] bits (Channel 6 Sample time selection) */ +#define ADC_SMP6_0 ((uint32_t)0x00040000) /* Bit 0 */ +#define ADC_SMP6_1 ((uint32_t)0x00080000) /* Bit 1 */ +#define ADC_SMP6_2 ((uint32_t)0x00100000) /* Bit 2 */ + +#define ADC_SMP7 ((uint32_t)0x00E00000) /* SMP7[2:0] bits (Channel 7 Sample time selection) */ +#define ADC_SMP7_0 ((uint32_t)0x00200000) /* Bit 0 */ +#define ADC_SMP7_1 ((uint32_t)0x00400000) /* Bit 1 */ +#define ADC_SMP7_2 ((uint32_t)0x00800000) /* Bit 2 */ + +#define ADC_SMP8 ((uint32_t)0x07000000) /* SMP8[2:0] bits (Channel 8 Sample time selection) */ +#define ADC_SMP8_0 ((uint32_t)0x01000000) /* Bit 0 */ +#define ADC_SMP8_1 ((uint32_t)0x02000000) /* Bit 1 */ +#define ADC_SMP8_2 ((uint32_t)0x04000000) /* Bit 2 */ + +#define ADC_SMP9 ((uint32_t)0x38000000) /* SMP9[2:0] bits (Channel 9 Sample time selection) */ +#define ADC_SMP9_0 ((uint32_t)0x08000000) /* Bit 0 */ +#define ADC_SMP9_1 ((uint32_t)0x10000000) /* Bit 1 */ +#define ADC_SMP9_2 ((uint32_t)0x20000000) /* Bit 2 */ + +/****************** Bit definition for ADC_IOFR1 register *******************/ +#define ADC_JOFFSET1 ((uint16_t)0x0FFF) /* Data offset for injected channel 1 */ + +/****************** Bit definition for ADC_IOFR2 register *******************/ +#define ADC_JOFFSET2 ((uint16_t)0x0FFF) /* Data offset for injected channel 2 */ + +/****************** Bit definition for ADC_IOFR3 register *******************/ +#define ADC_JOFFSET3 ((uint16_t)0x0FFF) /* Data offset for injected channel 3 */ + +/****************** Bit definition for ADC_IOFR4 register *******************/ +#define ADC_JOFFSET4 ((uint16_t)0x0FFF) /* Data offset for injected channel 4 */ + +/******************* Bit definition for ADC_WDHTR register ********************/ +#define ADC_HT ((uint16_t)0x0FFF) /* Analog watchdog high threshold */ + +/******************* Bit definition for ADC_WDLTR register ********************/ +#define ADC_LT ((uint16_t)0x0FFF) /* Analog watchdog low threshold */ + +/******************* Bit definition for ADC_RSQR1 register *******************/ +#define ADC_SQ13 ((uint32_t)0x0000001F) /* SQ13[4:0] bits (13th conversion in regular sequence) */ +#define ADC_SQ13_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_SQ13_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_SQ13_2 ((uint32_t)0x00000004) /* Bit 2 */ +#define ADC_SQ13_3 ((uint32_t)0x00000008) /* Bit 3 */ +#define ADC_SQ13_4 ((uint32_t)0x00000010) /* Bit 4 */ + +#define ADC_SQ14 ((uint32_t)0x000003E0) /* SQ14[4:0] bits (14th conversion in regular sequence) */ +#define ADC_SQ14_0 ((uint32_t)0x00000020) /* Bit 0 */ +#define ADC_SQ14_1 ((uint32_t)0x00000040) /* Bit 1 */ +#define ADC_SQ14_2 ((uint32_t)0x00000080) /* Bit 2 */ +#define ADC_SQ14_3 ((uint32_t)0x00000100) /* Bit 3 */ +#define ADC_SQ14_4 ((uint32_t)0x00000200) /* Bit 4 */ + +#define ADC_SQ15 ((uint32_t)0x00007C00) /* SQ15[4:0] bits (15th conversion in regular sequence) */ +#define ADC_SQ15_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define ADC_SQ15_1 ((uint32_t)0x00000800) /* Bit 1 */ +#define ADC_SQ15_2 ((uint32_t)0x00001000) /* Bit 2 */ +#define ADC_SQ15_3 ((uint32_t)0x00002000) /* Bit 3 */ +#define ADC_SQ15_4 ((uint32_t)0x00004000) /* Bit 4 */ + +#define ADC_SQ16 ((uint32_t)0x000F8000) /* SQ16[4:0] bits (16th conversion in regular sequence) */ +#define ADC_SQ16_0 ((uint32_t)0x00008000) /* Bit 0 */ +#define ADC_SQ16_1 ((uint32_t)0x00010000) /* Bit 1 */ +#define ADC_SQ16_2 ((uint32_t)0x00020000) /* Bit 2 */ +#define ADC_SQ16_3 ((uint32_t)0x00040000) /* Bit 3 */ +#define ADC_SQ16_4 ((uint32_t)0x00080000) /* Bit 4 */ + +#define ADC_L ((uint32_t)0x00F00000) /* L[3:0] bits (Regular channel sequence length) */ +#define ADC_L_0 ((uint32_t)0x00100000) /* Bit 0 */ +#define ADC_L_1 ((uint32_t)0x00200000) /* Bit 1 */ +#define ADC_L_2 ((uint32_t)0x00400000) /* Bit 2 */ +#define ADC_L_3 ((uint32_t)0x00800000) /* Bit 3 */ + +/******************* Bit definition for ADC_RSQR2 register *******************/ +#define ADC_SQ7 ((uint32_t)0x0000001F) /* SQ7[4:0] bits (7th conversion in regular sequence) */ +#define ADC_SQ7_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_SQ7_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_SQ7_2 ((uint32_t)0x00000004) /* Bit 2 */ +#define ADC_SQ7_3 ((uint32_t)0x00000008) /* Bit 3 */ +#define ADC_SQ7_4 ((uint32_t)0x00000010) /* Bit 4 */ + +#define ADC_SQ8 ((uint32_t)0x000003E0) /* SQ8[4:0] bits (8th conversion in regular sequence) */ +#define ADC_SQ8_0 ((uint32_t)0x00000020) /* Bit 0 */ +#define ADC_SQ8_1 ((uint32_t)0x00000040) /* Bit 1 */ +#define ADC_SQ8_2 ((uint32_t)0x00000080) /* Bit 2 */ +#define ADC_SQ8_3 ((uint32_t)0x00000100) /* Bit 3 */ +#define ADC_SQ8_4 ((uint32_t)0x00000200) /* Bit 4 */ + +#define ADC_SQ9 ((uint32_t)0x00007C00) /* SQ9[4:0] bits (9th conversion in regular sequence) */ +#define ADC_SQ9_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define ADC_SQ9_1 ((uint32_t)0x00000800) /* Bit 1 */ +#define ADC_SQ9_2 ((uint32_t)0x00001000) /* Bit 2 */ +#define ADC_SQ9_3 ((uint32_t)0x00002000) /* Bit 3 */ +#define ADC_SQ9_4 ((uint32_t)0x00004000) /* Bit 4 */ + +#define ADC_SQ10 ((uint32_t)0x000F8000) /* SQ10[4:0] bits (10th conversion in regular sequence) */ +#define ADC_SQ10_0 ((uint32_t)0x00008000) /* Bit 0 */ +#define ADC_SQ10_1 ((uint32_t)0x00010000) /* Bit 1 */ +#define ADC_SQ10_2 ((uint32_t)0x00020000) /* Bit 2 */ +#define ADC_SQ10_3 ((uint32_t)0x00040000) /* Bit 3 */ +#define ADC_SQ10_4 ((uint32_t)0x00080000) /* Bit 4 */ + +#define ADC_SQ11 ((uint32_t)0x01F00000) /* SQ11[4:0] bits (11th conversion in regular sequence) */ +#define ADC_SQ11_0 ((uint32_t)0x00100000) /* Bit 0 */ +#define ADC_SQ11_1 ((uint32_t)0x00200000) /* Bit 1 */ +#define ADC_SQ11_2 ((uint32_t)0x00400000) /* Bit 2 */ +#define ADC_SQ11_3 ((uint32_t)0x00800000) /* Bit 3 */ +#define ADC_SQ11_4 ((uint32_t)0x01000000) /* Bit 4 */ + +#define ADC_SQ12 ((uint32_t)0x3E000000) /* SQ12[4:0] bits (12th conversion in regular sequence) */ +#define ADC_SQ12_0 ((uint32_t)0x02000000) /* Bit 0 */ +#define ADC_SQ12_1 ((uint32_t)0x04000000) /* Bit 1 */ +#define ADC_SQ12_2 ((uint32_t)0x08000000) /* Bit 2 */ +#define ADC_SQ12_3 ((uint32_t)0x10000000) /* Bit 3 */ +#define ADC_SQ12_4 ((uint32_t)0x20000000) /* Bit 4 */ + +/******************* Bit definition for ADC_RSQR3 register *******************/ +#define ADC_SQ1 ((uint32_t)0x0000001F) /* SQ1[4:0] bits (1st conversion in regular sequence) */ +#define ADC_SQ1_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_SQ1_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_SQ1_2 ((uint32_t)0x00000004) /* Bit 2 */ +#define ADC_SQ1_3 ((uint32_t)0x00000008) /* Bit 3 */ +#define ADC_SQ1_4 ((uint32_t)0x00000010) /* Bit 4 */ + +#define ADC_SQ2 ((uint32_t)0x000003E0) /* SQ2[4:0] bits (2nd conversion in regular sequence) */ +#define ADC_SQ2_0 ((uint32_t)0x00000020) /* Bit 0 */ +#define ADC_SQ2_1 ((uint32_t)0x00000040) /* Bit 1 */ +#define ADC_SQ2_2 ((uint32_t)0x00000080) /* Bit 2 */ +#define ADC_SQ2_3 ((uint32_t)0x00000100) /* Bit 3 */ +#define ADC_SQ2_4 ((uint32_t)0x00000200) /* Bit 4 */ + +#define ADC_SQ3 ((uint32_t)0x00007C00) /* SQ3[4:0] bits (3rd conversion in regular sequence) */ +#define ADC_SQ3_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define ADC_SQ3_1 ((uint32_t)0x00000800) /* Bit 1 */ +#define ADC_SQ3_2 ((uint32_t)0x00001000) /* Bit 2 */ +#define ADC_SQ3_3 ((uint32_t)0x00002000) /* Bit 3 */ +#define ADC_SQ3_4 ((uint32_t)0x00004000) /* Bit 4 */ + +#define ADC_SQ4 ((uint32_t)0x000F8000) /* SQ4[4:0] bits (4th conversion in regular sequence) */ +#define ADC_SQ4_0 ((uint32_t)0x00008000) /* Bit 0 */ +#define ADC_SQ4_1 ((uint32_t)0x00010000) /* Bit 1 */ +#define ADC_SQ4_2 ((uint32_t)0x00020000) /* Bit 2 */ +#define ADC_SQ4_3 ((uint32_t)0x00040000) /* Bit 3 */ +#define ADC_SQ4_4 ((uint32_t)0x00080000) /* Bit 4 */ + +#define ADC_SQ5 ((uint32_t)0x01F00000) /* SQ5[4:0] bits (5th conversion in regular sequence) */ +#define ADC_SQ5_0 ((uint32_t)0x00100000) /* Bit 0 */ +#define ADC_SQ5_1 ((uint32_t)0x00200000) /* Bit 1 */ +#define ADC_SQ5_2 ((uint32_t)0x00400000) /* Bit 2 */ +#define ADC_SQ5_3 ((uint32_t)0x00800000) /* Bit 3 */ +#define ADC_SQ5_4 ((uint32_t)0x01000000) /* Bit 4 */ + +#define ADC_SQ6 ((uint32_t)0x3E000000) /* SQ6[4:0] bits (6th conversion in regular sequence) */ +#define ADC_SQ6_0 ((uint32_t)0x02000000) /* Bit 0 */ +#define ADC_SQ6_1 ((uint32_t)0x04000000) /* Bit 1 */ +#define ADC_SQ6_2 ((uint32_t)0x08000000) /* Bit 2 */ +#define ADC_SQ6_3 ((uint32_t)0x10000000) /* Bit 3 */ +#define ADC_SQ6_4 ((uint32_t)0x20000000) /* Bit 4 */ + +/******************* Bit definition for ADC_ISQR register *******************/ +#define ADC_JSQ1 ((uint32_t)0x0000001F) /* JSQ1[4:0] bits (1st conversion in injected sequence) */ +#define ADC_JSQ1_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_JSQ1_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_JSQ1_2 ((uint32_t)0x00000004) /* Bit 2 */ +#define ADC_JSQ1_3 ((uint32_t)0x00000008) /* Bit 3 */ +#define ADC_JSQ1_4 ((uint32_t)0x00000010) /* Bit 4 */ + +#define ADC_JSQ2 ((uint32_t)0x000003E0) /* JSQ2[4:0] bits (2nd conversion in injected sequence) */ +#define ADC_JSQ2_0 ((uint32_t)0x00000020) /* Bit 0 */ +#define ADC_JSQ2_1 ((uint32_t)0x00000040) /* Bit 1 */ +#define ADC_JSQ2_2 ((uint32_t)0x00000080) /* Bit 2 */ +#define ADC_JSQ2_3 ((uint32_t)0x00000100) /* Bit 3 */ +#define ADC_JSQ2_4 ((uint32_t)0x00000200) /* Bit 4 */ + +#define ADC_JSQ3 ((uint32_t)0x00007C00) /* JSQ3[4:0] bits (3rd conversion in injected sequence) */ +#define ADC_JSQ3_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define ADC_JSQ3_1 ((uint32_t)0x00000800) /* Bit 1 */ +#define ADC_JSQ3_2 ((uint32_t)0x00001000) /* Bit 2 */ +#define ADC_JSQ3_3 ((uint32_t)0x00002000) /* Bit 3 */ +#define ADC_JSQ3_4 ((uint32_t)0x00004000) /* Bit 4 */ + +#define ADC_JSQ4 ((uint32_t)0x000F8000) /* JSQ4[4:0] bits (4th conversion in injected sequence) */ +#define ADC_JSQ4_0 ((uint32_t)0x00008000) /* Bit 0 */ +#define ADC_JSQ4_1 ((uint32_t)0x00010000) /* Bit 1 */ +#define ADC_JSQ4_2 ((uint32_t)0x00020000) /* Bit 2 */ +#define ADC_JSQ4_3 ((uint32_t)0x00040000) /* Bit 3 */ +#define ADC_JSQ4_4 ((uint32_t)0x00080000) /* Bit 4 */ + +#define ADC_JL ((uint32_t)0x00300000) /* JL[1:0] bits (Injected Sequence length) */ +#define ADC_JL_0 ((uint32_t)0x00100000) /* Bit 0 */ +#define ADC_JL_1 ((uint32_t)0x00200000) /* Bit 1 */ + +/******************* Bit definition for ADC_IDATAR1 register *******************/ +#define ADC_IDATAR1_JDATA ((uint16_t)0xFFFF) /* Injected data */ + +/******************* Bit definition for ADC_IDATAR2 register *******************/ +#define ADC_IDATAR2_JDATA ((uint16_t)0xFFFF) /* Injected data */ + +/******************* Bit definition for ADC_IDATAR3 register *******************/ +#define ADC_IDATAR3_JDATA ((uint16_t)0xFFFF) /* Injected data */ + +/******************* Bit definition for ADC_IDATAR4 register *******************/ +#define ADC_IDATAR4_JDATA ((uint16_t)0xFFFF) /* Injected data */ + +/******************** Bit definition for ADC_RDATAR register ********************/ +#define ADC_RDATAR_DATA ((uint32_t)0x0000FFFF) /* Regular data */ +#define ADC_RDATAR_ADC2DATA ((uint32_t)0xFFFF0000) /* ADC2 data */ + +/******************************************************************************/ +/* Backup registers */ +/******************************************************************************/ + +/******************* Bit definition for BKP_DATAR1 register ********************/ +#define BKP_DATAR1_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR2 register ********************/ +#define BKP_DATAR2_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR3 register ********************/ +#define BKP_DATAR3_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR4 register ********************/ +#define BKP_DATAR4_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR5 register ********************/ +#define BKP_DATAR5_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR6 register ********************/ +#define BKP_DATAR6_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR7 register ********************/ +#define BKP_DATAR7_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR8 register ********************/ +#define BKP_DATAR8_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR9 register ********************/ +#define BKP_DATAR9_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR10 register *******************/ +#define BKP_DATAR10_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR11 register *******************/ +#define BKP_DATAR11_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR12 register *******************/ +#define BKP_DATAR12_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR13 register *******************/ +#define BKP_DATAR13_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR14 register *******************/ +#define BKP_DATAR14_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR15 register *******************/ +#define BKP_DATAR15_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR16 register *******************/ +#define BKP_DATAR16_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR17 register *******************/ +#define BKP_DATAR17_D ((uint16_t)0xFFFF) /* Backup data */ + +/****************** Bit definition for BKP_DATAR18 register ********************/ +#define BKP_DATAR18_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR19 register *******************/ +#define BKP_DATAR19_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR20 register *******************/ +#define BKP_DATAR20_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR21 register *******************/ +#define BKP_DATAR21_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR22 register *******************/ +#define BKP_DATAR22_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR23 register *******************/ +#define BKP_DATAR23_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR24 register *******************/ +#define BKP_DATAR24_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR25 register *******************/ +#define BKP_DATAR25_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR26 register *******************/ +#define BKP_DATAR26_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR27 register *******************/ +#define BKP_DATAR27_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR28 register *******************/ +#define BKP_DATAR28_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR29 register *******************/ +#define BKP_DATAR29_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR30 register *******************/ +#define BKP_DATAR30_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR31 register *******************/ +#define BKP_DATAR31_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR32 register *******************/ +#define BKP_DATAR32_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR33 register *******************/ +#define BKP_DATAR33_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR34 register *******************/ +#define BKP_DATAR34_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR35 register *******************/ +#define BKP_DATAR35_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR36 register *******************/ +#define BKP_DATAR36_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR37 register *******************/ +#define BKP_DATAR37_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR38 register *******************/ +#define BKP_DATAR38_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR39 register *******************/ +#define BKP_DATAR39_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR40 register *******************/ +#define BKP_DATAR40_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR41 register *******************/ +#define BKP_DATAR41_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR42 register *******************/ +#define BKP_DATAR42_D ((uint16_t)0xFFFF) /* Backup data */ + +/****************** Bit definition for BKP_OCTLR register *******************/ +#define BKP_CAL ((uint16_t)0x007F) /* Calibration value */ +#define BKP_CCO ((uint16_t)0x0080) /* Calibration Clock Output */ +#define BKP_ASOE ((uint16_t)0x0100) /* Alarm or Second Output Enable */ +#define BKP_ASOS ((uint16_t)0x0200) /* Alarm or Second Output Selection */ + +/******************** Bit definition for BKP_TPCTLR register ********************/ +#define BKP_TPE ((uint8_t)0x01) /* TAMPER pin enable */ +#define BKP_TPAL ((uint8_t)0x02) /* TAMPER pin active level */ + +/******************* Bit definition for BKP_TPCSR register ********************/ +#define BKP_CTE ((uint16_t)0x0001) /* Clear Tamper event */ +#define BKP_CTI ((uint16_t)0x0002) /* Clear Tamper Interrupt */ +#define BKP_TPIE ((uint16_t)0x0004) /* TAMPER Pin interrupt enable */ +#define BKP_TEF ((uint16_t)0x0100) /* Tamper Event Flag */ +#define BKP_TIF ((uint16_t)0x0200) /* Tamper Interrupt Flag */ + +/******************************************************************************/ +/* Controller Area Network */ +/******************************************************************************/ + +/******************* Bit definition for CAN_CTLR register ********************/ +#define CAN_CTLR_INRQ ((uint16_t)0x0001) /* Initialization Request */ +#define CAN_CTLR_SLEEP ((uint16_t)0x0002) /* Sleep Mode Request */ +#define CAN_CTLR_TXFP ((uint16_t)0x0004) /* Transmit FIFO Priority */ +#define CAN_CTLR_RFLM ((uint16_t)0x0008) /* Receive FIFO Locked Mode */ +#define CAN_CTLR_NART ((uint16_t)0x0010) /* No Automatic Retransmission */ +#define CAN_CTLR_AWUM ((uint16_t)0x0020) /* Automatic Wakeup Mode */ +#define CAN_CTLR_ABOM ((uint16_t)0x0040) /* Automatic Bus-Off Management */ +#define CAN_CTLR_TTCM ((uint16_t)0x0080) /* Time Triggered Communication Mode */ +#define CAN_CTLR_RESET ((uint16_t)0x8000) /* CAN software master reset */ + +/******************* Bit definition for CAN_STATR register ********************/ +#define CAN_STATR_INAK ((uint16_t)0x0001) /* Initialization Acknowledge */ +#define CAN_STATR_SLAK ((uint16_t)0x0002) /* Sleep Acknowledge */ +#define CAN_STATR_ERRI ((uint16_t)0x0004) /* Error Interrupt */ +#define CAN_STATR_WKUI ((uint16_t)0x0008) /* Wakeup Interrupt */ +#define CAN_STATR_SLAKI ((uint16_t)0x0010) /* Sleep Acknowledge Interrupt */ +#define CAN_STATR_TXM ((uint16_t)0x0100) /* Transmit Mode */ +#define CAN_STATR_RXM ((uint16_t)0x0200) /* Receive Mode */ +#define CAN_STATR_SAMP ((uint16_t)0x0400) /* Last Sample Point */ +#define CAN_STATR_RX ((uint16_t)0x0800) /* CAN Rx Signal */ + +/******************* Bit definition for CAN_TSTATR register ********************/ +#define CAN_TSTATR_RQCP0 ((uint32_t)0x00000001) /* Request Completed Mailbox0 */ +#define CAN_TSTATR_TXOK0 ((uint32_t)0x00000002) /* Transmission OK of Mailbox0 */ +#define CAN_TSTATR_ALST0 ((uint32_t)0x00000004) /* Arbitration Lost for Mailbox0 */ +#define CAN_TSTATR_TERR0 ((uint32_t)0x00000008) /* Transmission Error of Mailbox0 */ +#define CAN_TSTATR_ABRQ0 ((uint32_t)0x00000080) /* Abort Request for Mailbox0 */ +#define CAN_TSTATR_RQCP1 ((uint32_t)0x00000100) /* Request Completed Mailbox1 */ +#define CAN_TSTATR_TXOK1 ((uint32_t)0x00000200) /* Transmission OK of Mailbox1 */ +#define CAN_TSTATR_ALST1 ((uint32_t)0x00000400) /* Arbitration Lost for Mailbox1 */ +#define CAN_TSTATR_TERR1 ((uint32_t)0x00000800) /* Transmission Error of Mailbox1 */ +#define CAN_TSTATR_ABRQ1 ((uint32_t)0x00008000) /* Abort Request for Mailbox 1 */ +#define CAN_TSTATR_RQCP2 ((uint32_t)0x00010000) /* Request Completed Mailbox2 */ +#define CAN_TSTATR_TXOK2 ((uint32_t)0x00020000) /* Transmission OK of Mailbox 2 */ +#define CAN_TSTATR_ALST2 ((uint32_t)0x00040000) /* Arbitration Lost for mailbox 2 */ +#define CAN_TSTATR_TERR2 ((uint32_t)0x00080000) /* Transmission Error of Mailbox 2 */ +#define CAN_TSTATR_ABRQ2 ((uint32_t)0x00800000) /* Abort Request for Mailbox 2 */ +#define CAN_TSTATR_CODE ((uint32_t)0x03000000) /* Mailbox Code */ + +#define CAN_TSTATR_TME ((uint32_t)0x1C000000) /* TME[2:0] bits */ +#define CAN_TSTATR_TME0 ((uint32_t)0x04000000) /* Transmit Mailbox 0 Empty */ +#define CAN_TSTATR_TME1 ((uint32_t)0x08000000) /* Transmit Mailbox 1 Empty */ +#define CAN_TSTATR_TME2 ((uint32_t)0x10000000) /* Transmit Mailbox 2 Empty */ + +#define CAN_TSTATR_LOW ((uint32_t)0xE0000000) /* LOW[2:0] bits */ +#define CAN_TSTATR_LOW0 ((uint32_t)0x20000000) /* Lowest Priority Flag for Mailbox 0 */ +#define CAN_TSTATR_LOW1 ((uint32_t)0x40000000) /* Lowest Priority Flag for Mailbox 1 */ +#define CAN_TSTATR_LOW2 ((uint32_t)0x80000000) /* Lowest Priority Flag for Mailbox 2 */ + +/******************* Bit definition for CAN_RFIFO0 register *******************/ +#define CAN_RFIFO0_FMP0 ((uint8_t)0x03) /* FIFO 0 Message Pending */ +#define CAN_RFIFO0_FULL0 ((uint8_t)0x08) /* FIFO 0 Full */ +#define CAN_RFIFO0_FOVR0 ((uint8_t)0x10) /* FIFO 0 Overrun */ +#define CAN_RFIFO0_RFOM0 ((uint8_t)0x20) /* Release FIFO 0 Output Mailbox */ + +/******************* Bit definition for CAN_RFIFO1 register *******************/ +#define CAN_RFIFO1_FMP1 ((uint8_t)0x03) /* FIFO 1 Message Pending */ +#define CAN_RFIFO1_FULL1 ((uint8_t)0x08) /* FIFO 1 Full */ +#define CAN_RFIFO1_FOVR1 ((uint8_t)0x10) /* FIFO 1 Overrun */ +#define CAN_RFIFO1_RFOM1 ((uint8_t)0x20) /* Release FIFO 1 Output Mailbox */ + +/******************** Bit definition for CAN_INTENR register *******************/ +#define CAN_INTENR_TMEIE ((uint32_t)0x00000001) /* Transmit Mailbox Empty Interrupt Enable */ +#define CAN_INTENR_FMPIE0 ((uint32_t)0x00000002) /* FIFO Message Pending Interrupt Enable */ +#define CAN_INTENR_FFIE0 ((uint32_t)0x00000004) /* FIFO Full Interrupt Enable */ +#define CAN_INTENR_FOVIE0 ((uint32_t)0x00000008) /* FIFO Overrun Interrupt Enable */ +#define CAN_INTENR_FMPIE1 ((uint32_t)0x00000010) /* FIFO Message Pending Interrupt Enable */ +#define CAN_INTENR_FFIE1 ((uint32_t)0x00000020) /* FIFO Full Interrupt Enable */ +#define CAN_INTENR_FOVIE1 ((uint32_t)0x00000040) /* FIFO Overrun Interrupt Enable */ +#define CAN_INTENR_EWGIE ((uint32_t)0x00000100) /* Error Warning Interrupt Enable */ +#define CAN_INTENR_EPVIE ((uint32_t)0x00000200) /* Error Passive Interrupt Enable */ +#define CAN_INTENR_BOFIE ((uint32_t)0x00000400) /* Bus-Off Interrupt Enable */ +#define CAN_INTENR_LECIE ((uint32_t)0x00000800) /* Last Error Code Interrupt Enable */ +#define CAN_INTENR_ERRIE ((uint32_t)0x00008000) /* Error Interrupt Enable */ +#define CAN_INTENR_WKUIE ((uint32_t)0x00010000) /* Wakeup Interrupt Enable */ +#define CAN_INTENR_SLKIE ((uint32_t)0x00020000) /* Sleep Interrupt Enable */ + +/******************** Bit definition for CAN_ERRSR register *******************/ +#define CAN_ERRSR_EWGF ((uint32_t)0x00000001) /* Error Warning Flag */ +#define CAN_ERRSR_EPVF ((uint32_t)0x00000002) /* Error Passive Flag */ +#define CAN_ERRSR_BOFF ((uint32_t)0x00000004) /* Bus-Off Flag */ + +#define CAN_ERRSR_LEC ((uint32_t)0x00000070) /* LEC[2:0] bits (Last Error Code) */ +#define CAN_ERRSR_LEC_0 ((uint32_t)0x00000010) /* Bit 0 */ +#define CAN_ERRSR_LEC_1 ((uint32_t)0x00000020) /* Bit 1 */ +#define CAN_ERRSR_LEC_2 ((uint32_t)0x00000040) /* Bit 2 */ + +#define CAN_ERRSR_TEC ((uint32_t)0x00FF0000) /* Least significant byte of the 9-bit Transmit Error Counter */ +#define CAN_ERRSR_REC ((uint32_t)0xFF000000) /* Receive Error Counter */ + +/******************* Bit definition for CAN_BTIMR register ********************/ +#define CAN_BTIMR_BRP ((uint32_t)0x000003FF) /* Baud Rate Prescaler */ +#define CAN_BTIMR_TS1 ((uint32_t)0x000F0000) /* Time Segment 1 */ +#define CAN_BTIMR_TS2 ((uint32_t)0x00700000) /* Time Segment 2 */ +#define CAN_BTIMR_SJW ((uint32_t)0x03000000) /* Resynchronization Jump Width */ +#define CAN_BTIMR_LBKM ((uint32_t)0x40000000) /* Loop Back Mode (Debug) */ +#define CAN_BTIMR_SILM ((uint32_t)0x80000000) /* Silent Mode */ + +/****************** Bit definition for CAN_TXMI0R register ********************/ +#define CAN_TXMI0R_TXRQ ((uint32_t)0x00000001) /* Transmit Mailbox Request */ +#define CAN_TXMI0R_RTR ((uint32_t)0x00000002) /* Remote Transmission Request */ +#define CAN_TXMI0R_IDE ((uint32_t)0x00000004) /* Identifier Extension */ +#define CAN_TXMI0R_EXID ((uint32_t)0x001FFFF8) /* Extended Identifier */ +#define CAN_TXMI0R_STID ((uint32_t)0xFFE00000) /* Standard Identifier or Extended Identifier */ + +/****************** Bit definition for CAN_TXMDT0R register *******************/ +#define CAN_TXMDT0R_DLC ((uint32_t)0x0000000F) /* Data Length Code */ +#define CAN_TXMDT0R_TGT ((uint32_t)0x00000100) /* Transmit Global Time */ +#define CAN_TXMDT0R_TIME ((uint32_t)0xFFFF0000) /* Message Time Stamp */ + +/****************** Bit definition for CAN_TXMDL0R register *******************/ +#define CAN_TXMDL0R_DATA0 ((uint32_t)0x000000FF) /* Data byte 0 */ +#define CAN_TXMDL0R_DATA1 ((uint32_t)0x0000FF00) /* Data byte 1 */ +#define CAN_TXMDL0R_DATA2 ((uint32_t)0x00FF0000) /* Data byte 2 */ +#define CAN_TXMDL0R_DATA3 ((uint32_t)0xFF000000) /* Data byte 3 */ + +/****************** Bit definition for CAN_TXMDH0R register *******************/ +#define CAN_TXMDH0R_DATA4 ((uint32_t)0x000000FF) /* Data byte 4 */ +#define CAN_TXMDH0R_DATA5 ((uint32_t)0x0000FF00) /* Data byte 5 */ +#define CAN_TXMDH0R_DATA6 ((uint32_t)0x00FF0000) /* Data byte 6 */ +#define CAN_TXMDH0R_DATA7 ((uint32_t)0xFF000000) /* Data byte 7 */ + +/******************* Bit definition for CAN_TXMI1R register *******************/ +#define CAN_TXMI1R_TXRQ ((uint32_t)0x00000001) /* Transmit Mailbox Request */ +#define CAN_TXMI1R_RTR ((uint32_t)0x00000002) /* Remote Transmission Request */ +#define CAN_TXMI1R_IDE ((uint32_t)0x00000004) /* Identifier Extension */ +#define CAN_TXMI1R_EXID ((uint32_t)0x001FFFF8) /* Extended Identifier */ +#define CAN_TXMI1R_STID ((uint32_t)0xFFE00000) /* Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_TXMDT1R register ******************/ +#define CAN_TXMDT1R_DLC ((uint32_t)0x0000000F) /* Data Length Code */ +#define CAN_TXMDT1R_TGT ((uint32_t)0x00000100) /* Transmit Global Time */ +#define CAN_TXMDT1R_TIME ((uint32_t)0xFFFF0000) /* Message Time Stamp */ + +/******************* Bit definition for CAN_TXMDL1R register ******************/ +#define CAN_TXMDL1R_DATA0 ((uint32_t)0x000000FF) /* Data byte 0 */ +#define CAN_TXMDL1R_DATA1 ((uint32_t)0x0000FF00) /* Data byte 1 */ +#define CAN_TXMDL1R_DATA2 ((uint32_t)0x00FF0000) /* Data byte 2 */ +#define CAN_TXMDL1R_DATA3 ((uint32_t)0xFF000000) /* Data byte 3 */ + +/******************* Bit definition for CAN_TXMDH1R register ******************/ +#define CAN_TXMDH1R_DATA4 ((uint32_t)0x000000FF) /* Data byte 4 */ +#define CAN_TXMDH1R_DATA5 ((uint32_t)0x0000FF00) /* Data byte 5 */ +#define CAN_TXMDH1R_DATA6 ((uint32_t)0x00FF0000) /* Data byte 6 */ +#define CAN_TXMDH1R_DATA7 ((uint32_t)0xFF000000) /* Data byte 7 */ + +/******************* Bit definition for CAN_TXMI2R register *******************/ +#define CAN_TXMI2R_TXRQ ((uint32_t)0x00000001) /* Transmit Mailbox Request */ +#define CAN_TXMI2R_RTR ((uint32_t)0x00000002) /* Remote Transmission Request */ +#define CAN_TXMI2R_IDE ((uint32_t)0x00000004) /* Identifier Extension */ +#define CAN_TXMI2R_EXID ((uint32_t)0x001FFFF8) /* Extended identifier */ +#define CAN_TXMI2R_STID ((uint32_t)0xFFE00000) /* Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_TXMDT2R register ******************/ +#define CAN_TXMDT2R_DLC ((uint32_t)0x0000000F) /* Data Length Code */ +#define CAN_TXMDT2R_TGT ((uint32_t)0x00000100) /* Transmit Global Time */ +#define CAN_TXMDT2R_TIME ((uint32_t)0xFFFF0000) /* Message Time Stamp */ + +/******************* Bit definition for CAN_TXMDL2R register ******************/ +#define CAN_TXMDL2R_DATA0 ((uint32_t)0x000000FF) /* Data byte 0 */ +#define CAN_TXMDL2R_DATA1 ((uint32_t)0x0000FF00) /* Data byte 1 */ +#define CAN_TXMDL2R_DATA2 ((uint32_t)0x00FF0000) /* Data byte 2 */ +#define CAN_TXMDL2R_DATA3 ((uint32_t)0xFF000000) /* Data byte 3 */ + +/******************* Bit definition for CAN_TXMDH2R register ******************/ +#define CAN_TXMDH2R_DATA4 ((uint32_t)0x000000FF) /* Data byte 4 */ +#define CAN_TXMDH2R_DATA5 ((uint32_t)0x0000FF00) /* Data byte 5 */ +#define CAN_TXMDH2R_DATA6 ((uint32_t)0x00FF0000) /* Data byte 6 */ +#define CAN_TXMDH2R_DATA7 ((uint32_t)0xFF000000) /* Data byte 7 */ + +/******************* Bit definition for CAN_RXMI0R register *******************/ +#define CAN_RXMI0R_RTR ((uint32_t)0x00000002) /* Remote Transmission Request */ +#define CAN_RXMI0R_IDE ((uint32_t)0x00000004) /* Identifier Extension */ +#define CAN_RXMI0R_EXID ((uint32_t)0x001FFFF8) /* Extended Identifier */ +#define CAN_RXMI0R_STID ((uint32_t)0xFFE00000) /* Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_RXMDT0R register ******************/ +#define CAN_RXMDT0R_DLC ((uint32_t)0x0000000F) /* Data Length Code */ +#define CAN_RXMDT0R_FMI ((uint32_t)0x0000FF00) /* Filter Match Index */ +#define CAN_RXMDT0R_TIME ((uint32_t)0xFFFF0000) /* Message Time Stamp */ + +/******************* Bit definition for CAN_RXMDL0R register ******************/ +#define CAN_RXMDL0R_DATA0 ((uint32_t)0x000000FF) /* Data byte 0 */ +#define CAN_RXMDL0R_DATA1 ((uint32_t)0x0000FF00) /* Data byte 1 */ +#define CAN_RXMDL0R_DATA2 ((uint32_t)0x00FF0000) /* Data byte 2 */ +#define CAN_RXMDL0R_DATA3 ((uint32_t)0xFF000000) /* Data byte 3 */ + +/******************* Bit definition for CAN_RXMDH0R register ******************/ +#define CAN_RXMDH0R_DATA4 ((uint32_t)0x000000FF) /* Data byte 4 */ +#define CAN_RXMDH0R_DATA5 ((uint32_t)0x0000FF00) /* Data byte 5 */ +#define CAN_RXMDH0R_DATA6 ((uint32_t)0x00FF0000) /* Data byte 6 */ +#define CAN_RXMDH0R_DATA7 ((uint32_t)0xFF000000) /* Data byte 7 */ + +/******************* Bit definition for CAN_RXMI1R register *******************/ +#define CAN_RXMI1R_RTR ((uint32_t)0x00000002) /* Remote Transmission Request */ +#define CAN_RXMI1R_IDE ((uint32_t)0x00000004) /* Identifier Extension */ +#define CAN_RXMI1R_EXID ((uint32_t)0x001FFFF8) /* Extended identifier */ +#define CAN_RXMI1R_STID ((uint32_t)0xFFE00000) /* Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_RXMDT1R register ******************/ +#define CAN_RXMDT1R_DLC ((uint32_t)0x0000000F) /* Data Length Code */ +#define CAN_RXMDT1R_FMI ((uint32_t)0x0000FF00) /* Filter Match Index */ +#define CAN_RXMDT1R_TIME ((uint32_t)0xFFFF0000) /* Message Time Stamp */ + +/******************* Bit definition for CAN_RXMDL1R register ******************/ +#define CAN_RXMDL1R_DATA0 ((uint32_t)0x000000FF) /* Data byte 0 */ +#define CAN_RXMDL1R_DATA1 ((uint32_t)0x0000FF00) /* Data byte 1 */ +#define CAN_RXMDL1R_DATA2 ((uint32_t)0x00FF0000) /* Data byte 2 */ +#define CAN_RXMDL1R_DATA3 ((uint32_t)0xFF000000) /* Data byte 3 */ + +/******************* Bit definition for CAN_RXMDH1R register ******************/ +#define CAN_RXMDH1R_DATA4 ((uint32_t)0x000000FF) /* Data byte 4 */ +#define CAN_RXMDH1R_DATA5 ((uint32_t)0x0000FF00) /* Data byte 5 */ +#define CAN_RXMDH1R_DATA6 ((uint32_t)0x00FF0000) /* Data byte 6 */ +#define CAN_RXMDH1R_DATA7 ((uint32_t)0xFF000000) /* Data byte 7 */ + +/******************* Bit definition for CAN_FCTLR register ********************/ +#define CAN_FCTLR_FINIT ((uint8_t)0x01) /* Filter Init Mode */ + +/******************* Bit definition for CAN_FMCFGR register *******************/ +#define CAN_FMCFGR_FBM ((uint16_t)0x3FFF) /* Filter Mode */ +#define CAN_FMCFGR_FBM0 ((uint16_t)0x0001) /* Filter Init Mode bit 0 */ +#define CAN_FMCFGR_FBM1 ((uint16_t)0x0002) /* Filter Init Mode bit 1 */ +#define CAN_FMCFGR_FBM2 ((uint16_t)0x0004) /* Filter Init Mode bit 2 */ +#define CAN_FMCFGR_FBM3 ((uint16_t)0x0008) /* Filter Init Mode bit 3 */ +#define CAN_FMCFGR_FBM4 ((uint16_t)0x0010) /* Filter Init Mode bit 4 */ +#define CAN_FMCFGR_FBM5 ((uint16_t)0x0020) /* Filter Init Mode bit 5 */ +#define CAN_FMCFGR_FBM6 ((uint16_t)0x0040) /* Filter Init Mode bit 6 */ +#define CAN_FMCFGR_FBM7 ((uint16_t)0x0080) /* Filter Init Mode bit 7 */ +#define CAN_FMCFGR_FBM8 ((uint16_t)0x0100) /* Filter Init Mode bit 8 */ +#define CAN_FMCFGR_FBM9 ((uint16_t)0x0200) /* Filter Init Mode bit 9 */ +#define CAN_FMCFGR_FBM10 ((uint16_t)0x0400) /* Filter Init Mode bit 10 */ +#define CAN_FMCFGR_FBM11 ((uint16_t)0x0800) /* Filter Init Mode bit 11 */ +#define CAN_FMCFGR_FBM12 ((uint16_t)0x1000) /* Filter Init Mode bit 12 */ +#define CAN_FMCFGR_FBM13 ((uint16_t)0x2000) /* Filter Init Mode bit 13 */ + +/******************* Bit definition for CAN_FSCFGR register *******************/ +#define CAN_FSCFGR_FSC ((uint16_t)0x3FFF) /* Filter Scale Configuration */ +#define CAN_FSCFGR_FSC0 ((uint16_t)0x0001) /* Filter Scale Configuration bit 0 */ +#define CAN_FSCFGR_FSC1 ((uint16_t)0x0002) /* Filter Scale Configuration bit 1 */ +#define CAN_FSCFGR_FSC2 ((uint16_t)0x0004) /* Filter Scale Configuration bit 2 */ +#define CAN_FSCFGR_FSC3 ((uint16_t)0x0008) /* Filter Scale Configuration bit 3 */ +#define CAN_FSCFGR_FSC4 ((uint16_t)0x0010) /* Filter Scale Configuration bit 4 */ +#define CAN_FSCFGR_FSC5 ((uint16_t)0x0020) /* Filter Scale Configuration bit 5 */ +#define CAN_FSCFGR_FSC6 ((uint16_t)0x0040) /* Filter Scale Configuration bit 6 */ +#define CAN_FSCFGR_FSC7 ((uint16_t)0x0080) /* Filter Scale Configuration bit 7 */ +#define CAN_FSCFGR_FSC8 ((uint16_t)0x0100) /* Filter Scale Configuration bit 8 */ +#define CAN_FSCFGR_FSC9 ((uint16_t)0x0200) /* Filter Scale Configuration bit 9 */ +#define CAN_FSCFGR_FSC10 ((uint16_t)0x0400) /* Filter Scale Configuration bit 10 */ +#define CAN_FSCFGR_FSC11 ((uint16_t)0x0800) /* Filter Scale Configuration bit 11 */ +#define CAN_FSCFGR_FSC12 ((uint16_t)0x1000) /* Filter Scale Configuration bit 12 */ +#define CAN_FSCFGR_FSC13 ((uint16_t)0x2000) /* Filter Scale Configuration bit 13 */ + +/****************** Bit definition for CAN_FAFIFOR register *******************/ +#define CAN_FAFIFOR_FFA ((uint16_t)0x3FFF) /* Filter FIFO Assignment */ +#define CAN_FAFIFOR_FFA0 ((uint16_t)0x0001) /* Filter FIFO Assignment for Filter 0 */ +#define CAN_FAFIFOR_FFA1 ((uint16_t)0x0002) /* Filter FIFO Assignment for Filter 1 */ +#define CAN_FAFIFOR_FFA2 ((uint16_t)0x0004) /* Filter FIFO Assignment for Filter 2 */ +#define CAN_FAFIFOR_FFA3 ((uint16_t)0x0008) /* Filter FIFO Assignment for Filter 3 */ +#define CAN_FAFIFOR_FFA4 ((uint16_t)0x0010) /* Filter FIFO Assignment for Filter 4 */ +#define CAN_FAFIFOR_FFA5 ((uint16_t)0x0020) /* Filter FIFO Assignment for Filter 5 */ +#define CAN_FAFIFOR_FFA6 ((uint16_t)0x0040) /* Filter FIFO Assignment for Filter 6 */ +#define CAN_FAFIFOR_FFA7 ((uint16_t)0x0080) /* Filter FIFO Assignment for Filter 7 */ +#define CAN_FAFIFOR_FFA8 ((uint16_t)0x0100) /* Filter FIFO Assignment for Filter 8 */ +#define CAN_FAFIFOR_FFA9 ((uint16_t)0x0200) /* Filter FIFO Assignment for Filter 9 */ +#define CAN_FAFIFOR_FFA10 ((uint16_t)0x0400) /* Filter FIFO Assignment for Filter 10 */ +#define CAN_FAFIFOR_FFA11 ((uint16_t)0x0800) /* Filter FIFO Assignment for Filter 11 */ +#define CAN_FAFIFOR_FFA12 ((uint16_t)0x1000) /* Filter FIFO Assignment for Filter 12 */ +#define CAN_FAFIFOR_FFA13 ((uint16_t)0x2000) /* Filter FIFO Assignment for Filter 13 */ + +/******************* Bit definition for CAN_FWR register *******************/ +#define CAN_FWR_FACT ((uint16_t)0x3FFF) /* Filter Active */ +#define CAN_FWR_FACT0 ((uint16_t)0x0001) /* Filter 0 Active */ +#define CAN_FWR_FACT1 ((uint16_t)0x0002) /* Filter 1 Active */ +#define CAN_FWR_FACT2 ((uint16_t)0x0004) /* Filter 2 Active */ +#define CAN_FWR_FACT3 ((uint16_t)0x0008) /* Filter 3 Active */ +#define CAN_FWR_FACT4 ((uint16_t)0x0010) /* Filter 4 Active */ +#define CAN_FWR_FACT5 ((uint16_t)0x0020) /* Filter 5 Active */ +#define CAN_FWR_FACT6 ((uint16_t)0x0040) /* Filter 6 Active */ +#define CAN_FWR_FACT7 ((uint16_t)0x0080) /* Filter 7 Active */ +#define CAN_FWR_FACT8 ((uint16_t)0x0100) /* Filter 8 Active */ +#define CAN_FWR_FACT9 ((uint16_t)0x0200) /* Filter 9 Active */ +#define CAN_FWR_FACT10 ((uint16_t)0x0400) /* Filter 10 Active */ +#define CAN_FWR_FACT11 ((uint16_t)0x0800) /* Filter 11 Active */ +#define CAN_FWR_FACT12 ((uint16_t)0x1000) /* Filter 12 Active */ +#define CAN_FWR_FACT13 ((uint16_t)0x2000) /* Filter 13 Active */ + +/******************* Bit definition for CAN_F0R1 register *******************/ +#define CAN_F0R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F0R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F0R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F0R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F0R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F0R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F0R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F0R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F0R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F0R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F0R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F0R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F0R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F0R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F0R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F0R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F0R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F0R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F0R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F0R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F0R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F0R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F0R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F0R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F0R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F0R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F0R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F0R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F0R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F0R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F0R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F0R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F1R1 register *******************/ +#define CAN_F1R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F1R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F1R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F1R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F1R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F1R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F1R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F1R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F1R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F1R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F1R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F1R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F1R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F1R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F1R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F1R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F1R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F1R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F1R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F1R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F1R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F1R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F1R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F1R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F1R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F1R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F1R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F1R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F1R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F1R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F1R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F1R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F2R1 register *******************/ +#define CAN_F2R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F2R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F2R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F2R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F2R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F2R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F2R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F2R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F2R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F2R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F2R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F2R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F2R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F2R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F2R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F2R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F2R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F2R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F2R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F2R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F2R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F2R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F2R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F2R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F2R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F2R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F2R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F2R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F2R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F2R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F2R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F2R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F3R1 register *******************/ +#define CAN_F3R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F3R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F3R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F3R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F3R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F3R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F3R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F3R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F3R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F3R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F3R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F3R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F3R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F3R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F3R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F3R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F3R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F3R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F3R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F3R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F3R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F3R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F3R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F3R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F3R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F3R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F3R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F3R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F3R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F3R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F3R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F3R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F4R1 register *******************/ +#define CAN_F4R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F4R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F4R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F4R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F4R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F4R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F4R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F4R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F4R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F4R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F4R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F4R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F4R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F4R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F4R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F4R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F4R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F4R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F4R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F4R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F4R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F4R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F4R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F4R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F4R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F4R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F4R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F4R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F4R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F4R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F4R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F4R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F5R1 register *******************/ +#define CAN_F5R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F5R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F5R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F5R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F5R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F5R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F5R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F5R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F5R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F5R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F5R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F5R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F5R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F5R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F5R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F5R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F5R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F5R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F5R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F5R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F5R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F5R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F5R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F5R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F5R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F5R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F5R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F5R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F5R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F5R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F5R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F5R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F6R1 register *******************/ +#define CAN_F6R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F6R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F6R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F6R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F6R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F6R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F6R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F6R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F6R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F6R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F6R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F6R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F6R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F6R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F6R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F6R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F6R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F6R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F6R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F6R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F6R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F6R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F6R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F6R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F6R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F6R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F6R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F6R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F6R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F6R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F6R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F6R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F7R1 register *******************/ +#define CAN_F7R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F7R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F7R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F7R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F7R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F7R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F7R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F7R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F7R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F7R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F7R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F7R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F7R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F7R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F7R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F7R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F7R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F7R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F7R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F7R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F7R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F7R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F7R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F7R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F7R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F7R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F7R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F7R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F7R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F7R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F7R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F7R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F8R1 register *******************/ +#define CAN_F8R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F8R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F8R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F8R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F8R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F8R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F8R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F8R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F8R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F8R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F8R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F8R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F8R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F8R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F8R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F8R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F8R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F8R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F8R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F8R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F8R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F8R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F8R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F8R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F8R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F8R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F8R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F8R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F8R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F8R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F8R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F8R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F9R1 register *******************/ +#define CAN_F9R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F9R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F9R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F9R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F9R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F9R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F9R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F9R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F9R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F9R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F9R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F9R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F9R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F9R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F9R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F9R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F9R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F9R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F9R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F9R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F9R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F9R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F9R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F9R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F9R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F9R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F9R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F9R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F9R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F9R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F9R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F9R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F10R1 register ******************/ +#define CAN_F10R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F10R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F10R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F10R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F10R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F10R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F10R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F10R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F10R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F10R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F10R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F10R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F10R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F10R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F10R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F10R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F10R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F10R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F10R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F10R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F10R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F10R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F10R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F10R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F10R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F10R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F10R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F10R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F10R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F10R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F10R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F10R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F11R1 register ******************/ +#define CAN_F11R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F11R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F11R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F11R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F11R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F11R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F11R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F11R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F11R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F11R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F11R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F11R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F11R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F11R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F11R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F11R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F11R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F11R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F11R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F11R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F11R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F11R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F11R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F11R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F11R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F11R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F11R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F11R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F11R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F11R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F11R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F11R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F12R1 register ******************/ +#define CAN_F12R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F12R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F12R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F12R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F12R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F12R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F12R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F12R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F12R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F12R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F12R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F12R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F12R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F12R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F12R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F12R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F12R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F12R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F12R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F12R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F12R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F12R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F12R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F12R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F12R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F12R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F12R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F12R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F12R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F12R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F12R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F12R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F13R1 register ******************/ +#define CAN_F13R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F13R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F13R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F13R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F13R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F13R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F13R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F13R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F13R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F13R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F13R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F13R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F13R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F13R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F13R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F13R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F13R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F13R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F13R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F13R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F13R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F13R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F13R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F13R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F13R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F13R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F13R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F13R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F13R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F13R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F13R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F13R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F0R2 register *******************/ +#define CAN_F0R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F0R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F0R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F0R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F0R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F0R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F0R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F0R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F0R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F0R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F0R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F0R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F0R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F0R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F0R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F0R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F0R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F0R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F0R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F0R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F0R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F0R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F0R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F0R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F0R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F0R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F0R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F0R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F0R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F0R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F0R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F0R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F1R2 register *******************/ +#define CAN_F1R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F1R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F1R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F1R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F1R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F1R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F1R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F1R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F1R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F1R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F1R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F1R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F1R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F1R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F1R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F1R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F1R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F1R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F1R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F1R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F1R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F1R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F1R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F1R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F1R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F1R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F1R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F1R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F1R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F1R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F1R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F1R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F2R2 register *******************/ +#define CAN_F2R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F2R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F2R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F2R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F2R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F2R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F2R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F2R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F2R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F2R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F2R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F2R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F2R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F2R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F2R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F2R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F2R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F2R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F2R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F2R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F2R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F2R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F2R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F2R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F2R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F2R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F2R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F2R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F2R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F2R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F2R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F2R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F3R2 register *******************/ +#define CAN_F3R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F3R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F3R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F3R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F3R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F3R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F3R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F3R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F3R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F3R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F3R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F3R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F3R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F3R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F3R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F3R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F3R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F3R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F3R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F3R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F3R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F3R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F3R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F3R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F3R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F3R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F3R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F3R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F3R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F3R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F3R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F3R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F4R2 register *******************/ +#define CAN_F4R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F4R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F4R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F4R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F4R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F4R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F4R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F4R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F4R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F4R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F4R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F4R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F4R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F4R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F4R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F4R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F4R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F4R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F4R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F4R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F4R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F4R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F4R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F4R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F4R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F4R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F4R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F4R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F4R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F4R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F4R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F4R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F5R2 register *******************/ +#define CAN_F5R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F5R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F5R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F5R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F5R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F5R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F5R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F5R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F5R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F5R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F5R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F5R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F5R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F5R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F5R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F5R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F5R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F5R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F5R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F5R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F5R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F5R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F5R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F5R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F5R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F5R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F5R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F5R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F5R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F5R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F5R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F5R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F6R2 register *******************/ +#define CAN_F6R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F6R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F6R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F6R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F6R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F6R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F6R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F6R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F6R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F6R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F6R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F6R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F6R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F6R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F6R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F6R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F6R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F6R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F6R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F6R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F6R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F6R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F6R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F6R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F6R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F6R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F6R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F6R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F6R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F6R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F6R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F6R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F7R2 register *******************/ +#define CAN_F7R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F7R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F7R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F7R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F7R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F7R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F7R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F7R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F7R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F7R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F7R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F7R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F7R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F7R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F7R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F7R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F7R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F7R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F7R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F7R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F7R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F7R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F7R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F7R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F7R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F7R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F7R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F7R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F7R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F7R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F7R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F7R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F8R2 register *******************/ +#define CAN_F8R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F8R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F8R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F8R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F8R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F8R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F8R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F8R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F8R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F8R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F8R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F8R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F8R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F8R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F8R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F8R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F8R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F8R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F8R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F8R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F8R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F8R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F8R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F8R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F8R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F8R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F8R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F8R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F8R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F8R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F8R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F8R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F9R2 register *******************/ +#define CAN_F9R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F9R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F9R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F9R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F9R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F9R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F9R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F9R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F9R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F9R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F9R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F9R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F9R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F9R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F9R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F9R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F9R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F9R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F9R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F9R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F9R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F9R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F9R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F9R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F9R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F9R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F9R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F9R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F9R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F9R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F9R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F9R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F10R2 register ******************/ +#define CAN_F10R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F10R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F10R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F10R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F10R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F10R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F10R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F10R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F10R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F10R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F10R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F10R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F10R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F10R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F10R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F10R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F10R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F10R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F10R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F10R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F10R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F10R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F10R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F10R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F10R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F10R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F10R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F10R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F10R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F10R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F10R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F10R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F11R2 register ******************/ +#define CAN_F11R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F11R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F11R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F11R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F11R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F11R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F11R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F11R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F11R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F11R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F11R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F11R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F11R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F11R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F11R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F11R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F11R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F11R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F11R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F11R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F11R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F11R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F11R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F11R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F11R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F11R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F11R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F11R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F11R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F11R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F11R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F11R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F12R2 register ******************/ +#define CAN_F12R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F12R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F12R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F12R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F12R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F12R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F12R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F12R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F12R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F12R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F12R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F12R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F12R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F12R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F12R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F12R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F12R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F12R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F12R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F12R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F12R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F12R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F12R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F12R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F12R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F12R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F12R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F12R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F12R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F12R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F12R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F12R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F13R2 register ******************/ +#define CAN_F13R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F13R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F13R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F13R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F13R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F13R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F13R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F13R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F13R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F13R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F13R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F13R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F13R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F13R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F13R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F13R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F13R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F13R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F13R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F13R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F13R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F13R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F13R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F13R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F13R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F13R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F13R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F13R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F13R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F13R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F13R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F13R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************************************************************************/ +/* CRC Calculation Unit */ +/******************************************************************************/ + +/******************* Bit definition for CRC_DATAR register *********************/ +#define CRC_DATAR_DR ((uint32_t)0xFFFFFFFF) /* Data register bits */ + +/******************* Bit definition for CRC_IDATAR register ********************/ +#define CRC_IDR_IDATAR ((uint8_t)0xFF) /* General-purpose 8-bit data register bits */ + +/******************** Bit definition for CRC_CTLR register ********************/ +#define CRC_CTLR_RESET ((uint8_t)0x01) /* RESET bit */ + +/******************************************************************************/ +/* DMA Controller */ +/******************************************************************************/ + +/******************* Bit definition for DMA_INTFR register ********************/ +#define DMA_GIF1 ((uint32_t)0x00000001) /* Channel 1 Global interrupt flag */ +#define DMA_TCIF1 ((uint32_t)0x00000002) /* Channel 1 Transfer Complete flag */ +#define DMA_HTIF1 ((uint32_t)0x00000004) /* Channel 1 Half Transfer flag */ +#define DMA_TEIF1 ((uint32_t)0x00000008) /* Channel 1 Transfer Error flag */ +#define DMA_GIF2 ((uint32_t)0x00000010) /* Channel 2 Global interrupt flag */ +#define DMA_TCIF2 ((uint32_t)0x00000020) /* Channel 2 Transfer Complete flag */ +#define DMA_HTIF2 ((uint32_t)0x00000040) /* Channel 2 Half Transfer flag */ +#define DMA_TEIF2 ((uint32_t)0x00000080) /* Channel 2 Transfer Error flag */ +#define DMA_GIF3 ((uint32_t)0x00000100) /* Channel 3 Global interrupt flag */ +#define DMA_TCIF3 ((uint32_t)0x00000200) /* Channel 3 Transfer Complete flag */ +#define DMA_HTIF3 ((uint32_t)0x00000400) /* Channel 3 Half Transfer flag */ +#define DMA_TEIF3 ((uint32_t)0x00000800) /* Channel 3 Transfer Error flag */ +#define DMA_GIF4 ((uint32_t)0x00001000) /* Channel 4 Global interrupt flag */ +#define DMA_TCIF4 ((uint32_t)0x00002000) /* Channel 4 Transfer Complete flag */ +#define DMA_HTIF4 ((uint32_t)0x00004000) /* Channel 4 Half Transfer flag */ +#define DMA_TEIF4 ((uint32_t)0x00008000) /* Channel 4 Transfer Error flag */ +#define DMA_GIF5 ((uint32_t)0x00010000) /* Channel 5 Global interrupt flag */ +#define DMA_TCIF5 ((uint32_t)0x00020000) /* Channel 5 Transfer Complete flag */ +#define DMA_HTIF5 ((uint32_t)0x00040000) /* Channel 5 Half Transfer flag */ +#define DMA_TEIF5 ((uint32_t)0x00080000) /* Channel 5 Transfer Error flag */ +#define DMA_GIF6 ((uint32_t)0x00100000) /* Channel 6 Global interrupt flag */ +#define DMA_TCIF6 ((uint32_t)0x00200000) /* Channel 6 Transfer Complete flag */ +#define DMA_HTIF6 ((uint32_t)0x00400000) /* Channel 6 Half Transfer flag */ +#define DMA_TEIF6 ((uint32_t)0x00800000) /* Channel 6 Transfer Error flag */ +#define DMA_GIF7 ((uint32_t)0x01000000) /* Channel 7 Global interrupt flag */ +#define DMA_TCIF7 ((uint32_t)0x02000000) /* Channel 7 Transfer Complete flag */ +#define DMA_HTIF7 ((uint32_t)0x04000000) /* Channel 7 Half Transfer flag */ +#define DMA_TEIF7 ((uint32_t)0x08000000) /* Channel 7 Transfer Error flag */ + +#define DMA_GIF8 ((uint32_t)0x00000001) /* Channel 8 Global interrupt flag */ +#define DMA_TCIF8 ((uint32_t)0x00000002) /* Channel 8 Transfer Complete flag */ +#define DMA_HTIF8 ((uint32_t)0x00000004) /* Channel 8 Half Transfer flag */ +#define DMA_TEIF8 ((uint32_t)0x00000008) /* Channel 8 Transfer Error flag */ +#define DMA_GIF9 ((uint32_t)0x00000010) /* Channel 9 Global interrupt flag */ +#define DMA_TCIF9 ((uint32_t)0x00000020) /* Channel 9 Transfer Complete flag */ +#define DMA_HTIF9 ((uint32_t)0x00000040) /* Channel 9 Half Transfer flag */ +#define DMA_TEIF9 ((uint32_t)0x00000080) /* Channel 9 Transfer Error flag */ +#define DMA_GIF10 ((uint32_t)0x00000100) /* Channel 10 Global interrupt flag */ +#define DMA_TCIF10 ((uint32_t)0x00000200) /* Channel 10 Transfer Complete flag */ +#define DMA_HTIF10 ((uint32_t)0x00000400) /* Channel 10 Half Transfer flag */ +#define DMA_TEIF10 ((uint32_t)0x00000800) /* Channel 10 Transfer Error flag */ +#define DMA_GIF11 ((uint32_t)0x00001000) /* Channel 11 Global interrupt flag */ +#define DMA_TCIF11 ((uint32_t)0x00002000) /* Channel 11 Transfer Complete flag */ +#define DMA_HTIF11 ((uint32_t)0x00004000) /* Channel 11 Half Transfer flag */ +#define DMA_TEIF11 ((uint32_t)0x00008000) /* Channel 11 Transfer Error flag */ + +/******************* Bit definition for DMA_INTFCR register *******************/ +#define DMA_CGIF1 ((uint32_t)0x00000001) /* Channel 1 Global interrupt clear */ +#define DMA_CTCIF1 ((uint32_t)0x00000002) /* Channel 1 Transfer Complete clear */ +#define DMA_CHTIF1 ((uint32_t)0x00000004) /* Channel 1 Half Transfer clear */ +#define DMA_CTEIF1 ((uint32_t)0x00000008) /* Channel 1 Transfer Error clear */ +#define DMA_CGIF2 ((uint32_t)0x00000010) /* Channel 2 Global interrupt clear */ +#define DMA_CTCIF2 ((uint32_t)0x00000020) /* Channel 2 Transfer Complete clear */ +#define DMA_CHTIF2 ((uint32_t)0x00000040) /* Channel 2 Half Transfer clear */ +#define DMA_CTEIF2 ((uint32_t)0x00000080) /* Channel 2 Transfer Error clear */ +#define DMA_CGIF3 ((uint32_t)0x00000100) /* Channel 3 Global interrupt clear */ +#define DMA_CTCIF3 ((uint32_t)0x00000200) /* Channel 3 Transfer Complete clear */ +#define DMA_CHTIF3 ((uint32_t)0x00000400) /* Channel 3 Half Transfer clear */ +#define DMA_CTEIF3 ((uint32_t)0x00000800) /* Channel 3 Transfer Error clear */ +#define DMA_CGIF4 ((uint32_t)0x00001000) /* Channel 4 Global interrupt clear */ +#define DMA_CTCIF4 ((uint32_t)0x00002000) /* Channel 4 Transfer Complete clear */ +#define DMA_CHTIF4 ((uint32_t)0x00004000) /* Channel 4 Half Transfer clear */ +#define DMA_CTEIF4 ((uint32_t)0x00008000) /* Channel 4 Transfer Error clear */ +#define DMA_CGIF5 ((uint32_t)0x00010000) /* Channel 5 Global interrupt clear */ +#define DMA_CTCIF5 ((uint32_t)0x00020000) /* Channel 5 Transfer Complete clear */ +#define DMA_CHTIF5 ((uint32_t)0x00040000) /* Channel 5 Half Transfer clear */ +#define DMA_CTEIF5 ((uint32_t)0x00080000) /* Channel 5 Transfer Error clear */ +#define DMA_CGIF6 ((uint32_t)0x00100000) /* Channel 6 Global interrupt clear */ +#define DMA_CTCIF6 ((uint32_t)0x00200000) /* Channel 6 Transfer Complete clear */ +#define DMA_CHTIF6 ((uint32_t)0x00400000) /* Channel 6 Half Transfer clear */ +#define DMA_CTEIF6 ((uint32_t)0x00800000) /* Channel 6 Transfer Error clear */ +#define DMA_CGIF7 ((uint32_t)0x01000000) /* Channel 7 Global interrupt clear */ +#define DMA_CTCIF7 ((uint32_t)0x02000000) /* Channel 7 Transfer Complete clear */ +#define DMA_CHTIF7 ((uint32_t)0x04000000) /* Channel 7 Half Transfer clear */ +#define DMA_CTEIF7 ((uint32_t)0x08000000) /* Channel 7 Transfer Error clear */ + +/******************* Bit definition for DMA_CFGR1 register *******************/ +#define DMA_CFGR1_EN ((uint16_t)0x0001) /* Channel enable*/ +#define DMA_CFGR1_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFGR1_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFGR1_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFGR1_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFGR1_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFGR1_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFGR1_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFGR1_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFGR1_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFGR1_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFGR1_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFGR1_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFGR1_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFGR1_PL ((uint16_t)0x3000) /* PL[1:0] bits(Channel Priority level) */ +#define DMA_CFGR1_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFGR1_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFGR1_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ + +/******************* Bit definition for DMA_CFGR2 register *******************/ +#define DMA_CFGR2_EN ((uint16_t)0x0001) /* Channel enable */ +#define DMA_CFGR2_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFGR2_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFGR2_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFGR2_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFGR2_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFGR2_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFGR2_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFGR2_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFGR2_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFGR2_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFGR2_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFGR2_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFGR2_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFGR2_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ +#define DMA_CFGR2_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFGR2_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFGR2_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ + +/******************* Bit definition for DMA_CFGR3 register *******************/ +#define DMA_CFGR3_EN ((uint16_t)0x0001) /* Channel enable */ +#define DMA_CFGR3_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFGR3_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFGR3_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFGR3_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFGR3_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFGR3_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFGR3_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFGR3_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFGR3_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFGR3_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFGR3_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFGR3_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFGR3_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFGR3_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ +#define DMA_CFGR3_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFGR3_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFGR3_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ + +/******************* Bit definition for DMA_CFG4 register *******************/ +#define DMA_CFG4_EN ((uint16_t)0x0001) /* Channel enable */ +#define DMA_CFG4_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFG4_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFG4_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFG4_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFG4_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFG4_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFG4_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFG4_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFG4_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFG4_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFG4_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFG4_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFG4_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFG4_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ +#define DMA_CFG4_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFG4_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFG4_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ + +/****************** Bit definition for DMA_CFG5 register *******************/ +#define DMA_CFG5_EN ((uint16_t)0x0001) /* Channel enable */ +#define DMA_CFG5_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFG5_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFG5_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFG5_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFG5_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFG5_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFG5_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFG5_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFG5_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFG5_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFG5_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFG5_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFG5_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFG5_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ +#define DMA_CFG5_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFG5_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFG5_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode enable */ + +/******************* Bit definition for DMA_CFG6 register *******************/ +#define DMA_CFG6_EN ((uint16_t)0x0001) /* Channel enable */ +#define DMA_CFG6_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFG6_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFG6_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFG6_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFG6_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFG6_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFG6_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFG6_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFG6_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFG6_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFG6_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFG6_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFG6_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFG6_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ +#define DMA_CFG6_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFG6_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFG6_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ + +/******************* Bit definition for DMA_CFG7 register *******************/ +#define DMA_CFG7_EN ((uint16_t)0x0001) /* Channel enable */ +#define DMA_CFG7_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFG7_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFG7_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFG7_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFG7_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFG7_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFG7_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFG7_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFG7_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFG7_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFG7_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFG7_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFG7_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFG7_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ +#define DMA_CFG7_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFG7_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFG7_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode enable */ + +/****************** Bit definition for DMA_CNTR1 register ******************/ +#define DMA_CNTR1_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_CNTR2 register ******************/ +#define DMA_CNTR2_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_CNTR3 register ******************/ +#define DMA_CNTR3_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_CNTR4 register ******************/ +#define DMA_CNTR4_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_CNTR5 register ******************/ +#define DMA_CNTR5_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_CNTR6 register ******************/ +#define DMA_CNTR6_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_CNTR7 register ******************/ +#define DMA_CNTR7_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_PADDR1 register *******************/ +#define DMA_PADDR1_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_PADDR2 register *******************/ +#define DMA_PADDR2_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_PADDR3 register *******************/ +#define DMA_PADDR3_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_PADDR4 register *******************/ +#define DMA_PADDR4_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_PADDR5 register *******************/ +#define DMA_PADDR5_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_PADDR6 register *******************/ +#define DMA_PADDR6_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_PADDR7 register *******************/ +#define DMA_PADDR7_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_MADDR1 register *******************/ +#define DMA_MADDR1_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/****************** Bit definition for DMA_MADDR2 register *******************/ +#define DMA_MADDR2_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/****************** Bit definition for DMA_MADDR3 register *******************/ +#define DMA_MADDR3_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/****************** Bit definition for DMA_MADDR4 register *******************/ +#define DMA_MADDR4_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/****************** Bit definition for DMA_MADDR5 register *******************/ +#define DMA_MADDR5_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/****************** Bit definition for DMA_MADDR6 register *******************/ +#define DMA_MADDR6_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/****************** Bit definition for DMA_MADDR7 register *******************/ +#define DMA_MADDR7_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/******************************************************************************/ +/* External Interrupt/Event Controller */ +/******************************************************************************/ + +/******************* Bit definition for EXTI_INTENR register *******************/ +#define EXTI_INTENR_MR0 ((uint32_t)0x00000001) /* Interrupt Mask on line 0 */ +#define EXTI_INTENR_MR1 ((uint32_t)0x00000002) /* Interrupt Mask on line 1 */ +#define EXTI_INTENR_MR2 ((uint32_t)0x00000004) /* Interrupt Mask on line 2 */ +#define EXTI_INTENR_MR3 ((uint32_t)0x00000008) /* Interrupt Mask on line 3 */ +#define EXTI_INTENR_MR4 ((uint32_t)0x00000010) /* Interrupt Mask on line 4 */ +#define EXTI_INTENR_MR5 ((uint32_t)0x00000020) /* Interrupt Mask on line 5 */ +#define EXTI_INTENR_MR6 ((uint32_t)0x00000040) /* Interrupt Mask on line 6 */ +#define EXTI_INTENR_MR7 ((uint32_t)0x00000080) /* Interrupt Mask on line 7 */ +#define EXTI_INTENR_MR8 ((uint32_t)0x00000100) /* Interrupt Mask on line 8 */ +#define EXTI_INTENR_MR9 ((uint32_t)0x00000200) /* Interrupt Mask on line 9 */ +#define EXTI_INTENR_MR10 ((uint32_t)0x00000400) /* Interrupt Mask on line 10 */ +#define EXTI_INTENR_MR11 ((uint32_t)0x00000800) /* Interrupt Mask on line 11 */ +#define EXTI_INTENR_MR12 ((uint32_t)0x00001000) /* Interrupt Mask on line 12 */ +#define EXTI_INTENR_MR13 ((uint32_t)0x00002000) /* Interrupt Mask on line 13 */ +#define EXTI_INTENR_MR14 ((uint32_t)0x00004000) /* Interrupt Mask on line 14 */ +#define EXTI_INTENR_MR15 ((uint32_t)0x00008000) /* Interrupt Mask on line 15 */ +#define EXTI_INTENR_MR16 ((uint32_t)0x00010000) /* Interrupt Mask on line 16 */ +#define EXTI_INTENR_MR17 ((uint32_t)0x00020000) /* Interrupt Mask on line 17 */ +#define EXTI_INTENR_MR18 ((uint32_t)0x00040000) /* Interrupt Mask on line 18 */ +#define EXTI_INTENR_MR19 ((uint32_t)0x00080000) /* Interrupt Mask on line 19 */ + +/******************* Bit definition for EXTI_EVENR register *******************/ +#define EXTI_EVENR_MR0 ((uint32_t)0x00000001) /* Event Mask on line 0 */ +#define EXTI_EVENR_MR1 ((uint32_t)0x00000002) /* Event Mask on line 1 */ +#define EXTI_EVENR_MR2 ((uint32_t)0x00000004) /* Event Mask on line 2 */ +#define EXTI_EVENR_MR3 ((uint32_t)0x00000008) /* Event Mask on line 3 */ +#define EXTI_EVENR_MR4 ((uint32_t)0x00000010) /* Event Mask on line 4 */ +#define EXTI_EVENR_MR5 ((uint32_t)0x00000020) /* Event Mask on line 5 */ +#define EXTI_EVENR_MR6 ((uint32_t)0x00000040) /* Event Mask on line 6 */ +#define EXTI_EVENR_MR7 ((uint32_t)0x00000080) /* Event Mask on line 7 */ +#define EXTI_EVENR_MR8 ((uint32_t)0x00000100) /* Event Mask on line 8 */ +#define EXTI_EVENR_MR9 ((uint32_t)0x00000200) /* Event Mask on line 9 */ +#define EXTI_EVENR_MR10 ((uint32_t)0x00000400) /* Event Mask on line 10 */ +#define EXTI_EVENR_MR11 ((uint32_t)0x00000800) /* Event Mask on line 11 */ +#define EXTI_EVENR_MR12 ((uint32_t)0x00001000) /* Event Mask on line 12 */ +#define EXTI_EVENR_MR13 ((uint32_t)0x00002000) /* Event Mask on line 13 */ +#define EXTI_EVENR_MR14 ((uint32_t)0x00004000) /* Event Mask on line 14 */ +#define EXTI_EVENR_MR15 ((uint32_t)0x00008000) /* Event Mask on line 15 */ +#define EXTI_EVENR_MR16 ((uint32_t)0x00010000) /* Event Mask on line 16 */ +#define EXTI_EVENR_MR17 ((uint32_t)0x00020000) /* Event Mask on line 17 */ +#define EXTI_EVENR_MR18 ((uint32_t)0x00040000) /* Event Mask on line 18 */ +#define EXTI_EVENR_MR19 ((uint32_t)0x00080000) /* Event Mask on line 19 */ + +/****************** Bit definition for EXTI_RTENR register *******************/ +#define EXTI_RTENR_TR0 ((uint32_t)0x00000001) /* Rising trigger event configuration bit of line 0 */ +#define EXTI_RTENR_TR1 ((uint32_t)0x00000002) /* Rising trigger event configuration bit of line 1 */ +#define EXTI_RTENR_TR2 ((uint32_t)0x00000004) /* Rising trigger event configuration bit of line 2 */ +#define EXTI_RTENR_TR3 ((uint32_t)0x00000008) /* Rising trigger event configuration bit of line 3 */ +#define EXTI_RTENR_TR4 ((uint32_t)0x00000010) /* Rising trigger event configuration bit of line 4 */ +#define EXTI_RTENR_TR5 ((uint32_t)0x00000020) /* Rising trigger event configuration bit of line 5 */ +#define EXTI_RTENR_TR6 ((uint32_t)0x00000040) /* Rising trigger event configuration bit of line 6 */ +#define EXTI_RTENR_TR7 ((uint32_t)0x00000080) /* Rising trigger event configuration bit of line 7 */ +#define EXTI_RTENR_TR8 ((uint32_t)0x00000100) /* Rising trigger event configuration bit of line 8 */ +#define EXTI_RTENR_TR9 ((uint32_t)0x00000200) /* Rising trigger event configuration bit of line 9 */ +#define EXTI_RTENR_TR10 ((uint32_t)0x00000400) /* Rising trigger event configuration bit of line 10 */ +#define EXTI_RTENR_TR11 ((uint32_t)0x00000800) /* Rising trigger event configuration bit of line 11 */ +#define EXTI_RTENR_TR12 ((uint32_t)0x00001000) /* Rising trigger event configuration bit of line 12 */ +#define EXTI_RTENR_TR13 ((uint32_t)0x00002000) /* Rising trigger event configuration bit of line 13 */ +#define EXTI_RTENR_TR14 ((uint32_t)0x00004000) /* Rising trigger event configuration bit of line 14 */ +#define EXTI_RTENR_TR15 ((uint32_t)0x00008000) /* Rising trigger event configuration bit of line 15 */ +#define EXTI_RTENR_TR16 ((uint32_t)0x00010000) /* Rising trigger event configuration bit of line 16 */ +#define EXTI_RTENR_TR17 ((uint32_t)0x00020000) /* Rising trigger event configuration bit of line 17 */ +#define EXTI_RTENR_TR18 ((uint32_t)0x00040000) /* Rising trigger event configuration bit of line 18 */ +#define EXTI_RTENR_TR19 ((uint32_t)0x00080000) /* Rising trigger event configuration bit of line 19 */ + +/****************** Bit definition for EXTI_FTENR register *******************/ +#define EXTI_FTENR_TR0 ((uint32_t)0x00000001) /* Falling trigger event configuration bit of line 0 */ +#define EXTI_FTENR_TR1 ((uint32_t)0x00000002) /* Falling trigger event configuration bit of line 1 */ +#define EXTI_FTENR_TR2 ((uint32_t)0x00000004) /* Falling trigger event configuration bit of line 2 */ +#define EXTI_FTENR_TR3 ((uint32_t)0x00000008) /* Falling trigger event configuration bit of line 3 */ +#define EXTI_FTENR_TR4 ((uint32_t)0x00000010) /* Falling trigger event configuration bit of line 4 */ +#define EXTI_FTENR_TR5 ((uint32_t)0x00000020) /* Falling trigger event configuration bit of line 5 */ +#define EXTI_FTENR_TR6 ((uint32_t)0x00000040) /* Falling trigger event configuration bit of line 6 */ +#define EXTI_FTENR_TR7 ((uint32_t)0x00000080) /* Falling trigger event configuration bit of line 7 */ +#define EXTI_FTENR_TR8 ((uint32_t)0x00000100) /* Falling trigger event configuration bit of line 8 */ +#define EXTI_FTENR_TR9 ((uint32_t)0x00000200) /* Falling trigger event configuration bit of line 9 */ +#define EXTI_FTENR_TR10 ((uint32_t)0x00000400) /* Falling trigger event configuration bit of line 10 */ +#define EXTI_FTENR_TR11 ((uint32_t)0x00000800) /* Falling trigger event configuration bit of line 11 */ +#define EXTI_FTENR_TR12 ((uint32_t)0x00001000) /* Falling trigger event configuration bit of line 12 */ +#define EXTI_FTENR_TR13 ((uint32_t)0x00002000) /* Falling trigger event configuration bit of line 13 */ +#define EXTI_FTENR_TR14 ((uint32_t)0x00004000) /* Falling trigger event configuration bit of line 14 */ +#define EXTI_FTENR_TR15 ((uint32_t)0x00008000) /* Falling trigger event configuration bit of line 15 */ +#define EXTI_FTENR_TR16 ((uint32_t)0x00010000) /* Falling trigger event configuration bit of line 16 */ +#define EXTI_FTENR_TR17 ((uint32_t)0x00020000) /* Falling trigger event configuration bit of line 17 */ +#define EXTI_FTENR_TR18 ((uint32_t)0x00040000) /* Falling trigger event configuration bit of line 18 */ +#define EXTI_FTENR_TR19 ((uint32_t)0x00080000) /* Falling trigger event configuration bit of line 19 */ + +/****************** Bit definition for EXTI_SWIEVR register ******************/ +#define EXTI_SWIEVR_SWIEVR0 ((uint32_t)0x00000001) /* Software Interrupt on line 0 */ +#define EXTI_SWIEVR_SWIEVR1 ((uint32_t)0x00000002) /* Software Interrupt on line 1 */ +#define EXTI_SWIEVR_SWIEVR2 ((uint32_t)0x00000004) /* Software Interrupt on line 2 */ +#define EXTI_SWIEVR_SWIEVR3 ((uint32_t)0x00000008) /* Software Interrupt on line 3 */ +#define EXTI_SWIEVR_SWIEVR4 ((uint32_t)0x00000010) /* Software Interrupt on line 4 */ +#define EXTI_SWIEVR_SWIEVR5 ((uint32_t)0x00000020) /* Software Interrupt on line 5 */ +#define EXTI_SWIEVR_SWIEVR6 ((uint32_t)0x00000040) /* Software Interrupt on line 6 */ +#define EXTI_SWIEVR_SWIEVR7 ((uint32_t)0x00000080) /* Software Interrupt on line 7 */ +#define EXTI_SWIEVR_SWIEVR8 ((uint32_t)0x00000100) /* Software Interrupt on line 8 */ +#define EXTI_SWIEVR_SWIEVR9 ((uint32_t)0x00000200) /* Software Interrupt on line 9 */ +#define EXTI_SWIEVR_SWIEVR10 ((uint32_t)0x00000400) /* Software Interrupt on line 10 */ +#define EXTI_SWIEVR_SWIEVR11 ((uint32_t)0x00000800) /* Software Interrupt on line 11 */ +#define EXTI_SWIEVR_SWIEVR12 ((uint32_t)0x00001000) /* Software Interrupt on line 12 */ +#define EXTI_SWIEVR_SWIEVR13 ((uint32_t)0x00002000) /* Software Interrupt on line 13 */ +#define EXTI_SWIEVR_SWIEVR14 ((uint32_t)0x00004000) /* Software Interrupt on line 14 */ +#define EXTI_SWIEVR_SWIEVR15 ((uint32_t)0x00008000) /* Software Interrupt on line 15 */ +#define EXTI_SWIEVR_SWIEVR16 ((uint32_t)0x00010000) /* Software Interrupt on line 16 */ +#define EXTI_SWIEVR_SWIEVR17 ((uint32_t)0x00020000) /* Software Interrupt on line 17 */ +#define EXTI_SWIEVR_SWIEVR18 ((uint32_t)0x00040000) /* Software Interrupt on line 18 */ +#define EXTI_SWIEVR_SWIEVR19 ((uint32_t)0x00080000) /* Software Interrupt on line 19 */ + +/******************* Bit definition for EXTI_INTFR register ********************/ +#define EXTI_INTF_INTF0 ((uint32_t)0x00000001) /* Pending bit for line 0 */ +#define EXTI_INTF_INTF1 ((uint32_t)0x00000002) /* Pending bit for line 1 */ +#define EXTI_INTF_INTF2 ((uint32_t)0x00000004) /* Pending bit for line 2 */ +#define EXTI_INTF_INTF3 ((uint32_t)0x00000008) /* Pending bit for line 3 */ +#define EXTI_INTF_INTF4 ((uint32_t)0x00000010) /* Pending bit for line 4 */ +#define EXTI_INTF_INTF5 ((uint32_t)0x00000020) /* Pending bit for line 5 */ +#define EXTI_INTF_INTF6 ((uint32_t)0x00000040) /* Pending bit for line 6 */ +#define EXTI_INTF_INTF7 ((uint32_t)0x00000080) /* Pending bit for line 7 */ +#define EXTI_INTF_INTF8 ((uint32_t)0x00000100) /* Pending bit for line 8 */ +#define EXTI_INTF_INTF9 ((uint32_t)0x00000200) /* Pending bit for line 9 */ +#define EXTI_INTF_INTF10 ((uint32_t)0x00000400) /* Pending bit for line 10 */ +#define EXTI_INTF_INTF11 ((uint32_t)0x00000800) /* Pending bit for line 11 */ +#define EXTI_INTF_INTF12 ((uint32_t)0x00001000) /* Pending bit for line 12 */ +#define EXTI_INTF_INTF13 ((uint32_t)0x00002000) /* Pending bit for line 13 */ +#define EXTI_INTF_INTF14 ((uint32_t)0x00004000) /* Pending bit for line 14 */ +#define EXTI_INTF_INTF15 ((uint32_t)0x00008000) /* Pending bit for line 15 */ +#define EXTI_INTF_INTF16 ((uint32_t)0x00010000) /* Pending bit for line 16 */ +#define EXTI_INTF_INTF17 ((uint32_t)0x00020000) /* Pending bit for line 17 */ +#define EXTI_INTF_INTF18 ((uint32_t)0x00040000) /* Pending bit for line 18 */ +#define EXTI_INTF_INTF19 ((uint32_t)0x00080000) /* Pending bit for line 19 */ + +/******************************************************************************/ +/* FLASH and Option Bytes Registers */ +/******************************************************************************/ + +/******************* Bit definition for FLASH_ACTLR register ******************/ + +/****************** Bit definition for FLASH_KEYR register ******************/ +#define FLASH_KEYR_FKEYR ((uint32_t)0xFFFFFFFF) /* FPEC Key */ + +/***************** Bit definition for FLASH_OBKEYR register ****************/ +#define FLASH_OBKEYR_OBKEYR ((uint32_t)0xFFFFFFFF) /* Option Byte Key */ + +/****************** Bit definition for FLASH_STATR register *******************/ +#define FLASH_STATR_BSY ((uint8_t)0x01) /* Busy */ +#define FLASH_STATR_PGERR ((uint8_t)0x04) /* Programming Error */ +#define FLASH_STATR_WRPRTERR ((uint8_t)0x10) /* Write Protection Error */ +#define FLASH_STATR_EOP ((uint8_t)0x20) /* End of operation */ + +/******************* Bit definition for FLASH_CTLR register *******************/ +#define FLASH_CTLR_PG ((uint32_t)0x00000001) /* Programming */ +#define FLASH_CTLR_PER ((uint32_t)0x00000002) /* Sector Erase 4K */ +#define FLASH_CTLR_MER ((uint32_t)0x00000004) /* Mass Erase */ +#define FLASH_CTLR_OPTPG ((uint32_t)0x00000010) /* Option Byte Programming */ +#define FLASH_CTLR_OPTER ((uint32_t)0x00000020) /* Option Byte Erase */ +#define FLASH_CTLR_STRT ((uint32_t)0x00000040) /* Start */ +#define FLASH_CTLR_LOCK ((uint32_t)0x00000080) /* Lock */ +#define FLASH_CTLR_OPTWRE ((uint32_t)0x00000200) /* Option Bytes Write Enable */ +#define FLASH_CTLR_ERRIE ((uint32_t)0x00000400) /* Error Interrupt Enable */ +#define FLASH_CTLR_EOPIE ((uint32_t)0x00001000) /* End of operation interrupt enable */ +#define FLASH_CTLR_FAST_LOCK ((uint32_t)0x00008000) /* Fast Lock */ +#define FLASH_CTLR_PAGE_PG ((uint32_t)0x00010000) /* Page Programming 256Byte */ +#define FLASH_CTLR_PAGE_ER ((uint32_t)0x00020000) /* Page Erase 256Byte */ +#define FLASH_CTLR_PAGE_BER32 ((uint32_t)0x00040000) /* Block Erase 32K */ +#define FLASH_CTLR_PAGE_BER64 ((uint32_t)0x00080000) /* Block Erase 64K */ +#define FLASH_CTLR_PG_STRT ((uint32_t)0x00200000) /* Page Programming Start */ + +/******************* Bit definition for FLASH_ADDR register *******************/ +#define FLASH_ADDR_FAR ((uint32_t)0xFFFFFFFF) /* Flash Address */ + +/****************** Bit definition for FLASH_OBR register *******************/ +#define FLASH_OBR_OPTERR ((uint16_t)0x0001) /* Option Byte Error */ +#define FLASH_OBR_RDPRT ((uint16_t)0x0002) /* Read protection */ + +#define FLASH_OBR_USER ((uint16_t)0x03FC) /* User Option Bytes */ +#define FLASH_OBR_WDG_SW ((uint16_t)0x0004) /* WDG_SW */ +#define FLASH_OBR_nRST_STOP ((uint16_t)0x0008) /* nRST_STOP */ +#define FLASH_OBR_nRST_STDBY ((uint16_t)0x0010) /* nRST_STDBY */ +#define FLASH_OBR_BFB2 ((uint16_t)0x0020) /* BFB2 */ + +/****************** Bit definition for FLASH_WPR register ******************/ +#define FLASH_WPR_WRP ((uint32_t)0xFFFFFFFF) /* Write Protect */ + +/****************** Bit definition for FLASH_RDPR register *******************/ +#define FLASH_RDPR_RDPR ((uint32_t)0x000000FF) /* Read protection option byte */ +#define FLASH_RDPR_nRDPR ((uint32_t)0x0000FF00) /* Read protection complemented option byte */ + +/****************** Bit definition for FLASH_USER register ******************/ +#define FLASH_USER_USER ((uint32_t)0x00FF0000) /* User option byte */ +#define FLASH_USER_nUSER ((uint32_t)0xFF000000) /* User complemented option byte */ + +/****************** Bit definition for FLASH_Data0 register *****************/ +#define FLASH_Data0_Data0 ((uint32_t)0x000000FF) /* User data storage option byte */ +#define FLASH_Data0_nData0 ((uint32_t)0x0000FF00) /* User data storage complemented option byte */ + +/****************** Bit definition for FLASH_Data1 register *****************/ +#define FLASH_Data1_Data1 ((uint32_t)0x00FF0000) /* User data storage option byte */ +#define FLASH_Data1_nData1 ((uint32_t)0xFF000000) /* User data storage complemented option byte */ + +/****************** Bit definition for FLASH_WRPR0 register ******************/ +#define FLASH_WRPR0_WRPR0 ((uint32_t)0x000000FF) /* Flash memory write protection option bytes */ +#define FLASH_WRPR0_nWRPR0 ((uint32_t)0x0000FF00) /* Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRPR1 register ******************/ +#define FLASH_WRPR1_WRPR1 ((uint32_t)0x00FF0000) /* Flash memory write protection option bytes */ +#define FLASH_WRPR1_nWRPR1 ((uint32_t)0xFF000000) /* Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRPR2 register ******************/ +#define FLASH_WRPR2_WRPR2 ((uint32_t)0x000000FF) /* Flash memory write protection option bytes */ +#define FLASH_WRPR2_nWRPR2 ((uint32_t)0x0000FF00) /* Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRPR3 register ******************/ +#define FLASH_WRPR3_WRPR3 ((uint32_t)0x00FF0000) /* Flash memory write protection option bytes */ +#define FLASH_WRPR3_nWRPR3 ((uint32_t)0xFF000000) /* Flash memory write protection complemented option bytes */ + +/******************************************************************************/ +/* General Purpose and Alternate Function I/O */ +/******************************************************************************/ + +/******************* Bit definition for GPIO_CFGLR register *******************/ +#define GPIO_CFGLR_MODE ((uint32_t)0x33333333) /* Port x mode bits */ + +#define GPIO_CFGLR_MODE0 ((uint32_t)0x00000003) /* MODE0[1:0] bits (Port x mode bits, pin 0) */ +#define GPIO_CFGLR_MODE0_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define GPIO_CFGLR_MODE0_1 ((uint32_t)0x00000002) /* Bit 1 */ + +#define GPIO_CFGLR_MODE1 ((uint32_t)0x00000030) /* MODE1[1:0] bits (Port x mode bits, pin 1) */ +#define GPIO_CFGLR_MODE1_0 ((uint32_t)0x00000010) /* Bit 0 */ +#define GPIO_CFGLR_MODE1_1 ((uint32_t)0x00000020) /* Bit 1 */ + +#define GPIO_CFGLR_MODE2 ((uint32_t)0x00000300) /* MODE2[1:0] bits (Port x mode bits, pin 2) */ +#define GPIO_CFGLR_MODE2_0 ((uint32_t)0x00000100) /* Bit 0 */ +#define GPIO_CFGLR_MODE2_1 ((uint32_t)0x00000200) /* Bit 1 */ + +#define GPIO_CFGLR_MODE3 ((uint32_t)0x00003000) /* MODE3[1:0] bits (Port x mode bits, pin 3) */ +#define GPIO_CFGLR_MODE3_0 ((uint32_t)0x00001000) /* Bit 0 */ +#define GPIO_CFGLR_MODE3_1 ((uint32_t)0x00002000) /* Bit 1 */ + +#define GPIO_CFGLR_MODE4 ((uint32_t)0x00030000) /* MODE4[1:0] bits (Port x mode bits, pin 4) */ +#define GPIO_CFGLR_MODE4_0 ((uint32_t)0x00010000) /* Bit 0 */ +#define GPIO_CFGLR_MODE4_1 ((uint32_t)0x00020000) /* Bit 1 */ + +#define GPIO_CFGLR_MODE5 ((uint32_t)0x00300000) /* MODE5[1:0] bits (Port x mode bits, pin 5) */ +#define GPIO_CFGLR_MODE5_0 ((uint32_t)0x00100000) /* Bit 0 */ +#define GPIO_CFGLR_MODE5_1 ((uint32_t)0x00200000) /* Bit 1 */ + +#define GPIO_CFGLR_MODE6 ((uint32_t)0x03000000) /* MODE6[1:0] bits (Port x mode bits, pin 6) */ +#define GPIO_CFGLR_MODE6_0 ((uint32_t)0x01000000) /* Bit 0 */ +#define GPIO_CFGLR_MODE6_1 ((uint32_t)0x02000000) /* Bit 1 */ + +#define GPIO_CFGLR_MODE7 ((uint32_t)0x30000000) /* MODE7[1:0] bits (Port x mode bits, pin 7) */ +#define GPIO_CFGLR_MODE7_0 ((uint32_t)0x10000000) /* Bit 0 */ +#define GPIO_CFGLR_MODE7_1 ((uint32_t)0x20000000) /* Bit 1 */ + +#define GPIO_CFGLR_CNF ((uint32_t)0xCCCCCCCC) /* Port x configuration bits */ + +#define GPIO_CFGLR_CNF0 ((uint32_t)0x0000000C) /* CNF0[1:0] bits (Port x configuration bits, pin 0) */ +#define GPIO_CFGLR_CNF0_0 ((uint32_t)0x00000004) /* Bit 0 */ +#define GPIO_CFGLR_CNF0_1 ((uint32_t)0x00000008) /* Bit 1 */ + +#define GPIO_CFGLR_CNF1 ((uint32_t)0x000000C0) /* CNF1[1:0] bits (Port x configuration bits, pin 1) */ +#define GPIO_CFGLR_CNF1_0 ((uint32_t)0x00000040) /* Bit 0 */ +#define GPIO_CFGLR_CNF1_1 ((uint32_t)0x00000080) /* Bit 1 */ + +#define GPIO_CFGLR_CNF2 ((uint32_t)0x00000C00) /* CNF2[1:0] bits (Port x configuration bits, pin 2) */ +#define GPIO_CFGLR_CNF2_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define GPIO_CFGLR_CNF2_1 ((uint32_t)0x00000800) /* Bit 1 */ + +#define GPIO_CFGLR_CNF3 ((uint32_t)0x0000C000) /* CNF3[1:0] bits (Port x configuration bits, pin 3) */ +#define GPIO_CFGLR_CNF3_0 ((uint32_t)0x00004000) /* Bit 0 */ +#define GPIO_CFGLR_CNF3_1 ((uint32_t)0x00008000) /* Bit 1 */ + +#define GPIO_CFGLR_CNF4 ((uint32_t)0x000C0000) /* CNF4[1:0] bits (Port x configuration bits, pin 4) */ +#define GPIO_CFGLR_CNF4_0 ((uint32_t)0x00040000) /* Bit 0 */ +#define GPIO_CFGLR_CNF4_1 ((uint32_t)0x00080000) /* Bit 1 */ + +#define GPIO_CFGLR_CNF5 ((uint32_t)0x00C00000) /* CNF5[1:0] bits (Port x configuration bits, pin 5) */ +#define GPIO_CFGLR_CNF5_0 ((uint32_t)0x00400000) /* Bit 0 */ +#define GPIO_CFGLR_CNF5_1 ((uint32_t)0x00800000) /* Bit 1 */ + +#define GPIO_CFGLR_CNF6 ((uint32_t)0x0C000000) /* CNF6[1:0] bits (Port x configuration bits, pin 6) */ +#define GPIO_CFGLR_CNF6_0 ((uint32_t)0x04000000) /* Bit 0 */ +#define GPIO_CFGLR_CNF6_1 ((uint32_t)0x08000000) /* Bit 1 */ + +#define GPIO_CFGLR_CNF7 ((uint32_t)0xC0000000) /* CNF7[1:0] bits (Port x configuration bits, pin 7) */ +#define GPIO_CFGLR_CNF7_0 ((uint32_t)0x40000000) /* Bit 0 */ +#define GPIO_CFGLR_CNF7_1 ((uint32_t)0x80000000) /* Bit 1 */ + +/******************* Bit definition for GPIO_CFGHR register *******************/ +#define GPIO_CFGHR_MODE ((uint32_t)0x33333333) /* Port x mode bits */ + +#define GPIO_CFGHR_MODE8 ((uint32_t)0x00000003) /* MODE8[1:0] bits (Port x mode bits, pin 8) */ +#define GPIO_CFGHR_MODE8_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define GPIO_CFGHR_MODE8_1 ((uint32_t)0x00000002) /* Bit 1 */ + +#define GPIO_CFGHR_MODE9 ((uint32_t)0x00000030) /* MODE9[1:0] bits (Port x mode bits, pin 9) */ +#define GPIO_CFGHR_MODE9_0 ((uint32_t)0x00000010) /* Bit 0 */ +#define GPIO_CFGHR_MODE9_1 ((uint32_t)0x00000020) /* Bit 1 */ + +#define GPIO_CFGHR_MODE10 ((uint32_t)0x00000300) /* MODE10[1:0] bits (Port x mode bits, pin 10) */ +#define GPIO_CFGHR_MODE10_0 ((uint32_t)0x00000100) /* Bit 0 */ +#define GPIO_CFGHR_MODE10_1 ((uint32_t)0x00000200) /* Bit 1 */ + +#define GPIO_CFGHR_MODE11 ((uint32_t)0x00003000) /* MODE11[1:0] bits (Port x mode bits, pin 11) */ +#define GPIO_CFGHR_MODE11_0 ((uint32_t)0x00001000) /* Bit 0 */ +#define GPIO_CFGHR_MODE11_1 ((uint32_t)0x00002000) /* Bit 1 */ + +#define GPIO_CFGHR_MODE12 ((uint32_t)0x00030000) /* MODE12[1:0] bits (Port x mode bits, pin 12) */ +#define GPIO_CFGHR_MODE12_0 ((uint32_t)0x00010000) /* Bit 0 */ +#define GPIO_CFGHR_MODE12_1 ((uint32_t)0x00020000) /* Bit 1 */ + +#define GPIO_CFGHR_MODE13 ((uint32_t)0x00300000) /* MODE13[1:0] bits (Port x mode bits, pin 13) */ +#define GPIO_CFGHR_MODE13_0 ((uint32_t)0x00100000) /* Bit 0 */ +#define GPIO_CFGHR_MODE13_1 ((uint32_t)0x00200000) /* Bit 1 */ + +#define GPIO_CFGHR_MODE14 ((uint32_t)0x03000000) /* MODE14[1:0] bits (Port x mode bits, pin 14) */ +#define GPIO_CFGHR_MODE14_0 ((uint32_t)0x01000000) /* Bit 0 */ +#define GPIO_CFGHR_MODE14_1 ((uint32_t)0x02000000) /* Bit 1 */ + +#define GPIO_CFGHR_MODE15 ((uint32_t)0x30000000) /* MODE15[1:0] bits (Port x mode bits, pin 15) */ +#define GPIO_CFGHR_MODE15_0 ((uint32_t)0x10000000) /* Bit 0 */ +#define GPIO_CFGHR_MODE15_1 ((uint32_t)0x20000000) /* Bit 1 */ + +#define GPIO_CFGHR_CNF ((uint32_t)0xCCCCCCCC) /* Port x configuration bits */ + +#define GPIO_CFGHR_CNF8 ((uint32_t)0x0000000C) /* CNF8[1:0] bits (Port x configuration bits, pin 8) */ +#define GPIO_CFGHR_CNF8_0 ((uint32_t)0x00000004) /* Bit 0 */ +#define GPIO_CFGHR_CNF8_1 ((uint32_t)0x00000008) /* Bit 1 */ + +#define GPIO_CFGHR_CNF9 ((uint32_t)0x000000C0) /* CNF9[1:0] bits (Port x configuration bits, pin 9) */ +#define GPIO_CFGHR_CNF9_0 ((uint32_t)0x00000040) /* Bit 0 */ +#define GPIO_CFGHR_CNF9_1 ((uint32_t)0x00000080) /* Bit 1 */ + +#define GPIO_CFGHR_CNF10 ((uint32_t)0x00000C00) /* CNF10[1:0] bits (Port x configuration bits, pin 10) */ +#define GPIO_CFGHR_CNF10_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define GPIO_CFGHR_CNF10_1 ((uint32_t)0x00000800) /* Bit 1 */ + +#define GPIO_CFGHR_CNF11 ((uint32_t)0x0000C000) /* CNF11[1:0] bits (Port x configuration bits, pin 11) */ +#define GPIO_CFGHR_CNF11_0 ((uint32_t)0x00004000) /* Bit 0 */ +#define GPIO_CFGHR_CNF11_1 ((uint32_t)0x00008000) /* Bit 1 */ + +#define GPIO_CFGHR_CNF12 ((uint32_t)0x000C0000) /* CNF12[1:0] bits (Port x configuration bits, pin 12) */ +#define GPIO_CFGHR_CNF12_0 ((uint32_t)0x00040000) /* Bit 0 */ +#define GPIO_CFGHR_CNF12_1 ((uint32_t)0x00080000) /* Bit 1 */ + +#define GPIO_CFGHR_CNF13 ((uint32_t)0x00C00000) /* CNF13[1:0] bits (Port x configuration bits, pin 13) */ +#define GPIO_CFGHR_CNF13_0 ((uint32_t)0x00400000) /* Bit 0 */ +#define GPIO_CFGHR_CNF13_1 ((uint32_t)0x00800000) /* Bit 1 */ + +#define GPIO_CFGHR_CNF14 ((uint32_t)0x0C000000) /* CNF14[1:0] bits (Port x configuration bits, pin 14) */ +#define GPIO_CFGHR_CNF14_0 ((uint32_t)0x04000000) /* Bit 0 */ +#define GPIO_CFGHR_CNF14_1 ((uint32_t)0x08000000) /* Bit 1 */ + +#define GPIO_CFGHR_CNF15 ((uint32_t)0xC0000000) /* CNF15[1:0] bits (Port x configuration bits, pin 15) */ +#define GPIO_CFGHR_CNF15_0 ((uint32_t)0x40000000) /* Bit 0 */ +#define GPIO_CFGHR_CNF15_1 ((uint32_t)0x80000000) /* Bit 1 */ + +/******************* Bit definition for GPIO_INDR register *******************/ +#define GPIO_INDR_IDR0 ((uint16_t)0x0001) /* Port input data, bit 0 */ +#define GPIO_INDR_IDR1 ((uint16_t)0x0002) /* Port input data, bit 1 */ +#define GPIO_INDR_IDR2 ((uint16_t)0x0004) /* Port input data, bit 2 */ +#define GPIO_INDR_IDR3 ((uint16_t)0x0008) /* Port input data, bit 3 */ +#define GPIO_INDR_IDR4 ((uint16_t)0x0010) /* Port input data, bit 4 */ +#define GPIO_INDR_IDR5 ((uint16_t)0x0020) /* Port input data, bit 5 */ +#define GPIO_INDR_IDR6 ((uint16_t)0x0040) /* Port input data, bit 6 */ +#define GPIO_INDR_IDR7 ((uint16_t)0x0080) /* Port input data, bit 7 */ +#define GPIO_INDR_IDR8 ((uint16_t)0x0100) /* Port input data, bit 8 */ +#define GPIO_INDR_IDR9 ((uint16_t)0x0200) /* Port input data, bit 9 */ +#define GPIO_INDR_IDR10 ((uint16_t)0x0400) /* Port input data, bit 10 */ +#define GPIO_INDR_IDR11 ((uint16_t)0x0800) /* Port input data, bit 11 */ +#define GPIO_INDR_IDR12 ((uint16_t)0x1000) /* Port input data, bit 12 */ +#define GPIO_INDR_IDR13 ((uint16_t)0x2000) /* Port input data, bit 13 */ +#define GPIO_INDR_IDR14 ((uint16_t)0x4000) /* Port input data, bit 14 */ +#define GPIO_INDR_IDR15 ((uint16_t)0x8000) /* Port input data, bit 15 */ + +/******************* Bit definition for GPIO_OUTDR register *******************/ +#define GPIO_OUTDR_ODR0 ((uint16_t)0x0001) /* Port output data, bit 0 */ +#define GPIO_OUTDR_ODR1 ((uint16_t)0x0002) /* Port output data, bit 1 */ +#define GPIO_OUTDR_ODR2 ((uint16_t)0x0004) /* Port output data, bit 2 */ +#define GPIO_OUTDR_ODR3 ((uint16_t)0x0008) /* Port output data, bit 3 */ +#define GPIO_OUTDR_ODR4 ((uint16_t)0x0010) /* Port output data, bit 4 */ +#define GPIO_OUTDR_ODR5 ((uint16_t)0x0020) /* Port output data, bit 5 */ +#define GPIO_OUTDR_ODR6 ((uint16_t)0x0040) /* Port output data, bit 6 */ +#define GPIO_OUTDR_ODR7 ((uint16_t)0x0080) /* Port output data, bit 7 */ +#define GPIO_OUTDR_ODR8 ((uint16_t)0x0100) /* Port output data, bit 8 */ +#define GPIO_OUTDR_ODR9 ((uint16_t)0x0200) /* Port output data, bit 9 */ +#define GPIO_OUTDR_ODR10 ((uint16_t)0x0400) /* Port output data, bit 10 */ +#define GPIO_OUTDR_ODR11 ((uint16_t)0x0800) /* Port output data, bit 11 */ +#define GPIO_OUTDR_ODR12 ((uint16_t)0x1000) /* Port output data, bit 12 */ +#define GPIO_OUTDR_ODR13 ((uint16_t)0x2000) /* Port output data, bit 13 */ +#define GPIO_OUTDR_ODR14 ((uint16_t)0x4000) /* Port output data, bit 14 */ +#define GPIO_OUTDR_ODR15 ((uint16_t)0x8000) /* Port output data, bit 15 */ + +/****************** Bit definition for GPIO_BSHR register *******************/ +#define GPIO_BSHR_BS0 ((uint32_t)0x00000001) /* Port x Set bit 0 */ +#define GPIO_BSHR_BS1 ((uint32_t)0x00000002) /* Port x Set bit 1 */ +#define GPIO_BSHR_BS2 ((uint32_t)0x00000004) /* Port x Set bit 2 */ +#define GPIO_BSHR_BS3 ((uint32_t)0x00000008) /* Port x Set bit 3 */ +#define GPIO_BSHR_BS4 ((uint32_t)0x00000010) /* Port x Set bit 4 */ +#define GPIO_BSHR_BS5 ((uint32_t)0x00000020) /* Port x Set bit 5 */ +#define GPIO_BSHR_BS6 ((uint32_t)0x00000040) /* Port x Set bit 6 */ +#define GPIO_BSHR_BS7 ((uint32_t)0x00000080) /* Port x Set bit 7 */ +#define GPIO_BSHR_BS8 ((uint32_t)0x00000100) /* Port x Set bit 8 */ +#define GPIO_BSHR_BS9 ((uint32_t)0x00000200) /* Port x Set bit 9 */ +#define GPIO_BSHR_BS10 ((uint32_t)0x00000400) /* Port x Set bit 10 */ +#define GPIO_BSHR_BS11 ((uint32_t)0x00000800) /* Port x Set bit 11 */ +#define GPIO_BSHR_BS12 ((uint32_t)0x00001000) /* Port x Set bit 12 */ +#define GPIO_BSHR_BS13 ((uint32_t)0x00002000) /* Port x Set bit 13 */ +#define GPIO_BSHR_BS14 ((uint32_t)0x00004000) /* Port x Set bit 14 */ +#define GPIO_BSHR_BS15 ((uint32_t)0x00008000) /* Port x Set bit 15 */ + +#define GPIO_BSHR_BR0 ((uint32_t)0x00010000) /* Port x Reset bit 0 */ +#define GPIO_BSHR_BR1 ((uint32_t)0x00020000) /* Port x Reset bit 1 */ +#define GPIO_BSHR_BR2 ((uint32_t)0x00040000) /* Port x Reset bit 2 */ +#define GPIO_BSHR_BR3 ((uint32_t)0x00080000) /* Port x Reset bit 3 */ +#define GPIO_BSHR_BR4 ((uint32_t)0x00100000) /* Port x Reset bit 4 */ +#define GPIO_BSHR_BR5 ((uint32_t)0x00200000) /* Port x Reset bit 5 */ +#define GPIO_BSHR_BR6 ((uint32_t)0x00400000) /* Port x Reset bit 6 */ +#define GPIO_BSHR_BR7 ((uint32_t)0x00800000) /* Port x Reset bit 7 */ +#define GPIO_BSHR_BR8 ((uint32_t)0x01000000) /* Port x Reset bit 8 */ +#define GPIO_BSHR_BR9 ((uint32_t)0x02000000) /* Port x Reset bit 9 */ +#define GPIO_BSHR_BR10 ((uint32_t)0x04000000) /* Port x Reset bit 10 */ +#define GPIO_BSHR_BR11 ((uint32_t)0x08000000) /* Port x Reset bit 11 */ +#define GPIO_BSHR_BR12 ((uint32_t)0x10000000) /* Port x Reset bit 12 */ +#define GPIO_BSHR_BR13 ((uint32_t)0x20000000) /* Port x Reset bit 13 */ +#define GPIO_BSHR_BR14 ((uint32_t)0x40000000) /* Port x Reset bit 14 */ +#define GPIO_BSHR_BR15 ((uint32_t)0x80000000) /* Port x Reset bit 15 */ + +/******************* Bit definition for GPIO_BCR register *******************/ +#define GPIO_BCR_BR0 ((uint16_t)0x0001) /* Port x Reset bit 0 */ +#define GPIO_BCR_BR1 ((uint16_t)0x0002) /* Port x Reset bit 1 */ +#define GPIO_BCR_BR2 ((uint16_t)0x0004) /* Port x Reset bit 2 */ +#define GPIO_BCR_BR3 ((uint16_t)0x0008) /* Port x Reset bit 3 */ +#define GPIO_BCR_BR4 ((uint16_t)0x0010) /* Port x Reset bit 4 */ +#define GPIO_BCR_BR5 ((uint16_t)0x0020) /* Port x Reset bit 5 */ +#define GPIO_BCR_BR6 ((uint16_t)0x0040) /* Port x Reset bit 6 */ +#define GPIO_BCR_BR7 ((uint16_t)0x0080) /* Port x Reset bit 7 */ +#define GPIO_BCR_BR8 ((uint16_t)0x0100) /* Port x Reset bit 8 */ +#define GPIO_BCR_BR9 ((uint16_t)0x0200) /* Port x Reset bit 9 */ +#define GPIO_BCR_BR10 ((uint16_t)0x0400) /* Port x Reset bit 10 */ +#define GPIO_BCR_BR11 ((uint16_t)0x0800) /* Port x Reset bit 11 */ +#define GPIO_BCR_BR12 ((uint16_t)0x1000) /* Port x Reset bit 12 */ +#define GPIO_BCR_BR13 ((uint16_t)0x2000) /* Port x Reset bit 13 */ +#define GPIO_BCR_BR14 ((uint16_t)0x4000) /* Port x Reset bit 14 */ +#define GPIO_BCR_BR15 ((uint16_t)0x8000) /* Port x Reset bit 15 */ + +/****************** Bit definition for GPIO_LCKR register *******************/ +#define GPIO_LCK0 ((uint32_t)0x00000001) /* Port x Lock bit 0 */ +#define GPIO_LCK1 ((uint32_t)0x00000002) /* Port x Lock bit 1 */ +#define GPIO_LCK2 ((uint32_t)0x00000004) /* Port x Lock bit 2 */ +#define GPIO_LCK3 ((uint32_t)0x00000008) /* Port x Lock bit 3 */ +#define GPIO_LCK4 ((uint32_t)0x00000010) /* Port x Lock bit 4 */ +#define GPIO_LCK5 ((uint32_t)0x00000020) /* Port x Lock bit 5 */ +#define GPIO_LCK6 ((uint32_t)0x00000040) /* Port x Lock bit 6 */ +#define GPIO_LCK7 ((uint32_t)0x00000080) /* Port x Lock bit 7 */ +#define GPIO_LCK8 ((uint32_t)0x00000100) /* Port x Lock bit 8 */ +#define GPIO_LCK9 ((uint32_t)0x00000200) /* Port x Lock bit 9 */ +#define GPIO_LCK10 ((uint32_t)0x00000400) /* Port x Lock bit 10 */ +#define GPIO_LCK11 ((uint32_t)0x00000800) /* Port x Lock bit 11 */ +#define GPIO_LCK12 ((uint32_t)0x00001000) /* Port x Lock bit 12 */ +#define GPIO_LCK13 ((uint32_t)0x00002000) /* Port x Lock bit 13 */ +#define GPIO_LCK14 ((uint32_t)0x00004000) /* Port x Lock bit 14 */ +#define GPIO_LCK15 ((uint32_t)0x00008000) /* Port x Lock bit 15 */ +#define GPIO_LCKK ((uint32_t)0x00010000) /* Lock key */ + +/****************** Bit definition for AFIO_ECR register *******************/ +#define AFIO_ECR_PIN ((uint8_t)0x0F) /* PIN[3:0] bits (Pin selection) */ +#define AFIO_ECR_PIN_0 ((uint8_t)0x01) /* Bit 0 */ +#define AFIO_ECR_PIN_1 ((uint8_t)0x02) /* Bit 1 */ +#define AFIO_ECR_PIN_2 ((uint8_t)0x04) /* Bit 2 */ +#define AFIO_ECR_PIN_3 ((uint8_t)0x08) /* Bit 3 */ + +#define AFIO_ECR_PIN_PX0 ((uint8_t)0x00) /* Pin 0 selected */ +#define AFIO_ECR_PIN_PX1 ((uint8_t)0x01) /* Pin 1 selected */ +#define AFIO_ECR_PIN_PX2 ((uint8_t)0x02) /* Pin 2 selected */ +#define AFIO_ECR_PIN_PX3 ((uint8_t)0x03) /* Pin 3 selected */ +#define AFIO_ECR_PIN_PX4 ((uint8_t)0x04) /* Pin 4 selected */ +#define AFIO_ECR_PIN_PX5 ((uint8_t)0x05) /* Pin 5 selected */ +#define AFIO_ECR_PIN_PX6 ((uint8_t)0x06) /* Pin 6 selected */ +#define AFIO_ECR_PIN_PX7 ((uint8_t)0x07) /* Pin 7 selected */ +#define AFIO_ECR_PIN_PX8 ((uint8_t)0x08) /* Pin 8 selected */ +#define AFIO_ECR_PIN_PX9 ((uint8_t)0x09) /* Pin 9 selected */ +#define AFIO_ECR_PIN_PX10 ((uint8_t)0x0A) /* Pin 10 selected */ +#define AFIO_ECR_PIN_PX11 ((uint8_t)0x0B) /* Pin 11 selected */ +#define AFIO_ECR_PIN_PX12 ((uint8_t)0x0C) /* Pin 12 selected */ +#define AFIO_ECR_PIN_PX13 ((uint8_t)0x0D) /* Pin 13 selected */ +#define AFIO_ECR_PIN_PX14 ((uint8_t)0x0E) /* Pin 14 selected */ +#define AFIO_ECR_PIN_PX15 ((uint8_t)0x0F) /* Pin 15 selected */ + +#define AFIO_ECR_PORT ((uint8_t)0x70) /* PORT[2:0] bits (Port selection) */ +#define AFIO_ECR_PORT_0 ((uint8_t)0x10) /* Bit 0 */ +#define AFIO_ECR_PORT_1 ((uint8_t)0x20) /* Bit 1 */ +#define AFIO_ECR_PORT_2 ((uint8_t)0x40) /* Bit 2 */ + +#define AFIO_ECR_PORT_PA ((uint8_t)0x00) /* Port A selected */ +#define AFIO_ECR_PORT_PB ((uint8_t)0x10) /* Port B selected */ +#define AFIO_ECR_PORT_PC ((uint8_t)0x20) /* Port C selected */ +#define AFIO_ECR_PORT_PD ((uint8_t)0x30) /* Port D selected */ +#define AFIO_ECR_PORT_PE ((uint8_t)0x40) /* Port E selected */ + +#define AFIO_ECR_EVOE ((uint8_t)0x80) /* Event Output Enable */ + +/****************** Bit definition for AFIO_PCFR1register *******************/ +#define AFIO_PCFR1_SPI1_REMAP ((uint32_t)0x00000001) /* SPI1 remapping */ +#define AFIO_PCFR1_I2C1_REMAP ((uint32_t)0x00000002) /* I2C1 remapping */ +#define AFIO_PCFR1_USART1_REMAP ((uint32_t)0x00000004) /* USART1 remapping */ +#define AFIO_PCFR1_USART2_REMAP ((uint32_t)0x00000008) /* USART2 remapping */ + +#define AFIO_PCFR1_USART3_REMAP ((uint32_t)0x00000030) /* USART3_REMAP[1:0] bits (USART3 remapping) */ +#define AFIO_PCFR1_USART3_REMAP_0 ((uint32_t)0x00000010) /* Bit 0 */ +#define AFIO_PCFR1_USART3_REMAP_1 ((uint32_t)0x00000020) /* Bit 1 */ + +#define AFIO_PCFR1_USART3_REMAP_NOREMAP ((uint32_t)0x00000000) /* No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) */ +#define AFIO_PCFR1_USART3_REMAP_PARTIALREMAP ((uint32_t)0x00000010) /* Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */ +#define AFIO_PCFR1_USART3_REMAP_FULLREMAP ((uint32_t)0x00000030) /* Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) */ + +#define AFIO_PCFR1_TIM1_REMAP ((uint32_t)0x000000C0) /* TIM1_REMAP[1:0] bits (TIM1 remapping) */ +#define AFIO_PCFR1_TIM1_REMAP_0 ((uint32_t)0x00000040) /* Bit 0 */ +#define AFIO_PCFR1_TIM1_REMAP_1 ((uint32_t)0x00000080) /* Bit 1 */ + +#define AFIO_PCFR1_TIM1_REMAP_NOREMAP ((uint32_t)0x00000000) /* No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) */ +#define AFIO_PCFR1_TIM1_REMAP_PARTIALREMAP ((uint32_t)0x00000040) /* Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) */ +#define AFIO_PCFR1_TIM1_REMAP_FULLREMAP ((uint32_t)0x000000C0) /* Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) */ + +#define AFIO_PCFR1_TIM2_REMAP ((uint32_t)0x00000300) /* TIM2_REMAP[1:0] bits (TIM2 remapping) */ +#define AFIO_PCFR1_TIM2_REMAP_0 ((uint32_t)0x00000100) /* Bit 0 */ +#define AFIO_PCFR1_TIM2_REMAP_1 ((uint32_t)0x00000200) /* Bit 1 */ + +#define AFIO_PCFR1_TIM2_REMAP_NOREMAP ((uint32_t)0x00000000) /* No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) */ +#define AFIO_PCFR1_TIM2_REMAP_PARTIALREMAP1 ((uint32_t)0x00000100) /* Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) */ +#define AFIO_PCFR1_TIM2_REMAP_PARTIALREMAP2 ((uint32_t)0x00000200) /* Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) */ +#define AFIO_PCFR1_TIM2_REMAP_FULLREMAP ((uint32_t)0x00000300) /* Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) */ + +#define AFIO_PCFR1_TIM3_REMAP ((uint32_t)0x00000C00) /* TIM3_REMAP[1:0] bits (TIM3 remapping) */ +#define AFIO_PCFR1_TIM3_REMAP_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define AFIO_PCFR1_TIM3_REMAP_1 ((uint32_t)0x00000800) /* Bit 1 */ + +#define AFIO_PCFR1_TIM3_REMAP_NOREMAP ((uint32_t)0x00000000) /* No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */ +#define AFIO_PCFR1_TIM3_REMAP_PARTIALREMAP ((uint32_t)0x00000800) /* Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */ +#define AFIO_PCFR1_TIM3_REMAP_FULLREMAP ((uint32_t)0x00000C00) /* Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) */ + +#define AFIO_PCFR1_TIM4_REMAP ((uint32_t)0x00001000) /* TIM4_REMAP bit (TIM4 remapping) */ + +#define AFIO_PCFR1_CAN_REMAP ((uint32_t)0x00006000) /* CAN_REMAP[1:0] bits (CAN Alternate function remapping) */ +#define AFIO_PCFR1_CAN_REMAP_0 ((uint32_t)0x00002000) /* Bit 0 */ +#define AFIO_PCFR1_CAN_REMAP_1 ((uint32_t)0x00004000) /* Bit 1 */ + +#define AFIO_PCFR1_CAN_REMAP_REMAP1 ((uint32_t)0x00000000) /* CANRX mapped to PA11, CANTX mapped to PA12 */ +#define AFIO_PCFR1_CAN_REMAP_REMAP2 ((uint32_t)0x00004000) /* CANRX mapped to PB8, CANTX mapped to PB9 */ +#define AFIO_PCFR1_CAN_REMAP_REMAP3 ((uint32_t)0x00006000) /* CANRX mapped to PD0, CANTX mapped to PD1 */ + +#define AFIO_PCFR1_PD01_REMAP ((uint32_t)0x00008000) /* Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ +#define AFIO_PCFR1_TIM5CH4_IREMAP ((uint32_t)0x00010000) /* TIM5 Channel4 Internal Remap */ +#define AFIO_PCFR1_ADC1_ETRGINJ_REMAP ((uint32_t)0x00020000) /* ADC 1 External Trigger Injected Conversion remapping */ +#define AFIO_PCFR1_ADC1_ETRGREG_REMAP ((uint32_t)0x00040000) /* ADC 1 External Trigger Regular Conversion remapping */ +#define AFIO_PCFR1_ADC2_ETRGINJ_REMAP ((uint32_t)0x00080000) /* ADC 2 External Trigger Injected Conversion remapping */ +#define AFIO_PCFR1_ADC2_ETRGREG_REMAP ((uint32_t)0x00100000) /* ADC 2 External Trigger Regular Conversion remapping */ + +#define AFIO_PCFR1_SWJ_CFG ((uint32_t)0x07000000) /* SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */ +#define AFIO_PCFR1_SWJ_CFG_0 ((uint32_t)0x01000000) /* Bit 0 */ +#define AFIO_PCFR1_SWJ_CFG_1 ((uint32_t)0x02000000) /* Bit 1 */ +#define AFIO_PCFR1_SWJ_CFG_2 ((uint32_t)0x04000000) /* Bit 2 */ + +#define AFIO_PCFR1_SWJ_CFG_RESET ((uint32_t)0x00000000) /* Full SWJ (JTAG-DP + SW-DP) : Reset State */ +#define AFIO_PCFR1_SWJ_CFG_NOJNTRST ((uint32_t)0x01000000) /* Full SWJ (JTAG-DP + SW-DP) but without JNTRST */ +#define AFIO_PCFR1_SWJ_CFG_JTAGDISABLE ((uint32_t)0x02000000) /* JTAG-DP Disabled and SW-DP Enabled */ +#define AFIO_PCFR1_SWJ_CFG_DISABLE ((uint32_t)0x04000000) /* JTAG-DP Disabled and SW-DP Disabled */ + +/***************** Bit definition for AFIO_EXTICR1 register *****************/ +#define AFIO_EXTICR1_EXTI0 ((uint16_t)0x000F) /* EXTI 0 configuration */ +#define AFIO_EXTICR1_EXTI1 ((uint16_t)0x00F0) /* EXTI 1 configuration */ +#define AFIO_EXTICR1_EXTI2 ((uint16_t)0x0F00) /* EXTI 2 configuration */ +#define AFIO_EXTICR1_EXTI3 ((uint16_t)0xF000) /* EXTI 3 configuration */ + +#define AFIO_EXTICR1_EXTI0_PA ((uint16_t)0x0000) /* PA[0] pin */ +#define AFIO_EXTICR1_EXTI0_PB ((uint16_t)0x0001) /* PB[0] pin */ +#define AFIO_EXTICR1_EXTI0_PC ((uint16_t)0x0002) /* PC[0] pin */ +#define AFIO_EXTICR1_EXTI0_PD ((uint16_t)0x0003) /* PD[0] pin */ +#define AFIO_EXTICR1_EXTI0_PE ((uint16_t)0x0004) /* PE[0] pin */ +#define AFIO_EXTICR1_EXTI0_PF ((uint16_t)0x0005) /* PF[0] pin */ +#define AFIO_EXTICR1_EXTI0_PG ((uint16_t)0x0006) /* PG[0] pin */ + +#define AFIO_EXTICR1_EXTI1_PA ((uint16_t)0x0000) /* PA[1] pin */ +#define AFIO_EXTICR1_EXTI1_PB ((uint16_t)0x0010) /* PB[1] pin */ +#define AFIO_EXTICR1_EXTI1_PC ((uint16_t)0x0020) /* PC[1] pin */ +#define AFIO_EXTICR1_EXTI1_PD ((uint16_t)0x0030) /* PD[1] pin */ +#define AFIO_EXTICR1_EXTI1_PE ((uint16_t)0x0040) /* PE[1] pin */ +#define AFIO_EXTICR1_EXTI1_PF ((uint16_t)0x0050) /* PF[1] pin */ +#define AFIO_EXTICR1_EXTI1_PG ((uint16_t)0x0060) /* PG[1] pin */ + +#define AFIO_EXTICR1_EXTI2_PA ((uint16_t)0x0000) /* PA[2] pin */ +#define AFIO_EXTICR1_EXTI2_PB ((uint16_t)0x0100) /* PB[2] pin */ +#define AFIO_EXTICR1_EXTI2_PC ((uint16_t)0x0200) /* PC[2] pin */ +#define AFIO_EXTICR1_EXTI2_PD ((uint16_t)0x0300) /* PD[2] pin */ +#define AFIO_EXTICR1_EXTI2_PE ((uint16_t)0x0400) /* PE[2] pin */ +#define AFIO_EXTICR1_EXTI2_PF ((uint16_t)0x0500) /* PF[2] pin */ +#define AFIO_EXTICR1_EXTI2_PG ((uint16_t)0x0600) /* PG[2] pin */ + +#define AFIO_EXTICR1_EXTI3_PA ((uint16_t)0x0000) /* PA[3] pin */ +#define AFIO_EXTICR1_EXTI3_PB ((uint16_t)0x1000) /* PB[3] pin */ +#define AFIO_EXTICR1_EXTI3_PC ((uint16_t)0x2000) /* PC[3] pin */ +#define AFIO_EXTICR1_EXTI3_PD ((uint16_t)0x3000) /* PD[3] pin */ +#define AFIO_EXTICR1_EXTI3_PE ((uint16_t)0x4000) /* PE[3] pin */ +#define AFIO_EXTICR1_EXTI3_PF ((uint16_t)0x5000) /* PF[3] pin */ +#define AFIO_EXTICR1_EXTI3_PG ((uint16_t)0x6000) /* PG[3] pin */ + +/***************** Bit definition for AFIO_EXTICR2 register *****************/ +#define AFIO_EXTICR2_EXTI4 ((uint16_t)0x000F) /* EXTI 4 configuration */ +#define AFIO_EXTICR2_EXTI5 ((uint16_t)0x00F0) /* EXTI 5 configuration */ +#define AFIO_EXTICR2_EXTI6 ((uint16_t)0x0F00) /* EXTI 6 configuration */ +#define AFIO_EXTICR2_EXTI7 ((uint16_t)0xF000) /* EXTI 7 configuration */ + +#define AFIO_EXTICR2_EXTI4_PA ((uint16_t)0x0000) /* PA[4] pin */ +#define AFIO_EXTICR2_EXTI4_PB ((uint16_t)0x0001) /* PB[4] pin */ +#define AFIO_EXTICR2_EXTI4_PC ((uint16_t)0x0002) /* PC[4] pin */ +#define AFIO_EXTICR2_EXTI4_PD ((uint16_t)0x0003) /* PD[4] pin */ +#define AFIO_EXTICR2_EXTI4_PE ((uint16_t)0x0004) /* PE[4] pin */ +#define AFIO_EXTICR2_EXTI4_PF ((uint16_t)0x0005) /* PF[4] pin */ +#define AFIO_EXTICR2_EXTI4_PG ((uint16_t)0x0006) /* PG[4] pin */ + +#define AFIO_EXTICR2_EXTI5_PA ((uint16_t)0x0000) /* PA[5] pin */ +#define AFIO_EXTICR2_EXTI5_PB ((uint16_t)0x0010) /* PB[5] pin */ +#define AFIO_EXTICR2_EXTI5_PC ((uint16_t)0x0020) /* PC[5] pin */ +#define AFIO_EXTICR2_EXTI5_PD ((uint16_t)0x0030) /* PD[5] pin */ +#define AFIO_EXTICR2_EXTI5_PE ((uint16_t)0x0040) /* PE[5] pin */ +#define AFIO_EXTICR2_EXTI5_PF ((uint16_t)0x0050) /* PF[5] pin */ +#define AFIO_EXTICR2_EXTI5_PG ((uint16_t)0x0060) /* PG[5] pin */ + +#define AFIO_EXTICR2_EXTI6_PA ((uint16_t)0x0000) /* PA[6] pin */ +#define AFIO_EXTICR2_EXTI6_PB ((uint16_t)0x0100) /* PB[6] pin */ +#define AFIO_EXTICR2_EXTI6_PC ((uint16_t)0x0200) /* PC[6] pin */ +#define AFIO_EXTICR2_EXTI6_PD ((uint16_t)0x0300) /* PD[6] pin */ +#define AFIO_EXTICR2_EXTI6_PE ((uint16_t)0x0400) /* PE[6] pin */ +#define AFIO_EXTICR2_EXTI6_PF ((uint16_t)0x0500) /* PF[6] pin */ +#define AFIO_EXTICR2_EXTI6_PG ((uint16_t)0x0600) /* PG[6] pin */ + +#define AFIO_EXTICR2_EXTI7_PA ((uint16_t)0x0000) /* PA[7] pin */ +#define AFIO_EXTICR2_EXTI7_PB ((uint16_t)0x1000) /* PB[7] pin */ +#define AFIO_EXTICR2_EXTI7_PC ((uint16_t)0x2000) /* PC[7] pin */ +#define AFIO_EXTICR2_EXTI7_PD ((uint16_t)0x3000) /* PD[7] pin */ +#define AFIO_EXTICR2_EXTI7_PE ((uint16_t)0x4000) /* PE[7] pin */ +#define AFIO_EXTICR2_EXTI7_PF ((uint16_t)0x5000) /* PF[7] pin */ +#define AFIO_EXTICR2_EXTI7_PG ((uint16_t)0x6000) /* PG[7] pin */ + +/***************** Bit definition for AFIO_EXTICR3 register *****************/ +#define AFIO_EXTICR3_EXTI8 ((uint16_t)0x000F) /* EXTI 8 configuration */ +#define AFIO_EXTICR3_EXTI9 ((uint16_t)0x00F0) /* EXTI 9 configuration */ +#define AFIO_EXTICR3_EXTI10 ((uint16_t)0x0F00) /* EXTI 10 configuration */ +#define AFIO_EXTICR3_EXTI11 ((uint16_t)0xF000) /* EXTI 11 configuration */ + +#define AFIO_EXTICR3_EXTI8_PA ((uint16_t)0x0000) /* PA[8] pin */ +#define AFIO_EXTICR3_EXTI8_PB ((uint16_t)0x0001) /* PB[8] pin */ +#define AFIO_EXTICR3_EXTI8_PC ((uint16_t)0x0002) /* PC[8] pin */ +#define AFIO_EXTICR3_EXTI8_PD ((uint16_t)0x0003) /* PD[8] pin */ +#define AFIO_EXTICR3_EXTI8_PE ((uint16_t)0x0004) /* PE[8] pin */ +#define AFIO_EXTICR3_EXTI8_PF ((uint16_t)0x0005) /* PF[8] pin */ +#define AFIO_EXTICR3_EXTI8_PG ((uint16_t)0x0006) /* PG[8] pin */ + +#define AFIO_EXTICR3_EXTI9_PA ((uint16_t)0x0000) /* PA[9] pin */ +#define AFIO_EXTICR3_EXTI9_PB ((uint16_t)0x0010) /* PB[9] pin */ +#define AFIO_EXTICR3_EXTI9_PC ((uint16_t)0x0020) /* PC[9] pin */ +#define AFIO_EXTICR3_EXTI9_PD ((uint16_t)0x0030) /* PD[9] pin */ +#define AFIO_EXTICR3_EXTI9_PE ((uint16_t)0x0040) /* PE[9] pin */ +#define AFIO_EXTICR3_EXTI9_PF ((uint16_t)0x0050) /* PF[9] pin */ +#define AFIO_EXTICR3_EXTI9_PG ((uint16_t)0x0060) /* PG[9] pin */ + +#define AFIO_EXTICR3_EXTI10_PA ((uint16_t)0x0000) /* PA[10] pin */ +#define AFIO_EXTICR3_EXTI10_PB ((uint16_t)0x0100) /* PB[10] pin */ +#define AFIO_EXTICR3_EXTI10_PC ((uint16_t)0x0200) /* PC[10] pin */ +#define AFIO_EXTICR3_EXTI10_PD ((uint16_t)0x0300) /* PD[10] pin */ +#define AFIO_EXTICR3_EXTI10_PE ((uint16_t)0x0400) /* PE[10] pin */ +#define AFIO_EXTICR3_EXTI10_PF ((uint16_t)0x0500) /* PF[10] pin */ +#define AFIO_EXTICR3_EXTI10_PG ((uint16_t)0x0600) /* PG[10] pin */ + +#define AFIO_EXTICR3_EXTI11_PA ((uint16_t)0x0000) /* PA[11] pin */ +#define AFIO_EXTICR3_EXTI11_PB ((uint16_t)0x1000) /* PB[11] pin */ +#define AFIO_EXTICR3_EXTI11_PC ((uint16_t)0x2000) /* PC[11] pin */ +#define AFIO_EXTICR3_EXTI11_PD ((uint16_t)0x3000) /* PD[11] pin */ +#define AFIO_EXTICR3_EXTI11_PE ((uint16_t)0x4000) /* PE[11] pin */ +#define AFIO_EXTICR3_EXTI11_PF ((uint16_t)0x5000) /* PF[11] pin */ +#define AFIO_EXTICR3_EXTI11_PG ((uint16_t)0x6000) /* PG[11] pin */ + +/***************** Bit definition for AFIO_EXTICR4 register *****************/ +#define AFIO_EXTICR4_EXTI12 ((uint16_t)0x000F) /* EXTI 12 configuration */ +#define AFIO_EXTICR4_EXTI13 ((uint16_t)0x00F0) /* EXTI 13 configuration */ +#define AFIO_EXTICR4_EXTI14 ((uint16_t)0x0F00) /* EXTI 14 configuration */ +#define AFIO_EXTICR4_EXTI15 ((uint16_t)0xF000) /* EXTI 15 configuration */ + +#define AFIO_EXTICR4_EXTI12_PA ((uint16_t)0x0000) /* PA[12] pin */ +#define AFIO_EXTICR4_EXTI12_PB ((uint16_t)0x0001) /* PB[12] pin */ +#define AFIO_EXTICR4_EXTI12_PC ((uint16_t)0x0002) /* PC[12] pin */ +#define AFIO_EXTICR4_EXTI12_PD ((uint16_t)0x0003) /* PD[12] pin */ +#define AFIO_EXTICR4_EXTI12_PE ((uint16_t)0x0004) /* PE[12] pin */ +#define AFIO_EXTICR4_EXTI12_PF ((uint16_t)0x0005) /* PF[12] pin */ +#define AFIO_EXTICR4_EXTI12_PG ((uint16_t)0x0006) /* PG[12] pin */ + +#define AFIO_EXTICR4_EXTI13_PA ((uint16_t)0x0000) /* PA[13] pin */ +#define AFIO_EXTICR4_EXTI13_PB ((uint16_t)0x0010) /* PB[13] pin */ +#define AFIO_EXTICR4_EXTI13_PC ((uint16_t)0x0020) /* PC[13] pin */ +#define AFIO_EXTICR4_EXTI13_PD ((uint16_t)0x0030) /* PD[13] pin */ +#define AFIO_EXTICR4_EXTI13_PE ((uint16_t)0x0040) /* PE[13] pin */ +#define AFIO_EXTICR4_EXTI13_PF ((uint16_t)0x0050) /* PF[13] pin */ +#define AFIO_EXTICR4_EXTI13_PG ((uint16_t)0x0060) /* PG[13] pin */ + +#define AFIO_EXTICR4_EXTI14_PA ((uint16_t)0x0000) /* PA[14] pin */ +#define AFIO_EXTICR4_EXTI14_PB ((uint16_t)0x0100) /* PB[14] pin */ +#define AFIO_EXTICR4_EXTI14_PC ((uint16_t)0x0200) /* PC[14] pin */ +#define AFIO_EXTICR4_EXTI14_PD ((uint16_t)0x0300) /* PD[14] pin */ +#define AFIO_EXTICR4_EXTI14_PE ((uint16_t)0x0400) /* PE[14] pin */ +#define AFIO_EXTICR4_EXTI14_PF ((uint16_t)0x0500) /* PF[14] pin */ +#define AFIO_EXTICR4_EXTI14_PG ((uint16_t)0x0600) /* PG[14] pin */ + +#define AFIO_EXTICR4_EXTI15_PA ((uint16_t)0x0000) /* PA[15] pin */ +#define AFIO_EXTICR4_EXTI15_PB ((uint16_t)0x1000) /* PB[15] pin */ +#define AFIO_EXTICR4_EXTI15_PC ((uint16_t)0x2000) /* PC[15] pin */ +#define AFIO_EXTICR4_EXTI15_PD ((uint16_t)0x3000) /* PD[15] pin */ +#define AFIO_EXTICR4_EXTI15_PE ((uint16_t)0x4000) /* PE[15] pin */ +#define AFIO_EXTICR4_EXTI15_PF ((uint16_t)0x5000) /* PF[15] pin */ +#define AFIO_EXTICR4_EXTI15_PG ((uint16_t)0x6000) /* PG[15] pin */ + +/******************************************************************************/ +/* Independent WATCHDOG */ +/******************************************************************************/ + +/******************* Bit definition for IWDG_CTLR register ********************/ +#define IWDG_KEY ((uint16_t)0xFFFF) /* Key value (write only, read 0000h) */ + +/******************* Bit definition for IWDG_PSCR register ********************/ +#define IWDG_PR ((uint8_t)0x07) /* PR[2:0] (Prescaler divider) */ +#define IWDG_PR_0 ((uint8_t)0x01) /* Bit 0 */ +#define IWDG_PR_1 ((uint8_t)0x02) /* Bit 1 */ +#define IWDG_PR_2 ((uint8_t)0x04) /* Bit 2 */ + +/******************* Bit definition for IWDG_RLDR register *******************/ +#define IWDG_RL ((uint16_t)0x0FFF) /* Watchdog counter reload value */ + +/******************* Bit definition for IWDG_STATR register ********************/ +#define IWDG_PVU ((uint8_t)0x01) /* Watchdog prescaler value update */ +#define IWDG_RVU ((uint8_t)0x02) /* Watchdog counter reload value update */ + +/******************************************************************************/ +/* Inter-integrated Circuit Interface */ +/******************************************************************************/ + +/******************* Bit definition for I2C_CTLR1 register ********************/ +#define I2C_CTLR1_PE ((uint16_t)0x0001) /* Peripheral Enable */ +#define I2C_CTLR1_SMBUS ((uint16_t)0x0002) /* SMBus Mode */ +#define I2C_CTLR1_SMBTYPE ((uint16_t)0x0008) /* SMBus Type */ +#define I2C_CTLR1_ENARP ((uint16_t)0x0010) /* ARP Enable */ +#define I2C_CTLR1_ENPEC ((uint16_t)0x0020) /* PEC Enable */ +#define I2C_CTLR1_ENGC ((uint16_t)0x0040) /* General Call Enable */ +#define I2C_CTLR1_NOSTRETCH ((uint16_t)0x0080) /* Clock Stretching Disable (Slave mode) */ +#define I2C_CTLR1_START ((uint16_t)0x0100) /* Start Generation */ +#define I2C_CTLR1_STOP ((uint16_t)0x0200) /* Stop Generation */ +#define I2C_CTLR1_ACK ((uint16_t)0x0400) /* Acknowledge Enable */ +#define I2C_CTLR1_POS ((uint16_t)0x0800) /* Acknowledge/PEC Position (for data reception) */ +#define I2C_CTLR1_PEC ((uint16_t)0x1000) /* Packet Error Checking */ +#define I2C_CTLR1_ALERT ((uint16_t)0x2000) /* SMBus Alert */ +#define I2C_CTLR1_SWRST ((uint16_t)0x8000) /* Software Reset */ + +/******************* Bit definition for I2C_CTLR2 register ********************/ +#define I2C_CTLR2_FREQ ((uint16_t)0x003F) /* FREQ[5:0] bits (Peripheral Clock Frequency) */ +#define I2C_CTLR2_FREQ_0 ((uint16_t)0x0001) /* Bit 0 */ +#define I2C_CTLR2_FREQ_1 ((uint16_t)0x0002) /* Bit 1 */ +#define I2C_CTLR2_FREQ_2 ((uint16_t)0x0004) /* Bit 2 */ +#define I2C_CTLR2_FREQ_3 ((uint16_t)0x0008) /* Bit 3 */ +#define I2C_CTLR2_FREQ_4 ((uint16_t)0x0010) /* Bit 4 */ +#define I2C_CTLR2_FREQ_5 ((uint16_t)0x0020) /* Bit 5 */ + +#define I2C_CTLR2_ITERREN ((uint16_t)0x0100) /* Error Interrupt Enable */ +#define I2C_CTLR2_ITEVTEN ((uint16_t)0x0200) /* Event Interrupt Enable */ +#define I2C_CTLR2_ITBUFEN ((uint16_t)0x0400) /* Buffer Interrupt Enable */ +#define I2C_CTLR2_DMAEN ((uint16_t)0x0800) /* DMA Requests Enable */ +#define I2C_CTLR2_LAST ((uint16_t)0x1000) /* DMA Last Transfer */ + +/******************* Bit definition for I2C_OADDR1 register *******************/ +#define I2C_OADDR1_ADD1_7 ((uint16_t)0x00FE) /* Interface Address */ +#define I2C_OADDR1_ADD8_9 ((uint16_t)0x0300) /* Interface Address */ + +#define I2C_OADDR1_ADD0 ((uint16_t)0x0001) /* Bit 0 */ +#define I2C_OADDR1_ADD1 ((uint16_t)0x0002) /* Bit 1 */ +#define I2C_OADDR1_ADD2 ((uint16_t)0x0004) /* Bit 2 */ +#define I2C_OADDR1_ADD3 ((uint16_t)0x0008) /* Bit 3 */ +#define I2C_OADDR1_ADD4 ((uint16_t)0x0010) /* Bit 4 */ +#define I2C_OADDR1_ADD5 ((uint16_t)0x0020) /* Bit 5 */ +#define I2C_OADDR1_ADD6 ((uint16_t)0x0040) /* Bit 6 */ +#define I2C_OADDR1_ADD7 ((uint16_t)0x0080) /* Bit 7 */ +#define I2C_OADDR1_ADD8 ((uint16_t)0x0100) /* Bit 8 */ +#define I2C_OADDR1_ADD9 ((uint16_t)0x0200) /* Bit 9 */ + +#define I2C_OADDR1_ADDMODE ((uint16_t)0x8000) /* Addressing Mode (Slave mode) */ + +/******************* Bit definition for I2C_OADDR2 register *******************/ +#define I2C_OADDR2_ENDUAL ((uint8_t)0x01) /* Dual addressing mode enable */ +#define I2C_OADDR2_ADD2 ((uint8_t)0xFE) /* Interface address */ + +/******************** Bit definition for I2C_DATAR register ********************/ +#define I2C_DR_DATAR ((uint8_t)0xFF) /* 8-bit Data Register */ + +/******************* Bit definition for I2C_STAR1 register ********************/ +#define I2C_STAR1_SB ((uint16_t)0x0001) /* Start Bit (Master mode) */ +#define I2C_STAR1_ADDR ((uint16_t)0x0002) /* Address sent (master mode)/matched (slave mode) */ +#define I2C_STAR1_BTF ((uint16_t)0x0004) /* Byte Transfer Finished */ +#define I2C_STAR1_ADD10 ((uint16_t)0x0008) /* 10-bit header sent (Master mode) */ +#define I2C_STAR1_STOPF ((uint16_t)0x0010) /* Stop detection (Slave mode) */ +#define I2C_STAR1_RXNE ((uint16_t)0x0040) /* Data Register not Empty (receivers) */ +#define I2C_STAR1_TXE ((uint16_t)0x0080) /* Data Register Empty (transmitters) */ +#define I2C_STAR1_BERR ((uint16_t)0x0100) /* Bus Error */ +#define I2C_STAR1_ARLO ((uint16_t)0x0200) /* Arbitration Lost (master mode) */ +#define I2C_STAR1_AF ((uint16_t)0x0400) /* Acknowledge Failure */ +#define I2C_STAR1_OVR ((uint16_t)0x0800) /* Overrun/Underrun */ +#define I2C_STAR1_PECERR ((uint16_t)0x1000) /* PEC Error in reception */ +#define I2C_STAR1_TIMEOUT ((uint16_t)0x4000) /* Timeout or Tlow Error */ +#define I2C_STAR1_SMBALERT ((uint16_t)0x8000) /* SMBus Alert */ + +/******************* Bit definition for I2C_STAR2 register ********************/ +#define I2C_STAR2_MSL ((uint16_t)0x0001) /* Master/Slave */ +#define I2C_STAR2_BUSY ((uint16_t)0x0002) /* Bus Busy */ +#define I2C_STAR2_TRA ((uint16_t)0x0004) /* Transmitter/Receiver */ +#define I2C_STAR2_GENCALL ((uint16_t)0x0010) /* General Call Address (Slave mode) */ +#define I2C_STAR2_SMBDEFAULT ((uint16_t)0x0020) /* SMBus Device Default Address (Slave mode) */ +#define I2C_STAR2_SMBHOST ((uint16_t)0x0040) /* SMBus Host Header (Slave mode) */ +#define I2C_STAR2_DUALF ((uint16_t)0x0080) /* Dual Flag (Slave mode) */ +#define I2C_STAR2_PEC ((uint16_t)0xFF00) /* Packet Error Checking Register */ + +/******************* Bit definition for I2C_CKCFGR register ********************/ +#define I2C_CKCFGR_CCR ((uint16_t)0x0FFF) /* Clock Control Register in Fast/Standard mode (Master mode) */ +#define I2C_CKCFGR_DUTY ((uint16_t)0x4000) /* Fast Mode Duty Cycle */ +#define I2C_CKCFGR_FS ((uint16_t)0x8000) /* I2C Master Mode Selection */ + +/****************** Bit definition for I2C_RTR register *******************/ +#define I2C_RTR_TRISE ((uint8_t)0x3F) /* Maximum Rise Time in Fast/Standard mode (Master mode) */ + +/******************************************************************************/ +/* Power Control */ +/******************************************************************************/ + +/******************** Bit definition for PWR_CTLR register ********************/ +#define PWR_CTLR_LPDS ((uint16_t)0x0001) /* Low-Power Deepsleep */ +#define PWR_CTLR_PDDS ((uint16_t)0x0002) /* Power Down Deepsleep */ +#define PWR_CTLR_CWUF ((uint16_t)0x0004) /* Clear Wakeup Flag */ +#define PWR_CTLR_CSBF ((uint16_t)0x0008) /* Clear Standby Flag */ +#define PWR_CTLR_PVDE ((uint16_t)0x0010) /* Power Voltage Detector Enable */ + +#define PWR_CTLR_PLS ((uint16_t)0x00E0) /* PLS[2:0] bits (PVD Level Selection) */ +#define PWR_CTLR_PLS_0 ((uint16_t)0x0020) /* Bit 0 */ +#define PWR_CTLR_PLS_1 ((uint16_t)0x0040) /* Bit 1 */ +#define PWR_CTLR_PLS_2 ((uint16_t)0x0080) /* Bit 2 */ + +#define PWR_CTLR_PLS_2V2 ((uint16_t)0x0000) /* PVD level 2.2V */ +#define PWR_CTLR_PLS_2V3 ((uint16_t)0x0020) /* PVD level 2.3V */ +#define PWR_CTLR_PLS_2V4 ((uint16_t)0x0040) /* PVD level 2.4V */ +#define PWR_CTLR_PLS_2V5 ((uint16_t)0x0060) /* PVD level 2.5V */ +#define PWR_CTLR_PLS_2V6 ((uint16_t)0x0080) /* PVD level 2.6V */ +#define PWR_CTLR_PLS_2V7 ((uint16_t)0x00A0) /* PVD level 2.7V */ +#define PWR_CTLR_PLS_2V8 ((uint16_t)0x00C0) /* PVD level 2.8V */ +#define PWR_CTLR_PLS_2V9 ((uint16_t)0x00E0) /* PVD level 2.9V */ + +#define PWR_CTLR_DBP ((uint16_t)0x0100) /* Disable Backup Domain write protection */ + +/******************* Bit definition for PWR_CSR register ********************/ +#define PWR_CSR_WUF ((uint16_t)0x0001) /* Wakeup Flag */ +#define PWR_CSR_SBF ((uint16_t)0x0002) /* Standby Flag */ +#define PWR_CSR_PVDO ((uint16_t)0x0004) /* PVD Output */ +#define PWR_CSR_EWUP ((uint16_t)0x0100) /* Enable WKUP pin */ + +/******************************************************************************/ +/* Reset and Clock Control */ +/******************************************************************************/ + +/******************** Bit definition for RCC_CTLR register ********************/ +#define RCC_HSION ((uint32_t)0x00000001) /* Internal High Speed clock enable */ +#define RCC_HSIRDY ((uint32_t)0x00000002) /* Internal High Speed clock ready flag */ +#define RCC_HSITRIM ((uint32_t)0x000000F8) /* Internal High Speed clock trimming */ +#define RCC_HSICAL ((uint32_t)0x0000FF00) /* Internal High Speed clock Calibration */ +#define RCC_HSEON ((uint32_t)0x00010000) /* External High Speed clock enable */ +#define RCC_HSERDY ((uint32_t)0x00020000) /* External High Speed clock ready flag */ +#define RCC_HSEBYP ((uint32_t)0x00040000) /* External High Speed clock Bypass */ +#define RCC_CSSON ((uint32_t)0x00080000) /* Clock Security System enable */ +#define RCC_PLLON ((uint32_t)0x01000000) /* PLL enable */ +#define RCC_PLLRDY ((uint32_t)0x02000000) /* PLL clock ready flag */ + +/******************* Bit definition for RCC_CFGR0 register *******************/ +#define RCC_SW ((uint32_t)0x00000003) /* SW[1:0] bits (System clock Switch) */ +#define RCC_SW_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define RCC_SW_1 ((uint32_t)0x00000002) /* Bit 1 */ + +#define RCC_SW_HSI ((uint32_t)0x00000000) /* HSI selected as system clock */ +#define RCC_SW_HSE ((uint32_t)0x00000001) /* HSE selected as system clock */ +#define RCC_SW_PLL ((uint32_t)0x00000002) /* PLL selected as system clock */ + +#define RCC_SWS ((uint32_t)0x0000000C) /* SWS[1:0] bits (System Clock Switch Status) */ +#define RCC_SWS_0 ((uint32_t)0x00000004) /* Bit 0 */ +#define RCC_SWS_1 ((uint32_t)0x00000008) /* Bit 1 */ + +#define RCC_SWS_HSI ((uint32_t)0x00000000) /* HSI oscillator used as system clock */ +#define RCC_SWS_HSE ((uint32_t)0x00000004) /* HSE oscillator used as system clock */ +#define RCC_SWS_PLL ((uint32_t)0x00000008) /* PLL used as system clock */ + +#define RCC_HPRE ((uint32_t)0x000000F0) /* HPRE[3:0] bits (AHB prescaler) */ +#define RCC_HPRE_0 ((uint32_t)0x00000010) /* Bit 0 */ +#define RCC_HPRE_1 ((uint32_t)0x00000020) /* Bit 1 */ +#define RCC_HPRE_2 ((uint32_t)0x00000040) /* Bit 2 */ +#define RCC_HPRE_3 ((uint32_t)0x00000080) /* Bit 3 */ + +#define RCC_HPRE_DIV1 ((uint32_t)0x00000000) /* SYSCLK not divided */ +#define RCC_HPRE_DIV2 ((uint32_t)0x00000080) /* SYSCLK divided by 2 */ +#define RCC_HPRE_DIV4 ((uint32_t)0x00000090) /* SYSCLK divided by 4 */ +#define RCC_HPRE_DIV8 ((uint32_t)0x000000A0) /* SYSCLK divided by 8 */ +#define RCC_HPRE_DIV16 ((uint32_t)0x000000B0) /* SYSCLK divided by 16 */ +#define RCC_HPRE_DIV64 ((uint32_t)0x000000C0) /* SYSCLK divided by 64 */ +#define RCC_HPRE_DIV128 ((uint32_t)0x000000D0) /* SYSCLK divided by 128 */ +#define RCC_HPRE_DIV256 ((uint32_t)0x000000E0) /* SYSCLK divided by 256 */ +#define RCC_HPRE_DIV512 ((uint32_t)0x000000F0) /* SYSCLK divided by 512 */ + +#define RCC_PPRE1 ((uint32_t)0x00000700) /* PRE1[2:0] bits (APB1 prescaler) */ +#define RCC_PPRE1_0 ((uint32_t)0x00000100) /* Bit 0 */ +#define RCC_PPRE1_1 ((uint32_t)0x00000200) /* Bit 1 */ +#define RCC_PPRE1_2 ((uint32_t)0x00000400) /* Bit 2 */ + +#define RCC_PPRE1_DIV1 ((uint32_t)0x00000000) /* PPRE1 not divided */ +#define RCC_PPRE1_DIV2 ((uint32_t)0x00000400) /* PPRE1 divided by 2 */ +#define RCC_PPRE1_DIV4 ((uint32_t)0x00000500) /* PPRE1 divided by 4 */ +#define RCC_PPRE1_DIV8 ((uint32_t)0x00000600) /* PPRE1 divided by 8 */ +#define RCC_PPRE1_DIV16 ((uint32_t)0x00000700) /* PPRE1 divided by 16 */ + +#define RCC_PPRE2 ((uint32_t)0x00003800) /* PRE2[2:0] bits (APB2 prescaler) */ +#define RCC_PPRE2_0 ((uint32_t)0x00000800) /* Bit 0 */ +#define RCC_PPRE2_1 ((uint32_t)0x00001000) /* Bit 1 */ +#define RCC_PPRE2_2 ((uint32_t)0x00002000) /* Bit 2 */ + +#define RCC_PPRE2_DIV1 ((uint32_t)0x00000000) /* PPRE2 not divided */ +#define RCC_PPRE2_DIV2 ((uint32_t)0x00002000) /* PPRE2 divided by 2 */ +#define RCC_PPRE2_DIV4 ((uint32_t)0x00002800) /* PPRE2 divided by 4 */ +#define RCC_PPRE2_DIV8 ((uint32_t)0x00003000) /* PPRE2 divided by 8 */ +#define RCC_PPRE2_DIV16 ((uint32_t)0x00003800) /* PPRE2 divided by 16 */ + +#define RCC_ADCPRE ((uint32_t)0x0000C000) /* ADCPRE[1:0] bits (ADC prescaler) */ +#define RCC_ADCPRE_0 ((uint32_t)0x00004000) /* Bit 0 */ +#define RCC_ADCPRE_1 ((uint32_t)0x00008000) /* Bit 1 */ + +#define RCC_ADCPRE_DIV2 ((uint32_t)0x00000000) /* ADCPRE divided by 2 */ +#define RCC_ADCPRE_DIV4 ((uint32_t)0x00004000) /* ADCPRE divided by 4 */ +#define RCC_ADCPRE_DIV6 ((uint32_t)0x00008000) /* ADCPRE divided by 6 */ +#define RCC_ADCPRE_DIV8 ((uint32_t)0x0000C000) /* ADCPRE divided by 8 */ + +#define RCC_PLLSRC ((uint32_t)0x00010000) /* PLL entry clock source */ + +#define RCC_PLLXTPRE ((uint32_t)0x00020000) /* HSE divider for PLL entry */ + +#define RCC_PLLMULL ((uint32_t)0x003C0000) /* PLLMUL[3:0] bits (PLL multiplication factor) */ +#define RCC_PLLMULL_0 ((uint32_t)0x00040000) /* Bit 0 */ +#define RCC_PLLMULL_1 ((uint32_t)0x00080000) /* Bit 1 */ +#define RCC_PLLMULL_2 ((uint32_t)0x00100000) /* Bit 2 */ +#define RCC_PLLMULL_3 ((uint32_t)0x00200000) /* Bit 3 */ + +#define RCC_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /* HSI clock divided by 2 selected as PLL entry clock source */ +#define RCC_PLLSRC_HSE ((uint32_t)0x00010000) /* HSE clock selected as PLL entry clock source */ + +#define RCC_PLLXTPRE_HSE ((uint32_t)0x00000000) /* HSE clock not divided for PLL entry */ +#define RCC_PLLXTPRE_HSE_Div2 ((uint32_t)0x00020000) /* HSE clock divided by 2 for PLL entry */ + +/* for other CH32V20x */ +#define RCC_PLLMULL2 ((uint32_t)0x00000000) /* PLL input clock*2 */ +#define RCC_PLLMULL3 ((uint32_t)0x00040000) /* PLL input clock*3 */ +#define RCC_PLLMULL4 ((uint32_t)0x00080000) /* PLL input clock*4 */ +#define RCC_PLLMULL5 ((uint32_t)0x000C0000) /* PLL input clock*5 */ +#define RCC_PLLMULL6 ((uint32_t)0x00100000) /* PLL input clock*6 */ +#define RCC_PLLMULL7 ((uint32_t)0x00140000) /* PLL input clock*7 */ +#define RCC_PLLMULL8 ((uint32_t)0x00180000) /* PLL input clock*8 */ +#define RCC_PLLMULL9 ((uint32_t)0x001C0000) /* PLL input clock*9 */ +#define RCC_PLLMULL10 ((uint32_t)0x00200000) /* PLL input clock10 */ +#define RCC_PLLMULL11 ((uint32_t)0x00240000) /* PLL input clock*11 */ +#define RCC_PLLMULL12 ((uint32_t)0x00280000) /* PLL input clock*12 */ +#define RCC_PLLMULL13 ((uint32_t)0x002C0000) /* PLL input clock*13 */ +#define RCC_PLLMULL14 ((uint32_t)0x00300000) /* PLL input clock*14 */ +#define RCC_PLLMULL15 ((uint32_t)0x00340000) /* PLL input clock*15 */ +#define RCC_PLLMULL16 ((uint32_t)0x00380000) /* PLL input clock*16 */ +#define RCC_PLLMULL18 ((uint32_t)0x003C0000) /* PLL input clock*18 */ + +#define RCC_USBPRE ((uint32_t)0x00400000) /* USB Device prescaler */ + +#define RCC_CFGR0_MCO ((uint32_t)0x07000000) /* MCO[2:0] bits (Microcontroller Clock Output) */ +#define RCC_MCO_0 ((uint32_t)0x01000000) /* Bit 0 */ +#define RCC_MCO_1 ((uint32_t)0x02000000) /* Bit 1 */ +#define RCC_MCO_2 ((uint32_t)0x04000000) /* Bit 2 */ + +#define RCC_MCO_NOCLOCK ((uint32_t)0x00000000) /* No clock */ +#define RCC_CFGR0_MCO_SYSCLK ((uint32_t)0x04000000) /* System clock selected as MCO source */ +#define RCC_CFGR0_MCO_HSI ((uint32_t)0x05000000) /* HSI clock selected as MCO source */ +#define RCC_CFGR0_MCO_HSE ((uint32_t)0x06000000) /* HSE clock selected as MCO source */ +#define RCC_CFGR0_MCO_PLL ((uint32_t)0x07000000) /* PLL clock divided by 2 selected as MCO source */ + +/******************* Bit definition for RCC_INTR register ********************/ +#define RCC_LSIRDYF ((uint32_t)0x00000001) /* LSI Ready Interrupt flag */ +#define RCC_LSERDYF ((uint32_t)0x00000002) /* LSE Ready Interrupt flag */ +#define RCC_HSIRDYF ((uint32_t)0x00000004) /* HSI Ready Interrupt flag */ +#define RCC_HSERDYF ((uint32_t)0x00000008) /* HSE Ready Interrupt flag */ +#define RCC_PLLRDYF ((uint32_t)0x00000010) /* PLL Ready Interrupt flag */ +#define RCC_CSSF ((uint32_t)0x00000080) /* Clock Security System Interrupt flag */ +#define RCC_LSIRDYIE ((uint32_t)0x00000100) /* LSI Ready Interrupt Enable */ +#define RCC_LSERDYIE ((uint32_t)0x00000200) /* LSE Ready Interrupt Enable */ +#define RCC_HSIRDYIE ((uint32_t)0x00000400) /* HSI Ready Interrupt Enable */ +#define RCC_HSERDYIE ((uint32_t)0x00000800) /* HSE Ready Interrupt Enable */ +#define RCC_PLLRDYIE ((uint32_t)0x00001000) /* PLL Ready Interrupt Enable */ +#define RCC_LSIRDYC ((uint32_t)0x00010000) /* LSI Ready Interrupt Clear */ +#define RCC_LSERDYC ((uint32_t)0x00020000) /* LSE Ready Interrupt Clear */ +#define RCC_HSIRDYC ((uint32_t)0x00040000) /* HSI Ready Interrupt Clear */ +#define RCC_HSERDYC ((uint32_t)0x00080000) /* HSE Ready Interrupt Clear */ +#define RCC_PLLRDYC ((uint32_t)0x00100000) /* PLL Ready Interrupt Clear */ +#define RCC_CSSC ((uint32_t)0x00800000) /* Clock Security System Interrupt Clear */ + +/***************** Bit definition for RCC_APB2PRSTR register *****************/ +#define RCC_AFIORST ((uint32_t)0x00000001) /* Alternate Function I/O reset */ +#define RCC_IOPARST ((uint32_t)0x00000004) /* I/O port A reset */ +#define RCC_IOPBRST ((uint32_t)0x00000008) /* I/O port B reset */ +#define RCC_IOPCRST ((uint32_t)0x00000010) /* I/O port C reset */ +#define RCC_IOPDRST ((uint32_t)0x00000020) /* I/O port D reset */ +#define RCC_ADC1RST ((uint32_t)0x00000200) /* ADC 1 interface reset */ + +#define RCC_ADC2RST ((uint32_t)0x00000400) /* ADC 2 interface reset */ + +#define RCC_TIM1RST ((uint32_t)0x00000800) /* TIM1 Timer reset */ +#define RCC_SPI1RST ((uint32_t)0x00001000) /* SPI 1 reset */ +#define RCC_USART1RST ((uint32_t)0x00004000) /* USART1 reset */ + +#define RCC_IOPERST ((uint32_t)0x00000040) /* I/O port E reset */ + +/***************** Bit definition for RCC_APB1PRSTR register *****************/ +#define RCC_TIM2RST ((uint32_t)0x00000001) /* Timer 2 reset */ +#define RCC_TIM3RST ((uint32_t)0x00000002) /* Timer 3 reset */ +#define RCC_WWDGRST ((uint32_t)0x00000800) /* Window Watchdog reset */ +#define RCC_USART2RST ((uint32_t)0x00020000) /* USART 2 reset */ +#define RCC_I2C1RST ((uint32_t)0x00200000) /* I2C 1 reset */ + +#define RCC_CAN1RST ((uint32_t)0x02000000) /* CAN1 reset */ + +#define RCC_BKPRST ((uint32_t)0x08000000) /* Backup interface reset */ +#define RCC_PWRRST ((uint32_t)0x10000000) /* Power interface reset */ + +#define RCC_TIM4RST ((uint32_t)0x00000004) /* Timer 4 reset */ +#define RCC_SPI2RST ((uint32_t)0x00004000) /* SPI 2 reset */ +#define RCC_USART3RST ((uint32_t)0x00040000) /* USART 3 reset */ +#define RCC_I2C2RST ((uint32_t)0x00400000) /* I2C 2 reset */ + +#define RCC_USBRST ((uint32_t)0x00800000) /* USB Device reset */ + +/****************** Bit definition for RCC_AHBPCENR register ******************/ +#define RCC_DMA1EN ((uint16_t)0x0001) /* DMA1 clock enable */ +#define RCC_SRAMEN ((uint16_t)0x0004) /* SRAM interface clock enable */ +#define RCC_FLITFEN ((uint16_t)0x0010) /* FLITF clock enable */ +#define RCC_CRCEN ((uint16_t)0x0040) /* CRC clock enable */ +#define RCC_USBHD ((uint16_t)0x1000) + +/****************** Bit definition for RCC_APB2PCENR register *****************/ +#define RCC_AFIOEN ((uint32_t)0x00000001) /* Alternate Function I/O clock enable */ +#define RCC_IOPAEN ((uint32_t)0x00000004) /* I/O port A clock enable */ +#define RCC_IOPBEN ((uint32_t)0x00000008) /* I/O port B clock enable */ +#define RCC_IOPCEN ((uint32_t)0x00000010) /* I/O port C clock enable */ +#define RCC_IOPDEN ((uint32_t)0x00000020) /* I/O port D clock enable */ +#define RCC_ADC1EN ((uint32_t)0x00000200) /* ADC 1 interface clock enable */ + +#define RCC_ADC2EN ((uint32_t)0x00000400) /* ADC 2 interface clock enable */ + +#define RCC_TIM1EN ((uint32_t)0x00000800) /* TIM1 Timer clock enable */ +#define RCC_SPI1EN ((uint32_t)0x00001000) /* SPI 1 clock enable */ +#define RCC_USART1EN ((uint32_t)0x00004000) /* USART1 clock enable */ + +/***************** Bit definition for RCC_APB1PCENR register ******************/ +#define RCC_TIM2EN ((uint32_t)0x00000001) /* Timer 2 clock enabled*/ +#define RCC_TIM3EN ((uint32_t)0x00000002) /* Timer 3 clock enable */ +#define RCC_WWDGEN ((uint32_t)0x00000800) /* Window Watchdog clock enable */ +#define RCC_USART2EN ((uint32_t)0x00020000) /* USART 2 clock enable */ +#define RCC_I2C1EN ((uint32_t)0x00200000) /* I2C 1 clock enable */ + +#define RCC_BKPEN ((uint32_t)0x08000000) /* Backup interface clock enable */ +#define RCC_PWREN ((uint32_t)0x10000000) /* Power interface clock enable */ + +#define RCC_USBEN ((uint32_t)0x00800000) /* USB Device clock enable */ + +/******************* Bit definition for RCC_BDCTLR register *******************/ +#define RCC_LSEON ((uint32_t)0x00000001) /* External Low Speed oscillator enable */ +#define RCC_LSERDY ((uint32_t)0x00000002) /* External Low Speed oscillator Ready */ +#define RCC_LSEBYP ((uint32_t)0x00000004) /* External Low Speed oscillator Bypass */ + +#define RCC_RTCSEL ((uint32_t)0x00000300) /* RTCSEL[1:0] bits (RTC clock source selection) */ +#define RCC_RTCSEL_0 ((uint32_t)0x00000100) /* Bit 0 */ +#define RCC_RTCSEL_1 ((uint32_t)0x00000200) /* Bit 1 */ + +#define RCC_RTCSEL_NOCLOCK ((uint32_t)0x00000000) /* No clock */ +#define RCC_RTCSEL_LSE ((uint32_t)0x00000100) /* LSE oscillator clock used as RTC clock */ +#define RCC_RTCSEL_LSI ((uint32_t)0x00000200) /* LSI oscillator clock used as RTC clock */ +#define RCC_RTCSEL_HSE ((uint32_t)0x00000300) /* HSE oscillator clock divided by 128 used as RTC clock */ + +#define RCC_RTCEN ((uint32_t)0x00008000) /* RTC clock enable */ +#define RCC_BDRST ((uint32_t)0x00010000) /* Backup domain software reset */ + +/******************* Bit definition for RCC_RSTSCKR register ********************/ +#define RCC_LSION ((uint32_t)0x00000001) /* Internal Low Speed oscillator enable */ +#define RCC_LSIRDY ((uint32_t)0x00000002) /* Internal Low Speed oscillator Ready */ +#define RCC_RMVF ((uint32_t)0x01000000) /* Remove reset flag */ +#define RCC_PINRSTF ((uint32_t)0x04000000) /* PIN reset flag */ +#define RCC_PORRSTF ((uint32_t)0x08000000) /* POR/PDR reset flag */ +#define RCC_SFTRSTF ((uint32_t)0x10000000) /* Software Reset flag */ +#define RCC_IWDGRSTF ((uint32_t)0x20000000) /* Independent Watchdog reset flag */ +#define RCC_WWDGRSTF ((uint32_t)0x40000000) /* Window watchdog reset flag */ +#define RCC_LPWRRSTF ((uint32_t)0x80000000) /* Low-Power reset flag */ + +/******************************************************************************/ +/* Real-Time Clock */ +/******************************************************************************/ + +/******************* Bit definition for RTC_CTLRH register ********************/ +#define RTC_CTLRH_SECIE ((uint8_t)0x01) /* Second Interrupt Enable */ +#define RTC_CTLRH_ALRIE ((uint8_t)0x02) /* Alarm Interrupt Enable */ +#define RTC_CTLRH_OWIE ((uint8_t)0x04) /* OverfloW Interrupt Enable */ + +/******************* Bit definition for RTC_CTLRL register ********************/ +#define RTC_CTLRL_SECF ((uint8_t)0x01) /* Second Flag */ +#define RTC_CTLRL_ALRF ((uint8_t)0x02) /* Alarm Flag */ +#define RTC_CTLRL_OWF ((uint8_t)0x04) /* OverfloW Flag */ +#define RTC_CTLRL_RSF ((uint8_t)0x08) /* Registers Synchronized Flag */ +#define RTC_CTLRL_CNF ((uint8_t)0x10) /* Configuration Flag */ +#define RTC_CTLRL_RTOFF ((uint8_t)0x20) /* RTC operation OFF */ + +/******************* Bit definition for RTC_PSCH register *******************/ +#define RTC_PSCH_PRL ((uint16_t)0x000F) /* RTC Prescaler Reload Value High */ + +/******************* Bit definition for RTC_PRLL register *******************/ +#define RTC_PSCL_PRL ((uint16_t)0xFFFF) /* RTC Prescaler Reload Value Low */ + +/******************* Bit definition for RTC_DIVH register *******************/ +#define RTC_DIVH_RTC_DIV ((uint16_t)0x000F) /* RTC Clock Divider High */ + +/******************* Bit definition for RTC_DIVL register *******************/ +#define RTC_DIVL_RTC_DIV ((uint16_t)0xFFFF) /* RTC Clock Divider Low */ + +/******************* Bit definition for RTC_CNTH register *******************/ +#define RTC_CNTH_RTC_CNT ((uint16_t)0xFFFF) /* RTC Counter High */ + +/******************* Bit definition for RTC_CNTL register *******************/ +#define RTC_CNTL_RTC_CNT ((uint16_t)0xFFFF) /* RTC Counter Low */ + +/******************* Bit definition for RTC_ALRMH register *******************/ +#define RTC_ALRMH_RTC_ALRM ((uint16_t)0xFFFF) /* RTC Alarm High */ + +/******************* Bit definition for RTC_ALRML register *******************/ +#define RTC_ALRML_RTC_ALRM ((uint16_t)0xFFFF) /* RTC Alarm Low */ + +/******************************************************************************/ +/* Serial Peripheral Interface */ +/******************************************************************************/ + +/******************* Bit definition for SPI_CTLR1 register ********************/ +#define SPI_CTLR1_CPHA ((uint16_t)0x0001) /* Clock Phase */ +#define SPI_CTLR1_CPOL ((uint16_t)0x0002) /* Clock Polarity */ +#define SPI_CTLR1_MSTR ((uint16_t)0x0004) /* Master Selection */ + +#define SPI_CTLR1_BR ((uint16_t)0x0038) /* BR[2:0] bits (Baud Rate Control) */ +#define SPI_CTLR1_BR_0 ((uint16_t)0x0008) /* Bit 0 */ +#define SPI_CTLR1_BR_1 ((uint16_t)0x0010) /* Bit 1 */ +#define SPI_CTLR1_BR_2 ((uint16_t)0x0020) /* Bit 2 */ + +#define SPI_CTLR1_SPE ((uint16_t)0x0040) /* SPI Enable */ +#define SPI_CTLR1_LSBFIRST ((uint16_t)0x0080) /* Frame Format */ +#define SPI_CTLR1_SSI ((uint16_t)0x0100) /* Internal slave select */ +#define SPI_CTLR1_SSM ((uint16_t)0x0200) /* Software slave management */ +#define SPI_CTLR1_RXONLY ((uint16_t)0x0400) /* Receive only */ +#define SPI_CTLR1_DFF ((uint16_t)0x0800) /* Data Frame Format */ +#define SPI_CTLR1_CRCNEXT ((uint16_t)0x1000) /* Transmit CRC next */ +#define SPI_CTLR1_CRCEN ((uint16_t)0x2000) /* Hardware CRC calculation enable */ +#define SPI_CTLR1_BIDIOE ((uint16_t)0x4000) /* Output enable in bidirectional mode */ +#define SPI_CTLR1_BIDIMODE ((uint16_t)0x8000) /* Bidirectional data mode enable */ + +/******************* Bit definition for SPI_CTLR2 register ********************/ +#define SPI_CTLR2_RXDMAEN ((uint8_t)0x01) /* Rx Buffer DMA Enable */ +#define SPI_CTLR2_TXDMAEN ((uint8_t)0x02) /* Tx Buffer DMA Enable */ +#define SPI_CTLR2_SSOE ((uint8_t)0x04) /* SS Output Enable */ +#define SPI_CTLR2_ERRIE ((uint8_t)0x20) /* Error Interrupt Enable */ +#define SPI_CTLR2_RXNEIE ((uint8_t)0x40) /* RX buffer Not Empty Interrupt Enable */ +#define SPI_CTLR2_TXEIE ((uint8_t)0x80) /* Tx buffer Empty Interrupt Enable */ + +/******************** Bit definition for SPI_STATR register ********************/ +#define SPI_STATR_RXNE ((uint8_t)0x01) /* Receive buffer Not Empty */ +#define SPI_STATR_TXE ((uint8_t)0x02) /* Transmit buffer Empty */ +#define SPI_STATR_CHSIDE ((uint8_t)0x04) /* Channel side */ +#define SPI_STATR_UDR ((uint8_t)0x08) /* Underrun flag */ +#define SPI_STATR_CRCERR ((uint8_t)0x10) /* CRC Error flag */ +#define SPI_STATR_MODF ((uint8_t)0x20) /* Mode fault */ +#define SPI_STATR_OVR ((uint8_t)0x40) /* Overrun flag */ +#define SPI_STATR_BSY ((uint8_t)0x80) /* Busy flag */ + +/******************** Bit definition for SPI_DATAR register ********************/ +#define SPI_DATAR_DR ((uint16_t)0xFFFF) /* Data Register */ + +/******************* Bit definition for SPI_CRCR register ******************/ +#define SPI_CRCR_CRCPOLY ((uint16_t)0xFFFF) /* CRC polynomial register */ + +/****************** Bit definition for SPI_RCRCR register ******************/ +#define SPI_RCRCR_RXCRC ((uint16_t)0xFFFF) /* Rx CRC Register */ + +/****************** Bit definition for SPI_TCRCR register ******************/ +#define SPI_TCRCR_TXCRC ((uint16_t)0xFFFF) /* Tx CRC Register */ + +/****************** Bit definition for SPI_I2SCFGR register *****************/ +#define SPI_I2SCFGR_CHLEN ((uint16_t)0x0001) /* Channel length (number of bits per audio channel) */ + +#define SPI_I2SCFGR_DATLEN ((uint16_t)0x0006) /* DATLEN[1:0] bits (Data length to be transferred) */ +#define SPI_I2SCFGR_DATLEN_0 ((uint16_t)0x0002) /* Bit 0 */ +#define SPI_I2SCFGR_DATLEN_1 ((uint16_t)0x0004) /* Bit 1 */ + +#define SPI_I2SCFGR_CKPOL ((uint16_t)0x0008) /* steady state clock polarity */ + +#define SPI_I2SCFGR_I2SSTD ((uint16_t)0x0030) /* I2SSTD[1:0] bits (I2S standard selection) */ +#define SPI_I2SCFGR_I2SSTD_0 ((uint16_t)0x0010) /* Bit 0 */ +#define SPI_I2SCFGR_I2SSTD_1 ((uint16_t)0x0020) /* Bit 1 */ + +#define SPI_I2SCFGR_PCMSYNC ((uint16_t)0x0080) /* PCM frame synchronization */ + +#define SPI_I2SCFGR_I2SCFG ((uint16_t)0x0300) /* I2SCFG[1:0] bits (I2S configuration mode) */ +#define SPI_I2SCFGR_I2SCFG_0 ((uint16_t)0x0100) /* Bit 0 */ +#define SPI_I2SCFGR_I2SCFG_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define SPI_I2SCFGR_I2SE ((uint16_t)0x0400) /* I2S Enable */ +#define SPI_I2SCFGR_I2SMOD ((uint16_t)0x0800) /* I2S mode selection */ + +/****************** Bit definition for SPI_I2SPR register *******************/ +#define SPI_I2SPR_I2SDIV ((uint16_t)0x00FF) /* I2S Linear prescaler */ +#define SPI_I2SPR_ODD ((uint16_t)0x0100) /* Odd factor for the prescaler */ +#define SPI_I2SPR_MCKOE ((uint16_t)0x0200) /* Master Clock Output Enable */ + +/******************************************************************************/ +/* TIM */ +/******************************************************************************/ + +/******************* Bit definition for TIM_CTLR1 register ********************/ +#define TIM_CEN ((uint16_t)0x0001) /* Counter enable */ +#define TIM_UDIS ((uint16_t)0x0002) /* Update disable */ +#define TIM_URS ((uint16_t)0x0004) /* Update request source */ +#define TIM_OPM ((uint16_t)0x0008) /* One pulse mode */ +#define TIM_DIR ((uint16_t)0x0010) /* Direction */ + +#define TIM_CMS ((uint16_t)0x0060) /* CMS[1:0] bits (Center-aligned mode selection) */ +#define TIM_CMS_0 ((uint16_t)0x0020) /* Bit 0 */ +#define TIM_CMS_1 ((uint16_t)0x0040) /* Bit 1 */ + +#define TIM_ARPE ((uint16_t)0x0080) /* Auto-reload preload enable */ + +#define TIM_CTLR1_CKD ((uint16_t)0x0300) /* CKD[1:0] bits (clock division) */ +#define TIM_CKD_0 ((uint16_t)0x0100) /* Bit 0 */ +#define TIM_CKD_1 ((uint16_t)0x0200) /* Bit 1 */ + +/******************* Bit definition for TIM_CTLR2 register ********************/ +#define TIM_CCPC ((uint16_t)0x0001) /* Capture/Compare Preloaded Control */ +#define TIM_CCUS ((uint16_t)0x0004) /* Capture/Compare Control Update Selection */ +#define TIM_CCDS ((uint16_t)0x0008) /* Capture/Compare DMA Selection */ + +#define TIM_MMS ((uint16_t)0x0070) /* MMS[2:0] bits (Master Mode Selection) */ +#define TIM_MMS_0 ((uint16_t)0x0010) /* Bit 0 */ +#define TIM_MMS_1 ((uint16_t)0x0020) /* Bit 1 */ +#define TIM_MMS_2 ((uint16_t)0x0040) /* Bit 2 */ + +#define TIM_TI1S ((uint16_t)0x0080) /* TI1 Selection */ +#define TIM_OIS1 ((uint16_t)0x0100) /* Output Idle state 1 (OC1 output) */ +#define TIM_OIS1N ((uint16_t)0x0200) /* Output Idle state 1 (OC1N output) */ +#define TIM_OIS2 ((uint16_t)0x0400) /* Output Idle state 2 (OC2 output) */ +#define TIM_OIS2N ((uint16_t)0x0800) /* Output Idle state 2 (OC2N output) */ +#define TIM_OIS3 ((uint16_t)0x1000) /* Output Idle state 3 (OC3 output) */ +#define TIM_OIS3N ((uint16_t)0x2000) /* Output Idle state 3 (OC3N output) */ +#define TIM_OIS4 ((uint16_t)0x4000) /* Output Idle state 4 (OC4 output) */ + +/******************* Bit definition for TIM_SMCFGR register *******************/ +#define TIM_SMS ((uint16_t)0x0007) /* SMS[2:0] bits (Slave mode selection) */ +#define TIM_SMS_0 ((uint16_t)0x0001) /* Bit 0 */ +#define TIM_SMS_1 ((uint16_t)0x0002) /* Bit 1 */ +#define TIM_SMS_2 ((uint16_t)0x0004) /* Bit 2 */ + +#define TIM_TS ((uint16_t)0x0070) /* TS[2:0] bits (Trigger selection) */ +#define TIM_TS_0 ((uint16_t)0x0010) /* Bit 0 */ +#define TIM_TS_1 ((uint16_t)0x0020) /* Bit 1 */ +#define TIM_TS_2 ((uint16_t)0x0040) /* Bit 2 */ + +#define TIM_MSM ((uint16_t)0x0080) /* Master/slave mode */ + +#define TIM_ETF ((uint16_t)0x0F00) /* ETF[3:0] bits (External trigger filter) */ +#define TIM_ETF_0 ((uint16_t)0x0100) /* Bit 0 */ +#define TIM_ETF_1 ((uint16_t)0x0200) /* Bit 1 */ +#define TIM_ETF_2 ((uint16_t)0x0400) /* Bit 2 */ +#define TIM_ETF_3 ((uint16_t)0x0800) /* Bit 3 */ + +#define TIM_ETPS ((uint16_t)0x3000) /* ETPS[1:0] bits (External trigger prescaler) */ +#define TIM_ETPS_0 ((uint16_t)0x1000) /* Bit 0 */ +#define TIM_ETPS_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define TIM_ECE ((uint16_t)0x4000) /* External clock enable */ +#define TIM_ETP ((uint16_t)0x8000) /* External trigger polarity */ + +/******************* Bit definition for TIM_DMAINTENR register *******************/ +#define TIM_UIE ((uint16_t)0x0001) /* Update interrupt enable */ +#define TIM_CC1IE ((uint16_t)0x0002) /* Capture/Compare 1 interrupt enable */ +#define TIM_CC2IE ((uint16_t)0x0004) /* Capture/Compare 2 interrupt enable */ +#define TIM_CC3IE ((uint16_t)0x0008) /* Capture/Compare 3 interrupt enable */ +#define TIM_CC4IE ((uint16_t)0x0010) /* Capture/Compare 4 interrupt enable */ +#define TIM_COMIE ((uint16_t)0x0020) /* COM interrupt enable */ +#define TIM_TIE ((uint16_t)0x0040) /* Trigger interrupt enable */ +#define TIM_BIE ((uint16_t)0x0080) /* Break interrupt enable */ +#define TIM_UDE ((uint16_t)0x0100) /* Update DMA request enable */ +#define TIM_CC1DE ((uint16_t)0x0200) /* Capture/Compare 1 DMA request enable */ +#define TIM_CC2DE ((uint16_t)0x0400) /* Capture/Compare 2 DMA request enable */ +#define TIM_CC3DE ((uint16_t)0x0800) /* Capture/Compare 3 DMA request enable */ +#define TIM_CC4DE ((uint16_t)0x1000) /* Capture/Compare 4 DMA request enable */ +#define TIM_COMDE ((uint16_t)0x2000) /* COM DMA request enable */ +#define TIM_TDE ((uint16_t)0x4000) /* Trigger DMA request enable */ + +/******************** Bit definition for TIM_INTFR register ********************/ +#define TIM_UIF ((uint16_t)0x0001) /* Update interrupt Flag */ +#define TIM_CC1IF ((uint16_t)0x0002) /* Capture/Compare 1 interrupt Flag */ +#define TIM_CC2IF ((uint16_t)0x0004) /* Capture/Compare 2 interrupt Flag */ +#define TIM_CC3IF ((uint16_t)0x0008) /* Capture/Compare 3 interrupt Flag */ +#define TIM_CC4IF ((uint16_t)0x0010) /* Capture/Compare 4 interrupt Flag */ +#define TIM_COMIF ((uint16_t)0x0020) /* COM interrupt Flag */ +#define TIM_TIF ((uint16_t)0x0040) /* Trigger interrupt Flag */ +#define TIM_BIF ((uint16_t)0x0080) /* Break interrupt Flag */ +#define TIM_CC1OF ((uint16_t)0x0200) /* Capture/Compare 1 Overcapture Flag */ +#define TIM_CC2OF ((uint16_t)0x0400) /* Capture/Compare 2 Overcapture Flag */ +#define TIM_CC3OF ((uint16_t)0x0800) /* Capture/Compare 3 Overcapture Flag */ +#define TIM_CC4OF ((uint16_t)0x1000) /* Capture/Compare 4 Overcapture Flag */ + +/******************* Bit definition for TIM_SWEVGR register ********************/ +#define TIM_UG ((uint8_t)0x01) /* Update Generation */ +#define TIM_CC1G ((uint8_t)0x02) /* Capture/Compare 1 Generation */ +#define TIM_CC2G ((uint8_t)0x04) /* Capture/Compare 2 Generation */ +#define TIM_CC3G ((uint8_t)0x08) /* Capture/Compare 3 Generation */ +#define TIM_CC4G ((uint8_t)0x10) /* Capture/Compare 4 Generation */ +#define TIM_COMG ((uint8_t)0x20) /* Capture/Compare Control Update Generation */ +#define TIM_TG ((uint8_t)0x40) /* Trigger Generation */ +#define TIM_BG ((uint8_t)0x80) /* Break Generation */ + +/****************** Bit definition for TIM_CHCTLR1 register *******************/ +#define TIM_CC1S ((uint16_t)0x0003) /* CC1S[1:0] bits (Capture/Compare 1 Selection) */ +#define TIM_CC1S_0 ((uint16_t)0x0001) /* Bit 0 */ +#define TIM_CC1S_1 ((uint16_t)0x0002) /* Bit 1 */ + +#define TIM_OC1FE ((uint16_t)0x0004) /* Output Compare 1 Fast enable */ +#define TIM_OC1PE ((uint16_t)0x0008) /* Output Compare 1 Preload enable */ + +#define TIM_OC1M ((uint16_t)0x0070) /* OC1M[2:0] bits (Output Compare 1 Mode) */ +#define TIM_OC1M_0 ((uint16_t)0x0010) /* Bit 0 */ +#define TIM_OC1M_1 ((uint16_t)0x0020) /* Bit 1 */ +#define TIM_OC1M_2 ((uint16_t)0x0040) /* Bit 2 */ + +#define TIM_OC1CE ((uint16_t)0x0080) /* Output Compare 1Clear Enable */ + +#define TIM_CC2S ((uint16_t)0x0300) /* CC2S[1:0] bits (Capture/Compare 2 Selection) */ +#define TIM_CC2S_0 ((uint16_t)0x0100) /* Bit 0 */ +#define TIM_CC2S_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define TIM_OC2FE ((uint16_t)0x0400) /* Output Compare 2 Fast enable */ +#define TIM_OC2PE ((uint16_t)0x0800) /* Output Compare 2 Preload enable */ + +#define TIM_OC2M ((uint16_t)0x7000) /* OC2M[2:0] bits (Output Compare 2 Mode) */ +#define TIM_OC2M_0 ((uint16_t)0x1000) /* Bit 0 */ +#define TIM_OC2M_1 ((uint16_t)0x2000) /* Bit 1 */ +#define TIM_OC2M_2 ((uint16_t)0x4000) /* Bit 2 */ + +#define TIM_OC2CE ((uint16_t)0x8000) /* Output Compare 2 Clear Enable */ + +#define TIM_IC1PSC ((uint16_t)0x000C) /* IC1PSC[1:0] bits (Input Capture 1 Prescaler) */ +#define TIM_IC1PSC_0 ((uint16_t)0x0004) /* Bit 0 */ +#define TIM_IC1PSC_1 ((uint16_t)0x0008) /* Bit 1 */ + +#define TIM_IC1F ((uint16_t)0x00F0) /* IC1F[3:0] bits (Input Capture 1 Filter) */ +#define TIM_IC1F_0 ((uint16_t)0x0010) /* Bit 0 */ +#define TIM_IC1F_1 ((uint16_t)0x0020) /* Bit 1 */ +#define TIM_IC1F_2 ((uint16_t)0x0040) /* Bit 2 */ +#define TIM_IC1F_3 ((uint16_t)0x0080) /* Bit 3 */ + +#define TIM_IC2PSC ((uint16_t)0x0C00) /* IC2PSC[1:0] bits (Input Capture 2 Prescaler) */ +#define TIM_IC2PSC_0 ((uint16_t)0x0400) /* Bit 0 */ +#define TIM_IC2PSC_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define TIM_IC2F ((uint16_t)0xF000) /* IC2F[3:0] bits (Input Capture 2 Filter) */ +#define TIM_IC2F_0 ((uint16_t)0x1000) /* Bit 0 */ +#define TIM_IC2F_1 ((uint16_t)0x2000) /* Bit 1 */ +#define TIM_IC2F_2 ((uint16_t)0x4000) /* Bit 2 */ +#define TIM_IC2F_3 ((uint16_t)0x8000) /* Bit 3 */ + +/****************** Bit definition for TIM_CHCTLR2 register *******************/ +#define TIM_CC3S ((uint16_t)0x0003) /* CC3S[1:0] bits (Capture/Compare 3 Selection) */ +#define TIM_CC3S_0 ((uint16_t)0x0001) /* Bit 0 */ +#define TIM_CC3S_1 ((uint16_t)0x0002) /* Bit 1 */ + +#define TIM_OC3FE ((uint16_t)0x0004) /* Output Compare 3 Fast enable */ +#define TIM_OC3PE ((uint16_t)0x0008) /* Output Compare 3 Preload enable */ + +#define TIM_OC3M ((uint16_t)0x0070) /* OC3M[2:0] bits (Output Compare 3 Mode) */ +#define TIM_OC3M_0 ((uint16_t)0x0010) /* Bit 0 */ +#define TIM_OC3M_1 ((uint16_t)0x0020) /* Bit 1 */ +#define TIM_OC3M_2 ((uint16_t)0x0040) /* Bit 2 */ + +#define TIM_OC3CE ((uint16_t)0x0080) /* Output Compare 3 Clear Enable */ + +#define TIM_CC4S ((uint16_t)0x0300) /* CC4S[1:0] bits (Capture/Compare 4 Selection) */ +#define TIM_CC4S_0 ((uint16_t)0x0100) /* Bit 0 */ +#define TIM_CC4S_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define TIM_OC4FE ((uint16_t)0x0400) /* Output Compare 4 Fast enable */ +#define TIM_OC4PE ((uint16_t)0x0800) /* Output Compare 4 Preload enable */ + +#define TIM_OC4M ((uint16_t)0x7000) /* OC4M[2:0] bits (Output Compare 4 Mode) */ +#define TIM_OC4M_0 ((uint16_t)0x1000) /* Bit 0 */ +#define TIM_OC4M_1 ((uint16_t)0x2000) /* Bit 1 */ +#define TIM_OC4M_2 ((uint16_t)0x4000) /* Bit 2 */ + +#define TIM_OC4CE ((uint16_t)0x8000) /* Output Compare 4 Clear Enable */ + +#define TIM_IC3PSC ((uint16_t)0x000C) /* IC3PSC[1:0] bits (Input Capture 3 Prescaler) */ +#define TIM_IC3PSC_0 ((uint16_t)0x0004) /* Bit 0 */ +#define TIM_IC3PSC_1 ((uint16_t)0x0008) /* Bit 1 */ + +#define TIM_IC3F ((uint16_t)0x00F0) /* IC3F[3:0] bits (Input Capture 3 Filter) */ +#define TIM_IC3F_0 ((uint16_t)0x0010) /* Bit 0 */ +#define TIM_IC3F_1 ((uint16_t)0x0020) /* Bit 1 */ +#define TIM_IC3F_2 ((uint16_t)0x0040) /* Bit 2 */ +#define TIM_IC3F_3 ((uint16_t)0x0080) /* Bit 3 */ + +#define TIM_IC4PSC ((uint16_t)0x0C00) /* IC4PSC[1:0] bits (Input Capture 4 Prescaler) */ +#define TIM_IC4PSC_0 ((uint16_t)0x0400) /* Bit 0 */ +#define TIM_IC4PSC_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define TIM_IC4F ((uint16_t)0xF000) /* IC4F[3:0] bits (Input Capture 4 Filter) */ +#define TIM_IC4F_0 ((uint16_t)0x1000) /* Bit 0 */ +#define TIM_IC4F_1 ((uint16_t)0x2000) /* Bit 1 */ +#define TIM_IC4F_2 ((uint16_t)0x4000) /* Bit 2 */ +#define TIM_IC4F_3 ((uint16_t)0x8000) /* Bit 3 */ + +/******************* Bit definition for TIM_CCER register *******************/ +#define TIM_CC1E ((uint16_t)0x0001) /* Capture/Compare 1 output enable */ +#define TIM_CC1P ((uint16_t)0x0002) /* Capture/Compare 1 output Polarity */ +#define TIM_CC1NE ((uint16_t)0x0004) /* Capture/Compare 1 Complementary output enable */ +#define TIM_CC1NP ((uint16_t)0x0008) /* Capture/Compare 1 Complementary output Polarity */ +#define TIM_CC2E ((uint16_t)0x0010) /* Capture/Compare 2 output enable */ +#define TIM_CC2P ((uint16_t)0x0020) /* Capture/Compare 2 output Polarity */ +#define TIM_CC2NE ((uint16_t)0x0040) /* Capture/Compare 2 Complementary output enable */ +#define TIM_CC2NP ((uint16_t)0x0080) /* Capture/Compare 2 Complementary output Polarity */ +#define TIM_CC3E ((uint16_t)0x0100) /* Capture/Compare 3 output enable */ +#define TIM_CC3P ((uint16_t)0x0200) /* Capture/Compare 3 output Polarity */ +#define TIM_CC3NE ((uint16_t)0x0400) /* Capture/Compare 3 Complementary output enable */ +#define TIM_CC3NP ((uint16_t)0x0800) /* Capture/Compare 3 Complementary output Polarity */ +#define TIM_CC4E ((uint16_t)0x1000) /* Capture/Compare 4 output enable */ +#define TIM_CC4P ((uint16_t)0x2000) /* Capture/Compare 4 output Polarity */ +#define TIM_CC4NP ((uint16_t)0x8000) /* Capture/Compare 4 Complementary output Polarity */ + +/******************* Bit definition for TIM_CNT register ********************/ +#define TIM_CNT ((uint16_t)0xFFFF) /* Counter Value */ + +/******************* Bit definition for TIM_PSC register ********************/ +#define TIM_PSC ((uint16_t)0xFFFF) /* Prescaler Value */ + +/******************* Bit definition for TIM_ATRLR register ********************/ +#define TIM_ARR ((uint16_t)0xFFFF) /* actual auto-reload Value */ + +/******************* Bit definition for TIM_RPTCR register ********************/ +#define TIM_REP ((uint8_t)0xFF) /* Repetition Counter Value */ + +/******************* Bit definition for TIM_CH1CVR register *******************/ +#define TIM_CCR1 ((uint16_t)0xFFFF) /* Capture/Compare 1 Value */ + +/******************* Bit definition for TIM_CH2CVR register *******************/ +#define TIM_CCR2 ((uint16_t)0xFFFF) /* Capture/Compare 2 Value */ + +/******************* Bit definition for TIM_CH3CVR register *******************/ +#define TIM_CCR3 ((uint16_t)0xFFFF) /* Capture/Compare 3 Value */ + +/******************* Bit definition for TIM_CH4CVR register *******************/ +#define TIM_CCR4 ((uint16_t)0xFFFF) /* Capture/Compare 4 Value */ + +/******************* Bit definition for TIM_BDTR register *******************/ +#define TIM_DTG ((uint16_t)0x00FF) /* DTG[0:7] bits (Dead-Time Generator set-up) */ +#define TIM_DTG_0 ((uint16_t)0x0001) /* Bit 0 */ +#define TIM_DTG_1 ((uint16_t)0x0002) /* Bit 1 */ +#define TIM_DTG_2 ((uint16_t)0x0004) /* Bit 2 */ +#define TIM_DTG_3 ((uint16_t)0x0008) /* Bit 3 */ +#define TIM_DTG_4 ((uint16_t)0x0010) /* Bit 4 */ +#define TIM_DTG_5 ((uint16_t)0x0020) /* Bit 5 */ +#define TIM_DTG_6 ((uint16_t)0x0040) /* Bit 6 */ +#define TIM_DTG_7 ((uint16_t)0x0080) /* Bit 7 */ + +#define TIM_LOCK ((uint16_t)0x0300) /* LOCK[1:0] bits (Lock Configuration) */ +#define TIM_LOCK_0 ((uint16_t)0x0100) /* Bit 0 */ +#define TIM_LOCK_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define TIM_OSSI ((uint16_t)0x0400) /* Off-State Selection for Idle mode */ +#define TIM_OSSR ((uint16_t)0x0800) /* Off-State Selection for Run mode */ +#define TIM_BKE ((uint16_t)0x1000) /* Break enable */ +#define TIM_BKP ((uint16_t)0x2000) /* Break Polarity */ +#define TIM_AOE ((uint16_t)0x4000) /* Automatic Output enable */ +#define TIM_MOE ((uint16_t)0x8000) /* Main Output enable */ + +/******************* Bit definition for TIM_DMACFGR register ********************/ +#define TIM_DBA ((uint16_t)0x001F) /* DBA[4:0] bits (DMA Base Address) */ +#define TIM_DBA_0 ((uint16_t)0x0001) /* Bit 0 */ +#define TIM_DBA_1 ((uint16_t)0x0002) /* Bit 1 */ +#define TIM_DBA_2 ((uint16_t)0x0004) /* Bit 2 */ +#define TIM_DBA_3 ((uint16_t)0x0008) /* Bit 3 */ +#define TIM_DBA_4 ((uint16_t)0x0010) /* Bit 4 */ + +#define TIM_DBL ((uint16_t)0x1F00) /* DBL[4:0] bits (DMA Burst Length) */ +#define TIM_DBL_0 ((uint16_t)0x0100) /* Bit 0 */ +#define TIM_DBL_1 ((uint16_t)0x0200) /* Bit 1 */ +#define TIM_DBL_2 ((uint16_t)0x0400) /* Bit 2 */ +#define TIM_DBL_3 ((uint16_t)0x0800) /* Bit 3 */ +#define TIM_DBL_4 ((uint16_t)0x1000) /* Bit 4 */ + +/******************* Bit definition for TIM_DMAADR register *******************/ +#define TIM_DMAR_DMAB ((uint16_t)0xFFFF) /* DMA register for burst accesses */ + +/******************************************************************************/ +/* Universal Synchronous Asynchronous Receiver Transmitter */ +/******************************************************************************/ + +/******************* Bit definition for USART_STATR register *******************/ +#define USART_STATR_PE ((uint16_t)0x0001) /* Parity Error */ +#define USART_STATR_FE ((uint16_t)0x0002) /* Framing Error */ +#define USART_STATR_NE ((uint16_t)0x0004) /* Noise Error Flag */ +#define USART_STATR_ORE ((uint16_t)0x0008) /* OverRun Error */ +#define USART_STATR_IDLE ((uint16_t)0x0010) /* IDLE line detected */ +#define USART_STATR_RXNE ((uint16_t)0x0020) /* Read Data Register Not Empty */ +#define USART_STATR_TC ((uint16_t)0x0040) /* Transmission Complete */ +#define USART_STATR_TXE ((uint16_t)0x0080) /* Transmit Data Register Empty */ +#define USART_STATR_LBD ((uint16_t)0x0100) /* LIN Break Detection Flag */ +#define USART_STATR_CTS ((uint16_t)0x0200) /* CTS Flag */ + +/******************* Bit definition for USART_DATAR register *******************/ +#define USART_DATAR_DR ((uint16_t)0x01FF) /* Data value */ + +/****************** Bit definition for USART_BRR register *******************/ +#define USART_BRR_DIV_Fraction ((uint16_t)0x000F) /* Fraction of USARTDIV */ +#define USART_BRR_DIV_Mantissa ((uint16_t)0xFFF0) /* Mantissa of USARTDIV */ + +/****************** Bit definition for USART_CTLR1 register *******************/ +#define USART_CTLR1_SBK ((uint16_t)0x0001) /* Send Break */ +#define USART_CTLR1_RWU ((uint16_t)0x0002) /* Receiver wakeup */ +#define USART_CTLR1_RE ((uint16_t)0x0004) /* Receiver Enable */ +#define USART_CTLR1_TE ((uint16_t)0x0008) /* Transmitter Enable */ +#define USART_CTLR1_IDLEIE ((uint16_t)0x0010) /* IDLE Interrupt Enable */ +#define USART_CTLR1_RXNEIE ((uint16_t)0x0020) /* RXNE Interrupt Enable */ +#define USART_CTLR1_TCIE ((uint16_t)0x0040) /* Transmission Complete Interrupt Enable */ +#define USART_CTLR1_TXEIE ((uint16_t)0x0080) /* PE Interrupt Enable */ +#define USART_CTLR1_PEIE ((uint16_t)0x0100) /* PE Interrupt Enable */ +#define USART_CTLR1_PS ((uint16_t)0x0200) /* Parity Selection */ +#define USART_CTLR1_PCE ((uint16_t)0x0400) /* Parity Control Enable */ +#define USART_CTLR1_WAKE ((uint16_t)0x0800) /* Wakeup method */ +#define USART_CTLR1_M ((uint16_t)0x1000) /* Word length */ +#define USART_CTLR1_UE ((uint16_t)0x2000) /* USART Enable */ +#define USART_CTLR1_OVER8 ((uint16_t)0x8000) /* USART Oversmapling 8-bits */ + +/****************** Bit definition for USART_CTLR2 register *******************/ +#define USART_CTLR2_ADD ((uint16_t)0x000F) /* Address of the USART node */ +#define USART_CTLR2_LBDL ((uint16_t)0x0020) /* LIN Break Detection Length */ +#define USART_CTLR2_LBDIE ((uint16_t)0x0040) /* LIN Break Detection Interrupt Enable */ +#define USART_CTLR2_LBCL ((uint16_t)0x0100) /* Last Bit Clock pulse */ +#define USART_CTLR2_CPHA ((uint16_t)0x0200) /* Clock Phase */ +#define USART_CTLR2_CPOL ((uint16_t)0x0400) /* Clock Polarity */ +#define USART_CTLR2_CLKEN ((uint16_t)0x0800) /* Clock Enable */ + +#define USART_CTLR2_STOP ((uint16_t)0x3000) /* STOP[1:0] bits (STOP bits) */ +#define USART_CTLR2_STOP_0 ((uint16_t)0x1000) /* Bit 0 */ +#define USART_CTLR2_STOP_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define USART_CTLR2_LINEN ((uint16_t)0x4000) /* LIN mode enable */ + +/****************** Bit definition for USART_CTLR3 register *******************/ +#define USART_CTLR3_EIE ((uint16_t)0x0001) /* Error Interrupt Enable */ +#define USART_CTLR3_IREN ((uint16_t)0x0002) /* IrDA mode Enable */ +#define USART_CTLR3_IRLP ((uint16_t)0x0004) /* IrDA Low-Power */ +#define USART_CTLR3_HDSEL ((uint16_t)0x0008) /* Half-Duplex Selection */ +#define USART_CTLR3_NACK ((uint16_t)0x0010) /* Smartcard NACK enable */ +#define USART_CTLR3_SCEN ((uint16_t)0x0020) /* Smartcard mode enable */ +#define USART_CTLR3_DMAR ((uint16_t)0x0040) /* DMA Enable Receiver */ +#define USART_CTLR3_DMAT ((uint16_t)0x0080) /* DMA Enable Transmitter */ +#define USART_CTLR3_RTSE ((uint16_t)0x0100) /* RTS Enable */ +#define USART_CTLR3_CTSE ((uint16_t)0x0200) /* CTS Enable */ +#define USART_CTLR3_CTSIE ((uint16_t)0x0400) /* CTS Interrupt Enable */ +#define USART_CTLR3_ONEBIT ((uint16_t)0x0800) /* One Bit method */ + +/****************** Bit definition for USART_GPR register ******************/ +#define USART_GPR_PSC ((uint16_t)0x00FF) /* PSC[7:0] bits (Prescaler value) */ +#define USART_GPR_PSC_0 ((uint16_t)0x0001) /* Bit 0 */ +#define USART_GPR_PSC_1 ((uint16_t)0x0002) /* Bit 1 */ +#define USART_GPR_PSC_2 ((uint16_t)0x0004) /* Bit 2 */ +#define USART_GPR_PSC_3 ((uint16_t)0x0008) /* Bit 3 */ +#define USART_GPR_PSC_4 ((uint16_t)0x0010) /* Bit 4 */ +#define USART_GPR_PSC_5 ((uint16_t)0x0020) /* Bit 5 */ +#define USART_GPR_PSC_6 ((uint16_t)0x0040) /* Bit 6 */ +#define USART_GPR_PSC_7 ((uint16_t)0x0080) /* Bit 7 */ + +#define USART_GPR_GT ((uint16_t)0xFF00) /* Guard time value */ + +/******************************************************************************/ +/* Window WATCHDOG */ +/******************************************************************************/ + +/******************* Bit definition for WWDG_CTLR register ********************/ +#define WWDG_CTLR_T ((uint8_t)0x7F) /* T[6:0] bits (7-Bit counter (MSB to LSB)) */ +#define WWDG_CTLR_T0 ((uint8_t)0x01) /* Bit 0 */ +#define WWDG_CTLR_T1 ((uint8_t)0x02) /* Bit 1 */ +#define WWDG_CTLR_T2 ((uint8_t)0x04) /* Bit 2 */ +#define WWDG_CTLR_T3 ((uint8_t)0x08) /* Bit 3 */ +#define WWDG_CTLR_T4 ((uint8_t)0x10) /* Bit 4 */ +#define WWDG_CTLR_T5 ((uint8_t)0x20) /* Bit 5 */ +#define WWDG_CTLR_T6 ((uint8_t)0x40) /* Bit 6 */ + +#define WWDG_CTLR_WDGA ((uint8_t)0x80) /* Activation bit */ + +/******************* Bit definition for WWDG_CFGR register *******************/ +#define WWDG_CFGR_W ((uint16_t)0x007F) /* W[6:0] bits (7-bit window value) */ +#define WWDG_CFGR_W0 ((uint16_t)0x0001) /* Bit 0 */ +#define WWDG_CFGR_W1 ((uint16_t)0x0002) /* Bit 1 */ +#define WWDG_CFGR_W2 ((uint16_t)0x0004) /* Bit 2 */ +#define WWDG_CFGR_W3 ((uint16_t)0x0008) /* Bit 3 */ +#define WWDG_CFGR_W4 ((uint16_t)0x0010) /* Bit 4 */ +#define WWDG_CFGR_W5 ((uint16_t)0x0020) /* Bit 5 */ +#define WWDG_CFGR_W6 ((uint16_t)0x0040) /* Bit 6 */ + +#define WWDG_CFGR_WDGTB ((uint16_t)0x0180) /* WDGTB[1:0] bits (Timer Base) */ +#define WWDG_CFGR_WDGTB0 ((uint16_t)0x0080) /* Bit 0 */ +#define WWDG_CFGR_WDGTB1 ((uint16_t)0x0100) /* Bit 1 */ + +#define WWDG_CFGR_EWI ((uint16_t)0x0200) /* Early Wakeup Interrupt */ + +/******************* Bit definition for WWDG_STATR register ********************/ +#define WWDG_STATR_EWIF ((uint8_t)0x01) /* Early Wakeup Interrupt Flag */ + +/******************************************************************************/ +/* ENHANCED FUNNCTION */ +/******************************************************************************/ + +/**************************** Enhanced register *****************************/ +#define EXTEN_USBD_LS ((uint32_t)0x00000001) /* Bit 0 */ +#define EXTEN_USBD_PU_EN ((uint32_t)0x00000002) /* Bit 1 */ +#define EXTEN_ETH_10M_EN ((uint32_t)0x00000004) /* Bit 2 */ +#define EXTEN_PLL_HSI_PRE ((uint32_t)0x00000010) /* Bit 4 */ +#define EXTEN_LOCKUP_EN ((uint32_t)0x00000040) /* Bit 5 */ +#define EXTEN_LOCKUP_RSTF ((uint32_t)0x00000080) /* Bit 7 */ + +#define EXTEN_ULLDO_TRIM ((uint32_t)0x00000300) /* ULLDO_TRIM[1:0] bits */ +#define EXTEN_ULLDO_TRIM0 ((uint32_t)0x00000100) /* Bit 0 */ +#define EXTEN_ULLDO_TRIM1 ((uint32_t)0x00000200) /* Bit 1 */ + +#define EXTEN_LDO_TRIM ((uint32_t)0x00000C00) /* LDO_TRIM[1:0] bits */ +#define EXTEN_LDO_TRIM0 ((uint32_t)0x00000400) /* Bit 0 */ +#define EXTEN_LDO_TRIM1 ((uint32_t)0x00000800) /* Bit 1 */ + +/******************************************************************************/ +/* DVP */ +/******************************************************************************/ + +/******************* Bit definition for DVP_CR0 register ********************/ +#define RB_DVP_ENABLE 0x01 // RW, DVP enable +#define RB_DVP_V_POLAR 0x02 // RW, DVP VSYNC polarity control: 1 = invert, 0 = not invert +#define RB_DVP_H_POLAR 0x04 // RW, DVP HSYNC polarity control: 1 = invert, 0 = not invert +#define RB_DVP_P_POLAR 0x08 // RW, DVP PCLK polarity control: 1 = invert, 0 = not invert +#define RB_DVP_MSK_DAT_MOD 0x30 +#define RB_DVP_D8_MOD 0x00 // RW, DVP 8bits data mode +#define RB_DVP_D10_MOD 0x10 // RW, DVP 10bits data mode +#define RB_DVP_D12_MOD 0x20 // RW, DVP 12bits data mode +#define RB_DVP_JPEG 0x40 // RW, DVP JPEG mode + +/******************* Bit definition for DVP_CR1 register ********************/ +#define RB_DVP_DMA_EN 0x01 // RW, DVP dma enable +#define RB_DVP_ALL_CLR 0x02 // RW, DVP all clear, high action +#define RB_DVP_RCV_CLR 0x04 // RW, DVP receive logic clear, high action +#define RB_DVP_BUF_TOG 0x08 // RW, DVP bug toggle by software, write 1 to toggle, ignored writing 0 +#define RB_DVP_CM 0x10 // RW, DVP capture mode +#define RB_DVP_CROP 0x20 // RW, DVP Crop feature enable +#define RB_DVP_FCRC 0xC0 // RW, DVP frame capture rate control: +#define DVP_RATE_100P 0x00 //00 = every frame captured (100%) +#define DVP_RATE_50P 0x40 //01 = every alternate frame captured (50%) +#define DVP_RATE_25P 0x80 //10 = one frame in four frame captured (25%) + +/******************* Bit definition for DVP_IER register ********************/ +#define RB_DVP_IE_STR_FRM 0x01 // RW, DVP frame start interrupt enable +#define RB_DVP_IE_ROW_DONE 0x02 // RW, DVP row received done interrupt enable +#define RB_DVP_IE_FRM_DONE 0x04 // RW, DVP frame received done interrupt enable +#define RB_DVP_IE_FIFO_OV 0x08 // RW, DVP receive fifo overflow interrupt enable +#define RB_DVP_IE_STP_FRM 0x10 // RW, DVP frame stop interrupt enable + +/******************* Bit definition for DVP_IFR register ********************/ +#define RB_DVP_IF_STR_FRM 0x01 // RW1, interrupt flag for DVP frame start +#define RB_DVP_IF_ROW_DONE 0x02 // RW1, interrupt flag for DVP row receive done +#define RB_DVP_IF_FRM_DONE 0x04 // RW1, interrupt flag for DVP frame receive done +#define RB_DVP_IF_FIFO_OV 0x08 // RW1, interrupt flag for DVP receive fifo overflow +#define RB_DVP_IF_STP_FRM 0x10 // RW1, interrupt flag for DVP frame stop + +/******************* Bit definition for DVP_STATUS register ********************/ +#define RB_DVP_FIFO_RDY 0x01 // RO, DVP receive fifo ready +#define RB_DVP_FIFO_FULL 0x02 // RO, DVP receive fifo full +#define RB_DVP_FIFO_OV 0x04 // RO, DVP receive fifo overflow +#define RB_DVP_MSK_FIFO_CNT 0x70 // RO, DVP receive fifo count + + +/******************************************************************************/ +/* ETH10M */ +/******************************************************************************/ +/* ETH register */ +#define R8_ETH_EIE (*((volatile uint8_t *)(0x40028000+3))) /* Interrupt Enable Register */ +#define RB_ETH_EIE_INTIE 0x80 /* RW interrupt enable*/ +#define RB_ETH_EIE_RXIE 0x40 /* RW Receive complete interrupt enable */ +#define RB_ETH_EIE_LINKIE 0x10 /* RW Link Change Interrupt Enable */ +#define RB_ETH_EIE_TXIE 0x08 /* RW send complete interrupt enable */ +#define RB_ETH_EIE_R_EN50 0x04 /* RW TX 50�� resistor adjustment. 1: On-chip 50�� connected 0: On-chip 50�� disconnected */ +#define RB_ETH_EIE_TXERIE 0x02 /* RW Transmit Error Interrupt Enable */ +#define RB_ETH_EIE_RXERIE 0x01 /* RW1 receive error flag */ +#define R8_ETH_EIR (*((volatile uint8_t *)(0x40028000+4))) /* Interrupt Flag Register */ +#define RB_ETH_EIR_RXIF 0x40 /* RW1 Receive complete flag */ +#define RB_ETH_EIR_LINKIF 0x10 /* RW1 Link Change Flag */ +#define RB_ETH_EIR_TXIF 0x08 /* RW1 Link Change Flag */ +#define RB_ETH_EIR_TXERIF 0x02 /* RW1 send error flag */ +#define RB_ETH_EIR_RXERIF 0x01 /* RW1 receive error flag */ +#define R8_ETH_ESTAT (*((volatile uint8_t *)(0x40028000+5))) /* status register */ +#define RB_ETH_ESTAT_INT 0x80 /* RW1 interrupt */ +#define RB_ETH_ESTAT_BUFER 0x40 /* RW1 Buffer error */ +#define RB_ETH_ESTAT_RXCRCER 0x20 /* RO receive crc error */ +#define RB_ETH_ESTAT_RXNIBBLE 0x10 /* RO receives nibble error */ +#define RB_ETH_ESTAT_RXMORE 0x08 /* RO receives more than maximum packets */ +#define RB_ETH_ESTAT_RXBUSY 0x04 /* RO receive busy */ +#define RB_ETH_ESTAT_TXABRT 0x02 /* RO send interrupted by mcu */ +#define R8_ETH_ECON2 (*((volatile uint8_t *)(0x40028000+6))) /* ETH PHY Analog Block Control Register */ +#define RB_ETH_ECON2_RX 0x0E /* 011b must be written */ +#define RB_ETH_ECON2_TX 0x01 +#define RB_ETH_ECON2_MUST 0x06 /* 011b must be written */ +#define R8_ETH_ECON1 (*((volatile uint8_t *)(0x40028000+7))) /* Transceiver Control Register */ +#define RB_ETH_ECON1_TXRST 0x80 /* RW Send module reset */ +#define RB_ETH_ECON1_RXRST 0x40 /* RW Receiver module reset */ +#define RB_ETH_ECON1_TXRTS 0x08 /* RW The transmission starts, and it is automatically cleared after the transmission is completed. */ +#define RB_ETH_ECON1_RXEN 0x04 /* RW Receive is enabled, when cleared, the error flag RXERIF will change to 1 if it is receiving */ + +#define R32_ETH_TX (*((volatile uint32_t *)(0x40028000+8))) /* send control */ +#define R16_ETH_ETXST (*((volatile uint16_t *)(0x40028000+8))) /* RW Send DMA buffer start address */ +#define R16_ETH_ETXLN (*((volatile uint16_t *)(0x40028000+0xA))) /* RW send length */ +#define R32_ETH_RX (*((volatile uint32_t *)(0x40028000+0xC))) /* receive control */ +#define R16_ETH_ERXST (*((volatile uint16_t *)(0x40028000+0xC))) /* RW Receive DMA buffer start address */ +#define R16_ETH_ERXLN (*((volatile uint16_t *)(0x40028000+0xE))) /* RO receive length */ + +#define R32_ETH_HTL (*((volatile uint32_t *)(0x40028000+0x10))) +#define R8_ETH_EHT0 (*((volatile uint8_t *)(0x40028000+0x10))) /* RW Hash Table Byte0 */ +#define R8_ETH_EHT1 (*((volatile uint8_t *)(0x40028000+0x11))) /* RW Hash Table Byte1 */ +#define R8_ETH_EHT2 (*((volatile uint8_t *)(0x40028000+0x12))) /* RW Hash Table Byte2 */ +#define R8_ETH_EHT3 (*((volatile uint8_t *)(0x40028000+0x13))) /* RW Hash Table Byte3 */ +#define R32_ETH_HTH (*((volatile uint32_t *)(0x40028000+0x14))) +#define R8_ETH_EHT4 (*((volatile uint8_t *)(0x40028000+0x14))) /* RW Hash Table Byte4 */ +#define R8_ETH_EHT5 (*((volatile uint8_t *)(0x40028000+0x15))) /* RW Hash Table Byte5 */ +#define R8_ETH_EHT6 (*((volatile uint8_t *)(0x40028000+0x16))) /* RW Hash Table Byte6 */ +#define R8_ETH_EHT7 (*((volatile uint8_t *)(0x40028000+0x17))) /* RW Hash Table Byte7 */ + +#define R32_ETH_MACON (*((volatile uint32_t *)(0x40028000+0x18))) +#define R8_ETH_ERXFCON (*((volatile uint8_t *)(0x40028000+0x18))) /* Received Packet Filtering Control Register */ +/* RW 0=Do not enable this filter condition, 1=When ANDOR=1, +target address mismatch will be filtered, when ANDOR=0, target address match will be accepted */ +#define RB_ETH_ERXFCON_UCEN 0x80 +#define RB_ETH_ERXFCON_CRCEN 0x20 +#define RB_ETH_ERXFCON_EN 0x10 +#define RB_ETH_ERXFCON_MPEN 0x08 +#define RB_ETH_ERXFCON_HTEN 0x04 +#define RB_ETH_ERXFCON_MCEN 0x02 +#define RB_ETH_ERXFCON_BCEN 0x01 +#define R8_ETH_MACON1 (*((volatile uint8_t *)(0x40028000+0x19))) /* Mac flow control registers */ +/* RW When FULDPX=0 is invalid, when FULDPX=1, 11=send 0 timer pause frame, +then stop sending, 10=send pause frame periodically, 01=send pause frame once, then stop sending, 00=stop sending pause frame */ +#define RB_ETH_MACON1_FCEN 0x30 +#define RB_ETH_MACON1_TXPAUS 0x08 /* RW Send pause frame enable*/ +#define RB_ETH_MACON1_RXPAUS 0x04 /* RW Receive pause frame enable */ +#define RB_ETH_MACON1_PASSALL 0x02 /* RW 1=Unfiltered control frames will be written to the buffer, 0=Control frames will be filtered */ +#define RB_ETH_MACON1_MARXEN 0x01 /* RW MAC layer receive enable */ +#define R8_ETH_MACON2 (*((volatile uint8_t *)(0x40028000+0x1A))) /* Mac Layer Packet Control Register */ +#define RB_ETH_MACON2_PADCFG 0xE0 /* RW Short Packet Padding Settings */ +#define RB_ETH_MACON2_TXCRCEN 0x10 /* RW Send to add crc, if you need to add crc in PADCFG, this position is 1 */ +#define RB_ETH_MACON2_PHDREN 0x08 /* RW Special 4 bytes do not participate in crc check */ +#define RB_ETH_MACON2_HFRMEN 0x04 /* RW Allow jumbo frames */ +#define RB_ETH_MACON2_FULDPX 0x01 /* RW full duplex */ +#define R8_ETH_MABBIPG (*((volatile uint8_t *)(0x40028000+0x1B))) /* Minimum Interpacket Interval Register */ +#define RB_ETH_MABBIPG_MABBIPG 0x7F /* RW Minimum number of bytes between packets */ + +#define R32_ETH_TIM (*((volatile uint32_t *)(0x40028000+0x1C))) +#define R16_ETH_EPAUS (*((volatile uint16_t *)(0x40028000+0x1C))) /* RW Flow Control Pause Frame Time Register */ +#define R16_ETH_MAMXFL (*((volatile uint16_t *)(0x40028000+0x1E))) /* RW Maximum Received Packet Length Register */ +#define R16_ETH_MIRD (*((volatile uint16_t *)(0x40028000+0x20))) /* RW MII read data register */ + +#define R32_ETH_MIWR (*((volatile uint32_t *)(0x40028000+0x24))) +#define R8_ETH_MIREGADR (*((volatile uint8_t *)(0x40028000+0x24))) /* MII address register*/ +#define RB_ETH_MIREGADR_MASK 0x1F /* RW PHY register address mask */ +#define R8_ETH_MISTAT (*((volatile uint8_t *)(0x40028000+0x25))) /* RW PHY register address mask */ +//#define RB_ETH_MIREGADR_MIIWR 0x20 /* WO MII write command */ +#define R16_ETH_MIWR (*((volatile uint16_t *)(0x40028000+0x26))) /* WO MII Write Data Register */ +#define R32_ETH_MAADRL (*((volatile uint32_t *)(0x40028000+0x28))) /* RW MAC 1-4 */ +#define R8_ETH_MAADRL1 (*((volatile uint8_t *)(0x40028000+0x28))) /* RW MAC 1 */ +#define R8_ETH_MAADRL2 (*((volatile uint8_t *)(0x40028000+0x29))) /* RW MAC 2 */ +#define R8_ETH_MAADRL3 (*((volatile uint8_t *)(0x40028000+0x2A))) /* RW MAC 3 */ +#define R8_ETH_MAADRL4 (*((volatile uint8_t *)(0x40028000+0x2B))) /* RW MAC 4 */ +#define R16_ETH_MAADRH (*((volatile uint16_t *)(0x40028000+0x2C))) /* RW MAC 5-6 */ +#define R8_ETH_MAADRL5 (*((volatile uint8_t *)(0x40028000+0x2C))) /* RW MAC 4 */ +#define R8_ETH_MAADRL6 (*((volatile uint8_t *)(0x40028000+0x2D))) /* RW MAC 4 */ + +//PHY address +#define PHY_BMCR 0x00 /* Control Register */ +#define PHY_BMSR 0x01 /* Status Register */ +#define PHY_ANAR 0x04 /* Auto-Negotiation Advertisement Register */ +#define PHY_ANLPAR 0x05 /* Auto-Negotiation Link Partner Base Page Ability Register*/ +#define PHY_ANER 0x06 /* Auto-Negotiation Expansion Register */ +#define PHY_MDIX 0x1e /* Custom MDIX Mode Register */ +//Custom MDIX Mode Register @PHY_MDIX +#define PN_NORMAL 0x04 /* Analog p, n polarity selection */ +#define MDIX_MODE_MASK 0x03 /* mdix settings */ +#define MDIX_MODE_AUTO 0x00 /* */ +#define MDIX_MODE_MDIX 0x01 +#define MDIX_MODE_MDI 0x02 +//ECON2 test mode, to be determined +#define RX_VCM_MODE_0 +#define RX_VCM_MODE_1 +#define RX_VCM_MODE_2 +#define RX_VCM_MODE_3 +//RX reference voltage value setting @RX_REF +#define RX_REF_25mV (0<<2) /* 25mV */ +#define RX_REF_49mV (1<<2) /* 49mV */ +#define RX_REF_74mV (2<<2) /* 74mV */ +#define RX_REF_98mV (3<<2) /* 98mV */ +#define RX_REF_123mV (4<<2) /* 123mV */ +#define RX_REF_148mV (5<<2) /* 148mV */ +#define RX_REF_173mV (6<<2) /* 173mV */ +#define RX_REF_198mV (7<<2) /* 198mV */ +//TX DRIVER Bias Current @TX_AMP +#define TX_AMP_0 (0<<0) /* 43mA / 14.5mA (1.4V/0.7V) */ +#define TX_AMP_1 (1<<0) /* 53.1mA / 18mA (1.8V/0.9V) */ +#define TX_AMP_2 (2<<0) /* 75.6mA / 25.6mA (2.6V/1.3V) */ +#define TX_AMP_3 (3<<0) /* 122mA / 41.45mA (4.1V/2.3V) */ +//FCEN pause frame control @FCEN +#define FCEN_0_TIMER (3<<4) /* Send a 0 timer pause frame, then stop sending */ +#define FCEN_CYCLE (2<<4) /* Periodically send pause frames */ +#define FCEN_ONCE (1<<4) /* Send pause frame once, then stop sending */ +#define FCEN_STOP (0<<4) /* Stop sending pause frames */ +//PADCFG short packet control @PADCFG +#define PADCFG_AUTO_0 (7<<5) /* All short packets are filled with 00h to 64 bytes, then 4 bytes crc */ +#define PADCFG_NO_ACT_0 (6<<5) /* No padding for short packets */ +/* The detected VLAN network packet whose field is 8100h is automatically filled +with 00h to 64 bytes, otherwise the short packet is filled with 60 bytes of 0, and then 4 bytes of crc after filling */ +#define PADCFG_DETE_AUTO (5<<5) +#define PADCFG_NO_ACT_1 (4<<5) /* No padding for short packets */ +#define PADCFG_AUTO_1 (3<<5) /* All short packets are filled with 00h to 64 bytes, then 4 bytes crc */ +#define PADCFG_NO_ACT_2 (2<<5) /* No padding for short packets */ +#define PADCFG_AUTO_3 (1<<5) /* All short packets are filled with 00h to 60 bytes, and then 4 bytes crc */ +#define PADCFG_NO_ACT_3 (0<<5) /* No padding for short packets */ + +/* Bit or field definition for PHY basic status register */ +#define PHY_Linked_Status ((uint16_t)0x0004) /* Valid link established */ + +#define PHY_Reset ((uint16_t)0x8000) /* PHY Reset */ + +#define PHY_AutoNego_Complete ((uint16_t)0x0020) /* Auto-Negotioation process completed */ + +//MII control +#define RB_ETH_MIREGADR_MIIWR 0x20 /* WO MII write command */ +#define RB_ETH_MIREGADR_MIRDL 0x1f /* RW PHY register address */ + + +#include "ch32v20x_conf.h" + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_adc.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_adc.h new file mode 100644 index 0000000000..589a8f7ccf --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_adc.h @@ -0,0 +1,218 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_adc.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * ADC firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_ADC_H +#define __CH32V20x_ADC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* ADC Init structure definition */ +typedef struct +{ + uint32_t ADC_Mode; /* Configures the ADC to operate in independent or + dual mode. + This parameter can be a value of @ref ADC_mode */ + + FunctionalState ADC_ScanConvMode; /* Specifies whether the conversion is performed in + Scan (multichannels) or Single (one channel) mode. + This parameter can be set to ENABLE or DISABLE */ + + FunctionalState ADC_ContinuousConvMode; /* Specifies whether the conversion is performed in + Continuous or Single mode. + This parameter can be set to ENABLE or DISABLE. */ + + uint32_t ADC_ExternalTrigConv; /* Defines the external trigger used to start the analog + to digital conversion of regular channels. This parameter + can be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */ + + uint32_t ADC_DataAlign; /* Specifies whether the ADC data alignment is left or right. + This parameter can be a value of @ref ADC_data_align */ + + uint8_t ADC_NbrOfChannel; /* Specifies the number of ADC channels that will be converted + using the sequencer for regular channel group. + This parameter must range from 1 to 16. */ + + uint32_t ADC_OutputBuffer; /* Specifies whether the ADC channel output buffer is enabled or disabled. + This parameter can be a value of @ref ADC_OutputBuffer */ + + uint32_t ADC_Pga; /* Specifies the PGA gain multiple. + This parameter can be a value of @ref ADC_Pga */ +} ADC_InitTypeDef; + +/* ADC_mode */ +#define ADC_Mode_Independent ((uint32_t)0x00000000) +#define ADC_Mode_RegInjecSimult ((uint32_t)0x00010000) +#define ADC_Mode_RegSimult_AlterTrig ((uint32_t)0x00020000) +#define ADC_Mode_InjecSimult_FastInterl ((uint32_t)0x00030000) +#define ADC_Mode_InjecSimult_SlowInterl ((uint32_t)0x00040000) +#define ADC_Mode_InjecSimult ((uint32_t)0x00050000) +#define ADC_Mode_RegSimult ((uint32_t)0x00060000) +#define ADC_Mode_FastInterl ((uint32_t)0x00070000) +#define ADC_Mode_SlowInterl ((uint32_t)0x00080000) +#define ADC_Mode_AlterTrig ((uint32_t)0x00090000) + +/* ADC_external_trigger_sources_for_regular_channels_conversion */ +#define ADC_ExternalTrigConv_T1_CC1 ((uint32_t)0x00000000) +#define ADC_ExternalTrigConv_T1_CC2 ((uint32_t)0x00020000) +#define ADC_ExternalTrigConv_T2_CC2 ((uint32_t)0x00060000) +#define ADC_ExternalTrigConv_T3_TRGO ((uint32_t)0x00080000) +#define ADC_ExternalTrigConv_T4_CC4 ((uint32_t)0x000A0000) +#define ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO ((uint32_t)0x000C0000) + +#define ADC_ExternalTrigConv_T1_CC3 ((uint32_t)0x00040000) +#define ADC_ExternalTrigConv_None ((uint32_t)0x000E0000) + +#define ADC_ExternalTrigConv_T3_CC1 ((uint32_t)0x00000000) +#define ADC_ExternalTrigConv_T2_CC3 ((uint32_t)0x00020000) +#define ADC_ExternalTrigConv_T8_CC1 ((uint32_t)0x00060000) +#define ADC_ExternalTrigConv_T8_TRGO ((uint32_t)0x00080000) +#define ADC_ExternalTrigConv_T5_CC1 ((uint32_t)0x000A0000) +#define ADC_ExternalTrigConv_T5_CC3 ((uint32_t)0x000C0000) + +/* ADC_data_align */ +#define ADC_DataAlign_Right ((uint32_t)0x00000000) +#define ADC_DataAlign_Left ((uint32_t)0x00000800) + +/* ADC_channels */ +#define ADC_Channel_0 ((uint8_t)0x00) +#define ADC_Channel_1 ((uint8_t)0x01) +#define ADC_Channel_2 ((uint8_t)0x02) +#define ADC_Channel_3 ((uint8_t)0x03) +#define ADC_Channel_4 ((uint8_t)0x04) +#define ADC_Channel_5 ((uint8_t)0x05) +#define ADC_Channel_6 ((uint8_t)0x06) +#define ADC_Channel_7 ((uint8_t)0x07) +#define ADC_Channel_8 ((uint8_t)0x08) +#define ADC_Channel_9 ((uint8_t)0x09) +#define ADC_Channel_10 ((uint8_t)0x0A) +#define ADC_Channel_11 ((uint8_t)0x0B) +#define ADC_Channel_12 ((uint8_t)0x0C) +#define ADC_Channel_13 ((uint8_t)0x0D) +#define ADC_Channel_14 ((uint8_t)0x0E) +#define ADC_Channel_15 ((uint8_t)0x0F) +#define ADC_Channel_16 ((uint8_t)0x10) +#define ADC_Channel_17 ((uint8_t)0x11) + +#define ADC_Channel_TempSensor ((uint8_t)ADC_Channel_16) +#define ADC_Channel_Vrefint ((uint8_t)ADC_Channel_17) + +/*ADC_output_buffer*/ +#define ADC_OutputBuffer_Enable ((uint32_t)0x04000000) +#define ADC_OutputBuffer_Disable ((uint32_t)0x00000000) + +/*ADC_pga*/ +#define ADC_Pga_1 ((uint32_t)0x00000000) +#define ADC_Pga_4 ((uint32_t)0x08000000) +#define ADC_Pga_16 ((uint32_t)0x10000000) +#define ADC_Pga_64 ((uint32_t)0x18000000) + +/* ADC_sampling_time */ +#define ADC_SampleTime_1Cycles5 ((uint8_t)0x00) +#define ADC_SampleTime_7Cycles5 ((uint8_t)0x01) +#define ADC_SampleTime_13Cycles5 ((uint8_t)0x02) +#define ADC_SampleTime_28Cycles5 ((uint8_t)0x03) +#define ADC_SampleTime_41Cycles5 ((uint8_t)0x04) +#define ADC_SampleTime_55Cycles5 ((uint8_t)0x05) +#define ADC_SampleTime_71Cycles5 ((uint8_t)0x06) +#define ADC_SampleTime_239Cycles5 ((uint8_t)0x07) + +/* ADC_external_trigger_sources_for_injected_channels_conversion */ +#define ADC_ExternalTrigInjecConv_T2_TRGO ((uint32_t)0x00002000) +#define ADC_ExternalTrigInjecConv_T2_CC1 ((uint32_t)0x00003000) +#define ADC_ExternalTrigInjecConv_T3_CC4 ((uint32_t)0x00004000) +#define ADC_ExternalTrigInjecConv_T4_TRGO ((uint32_t)0x00005000) +#define ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4 ((uint32_t)0x00006000) + +#define ADC_ExternalTrigInjecConv_T1_TRGO ((uint32_t)0x00000000) +#define ADC_ExternalTrigInjecConv_T1_CC4 ((uint32_t)0x00001000) +#define ADC_ExternalTrigInjecConv_None ((uint32_t)0x00007000) + +#define ADC_ExternalTrigInjecConv_T4_CC3 ((uint32_t)0x00002000) +#define ADC_ExternalTrigInjecConv_T8_CC2 ((uint32_t)0x00003000) +#define ADC_ExternalTrigInjecConv_T8_CC4 ((uint32_t)0x00004000) +#define ADC_ExternalTrigInjecConv_T5_TRGO ((uint32_t)0x00005000) +#define ADC_ExternalTrigInjecConv_T5_CC4 ((uint32_t)0x00006000) + +/* ADC_injected_channel_selection */ +#define ADC_InjectedChannel_1 ((uint8_t)0x14) +#define ADC_InjectedChannel_2 ((uint8_t)0x18) +#define ADC_InjectedChannel_3 ((uint8_t)0x1C) +#define ADC_InjectedChannel_4 ((uint8_t)0x20) + +/* ADC_analog_watchdog_selection */ +#define ADC_AnalogWatchdog_SingleRegEnable ((uint32_t)0x00800200) +#define ADC_AnalogWatchdog_SingleInjecEnable ((uint32_t)0x00400200) +#define ADC_AnalogWatchdog_SingleRegOrInjecEnable ((uint32_t)0x00C00200) +#define ADC_AnalogWatchdog_AllRegEnable ((uint32_t)0x00800000) +#define ADC_AnalogWatchdog_AllInjecEnable ((uint32_t)0x00400000) +#define ADC_AnalogWatchdog_AllRegAllInjecEnable ((uint32_t)0x00C00000) +#define ADC_AnalogWatchdog_None ((uint32_t)0x00000000) + +/* ADC_interrupts_definition */ +#define ADC_IT_EOC ((uint16_t)0x0220) +#define ADC_IT_AWD ((uint16_t)0x0140) +#define ADC_IT_JEOC ((uint16_t)0x0480) + +/* ADC_flags_definition */ +#define ADC_FLAG_AWD ((uint8_t)0x01) +#define ADC_FLAG_EOC ((uint8_t)0x02) +#define ADC_FLAG_JEOC ((uint8_t)0x04) +#define ADC_FLAG_JSTRT ((uint8_t)0x08) +#define ADC_FLAG_STRT ((uint8_t)0x10) + +void ADC_DeInit(ADC_TypeDef *ADCx); +void ADC_Init(ADC_TypeDef *ADCx, ADC_InitTypeDef *ADC_InitStruct); +void ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); +void ADC_Cmd(ADC_TypeDef *ADCx, FunctionalState NewState); +void ADC_DMACmd(ADC_TypeDef *ADCx, FunctionalState NewState); +void ADC_ITConfig(ADC_TypeDef *ADCx, uint16_t ADC_IT, FunctionalState NewState); +void ADC_ResetCalibration(ADC_TypeDef *ADCx); +FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef *ADCx); +void ADC_StartCalibration(ADC_TypeDef *ADCx); +FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef *ADCx); +void ADC_SoftwareStartConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState); +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef *ADCx); +void ADC_DiscModeChannelCountConfig(ADC_TypeDef *ADCx, uint8_t Number); +void ADC_DiscModeCmd(ADC_TypeDef *ADCx, FunctionalState NewState); +void ADC_RegularChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +void ADC_ExternalTrigConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState); +uint16_t ADC_GetConversionValue(ADC_TypeDef *ADCx); +uint32_t ADC_GetDualModeConversionValue(void); +void ADC_AutoInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState); +void ADC_InjectedDiscModeCmd(ADC_TypeDef *ADCx, FunctionalState NewState); +void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef *ADCx, uint32_t ADC_ExternalTrigInjecConv); +void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState); +void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState); +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef *ADCx); +void ADC_InjectedChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +void ADC_InjectedSequencerLengthConfig(ADC_TypeDef *ADCx, uint8_t Length); +void ADC_SetInjectedOffset(ADC_TypeDef *ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset); +uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef *ADCx, uint8_t ADC_InjectedChannel); +void ADC_AnalogWatchdogCmd(ADC_TypeDef *ADCx, uint32_t ADC_AnalogWatchdog); +void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef *ADCx, uint16_t HighThreshold, uint16_t LowThreshold); +void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel); +void ADC_TempSensorVrefintCmd(FunctionalState NewState); +FlagStatus ADC_GetFlagStatus(ADC_TypeDef *ADCx, uint8_t ADC_FLAG); +void ADC_ClearFlag(ADC_TypeDef *ADCx, uint8_t ADC_FLAG); +ITStatus ADC_GetITStatus(ADC_TypeDef *ADCx, uint16_t ADC_IT); +void ADC_ClearITPendingBit(ADC_TypeDef *ADCx, uint16_t ADC_IT); +s32 TempSensor_Volt_To_Temper(s32 Value); +void ADC_BufferCmd(ADC_TypeDef *ADCx, FunctionalState NewState); +int16_t Get_CalibrationValue(ADC_TypeDef *ADCx); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_bkp.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_bkp.h new file mode 100644 index 0000000000..37b2b658e7 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_bkp.h @@ -0,0 +1,91 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_bkp.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * BKP firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_BKP_H +#define __CH32V20x_BKP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* Tamper_Pin_active_level */ +#define BKP_TamperPinLevel_High ((uint16_t)0x0000) +#define BKP_TamperPinLevel_Low ((uint16_t)0x0001) + +/* RTC_output_source_to_output_on_the_Tamper_pin */ +#define BKP_RTCOutputSource_None ((uint16_t)0x0000) +#define BKP_RTCOutputSource_CalibClock ((uint16_t)0x0080) +#define BKP_RTCOutputSource_Alarm ((uint16_t)0x0100) +#define BKP_RTCOutputSource_Second ((uint16_t)0x0300) + +/* Data_Backup_Register */ +#define BKP_DR1 ((uint16_t)0x0004) +#define BKP_DR2 ((uint16_t)0x0008) +#define BKP_DR3 ((uint16_t)0x000C) +#define BKP_DR4 ((uint16_t)0x0010) +#define BKP_DR5 ((uint16_t)0x0014) +#define BKP_DR6 ((uint16_t)0x0018) +#define BKP_DR7 ((uint16_t)0x001C) +#define BKP_DR8 ((uint16_t)0x0020) +#define BKP_DR9 ((uint16_t)0x0024) +#define BKP_DR10 ((uint16_t)0x0028) +#define BKP_DR11 ((uint16_t)0x0040) +#define BKP_DR12 ((uint16_t)0x0044) +#define BKP_DR13 ((uint16_t)0x0048) +#define BKP_DR14 ((uint16_t)0x004C) +#define BKP_DR15 ((uint16_t)0x0050) +#define BKP_DR16 ((uint16_t)0x0054) +#define BKP_DR17 ((uint16_t)0x0058) +#define BKP_DR18 ((uint16_t)0x005C) +#define BKP_DR19 ((uint16_t)0x0060) +#define BKP_DR20 ((uint16_t)0x0064) +#define BKP_DR21 ((uint16_t)0x0068) +#define BKP_DR22 ((uint16_t)0x006C) +#define BKP_DR23 ((uint16_t)0x0070) +#define BKP_DR24 ((uint16_t)0x0074) +#define BKP_DR25 ((uint16_t)0x0078) +#define BKP_DR26 ((uint16_t)0x007C) +#define BKP_DR27 ((uint16_t)0x0080) +#define BKP_DR28 ((uint16_t)0x0084) +#define BKP_DR29 ((uint16_t)0x0088) +#define BKP_DR30 ((uint16_t)0x008C) +#define BKP_DR31 ((uint16_t)0x0090) +#define BKP_DR32 ((uint16_t)0x0094) +#define BKP_DR33 ((uint16_t)0x0098) +#define BKP_DR34 ((uint16_t)0x009C) +#define BKP_DR35 ((uint16_t)0x00A0) +#define BKP_DR36 ((uint16_t)0x00A4) +#define BKP_DR37 ((uint16_t)0x00A8) +#define BKP_DR38 ((uint16_t)0x00AC) +#define BKP_DR39 ((uint16_t)0x00B0) +#define BKP_DR40 ((uint16_t)0x00B4) +#define BKP_DR41 ((uint16_t)0x00B8) +#define BKP_DR42 ((uint16_t)0x00BC) + +void BKP_DeInit(void); +void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel); +void BKP_TamperPinCmd(FunctionalState NewState); +void BKP_ITConfig(FunctionalState NewState); +void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource); +void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue); +void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data); +uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR); +FlagStatus BKP_GetFlagStatus(void); +void BKP_ClearFlag(void); +ITStatus BKP_GetITStatus(void); +void BKP_ClearITPendingBit(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_can.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_can.h new file mode 100644 index 0000000000..fbf11381b2 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_can.h @@ -0,0 +1,358 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_can.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * CAN firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_CAN_H +#define __CH32V20x_CAN_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* CAN init structure definition */ +typedef struct +{ + uint16_t CAN_Prescaler; /* Specifies the length of a time quantum. + It ranges from 1 to 1024. */ + + uint8_t CAN_Mode; /* Specifies the CAN operating mode. + This parameter can be a value of + @ref CAN_operating_mode */ + + uint8_t CAN_SJW; /* Specifies the maximum number of time quanta + the CAN hardware is allowed to lengthen or + shorten a bit to perform resynchronization. + This parameter can be a value of + @ref CAN_synchronisation_jump_width */ + + uint8_t CAN_BS1; /* Specifies the number of time quanta in Bit + Segment 1. This parameter can be a value of + @ref CAN_time_quantum_in_bit_segment_1 */ + + uint8_t CAN_BS2; /* Specifies the number of time quanta in Bit + Segment 2. + This parameter can be a value of + @ref CAN_time_quantum_in_bit_segment_2 */ + + FunctionalState CAN_TTCM; /* Enable or disable the time triggered + communication mode. This parameter can be set + either to ENABLE or DISABLE. */ + + FunctionalState CAN_ABOM; /* Enable or disable the automatic bus-off + management. This parameter can be set either + to ENABLE or DISABLE. */ + + FunctionalState CAN_AWUM; /* Enable or disable the automatic wake-up mode. + This parameter can be set either to ENABLE or + DISABLE. */ + + FunctionalState CAN_NART; /* Enable or disable the no-automatic + retransmission mode. This parameter can be + set either to ENABLE or DISABLE. */ + + FunctionalState CAN_RFLM; /* Enable or disable the Receive FIFO Locked mode. + This parameter can be set either to ENABLE + or DISABLE. */ + + FunctionalState CAN_TXFP; /* Enable or disable the transmit FIFO priority. + This parameter can be set either to ENABLE + or DISABLE. */ +} CAN_InitTypeDef; + +/* CAN filter init structure definition */ +typedef struct +{ + uint16_t CAN_FilterIdHigh; /* Specifies the filter identification number (MSBs for a 32-bit + configuration, first one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterIdLow; /* Specifies the filter identification number (LSBs for a 32-bit + configuration, second one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterMaskIdHigh; /* Specifies the filter mask number or identification number, + according to the mode (MSBs for a 32-bit configuration, + first one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterMaskIdLow; /* Specifies the filter mask number or identification number, + according to the mode (LSBs for a 32-bit configuration, + second one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterFIFOAssignment; /* Specifies the FIFO (0 or 1) which will be assigned to the filter. + This parameter can be a value of @ref CAN_filter_FIFO */ + + uint8_t CAN_FilterNumber; /* Specifies the filter which will be initialized. It ranges from 0 to 13. */ + + uint8_t CAN_FilterMode; /* Specifies the filter mode to be initialized. + This parameter can be a value of @ref CAN_filter_mode */ + + uint8_t CAN_FilterScale; /* Specifies the filter scale. + This parameter can be a value of @ref CAN_filter_scale */ + + FunctionalState CAN_FilterActivation; /* Enable or disable the filter. + This parameter can be set either to ENABLE or DISABLE. */ +} CAN_FilterInitTypeDef; + +/* CAN Tx message structure definition */ +typedef struct +{ + uint32_t StdId; /* Specifies the standard identifier. + This parameter can be a value between 0 to 0x7FF. */ + + uint32_t ExtId; /* Specifies the extended identifier. + This parameter can be a value between 0 to 0x1FFFFFFF. */ + + uint8_t IDE; /* Specifies the type of identifier for the message that + will be transmitted. This parameter can be a value + of @ref CAN_identifier_type */ + + uint8_t RTR; /* Specifies the type of frame for the message that will + be transmitted. This parameter can be a value of + @ref CAN_remote_transmission_request */ + + uint8_t DLC; /* Specifies the length of the frame that will be + transmitted. This parameter can be a value between + 0 to 8 */ + + uint8_t Data[8]; /* Contains the data to be transmitted. It ranges from 0 + to 0xFF. */ +} CanTxMsg; + +/* CAN Rx message structure definition */ +typedef struct +{ + uint32_t StdId; /* Specifies the standard identifier. + This parameter can be a value between 0 to 0x7FF. */ + + uint32_t ExtId; /* Specifies the extended identifier. + This parameter can be a value between 0 to 0x1FFFFFFF. */ + + uint8_t IDE; /* Specifies the type of identifier for the message that + will be received. This parameter can be a value of + @ref CAN_identifier_type */ + + uint8_t RTR; /* Specifies the type of frame for the received message. + This parameter can be a value of + @ref CAN_remote_transmission_request */ + + uint8_t DLC; /* Specifies the length of the frame that will be received. + This parameter can be a value between 0 to 8 */ + + uint8_t Data[8]; /* Contains the data to be received. It ranges from 0 to + 0xFF. */ + + uint8_t FMI; /* Specifies the index of the filter the message stored in + the mailbox passes through. This parameter can be a + value between 0 to 0xFF */ +} CanRxMsg; + +/* CAN_sleep_constants */ +#define CAN_InitStatus_Failed ((uint8_t)0x00) /* CAN initialization failed */ +#define CAN_InitStatus_Success ((uint8_t)0x01) /* CAN initialization OK */ + +/* CAN_Mode */ +#define CAN_Mode_Normal ((uint8_t)0x00) /* normal mode */ +#define CAN_Mode_LoopBack ((uint8_t)0x01) /* loopback mode */ +#define CAN_Mode_Silent ((uint8_t)0x02) /* silent mode */ +#define CAN_Mode_Silent_LoopBack ((uint8_t)0x03) /* loopback combined with silent mode */ + +/* CAN_Operating_Mode */ +#define CAN_OperatingMode_Initialization ((uint8_t)0x00) /* Initialization mode */ +#define CAN_OperatingMode_Normal ((uint8_t)0x01) /* Normal mode */ +#define CAN_OperatingMode_Sleep ((uint8_t)0x02) /* sleep mode */ + +/* CAN_Mode_Status */ +#define CAN_ModeStatus_Failed ((uint8_t)0x00) /* CAN entering the specific mode failed */ +#define CAN_ModeStatus_Success ((uint8_t)!CAN_ModeStatus_Failed) /* CAN entering the specific mode Succeed */ + +/* CAN_synchronisation_jump_width */ +#define CAN_SJW_1tq ((uint8_t)0x00) /* 1 time quantum */ +#define CAN_SJW_2tq ((uint8_t)0x01) /* 2 time quantum */ +#define CAN_SJW_3tq ((uint8_t)0x02) /* 3 time quantum */ +#define CAN_SJW_4tq ((uint8_t)0x03) /* 4 time quantum */ + +/* CAN_time_quantum_in_bit_segment_1 */ +#define CAN_BS1_1tq ((uint8_t)0x00) /* 1 time quantum */ +#define CAN_BS1_2tq ((uint8_t)0x01) /* 2 time quantum */ +#define CAN_BS1_3tq ((uint8_t)0x02) /* 3 time quantum */ +#define CAN_BS1_4tq ((uint8_t)0x03) /* 4 time quantum */ +#define CAN_BS1_5tq ((uint8_t)0x04) /* 5 time quantum */ +#define CAN_BS1_6tq ((uint8_t)0x05) /* 6 time quantum */ +#define CAN_BS1_7tq ((uint8_t)0x06) /* 7 time quantum */ +#define CAN_BS1_8tq ((uint8_t)0x07) /* 8 time quantum */ +#define CAN_BS1_9tq ((uint8_t)0x08) /* 9 time quantum */ +#define CAN_BS1_10tq ((uint8_t)0x09) /* 10 time quantum */ +#define CAN_BS1_11tq ((uint8_t)0x0A) /* 11 time quantum */ +#define CAN_BS1_12tq ((uint8_t)0x0B) /* 12 time quantum */ +#define CAN_BS1_13tq ((uint8_t)0x0C) /* 13 time quantum */ +#define CAN_BS1_14tq ((uint8_t)0x0D) /* 14 time quantum */ +#define CAN_BS1_15tq ((uint8_t)0x0E) /* 15 time quantum */ +#define CAN_BS1_16tq ((uint8_t)0x0F) /* 16 time quantum */ + +/* CAN_time_quantum_in_bit_segment_2 */ +#define CAN_BS2_1tq ((uint8_t)0x00) /* 1 time quantum */ +#define CAN_BS2_2tq ((uint8_t)0x01) /* 2 time quantum */ +#define CAN_BS2_3tq ((uint8_t)0x02) /* 3 time quantum */ +#define CAN_BS2_4tq ((uint8_t)0x03) /* 4 time quantum */ +#define CAN_BS2_5tq ((uint8_t)0x04) /* 5 time quantum */ +#define CAN_BS2_6tq ((uint8_t)0x05) /* 6 time quantum */ +#define CAN_BS2_7tq ((uint8_t)0x06) /* 7 time quantum */ +#define CAN_BS2_8tq ((uint8_t)0x07) /* 8 time quantum */ + +/* CAN_filter_mode */ +#define CAN_FilterMode_IdMask ((uint8_t)0x00) /* identifier/mask mode */ +#define CAN_FilterMode_IdList ((uint8_t)0x01) /* identifier list mode */ + +/* CAN_filter_scale */ +#define CAN_FilterScale_16bit ((uint8_t)0x00) /* Two 16-bit filters */ +#define CAN_FilterScale_32bit ((uint8_t)0x01) /* One 32-bit filter */ + +/* CAN_filter_FIFO */ +#define CAN_Filter_FIFO0 ((uint8_t)0x00) /* Filter FIFO 0 assignment for filter x */ +#define CAN_Filter_FIFO1 ((uint8_t)0x01) /* Filter FIFO 1 assignment for filter x */ + +/* CAN_identifier_type */ +#define CAN_Id_Standard ((uint32_t)0x00000000) /* Standard Id */ +#define CAN_Id_Extended ((uint32_t)0x00000004) /* Extended Id */ + +/* CAN_remote_transmission_request */ +#define CAN_RTR_Data ((uint32_t)0x00000000) /* Data frame */ +#define CAN_RTR_Remote ((uint32_t)0x00000002) /* Remote frame */ + +/* CAN_transmit_constants */ +#define CAN_TxStatus_Failed ((uint8_t)0x00) /* CAN transmission failed */ +#define CAN_TxStatus_Ok ((uint8_t)0x01) /* CAN transmission succeeded */ +#define CAN_TxStatus_Pending ((uint8_t)0x02) /* CAN transmission pending */ +#define CAN_TxStatus_NoMailBox ((uint8_t)0x04) /* CAN cell did not provide an empty mailbox */ + +/* CAN_receive_FIFO_number_constants */ +#define CAN_FIFO0 ((uint8_t)0x00) /* CAN FIFO 0 used to receive */ +#define CAN_FIFO1 ((uint8_t)0x01) /* CAN FIFO 1 used to receive */ + +/* CAN_sleep_constants */ +#define CAN_Sleep_Failed ((uint8_t)0x00) /* CAN did not enter the sleep mode */ +#define CAN_Sleep_Ok ((uint8_t)0x01) /* CAN entered the sleep mode */ + +/* CAN_wake_up_constants */ +#define CAN_WakeUp_Failed ((uint8_t)0x00) /* CAN did not leave the sleep mode */ +#define CAN_WakeUp_Ok ((uint8_t)0x01) /* CAN leaved the sleep mode */ + +/* CAN_Error_Code_constants */ +#define CAN_ErrorCode_NoErr ((uint8_t)0x00) /* No Error */ +#define CAN_ErrorCode_StuffErr ((uint8_t)0x10) /* Stuff Error */ +#define CAN_ErrorCode_FormErr ((uint8_t)0x20) /* Form Error */ +#define CAN_ErrorCode_ACKErr ((uint8_t)0x30) /* Acknowledgment Error */ +#define CAN_ErrorCode_BitRecessiveErr ((uint8_t)0x40) /* Bit Recessive Error */ +#define CAN_ErrorCode_BitDominantErr ((uint8_t)0x50) /* Bit Dominant Error */ +#define CAN_ErrorCode_CRCErr ((uint8_t)0x60) /* CRC Error */ +#define CAN_ErrorCode_SoftwareSetErr ((uint8_t)0x70) /* Software Set Error */ + +/* CAN_flags */ +/* Transmit Flags */ +#define CAN_FLAG_RQCP0 ((uint32_t)0x38000001) /* Request MailBox0 Flag */ +#define CAN_FLAG_RQCP1 ((uint32_t)0x38000100) /* Request MailBox1 Flag */ +#define CAN_FLAG_RQCP2 ((uint32_t)0x38010000) /* Request MailBox2 Flag */ + +/* Receive Flags */ +#define CAN_FLAG_FMP0 ((uint32_t)0x12000003) /* FIFO 0 Message Pending Flag */ +#define CAN_FLAG_FF0 ((uint32_t)0x32000008) /* FIFO 0 Full Flag */ +#define CAN_FLAG_FOV0 ((uint32_t)0x32000010) /* FIFO 0 Overrun Flag */ +#define CAN_FLAG_FMP1 ((uint32_t)0x14000003) /* FIFO 1 Message Pending Flag */ +#define CAN_FLAG_FF1 ((uint32_t)0x34000008) /* FIFO 1 Full Flag */ +#define CAN_FLAG_FOV1 ((uint32_t)0x34000010) /* FIFO 1 Overrun Flag */ + +/* Operating Mode Flags */ +#define CAN_FLAG_WKU ((uint32_t)0x31000008) /* Wake up Flag */ +#define CAN_FLAG_SLAK ((uint32_t)0x31000012) /* Sleep acknowledge Flag */ + +/* Error Flags */ +#define CAN_FLAG_EWG ((uint32_t)0x10F00001) /* Error Warning Flag */ +#define CAN_FLAG_EPV ((uint32_t)0x10F00002) /* Error Passive Flag */ +#define CAN_FLAG_BOF ((uint32_t)0x10F00004) /* Bus-Off Flag */ +#define CAN_FLAG_LEC ((uint32_t)0x30F00070) /* Last error code Flag */ + +/* CAN_interrupts */ +#define CAN_IT_TME ((uint32_t)0x00000001) /* Transmit mailbox empty Interrupt*/ + +/* Receive Interrupts */ +#define CAN_IT_FMP0 ((uint32_t)0x00000002) /* FIFO 0 message pending Interrupt*/ +#define CAN_IT_FF0 ((uint32_t)0x00000004) /* FIFO 0 full Interrupt*/ +#define CAN_IT_FOV0 ((uint32_t)0x00000008) /* FIFO 0 overrun Interrupt*/ +#define CAN_IT_FMP1 ((uint32_t)0x00000010) /* FIFO 1 message pending Interrupt*/ +#define CAN_IT_FF1 ((uint32_t)0x00000020) /* FIFO 1 full Interrupt*/ +#define CAN_IT_FOV1 ((uint32_t)0x00000040) /* FIFO 1 overrun Interrupt*/ + +/* Operating Mode Interrupts */ +#define CAN_IT_WKU ((uint32_t)0x00010000) /* Wake-up Interrupt*/ +#define CAN_IT_SLK ((uint32_t)0x00020000) /* Sleep acknowledge Interrupt*/ + +/* Error Interrupts */ +#define CAN_IT_EWG ((uint32_t)0x00000100) /* Error warning Interrupt*/ +#define CAN_IT_EPV ((uint32_t)0x00000200) /* Error passive Interrupt*/ +#define CAN_IT_BOF ((uint32_t)0x00000400) /* Bus-off Interrupt*/ +#define CAN_IT_LEC ((uint32_t)0x00000800) /* Last error code Interrupt*/ +#define CAN_IT_ERR ((uint32_t)0x00008000) /* Error Interrupt*/ + +/* Flags named as Interrupts : kept only for FW compatibility */ +#define CAN_IT_RQCP0 CAN_IT_TME +#define CAN_IT_RQCP1 CAN_IT_TME +#define CAN_IT_RQCP2 CAN_IT_TME + +/* CAN_Legacy */ +#define CANINITFAILED CAN_InitStatus_Failed +#define CANINITOK CAN_InitStatus_Success +#define CAN_FilterFIFO0 CAN_Filter_FIFO0 +#define CAN_FilterFIFO1 CAN_Filter_FIFO1 +#define CAN_ID_STD CAN_Id_Standard +#define CAN_ID_EXT CAN_Id_Extended +#define CAN_RTR_DATA CAN_RTR_Data +#define CAN_RTR_REMOTE CAN_RTR_Remote +#define CANTXFAILE CAN_TxStatus_Failed +#define CANTXOK CAN_TxStatus_Ok +#define CANTXPENDING CAN_TxStatus_Pending +#define CAN_NO_MB CAN_TxStatus_NoMailBox +#define CANSLEEPFAILED CAN_Sleep_Failed +#define CANSLEEPOK CAN_Sleep_Ok +#define CANWAKEUPFAILED CAN_WakeUp_Failed +#define CANWAKEUPOK CAN_WakeUp_Ok + +void CAN_DeInit(CAN_TypeDef *CANx); +uint8_t CAN_Init(CAN_TypeDef *CANx, CAN_InitTypeDef *CAN_InitStruct); +void CAN_FilterInit(CAN_FilterInitTypeDef *CAN_FilterInitStruct); +void CAN_StructInit(CAN_InitTypeDef *CAN_InitStruct); +void CAN_SlaveStartBank(uint8_t CAN_BankNumber); +void CAN_DBGFreeze(CAN_TypeDef *CANx, FunctionalState NewState); +void CAN_TTComModeCmd(CAN_TypeDef *CANx, FunctionalState NewState); +uint8_t CAN_Transmit(CAN_TypeDef *CANx, CanTxMsg *TxMessage); +uint8_t CAN_TransmitStatus(CAN_TypeDef *CANx, uint8_t TransmitMailbox); +void CAN_CancelTransmit(CAN_TypeDef *CANx, uint8_t Mailbox); +void CAN_Receive(CAN_TypeDef *CANx, uint8_t FIFONumber, CanRxMsg *RxMessage); +void CAN_FIFORelease(CAN_TypeDef *CANx, uint8_t FIFONumber); +uint8_t CAN_MessagePending(CAN_TypeDef *CANx, uint8_t FIFONumber); +uint8_t CAN_OperatingModeRequest(CAN_TypeDef *CANx, uint8_t CAN_OperatingMode); +uint8_t CAN_Sleep(CAN_TypeDef *CANx); +uint8_t CAN_WakeUp(CAN_TypeDef *CANx); +uint8_t CAN_GetLastErrorCode(CAN_TypeDef *CANx); +uint8_t CAN_GetReceiveErrorCounter(CAN_TypeDef *CANx); +uint8_t CAN_GetLSBTransmitErrorCounter(CAN_TypeDef *CANx); +void CAN_ITConfig(CAN_TypeDef *CANx, uint32_t CAN_IT, FunctionalState NewState); +FlagStatus CAN_GetFlagStatus(CAN_TypeDef *CANx, uint32_t CAN_FLAG); +void CAN_ClearFlag(CAN_TypeDef *CANx, uint32_t CAN_FLAG); +ITStatus CAN_GetITStatus(CAN_TypeDef *CANx, uint32_t CAN_IT); +void CAN_ClearITPendingBit(CAN_TypeDef *CANx, uint32_t CAN_IT); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_crc.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_crc.h new file mode 100644 index 0000000000..dcd9bb394e --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_crc.h @@ -0,0 +1,31 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_crc.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * CRC firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_CRC_H +#define __CH32V20x_CRC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +void CRC_ResetDR(void); +uint32_t CRC_CalcCRC(uint32_t Data); +uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength); +uint32_t CRC_GetCRC(void); +void CRC_SetIDRegister(uint8_t IDValue); +uint8_t CRC_GetIDRegister(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_dbgmcu.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_dbgmcu.h new file mode 100644 index 0000000000..6272c78aae --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_dbgmcu.h @@ -0,0 +1,50 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_dbgmcu.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * DBGMCU firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_DBGMCU_H +#define __CH32V20x_DBGMCU_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +#define DBGMCU_SLEEP ((uint32_t)0x00000001) +#define DBGMCU_STOP ((uint32_t)0x00000002) +#define DBGMCU_STANDBY ((uint32_t)0x00000004) +#define DBGMCU_IWDG_STOP ((uint32_t)0x00000100) +#define DBGMCU_WWDG_STOP ((uint32_t)0x00000200) +#define DBGMCU_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00000400) +#define DBGMCU_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00000800) +#define DBGMCU_TIM1_STOP ((uint32_t)0x00001000) +#define DBGMCU_TIM2_STOP ((uint32_t)0x00002000) +#define DBGMCU_TIM3_STOP ((uint32_t)0x00004000) +#define DBGMCU_TIM4_STOP ((uint32_t)0x00008000) +#define DBGMCU_TIM5_STOP ((uint32_t)0x00010000) +#define DBGMCU_TIM6_STOP ((uint32_t)0x00020000) +#define DBGMCU_TIM7_STOP ((uint32_t)0x00040000) +#define DBGMCU_TIM8_STOP ((uint32_t)0x00080000) +#define DBGMCU_CAN1_STOP ((uint32_t)0x00100000) +#define DBGMCU_CAN2_STOP ((uint32_t)0x00200000) +#define DBGMCU_TIM9_STOP ((uint32_t)0x00400000) +#define DBGMCU_TIM10_STOP ((uint32_t)0x00800000) + +uint32_t DBGMCU_GetREVID(void); +uint32_t DBGMCU_GetDEVID(void); +uint32_t __get_DEBUG_CR(void); +void __set_DEBUG_CR(uint32_t value); +void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_dma.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_dma.h new file mode 100644 index 0000000000..29f40f21d7 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_dma.h @@ -0,0 +1,182 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_dma.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * DMA firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_DMA_H +#define __CH32V20x_DMA_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* DMA Init structure definition */ +typedef struct +{ + uint32_t DMA_PeripheralBaseAddr; /* Specifies the peripheral base address for DMAy Channelx. */ + + uint32_t DMA_MemoryBaseAddr; /* Specifies the memory base address for DMAy Channelx. */ + + uint32_t DMA_DIR; /* Specifies if the peripheral is the source or destination. + This parameter can be a value of @ref DMA_data_transfer_direction */ + + uint32_t DMA_BufferSize; /* Specifies the buffer size, in data unit, of the specified Channel. + The data unit is equal to the configuration set in DMA_PeripheralDataSize + or DMA_MemoryDataSize members depending in the transfer direction. */ + + uint32_t DMA_PeripheralInc; /* Specifies whether the Peripheral address register is incremented or not. + This parameter can be a value of @ref DMA_peripheral_incremented_mode */ + + uint32_t DMA_MemoryInc; /* Specifies whether the memory address register is incremented or not. + This parameter can be a value of @ref DMA_memory_incremented_mode */ + + uint32_t DMA_PeripheralDataSize; /* Specifies the Peripheral data width. + This parameter can be a value of @ref DMA_peripheral_data_size */ + + uint32_t DMA_MemoryDataSize; /* Specifies the Memory data width. + This parameter can be a value of @ref DMA_memory_data_size */ + + uint32_t DMA_Mode; /* Specifies the operation mode of the DMAy Channelx. + This parameter can be a value of @ref DMA_circular_normal_mode. + @note: The circular buffer mode cannot be used if the memory-to-memory + data transfer is configured on the selected Channel */ + + uint32_t DMA_Priority; /* Specifies the software priority for the DMAy Channelx. + This parameter can be a value of @ref DMA_priority_level */ + + uint32_t DMA_M2M; /* Specifies if the DMAy Channelx will be used in memory-to-memory transfer. + This parameter can be a value of @ref DMA_memory_to_memory */ +} DMA_InitTypeDef; + +/* DMA_data_transfer_direction */ +#define DMA_DIR_PeripheralDST ((uint32_t)0x00000010) +#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000) + +/* DMA_peripheral_incremented_mode */ +#define DMA_PeripheralInc_Enable ((uint32_t)0x00000040) +#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000) + +/* DMA_memory_incremented_mode */ +#define DMA_MemoryInc_Enable ((uint32_t)0x00000080) +#define DMA_MemoryInc_Disable ((uint32_t)0x00000000) + +/* DMA_peripheral_data_size */ +#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000) +#define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100) +#define DMA_PeripheralDataSize_Word ((uint32_t)0x00000200) + +/* DMA_memory_data_size */ +#define DMA_MemoryDataSize_Byte ((uint32_t)0x00000000) +#define DMA_MemoryDataSize_HalfWord ((uint32_t)0x00000400) +#define DMA_MemoryDataSize_Word ((uint32_t)0x00000800) + +/* DMA_circular_normal_mode */ +#define DMA_Mode_Circular ((uint32_t)0x00000020) +#define DMA_Mode_Normal ((uint32_t)0x00000000) + +/* DMA_priority_level */ +#define DMA_Priority_VeryHigh ((uint32_t)0x00003000) +#define DMA_Priority_High ((uint32_t)0x00002000) +#define DMA_Priority_Medium ((uint32_t)0x00001000) +#define DMA_Priority_Low ((uint32_t)0x00000000) + +/* DMA_memory_to_memory */ +#define DMA_M2M_Enable ((uint32_t)0x00004000) +#define DMA_M2M_Disable ((uint32_t)0x00000000) + +/* DMA_interrupts_definition */ +#define DMA_IT_TC ((uint32_t)0x00000002) +#define DMA_IT_HT ((uint32_t)0x00000004) +#define DMA_IT_TE ((uint32_t)0x00000008) + +#define DMA1_IT_GL1 ((uint32_t)0x00000001) +#define DMA1_IT_TC1 ((uint32_t)0x00000002) +#define DMA1_IT_HT1 ((uint32_t)0x00000004) +#define DMA1_IT_TE1 ((uint32_t)0x00000008) +#define DMA1_IT_GL2 ((uint32_t)0x00000010) +#define DMA1_IT_TC2 ((uint32_t)0x00000020) +#define DMA1_IT_HT2 ((uint32_t)0x00000040) +#define DMA1_IT_TE2 ((uint32_t)0x00000080) +#define DMA1_IT_GL3 ((uint32_t)0x00000100) +#define DMA1_IT_TC3 ((uint32_t)0x00000200) +#define DMA1_IT_HT3 ((uint32_t)0x00000400) +#define DMA1_IT_TE3 ((uint32_t)0x00000800) +#define DMA1_IT_GL4 ((uint32_t)0x00001000) +#define DMA1_IT_TC4 ((uint32_t)0x00002000) +#define DMA1_IT_HT4 ((uint32_t)0x00004000) +#define DMA1_IT_TE4 ((uint32_t)0x00008000) +#define DMA1_IT_GL5 ((uint32_t)0x00010000) +#define DMA1_IT_TC5 ((uint32_t)0x00020000) +#define DMA1_IT_HT5 ((uint32_t)0x00040000) +#define DMA1_IT_TE5 ((uint32_t)0x00080000) +#define DMA1_IT_GL6 ((uint32_t)0x00100000) +#define DMA1_IT_TC6 ((uint32_t)0x00200000) +#define DMA1_IT_HT6 ((uint32_t)0x00400000) +#define DMA1_IT_TE6 ((uint32_t)0x00800000) +#define DMA1_IT_GL7 ((uint32_t)0x01000000) +#define DMA1_IT_TC7 ((uint32_t)0x02000000) +#define DMA1_IT_HT7 ((uint32_t)0x04000000) +#define DMA1_IT_TE7 ((uint32_t)0x08000000) +#define DMA1_IT_GL8 ((uint32_t)0x10000000) +#define DMA1_IT_TC8 ((uint32_t)0x20000000) +#define DMA1_IT_HT8 ((uint32_t)0x40000000) +#define DMA1_IT_TE8 ((uint32_t)0x80000000) + +/* DMA_flags_definition */ +#define DMA1_FLAG_GL1 ((uint32_t)0x00000001) +#define DMA1_FLAG_TC1 ((uint32_t)0x00000002) +#define DMA1_FLAG_HT1 ((uint32_t)0x00000004) +#define DMA1_FLAG_TE1 ((uint32_t)0x00000008) +#define DMA1_FLAG_GL2 ((uint32_t)0x00000010) +#define DMA1_FLAG_TC2 ((uint32_t)0x00000020) +#define DMA1_FLAG_HT2 ((uint32_t)0x00000040) +#define DMA1_FLAG_TE2 ((uint32_t)0x00000080) +#define DMA1_FLAG_GL3 ((uint32_t)0x00000100) +#define DMA1_FLAG_TC3 ((uint32_t)0x00000200) +#define DMA1_FLAG_HT3 ((uint32_t)0x00000400) +#define DMA1_FLAG_TE3 ((uint32_t)0x00000800) +#define DMA1_FLAG_GL4 ((uint32_t)0x00001000) +#define DMA1_FLAG_TC4 ((uint32_t)0x00002000) +#define DMA1_FLAG_HT4 ((uint32_t)0x00004000) +#define DMA1_FLAG_TE4 ((uint32_t)0x00008000) +#define DMA1_FLAG_GL5 ((uint32_t)0x00010000) +#define DMA1_FLAG_TC5 ((uint32_t)0x00020000) +#define DMA1_FLAG_HT5 ((uint32_t)0x00040000) +#define DMA1_FLAG_TE5 ((uint32_t)0x00080000) +#define DMA1_FLAG_GL6 ((uint32_t)0x00100000) +#define DMA1_FLAG_TC6 ((uint32_t)0x00200000) +#define DMA1_FLAG_HT6 ((uint32_t)0x00400000) +#define DMA1_FLAG_TE6 ((uint32_t)0x00800000) +#define DMA1_FLAG_GL7 ((uint32_t)0x01000000) +#define DMA1_FLAG_TC7 ((uint32_t)0x02000000) +#define DMA1_FLAG_HT7 ((uint32_t)0x04000000) +#define DMA1_FLAG_TE7 ((uint32_t)0x08000000) +#define DMA1_FLAG_GL8 ((uint32_t)0x10000000) +#define DMA1_FLAG_TC8 ((uint32_t)0x20000000) +#define DMA1_FLAG_HT8 ((uint32_t)0x40000000) +#define DMA1_FLAG_TE8 ((uint32_t)0x80000000) + +void DMA_DeInit(DMA_Channel_TypeDef *DMAy_Channelx); +void DMA_Init(DMA_Channel_TypeDef *DMAy_Channelx, DMA_InitTypeDef *DMA_InitStruct); +void DMA_StructInit(DMA_InitTypeDef *DMA_InitStruct); +void DMA_Cmd(DMA_Channel_TypeDef *DMAy_Channelx, FunctionalState NewState); +void DMA_ITConfig(DMA_Channel_TypeDef *DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); +void DMA_SetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx, uint16_t DataNumber); +uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx); +FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG); +void DMA_ClearFlag(uint32_t DMAy_FLAG); +ITStatus DMA_GetITStatus(uint32_t DMAy_IT); +void DMA_ClearITPendingBit(uint32_t DMAy_IT); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_exti.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_exti.h new file mode 100644 index 0000000000..bc0f159f58 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_exti.h @@ -0,0 +1,93 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_exti.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * EXTI firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_EXTI_H +#define __CH32V20x_EXTI_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* EXTI mode enumeration */ +typedef enum +{ + EXTI_Mode_Interrupt = 0x00, + EXTI_Mode_Event = 0x04 +} EXTIMode_TypeDef; + +/* EXTI Trigger enumeration */ +typedef enum +{ + EXTI_Trigger_Rising = 0x08, + EXTI_Trigger_Falling = 0x0C, + EXTI_Trigger_Rising_Falling = 0x10 +} EXTITrigger_TypeDef; + +/* EXTI Init Structure definition */ +typedef struct +{ + uint32_t EXTI_Line; /* Specifies the EXTI lines to be enabled or disabled. + This parameter can be any combination of @ref EXTI_Lines */ + + EXTIMode_TypeDef EXTI_Mode; /* Specifies the mode for the EXTI lines. + This parameter can be a value of @ref EXTIMode_TypeDef */ + + EXTITrigger_TypeDef EXTI_Trigger; /* Specifies the trigger signal active edge for the EXTI lines. + This parameter can be a value of @ref EXTIMode_TypeDef */ + + FunctionalState EXTI_LineCmd; /* Specifies the new state of the selected EXTI lines. + This parameter can be set either to ENABLE or DISABLE */ +} EXTI_InitTypeDef; + +/* EXTI_Lines */ +#define EXTI_Line0 ((uint32_t)0x00001) /* External interrupt line 0 */ +#define EXTI_Line1 ((uint32_t)0x00002) /* External interrupt line 1 */ +#define EXTI_Line2 ((uint32_t)0x00004) /* External interrupt line 2 */ +#define EXTI_Line3 ((uint32_t)0x00008) /* External interrupt line 3 */ +#define EXTI_Line4 ((uint32_t)0x00010) /* External interrupt line 4 */ +#define EXTI_Line5 ((uint32_t)0x00020) /* External interrupt line 5 */ +#define EXTI_Line6 ((uint32_t)0x00040) /* External interrupt line 6 */ +#define EXTI_Line7 ((uint32_t)0x00080) /* External interrupt line 7 */ +#define EXTI_Line8 ((uint32_t)0x00100) /* External interrupt line 8 */ +#define EXTI_Line9 ((uint32_t)0x00200) /* External interrupt line 9 */ +#define EXTI_Line10 ((uint32_t)0x00400) /* External interrupt line 10 */ +#define EXTI_Line11 ((uint32_t)0x00800) /* External interrupt line 11 */ +#define EXTI_Line12 ((uint32_t)0x01000) /* External interrupt line 12 */ +#define EXTI_Line13 ((uint32_t)0x02000) /* External interrupt line 13 */ +#define EXTI_Line14 ((uint32_t)0x04000) /* External interrupt line 14 */ +#define EXTI_Line15 ((uint32_t)0x08000) /* External interrupt line 15 */ +#define EXTI_Line16 ((uint32_t)0x10000) /* External interrupt line 16 Connected to the PVD Output */ +#define EXTI_Line17 ((uint32_t)0x20000) /* External interrupt line 17 Connected to the RTC Alarm event */ +#define EXTI_Line18 ((uint32_t)0x40000) /* External interrupt line 18 Connected to the USBD Device \ + Wakeup from suspend event */ +#define EXTI_Line19 ((uint32_t)0x80000) /* External interrupt line 19 Connected to the Ethernet Wakeup event */ +#define EXTI_Line20 ((uint32_t)0x100000) /* External interrupt line 20 Connected to the USBFS Wakeup event */ + +#if defined(CH32V20x_D8) || defined(CH32V20x_D8W) + #define EXTI_Line21 ((uint32_t)0x200000) /* External interrupt line 21 Connected to the OSCCAL Wakeup event */ + +#endif + +void EXTI_DeInit(void); +void EXTI_Init(EXTI_InitTypeDef *EXTI_InitStruct); +void EXTI_StructInit(EXTI_InitTypeDef *EXTI_InitStruct); +void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line); +FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line); +void EXTI_ClearFlag(uint32_t EXTI_Line); +ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); +void EXTI_ClearITPendingBit(uint32_t EXTI_Line); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_flash.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_flash.h new file mode 100644 index 0000000000..7a4ed15139 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_flash.h @@ -0,0 +1,142 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_flash.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the FLASH + * firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_FLASH_H +#define __CH32V20x_FLASH_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* FLASH Status */ +typedef enum +{ + FLASH_BUSY = 1, + FLASH_ERROR_PG, + FLASH_ERROR_WRP, + FLASH_COMPLETE, + FLASH_TIMEOUT +} FLASH_Status; + +/* Write Protect */ +#define FLASH_WRProt_Sectors0 ((uint32_t)0x00000001) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors1 ((uint32_t)0x00000002) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors2 ((uint32_t)0x00000004) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors3 ((uint32_t)0x00000008) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors4 ((uint32_t)0x00000010) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors5 ((uint32_t)0x00000020) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors6 ((uint32_t)0x00000040) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors7 ((uint32_t)0x00000080) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors8 ((uint32_t)0x00000100) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors9 ((uint32_t)0x00000200) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors10 ((uint32_t)0x00000400) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors11 ((uint32_t)0x00000800) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors12 ((uint32_t)0x00001000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors13 ((uint32_t)0x00002000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors14 ((uint32_t)0x00004000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors15 ((uint32_t)0x00008000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors16 ((uint32_t)0x00010000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors17 ((uint32_t)0x00020000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors18 ((uint32_t)0x00040000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors19 ((uint32_t)0x00080000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors20 ((uint32_t)0x00100000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors21 ((uint32_t)0x00200000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors22 ((uint32_t)0x00400000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors23 ((uint32_t)0x00800000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors24 ((uint32_t)0x01000000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors25 ((uint32_t)0x02000000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors26 ((uint32_t)0x04000000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors27 ((uint32_t)0x08000000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors28 ((uint32_t)0x10000000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors29 ((uint32_t)0x20000000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors30 ((uint32_t)0x40000000) /* Write protection of setor 0 */ +#define FLASH_WRProt_Sectors31to127 ((uint32_t)0x80000000) /* Write protection of page 62 to 255 */ + +#define FLASH_WRProt_AllSectors ((uint32_t)0xFFFFFFFF) /* Write protection of all Sectors */ + +/* Option_Bytes_IWatchdog */ +#define OB_IWDG_SW ((uint16_t)0x0001) /* Software IWDG selected */ +#define OB_IWDG_HW ((uint16_t)0x0000) /* Hardware IWDG selected */ + +/* Option_Bytes_nRST_STOP */ +#define OB_STOP_NoRST ((uint16_t)0x0002) /* No reset generated when entering in STOP */ +#define OB_STOP_RST ((uint16_t)0x0000) /* Reset generated when entering in STOP */ + +/* Option_Bytes_nRST_STDBY */ +#define OB_STDBY_NoRST ((uint16_t)0x0004) /* No reset generated when entering in STANDBY */ +#define OB_STDBY_RST ((uint16_t)0x0000) /* Reset generated when entering in STANDBY */ + +/* FLASH_Interrupts */ +#define FLASH_IT_ERROR ((uint32_t)0x00000400) /* FPEC error interrupt source */ +#define FLASH_IT_EOP ((uint32_t)0x00001000) /* End of FLASH Operation Interrupt source */ +#define FLASH_IT_BANK1_ERROR FLASH_IT_ERROR /* FPEC BANK1 error interrupt source */ +#define FLASH_IT_BANK1_EOP FLASH_IT_EOP /* End of FLASH BANK1 Operation Interrupt source */ + +/* FLASH_Flags */ +#define FLASH_FLAG_BSY ((uint32_t)0x00000001) /* FLASH Busy flag */ +#define FLASH_FLAG_EOP ((uint32_t)0x00000020) /* FLASH End of Operation flag */ +#define FLASH_FLAG_WRPRTERR ((uint32_t)0x00000010) /* FLASH Write protected error flag */ +#define FLASH_FLAG_OPTERR ((uint32_t)0x00000001) /* FLASH Option Byte error flag */ + +#define FLASH_FLAG_BANK1_BSY FLASH_FLAG_BSY /* FLASH BANK1 Busy flag*/ +#define FLASH_FLAG_BANK1_EOP FLASH_FLAG_EOP /* FLASH BANK1 End of Operation flag */ +#define FLASH_FLAG_BANK1_WRPRTERR FLASH_FLAG_WRPRTERR /* FLASH BANK1 Write protected error flag */ + +/* FLASH_Access_CLK */ +#define FLASH_Access_SYSTEM_HALF ((uint32_t)0x00000000) /* FLASH Enhance Clock = SYSTEM */ +#define FLASH_Access_SYSTEM ((uint32_t)0x02000000) /* Enhance_CLK = SYSTEM/2 */ + +/*Functions used for all devices*/ +void FLASH_Unlock(void); +void FLASH_Lock(void); +FLASH_Status FLASH_ErasePage(uint32_t Page_Address); +FLASH_Status FLASH_EraseAllPages(void); +FLASH_Status FLASH_EraseOptionBytes(void); +FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data); +FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data); +FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data); +FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Sectors); +FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState); +FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY); +uint32_t FLASH_GetUserOptionByte(void); +uint32_t FLASH_GetWriteProtectionOptionByte(void); +FlagStatus FLASH_GetReadOutProtectionStatus(void); +void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState); +FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG); +void FLASH_ClearFlag(uint32_t FLASH_FLAG); +FLASH_Status FLASH_GetStatus(void); +FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout); +void FLASH_Unlock_Fast(void); +void FLASH_Lock_Fast(void); +void FLASH_ErasePage_Fast(uint32_t Page_Address); +void FLASH_EraseBlock_32K_Fast(uint32_t Block_Address); +void FLASH_EraseBlock_64K_Fast(uint32_t Block_Address); +void FLASH_ProgramPage_Fast(uint32_t Page_Address, uint32_t *pbuf); +void FLASH_Access_Clock_Cfg(uint32_t FLASH_Access_CLK); +void FLASH_Enhance_Mode(FunctionalState NewState); + +#if defined(CH32V20x_D8) || defined(CH32V20x_D8W) +void FLASH_GetMACAddress(uint8_t *Buffer); +#endif + +/* New function used for all devices */ +void FLASH_UnlockBank1(void); +void FLASH_LockBank1(void); +FLASH_Status FLASH_EraseAllBank1Pages(void); +FLASH_Status FLASH_GetBank1Status(void); +FLASH_Status FLASH_WaitForLastBank1Operation(uint32_t Timeout); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_gpio.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_gpio.h new file mode 100644 index 0000000000..2767caeb17 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_gpio.h @@ -0,0 +1,189 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_gpio.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * GPIO firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_GPIO_H +#define __CH32V20x_GPIO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* Output Maximum frequency selection */ +typedef enum +{ + GPIO_Speed_10MHz = 1, + GPIO_Speed_2MHz, + GPIO_Speed_50MHz +} GPIOSpeed_TypeDef; + +/* Configuration Mode enumeration */ +typedef enum +{ + GPIO_Mode_AIN = 0x0, + GPIO_Mode_IN_FLOATING = 0x04, + GPIO_Mode_IPD = 0x28, + GPIO_Mode_IPU = 0x48, + GPIO_Mode_Out_OD = 0x14, + GPIO_Mode_Out_PP = 0x10, + GPIO_Mode_AF_OD = 0x1C, + GPIO_Mode_AF_PP = 0x18 +} GPIOMode_TypeDef; + +/* GPIO Init structure definition */ +typedef struct +{ + uint16_t GPIO_Pin; /* Specifies the GPIO pins to be configured. + This parameter can be any value of @ref GPIO_pins_define */ + + GPIOSpeed_TypeDef GPIO_Speed; /* Specifies the speed for the selected pins. + This parameter can be a value of @ref GPIOSpeed_TypeDef */ + + GPIOMode_TypeDef GPIO_Mode; /* Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIOMode_TypeDef */ +} GPIO_InitTypeDef; + +/* Bit_SET and Bit_RESET enumeration */ +typedef enum +{ + Bit_RESET = 0, + Bit_SET +} BitAction; + +/* GPIO_pins_define */ +#define GPIO_Pin_0 ((uint16_t)0x0001) /* Pin 0 selected */ +#define GPIO_Pin_1 ((uint16_t)0x0002) /* Pin 1 selected */ +#define GPIO_Pin_2 ((uint16_t)0x0004) /* Pin 2 selected */ +#define GPIO_Pin_3 ((uint16_t)0x0008) /* Pin 3 selected */ +#define GPIO_Pin_4 ((uint16_t)0x0010) /* Pin 4 selected */ +#define GPIO_Pin_5 ((uint16_t)0x0020) /* Pin 5 selected */ +#define GPIO_Pin_6 ((uint16_t)0x0040) /* Pin 6 selected */ +#define GPIO_Pin_7 ((uint16_t)0x0080) /* Pin 7 selected */ +#define GPIO_Pin_8 ((uint16_t)0x0100) /* Pin 8 selected */ +#define GPIO_Pin_9 ((uint16_t)0x0200) /* Pin 9 selected */ +#define GPIO_Pin_10 ((uint16_t)0x0400) /* Pin 10 selected */ +#define GPIO_Pin_11 ((uint16_t)0x0800) /* Pin 11 selected */ +#define GPIO_Pin_12 ((uint16_t)0x1000) /* Pin 12 selected */ +#define GPIO_Pin_13 ((uint16_t)0x2000) /* Pin 13 selected */ +#define GPIO_Pin_14 ((uint16_t)0x4000) /* Pin 14 selected */ +#define GPIO_Pin_15 ((uint16_t)0x8000) /* Pin 15 selected */ +#define GPIO_Pin_All ((uint16_t)0xFFFF) /* All pins selected */ + +/* GPIO_Remap_define */ +/* PCFR1 */ +#define GPIO_Remap_SPI1 ((uint32_t)0x00000001) /* SPI1 Alternate Function mapping */ +#define GPIO_Remap_I2C1 ((uint32_t)0x00000002) /* I2C1 Alternate Function mapping */ +#define GPIO_Remap_USART1 ((uint32_t)0x00000004) /* USART1 Alternate Function mapping low bit */ +#define GPIO_Remap_USART2 ((uint32_t)0x00000008) /* USART2 Alternate Function mapping */ +#define GPIO_PartialRemap_USART3 ((uint32_t)0x00140010) /* USART3 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART3 ((uint32_t)0x00140030) /* USART3 Full Alternate Function mapping */ +#define GPIO_PartialRemap_TIM1 ((uint32_t)0x00160040) /* TIM1 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM1 ((uint32_t)0x001600C0) /* TIM1 Full Alternate Function mapping */ +#define GPIO_PartialRemap1_TIM2 ((uint32_t)0x00180100) /* TIM2 Partial1 Alternate Function mapping */ +#define GPIO_PartialRemap2_TIM2 ((uint32_t)0x00180200) /* TIM2 Partial2 Alternate Function mapping */ +#define GPIO_FullRemap_TIM2 ((uint32_t)0x00180300) /* TIM2 Full Alternate Function mapping */ +#define GPIO_PartialRemap_TIM3 ((uint32_t)0x001A0800) /* TIM3 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM3 ((uint32_t)0x001A0C00) /* TIM3 Full Alternate Function mapping */ +#define GPIO_Remap_TIM4 ((uint32_t)0x00001000) /* TIM4 Alternate Function mapping */ +#define GPIO_Remap1_CAN1 ((uint32_t)0x001D4000) /* CAN1 Alternate Function mapping */ +#define GPIO_Remap2_CAN1 ((uint32_t)0x001D6000) /* CAN1 Alternate Function mapping */ +#define GPIO_Remap_PD01 ((uint32_t)0x00008000) /* PD01 Alternate Function mapping */ +#define GPIO_Remap_TIM5CH4_LSI ((uint32_t)0x00200001) /* LSI connected to TIM5 Channel4 input capture for calibration */ +#define GPIO_Remap_ADC1_ETRGINJ ((uint32_t)0x00200002) /* ADC1 External Trigger Injected Conversion remapping */ +#define GPIO_Remap_ADC1_ETRGREG ((uint32_t)0x00200004) /* ADC1 External Trigger Regular Conversion remapping */ +#define GPIO_Remap_ADC2_ETRGINJ ((uint32_t)0x00200008) /* ADC2 External Trigger Injected Conversion remapping */ +#define GPIO_Remap_ADC2_ETRGREG ((uint32_t)0x00200010) /* ADC2 External Trigger Regular Conversion remapping */ +#define GPIO_Remap_ETH ((uint32_t)0x00200020) /* Ethernet remapping (only for Connectivity line devices) */ +#define GPIO_Remap_CAN2 ((uint32_t)0x00200040) /* CAN2 remapping (only for Connectivity line devices) */ +#define GPIO_Remap_MII_RMII_SEL ((uint32_t)0x00200080) /* MII or RMII selection */ +#define GPIO_Remap_SWJ_NoJTRST ((uint32_t)0x00300100) /* Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST */ +#define GPIO_Remap_SWJ_JTAGDisable ((uint32_t)0x00300200) /* JTAG-DP Disabled and SW-DP Enabled */ +#define GPIO_Remap_SWJ_Disable ((uint32_t)0x00300400) /* Full SWJ Disabled (JTAG-DP + SW-DP) */ +#define GPIO_Remap_SPI3 ((uint32_t)0x00201000) /* SPI3/I2S3 Alternate Function mapping (only for Connectivity line devices) */ +#define GPIO_Remap_TIM2ITR1_PTP_SOF ((uint32_t)0x00202000) /* Ethernet PTP output or USB OTG SOF (Start of Frame) connected \ + to TIM2 Internal Trigger 1 for calibration \ + (only for Connectivity line devices) */ +#define GPIO_Remap_PTP_PPS ((uint32_t)0x00204000) /* Ethernet MAC PPS_PTS output on PB05 (only for Connectivity line devices) */ + +/* PCFR2 */ +#define GPIO_Remap_TIM8 ((uint32_t)0x80000004) /* TIM8 Alternate Function mapping */ +#define GPIO_PartialRemap_TIM9 ((uint32_t)0x80130008) /* TIM9 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM9 ((uint32_t)0x80130010) /* TIM9 Full Alternate Function mapping */ +#define GPIO_PartialRemap_TIM10 ((uint32_t)0x80150020) /* TIM10 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM10 ((uint32_t)0x80150040) /* TIM10 Full Alternate Function mapping */ +#define GPIO_Remap_FSMC_NADV ((uint32_t)0x80000400) /* FSMC_NADV Alternate Function mapping */ +#define GPIO_PartialRemap_USART4 ((uint32_t)0x80300001) /* USART4 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART4 ((uint32_t)0x80300002) /* USART4 Full Alternate Function mapping */ +#define GPIO_PartialRemap_USART5 ((uint32_t)0x80320004) /* USART5 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART5 ((uint32_t)0x80320008) /* USART5 Full Alternate Function mapping */ +#define GPIO_PartialRemap_USART6 ((uint32_t)0x80340010) /* USART6 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART6 ((uint32_t)0x80340020) /* USART6 Full Alternate Function mapping */ +#define GPIO_PartialRemap_USART7 ((uint32_t)0x80360040) /* USART7 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART7 ((uint32_t)0x80360080) /* USART7 Full Alternate Function mapping */ +#define GPIO_PartialRemap_USART8 ((uint32_t)0x80380100) /* USART8 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART8 ((uint32_t)0x80380200) /* USART8 Full Alternate Function mapping */ +#define GPIO_Remap_USART1_HighBit ((uint32_t)0x80200400) /* USART1 Alternate Function mapping high bit */ + +/* GPIO_Port_Sources */ +#define GPIO_PortSourceGPIOA ((uint8_t)0x00) +#define GPIO_PortSourceGPIOB ((uint8_t)0x01) +#define GPIO_PortSourceGPIOC ((uint8_t)0x02) +#define GPIO_PortSourceGPIOD ((uint8_t)0x03) +#define GPIO_PortSourceGPIOE ((uint8_t)0x04) +#define GPIO_PortSourceGPIOF ((uint8_t)0x05) +#define GPIO_PortSourceGPIOG ((uint8_t)0x06) + +/* GPIO_Pin_sources */ +#define GPIO_PinSource0 ((uint8_t)0x00) +#define GPIO_PinSource1 ((uint8_t)0x01) +#define GPIO_PinSource2 ((uint8_t)0x02) +#define GPIO_PinSource3 ((uint8_t)0x03) +#define GPIO_PinSource4 ((uint8_t)0x04) +#define GPIO_PinSource5 ((uint8_t)0x05) +#define GPIO_PinSource6 ((uint8_t)0x06) +#define GPIO_PinSource7 ((uint8_t)0x07) +#define GPIO_PinSource8 ((uint8_t)0x08) +#define GPIO_PinSource9 ((uint8_t)0x09) +#define GPIO_PinSource10 ((uint8_t)0x0A) +#define GPIO_PinSource11 ((uint8_t)0x0B) +#define GPIO_PinSource12 ((uint8_t)0x0C) +#define GPIO_PinSource13 ((uint8_t)0x0D) +#define GPIO_PinSource14 ((uint8_t)0x0E) +#define GPIO_PinSource15 ((uint8_t)0x0F) + +/* Ethernet_Media_Interface */ +#define GPIO_ETH_MediaInterface_MII ((u32)0x00000000) +#define GPIO_ETH_MediaInterface_RMII ((u32)0x00000001) + +void GPIO_DeInit(GPIO_TypeDef *GPIOx); +void GPIO_AFIODeInit(void); +void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct); +void GPIO_StructInit(GPIO_InitTypeDef *GPIO_InitStruct); +uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); +uint16_t GPIO_ReadInputData(GPIO_TypeDef *GPIOx); +uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); +uint16_t GPIO_ReadOutputData(GPIO_TypeDef *GPIOx); +void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); +void GPIO_ResetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); +void GPIO_WriteBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, BitAction BitVal); +void GPIO_Write(GPIO_TypeDef *GPIOx, uint16_t PortVal); +void GPIO_PinLockConfig(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); +void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); +void GPIO_EventOutputCmd(FunctionalState NewState); +void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState); +void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); +void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_i2c.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_i2c.h new file mode 100644 index 0000000000..2da137d0dd --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_i2c.h @@ -0,0 +1,199 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_i2c.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * I2C firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_I2C_H +#define __CH32V20x_I2C_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* I2C Init structure definition */ +typedef struct +{ + uint32_t I2C_ClockSpeed; /* Specifies the clock frequency. + This parameter must be set to a value lower than 400kHz */ + + uint16_t I2C_Mode; /* Specifies the I2C mode. + This parameter can be a value of @ref I2C_mode */ + + uint16_t I2C_DutyCycle; /* Specifies the I2C fast mode duty cycle. + This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */ + + uint16_t I2C_OwnAddress1; /* Specifies the first device own address. + This parameter can be a 7-bit or 10-bit address. */ + + uint16_t I2C_Ack; /* Enables or disables the acknowledgement. + This parameter can be a value of @ref I2C_acknowledgement */ + + uint16_t I2C_AcknowledgedAddress; /* Specifies if 7-bit or 10-bit address is acknowledged. + This parameter can be a value of @ref I2C_acknowledged_address */ +} I2C_InitTypeDef; + +/* I2C_mode */ +#define I2C_Mode_I2C ((uint16_t)0x0000) +#define I2C_Mode_SMBusDevice ((uint16_t)0x0002) +#define I2C_Mode_SMBusHost ((uint16_t)0x000A) + +/* I2C_duty_cycle_in_fast_mode */ +#define I2C_DutyCycle_16_9 ((uint16_t)0x4000) /* I2C fast mode Tlow/Thigh = 16/9 */ +#define I2C_DutyCycle_2 ((uint16_t)0xBFFF) /* I2C fast mode Tlow/Thigh = 2 */ + +/* I2C_acknowledgement */ +#define I2C_Ack_Enable ((uint16_t)0x0400) +#define I2C_Ack_Disable ((uint16_t)0x0000) + +/* I2C_transfer_direction */ +#define I2C_Direction_Transmitter ((uint8_t)0x00) +#define I2C_Direction_Receiver ((uint8_t)0x01) + +/* I2C_acknowledged_address */ +#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000) +#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000) + +/* I2C_registers */ +#define I2C_Register_CTLR1 ((uint8_t)0x00) +#define I2C_Register_CTLR2 ((uint8_t)0x04) +#define I2C_Register_OADDR1 ((uint8_t)0x08) +#define I2C_Register_OADDR2 ((uint8_t)0x0C) +#define I2C_Register_DATAR ((uint8_t)0x10) +#define I2C_Register_STAR1 ((uint8_t)0x14) +#define I2C_Register_STAR2 ((uint8_t)0x18) +#define I2C_Register_CKCFGR ((uint8_t)0x1C) +#define I2C_Register_RTR ((uint8_t)0x20) + +/* I2C_SMBus_alert_pin_level */ +#define I2C_SMBusAlert_Low ((uint16_t)0x2000) +#define I2C_SMBusAlert_High ((uint16_t)0xDFFF) + +/* I2C_PEC_position */ +#define I2C_PECPosition_Next ((uint16_t)0x0800) +#define I2C_PECPosition_Current ((uint16_t)0xF7FF) + +/* I2C_NACK_position */ +#define I2C_NACKPosition_Next ((uint16_t)0x0800) +#define I2C_NACKPosition_Current ((uint16_t)0xF7FF) + +/* I2C_interrupts_definition */ +#define I2C_IT_BUF ((uint16_t)0x0400) +#define I2C_IT_EVT ((uint16_t)0x0200) +#define I2C_IT_ERR ((uint16_t)0x0100) + +/* I2C_interrupts_definition */ +#define I2C_IT_SMBALERT ((uint32_t)0x01008000) +#define I2C_IT_TIMEOUT ((uint32_t)0x01004000) +#define I2C_IT_PECERR ((uint32_t)0x01001000) +#define I2C_IT_OVR ((uint32_t)0x01000800) +#define I2C_IT_AF ((uint32_t)0x01000400) +#define I2C_IT_ARLO ((uint32_t)0x01000200) +#define I2C_IT_BERR ((uint32_t)0x01000100) +#define I2C_IT_TXE ((uint32_t)0x06000080) +#define I2C_IT_RXNE ((uint32_t)0x06000040) +#define I2C_IT_STOPF ((uint32_t)0x02000010) +#define I2C_IT_ADD10 ((uint32_t)0x02000008) +#define I2C_IT_BTF ((uint32_t)0x02000004) +#define I2C_IT_ADDR ((uint32_t)0x02000002) +#define I2C_IT_SB ((uint32_t)0x02000001) + +/* SR2 register flags */ +#define I2C_FLAG_DUALF ((uint32_t)0x00800000) +#define I2C_FLAG_SMBHOST ((uint32_t)0x00400000) +#define I2C_FLAG_SMBDEFAULT ((uint32_t)0x00200000) +#define I2C_FLAG_GENCALL ((uint32_t)0x00100000) +#define I2C_FLAG_TRA ((uint32_t)0x00040000) +#define I2C_FLAG_BUSY ((uint32_t)0x00020000) +#define I2C_FLAG_MSL ((uint32_t)0x00010000) + +/* SR1 register flags */ +#define I2C_FLAG_SMBALERT ((uint32_t)0x10008000) +#define I2C_FLAG_TIMEOUT ((uint32_t)0x10004000) +#define I2C_FLAG_PECERR ((uint32_t)0x10001000) +#define I2C_FLAG_OVR ((uint32_t)0x10000800) +#define I2C_FLAG_AF ((uint32_t)0x10000400) +#define I2C_FLAG_ARLO ((uint32_t)0x10000200) +#define I2C_FLAG_BERR ((uint32_t)0x10000100) +#define I2C_FLAG_TXE ((uint32_t)0x10000080) +#define I2C_FLAG_RXNE ((uint32_t)0x10000040) +#define I2C_FLAG_STOPF ((uint32_t)0x10000010) +#define I2C_FLAG_ADD10 ((uint32_t)0x10000008) +#define I2C_FLAG_BTF ((uint32_t)0x10000004) +#define I2C_FLAG_ADDR ((uint32_t)0x10000002) +#define I2C_FLAG_SB ((uint32_t)0x10000001) + +/****************I2C Master Events (Events grouped in order of communication)********************/ + +#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) /* BUSY, MSL and SB flag */ +#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */ +#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((uint32_t)0x00030002) /* BUSY, MSL and ADDR flags */ +#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((uint32_t)0x00030008) /* BUSY, MSL and ADD10 flags */ +#define I2C_EVENT_MASTER_BYTE_RECEIVED ((uint32_t)0x00030040) /* BUSY, MSL and RXNE flags */ +#define I2C_EVENT_MASTER_BYTE_TRANSMITTING ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */ +#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */ + +/******************I2C Slave Events (Events grouped in order of communication)******************/ + +#define I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ((uint32_t)0x00020002) /* BUSY and ADDR flags */ +#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ((uint32_t)0x00060082) /* TRA, BUSY, TXE and ADDR flags */ +#define I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED ((uint32_t)0x00820000) /* DUALF and BUSY flags */ +#define I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((uint32_t)0x00860080) /* DUALF, TRA, BUSY and TXE flags */ +#define I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED ((uint32_t)0x00120000) /* GENCALL and BUSY flags */ +#define I2C_EVENT_SLAVE_BYTE_RECEIVED ((uint32_t)0x00020040) /* BUSY and RXNE flags */ +#define I2C_EVENT_SLAVE_STOP_DETECTED ((uint32_t)0x00000010) /* STOPF flag */ +#define I2C_EVENT_SLAVE_BYTE_TRANSMITTED ((uint32_t)0x00060084) /* TRA, BUSY, TXE and BTF flags */ +#define I2C_EVENT_SLAVE_BYTE_TRANSMITTING ((uint32_t)0x00060080) /* TRA, BUSY and TXE flags */ +#define I2C_EVENT_SLAVE_ACK_FAILURE ((uint32_t)0x00000400) /* AF flag */ + +void I2C_DeInit(I2C_TypeDef *I2Cx); +void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitTypeDef *I2C_InitStruct); +void I2C_StructInit(I2C_InitTypeDef *I2C_InitStruct); +void I2C_Cmd(I2C_TypeDef *I2Cx, FunctionalState NewState); +void I2C_DMACmd(I2C_TypeDef *I2Cx, FunctionalState NewState); +void I2C_DMALastTransferCmd(I2C_TypeDef *I2Cx, FunctionalState NewState); +void I2C_GenerateSTART(I2C_TypeDef *I2Cx, FunctionalState NewState); +void I2C_GenerateSTOP(I2C_TypeDef *I2Cx, FunctionalState NewState); +void I2C_AcknowledgeConfig(I2C_TypeDef *I2Cx, FunctionalState NewState); +void I2C_OwnAddress2Config(I2C_TypeDef *I2Cx, uint8_t Address); +void I2C_DualAddressCmd(I2C_TypeDef *I2Cx, FunctionalState NewState); +void I2C_GeneralCallCmd(I2C_TypeDef *I2Cx, FunctionalState NewState); +void I2C_ITConfig(I2C_TypeDef *I2Cx, uint16_t I2C_IT, FunctionalState NewState); +void I2C_SendData(I2C_TypeDef *I2Cx, uint8_t Data); +uint8_t I2C_ReceiveData(I2C_TypeDef *I2Cx); +void I2C_Send7bitAddress(I2C_TypeDef *I2Cx, uint8_t Address, uint8_t I2C_Direction); +uint16_t I2C_ReadRegister(I2C_TypeDef *I2Cx, uint8_t I2C_Register); +void I2C_SoftwareResetCmd(I2C_TypeDef *I2Cx, FunctionalState NewState); +void I2C_NACKPositionConfig(I2C_TypeDef *I2Cx, uint16_t I2C_NACKPosition); +void I2C_SMBusAlertConfig(I2C_TypeDef *I2Cx, uint16_t I2C_SMBusAlert); +void I2C_TransmitPEC(I2C_TypeDef *I2Cx, FunctionalState NewState); +void I2C_PECPositionConfig(I2C_TypeDef *I2Cx, uint16_t I2C_PECPosition); +void I2C_CalculatePEC(I2C_TypeDef *I2Cx, FunctionalState NewState); +uint8_t I2C_GetPEC(I2C_TypeDef *I2Cx); +void I2C_ARPCmd(I2C_TypeDef *I2Cx, FunctionalState NewState); +void I2C_StretchClockCmd(I2C_TypeDef *I2Cx, FunctionalState NewState); +void I2C_FastModeDutyCycleConfig(I2C_TypeDef *I2Cx, uint16_t I2C_DutyCycle); + +/**************************************************************************************** + * I2C State Monitoring Functions + ****************************************************************************************/ + +ErrorStatus I2C_CheckEvent(I2C_TypeDef *I2Cx, uint32_t I2C_EVENT); +uint32_t I2C_GetLastEvent(I2C_TypeDef *I2Cx); +FlagStatus I2C_GetFlagStatus(I2C_TypeDef *I2Cx, uint32_t I2C_FLAG); + +void I2C_ClearFlag(I2C_TypeDef *I2Cx, uint32_t I2C_FLAG); +ITStatus I2C_GetITStatus(I2C_TypeDef *I2Cx, uint32_t I2C_IT); +void I2C_ClearITPendingBit(I2C_TypeDef *I2Cx, uint32_t I2C_IT); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_iwdg.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_iwdg.h new file mode 100644 index 0000000000..0574536344 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_iwdg.h @@ -0,0 +1,48 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_iwdg.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * IWDG firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_IWDG_H +#define __CH32V20x_IWDG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* IWDG_WriteAccess */ +#define IWDG_WriteAccess_Enable ((uint16_t)0x5555) +#define IWDG_WriteAccess_Disable ((uint16_t)0x0000) + +/* IWDG_prescaler */ +#define IWDG_Prescaler_4 ((uint8_t)0x00) +#define IWDG_Prescaler_8 ((uint8_t)0x01) +#define IWDG_Prescaler_16 ((uint8_t)0x02) +#define IWDG_Prescaler_32 ((uint8_t)0x03) +#define IWDG_Prescaler_64 ((uint8_t)0x04) +#define IWDG_Prescaler_128 ((uint8_t)0x05) +#define IWDG_Prescaler_256 ((uint8_t)0x06) + +/* IWDG_Flag */ +#define IWDG_FLAG_PVU ((uint16_t)0x0001) +#define IWDG_FLAG_RVU ((uint16_t)0x0002) + +void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess); +void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); +void IWDG_SetReload(uint16_t Reload); +void IWDG_ReloadCounter(void); +void IWDG_Enable(void); +FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_misc.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_misc.h new file mode 100644 index 0000000000..39b0bb6029 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_misc.h @@ -0,0 +1,43 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_misc.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * miscellaneous firmware library functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_MISC_H +#define __CH32V20x_MISC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* NVIC Init Structure definition */ +typedef struct +{ + uint8_t NVIC_IRQChannel; + uint8_t NVIC_IRQChannelPreemptionPriority; + uint8_t NVIC_IRQChannelSubPriority; + FunctionalState NVIC_IRQChannelCmd; +} NVIC_InitTypeDef; + +/* Preemption_Priority_Group */ +#define NVIC_PriorityGroup_0 ((uint32_t)0x00) +#define NVIC_PriorityGroup_1 ((uint32_t)0x01) +#define NVIC_PriorityGroup_2 ((uint32_t)0x02) +#define NVIC_PriorityGroup_3 ((uint32_t)0x03) +#define NVIC_PriorityGroup_4 ((uint32_t)0x04) + +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); +void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_opa.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_opa.h new file mode 100644 index 0000000000..336870e093 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_opa.h @@ -0,0 +1,72 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_opa.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * OPA firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_OPA_H +#define __CH32V20x_OPA_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +#define OPA_PSEL_OFFSET 3 +#define OPA_NSEL_OFFSET 2 +#define OPA_MODE_OFFSET 1 + +/* OPA member enumeration */ +typedef enum +{ + OPA1 = 0, + OPA2, + OPA3, + OPA4 +} OPA_Num_TypeDef; + +/* OPA PSEL enumeration */ +typedef enum +{ + CHP0 = 0, + CHP1 +} OPA_PSEL_TypeDef; + +/* OPA NSEL enumeration */ +typedef enum +{ + CHN0 = 0, + CHN1 +} OPA_NSEL_TypeDef; + +/* OPA out channel enumeration */ +typedef enum +{ + OUT_IO_OUT0 = 0, + OUT_IO_OUT1 +} OPA_Mode_TypeDef; + +/* OPA Init Structure definition */ +typedef struct +{ + OPA_Num_TypeDef OPA_NUM; /* Specifies the members of OPA */ + OPA_PSEL_TypeDef PSEL; /* Specifies the positive channel of OPA */ + OPA_NSEL_TypeDef NSEL; /* Specifies the negative channel of OPA */ + OPA_Mode_TypeDef Mode; /* Specifies the mode of OPA */ +} OPA_InitTypeDef; + +void OPA_DeInit(void); +void OPA_Init(OPA_InitTypeDef *OPA_InitStruct); +void OPA_StructInit(OPA_InitTypeDef *OPA_InitStruct); +void OPA_Cmd(OPA_Num_TypeDef OPA_NUM, FunctionalState NewState); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_pwr.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_pwr.h new file mode 100644 index 0000000000..ae8c46607a --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_pwr.h @@ -0,0 +1,62 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_pwr.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the PWR + * firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_PWR_H +#define __CH32V20x_PWR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* PVD_detection_level */ +#define PWR_PVDLevel_2V2 ((uint32_t)0x00000000) +#define PWR_PVDLevel_2V3 ((uint32_t)0x00000020) +#define PWR_PVDLevel_2V4 ((uint32_t)0x00000040) +#define PWR_PVDLevel_2V5 ((uint32_t)0x00000060) +#define PWR_PVDLevel_2V6 ((uint32_t)0x00000080) +#define PWR_PVDLevel_2V7 ((uint32_t)0x000000A0) +#define PWR_PVDLevel_2V8 ((uint32_t)0x000000C0) +#define PWR_PVDLevel_2V9 ((uint32_t)0x000000E0) + +/* Regulator_state_is_STOP_mode */ +#define PWR_Regulator_ON ((uint32_t)0x00000000) +#define PWR_Regulator_LowPower ((uint32_t)0x00000001) + +/* STOP_mode_entry */ +#define PWR_STOPEntry_WFI ((uint8_t)0x01) +#define PWR_STOPEntry_WFE ((uint8_t)0x02) + +/* PWR_Flag */ +#define PWR_FLAG_WU ((uint32_t)0x00000001) +#define PWR_FLAG_SB ((uint32_t)0x00000002) +#define PWR_FLAG_PVDO ((uint32_t)0x00000004) + +void PWR_DeInit(void); +void PWR_BackupAccessCmd(FunctionalState NewState); +void PWR_PVDCmd(FunctionalState NewState); +void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel); +void PWR_WakeUpPinCmd(FunctionalState NewState); +void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); +void PWR_EnterSTANDBYMode(void); +FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG); +void PWR_ClearFlag(uint32_t PWR_FLAG); +void PWR_EnterSTANDBYMode_RAM(void); +void PWR_EnterSTANDBYMode_RAM_LV(void); +void PWR_EnterSTANDBYMode_RAM_VBAT_EN(void); +void PWR_EnterSTANDBYMode_RAM_LV_VBAT_EN(void); +void PWR_EnterSTOPMode_RAM_LV(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_rcc.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_rcc.h new file mode 100644 index 0000000000..e09d694768 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_rcc.h @@ -0,0 +1,255 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_rcc.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the RCC firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_RCC_H +#define __CH32V20x_RCC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* RCC_Exported_Types */ +typedef struct +{ + uint32_t SYSCLK_Frequency; /* returns SYSCLK clock frequency expressed in Hz */ + uint32_t HCLK_Frequency; /* returns HCLK clock frequency expressed in Hz */ + uint32_t PCLK1_Frequency; /* returns PCLK1 clock frequency expressed in Hz */ + uint32_t PCLK2_Frequency; /* returns PCLK2 clock frequency expressed in Hz */ + uint32_t ADCCLK_Frequency; /* returns ADCCLK clock frequency expressed in Hz */ +} RCC_ClocksTypeDef; + +/* HSE_configuration */ +#define RCC_HSE_OFF ((uint32_t)0x00000000) +#define RCC_HSE_ON ((uint32_t)0x00010000) +#define RCC_HSE_Bypass ((uint32_t)0x00040000) + +/* PLL_entry_clock_source */ +#define RCC_PLLSource_HSI_Div2 ((uint32_t)0x00000000) +#define RCC_PLLSource_HSE_Div1 ((uint32_t)0x00010000) +#define RCC_PLLSource_HSE_Div2 ((uint32_t)0x00030000) + +/* PLL_multiplication_factor for other CH32V20x */ +#define RCC_PLLMul_2 ((uint32_t)0x00000000) +#define RCC_PLLMul_3 ((uint32_t)0x00040000) +#define RCC_PLLMul_4 ((uint32_t)0x00080000) +#define RCC_PLLMul_5 ((uint32_t)0x000C0000) +#define RCC_PLLMul_6 ((uint32_t)0x00100000) +#define RCC_PLLMul_7 ((uint32_t)0x00140000) +#define RCC_PLLMul_8 ((uint32_t)0x00180000) +#define RCC_PLLMul_9 ((uint32_t)0x001C0000) +#define RCC_PLLMul_10 ((uint32_t)0x00200000) +#define RCC_PLLMul_11 ((uint32_t)0x00240000) +#define RCC_PLLMul_12 ((uint32_t)0x00280000) +#define RCC_PLLMul_13 ((uint32_t)0x002C0000) +#define RCC_PLLMul_14 ((uint32_t)0x00300000) +#define RCC_PLLMul_15 ((uint32_t)0x00340000) +#define RCC_PLLMul_16 ((uint32_t)0x00380000) +#define RCC_PLLMul_18 ((uint32_t)0x003C0000) + +/* System_clock_source */ +#define RCC_SYSCLKSource_HSI ((uint32_t)0x00000000) +#define RCC_SYSCLKSource_HSE ((uint32_t)0x00000001) +#define RCC_SYSCLKSource_PLLCLK ((uint32_t)0x00000002) + +/* AHB_clock_source */ +#define RCC_SYSCLK_Div1 ((uint32_t)0x00000000) +#define RCC_SYSCLK_Div2 ((uint32_t)0x00000080) +#define RCC_SYSCLK_Div4 ((uint32_t)0x00000090) +#define RCC_SYSCLK_Div8 ((uint32_t)0x000000A0) +#define RCC_SYSCLK_Div16 ((uint32_t)0x000000B0) +#define RCC_SYSCLK_Div64 ((uint32_t)0x000000C0) +#define RCC_SYSCLK_Div128 ((uint32_t)0x000000D0) +#define RCC_SYSCLK_Div256 ((uint32_t)0x000000E0) +#define RCC_SYSCLK_Div512 ((uint32_t)0x000000F0) + +/* APB1_APB2_clock_source */ +#define RCC_HCLK_Div1 ((uint32_t)0x00000000) +#define RCC_HCLK_Div2 ((uint32_t)0x00000400) +#define RCC_HCLK_Div4 ((uint32_t)0x00000500) +#define RCC_HCLK_Div8 ((uint32_t)0x00000600) +#define RCC_HCLK_Div16 ((uint32_t)0x00000700) + +/* RCC_Interrupt_source */ +#define RCC_IT_LSIRDY ((uint8_t)0x01) +#define RCC_IT_LSERDY ((uint8_t)0x02) +#define RCC_IT_HSIRDY ((uint8_t)0x04) +#define RCC_IT_HSERDY ((uint8_t)0x08) +#define RCC_IT_PLLRDY ((uint8_t)0x10) +#define RCC_IT_CSS ((uint8_t)0x80) + +/* USB_Device_clock_source */ +#define RCC_USBCLKSource_PLLCLK_Div1 ((uint8_t)0x00) +#define RCC_USBCLKSource_PLLCLK_Div2 ((uint8_t)0x01) +#define RCC_USBCLKSource_PLLCLK_Div3 ((uint8_t)0x02) + +#ifdef CH32V20x_D8W + #define RCC_USBCLKSource_PLLCLK_Div5 ((uint8_t)0x03) + +#endif + +/* ADC_clock_source */ +#define RCC_PCLK2_Div2 ((uint32_t)0x00000000) +#define RCC_PCLK2_Div4 ((uint32_t)0x00004000) +#define RCC_PCLK2_Div6 ((uint32_t)0x00008000) +#define RCC_PCLK2_Div8 ((uint32_t)0x0000C000) + +/* LSE_configuration */ +#define RCC_LSE_OFF ((uint8_t)0x00) +#define RCC_LSE_ON ((uint8_t)0x01) +#define RCC_LSE_Bypass ((uint8_t)0x04) + +/* RTC_clock_source */ +#define RCC_RTCCLKSource_LSE ((uint32_t)0x00000100) +#define RCC_RTCCLKSource_LSI ((uint32_t)0x00000200) +#define RCC_RTCCLKSource_HSE_Div128 ((uint32_t)0x00000300) + +/* AHB_peripheral */ +#define RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001) +#define RCC_AHBPeriph_DMA2 ((uint32_t)0x00000002) +#define RCC_AHBPeriph_SRAM ((uint32_t)0x00000004) +#define RCC_AHBPeriph_CRC ((uint32_t)0x00000040) +#define RCC_AHBPeriph_FSMC ((uint32_t)0x00000100) +#define RCC_AHBPeriph_RNG ((uint32_t)0x00000200) +#define RCC_AHBPeriph_SDIO ((uint32_t)0x00000400) +#define RCC_AHBPeriph_USBHS ((uint32_t)0x00000800) +#define RCC_AHBPeriph_OTG_FS ((uint32_t)0x00001000) + +#ifdef CH32V20x_D8W +#define RCC_AHBPeriph_BLE_CRC ((uint32_t)0x00030040) +#endif + +/* APB2_peripheral */ +#define RCC_APB2Periph_AFIO ((uint32_t)0x00000001) +#define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004) +#define RCC_APB2Periph_GPIOB ((uint32_t)0x00000008) +#define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010) +#define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020) +#define RCC_APB2Periph_GPIOE ((uint32_t)0x00000040) +#define RCC_APB2Periph_ADC1 ((uint32_t)0x00000200) +#define RCC_APB2Periph_ADC2 ((uint32_t)0x00000400) +#define RCC_APB2Periph_TIM1 ((uint32_t)0x00000800) +#define RCC_APB2Periph_SPI1 ((uint32_t)0x00001000) +#define RCC_APB2Periph_TIM8 ((uint32_t)0x00002000) +#define RCC_APB2Periph_USART1 ((uint32_t)0x00004000) +#define RCC_APB2Periph_TIM9 ((uint32_t)0x00080000) +#define RCC_APB2Periph_TIM10 ((uint32_t)0x00100000) + +/* APB1_peripheral */ +#define RCC_APB1Periph_TIM2 ((uint32_t)0x00000001) +#define RCC_APB1Periph_TIM3 ((uint32_t)0x00000002) +#define RCC_APB1Periph_TIM4 ((uint32_t)0x00000004) +#define RCC_APB1Periph_TIM5 ((uint32_t)0x00000008) +#define RCC_APB1Periph_TIM6 ((uint32_t)0x00000010) +#define RCC_APB1Periph_TIM7 ((uint32_t)0x00000020) +#define RCC_APB1Periph_UART6 ((uint32_t)0x00000040) +#define RCC_APB1Periph_UART7 ((uint32_t)0x00000080) +#define RCC_APB1Periph_UART8 ((uint32_t)0x00000100) +#define RCC_APB1Periph_WWDG ((uint32_t)0x00000800) +#define RCC_APB1Periph_SPI2 ((uint32_t)0x00004000) +#define RCC_APB1Periph_SPI3 ((uint32_t)0x00008000) +#define RCC_APB1Periph_USART2 ((uint32_t)0x00020000) +#define RCC_APB1Periph_USART3 ((uint32_t)0x00040000) +#define RCC_APB1Periph_UART4 ((uint32_t)0x00080000) +#define RCC_APB1Periph_UART5 ((uint32_t)0x00100000) +#define RCC_APB1Periph_I2C1 ((uint32_t)0x00200000) +#define RCC_APB1Periph_I2C2 ((uint32_t)0x00400000) +#define RCC_APB1Periph_USB ((uint32_t)0x00800000) +#define RCC_APB1Periph_CAN1 ((uint32_t)0x02000000) +#define RCC_APB1Periph_CAN2 ((uint32_t)0x04000000) +#define RCC_APB1Periph_BKP ((uint32_t)0x08000000) +#define RCC_APB1Periph_PWR ((uint32_t)0x10000000) +#define RCC_APB1Periph_DAC ((uint32_t)0x20000000) + +/* Clock_source_to_output_on_MCO_pin */ +#define RCC_MCO_NoClock ((uint8_t)0x00) +#define RCC_MCO_SYSCLK ((uint8_t)0x04) +#define RCC_MCO_HSI ((uint8_t)0x05) +#define RCC_MCO_HSE ((uint8_t)0x06) +#define RCC_MCO_PLLCLK_Div2 ((uint8_t)0x07) + +/* RCC_Flag */ +#define RCC_FLAG_HSIRDY ((uint8_t)0x21) +#define RCC_FLAG_HSERDY ((uint8_t)0x31) +#define RCC_FLAG_PLLRDY ((uint8_t)0x39) +#define RCC_FLAG_LSERDY ((uint8_t)0x41) +#define RCC_FLAG_LSIRDY ((uint8_t)0x61) +#define RCC_FLAG_PINRST ((uint8_t)0x7A) +#define RCC_FLAG_PORRST ((uint8_t)0x7B) +#define RCC_FLAG_SFTRST ((uint8_t)0x7C) +#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) +#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) +#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) + +/* SysTick_clock_source */ +#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB) +#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004) + +/* USBFS_clock_source */ +#define RCC_USBPLL_Div1 ((uint32_t)0x00) +#define RCC_USBPLL_Div2 ((uint32_t)0x01) +#define RCC_USBPLL_Div3 ((uint32_t)0x02) +#define RCC_USBPLL_Div4 ((uint32_t)0x03) +#define RCC_USBPLL_Div5 ((uint32_t)0x04) +#define RCC_USBPLL_Div6 ((uint32_t)0x05) +#define RCC_USBPLL_Div7 ((uint32_t)0x06) +#define RCC_USBPLL_Div8 ((uint32_t)0x07) + +/* ETH_clock_source */ +#if defined(CH32V20x_D8) || defined(CH32V20x_D8W) + #define RCC_ETHCLK_Div1 ((uint32_t)0x00) + #define RCC_ETHCLK_Div2 ((uint32_t)0x01) + +#endif + +void RCC_DeInit(void); +void RCC_HSEConfig(uint32_t RCC_HSE); +ErrorStatus RCC_WaitForHSEStartUp(void); +void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue); +void RCC_HSICmd(FunctionalState NewState); +void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul); +void RCC_PLLCmd(FunctionalState NewState); +void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource); +uint8_t RCC_GetSYSCLKSource(void); +void RCC_HCLKConfig(uint32_t RCC_SYSCLK); +void RCC_PCLK1Config(uint32_t RCC_HCLK); +void RCC_PCLK2Config(uint32_t RCC_HCLK); +void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState); +void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource); +void RCC_ADCCLKConfig(uint32_t RCC_PCLK2); +void RCC_LSEConfig(uint8_t RCC_LSE); +void RCC_LSICmd(FunctionalState NewState); +void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource); +void RCC_RTCCLKCmd(FunctionalState NewState); +void RCC_GetClocksFreq(RCC_ClocksTypeDef *RCC_Clocks); +void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); +void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); +void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); +void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); +void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); +void RCC_BackupResetCmd(FunctionalState NewState); +void RCC_ClockSecuritySystemCmd(FunctionalState NewState); +void RCC_MCOConfig(uint8_t RCC_MCO); +FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG); +void RCC_ClearFlag(void); +ITStatus RCC_GetITStatus(uint8_t RCC_IT); +void RCC_ClearITPendingBit(uint8_t RCC_IT); +void RCC_ADCCLKADJcmd(FunctionalState NewState); + +#if defined(CH32V20x_D8) || defined(CH32V20x_D8W) +void RCC_ETHDIVConfig(uint32_t RCC_ETHPRE_Div); + +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_rtc.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_rtc.h new file mode 100644 index 0000000000..0b32654801 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_rtc.h @@ -0,0 +1,96 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_rtc.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the RTC + * firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_RTC_H +#define __CH32V20x_RTC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +typedef enum +{ + Level_32 = 2, + Level_64, + Level_128, + +} Cali_LevelTypeDef; + +/* RTC_interrupts_define */ +#define RTC_IT_OW ((uint16_t)0x0004) /* Overflow interrupt */ +#define RTC_IT_ALR ((uint16_t)0x0002) /* Alarm interrupt */ +#define RTC_IT_SEC ((uint16_t)0x0001) /* Second interrupt */ + +/* RTC_interrupts_flags */ +#define RTC_FLAG_RTOFF ((uint16_t)0x0020) /* RTC Operation OFF flag */ +#define RTC_FLAG_RSF ((uint16_t)0x0008) /* Registers Synchronized flag */ +#define RTC_FLAG_OW ((uint16_t)0x0004) /* Overflow flag */ +#define RTC_FLAG_ALR ((uint16_t)0x0002) /* Alarm flag */ +#define RTC_FLAG_SEC ((uint16_t)0x0001) /* Second flag */ + +#if defined(CH32V20x_D8) || defined(CH32V20x_D8W) +#define RB_OSC32K_HTUNE (0x1FE0) +#define RB_OSC32K_LTUNE (0x1F) + +#define RB_OSC_CAL_HALT (0x80) +#define RB_OSC_CAL_EN (0x02) +#define RB_OSC_CAL_INT_EN (0x01) + +#define RB_OSC_CAL_OV_CNT (0xFF) + +#define RB_OSC_CAL_IF_END (1 << 15) +#define RB_OSC_CAL_CNT_OV (1 << 14) +#define RB_OSC_CAL_CNT (0x3FFF) + +#define RB_CAL_LP_EN (1 << 6) +#define RB_CAL_WKUP_EN (1 << 5) +#define RB_OSC_HALT_MD (1 << 4) +#define RB_OSC_CNT_VLU (0x0F) + + +#ifdef CLK_OSC32K +#if ( CLK_OSC32K == 1 ) +#define CAB_LSIFQ 32000 +#else +#define CAB_LSIFQ 32768 +#endif +#else +#define CAB_LSIFQ 32000 +#endif +#endif + + +void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState); +void RTC_EnterConfigMode(void); +void RTC_ExitConfigMode(void); +uint32_t RTC_GetCounter(void); +void RTC_SetCounter(uint32_t CounterValue); +void RTC_SetPrescaler(uint32_t PrescalerValue); +void RTC_SetAlarm(uint32_t AlarmValue); +uint32_t RTC_GetDivider(void); +void RTC_WaitForLastTask(void); +void RTC_WaitForSynchro(void); +FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG); +void RTC_ClearFlag(uint16_t RTC_FLAG); +ITStatus RTC_GetITStatus(uint16_t RTC_IT); +void RTC_ClearITPendingBit(uint16_t RTC_IT); + +#if defined(CH32V20x_D8) || defined(CH32V20x_D8W) +void Calibration_LSI(Cali_LevelTypeDef cali_Lv); + +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_spi.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_spi.h new file mode 100644 index 0000000000..dfa5f9e7df --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_spi.h @@ -0,0 +1,218 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_spi.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * SPI firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_SPI_H +#define __CH32V20x_SPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* SPI Init structure definition */ +typedef struct +{ + uint16_t SPI_Direction; /* Specifies the SPI unidirectional or bidirectional data mode. + This parameter can be a value of @ref SPI_data_direction */ + + uint16_t SPI_Mode; /* Specifies the SPI operating mode. + This parameter can be a value of @ref SPI_mode */ + + uint16_t SPI_DataSize; /* Specifies the SPI data size. + This parameter can be a value of @ref SPI_data_size */ + + uint16_t SPI_CPOL; /* Specifies the serial clock steady state. + This parameter can be a value of @ref SPI_Clock_Polarity */ + + uint16_t SPI_CPHA; /* Specifies the clock active edge for the bit capture. + This parameter can be a value of @ref SPI_Clock_Phase */ + + uint16_t SPI_NSS; /* Specifies whether the NSS signal is managed by + hardware (NSS pin) or by software using the SSI bit. + This parameter can be a value of @ref SPI_Slave_Select_management */ + + uint16_t SPI_BaudRatePrescaler; /* Specifies the Baud Rate prescaler value which will be + used to configure the transmit and receive SCK clock. + This parameter can be a value of @ref SPI_BaudRate_Prescaler. + @note The communication clock is derived from the master + clock. The slave clock does not need to be set. */ + + uint16_t SPI_FirstBit; /* Specifies whether data transfers start from MSB or LSB bit. + This parameter can be a value of @ref SPI_MSB_LSB_transmission */ + + uint16_t SPI_CRCPolynomial; /* Specifies the polynomial used for the CRC calculation. */ +} SPI_InitTypeDef; + +/* I2S Init structure definition */ +typedef struct +{ + uint16_t I2S_Mode; /* Specifies the I2S operating mode. + This parameter can be a value of @ref I2S_Mode */ + + uint16_t I2S_Standard; /* Specifies the standard used for the I2S communication. + This parameter can be a value of @ref I2S_Standard */ + + uint16_t I2S_DataFormat; /* Specifies the data format for the I2S communication. + This parameter can be a value of @ref I2S_Data_Format */ + + uint16_t I2S_MCLKOutput; /* Specifies whether the I2S MCLK output is enabled or not. + This parameter can be a value of @ref I2S_MCLK_Output */ + + uint32_t I2S_AudioFreq; /* Specifies the frequency selected for the I2S communication. + This parameter can be a value of @ref I2S_Audio_Frequency */ + + uint16_t I2S_CPOL; /* Specifies the idle state of the I2S clock. + This parameter can be a value of @ref I2S_Clock_Polarity */ +} I2S_InitTypeDef; + +/* SPI_data_direction */ +#define SPI_Direction_2Lines_FullDuplex ((uint16_t)0x0000) +#define SPI_Direction_2Lines_RxOnly ((uint16_t)0x0400) +#define SPI_Direction_1Line_Rx ((uint16_t)0x8000) +#define SPI_Direction_1Line_Tx ((uint16_t)0xC000) + +/* SPI_mode */ +#define SPI_Mode_Master ((uint16_t)0x0104) +#define SPI_Mode_Slave ((uint16_t)0x0000) + +/* SPI_data_size */ +#define SPI_DataSize_16b ((uint16_t)0x0800) +#define SPI_DataSize_8b ((uint16_t)0x0000) + +/* SPI_Clock_Polarity */ +#define SPI_CPOL_Low ((uint16_t)0x0000) +#define SPI_CPOL_High ((uint16_t)0x0002) + +/* SPI_Clock_Phase */ +#define SPI_CPHA_1Edge ((uint16_t)0x0000) +#define SPI_CPHA_2Edge ((uint16_t)0x0001) + +/* SPI_Slave_Select_management */ +#define SPI_NSS_Soft ((uint16_t)0x0200) +#define SPI_NSS_Hard ((uint16_t)0x0000) + +/* SPI_BaudRate_Prescaler */ +#define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000) +#define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008) +#define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010) +#define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018) +#define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020) +#define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028) +#define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030) +#define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038) + +/* SPI_MSB_LSB_transmission */ +#define SPI_FirstBit_MSB ((uint16_t)0x0000) +#define SPI_FirstBit_LSB ((uint16_t)0x0080) + +/* I2S_Mode */ +#define I2S_Mode_SlaveTx ((uint16_t)0x0000) +#define I2S_Mode_SlaveRx ((uint16_t)0x0100) +#define I2S_Mode_MasterTx ((uint16_t)0x0200) +#define I2S_Mode_MasterRx ((uint16_t)0x0300) + +/* I2S_Standard */ +#define I2S_Standard_Phillips ((uint16_t)0x0000) +#define I2S_Standard_MSB ((uint16_t)0x0010) +#define I2S_Standard_LSB ((uint16_t)0x0020) +#define I2S_Standard_PCMShort ((uint16_t)0x0030) +#define I2S_Standard_PCMLong ((uint16_t)0x00B0) + +/* I2S_Data_Format */ +#define I2S_DataFormat_16b ((uint16_t)0x0000) +#define I2S_DataFormat_16bextended ((uint16_t)0x0001) +#define I2S_DataFormat_24b ((uint16_t)0x0003) +#define I2S_DataFormat_32b ((uint16_t)0x0005) + +/* I2S_MCLK_Output */ +#define I2S_MCLKOutput_Enable ((uint16_t)0x0200) +#define I2S_MCLKOutput_Disable ((uint16_t)0x0000) + +/* I2S_Audio_Frequency */ +#define I2S_AudioFreq_192k ((uint32_t)192000) +#define I2S_AudioFreq_96k ((uint32_t)96000) +#define I2S_AudioFreq_48k ((uint32_t)48000) +#define I2S_AudioFreq_44k ((uint32_t)44100) +#define I2S_AudioFreq_32k ((uint32_t)32000) +#define I2S_AudioFreq_22k ((uint32_t)22050) +#define I2S_AudioFreq_16k ((uint32_t)16000) +#define I2S_AudioFreq_11k ((uint32_t)11025) +#define I2S_AudioFreq_8k ((uint32_t)8000) +#define I2S_AudioFreq_Default ((uint32_t)2) + +/* I2S_Clock_Polarity */ +#define I2S_CPOL_Low ((uint16_t)0x0000) +#define I2S_CPOL_High ((uint16_t)0x0008) + +/* SPI_I2S_DMA_transfer_requests */ +#define SPI_I2S_DMAReq_Tx ((uint16_t)0x0002) +#define SPI_I2S_DMAReq_Rx ((uint16_t)0x0001) + +/* SPI_NSS_internal_software_management */ +#define SPI_NSSInternalSoft_Set ((uint16_t)0x0100) +#define SPI_NSSInternalSoft_Reset ((uint16_t)0xFEFF) + +/* SPI_CRC_Transmit_Receive */ +#define SPI_CRC_Tx ((uint8_t)0x00) +#define SPI_CRC_Rx ((uint8_t)0x01) + +/* SPI_direction_transmit_receive */ +#define SPI_Direction_Rx ((uint16_t)0xBFFF) +#define SPI_Direction_Tx ((uint16_t)0x4000) + +/* SPI_I2S_interrupts_definition */ +#define SPI_I2S_IT_TXE ((uint8_t)0x71) +#define SPI_I2S_IT_RXNE ((uint8_t)0x60) +#define SPI_I2S_IT_ERR ((uint8_t)0x50) +#define SPI_I2S_IT_OVR ((uint8_t)0x56) +#define SPI_IT_MODF ((uint8_t)0x55) +#define SPI_IT_CRCERR ((uint8_t)0x54) +#define I2S_IT_UDR ((uint8_t)0x53) + +/* SPI_I2S_flags_definition */ +#define SPI_I2S_FLAG_RXNE ((uint16_t)0x0001) +#define SPI_I2S_FLAG_TXE ((uint16_t)0x0002) +#define I2S_FLAG_CHSIDE ((uint16_t)0x0004) +#define I2S_FLAG_UDR ((uint16_t)0x0008) +#define SPI_FLAG_CRCERR ((uint16_t)0x0010) +#define SPI_FLAG_MODF ((uint16_t)0x0020) +#define SPI_I2S_FLAG_OVR ((uint16_t)0x0040) +#define SPI_I2S_FLAG_BSY ((uint16_t)0x0080) + +void SPI_I2S_DeInit(SPI_TypeDef *SPIx); +void SPI_Init(SPI_TypeDef *SPIx, SPI_InitTypeDef *SPI_InitStruct); +void I2S_Init(SPI_TypeDef *SPIx, I2S_InitTypeDef *I2S_InitStruct); +void SPI_StructInit(SPI_InitTypeDef *SPI_InitStruct); +void I2S_StructInit(I2S_InitTypeDef *I2S_InitStruct); +void SPI_Cmd(SPI_TypeDef *SPIx, FunctionalState NewState); +void I2S_Cmd(SPI_TypeDef *SPIx, FunctionalState NewState); +void SPI_I2S_ITConfig(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); +void SPI_I2S_DMACmd(SPI_TypeDef *SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState); +void SPI_I2S_SendData(SPI_TypeDef *SPIx, uint16_t Data); +uint16_t SPI_I2S_ReceiveData(SPI_TypeDef *SPIx); +void SPI_NSSInternalSoftwareConfig(SPI_TypeDef *SPIx, uint16_t SPI_NSSInternalSoft); +void SPI_SSOutputCmd(SPI_TypeDef *SPIx, FunctionalState NewState); +void SPI_DataSizeConfig(SPI_TypeDef *SPIx, uint16_t SPI_DataSize); +void SPI_TransmitCRC(SPI_TypeDef *SPIx); +void SPI_CalculateCRC(SPI_TypeDef *SPIx, FunctionalState NewState); +uint16_t SPI_GetCRC(SPI_TypeDef *SPIx, uint8_t SPI_CRC); +uint16_t SPI_GetCRCPolynomial(SPI_TypeDef *SPIx); +void SPI_BiDirectionalLineConfig(SPI_TypeDef *SPIx, uint16_t SPI_Direction); +FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef *SPIx, uint16_t SPI_I2S_FLAG); +void SPI_I2S_ClearFlag(SPI_TypeDef *SPIx, uint16_t SPI_I2S_FLAG); +ITStatus SPI_I2S_GetITStatus(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT); +void SPI_I2S_ClearITPendingBit(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_tim.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_tim.h new file mode 100644 index 0000000000..64821f7a6d --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_tim.h @@ -0,0 +1,506 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_tim.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * TIM firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_TIM_H +#define __CH32V20x_TIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* TIM Time Base Init structure definition */ +typedef struct +{ + uint16_t TIM_Prescaler; /* Specifies the prescaler value used to divide the TIM clock. + This parameter can be a number between 0x0000 and 0xFFFF */ + + uint16_t TIM_CounterMode; /* Specifies the counter mode. + This parameter can be a value of @ref TIM_Counter_Mode */ + + uint16_t TIM_Period; /* Specifies the period value to be loaded into the active + Auto-Reload Register at the next update event. + This parameter must be a number between 0x0000 and 0xFFFF. */ + + uint16_t TIM_ClockDivision; /* Specifies the clock division. + This parameter can be a value of @ref TIM_Clock_Division_CKD */ + + uint8_t TIM_RepetitionCounter; /* Specifies the repetition counter value. Each time the RCR downcounter + reaches zero, an update event is generated and counting restarts + from the RCR value (N). + This means in PWM mode that (N+1) corresponds to: + - the number of PWM periods in edge-aligned mode + - the number of half PWM period in center-aligned mode + This parameter must be a number between 0x00 and 0xFF. + @note This parameter is valid only for TIM1 and TIM8. */ +} TIM_TimeBaseInitTypeDef; + +/* TIM Output Compare Init structure definition */ +typedef struct +{ + uint16_t TIM_OCMode; /* Specifies the TIM mode. + This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ + + uint16_t TIM_OutputState; /* Specifies the TIM Output Compare state. + This parameter can be a value of @ref TIM_Output_Compare_state */ + + uint16_t TIM_OutputNState; /* Specifies the TIM complementary Output Compare state. + This parameter can be a value of @ref TIM_Output_Compare_N_state + @note This parameter is valid only for TIM1 and TIM8. */ + + uint16_t TIM_Pulse; /* Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between 0x0000 and 0xFFFF */ + + uint16_t TIM_OCPolarity; /* Specifies the output polarity. + This parameter can be a value of @ref TIM_Output_Compare_Polarity */ + + uint16_t TIM_OCNPolarity; /* Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_Output_Compare_N_Polarity + @note This parameter is valid only for TIM1 and TIM8. */ + + uint16_t TIM_OCIdleState; /* Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_Idle_State + @note This parameter is valid only for TIM1 and TIM8. */ + + uint16_t TIM_OCNIdleState; /* Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State + @note This parameter is valid only for TIM1 and TIM8. */ +} TIM_OCInitTypeDef; + +/* TIM Input Capture Init structure definition */ +typedef struct +{ + uint16_t TIM_Channel; /* Specifies the TIM channel. + This parameter can be a value of @ref TIM_Channel */ + + uint16_t TIM_ICPolarity; /* Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint16_t TIM_ICSelection; /* Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint16_t TIM_ICPrescaler; /* Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint16_t TIM_ICFilter; /* Specifies the input capture filter. + This parameter can be a number between 0x0 and 0xF */ +} TIM_ICInitTypeDef; + +/* BDTR structure definition */ +typedef struct +{ + uint16_t TIM_OSSRState; /* Specifies the Off-State selection used in Run mode. + This parameter can be a value of @ref OSSR_Off_State_Selection_for_Run_mode_state */ + + uint16_t TIM_OSSIState; /* Specifies the Off-State used in Idle state. + This parameter can be a value of @ref OSSI_Off_State_Selection_for_Idle_mode_state */ + + uint16_t TIM_LOCKLevel; /* Specifies the LOCK level parameters. + This parameter can be a value of @ref Lock_level */ + + uint16_t TIM_DeadTime; /* Specifies the delay time between the switching-off and the + switching-on of the outputs. + This parameter can be a number between 0x00 and 0xFF */ + + uint16_t TIM_Break; /* Specifies whether the TIM Break input is enabled or not. + This parameter can be a value of @ref Break_Input_enable_disable */ + + uint16_t TIM_BreakPolarity; /* Specifies the TIM Break Input pin polarity. + This parameter can be a value of @ref Break_Polarity */ + + uint16_t TIM_AutomaticOutput; /* Specifies whether the TIM Automatic Output feature is enabled or not. + This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ +} TIM_BDTRInitTypeDef; + +/* TIM_Output_Compare_and_PWM_modes */ +#define TIM_OCMode_Timing ((uint16_t)0x0000) +#define TIM_OCMode_Active ((uint16_t)0x0010) +#define TIM_OCMode_Inactive ((uint16_t)0x0020) +#define TIM_OCMode_Toggle ((uint16_t)0x0030) +#define TIM_OCMode_PWM1 ((uint16_t)0x0060) +#define TIM_OCMode_PWM2 ((uint16_t)0x0070) + +/* TIM_One_Pulse_Mode */ +#define TIM_OPMode_Single ((uint16_t)0x0008) +#define TIM_OPMode_Repetitive ((uint16_t)0x0000) + +/* TIM_Channel */ +#define TIM_Channel_1 ((uint16_t)0x0000) +#define TIM_Channel_2 ((uint16_t)0x0004) +#define TIM_Channel_3 ((uint16_t)0x0008) +#define TIM_Channel_4 ((uint16_t)0x000C) + +/* TIM_Clock_Division_CKD */ +#define TIM_CKD_DIV1 ((uint16_t)0x0000) +#define TIM_CKD_DIV2 ((uint16_t)0x0100) +#define TIM_CKD_DIV4 ((uint16_t)0x0200) + +/* TIM_Counter_Mode */ +#define TIM_CounterMode_Up ((uint16_t)0x0000) +#define TIM_CounterMode_Down ((uint16_t)0x0010) +#define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) +#define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) +#define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060) + +/* TIM_Output_Compare_Polarity */ +#define TIM_OCPolarity_High ((uint16_t)0x0000) +#define TIM_OCPolarity_Low ((uint16_t)0x0002) + +/* TIM_Output_Compare_N_Polarity */ +#define TIM_OCNPolarity_High ((uint16_t)0x0000) +#define TIM_OCNPolarity_Low ((uint16_t)0x0008) + +/* TIM_Output_Compare_state */ +#define TIM_OutputState_Disable ((uint16_t)0x0000) +#define TIM_OutputState_Enable ((uint16_t)0x0001) + +/* TIM_Output_Compare_N_state */ +#define TIM_OutputNState_Disable ((uint16_t)0x0000) +#define TIM_OutputNState_Enable ((uint16_t)0x0004) + +/* TIM_Capture_Compare_state */ +#define TIM_CCx_Enable ((uint16_t)0x0001) +#define TIM_CCx_Disable ((uint16_t)0x0000) + +/* TIM_Capture_Compare_N_state */ +#define TIM_CCxN_Enable ((uint16_t)0x0004) +#define TIM_CCxN_Disable ((uint16_t)0x0000) + +/* Break_Input_enable_disable */ +#define TIM_Break_Enable ((uint16_t)0x1000) +#define TIM_Break_Disable ((uint16_t)0x0000) + +/* Break_Polarity */ +#define TIM_BreakPolarity_Low ((uint16_t)0x0000) +#define TIM_BreakPolarity_High ((uint16_t)0x2000) + +/* TIM_AOE_Bit_Set_Reset */ +#define TIM_AutomaticOutput_Enable ((uint16_t)0x4000) +#define TIM_AutomaticOutput_Disable ((uint16_t)0x0000) + +/* Lock_level */ +#define TIM_LOCKLevel_OFF ((uint16_t)0x0000) +#define TIM_LOCKLevel_1 ((uint16_t)0x0100) +#define TIM_LOCKLevel_2 ((uint16_t)0x0200) +#define TIM_LOCKLevel_3 ((uint16_t)0x0300) + +/* OSSI_Off_State_Selection_for_Idle_mode_state */ +#define TIM_OSSIState_Enable ((uint16_t)0x0400) +#define TIM_OSSIState_Disable ((uint16_t)0x0000) + +/* OSSR_Off_State_Selection_for_Run_mode_state */ +#define TIM_OSSRState_Enable ((uint16_t)0x0800) +#define TIM_OSSRState_Disable ((uint16_t)0x0000) + +/* TIM_Output_Compare_Idle_State */ +#define TIM_OCIdleState_Set ((uint16_t)0x0100) +#define TIM_OCIdleState_Reset ((uint16_t)0x0000) + +/* TIM_Output_Compare_N_Idle_State */ +#define TIM_OCNIdleState_Set ((uint16_t)0x0200) +#define TIM_OCNIdleState_Reset ((uint16_t)0x0000) + +/* TIM_Input_Capture_Polarity */ +#define TIM_ICPolarity_Rising ((uint16_t)0x0000) +#define TIM_ICPolarity_Falling ((uint16_t)0x0002) +#define TIM_ICPolarity_BothEdge ((uint16_t)0x000A) + +/* TIM_Input_Capture_Selection */ +#define TIM_ICSelection_DirectTI ((uint16_t)0x0001) /* TIM Input 1, 2, 3 or 4 is selected to be \ + connected to IC1, IC2, IC3 or IC4, respectively */ +#define TIM_ICSelection_IndirectTI ((uint16_t)0x0002) /* TIM Input 1, 2, 3 or 4 is selected to be \ + connected to IC2, IC1, IC4 or IC3, respectively. */ +#define TIM_ICSelection_TRC ((uint16_t)0x0003) /* TIM Input 1, 2, 3 or 4 is selected to be connected to TRC. */ + +/* TIM_Input_Capture_Prescaler */ +#define TIM_ICPSC_DIV1 ((uint16_t)0x0000) /* Capture performed each time an edge is detected on the capture input. */ +#define TIM_ICPSC_DIV2 ((uint16_t)0x0004) /* Capture performed once every 2 events. */ +#define TIM_ICPSC_DIV4 ((uint16_t)0x0008) /* Capture performed once every 4 events. */ +#define TIM_ICPSC_DIV8 ((uint16_t)0x000C) /* Capture performed once every 8 events. */ + +/* TIM_interrupt_sources */ +#define TIM_IT_Update ((uint16_t)0x0001) +#define TIM_IT_CC1 ((uint16_t)0x0002) +#define TIM_IT_CC2 ((uint16_t)0x0004) +#define TIM_IT_CC3 ((uint16_t)0x0008) +#define TIM_IT_CC4 ((uint16_t)0x0010) +#define TIM_IT_COM ((uint16_t)0x0020) +#define TIM_IT_Trigger ((uint16_t)0x0040) +#define TIM_IT_Break ((uint16_t)0x0080) + +/* TIM_DMA_Base_address */ +#define TIM_DMABase_CR1 ((uint16_t)0x0000) +#define TIM_DMABase_CR2 ((uint16_t)0x0001) +#define TIM_DMABase_SMCR ((uint16_t)0x0002) +#define TIM_DMABase_DIER ((uint16_t)0x0003) +#define TIM_DMABase_SR ((uint16_t)0x0004) +#define TIM_DMABase_EGR ((uint16_t)0x0005) +#define TIM_DMABase_CCMR1 ((uint16_t)0x0006) +#define TIM_DMABase_CCMR2 ((uint16_t)0x0007) +#define TIM_DMABase_CCER ((uint16_t)0x0008) +#define TIM_DMABase_CNT ((uint16_t)0x0009) +#define TIM_DMABase_PSC ((uint16_t)0x000A) +#define TIM_DMABase_ARR ((uint16_t)0x000B) +#define TIM_DMABase_RCR ((uint16_t)0x000C) +#define TIM_DMABase_CCR1 ((uint16_t)0x000D) +#define TIM_DMABase_CCR2 ((uint16_t)0x000E) +#define TIM_DMABase_CCR3 ((uint16_t)0x000F) +#define TIM_DMABase_CCR4 ((uint16_t)0x0010) +#define TIM_DMABase_BDTR ((uint16_t)0x0011) +#define TIM_DMABase_DCR ((uint16_t)0x0012) + +/* TIM_DMA_Burst_Length */ +#define TIM_DMABurstLength_1Transfer ((uint16_t)0x0000) +#define TIM_DMABurstLength_2Transfers ((uint16_t)0x0100) +#define TIM_DMABurstLength_3Transfers ((uint16_t)0x0200) +#define TIM_DMABurstLength_4Transfers ((uint16_t)0x0300) +#define TIM_DMABurstLength_5Transfers ((uint16_t)0x0400) +#define TIM_DMABurstLength_6Transfers ((uint16_t)0x0500) +#define TIM_DMABurstLength_7Transfers ((uint16_t)0x0600) +#define TIM_DMABurstLength_8Transfers ((uint16_t)0x0700) +#define TIM_DMABurstLength_9Transfers ((uint16_t)0x0800) +#define TIM_DMABurstLength_10Transfers ((uint16_t)0x0900) +#define TIM_DMABurstLength_11Transfers ((uint16_t)0x0A00) +#define TIM_DMABurstLength_12Transfers ((uint16_t)0x0B00) +#define TIM_DMABurstLength_13Transfers ((uint16_t)0x0C00) +#define TIM_DMABurstLength_14Transfers ((uint16_t)0x0D00) +#define TIM_DMABurstLength_15Transfers ((uint16_t)0x0E00) +#define TIM_DMABurstLength_16Transfers ((uint16_t)0x0F00) +#define TIM_DMABurstLength_17Transfers ((uint16_t)0x1000) +#define TIM_DMABurstLength_18Transfers ((uint16_t)0x1100) + +/* TIM_DMA_sources */ +#define TIM_DMA_Update ((uint16_t)0x0100) +#define TIM_DMA_CC1 ((uint16_t)0x0200) +#define TIM_DMA_CC2 ((uint16_t)0x0400) +#define TIM_DMA_CC3 ((uint16_t)0x0800) +#define TIM_DMA_CC4 ((uint16_t)0x1000) +#define TIM_DMA_COM ((uint16_t)0x2000) +#define TIM_DMA_Trigger ((uint16_t)0x4000) + +/* TIM_External_Trigger_Prescaler */ +#define TIM_ExtTRGPSC_OFF ((uint16_t)0x0000) +#define TIM_ExtTRGPSC_DIV2 ((uint16_t)0x1000) +#define TIM_ExtTRGPSC_DIV4 ((uint16_t)0x2000) +#define TIM_ExtTRGPSC_DIV8 ((uint16_t)0x3000) + +/* TIM_Internal_Trigger_Selection */ +#define TIM_TS_ITR0 ((uint16_t)0x0000) +#define TIM_TS_ITR1 ((uint16_t)0x0010) +#define TIM_TS_ITR2 ((uint16_t)0x0020) +#define TIM_TS_ITR3 ((uint16_t)0x0030) +#define TIM_TS_TI1F_ED ((uint16_t)0x0040) +#define TIM_TS_TI1FP1 ((uint16_t)0x0050) +#define TIM_TS_TI2FP2 ((uint16_t)0x0060) +#define TIM_TS_ETRF ((uint16_t)0x0070) + +/* TIM_TIx_External_Clock_Source */ +#define TIM_TIxExternalCLK1Source_TI1 ((uint16_t)0x0050) +#define TIM_TIxExternalCLK1Source_TI2 ((uint16_t)0x0060) +#define TIM_TIxExternalCLK1Source_TI1ED ((uint16_t)0x0040) + +/* TIM_External_Trigger_Polarity */ +#define TIM_ExtTRGPolarity_Inverted ((uint16_t)0x8000) +#define TIM_ExtTRGPolarity_NonInverted ((uint16_t)0x0000) + +/* TIM_Prescaler_Reload_Mode */ +#define TIM_PSCReloadMode_Update ((uint16_t)0x0000) +#define TIM_PSCReloadMode_Immediate ((uint16_t)0x0001) + +/* TIM_Forced_Action */ +#define TIM_ForcedAction_Active ((uint16_t)0x0050) +#define TIM_ForcedAction_InActive ((uint16_t)0x0040) + +/* TIM_Encoder_Mode */ +#define TIM_EncoderMode_TI1 ((uint16_t)0x0001) +#define TIM_EncoderMode_TI2 ((uint16_t)0x0002) +#define TIM_EncoderMode_TI12 ((uint16_t)0x0003) + +/* TIM_Event_Source */ +#define TIM_EventSource_Update ((uint16_t)0x0001) +#define TIM_EventSource_CC1 ((uint16_t)0x0002) +#define TIM_EventSource_CC2 ((uint16_t)0x0004) +#define TIM_EventSource_CC3 ((uint16_t)0x0008) +#define TIM_EventSource_CC4 ((uint16_t)0x0010) +#define TIM_EventSource_COM ((uint16_t)0x0020) +#define TIM_EventSource_Trigger ((uint16_t)0x0040) +#define TIM_EventSource_Break ((uint16_t)0x0080) + +/* TIM_Update_Source */ +#define TIM_UpdateSource_Global ((uint16_t)0x0000) /* Source of update is the counter overflow/underflow \ + or the setting of UG bit, or an update generation \ + through the slave mode controller. */ +#define TIM_UpdateSource_Regular ((uint16_t)0x0001) /* Source of update is counter overflow/underflow. */ + +/* TIM_Output_Compare_Preload_State */ +#define TIM_OCPreload_Enable ((uint16_t)0x0008) +#define TIM_OCPreload_Disable ((uint16_t)0x0000) + +/* TIM_Output_Compare_Fast_State */ +#define TIM_OCFast_Enable ((uint16_t)0x0004) +#define TIM_OCFast_Disable ((uint16_t)0x0000) + +/* TIM_Output_Compare_Clear_State */ +#define TIM_OCClear_Enable ((uint16_t)0x0080) +#define TIM_OCClear_Disable ((uint16_t)0x0000) + +/* TIM_Trigger_Output_Source */ +#define TIM_TRGOSource_Reset ((uint16_t)0x0000) +#define TIM_TRGOSource_Enable ((uint16_t)0x0010) +#define TIM_TRGOSource_Update ((uint16_t)0x0020) +#define TIM_TRGOSource_OC1 ((uint16_t)0x0030) +#define TIM_TRGOSource_OC1Ref ((uint16_t)0x0040) +#define TIM_TRGOSource_OC2Ref ((uint16_t)0x0050) +#define TIM_TRGOSource_OC3Ref ((uint16_t)0x0060) +#define TIM_TRGOSource_OC4Ref ((uint16_t)0x0070) + +/* TIM_Slave_Mode */ +#define TIM_SlaveMode_Reset ((uint16_t)0x0004) +#define TIM_SlaveMode_Gated ((uint16_t)0x0005) +#define TIM_SlaveMode_Trigger ((uint16_t)0x0006) +#define TIM_SlaveMode_External1 ((uint16_t)0x0007) + +/* TIM_Master_Slave_Mode */ +#define TIM_MasterSlaveMode_Enable ((uint16_t)0x0080) +#define TIM_MasterSlaveMode_Disable ((uint16_t)0x0000) + +/* TIM_Flags */ +#define TIM_FLAG_Update ((uint16_t)0x0001) +#define TIM_FLAG_CC1 ((uint16_t)0x0002) +#define TIM_FLAG_CC2 ((uint16_t)0x0004) +#define TIM_FLAG_CC3 ((uint16_t)0x0008) +#define TIM_FLAG_CC4 ((uint16_t)0x0010) +#define TIM_FLAG_COM ((uint16_t)0x0020) +#define TIM_FLAG_Trigger ((uint16_t)0x0040) +#define TIM_FLAG_Break ((uint16_t)0x0080) +#define TIM_FLAG_CC1OF ((uint16_t)0x0200) +#define TIM_FLAG_CC2OF ((uint16_t)0x0400) +#define TIM_FLAG_CC3OF ((uint16_t)0x0800) +#define TIM_FLAG_CC4OF ((uint16_t)0x1000) + +/* TIM_Legacy */ +#define TIM_DMABurstLength_1Byte TIM_DMABurstLength_1Transfer +#define TIM_DMABurstLength_2Bytes TIM_DMABurstLength_2Transfers +#define TIM_DMABurstLength_3Bytes TIM_DMABurstLength_3Transfers +#define TIM_DMABurstLength_4Bytes TIM_DMABurstLength_4Transfers +#define TIM_DMABurstLength_5Bytes TIM_DMABurstLength_5Transfers +#define TIM_DMABurstLength_6Bytes TIM_DMABurstLength_6Transfers +#define TIM_DMABurstLength_7Bytes TIM_DMABurstLength_7Transfers +#define TIM_DMABurstLength_8Bytes TIM_DMABurstLength_8Transfers +#define TIM_DMABurstLength_9Bytes TIM_DMABurstLength_9Transfers +#define TIM_DMABurstLength_10Bytes TIM_DMABurstLength_10Transfers +#define TIM_DMABurstLength_11Bytes TIM_DMABurstLength_11Transfers +#define TIM_DMABurstLength_12Bytes TIM_DMABurstLength_12Transfers +#define TIM_DMABurstLength_13Bytes TIM_DMABurstLength_13Transfers +#define TIM_DMABurstLength_14Bytes TIM_DMABurstLength_14Transfers +#define TIM_DMABurstLength_15Bytes TIM_DMABurstLength_15Transfers +#define TIM_DMABurstLength_16Bytes TIM_DMABurstLength_16Transfers +#define TIM_DMABurstLength_17Bytes TIM_DMABurstLength_17Transfers +#define TIM_DMABurstLength_18Bytes TIM_DMABurstLength_18Transfers + +void TIM_DeInit(TIM_TypeDef *TIMx); +void TIM_TimeBaseInit(TIM_TypeDef *TIMx, TIM_TimeBaseInitTypeDef *TIM_TimeBaseInitStruct); +void TIM_OC1Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct); +void TIM_OC2Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct); +void TIM_OC3Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct); +void TIM_OC4Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct); +void TIM_ICInit(TIM_TypeDef *TIMx, TIM_ICInitTypeDef *TIM_ICInitStruct); +void TIM_PWMIConfig(TIM_TypeDef *TIMx, TIM_ICInitTypeDef *TIM_ICInitStruct); +void TIM_BDTRConfig(TIM_TypeDef *TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct); +void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef *TIM_TimeBaseInitStruct); +void TIM_OCStructInit(TIM_OCInitTypeDef *TIM_OCInitStruct); +void TIM_ICStructInit(TIM_ICInitTypeDef *TIM_ICInitStruct); +void TIM_BDTRStructInit(TIM_BDTRInitTypeDef *TIM_BDTRInitStruct); +void TIM_Cmd(TIM_TypeDef *TIMx, FunctionalState NewState); +void TIM_CtrlPWMOutputs(TIM_TypeDef *TIMx, FunctionalState NewState); +void TIM_ITConfig(TIM_TypeDef *TIMx, uint16_t TIM_IT, FunctionalState NewState); +void TIM_GenerateEvent(TIM_TypeDef *TIMx, uint16_t TIM_EventSource); +void TIM_DMAConfig(TIM_TypeDef *TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength); +void TIM_DMACmd(TIM_TypeDef *TIMx, uint16_t TIM_DMASource, FunctionalState NewState); +void TIM_InternalClockConfig(TIM_TypeDef *TIMx); +void TIM_ITRxExternalClockConfig(TIM_TypeDef *TIMx, uint16_t TIM_InputTriggerSource); +void TIM_TIxExternalClockConfig(TIM_TypeDef *TIMx, uint16_t TIM_TIxExternalCLKSource, + uint16_t TIM_ICPolarity, uint16_t ICFilter); +void TIM_ETRClockMode1Config(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter); +void TIM_ETRClockMode2Config(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler, + uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter); +void TIM_ETRConfig(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter); +void TIM_PrescalerConfig(TIM_TypeDef *TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode); +void TIM_CounterModeConfig(TIM_TypeDef *TIMx, uint16_t TIM_CounterMode); +void TIM_SelectInputTrigger(TIM_TypeDef *TIMx, uint16_t TIM_InputTriggerSource); +void TIM_EncoderInterfaceConfig(TIM_TypeDef *TIMx, uint16_t TIM_EncoderMode, + uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity); +void TIM_ForcedOC1Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC2Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC3Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC4Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction); +void TIM_ARRPreloadConfig(TIM_TypeDef *TIMx, FunctionalState NewState); +void TIM_SelectCOM(TIM_TypeDef *TIMx, FunctionalState NewState); +void TIM_SelectCCDMA(TIM_TypeDef *TIMx, FunctionalState NewState); +void TIM_CCPreloadControl(TIM_TypeDef *TIMx, FunctionalState NewState); +void TIM_OC1PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload); +void TIM_OC2PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload); +void TIM_OC3PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload); +void TIM_OC4PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload); +void TIM_OC1FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast); +void TIM_OC2FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast); +void TIM_OC3FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast); +void TIM_OC4FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast); +void TIM_ClearOC1Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC2Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC3Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC4Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear); +void TIM_OC1PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity); +void TIM_OC1NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity); +void TIM_OC2PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity); +void TIM_OC2NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity); +void TIM_OC3PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity); +void TIM_OC3NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity); +void TIM_OC4PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity); +void TIM_CCxCmd(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx); +void TIM_CCxNCmd(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN); +void TIM_SelectOCxM(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode); +void TIM_UpdateDisableConfig(TIM_TypeDef *TIMx, FunctionalState NewState); +void TIM_UpdateRequestConfig(TIM_TypeDef *TIMx, uint16_t TIM_UpdateSource); +void TIM_SelectHallSensor(TIM_TypeDef *TIMx, FunctionalState NewState); +void TIM_SelectOnePulseMode(TIM_TypeDef *TIMx, uint16_t TIM_OPMode); +void TIM_SelectOutputTrigger(TIM_TypeDef *TIMx, uint16_t TIM_TRGOSource); +void TIM_SelectSlaveMode(TIM_TypeDef *TIMx, uint16_t TIM_SlaveMode); +void TIM_SelectMasterSlaveMode(TIM_TypeDef *TIMx, uint16_t TIM_MasterSlaveMode); +void TIM_SetCounter(TIM_TypeDef *TIMx, uint16_t Counter); +void TIM_SetAutoreload(TIM_TypeDef *TIMx, uint16_t Autoreload); +void TIM_SetCompare1(TIM_TypeDef *TIMx, uint16_t Compare1); +void TIM_SetCompare2(TIM_TypeDef *TIMx, uint16_t Compare2); +void TIM_SetCompare3(TIM_TypeDef *TIMx, uint16_t Compare3); +void TIM_SetCompare4(TIM_TypeDef *TIMx, uint16_t Compare4); +void TIM_SetIC1Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC2Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC3Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC4Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC); +void TIM_SetClockDivision(TIM_TypeDef *TIMx, uint16_t TIM_CKD); +uint16_t TIM_GetCapture1(TIM_TypeDef *TIMx); +uint16_t TIM_GetCapture2(TIM_TypeDef *TIMx); +uint16_t TIM_GetCapture3(TIM_TypeDef *TIMx); +uint16_t TIM_GetCapture4(TIM_TypeDef *TIMx); +uint16_t TIM_GetCounter(TIM_TypeDef *TIMx); +uint16_t TIM_GetPrescaler(TIM_TypeDef *TIMx); +FlagStatus TIM_GetFlagStatus(TIM_TypeDef *TIMx, uint16_t TIM_FLAG); +void TIM_ClearFlag(TIM_TypeDef *TIMx, uint16_t TIM_FLAG); +ITStatus TIM_GetITStatus(TIM_TypeDef *TIMx, uint16_t TIM_IT); +void TIM_ClearITPendingBit(TIM_TypeDef *TIMx, uint16_t TIM_IT); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_usart.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_usart.h new file mode 100644 index 0000000000..1211381452 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_usart.h @@ -0,0 +1,185 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_usart.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the + * USART firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_USART_H +#define __CH32V20x_USART_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* USART Init Structure definition */ +typedef struct +{ + uint32_t USART_BaudRate; /* This member configures the USART communication baud rate. + The baud rate is computed using the following formula: + - IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate))) + - FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 */ + + uint16_t USART_WordLength; /* Specifies the number of data bits transmitted or received in a frame. + This parameter can be a value of @ref USART_Word_Length */ + + uint16_t USART_StopBits; /* Specifies the number of stop bits transmitted. + This parameter can be a value of @ref USART_Stop_Bits */ + + uint16_t USART_Parity; /* Specifies the parity mode. + This parameter can be a value of @ref USART_Parity + @note When parity is enabled, the computed parity is inserted + at the MSB position of the transmitted data (9th bit when + the word length is set to 9 data bits; 8th bit when the + word length is set to 8 data bits). */ + + uint16_t USART_Mode; /* Specifies wether the Receive or Transmit mode is enabled or disabled. + This parameter can be a value of @ref USART_Mode */ + + uint16_t USART_HardwareFlowControl; /* Specifies wether the hardware flow control mode is enabled + or disabled. + This parameter can be a value of @ref USART_Hardware_Flow_Control */ +} USART_InitTypeDef; + +/* USART Clock Init Structure definition */ +typedef struct +{ + uint16_t USART_Clock; /* Specifies whether the USART clock is enabled or disabled. + This parameter can be a value of @ref USART_Clock */ + + uint16_t USART_CPOL; /* Specifies the steady state value of the serial clock. + This parameter can be a value of @ref USART_Clock_Polarity */ + + uint16_t USART_CPHA; /* Specifies the clock transition on which the bit capture is made. + This parameter can be a value of @ref USART_Clock_Phase */ + + uint16_t USART_LastBit; /* 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 */ +} USART_ClockInitTypeDef; + +/* USART_Word_Length */ +#define USART_WordLength_8b ((uint16_t)0x0000) +#define USART_WordLength_9b ((uint16_t)0x1000) + +/* USART_Stop_Bits */ +#define USART_StopBits_1 ((uint16_t)0x0000) +#define USART_StopBits_0_5 ((uint16_t)0x1000) +#define USART_StopBits_2 ((uint16_t)0x2000) +#define USART_StopBits_1_5 ((uint16_t)0x3000) + +/* USART_Parity */ +#define USART_Parity_No ((uint16_t)0x0000) +#define USART_Parity_Even ((uint16_t)0x0400) +#define USART_Parity_Odd ((uint16_t)0x0600) + +/* USART_Mode */ +#define USART_Mode_Rx ((uint16_t)0x0004) +#define USART_Mode_Tx ((uint16_t)0x0008) + +/* USART_Hardware_Flow_Control */ +#define USART_HardwareFlowControl_None ((uint16_t)0x0000) +#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) +#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) +#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) + +/* USART_Clock */ +#define USART_Clock_Disable ((uint16_t)0x0000) +#define USART_Clock_Enable ((uint16_t)0x0800) + +/* USART_Clock_Polarity */ +#define USART_CPOL_Low ((uint16_t)0x0000) +#define USART_CPOL_High ((uint16_t)0x0400) + +/* USART_Clock_Phase */ +#define USART_CPHA_1Edge ((uint16_t)0x0000) +#define USART_CPHA_2Edge ((uint16_t)0x0200) + +/* USART_Last_Bit */ +#define USART_LastBit_Disable ((uint16_t)0x0000) +#define USART_LastBit_Enable ((uint16_t)0x0100) + +/* USART_Interrupt_definition */ +#define USART_IT_PE ((uint16_t)0x0028) +#define USART_IT_TXE ((uint16_t)0x0727) +#define USART_IT_TC ((uint16_t)0x0626) +#define USART_IT_RXNE ((uint16_t)0x0525) +#define USART_IT_ORE_RX ((uint16_t)0x0325) +#define USART_IT_IDLE ((uint16_t)0x0424) +#define USART_IT_LBD ((uint16_t)0x0846) +#define USART_IT_CTS ((uint16_t)0x096A) +#define USART_IT_ERR ((uint16_t)0x0060) +#define USART_IT_ORE_ER ((uint16_t)0x0360) +#define USART_IT_NE ((uint16_t)0x0260) +#define USART_IT_FE ((uint16_t)0x0160) + +#define USART_IT_ORE USART_IT_ORE_ER + +/* USART_DMA_Requests */ +#define USART_DMAReq_Tx ((uint16_t)0x0080) +#define USART_DMAReq_Rx ((uint16_t)0x0040) + +/* USART_WakeUp_methods */ +#define USART_WakeUp_IdleLine ((uint16_t)0x0000) +#define USART_WakeUp_AddressMark ((uint16_t)0x0800) + +/* USART_LIN_Break_Detection_Length */ +#define USART_LINBreakDetectLength_10b ((uint16_t)0x0000) +#define USART_LINBreakDetectLength_11b ((uint16_t)0x0020) + +/* USART_IrDA_Low_Power */ +#define USART_IrDAMode_LowPower ((uint16_t)0x0004) +#define USART_IrDAMode_Normal ((uint16_t)0x0000) + +/* USART_Flags */ +#define USART_FLAG_CTS ((uint16_t)0x0200) +#define USART_FLAG_LBD ((uint16_t)0x0100) +#define USART_FLAG_TXE ((uint16_t)0x0080) +#define USART_FLAG_TC ((uint16_t)0x0040) +#define USART_FLAG_RXNE ((uint16_t)0x0020) +#define USART_FLAG_IDLE ((uint16_t)0x0010) +#define USART_FLAG_ORE ((uint16_t)0x0008) +#define USART_FLAG_NE ((uint16_t)0x0004) +#define USART_FLAG_FE ((uint16_t)0x0002) +#define USART_FLAG_PE ((uint16_t)0x0001) + +void USART_DeInit(USART_TypeDef *USARTx); +void USART_Init(USART_TypeDef *USARTx, USART_InitTypeDef *USART_InitStruct); +void USART_StructInit(USART_InitTypeDef *USART_InitStruct); +void USART_ClockInit(USART_TypeDef *USARTx, USART_ClockInitTypeDef *USART_ClockInitStruct); +void USART_ClockStructInit(USART_ClockInitTypeDef *USART_ClockInitStruct); +void USART_Cmd(USART_TypeDef *USARTx, FunctionalState NewState); +void USART_ITConfig(USART_TypeDef *USARTx, uint16_t USART_IT, FunctionalState NewState); +void USART_DMACmd(USART_TypeDef *USARTx, uint16_t USART_DMAReq, FunctionalState NewState); +void USART_SetAddress(USART_TypeDef *USARTx, uint8_t USART_Address); +void USART_WakeUpConfig(USART_TypeDef *USARTx, uint16_t USART_WakeUp); +void USART_ReceiverWakeUpCmd(USART_TypeDef *USARTx, FunctionalState NewState); +void USART_LINBreakDetectLengthConfig(USART_TypeDef *USARTx, uint16_t USART_LINBreakDetectLength); +void USART_LINCmd(USART_TypeDef *USARTx, FunctionalState NewState); +void USART_SendData(USART_TypeDef *USARTx, uint16_t Data); +uint16_t USART_ReceiveData(USART_TypeDef *USARTx); +void USART_SendBreak(USART_TypeDef *USARTx); +void USART_SetGuardTime(USART_TypeDef *USARTx, uint8_t USART_GuardTime); +void USART_SetPrescaler(USART_TypeDef *USARTx, uint8_t USART_Prescaler); +void USART_SmartCardCmd(USART_TypeDef *USARTx, FunctionalState NewState); +void USART_SmartCardNACKCmd(USART_TypeDef *USARTx, FunctionalState NewState); +void USART_HalfDuplexCmd(USART_TypeDef *USARTx, FunctionalState NewState); +void USART_OverSampling8Cmd(USART_TypeDef *USARTx, FunctionalState NewState); +void USART_OneBitMethodCmd(USART_TypeDef *USARTx, FunctionalState NewState); +void USART_IrDAConfig(USART_TypeDef *USARTx, uint16_t USART_IrDAMode); +void USART_IrDACmd(USART_TypeDef *USARTx, FunctionalState NewState); +FlagStatus USART_GetFlagStatus(USART_TypeDef *USARTx, uint16_t USART_FLAG); +void USART_ClearFlag(USART_TypeDef *USARTx, uint16_t USART_FLAG); +ITStatus USART_GetITStatus(USART_TypeDef *USARTx, uint16_t USART_IT); +void USART_ClearITPendingBit(USART_TypeDef *USARTx, uint16_t USART_IT); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_wwdg.h b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_wwdg.h new file mode 100644 index 0000000000..5cbcbce146 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/include/ch32v20x_wwdg.h @@ -0,0 +1,39 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_wwdg.h + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file contains all the functions prototypes for the WWDG + * firmware library. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#ifndef __CH32V20x_WWDG_H +#define __CH32V20x_WWDG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ch32v20x.h" + +/* WWDG_Prescaler */ +#define WWDG_Prescaler_1 ((uint32_t)0x00000000) +#define WWDG_Prescaler_2 ((uint32_t)0x00000080) +#define WWDG_Prescaler_4 ((uint32_t)0x00000100) +#define WWDG_Prescaler_8 ((uint32_t)0x00000180) + +void WWDG_DeInit(void); +void WWDG_SetPrescaler(uint32_t WWDG_Prescaler); +void WWDG_SetWindowValue(uint8_t WindowValue); +void WWDG_EnableIT(void); +void WWDG_SetCounter(uint8_t Counter); +void WWDG_Enable(uint8_t Counter); +FlagStatus WWDG_GetFlagStatus(void); +void WWDG_ClearFlag(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_adc.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_adc.c new file mode 100644 index 0000000000..3d794583e6 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_adc.c @@ -0,0 +1,1208 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_adc.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the ADC firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#include "ch32v20x_adc.h" +#include "ch32v20x_rcc.h" + +/* ADC DISCNUM mask */ +#define CTLR1_DISCNUM_Reset ((uint32_t)0xFFFF1FFF) + +/* ADC DISCEN mask */ +#define CTLR1_DISCEN_Set ((uint32_t)0x00000800) +#define CTLR1_DISCEN_Reset ((uint32_t)0xFFFFF7FF) + +/* ADC JAUTO mask */ +#define CTLR1_JAUTO_Set ((uint32_t)0x00000400) +#define CTLR1_JAUTO_Reset ((uint32_t)0xFFFFFBFF) + +/* ADC JDISCEN mask */ +#define CTLR1_JDISCEN_Set ((uint32_t)0x00001000) +#define CTLR1_JDISCEN_Reset ((uint32_t)0xFFFFEFFF) + +/* ADC AWDCH mask */ +#define CTLR1_AWDCH_Reset ((uint32_t)0xFFFFFFE0) + +/* ADC Analog watchdog enable mode mask */ +#define CTLR1_AWDMode_Reset ((uint32_t)0xFF3FFDFF) + +/* CTLR1 register Mask */ +#define CTLR1_CLEAR_Mask ((uint32_t)0xE0F0FEFF) + +/* ADC ADON mask */ +#define CTLR2_ADON_Set ((uint32_t)0x00000001) +#define CTLR2_ADON_Reset ((uint32_t)0xFFFFFFFE) + +/* ADC DMA mask */ +#define CTLR2_DMA_Set ((uint32_t)0x00000100) +#define CTLR2_DMA_Reset ((uint32_t)0xFFFFFEFF) + +/* ADC RSTCAL mask */ +#define CTLR2_RSTCAL_Set ((uint32_t)0x00000008) + +/* ADC CAL mask */ +#define CTLR2_CAL_Set ((uint32_t)0x00000004) + +/* ADC SWSTART mask */ +#define CTLR2_SWSTART_Set ((uint32_t)0x00400000) + +/* ADC EXTTRIG mask */ +#define CTLR2_EXTTRIG_Set ((uint32_t)0x00100000) +#define CTLR2_EXTTRIG_Reset ((uint32_t)0xFFEFFFFF) + +/* ADC Software start mask */ +#define CTLR2_EXTTRIG_SWSTART_Set ((uint32_t)0x00500000) +#define CTLR2_EXTTRIG_SWSTART_Reset ((uint32_t)0xFFAFFFFF) + +/* ADC JEXTSEL mask */ +#define CTLR2_JEXTSEL_Reset ((uint32_t)0xFFFF8FFF) + +/* ADC JEXTTRIG mask */ +#define CTLR2_JEXTTRIG_Set ((uint32_t)0x00008000) +#define CTLR2_JEXTTRIG_Reset ((uint32_t)0xFFFF7FFF) + +/* ADC JSWSTART mask */ +#define CTLR2_JSWSTART_Set ((uint32_t)0x00200000) + +/* ADC injected software start mask */ +#define CTLR2_JEXTTRIG_JSWSTART_Set ((uint32_t)0x00208000) +#define CTLR2_JEXTTRIG_JSWSTART_Reset ((uint32_t)0xFFDF7FFF) + +/* ADC TSPD mask */ +#define CTLR2_TSVREFE_Set ((uint32_t)0x00800000) +#define CTLR2_TSVREFE_Reset ((uint32_t)0xFF7FFFFF) + +/* CTLR2 register Mask */ +#define CTLR2_CLEAR_Mask ((uint32_t)0xFFF1F7FD) + +/* ADC SQx mask */ +#define RSQR3_SQ_Set ((uint32_t)0x0000001F) +#define RSQR2_SQ_Set ((uint32_t)0x0000001F) +#define RSQR1_SQ_Set ((uint32_t)0x0000001F) + +/* RSQR1 register Mask */ +#define RSQR1_CLEAR_Mask ((uint32_t)0xFF0FFFFF) + +/* ADC JSQx mask */ +#define ISQR_JSQ_Set ((uint32_t)0x0000001F) + +/* ADC JL mask */ +#define ISQR_JL_Set ((uint32_t)0x00300000) +#define ISQR_JL_Reset ((uint32_t)0xFFCFFFFF) + +/* ADC SMPx mask */ +#define SAMPTR1_SMP_Set ((uint32_t)0x00000007) +#define SAMPTR2_SMP_Set ((uint32_t)0x00000007) + +/* ADC IDATARx registers offset */ +#define IDATAR_Offset ((uint8_t)0x28) + +/* ADC1 RDATAR register base address */ +#define RDATAR_ADDRESS ((uint32_t)0x4001244C) + +/********************************************************************* + * @fn ADC_DeInit + * + * @brief Deinitializes the ADCx peripheral registers to their default + * reset values. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return none + */ +void ADC_DeInit(ADC_TypeDef *ADCx) +{ + if(ADCx == ADC1) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE); + } + else if(ADCx == ADC2) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, DISABLE); + } +} + +/********************************************************************* + * @fn ADC_Init + * + * @brief Initializes the ADCx peripheral according to the specified + * parameters in the ADC_InitStruct. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_InitStruct - pointer to an ADC_InitTypeDef structure that + * contains the configuration information for the specified ADC + * peripheral. + * + * @return none + */ +void ADC_Init(ADC_TypeDef *ADCx, ADC_InitTypeDef *ADC_InitStruct) +{ + uint32_t tmpreg1 = 0; + uint8_t tmpreg2 = 0; + + tmpreg1 = ADCx->CTLR1; + tmpreg1 &= CTLR1_CLEAR_Mask; + tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_Mode | (uint32_t)ADC_InitStruct->ADC_OutputBuffer | + (uint32_t)ADC_InitStruct->ADC_Pga | ((uint32_t)ADC_InitStruct->ADC_ScanConvMode << 8)); + ADCx->CTLR1 = tmpreg1; + + tmpreg1 = ADCx->CTLR2; + tmpreg1 &= CTLR2_CLEAR_Mask; + tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_DataAlign | ADC_InitStruct->ADC_ExternalTrigConv | + ((uint32_t)ADC_InitStruct->ADC_ContinuousConvMode << 1)); + ADCx->CTLR2 = tmpreg1; + + tmpreg1 = ADCx->RSQR1; + tmpreg1 &= RSQR1_CLEAR_Mask; + tmpreg2 |= (uint8_t)(ADC_InitStruct->ADC_NbrOfChannel - (uint8_t)1); + tmpreg1 |= (uint32_t)tmpreg2 << 20; + ADCx->RSQR1 = tmpreg1; +} + +/********************************************************************* + * @fn ADC_StructInit + * + * @brief Fills each ADC_InitStruct member with its default value. + * + * @param ADC_InitStruct - pointer to an ADC_InitTypeDef structure that + * contains the configuration information for the specified ADC + * peripheral. + * + * @return none + */ +void ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct) +{ + ADC_InitStruct->ADC_Mode = ADC_Mode_Independent; + ADC_InitStruct->ADC_ScanConvMode = DISABLE; + ADC_InitStruct->ADC_ContinuousConvMode = DISABLE; + ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; + ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right; + ADC_InitStruct->ADC_NbrOfChannel = 1; +} + +/********************************************************************* + * @fn ADC_Cmd + * + * @brief Enables or disables the specified ADC peripheral. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void ADC_Cmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR2 |= CTLR2_ADON_Set; + } + else + { + ADCx->CTLR2 &= CTLR2_ADON_Reset; + } +} + +/********************************************************************* + * @fn ADC_DMACmd + * + * @brief Enables or disables the specified ADC DMA request. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void ADC_DMACmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR2 |= CTLR2_DMA_Set; + } + else + { + ADCx->CTLR2 &= CTLR2_DMA_Reset; + } +} + +/********************************************************************* + * @fn ADC_ITConfig + * + * @brief Enables or disables the specified ADC interrupts. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_IT - specifies the ADC interrupt sources to be enabled or disabled. + * ADC_IT_EOC - End of conversion interrupt mask. + * ADC_IT_AWD - Analog watchdog interrupt mask. + * ADC_IT_JEOC - End of injected conversion interrupt mask. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void ADC_ITConfig(ADC_TypeDef *ADCx, uint16_t ADC_IT, FunctionalState NewState) +{ + uint8_t itmask = 0; + + itmask = (uint8_t)ADC_IT; + + if(NewState != DISABLE) + { + ADCx->CTLR1 |= itmask; + } + else + { + ADCx->CTLR1 &= (~(uint32_t)itmask); + } +} + +/********************************************************************* + * @fn ADC_ResetCalibration + * + * @brief Resets the selected ADC calibration registers. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return none + */ +void ADC_ResetCalibration(ADC_TypeDef *ADCx) +{ + ADCx->CTLR2 |= CTLR2_RSTCAL_Set; +} + +/********************************************************************* + * @fn ADC_GetResetCalibrationStatus + * + * @brief Gets the selected ADC reset calibration registers status. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return FlagStatus: SET or RESET. + */ +FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef *ADCx) +{ + FlagStatus bitstatus = RESET; + + if((ADCx->CTLR2 & CTLR2_RSTCAL_Set) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ADC_StartCalibration + * + * @brief Starts the selected ADC calibration process. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return None + */ +void ADC_StartCalibration(ADC_TypeDef *ADCx) +{ + ADCx->CTLR2 |= CTLR2_CAL_Set; +} + +/********************************************************************* + * @fn ADC_GetCalibrationStatus + * + * @brief Gets the selected ADC calibration status. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return FlagStatus: SET or RESET. + */ +FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef *ADCx) +{ + FlagStatus bitstatus = RESET; + + if((ADCx->CTLR2 & CTLR2_CAL_Set) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ADC_SoftwareStartConvCmd + * + * @brief Enables or disables the selected ADC software start conversion. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_SoftwareStartConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR2 |= CTLR2_EXTTRIG_SWSTART_Set; + } + else + { + ADCx->CTLR2 &= CTLR2_EXTTRIG_SWSTART_Reset; + } +} + +/********************************************************************* + * @fn ADC_GetSoftwareStartConvStatus + * + * @brief Gets the selected ADC Software start conversion Status. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return FlagStatus - SET or RESET. + */ + +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef *ADCx) +{ + FlagStatus bitstatus = RESET; + + if((ADCx->CTLR2 & CTLR2_SWSTART_Set) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ADC_DiscModeChannelCountConfig + * + * @brief Configures the discontinuous mode for the selected ADC regular + * group channel. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * Number - specifies the discontinuous mode regular channel + * count value(1-8). + * + * @return None + */ +void ADC_DiscModeChannelCountConfig(ADC_TypeDef *ADCx, uint8_t Number) +{ + uint32_t tmpreg1 = 0; + uint32_t tmpreg2 = 0; + + tmpreg1 = ADCx->CTLR1; + tmpreg1 &= CTLR1_DISCNUM_Reset; + tmpreg2 = Number - 1; + tmpreg1 |= tmpreg2 << 13; + ADCx->CTLR1 = tmpreg1; +} + +/********************************************************************* + * @fn ADC_DiscModeCmd + * + * @brief Enables or disables the discontinuous mode on regular group + * channel for the specified ADC. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_DiscModeCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR1 |= CTLR1_DISCEN_Set; + } + else + { + ADCx->CTLR1 &= CTLR1_DISCEN_Reset; + } +} + +/********************************************************************* + * @fn ADC_RegularChannelConfig + * + * @brief Configures for the selected ADC regular channel its corresponding + * rank in the sequencer and its sample time. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_Channel - the ADC channel to configure. + * ADC_Channel_0 - ADC Channel0 selected. + * ADC_Channel_1 - ADC Channel1 selected. + * ADC_Channel_2 - ADC Channel2 selected. + * ADC_Channel_3 - ADC Channel3 selected. + * ADC_Channel_4 - ADC Channel4 selected. + * ADC_Channel_5 - ADC Channel5 selected. + * ADC_Channel_6 - ADC Channel6 selected. + * ADC_Channel_7 - ADC Channel7 selected. + * ADC_Channel_8 - ADC Channel8 selected. + * ADC_Channel_9 - ADC Channel9 selected. + * ADC_Channel_10 - ADC Channel10 selected. + * ADC_Channel_11 - ADC Channel11 selected. + * ADC_Channel_12 - ADC Channel12 selected. + * ADC_Channel_13 - ADC Channel13 selected. + * ADC_Channel_14 - ADC Channel14 selected. + * ADC_Channel_15 - ADC Channel15 selected. + * ADC_Channel_16 - ADC Channel16 selected. + * ADC_Channel_17 - ADC Channel17 selected. + * Rank - The rank in the regular group sequencer. + * This parameter must be between 1 to 16. + * ADC_SampleTime - The sample time value to be set for the selected channel. + * ADC_SampleTime_1Cycles5 - Sample time equal to 1.5 cycles. + * ADC_SampleTime_7Cycles5 - Sample time equal to 7.5 cycles. + * ADC_SampleTime_13Cycles5 - Sample time equal to 13.5 cycles. + * ADC_SampleTime_28Cycles5 - Sample time equal to 28.5 cycles. + * ADC_SampleTime_41Cycles5 - Sample time equal to 41.5 cycles. + * ADC_SampleTime_55Cycles5 - Sample time equal to 55.5 cycles. + * ADC_SampleTime_71Cycles5 - Sample time equal to 71.5 cycles. + * ADC_SampleTime_239Cycles5 - Sample time equal to 239.5 cycles. + * + * @return None + */ +void ADC_RegularChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0; + + if(ADC_Channel > ADC_Channel_9) + { + tmpreg1 = ADCx->SAMPTR1; + tmpreg2 = SAMPTR1_SMP_Set << (3 * (ADC_Channel - 10)); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10)); + tmpreg1 |= tmpreg2; + ADCx->SAMPTR1 = tmpreg1; + } + else + { + tmpreg1 = ADCx->SAMPTR2; + tmpreg2 = SAMPTR2_SMP_Set << (3 * ADC_Channel); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); + tmpreg1 |= tmpreg2; + ADCx->SAMPTR2 = tmpreg1; + } + + if(Rank < 7) + { + tmpreg1 = ADCx->RSQR3; + tmpreg2 = RSQR3_SQ_Set << (5 * (Rank - 1)); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1)); + tmpreg1 |= tmpreg2; + ADCx->RSQR3 = tmpreg1; + } + else if(Rank < 13) + { + tmpreg1 = ADCx->RSQR2; + tmpreg2 = RSQR2_SQ_Set << (5 * (Rank - 7)); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 7)); + tmpreg1 |= tmpreg2; + ADCx->RSQR2 = tmpreg1; + } + else + { + tmpreg1 = ADCx->RSQR1; + tmpreg2 = RSQR1_SQ_Set << (5 * (Rank - 13)); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 13)); + tmpreg1 |= tmpreg2; + ADCx->RSQR1 = tmpreg1; + } +} + +/********************************************************************* + * @fn ADC_ExternalTrigConvCmd + * + * @brief Enables or disables the ADCx conversion through external trigger. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_ExternalTrigConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR2 |= CTLR2_EXTTRIG_Set; + } + else + { + ADCx->CTLR2 &= CTLR2_EXTTRIG_Reset; + } +} + +/********************************************************************* + * @fn ADC_GetConversionValue + * + * @brief Returns the last ADCx conversion result data for regular channel. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return ADCx->RDATAR - The Data conversion value. + */ +uint16_t ADC_GetConversionValue(ADC_TypeDef *ADCx) +{ + return (uint16_t)ADCx->RDATAR; +} + +/********************************************************************* + * @fn ADC_GetDualModeConversionValue + * + * @brief Returns the last ADC1 and ADC2 conversion result data in dual mode. + * + * @return RDATAR_ADDRESS - The Data conversion value. + */ +uint32_t ADC_GetDualModeConversionValue(void) +{ + return (*(__IO uint32_t *)RDATAR_ADDRESS); +} + +/********************************************************************* + * @fn ADC_AutoInjectedConvCmd + * + * @brief Enables or disables the selected ADC automatic injected group + * conversion after regular one. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_AutoInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR1 |= CTLR1_JAUTO_Set; + } + else + { + ADCx->CTLR1 &= CTLR1_JAUTO_Reset; + } +} + +/********************************************************************* + * @fn ADC_InjectedDiscModeCmd + * + * @brief Enables or disables the discontinuous mode for injected group + * channel for the specified ADC. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_InjectedDiscModeCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR1 |= CTLR1_JDISCEN_Set; + } + else + { + ADCx->CTLR1 &= CTLR1_JDISCEN_Reset; + } +} + +/********************************************************************* + * @fn ADC_ExternalTrigInjectedConvConfig + * + * @brief Configures the ADCx external trigger for injected channels conversion. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_ExternalTrigInjecConv - specifies the ADC trigger to start + * injected conversion. + * ADC_ExternalTrigInjecConv_T1_TRGO - Timer1 TRGO event selected. + * ADC_ExternalTrigInjecConv_T1_CC4 - Timer1 capture compare4 selected. + * ADC_ExternalTrigInjecConv_T2_TRGO - Timer2 TRGO event selected. + * ADC_ExternalTrigInjecConv_T2_CC1 - Timer2 capture compare1 selected. + * ADC_ExternalTrigInjecConv_T3_CC4 - Timer3 capture compare4 selected. + * ADC_ExternalTrigInjecConv_T4_TRGO - Timer4 TRGO event selected. + * ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4 - External interrupt + * line 15 event selected. + * ADC_ExternalTrigInjecConv_None: Injected conversion started + * by software and not by external trigger. + * + * @return None + */ +void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef *ADCx, uint32_t ADC_ExternalTrigInjecConv) +{ + uint32_t tmpreg = 0; + + tmpreg = ADCx->CTLR2; + tmpreg &= CTLR2_JEXTSEL_Reset; + tmpreg |= ADC_ExternalTrigInjecConv; + ADCx->CTLR2 = tmpreg; +} + +/********************************************************************* + * @fn ADC_ExternalTrigInjectedConvCmd + * + * @brief Enables or disables the ADCx injected channels conversion through + * external trigger. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR2 |= CTLR2_JEXTTRIG_Set; + } + else + { + ADCx->CTLR2 &= CTLR2_JEXTTRIG_Reset; + } +} + +/********************************************************************* + * @fn ADC_SoftwareStartInjectedConvCmd + * + * @brief Enables or disables the selected ADC start of the injected + * channels conversion. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR2 |= CTLR2_JEXTTRIG_JSWSTART_Set; + } + else + { + ADCx->CTLR2 &= CTLR2_JEXTTRIG_JSWSTART_Reset; + } +} + +/********************************************************************* + * @fn ADC_GetSoftwareStartInjectedConvCmdStatus + * + * @brief Gets the selected ADC Software start injected conversion Status. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return FlagStatus: SET or RESET. + */ +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef *ADCx) +{ + FlagStatus bitstatus = RESET; + + if((ADCx->CTLR2 & CTLR2_JSWSTART_Set) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ADC_InjectedChannelConfig + * + * @brief Configures for the selected ADC injected channel its corresponding + * rank in the sequencer and its sample time. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_Channel - the ADC channel to configure. + * ADC_Channel_0 - ADC Channel0 selected. + * ADC_Channel_1 - ADC Channel1 selected. + * ADC_Channel_2 - ADC Channel2 selected. + * ADC_Channel_3 - ADC Channel3 selected. + * ADC_Channel_4 - ADC Channel4 selected. + * ADC_Channel_5 - ADC Channel5 selected. + * ADC_Channel_6 - ADC Channel6 selected. + * ADC_Channel_7 - ADC Channel7 selected. + * ADC_Channel_8 - ADC Channel8 selected. + * ADC_Channel_9 - ADC Channel9 selected. + * ADC_Channel_10 - ADC Channel10 selected. + * ADC_Channel_11 - ADC Channel11 selected. + * ADC_Channel_12 - ADC Channel12 selected. + * ADC_Channel_13 - ADC Channel13 selected. + * ADC_Channel_14 - ADC Channel14 selected. + * ADC_Channel_15 - ADC Channel15 selected. + * ADC_Channel_16 - ADC Channel16 selected. + * ADC_Channel_17 - ADC Channel17 selected. + * Rank - The rank in the regular group sequencer. + * This parameter must be between 1 to 4. + * ADC_SampleTime - The sample time value to be set for the selected channel. + * ADC_SampleTime_1Cycles5 - Sample time equal to 1.5 cycles. + * ADC_SampleTime_7Cycles5 - Sample time equal to 7.5 cycles. + * ADC_SampleTime_13Cycles5 - Sample time equal to 13.5 cycles. + * ADC_SampleTime_28Cycles5 - Sample time equal to 28.5 cycles. + * ADC_SampleTime_41Cycles5 - Sample time equal to 41.5 cycles. + * ADC_SampleTime_55Cycles5 - Sample time equal to 55.5 cycles. + * ADC_SampleTime_71Cycles5 - Sample time equal to 71.5 cycles. + * ADC_SampleTime_239Cycles5 - Sample time equal to 239.5 cycles. + * + * @return None + */ +void ADC_InjectedChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0, tmpreg3 = 0; + + if(ADC_Channel > ADC_Channel_9) + { + tmpreg1 = ADCx->SAMPTR1; + tmpreg2 = SAMPTR1_SMP_Set << (3 * (ADC_Channel - 10)); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10)); + tmpreg1 |= tmpreg2; + ADCx->SAMPTR1 = tmpreg1; + } + else + { + tmpreg1 = ADCx->SAMPTR2; + tmpreg2 = SAMPTR2_SMP_Set << (3 * ADC_Channel); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); + tmpreg1 |= tmpreg2; + ADCx->SAMPTR2 = tmpreg1; + } + + tmpreg1 = ADCx->ISQR; + tmpreg3 = (tmpreg1 & ISQR_JL_Set) >> 20; + tmpreg2 = ISQR_JSQ_Set << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_Channel << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); + tmpreg1 |= tmpreg2; + ADCx->ISQR = tmpreg1; +} + +/********************************************************************* + * @fn ADC_InjectedSequencerLengthConfig + * + * @brief Configures the sequencer length for injected channels. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * Length - The sequencer length. + * This parameter must be a number between 1 to 4. + * + * @return None + */ +void ADC_InjectedSequencerLengthConfig(ADC_TypeDef *ADCx, uint8_t Length) +{ + uint32_t tmpreg1 = 0; + uint32_t tmpreg2 = 0; + + tmpreg1 = ADCx->ISQR; + tmpreg1 &= ISQR_JL_Reset; + tmpreg2 = Length - 1; + tmpreg1 |= tmpreg2 << 20; + ADCx->ISQR = tmpreg1; +} + +/********************************************************************* + * @fn ADC_SetInjectedOffset + * + * @brief Set the injected channels conversion value offset. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_InjectedChannel: the ADC injected channel to set its offset. + * ADC_InjectedChannel_1 - Injected Channel1 selected. + * ADC_InjectedChannel_2 - Injected Channel2 selected. + * ADC_InjectedChannel_3 - Injected Channel3 selected. + * ADC_InjectedChannel_4 - Injected Channel4 selected. + * Offset - the offset value for the selected ADC injected channel. + * This parameter must be a 12bit value. + * + * @return None + */ +void ADC_SetInjectedOffset(ADC_TypeDef *ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)ADCx; + tmp += ADC_InjectedChannel; + + *(__IO uint32_t *)tmp = (uint32_t)Offset; +} + +/********************************************************************* + * @fn ADC_GetInjectedConversionValue + * + * @brief Returns the ADC injected channel conversion result. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_InjectedChannel - the ADC injected channel to set its offset. + * ADC_InjectedChannel_1 - Injected Channel1 selected. + * ADC_InjectedChannel_2 - Injected Channel2 selected. + * ADC_InjectedChannel_3 - Injected Channel3 selected. + * ADC_InjectedChannel_4 - Injected Channel4 selected. + * + * @return tmp - The Data conversion value. + */ +uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef *ADCx, uint8_t ADC_InjectedChannel) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)ADCx; + tmp += ADC_InjectedChannel + IDATAR_Offset; + + return (uint16_t)(*(__IO uint32_t *)tmp); +} + +/********************************************************************* + * @fn ADC_AnalogWatchdogCmd + * + * @brief Enables or disables the analog watchdog on single/all regular + * or injected channels. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_AnalogWatchdog - the ADC analog watchdog configuration. + * ADC_AnalogWatchdog_SingleRegEnable - Analog watchdog on a + * single regular channel. + * ADC_AnalogWatchdog_SingleInjecEnable - Analog watchdog on a + * single injected channel. + * ADC_AnalogWatchdog_SingleRegOrInjecEnable - Analog watchdog + * on a single regular or injected channel. + * ADC_AnalogWatchdog_AllRegEnable - Analog watchdog on all + * regular channel. + * ADC_AnalogWatchdog_AllInjecEnable - Analog watchdog on all + * injected channel. + * ADC_AnalogWatchdog_AllRegAllInjecEnable - Analog watchdog on + * all regular and injected channels. + * ADC_AnalogWatchdog_None - No channel guarded by the analog + * watchdog. + * + * @return none + */ +void ADC_AnalogWatchdogCmd(ADC_TypeDef *ADCx, uint32_t ADC_AnalogWatchdog) +{ + uint32_t tmpreg = 0; + + tmpreg = ADCx->CTLR1; + tmpreg &= CTLR1_AWDMode_Reset; + tmpreg |= ADC_AnalogWatchdog; + ADCx->CTLR1 = tmpreg; +} + +/********************************************************************* + * @fn ADC_AnalogWatchdogThresholdsConfig + * + * @brief Configures the high and low thresholds of the analog watchdog. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * HighThreshold - the ADC analog watchdog High threshold value. + * This parameter must be a 12bit value. + * LowThreshold - the ADC analog watchdog Low threshold value. + * This parameter must be a 12bit value. + * + * @return none + */ +void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef *ADCx, uint16_t HighThreshold, + uint16_t LowThreshold) +{ + ADCx->WDHTR = HighThreshold; + ADCx->WDLTR = LowThreshold; +} + +/********************************************************************* + * @fn ADC_AnalogWatchdogSingleChannelConfig + * + * @brief Configures the analog watchdog guarded single channel. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_Channel - the ADC channel to configure. + * ADC_Channel_0 - ADC Channel0 selected. + * ADC_Channel_1 - ADC Channel1 selected. + * ADC_Channel_2 - ADC Channel2 selected. + * ADC_Channel_3 - ADC Channel3 selected. + * ADC_Channel_4 - ADC Channel4 selected. + * ADC_Channel_5 - ADC Channel5 selected. + * ADC_Channel_6 - ADC Channel6 selected. + * ADC_Channel_7 - ADC Channel7 selected. + * ADC_Channel_8 - ADC Channel8 selected. + * ADC_Channel_9 - ADC Channel9 selected. + * ADC_Channel_10 - ADC Channel10 selected. + * ADC_Channel_11 - ADC Channel11 selected. + * ADC_Channel_12 - ADC Channel12 selected. + * ADC_Channel_13 - ADC Channel13 selected. + * ADC_Channel_14 - ADC Channel14 selected. + * ADC_Channel_15 - ADC Channel15 selected. + * ADC_Channel_16 - ADC Channel16 selected. + * ADC_Channel_17 - ADC Channel17 selected. + * + * @return None + */ +void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel) +{ + uint32_t tmpreg = 0; + + tmpreg = ADCx->CTLR1; + tmpreg &= CTLR1_AWDCH_Reset; + tmpreg |= ADC_Channel; + ADCx->CTLR1 = tmpreg; +} + +/********************************************************************* + * @fn ADC_TempSensorVrefintCmd + * + * @brief Enables or disables the temperature sensor and Vrefint channel. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void ADC_TempSensorVrefintCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADC1->CTLR2 |= CTLR2_TSVREFE_Set; + } + else + { + ADC1->CTLR2 &= CTLR2_TSVREFE_Reset; + } +} + +/********************************************************************* + * @fn ADC_GetFlagStatus + * + * @brief Checks whether the specified ADC flag is set or not. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_FLAG - specifies the flag to check. + * ADC_FLAG_AWD - Analog watchdog flag. + * ADC_FLAG_EOC - End of conversion flag. + * ADC_FLAG_JEOC - End of injected group conversion flag. + * ADC_FLAG_JSTRT - Start of injected group conversion flag. + * ADC_FLAG_STRT - Start of regular group conversion flag. + * + * @return FlagStatus: SET or RESET. + */ +FlagStatus ADC_GetFlagStatus(ADC_TypeDef *ADCx, uint8_t ADC_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((ADCx->STATR & ADC_FLAG) != (uint8_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ADC_ClearFlag + * + * @brief Clears the ADCx's pending flags. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_FLAG - specifies the flag to clear. + * ADC_FLAG_AWD - Analog watchdog flag. + * ADC_FLAG_EOC - End of conversion flag. + * ADC_FLAG_JEOC - End of injected group conversion flag. + * ADC_FLAG_JSTRT - Start of injected group conversion flag. + * ADC_FLAG_STRT - Start of regular group conversion flag. + * + * @return none + */ +void ADC_ClearFlag(ADC_TypeDef *ADCx, uint8_t ADC_FLAG) +{ + ADCx->STATR = ~(uint32_t)ADC_FLAG; +} + +/********************************************************************* + * @fn ADC_GetITStatus + * + * @brief Checks whether the specified ADC interrupt has occurred or not. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_IT - specifies the ADC interrupt source to check. + * ADC_IT_EOC - End of conversion interrupt mask. + * ADC_IT_AWD - Analog watchdog interrupt mask. + * ADC_IT_JEOC - End of injected conversion interrupt mask. + * + * @return FlagStatus: SET or RESET. + */ +ITStatus ADC_GetITStatus(ADC_TypeDef *ADCx, uint16_t ADC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t itmask = 0, enablestatus = 0; + + itmask = ADC_IT >> 8; + enablestatus = (ADCx->CTLR1 & (uint8_t)ADC_IT); + + if(((ADCx->STATR & itmask) != (uint32_t)RESET) && enablestatus) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ADC_ClearITPendingBit + * + * @brief Clears the ADCx's interrupt pending bits. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_IT - specifies the ADC interrupt pending bit to clear. + * ADC_IT_EOC - End of conversion interrupt mask. + * ADC_IT_AWD - Analog watchdog interrupt mask. + * ADC_IT_JEOC - End of injected conversion interrupt mask. + * + * @return none + */ +void ADC_ClearITPendingBit(ADC_TypeDef *ADCx, uint16_t ADC_IT) +{ + uint8_t itmask = 0; + + itmask = (uint8_t)(ADC_IT >> 8); + ADCx->STATR = ~(uint32_t)itmask; +} + +/********************************************************************* + * @fn TempSensor_Volt_To_Temper + * + * @brief Internal Temperature Sensor Voltage to temperature. + * + * @param Value - Voltage Value(mv). + * + * @return Temper - Temperature Value. + */ +s32 TempSensor_Volt_To_Temper(s32 Value) +{ + s32 Temper, Refer_Volt, Refer_Temper; + s32 k = 43; + + Refer_Volt = (s32)((*(u32 *)0x1FFFF720) & 0x0000FFFF); + Refer_Temper = (s32)(((*(u32 *)0x1FFFF720) >> 16) & 0x0000FFFF); + + Temper = Refer_Temper - ((Value - Refer_Volt) * 10 + (k >> 1)) / k; + + return Temper; +} + +/********************************************************************* + * @fn ADC_BufferCmd + * + * @brief Enables or disables the ADCx buffer. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void ADC_BufferCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR1 |= (1 << 26); + } + else + { + ADCx->CTLR1 &= ~(1 << 26); + } +} + +/********************************************************************* + * @fn Get_CalibrationValue + * + * @brief Get ADCx Calibration Value. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return CalibrationValue + */ +int16_t Get_CalibrationValue(ADC_TypeDef *ADCx) +{ + __IO uint8_t i, j; + uint16_t buf[10]; + __IO uint16_t t; +#if defined (CH32V20x_D6) + __IO uint16_t p; +#endif + + for(i = 0; i < 10; i++){ + ADC_ResetCalibration(ADCx); + while(ADC_GetResetCalibrationStatus(ADCx)); + ADC_StartCalibration(ADCx); + while(ADC_GetCalibrationStatus(ADCx)); + buf[i] = ADCx->RDATAR; + } + + for(i = 0; i < 10; i++){ + for(j = 0; j < 9; j++){ + if(buf[j] > buf[j + 1]) + { + t = buf[j]; + buf[j] = buf[j + 1]; + buf[j + 1] = t; + } + } + } + +#if defined (CH32V20x_D8) || defined (CH32V20x_D8W) + t = 0; + for( i = 0; i < 6; i++ ) { + t += buf[i + 2]; + } + + t = ( t / 6 ) + ( ( t % 6 ) / 3 ); + + return ( int16_t )( 2048 - ( int16_t )t ); +#else + t = 0; + p = 0; + /* 1024 */ + for(i = 0; i < 6; i++ ){ + if(buf[i+2] > 1536) break; + t += buf[i+2]; + } + + if(i > 0){ + t = ( t / i ) + ( (( t % i )*2) / i ); + } + else t = 1024; + + /* 2048 */ + j = 6-i; + if(j > 0){ + for(; i < 6; i++ ){ + p += buf[i+2]; + } + + p = ( p / j ) + ( (( p % j )*2) / j ); + } + else p = 2048; + + return ( int16_t )(((( int16_t )( 1024 - ( int16_t )t ) + ( int16_t )( 2048 - ( int16_t )p ))/2) + ((( int16_t )( 1024 - ( int16_t )t ) + ( int16_t )( 2048 - ( int16_t )p ))%2)); + + +#endif +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_bkp.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_bkp.c new file mode 100644 index 0000000000..c21e23e39b --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_bkp.c @@ -0,0 +1,242 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_bkp.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the BKP firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#include "ch32v20x_bkp.h" +#include "ch32v20x_rcc.h" + +/* BKP registers bit mask */ + +/* OCTLR register bit mask */ +#define OCTLR_CAL_MASK ((uint16_t)0xFF80) +#define OCTLR_MASK ((uint16_t)0xFC7F) + +/********************************************************************* + * @fn BKP_DeInit + * + * @brief Deinitializes the BKP peripheral registers to their default reset values. + * + * @return none + */ +void BKP_DeInit(void) +{ + RCC_BackupResetCmd(ENABLE); + RCC_BackupResetCmd(DISABLE); +} + +/********************************************************************* + * @fn BKP_TamperPinLevelConfig + * + * @brief Configures the Tamper Pin active level. + * + * @param BKP_TamperPinLevel: specifies the Tamper Pin active level. + * BKP_TamperPinLevel_High - Tamper pin active on high level. + * BKP_TamperPinLevel_Low - Tamper pin active on low level. + * + * @return none + */ +void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel) +{ + if(BKP_TamperPinLevel) + { + BKP->TPCTLR |= (1 << 1); + } + else + { + BKP->TPCTLR &= ~(1 << 1); + } +} + +/********************************************************************* + * @fn BKP_TamperPinCmd + * + * @brief Enables or disables the Tamper Pin activation. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void BKP_TamperPinCmd(FunctionalState NewState) +{ + if(NewState) + { + BKP->TPCTLR |= (1 << 0); + } + else + { + BKP->TPCTLR &= ~(1 << 0); + } +} + +/********************************************************************* + * @fn BKP_ITConfig + * + * @brief Enables or disables the Tamper Pin Interrupt. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void BKP_ITConfig(FunctionalState NewState) +{ + if(NewState) + { + BKP->TPCSR |= (1 << 2); + } + else + { + BKP->TPCSR &= ~(1 << 2); + } +} + +/********************************************************************* + * @fn BKP_RTCOutputConfig + * + * @brief Select the RTC output source to output on the Tamper pin. + * + * @param BKP_RTCOutputSource - specifies the RTC output source. + * BKP_RTCOutputSource_None - no RTC output on the Tamper pin. + * BKP_RTCOutputSource_CalibClock - output the RTC clock with + * frequency divided by 64 on the Tamper pin. + * BKP_RTCOutputSource_Alarm - output the RTC Alarm pulse signal + * on the Tamper pin. + * BKP_RTCOutputSource_Second - output the RTC Second pulse + * signal on the Tamper pin. + * + * @return none + */ +void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource) +{ + uint16_t tmpreg = 0; + + tmpreg = BKP->OCTLR; + tmpreg &= OCTLR_MASK; + tmpreg |= BKP_RTCOutputSource; + BKP->OCTLR = tmpreg; +} + +/********************************************************************* + * @fn BKP_SetRTCCalibrationValue + * + * @brief Sets RTC Clock Calibration value. + * + * @param CalibrationValue - specifies the RTC Clock Calibration value. + * This parameter must be a number between 0 and 0x1F. + * + * @return none + */ +void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue) +{ + uint16_t tmpreg = 0; + + tmpreg = BKP->OCTLR; + tmpreg &= OCTLR_CAL_MASK; + tmpreg |= CalibrationValue; + BKP->OCTLR = tmpreg; +} + +/********************************************************************* + * @fn BKP_WriteBackupRegister + * + * @brief Writes user data to the specified Data Backup Register. + * + * @param BKP_DR - specifies the Data Backup Register. + * Data - data to write. + * + * @return none + */ +void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)BKP_BASE; + tmp += BKP_DR; + *(__IO uint32_t *)tmp = Data; +} + +/********************************************************************* + * @fn BKP_ReadBackupRegister + * + * @brief Reads data from the specified Data Backup Register. + * + * @param BKP_DR - specifies the Data Backup Register. + * This parameter can be BKP_DRx where x=[1, 42]. + * + * @return none + */ +uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)BKP_BASE; + tmp += BKP_DR; + + return (*(__IO uint16_t *)tmp); +} + +/********************************************************************* + * @fn BKP_GetFlagStatus + * + * @brief Checks whether the Tamper Pin Event flag is set or not. + * + * @return FlagStatus - SET or RESET. + */ +FlagStatus BKP_GetFlagStatus(void) +{ + if(BKP->TPCSR & (1 << 8)) + { + return SET; + } + else + { + return RESET; + } +} + +/********************************************************************* + * @fn BKP_ClearFlag + * + * @brief Clears Tamper Pin Event pending flag. + * + * @return none + */ +void BKP_ClearFlag(void) +{ + BKP->TPCSR |= BKP_CTE; +} + +/********************************************************************* + * @fn BKP_GetITStatus + * + * @brief Checks whether the Tamper Pin Interrupt has occurred or not. + * + * @return ITStatus - SET or RESET. + */ +ITStatus BKP_GetITStatus(void) +{ + if(BKP->TPCSR & (1 << 9)) + { + return SET; + } + else + { + return RESET; + } +} + +/********************************************************************* + * @fn BKP_ClearITPendingBit + * + * @brief Clears Tamper Pin Interrupt pending bit. + * + * @return none + */ +void BKP_ClearITPendingBit(void) +{ + BKP->TPCSR |= BKP_CTI; +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_can.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_can.c new file mode 100644 index 0000000000..b255de13b7 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_can.c @@ -0,0 +1,1228 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_can.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the CAN firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#include "ch32v20x_can.h" +#include "ch32v20x_rcc.h" + +/* CAN CTLR Register bits */ +#define CTLR_DBF ((uint32_t)0x00010000) + +/* CAN Mailbox Transmit Request */ +#define TMIDxR_TXRQ ((uint32_t)0x00000001) + +/* CAN FCTLR Register bits */ +#define FCTLR_FINIT ((uint32_t)0x00000001) + +/* Time out for INAK bit */ +#define INAK_TIMEOUT ((uint32_t)0x0000FFFF) +/* Time out for SLAK bit */ +#define SLAK_TIMEOUT ((uint32_t)0x0000FFFF) + + +/* Flags in TSTATR register */ +#define CAN_FLAGS_TSTATR ((uint32_t)0x08000000) +/* Flags in RFIFO1 register */ +#define CAN_FLAGS_RFIFO1 ((uint32_t)0x04000000) +/* Flags in RFIFO0 register */ +#define CAN_FLAGS_RFIFO0 ((uint32_t)0x02000000) +/* Flags in STATR register */ +#define CAN_FLAGS_STATR ((uint32_t)0x01000000) +/* Flags in ERRSR register */ +#define CAN_FLAGS_ERRSR ((uint32_t)0x00F00000) + +/* Mailboxes definition */ +#define CAN_TXMAILBOX_0 ((uint8_t)0x00) +#define CAN_TXMAILBOX_1 ((uint8_t)0x01) +#define CAN_TXMAILBOX_2 ((uint8_t)0x02) + + +#define CAN_MODE_MASK ((uint32_t) 0x00000003) + +static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit); + + +/********************************************************************* + * @fn CAN_DeInit + * + * @brief Deinitializes the CAN peripheral registers to their default reset + * values. + * + * @param CANx - where x can be 1 or 2 to select the CAN peripheral. + * + * @return none + */ +void CAN_DeInit(CAN_TypeDef* CANx) +{ + if (CANx == CAN1) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, DISABLE); + } + else + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, DISABLE); + } +} + +/********************************************************************* + * @fn CAN_Init + * + * @brief Initializes the CAN peripheral according to the specified + * parameters in the CAN_InitStruct. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_InitStruct - pointer to a CAN_InitTypeDef structure that + * contains the configuration information for the CAN peripheral. + * + * @return InitStatus - CAN InitStatus state. +* CAN_InitStatus_Failed. +* CAN_InitStatus_Success. + */ +uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct) +{ + uint8_t InitStatus = CAN_InitStatus_Failed; + uint32_t wait_ack = 0x00000000; + + CANx->CTLR &= (~(uint32_t)CAN_CTLR_SLEEP); + CANx->CTLR |= CAN_CTLR_INRQ ; + + while (((CANx->STATR & CAN_STATR_INAK) != CAN_STATR_INAK) && (wait_ack != INAK_TIMEOUT)) + { + wait_ack++; + } + + if ((CANx->STATR & CAN_STATR_INAK) != CAN_STATR_INAK) + { + InitStatus = CAN_InitStatus_Failed; + } + else + { + if (CAN_InitStruct->CAN_TTCM == ENABLE) + { + CANx->CTLR |= CAN_CTLR_TTCM; + } + else + { + CANx->CTLR &= ~(uint32_t)CAN_CTLR_TTCM; + } + + if (CAN_InitStruct->CAN_ABOM == ENABLE) + { + CANx->CTLR |= CAN_CTLR_ABOM; + } + else + { + CANx->CTLR &= ~(uint32_t)CAN_CTLR_ABOM; + } + + if (CAN_InitStruct->CAN_AWUM == ENABLE) + { + CANx->CTLR |= CAN_CTLR_AWUM; + } + else + { + CANx->CTLR &= ~(uint32_t)CAN_CTLR_AWUM; + } + + if (CAN_InitStruct->CAN_NART == ENABLE) + { + CANx->CTLR |= CAN_CTLR_NART; + } + else + { + CANx->CTLR &= ~(uint32_t)CAN_CTLR_NART; + } + + if (CAN_InitStruct->CAN_RFLM == ENABLE) + { + CANx->CTLR |= CAN_CTLR_RFLM; + } + else + { + CANx->CTLR &= ~(uint32_t)CAN_CTLR_RFLM; + } + + if (CAN_InitStruct->CAN_TXFP == ENABLE) + { + CANx->CTLR |= CAN_CTLR_TXFP; + } + else + { + CANx->CTLR &= ~(uint32_t)CAN_CTLR_TXFP; + } + + CANx->BTIMR = (uint32_t)((uint32_t)CAN_InitStruct->CAN_Mode << 30) | \ + ((uint32_t)CAN_InitStruct->CAN_SJW << 24) | \ + ((uint32_t)CAN_InitStruct->CAN_BS1 << 16) | \ + ((uint32_t)CAN_InitStruct->CAN_BS2 << 20) | \ + ((uint32_t)CAN_InitStruct->CAN_Prescaler - 1); + CANx->CTLR &= ~(uint32_t)CAN_CTLR_INRQ; + wait_ack = 0; + + while (((CANx->STATR & CAN_STATR_INAK) == CAN_STATR_INAK) && (wait_ack != INAK_TIMEOUT)) + { + wait_ack++; + } + + if ((CANx->STATR & CAN_STATR_INAK) == CAN_STATR_INAK) + { + InitStatus = CAN_InitStatus_Failed; + } + else + { + InitStatus = CAN_InitStatus_Success ; + } + } + + return InitStatus; +} + +/********************************************************************* + * @fn CAN_FilterInit + * + * @brief Initializes the CAN peripheral according to the specified + * parameters in the CAN_FilterInitStruct. + * + * @param CAN_FilterInitStruct - pointer to a CAN_FilterInitTypeDef + * structure that contains the configuration information. + * + * @return none + */ +void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct) +{ + uint32_t filter_number_bit_pos = 0; + + filter_number_bit_pos = ((uint32_t)1) << CAN_FilterInitStruct->CAN_FilterNumber; + CAN1->FCTLR |= FCTLR_FINIT; + CAN1->FWR &= ~(uint32_t)filter_number_bit_pos; + + if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_16bit) + { + CAN1->FSCFGR &= ~(uint32_t)filter_number_bit_pos; + + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); + + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh); + } + + if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_32bit) + { + CAN1->FSCFGR |= filter_number_bit_pos; + + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); + + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow); + } + +#if defined (CH32V20x_D6) + if(((*(uint32_t *) 0x40022030) & 0x0F000000) == 0) + { + uint32_t i; + + for(i = 0; i < 64; i++){ + *(__IO uint16_t *)(0x40006000 + 512 + 4 * i) = *(__IO uint16_t *)(0x40006000 + 768 + 4 * i); + } + } + +#endif + + if (CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdMask) + { + CAN1->FMCFGR &= ~(uint32_t)filter_number_bit_pos; + } + else + { + CAN1->FMCFGR |= (uint32_t)filter_number_bit_pos; + } + + if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO0) + { + CAN1->FAFIFOR &= ~(uint32_t)filter_number_bit_pos; + } + + if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO1) + { + CAN1->FAFIFOR |= (uint32_t)filter_number_bit_pos; + } + + if (CAN_FilterInitStruct->CAN_FilterActivation == ENABLE) + { + CAN1->FWR |= filter_number_bit_pos; + } + + CAN1->FCTLR &= ~FCTLR_FINIT; +} + +/********************************************************************* + * @fn CAN_StructInit + * + * @brief Fills each CAN_InitStruct member with its default value. + * + * @param CAN_InitStruct - pointer to a CAN_InitTypeDef structure which + * will be initialized. + * + * @return none + */ +void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct) +{ + CAN_InitStruct->CAN_TTCM = DISABLE; + CAN_InitStruct->CAN_ABOM = DISABLE; + CAN_InitStruct->CAN_AWUM = DISABLE; + CAN_InitStruct->CAN_NART = DISABLE; + CAN_InitStruct->CAN_RFLM = DISABLE; + CAN_InitStruct->CAN_TXFP = DISABLE; + CAN_InitStruct->CAN_Mode = CAN_Mode_Normal; + CAN_InitStruct->CAN_SJW = CAN_SJW_1tq; + CAN_InitStruct->CAN_BS1 = CAN_BS1_4tq; + CAN_InitStruct->CAN_BS2 = CAN_BS2_3tq; + CAN_InitStruct->CAN_Prescaler = 1; +} + +/********************************************************************* + * @fn CAN_SlaveStartBank + * + * @brief This function applies only to CH32 Connectivity line devices. + * + * @param CAN_BankNumber - Select the start slave bank filter from 1..27. + * + * @return none + */ +void CAN_SlaveStartBank(uint8_t CAN_BankNumber) +{ + CAN1->FCTLR |= FCTLR_FINIT; + CAN1->FCTLR &= (uint32_t)0xFFFFC0F1 ; + CAN1->FCTLR |= (uint32_t)(CAN_BankNumber)<<8; + CAN1->FCTLR &= ~FCTLR_FINIT; +} + +/********************************************************************* + * @fn CAN_DBGFreeze + * + * @brief Enables or disables the DBG Freeze for CAN. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState) +{ + if (NewState != DISABLE) + { + CANx->CTLR |= CTLR_DBF; + } + else + { + CANx->CTLR &= ~CTLR_DBF; + } +} + +/********************************************************************* + * @fn CAN_TTComModeCmd + * + * @brief Enables or disabes the CAN Time TriggerOperation communication mode. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void CAN_TTComModeCmd(CAN_TypeDef* CANx, FunctionalState NewState) +{ + if (NewState != DISABLE) + { + CANx->CTLR |= CAN_CTLR_TTCM; + + CANx->sTxMailBox[0].TXMDTR |= ((uint32_t)CAN_TXMDT0R_TGT); + CANx->sTxMailBox[1].TXMDTR |= ((uint32_t)CAN_TXMDT1R_TGT); + CANx->sTxMailBox[2].TXMDTR |= ((uint32_t)CAN_TXMDT2R_TGT); + } + else + { + CANx->CTLR &= (uint32_t)(~(uint32_t)CAN_CTLR_TTCM); + + CANx->sTxMailBox[0].TXMDTR &= ((uint32_t)~CAN_TXMDT0R_TGT); + CANx->sTxMailBox[1].TXMDTR &= ((uint32_t)~CAN_TXMDT1R_TGT); + CANx->sTxMailBox[2].TXMDTR &= ((uint32_t)~CAN_TXMDT2R_TGT); + } +} + +/********************************************************************* + * @fn CAN_Transmit + * + * @brief Initiates the transmission of a message. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * TxMessage - pointer to a structure which contains CAN Id, CAN + * DLC and CAN data. + * + * @return transmit_mailbox - The number of the mailbox that is used for + * transmission or CAN_TxStatus_NoMailBox if there is no empty mailbox. + */ +uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage) +{ + uint8_t transmit_mailbox = 0; + + if ((CANx->TSTATR&CAN_TSTATR_TME0) == CAN_TSTATR_TME0) + { + transmit_mailbox = 0; + } + else if ((CANx->TSTATR&CAN_TSTATR_TME1) == CAN_TSTATR_TME1) + { + transmit_mailbox = 1; + } + else if ((CANx->TSTATR&CAN_TSTATR_TME2) == CAN_TSTATR_TME2) + { + transmit_mailbox = 2; + } + else + { + transmit_mailbox = CAN_TxStatus_NoMailBox; + } + + if (transmit_mailbox != CAN_TxStatus_NoMailBox) + { + CANx->sTxMailBox[transmit_mailbox].TXMIR &= TMIDxR_TXRQ; + if (TxMessage->IDE == CAN_Id_Standard) + { + CANx->sTxMailBox[transmit_mailbox].TXMIR |= ((TxMessage->StdId << 21) | \ + TxMessage->RTR); + } + else + { + CANx->sTxMailBox[transmit_mailbox].TXMIR |= ((TxMessage->ExtId << 3) | \ + TxMessage->IDE | \ + TxMessage->RTR); + } + + TxMessage->DLC &= (uint8_t)0x0000000F; + CANx->sTxMailBox[transmit_mailbox].TXMDTR &= (uint32_t)0xFFFFFFF0; + CANx->sTxMailBox[transmit_mailbox].TXMDTR |= TxMessage->DLC; + + CANx->sTxMailBox[transmit_mailbox].TXMDLR = (((uint32_t)TxMessage->Data[3] << 24) | + ((uint32_t)TxMessage->Data[2] << 16) | + ((uint32_t)TxMessage->Data[1] << 8) | + ((uint32_t)TxMessage->Data[0])); + CANx->sTxMailBox[transmit_mailbox].TXMDHR = (((uint32_t)TxMessage->Data[7] << 24) | + ((uint32_t)TxMessage->Data[6] << 16) | + ((uint32_t)TxMessage->Data[5] << 8) | + ((uint32_t)TxMessage->Data[4])); + CANx->sTxMailBox[transmit_mailbox].TXMIR |= TMIDxR_TXRQ; + } + + return transmit_mailbox; +} + +/********************************************************************* + * @fn CAN_TransmitStatus + * + * @brief Checks the transmission of a message. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * TransmitMailbox - the number of the mailbox that is used for + * transmission. + * + * @return state - + * CAN_TxStatus_Ok. + * CAN_TxStatus_Failed. + */ +uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox) +{ + uint32_t state = 0; + + switch (TransmitMailbox) + { + case (CAN_TXMAILBOX_0): + state = CANx->TSTATR & (CAN_TSTATR_RQCP0 | CAN_TSTATR_TXOK0 | CAN_TSTATR_TME0); + break; + + case (CAN_TXMAILBOX_1): + state = CANx->TSTATR & (CAN_TSTATR_RQCP1 | CAN_TSTATR_TXOK1 | CAN_TSTATR_TME1); + break; + + case (CAN_TXMAILBOX_2): + state = CANx->TSTATR & (CAN_TSTATR_RQCP2 | CAN_TSTATR_TXOK2 | CAN_TSTATR_TME2); + break; + + default: + state = CAN_TxStatus_Failed; + break; + } + + switch (state) + { + case (0x0): + state = CAN_TxStatus_Pending; + break; + + case (CAN_TSTATR_RQCP0 | CAN_TSTATR_TME0): + state = CAN_TxStatus_Failed; + break; + + case (CAN_TSTATR_RQCP1 | CAN_TSTATR_TME1): + state = CAN_TxStatus_Failed; + break; + + case (CAN_TSTATR_RQCP2 | CAN_TSTATR_TME2): + state = CAN_TxStatus_Failed; + break; + + case (CAN_TSTATR_RQCP0 | CAN_TSTATR_TXOK0 | CAN_TSTATR_TME0): + state = CAN_TxStatus_Ok; + break; + + case (CAN_TSTATR_RQCP1 | CAN_TSTATR_TXOK1 | CAN_TSTATR_TME1): + state = CAN_TxStatus_Ok; + break; + + case (CAN_TSTATR_RQCP2 | CAN_TSTATR_TXOK2 | CAN_TSTATR_TME2): + state = CAN_TxStatus_Ok; + break; + + default: + state = CAN_TxStatus_Failed; + break; + } + + return (uint8_t) state; +} + +/********************************************************************* + * @fn CAN_CancelTransmit + * + * @brief Cancels a transmit request. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * Mailbox - Mailbox number. + * CAN_TXMAILBOX_0. + * CAN_TXMAILBOX_1. + * CAN_TXMAILBOX_2. + * + * @return none + */ +void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox) +{ + switch (Mailbox) + { + case (CAN_TXMAILBOX_0): + CANx->TSTATR |= CAN_TSTATR_ABRQ0; + break; + + case (CAN_TXMAILBOX_1): + CANx->TSTATR |= CAN_TSTATR_ABRQ1; + break; + + case (CAN_TXMAILBOX_2): + CANx->TSTATR |= CAN_TSTATR_ABRQ2; + break; + + default: + break; + } +} + +/********************************************************************* + * @fn CAN_Receive + * + * @brief Receives a message. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * FIFONumber - Receive FIFO number. + * CAN_FIFO0. + * CAN_FIFO1. + * RxMessage - pointer to a structure receive message which contains + * CAN Id, CAN DLC, CAN datas and FMI number. + * + * @return none + */ +void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage) +{ + RxMessage->IDE = (uint8_t)0x04 & CANx->sFIFOMailBox[FIFONumber].RXMIR; + + if (RxMessage->IDE == CAN_Id_Standard) + { + RxMessage->StdId = (uint32_t)0x000007FF & (CANx->sFIFOMailBox[FIFONumber].RXMIR >> 21); + } + else + { + RxMessage->ExtId = (uint32_t)0x1FFFFFFF & (CANx->sFIFOMailBox[FIFONumber].RXMIR >> 3); + } + + RxMessage->RTR = (uint8_t)0x02 & CANx->sFIFOMailBox[FIFONumber].RXMIR; + RxMessage->DLC = (uint8_t)0x0F & CANx->sFIFOMailBox[FIFONumber].RXMDTR; + RxMessage->FMI = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDTR >> 8); + RxMessage->Data[0] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RXMDLR; + RxMessage->Data[1] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDLR >> 8); + RxMessage->Data[2] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDLR >> 16); + RxMessage->Data[3] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDLR >> 24); + RxMessage->Data[4] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RXMDHR; + RxMessage->Data[5] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDHR >> 8); + RxMessage->Data[6] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDHR >> 16); + RxMessage->Data[7] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDHR >> 24); + + if (FIFONumber == CAN_FIFO0) + { + CANx->RFIFO0 |= CAN_RFIFO0_RFOM0; + } + else + { + CANx->RFIFO1 |= CAN_RFIFO1_RFOM1; + } +} + +/********************************************************************* + * @fn CAN_FIFORelease + * + * @brief Releases the specified FIFO. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * FIFONumber - Receive FIFO number. + * CAN_FIFO0. + * CAN_FIFO1. + * + * @return none + */ +void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber) +{ + if (FIFONumber == CAN_FIFO0) + { + CANx->RFIFO0 |= CAN_RFIFO0_RFOM0; + } + else + { + CANx->RFIFO1 |= CAN_RFIFO1_RFOM1; + } +} + +/********************************************************************* + * @fn CAN_MessagePending + * + * @brief Returns the number of pending messages. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * FIFONumber - Receive FIFO number. + * CAN_FIFO0. + * CAN_FIFO1. + * + * @return message_pending: which is the number of pending message. + */ +uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber) +{ + uint8_t message_pending=0; + + if (FIFONumber == CAN_FIFO0) + { + message_pending = (uint8_t)(CANx->RFIFO0&(uint32_t)0x03); + } + else if (FIFONumber == CAN_FIFO1) + { + message_pending = (uint8_t)(CANx->RFIFO1&(uint32_t)0x03); + } + else + { + message_pending = 0; + } + + return message_pending; +} + +/********************************************************************* + * @fn CAN_OperatingModeRequest + * + * @brief Select the CAN Operation mode. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_OperatingMode - CAN Operating Mode. + * CAN_OperatingMode_Initialization. + * CAN_OperatingMode_Normal. + * CAN_OperatingMode_Sleep. + * + * @return status - + * CAN_ModeStatus_Failed - CAN failed entering the specific mode. + * CAN_ModeStatus_Success - CAN Succeed entering the specific mode. + */ +uint8_t CAN_OperatingModeRequest(CAN_TypeDef* CANx, uint8_t CAN_OperatingMode) +{ + uint8_t status = CAN_ModeStatus_Failed; + uint32_t timeout = INAK_TIMEOUT; + + if (CAN_OperatingMode == CAN_OperatingMode_Initialization) + { + CANx->CTLR = (uint32_t)((CANx->CTLR & (uint32_t)(~(uint32_t)CAN_CTLR_SLEEP)) | CAN_CTLR_INRQ); + + while (((CANx->STATR & CAN_MODE_MASK) != CAN_STATR_INAK) && (timeout != 0)) + { + timeout--; + } + if ((CANx->STATR & CAN_MODE_MASK) != CAN_STATR_INAK) + { + status = CAN_ModeStatus_Failed; + } + else + { + status = CAN_ModeStatus_Success; + } + } + else if (CAN_OperatingMode == CAN_OperatingMode_Normal) + { + CANx->CTLR &= (uint32_t)(~(CAN_CTLR_SLEEP|CAN_CTLR_INRQ)); + + while (((CANx->STATR & CAN_MODE_MASK) != 0) && (timeout!=0)) + { + timeout--; + } + if ((CANx->STATR & CAN_MODE_MASK) != 0) + { + status = CAN_ModeStatus_Failed; + } + else + { + status = CAN_ModeStatus_Success; + } + } + else if (CAN_OperatingMode == CAN_OperatingMode_Sleep) + { + CANx->CTLR = (uint32_t)((CANx->CTLR & (uint32_t)(~(uint32_t)CAN_CTLR_INRQ)) | CAN_CTLR_SLEEP); + + while (((CANx->STATR & CAN_MODE_MASK) != CAN_STATR_SLAK) && (timeout!=0)) + { + timeout--; + } + if ((CANx->STATR & CAN_MODE_MASK) != CAN_STATR_SLAK) + { + status = CAN_ModeStatus_Failed; + } + else + { + status = CAN_ModeStatus_Success; + } + } + else + { + status = CAN_ModeStatus_Failed; + } + + return (uint8_t) status; +} + +/********************************************************************* + * @fn CAN_Sleep + * + * @brief Enters the low power mode. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * + * @return sleepstatus - + * CAN_Sleep_Ok. + * CAN_Sleep_Failed. + */ +uint8_t CAN_Sleep(CAN_TypeDef* CANx) +{ + uint8_t sleepstatus = CAN_Sleep_Failed; + + CANx->CTLR = (((CANx->CTLR) & (uint32_t)(~(uint32_t)CAN_CTLR_INRQ)) | CAN_CTLR_SLEEP); + + if ((CANx->STATR & (CAN_STATR_SLAK|CAN_STATR_INAK)) == CAN_STATR_SLAK) + { + sleepstatus = CAN_Sleep_Ok; + } + + return (uint8_t)sleepstatus; +} + +/********************************************************************* + * @fn CAN_WakeUp + * + * @brief Wakes the CAN up. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * + * @return wakeupstatus - + * CAN_WakeUp_Ok. + * CAN_WakeUp_Failed. + */ +uint8_t CAN_WakeUp(CAN_TypeDef* CANx) +{ + uint32_t wait_slak = SLAK_TIMEOUT; + uint8_t wakeupstatus = CAN_WakeUp_Failed; + + CANx->CTLR &= ~(uint32_t)CAN_CTLR_SLEEP; + + while(((CANx->STATR & CAN_STATR_SLAK) == CAN_STATR_SLAK)&&(wait_slak!=0x00)) + { + wait_slak--; + } + if((CANx->STATR & CAN_STATR_SLAK) != CAN_STATR_SLAK) + { + wakeupstatus = CAN_WakeUp_Ok; + } + + return (uint8_t)wakeupstatus; +} + +/********************************************************************* + * @fn CAN_GetLastErrorCode + * + * @brief Returns the CANx's last error code (LEC). + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * + * @return errorcode - specifies the Error code. + * CAN_ErrorCode_NoErr - No Error. + * CAN_ErrorCode_StuffErr - Stuff Error. + * CAN_ErrorCode_FormErr - Form Error. + * CAN_ErrorCode_ACKErr - Acknowledgment Error. + * CAN_ErrorCode_BitRecessiveErr - Bit Recessive Error. + * CAN_ErrorCode_BitDominantErr - Bit Dominant Error. + * CAN_ErrorCode_CRCErr - CRC Error. + * CAN_ErrorCode_SoftwareSetErr - Software Set Error. + */ +uint8_t CAN_GetLastErrorCode(CAN_TypeDef* CANx) +{ + uint8_t errorcode=0; + + errorcode = (((uint8_t)CANx->ERRSR) & (uint8_t)CAN_ERRSR_LEC); + + return errorcode; +} + +/********************************************************************* + * @fn CAN_GetReceiveErrorCounter + * + * @brief Returns the CANx Receive Error Counter (REC). + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * + * @return counter - CAN Receive Error Counter. + */ +uint8_t CAN_GetReceiveErrorCounter(CAN_TypeDef* CANx) +{ + uint8_t counter=0; + + counter = (uint8_t)((CANx->ERRSR & CAN_ERRSR_REC)>> 24); + + return counter; +} + +/********************************************************************* + * @fn CAN_GetLSBTransmitErrorCounter + * + * @brief Returns the LSB of the 9-bit CANx Transmit Error Counter(TEC). + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * + * @return counter - LSB of the 9-bit CAN Transmit Error Counter. + */ +uint8_t CAN_GetLSBTransmitErrorCounter(CAN_TypeDef* CANx) +{ + uint8_t counter=0; + + counter = (uint8_t)((CANx->ERRSR & CAN_ERRSR_TEC)>> 16); + + return counter; +} + +/********************************************************************* + * @fn CAN_ITConfig + * + * @brief Enables or disables the specified CANx interrupts. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_IT - specifies the CAN interrupt sources to be enabled or disabled. + * CAN_IT_TME. + * CAN_IT_FMP0. + * CAN_IT_FF0. + * CAN_IT_FOV0. + * CAN_IT_FMP1. + * CAN_IT_FF1. + * CAN_IT_FOV1. + * CAN_IT_EWG. + * CAN_IT_EPV. + * CAN_IT_LEC. + * CAN_IT_ERR. + * CAN_IT_WKU. + * CAN_IT_SLK. + * NewState - ENABLE or DISABLE. + * + * @return counter - LSB of the 9-bit CAN Transmit Error Counter. + */ +void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState) +{ + if (NewState != DISABLE) + { + CANx->INTENR |= CAN_IT; + } + else + { + CANx->INTENR &= ~CAN_IT; + } +} + +/********************************************************************* + * @fn CAN_GetFlagStatus + * + * @brief Checks whether the specified CAN flag is set or not. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_FLAG - specifies the flag to check. + * CAN_FLAG_EWG. + * CAN_FLAG_EPV. + * CAN_FLAG_BOF. + * CAN_FLAG_RQCP0. + * CAN_FLAG_RQCP1. + * CAN_FLAG_RQCP2. + * CAN_FLAG_FMP1. + * CAN_FLAG_FF1. + * CAN_FLAG_FOV1. + * CAN_FLAG_FMP0. + * CAN_FLAG_FF0. + * CAN_FLAG_FOV0. + * CAN_FLAG_WKU. + * CAN_FLAG_SLAK. + * CAN_FLAG_LEC. + * NewState - ENABLE or DISABLE. + * + * @return FlagStatus - SET or RESET. + */ +FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((CAN_FLAG & CAN_FLAGS_ERRSR) != (uint32_t)RESET) + { + if ((CANx->ERRSR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else if((CAN_FLAG & CAN_FLAGS_STATR) != (uint32_t)RESET) + { + if ((CANx->STATR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else if((CAN_FLAG & CAN_FLAGS_TSTATR) != (uint32_t)RESET) + { + if ((CANx->TSTATR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else if((CAN_FLAG & CAN_FLAGS_RFIFO0) != (uint32_t)RESET) + { + if ((CANx->RFIFO0 & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + if ((uint32_t)(CANx->RFIFO1 & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + + return bitstatus; +} + +/********************************************************************* + * @fn CAN_ClearFlag + * + * @brief Clears the CAN's pending flags. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_FLAG - specifies the flag to clear. + * CAN_FLAG_RQCP0. + * CAN_FLAG_RQCP1. + * CAN_FLAG_RQCP2. + * CAN_FLAG_FF1. + * CAN_FLAG_FOV1. + * CAN_FLAG_FF0. + * CAN_FLAG_FOV0. + * CAN_FLAG_WKU. + * CAN_FLAG_SLAK. + * CAN_FLAG_LEC. + * + * @return none + */ +void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG) +{ + uint32_t flagtmp=0; + + if (CAN_FLAG == CAN_FLAG_LEC) + { + CANx->ERRSR = (uint32_t)RESET; + } + else + { + flagtmp = CAN_FLAG & 0x000FFFFF; + + if ((CAN_FLAG & CAN_FLAGS_RFIFO0)!=(uint32_t)RESET) + { + CANx->RFIFO0 = (uint32_t)(flagtmp); + } + else if ((CAN_FLAG & CAN_FLAGS_RFIFO1)!=(uint32_t)RESET) + { + CANx->RFIFO1 = (uint32_t)(flagtmp); + } + else if ((CAN_FLAG & CAN_FLAGS_TSTATR)!=(uint32_t)RESET) + { + CANx->TSTATR = (uint32_t)(flagtmp); + } + else + { + CANx->STATR = (uint32_t)(flagtmp); + } + } +} + +/********************************************************************* + * @fn CAN_GetITStatus + * + * @brief Checks whether the specified CANx interrupt has occurred or not. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_IT - specifies the CAN interrupt source to check. + * CAN_IT_TME. + * CAN_IT_FMP0. + * CAN_IT_FF0. + * CAN_IT_FOV0. + * CAN_IT_FMP1. + * CAN_IT_FF1. + * CAN_IT_FOV1. + * CAN_IT_WKU. + * CAN_IT_SLK. + * CAN_IT_EWG. + * CAN_IT_EPV. + * CAN_IT_BOF. + * CAN_IT_LEC. + * CAN_IT_ERR. + * + * @return ITStatus - SET or RESET. + */ +ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT) +{ + ITStatus itstatus = RESET; + + if((CANx->INTENR & CAN_IT) != RESET) + { + switch (CAN_IT) + { + case CAN_IT_TME: + itstatus = CheckITStatus(CANx->TSTATR, CAN_TSTATR_RQCP0|CAN_TSTATR_RQCP1|CAN_TSTATR_RQCP2); + break; + + case CAN_IT_FMP0: + itstatus = CheckITStatus(CANx->RFIFO0, CAN_RFIFO0_FMP0); + break; + + case CAN_IT_FF0: + itstatus = CheckITStatus(CANx->RFIFO0, CAN_RFIFO0_FULL0); + break; + + case CAN_IT_FOV0: + itstatus = CheckITStatus(CANx->RFIFO0, CAN_RFIFO0_FOVR0); + break; + + case CAN_IT_FMP1: + itstatus = CheckITStatus(CANx->RFIFO1, CAN_RFIFO1_FMP1); + break; + + case CAN_IT_FF1: + itstatus = CheckITStatus(CANx->RFIFO1, CAN_RFIFO1_FULL1); + break; + + case CAN_IT_FOV1: + itstatus = CheckITStatus(CANx->RFIFO1, CAN_RFIFO1_FOVR1); + break; + + case CAN_IT_WKU: + itstatus = CheckITStatus(CANx->STATR, CAN_STATR_WKUI); + break; + + case CAN_IT_SLK: + itstatus = CheckITStatus(CANx->STATR, CAN_STATR_SLAKI); + break; + + case CAN_IT_EWG: + itstatus = CheckITStatus(CANx->ERRSR, CAN_ERRSR_EWGF); + break; + + case CAN_IT_EPV: + itstatus = CheckITStatus(CANx->ERRSR, CAN_ERRSR_EPVF); + break; + + case CAN_IT_BOF: + itstatus = CheckITStatus(CANx->ERRSR, CAN_ERRSR_BOFF); + break; + + case CAN_IT_LEC: + itstatus = CheckITStatus(CANx->ERRSR, CAN_ERRSR_LEC); + break; + + case CAN_IT_ERR: + itstatus = CheckITStatus(CANx->STATR, CAN_STATR_ERRI); + break; + + default : + itstatus = RESET; + break; + } + } + else + { + itstatus = RESET; + } + + return itstatus; +} + +/********************************************************************* + * @fn CAN_ClearITPendingBit + * + * @brief Clears the CANx's interrupt pending bits. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_IT - specifies the interrupt pending bit to clear. + * CAN_IT_TME. + * CAN_IT_FF0. + * CAN_IT_FOV0. + * CAN_IT_FF1. + * CAN_IT_FOV1. + * CAN_IT_WKU. + * CAN_IT_SLK. + * CAN_IT_EWG. + * CAN_IT_EPV. + * CAN_IT_BOF. + * CAN_IT_LEC. + * CAN_IT_ERR. + * + * @return none + */ +void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT) +{ + switch (CAN_IT) + { + case CAN_IT_TME: + CANx->TSTATR = CAN_TSTATR_RQCP0|CAN_TSTATR_RQCP1|CAN_TSTATR_RQCP2; + break; + + case CAN_IT_FF0: + CANx->RFIFO0 = CAN_RFIFO0_FULL0; + break; + + case CAN_IT_FOV0: + CANx->RFIFO0 = CAN_RFIFO0_FOVR0; + break; + + case CAN_IT_FF1: + CANx->RFIFO1 = CAN_RFIFO1_FULL1; + break; + + case CAN_IT_FOV1: + CANx->RFIFO1 = CAN_RFIFO1_FOVR1; + break; + + case CAN_IT_WKU: + CANx->STATR = CAN_STATR_WKUI; + break; + + case CAN_IT_SLK: + CANx->STATR = CAN_STATR_SLAKI; + break; + + case CAN_IT_EWG: + CANx->STATR = CAN_STATR_ERRI; + break; + + case CAN_IT_EPV: + CANx->STATR = CAN_STATR_ERRI; + break; + + case CAN_IT_BOF: + CANx->STATR = CAN_STATR_ERRI; + break; + + case CAN_IT_LEC: + CANx->ERRSR = RESET; + CANx->STATR = CAN_STATR_ERRI; + break; + + case CAN_IT_ERR: + CANx->ERRSR = RESET; + CANx->STATR = CAN_STATR_ERRI; + break; + + default : + break; + } +} + +/********************************************************************* + * @fn CheckITStatus + * + * @brief Checks whether the CAN interrupt has occurred or not. + * + * @param CAN_Reg - specifies the CAN interrupt register to check + * It_Bit - specifies the interrupt source bit to check. + * + * @return ITStatus - SET or RESET. + */ +static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit) +{ + ITStatus pendingbitstatus = RESET; + + if ((CAN_Reg & It_Bit) != (uint32_t)RESET) + { + pendingbitstatus = SET; + } + else + { + pendingbitstatus = RESET; + } + + return pendingbitstatus; +} + + + + + + diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_crc.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_crc.c new file mode 100644 index 0000000000..0839ad0109 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_crc.c @@ -0,0 +1,97 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_crc.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the CRC firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#include "ch32v20x_crc.h" + +/********************************************************************* + * @fn CRC_ResetDR + * + * @brief Resets the CRC Data register (DR). + * + * @return none + */ +void CRC_ResetDR(void) +{ + CRC->CTLR = CRC_CTLR_RESET; +} + +/********************************************************************* + * @fn CRC_CalcCRC + * + * @brief Computes the 32-bit CRC of a given data word(32-bit). + * + * @param Data - data word(32-bit) to compute its CRC. + * + * @return 32-bit CRC. + */ +uint32_t CRC_CalcCRC(uint32_t Data) +{ + CRC->DATAR = Data; + + return (CRC->DATAR); +} + +/********************************************************************* + * @fn CRC_CalcBlockCRC + * + * @brief Computes the 32-bit CRC of a given buffer of data word(32-bit). + * + * @param pBuffer - pointer to the buffer containing the data to be computed. + * BufferLength - length of the buffer to be computed. + * + * @return 32-bit CRC. + */ +uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength) +{ + uint32_t index = 0; + + for(index = 0; index < BufferLength; index++){ + CRC->DATAR = pBuffer[index]; + } + + return (CRC->DATAR); +} + +/********************************************************************* + * @fn CRC_GetCRC + * + * @brief Returns the current CRC value. + * + * @return 32-bit CRC. + */ +uint32_t CRC_GetCRC(void) +{ + return (CRC->DATAR); +} + +/********************************************************************* + * @fn CRC_SetIDRegister + * + * @brief Stores a 8-bit data in the Independent Data(ID) register. + * + * @param IDValue - 8-bit value to be stored in the ID register. + * + * @return none + */ +void CRC_SetIDRegister(uint8_t IDValue) +{ + CRC->IDATAR = IDValue; +} + +/********************************************************************* + * @fn CRC_GetIDRegister + * + * @brief Returns the 8-bit data stored in the Independent Data(ID) register. + * + * @return 8-bit value of the ID register. + */ +uint8_t CRC_GetIDRegister(void) +{ + return (CRC->IDATAR); +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_dbgmcu.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_dbgmcu.c new file mode 100644 index 0000000000..2bdef2d604 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_dbgmcu.c @@ -0,0 +1,98 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_dbgmcu.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the DBGMCU firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + ****************************************************************************************/ +#include "ch32v20x_dbgmcu.h" + +#define IDCODE_DEVID_MASK ((uint32_t)0x0000FFFF) + +/********************************************************************* + * @fn DBGMCU_GetREVID + * + * @brief Returns the device revision identifier. + * + * @return Revision identifier. + */ +uint32_t DBGMCU_GetREVID(void) +{ + return ((*(uint32_t *)0x1FFFF704) >> 16); +} + +/********************************************************************* + * @fn DBGMCU_GetDEVID + * + * @brief Returns the device identifier. + * + * @return Device identifier. + */ +uint32_t DBGMCU_GetDEVID(void) +{ + return ((*(uint32_t *)0x1FFFF704) & IDCODE_DEVID_MASK); +} + +/********************************************************************* + * @fn __get_DEBUG_CR + * + * @brief Return the DEBUGE Control Register + * + * @return DEBUGE Control value + */ +uint32_t __get_DEBUG_CR(void) +{ + uint32_t result; + + __asm volatile("csrr %0,""0x7C0" : "=r"(result)); + return (result); +} + +/********************************************************************* + * @fn __set_DEBUG_CR + * + * @brief Set the DEBUGE Control Register + * + * @param value - set DEBUGE Control value + * + * @return none + */ +void __set_DEBUG_CR(uint32_t value) +{ + __asm volatile("csrw 0x7C0, %0" : : "r"(value)); +} + + +/********************************************************************* + * @fn DBGMCU_Config + * + * @brief Configures the specified peripheral and low power mode behavior + * when the MCU under Debug mode. + * + * @param DBGMCU_Periph - specifies the peripheral and low power mode. + * DBGMCU_IWDG_STOP - Debug IWDG stopped when Core is halted + * DBGMCU_WWDG_STOP - Debug WWDG stopped when Core is halted + * DBGMCU_TIM1_STOP - TIM1 counter stopped when Core is halted + * DBGMCU_TIM2_STOP - TIM2 counter stopped when Core is halted + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState) +{ + uint32_t val; + + if(NewState != DISABLE) + { + __set_DEBUG_CR(DBGMCU_Periph); + } + else + { + val = __get_DEBUG_CR(); + val &= ~(uint32_t)DBGMCU_Periph; + __set_DEBUG_CR(val); + } + +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_dma.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_dma.c new file mode 100644 index 0000000000..44a4662c59 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_dma.c @@ -0,0 +1,430 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_dma.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the DMA firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#include "ch32v20x_dma.h" +#include "ch32v20x_rcc.h" + +/* DMA1 Channelx interrupt pending bit masks */ +#define DMA1_Channel1_IT_Mask ((uint32_t)(DMA_GIF1 | DMA_TCIF1 | DMA_HTIF1 | DMA_TEIF1)) +#define DMA1_Channel2_IT_Mask ((uint32_t)(DMA_GIF2 | DMA_TCIF2 | DMA_HTIF2 | DMA_TEIF2)) +#define DMA1_Channel3_IT_Mask ((uint32_t)(DMA_GIF3 | DMA_TCIF3 | DMA_HTIF3 | DMA_TEIF3)) +#define DMA1_Channel4_IT_Mask ((uint32_t)(DMA_GIF4 | DMA_TCIF4 | DMA_HTIF4 | DMA_TEIF4)) +#define DMA1_Channel5_IT_Mask ((uint32_t)(DMA_GIF5 | DMA_TCIF5 | DMA_HTIF5 | DMA_TEIF5)) +#define DMA1_Channel6_IT_Mask ((uint32_t)(DMA_GIF6 | DMA_TCIF6 | DMA_HTIF6 | DMA_TEIF6)) +#define DMA1_Channel7_IT_Mask ((uint32_t)(DMA_GIF7 | DMA_TCIF7 | DMA_HTIF7 | DMA_TEIF7)) +#define DMA1_Channel8_IT_Mask ((uint32_t)(DMA_GIF8 | DMA_TCIF8 | DMA_HTIF8 | DMA_TEIF8)) + +/* DMA2 FLAG mask */ +#define FLAG_Mask ((uint32_t)0x10000000) + +/* DMA registers Masks */ +#define CFGR_CLEAR_Mask ((uint32_t)0xFFFF800F) + +/********************************************************************* + * @fn DMA_DeInit + * + * @brief Deinitializes the DMAy Channelx registers to their default + * reset values. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * + * @return none + */ +void DMA_DeInit(DMA_Channel_TypeDef *DMAy_Channelx) +{ + DMAy_Channelx->CFGR &= (uint16_t)(~DMA_CFGR1_EN); + DMAy_Channelx->CFGR = 0; + DMAy_Channelx->CNTR = 0; + DMAy_Channelx->PADDR = 0; + DMAy_Channelx->MADDR = 0; + if(DMAy_Channelx == DMA1_Channel1) + { + DMA1->INTFCR |= DMA1_Channel1_IT_Mask; + } + else if(DMAy_Channelx == DMA1_Channel2) + { + DMA1->INTFCR |= DMA1_Channel2_IT_Mask; + } + else if(DMAy_Channelx == DMA1_Channel3) + { + DMA1->INTFCR |= DMA1_Channel3_IT_Mask; + } + else if(DMAy_Channelx == DMA1_Channel4) + { + DMA1->INTFCR |= DMA1_Channel4_IT_Mask; + } + else if(DMAy_Channelx == DMA1_Channel5) + { + DMA1->INTFCR |= DMA1_Channel5_IT_Mask; + } + else if(DMAy_Channelx == DMA1_Channel6) + { + DMA1->INTFCR |= DMA1_Channel6_IT_Mask; + } + else if(DMAy_Channelx == DMA1_Channel7) + { + DMA1->INTFCR |= DMA1_Channel7_IT_Mask; + } + else if(DMAy_Channelx == DMA1_Channel8) + { + DMA1->INTFCR |= DMA1_Channel8_IT_Mask; + } +} + +/********************************************************************* + * @fn DMA_Init + * + * @brief Initializes the DMAy Channelx according to the specified + * parameters in the DMA_InitStruct. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * DMA_InitStruct - pointer to a DMA_InitTypeDef structure that contains + * contains the configuration information for the specified DMA Channel. + * + * @return none + */ +void DMA_Init(DMA_Channel_TypeDef *DMAy_Channelx, DMA_InitTypeDef *DMA_InitStruct) +{ + uint32_t tmpreg = 0; + + tmpreg = DMAy_Channelx->CFGR; + tmpreg &= CFGR_CLEAR_Mask; + tmpreg |= DMA_InitStruct->DMA_DIR | DMA_InitStruct->DMA_Mode | + DMA_InitStruct->DMA_PeripheralInc | DMA_InitStruct->DMA_MemoryInc | + DMA_InitStruct->DMA_PeripheralDataSize | DMA_InitStruct->DMA_MemoryDataSize | + DMA_InitStruct->DMA_Priority | DMA_InitStruct->DMA_M2M; + + DMAy_Channelx->CFGR = tmpreg; + DMAy_Channelx->CNTR = DMA_InitStruct->DMA_BufferSize; + DMAy_Channelx->PADDR = DMA_InitStruct->DMA_PeripheralBaseAddr; + DMAy_Channelx->MADDR = DMA_InitStruct->DMA_MemoryBaseAddr; +} + +/********************************************************************* + * @fn DMA_StructInit + * + * @brief Fills each DMA_InitStruct member with its default value. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * DMA_InitStruct - pointer to a DMA_InitTypeDef structure that contains + * contains the configuration information for the specified DMA Channel. + * + * @return none + */ +void DMA_StructInit(DMA_InitTypeDef *DMA_InitStruct) +{ + DMA_InitStruct->DMA_PeripheralBaseAddr = 0; + DMA_InitStruct->DMA_MemoryBaseAddr = 0; + DMA_InitStruct->DMA_DIR = DMA_DIR_PeripheralSRC; + DMA_InitStruct->DMA_BufferSize = 0; + DMA_InitStruct->DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStruct->DMA_MemoryInc = DMA_MemoryInc_Disable; + DMA_InitStruct->DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_InitStruct->DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_InitStruct->DMA_Mode = DMA_Mode_Normal; + DMA_InitStruct->DMA_Priority = DMA_Priority_Low; + DMA_InitStruct->DMA_M2M = DMA_M2M_Disable; +} + +/********************************************************************* + * @fn DMA_Cmd + * + * @brief Enables or disables the specified DMAy Channelx. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * NewState - new state of the DMAy Channelx(ENABLE or DISABLE). + * + * @return none + */ +void DMA_Cmd(DMA_Channel_TypeDef *DMAy_Channelx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DMAy_Channelx->CFGR |= DMA_CFGR1_EN; + } + else + { + DMAy_Channelx->CFGR &= (uint16_t)(~DMA_CFGR1_EN); + } +} + +/********************************************************************* + * @fn DMA_ITConfig + * + * @brief Enables or disables the specified DMAy Channelx interrupts. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * DMA_IT - specifies the DMA interrupts sources to be enabled + * or disabled. + * DMA_IT_TC - Transfer complete interrupt mask + * DMA_IT_HT - Half transfer interrupt mask + * DMA_IT_TE - Transfer error interrupt mask + * NewState - new state of the DMAy Channelx(ENABLE or DISABLE). + * + * @return none + */ +void DMA_ITConfig(DMA_Channel_TypeDef *DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DMAy_Channelx->CFGR |= DMA_IT; + } + else + { + DMAy_Channelx->CFGR &= ~DMA_IT; + } +} + +/********************************************************************* + * @fn DMA_SetCurrDataCounter + * + * @brief Sets the number of data units in the current DMAy Channelx transfer. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * DataNumber - The number of data units in the current DMAy Channelx + * transfer. + * + * @return none + */ +void DMA_SetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx, uint16_t DataNumber) +{ + DMAy_Channelx->CNTR = DataNumber; +} + +/********************************************************************* + * @fn DMA_GetCurrDataCounter + * + * @brief Returns the number of remaining data units in the current + * DMAy Channelx transfer. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * + * @return DataNumber - The number of remaining data units in the current + * DMAy Channelx transfer. + */ +uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx) +{ + return ((uint16_t)(DMAy_Channelx->CNTR)); +} + +/********************************************************************* + * @fn DMA_GetFlagStatus + * + * @brief Checks whether the specified DMAy Channelx flag is set or not. + * + * @param DMAy_FLAG - specifies the flag to check. + * DMA1_FLAG_GL1 - DMA1 Channel1 global flag. + * DMA1_FLAG_TC1 - DMA1 Channel1 transfer complete flag. + * DMA1_FLAG_HT1 - DMA1 Channel1 half transfer flag. + * DMA1_FLAG_TE1 - DMA1 Channel1 transfer error flag. + * DMA1_FLAG_GL2 - DMA1 Channel2 global flag. + * DMA1_FLAG_TC2 - DMA1 Channel2 transfer complete flag. + * DMA1_FLAG_HT2 - DMA1 Channel2 half transfer flag. + * DMA1_FLAG_TE2 - DMA1 Channel2 transfer error flag. + * DMA1_FLAG_GL3 - DMA1 Channel3 global flag. + * DMA1_FLAG_TC3 - DMA1 Channel3 transfer complete flag. + * DMA1_FLAG_HT3 - DMA1 Channel3 half transfer flag. + * DMA1_FLAG_TE3 - DMA1 Channel3 transfer error flag. + * DMA1_FLAG_GL4 - DMA1 Channel4 global flag. + * DMA1_FLAG_TC4 - DMA1 Channel4 transfer complete flag. + * DMA1_FLAG_HT4 - DMA1 Channel4 half transfer flag. + * DMA1_FLAG_TE4 - DMA1 Channel4 transfer error flag. + * DMA1_FLAG_GL5 - DMA1 Channel5 global flag. + * DMA1_FLAG_TC5 - DMA1 Channel5 transfer complete flag. + * DMA1_FLAG_HT5 - DMA1 Channel5 half transfer flag. + * DMA1_FLAG_TE5 - DMA1 Channel5 transfer error flag. + * DMA1_FLAG_GL6 - DMA1 Channel6 global flag. + * DMA1_FLAG_TC6 - DMA1 Channel6 transfer complete flag. + * DMA1_FLAG_HT6 - DMA1 Channel6 half transfer flag. + * DMA1_FLAG_TE6 - DMA1 Channel6 transfer error flag. + * DMA1_FLAG_GL7 - DMA1 Channel7 global flag. + * DMA1_FLAG_TC7 - DMA1 Channel7 transfer complete flag. + * DMA1_FLAG_HT7 - DMA1 Channel7 half transfer flag. + * DMA1_FLAG_TE7 - DMA1 Channel7 transfer error flag. + * DMA2_FLAG_GL1 - DMA2 Channel1 global flag. + * DMA2_FLAG_TC1 - DMA2 Channel1 transfer complete flag. + * DMA2_FLAG_HT1 - DMA2 Channel1 half transfer flag. + * DMA2_FLAG_TE1 - DMA2 Channel1 transfer error flag. + + * @return The new state of DMAy_FLAG (SET or RESET). + */ +FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpreg = 0; + + tmpreg = DMA1->INTFR; + + if((tmpreg & DMAy_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn DMA_ClearFlag + * + * @brief Clears the DMAy Channelx's pending flags. + * + * @param DMAy_FLAG - specifies the flag to check. + * DMA1_FLAG_GL1 - DMA1 Channel1 global flag. + * DMA1_FLAG_TC1 - DMA1 Channel1 transfer complete flag. + * DMA1_FLAG_HT1 - DMA1 Channel1 half transfer flag. + * DMA1_FLAG_TE1 - DMA1 Channel1 transfer error flag. + * DMA1_FLAG_GL2 - DMA1 Channel2 global flag. + * DMA1_FLAG_TC2 - DMA1 Channel2 transfer complete flag. + * DMA1_FLAG_HT2 - DMA1 Channel2 half transfer flag. + * DMA1_FLAG_TE2 - DMA1 Channel2 transfer error flag. + * DMA1_FLAG_GL3 - DMA1 Channel3 global flag. + * DMA1_FLAG_TC3 - DMA1 Channel3 transfer complete flag. + * DMA1_FLAG_HT3 - DMA1 Channel3 half transfer flag. + * DMA1_FLAG_TE3 - DMA1 Channel3 transfer error flag. + * DMA1_FLAG_GL4 - DMA1 Channel4 global flag. + * DMA1_FLAG_TC4 - DMA1 Channel4 transfer complete flag. + * DMA1_FLAG_HT4 - DMA1 Channel4 half transfer flag. + * DMA1_FLAG_TE4 - DMA1 Channel4 transfer error flag. + * DMA1_FLAG_GL5 - DMA1 Channel5 global flag. + * DMA1_FLAG_TC5 - DMA1 Channel5 transfer complete flag. + * DMA1_FLAG_HT5 - DMA1 Channel5 half transfer flag. + * DMA1_FLAG_TE5 - DMA1 Channel5 transfer error flag. + * DMA1_FLAG_GL6 - DMA1 Channel6 global flag. + * DMA1_FLAG_TC6 - DMA1 Channel6 transfer complete flag. + * DMA1_FLAG_HT6 - DMA1 Channel6 half transfer flag. + * DMA1_FLAG_TE6 - DMA1 Channel6 transfer error flag. + * DMA1_FLAG_GL7 - DMA1 Channel7 global flag. + * DMA1_FLAG_TC7 - DMA1 Channel7 transfer complete flag. + * DMA1_FLAG_HT7 - DMA1 Channel7 half transfer flag. + * DMA1_FLAG_TE7 - DMA1 Channel7 transfer error flag. + * DMA2_FLAG_GL1 - DMA2 Channel1 global flag. + * DMA2_FLAG_TC1 - DMA2 Channel1 transfer complete flag. + * DMA2_FLAG_HT1 - DMA2 Channel1 half transfer flag. + * DMA2_FLAG_TE1 - DMA2 Channel1 transfer error flag. + * @return none + */ +void DMA_ClearFlag(uint32_t DMAy_FLAG) +{ + DMA1->INTFCR = DMAy_FLAG; +} + +/********************************************************************* + * @fn DMA_GetITStatus + * + * @brief Checks whether the specified DMAy Channelx interrupt has + * occurred or not. + * + * @param DMAy_IT - specifies the DMAy interrupt source to check. + * DMA1_IT_GL1 - DMA1 Channel1 global flag. + * DMA1_IT_TC1 - DMA1 Channel1 transfer complete flag. + * DMA1_IT_HT1 - DMA1 Channel1 half transfer flag. + * DMA1_IT_TE1 - DMA1 Channel1 transfer error flag. + * DMA1_IT_GL2 - DMA1 Channel2 global flag. + * DMA1_IT_TC2 - DMA1 Channel2 transfer complete flag. + * DMA1_IT_HT2 - DMA1 Channel2 half transfer flag. + * DMA1_IT_TE2 - DMA1 Channel2 transfer error flag. + * DMA1_IT_GL3 - DMA1 Channel3 global flag. + * DMA1_IT_TC3 - DMA1 Channel3 transfer complete flag. + * DMA1_IT_HT3 - DMA1 Channel3 half transfer flag. + * DMA1_IT_TE3 - DMA1 Channel3 transfer error flag. + * DMA1_IT_GL4 - DMA1 Channel4 global flag. + * DMA1_IT_TC4 - DMA1 Channel4 transfer complete flag. + * DMA1_IT_HT4 - DMA1 Channel4 half transfer flag. + * DMA1_IT_TE4 - DMA1 Channel4 transfer error flag. + * DMA1_IT_GL5 - DMA1 Channel5 global flag. + * DMA1_IT_TC5 - DMA1 Channel5 transfer complete flag. + * DMA1_IT_HT5 - DMA1 Channel5 half transfer flag. + * DMA1_IT_TE5 - DMA1 Channel5 transfer error flag. + * DMA1_IT_GL6 - DMA1 Channel6 global flag. + * DMA1_IT_TC6 - DMA1 Channel6 transfer complete flag. + * DMA1_IT_HT6 - DMA1 Channel6 half transfer flag. + * DMA1_IT_TE6 - DMA1 Channel6 transfer error flag. + * DMA1_IT_GL7 - DMA1 Channel7 global flag. + * DMA1_IT_TC7 - DMA1 Channel7 transfer complete flag. + * DMA1_IT_HT7 - DMA1 Channel7 half transfer flag. + * DMA1_IT_TE7 - DMA1 Channel7 transfer error flag. + * DMA2_IT_GL1 - DMA2 Channel1 global flag. + * DMA2_IT_TC1 - DMA2 Channel1 transfer complete flag. + * DMA2_IT_HT1 - DMA2 Channel1 half transfer flag. + * DMA2_IT_TE1 - DMA2 Channel1 transfer error flag. + * @return The new state of DMAy_IT (SET or RESET). + */ +ITStatus DMA_GetITStatus(uint32_t DMAy_IT) +{ + ITStatus bitstatus = RESET; + uint32_t tmpreg = 0; + + tmpreg = DMA1->INTFR; + + if((tmpreg & DMAy_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn DMA_ClearITPendingBit + * + * @brief Clears the DMAy Channelx's interrupt pending bits. + * + * @param DMAy_IT - specifies the DMAy interrupt source to check. + * DMA1_IT_GL1 - DMA1 Channel1 global flag. + * DMA1_IT_TC1 - DMA1 Channel1 transfer complete flag. + * DMA1_IT_HT1 - DMA1 Channel1 half transfer flag. + * DMA1_IT_TE1 - DMA1 Channel1 transfer error flag. + * DMA1_IT_GL2 - DMA1 Channel2 global flag. + * DMA1_IT_TC2 - DMA1 Channel2 transfer complete flag. + * DMA1_IT_HT2 - DMA1 Channel2 half transfer flag. + * DMA1_IT_TE2 - DMA1 Channel2 transfer error flag. + * DMA1_IT_GL3 - DMA1 Channel3 global flag. + * DMA1_IT_TC3 - DMA1 Channel3 transfer complete flag. + * DMA1_IT_HT3 - DMA1 Channel3 half transfer flag. + * DMA1_IT_TE3 - DMA1 Channel3 transfer error flag. + * DMA1_IT_GL4 - DMA1 Channel4 global flag. + * DMA1_IT_TC4 - DMA1 Channel4 transfer complete flag. + * DMA1_IT_HT4 - DMA1 Channel4 half transfer flag. + * DMA1_IT_TE4 - DMA1 Channel4 transfer error flag. + * DMA1_IT_GL5 - DMA1 Channel5 global flag. + * DMA1_IT_TC5 - DMA1 Channel5 transfer complete flag. + * DMA1_IT_HT5 - DMA1 Channel5 half transfer flag. + * DMA1_IT_TE5 - DMA1 Channel5 transfer error flag. + * DMA1_IT_GL6 - DMA1 Channel6 global flag. + * DMA1_IT_TC6 - DMA1 Channel6 transfer complete flag. + * DMA1_IT_HT6 - DMA1 Channel6 half transfer flag. + * DMA1_IT_TE6 - DMA1 Channel6 transfer error flag. + * DMA1_IT_GL7 - DMA1 Channel7 global flag. + * DMA1_IT_TC7 - DMA1 Channel7 transfer complete flag. + * DMA1_IT_HT7 - DMA1 Channel7 half transfer flag. + * DMA1_IT_TE7 - DMA1 Channel7 transfer error flag. + * DMA2_IT_GL1 - DMA2 Channel1 global flag. + * DMA2_IT_TC1 - DMA2 Channel1 transfer complete flag. + * DMA2_IT_HT1 - DMA2 Channel1 half transfer flag. + * DMA2_IT_TE1 - DMA2 Channel1 transfer error flag. + * @return none + */ +void DMA_ClearITPendingBit(uint32_t DMAy_IT) +{ + DMA1->INTFCR = DMAy_IT; +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_exti.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_exti.c new file mode 100644 index 0000000000..9d56c58dc3 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_exti.c @@ -0,0 +1,180 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_exti.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the EXTI firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + ***************************************************************************************/ +#include "ch32v20x_exti.h" + +/* No interrupt selected */ +#define EXTI_LINENONE ((uint32_t)0x00000) + +/********************************************************************* + * @fn EXTI_DeInit + * + * @brief Deinitializes the EXTI peripheral registers to their default + * reset values. + * + * @return none. + */ +void EXTI_DeInit(void) +{ + EXTI->INTENR = 0x00000000; + EXTI->EVENR = 0x00000000; + EXTI->RTENR = 0x00000000; + EXTI->FTENR = 0x00000000; + EXTI->INTFR = 0x000FFFFF; +} + +/********************************************************************* + * @fn EXTI_Init + * + * @brief Initializes the EXTI peripheral according to the specified + * parameters in the EXTI_InitStruct. + * + * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure + * + * @return none. + */ +void EXTI_Init(EXTI_InitTypeDef *EXTI_InitStruct) +{ + uint32_t tmp = 0; + + tmp = (uint32_t)EXTI_BASE; + if(EXTI_InitStruct->EXTI_LineCmd != DISABLE) + { + EXTI->INTENR &= ~EXTI_InitStruct->EXTI_Line; + EXTI->EVENR &= ~EXTI_InitStruct->EXTI_Line; + tmp += EXTI_InitStruct->EXTI_Mode; + *(__IO uint32_t *)tmp |= EXTI_InitStruct->EXTI_Line; + EXTI->RTENR &= ~EXTI_InitStruct->EXTI_Line; + EXTI->FTENR &= ~EXTI_InitStruct->EXTI_Line; + if(EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling) + { + EXTI->RTENR |= EXTI_InitStruct->EXTI_Line; + EXTI->FTENR |= EXTI_InitStruct->EXTI_Line; + } + else + { + tmp = (uint32_t)EXTI_BASE; + tmp += EXTI_InitStruct->EXTI_Trigger; + *(__IO uint32_t *)tmp |= EXTI_InitStruct->EXTI_Line; + } + } + else + { + tmp += EXTI_InitStruct->EXTI_Mode; + *(__IO uint32_t *)tmp &= ~EXTI_InitStruct->EXTI_Line; + } +} + +/********************************************************************* + * @fn EXTI_StructInit + * + * @brief Fills each EXTI_InitStruct member with its reset value. + * + * @param EXTI_InitStruct - pointer to a EXTI_InitTypeDef structure + * + * @return none. + */ +void EXTI_StructInit(EXTI_InitTypeDef *EXTI_InitStruct) +{ + EXTI_InitStruct->EXTI_Line = EXTI_LINENONE; + EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling; + EXTI_InitStruct->EXTI_LineCmd = DISABLE; +} + +/********************************************************************* + * @fn EXTI_GenerateSWInterrupt + * + * @brief Generates a Software interrupt. + * + * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. + * + * @return none. + */ +void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) +{ + EXTI->SWIEVR |= EXTI_Line; +} + +/********************************************************************* + * @fn EXTI_GetFlagStatus + * + * @brief Checks whether the specified EXTI line flag is set or not. + * + * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. + * + * @return The new state of EXTI_Line (SET or RESET). + */ +FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) +{ + FlagStatus bitstatus = RESET; + if((EXTI->INTFR & EXTI_Line) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn EXTI_ClearFlag + * + * @brief Clears the EXTI's line pending flags. + * + * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. + * + * @return None + */ +void EXTI_ClearFlag(uint32_t EXTI_Line) +{ + EXTI->INTFR = EXTI_Line; +} + +/********************************************************************* + * @fn EXTI_GetITStatus + * + * @brief Checks whether the specified EXTI line is asserted or not. + * + * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. + * + * @return The new state of EXTI_Line (SET or RESET). + */ +ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + + enablestatus = EXTI->INTENR & EXTI_Line; + if(((EXTI->INTFR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn EXTI_ClearITPendingBit + * + * @brief Clears the EXTI's line pending bits. + * + * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. + * + * @return none + */ +void EXTI_ClearITPendingBit(uint32_t EXTI_Line) +{ + EXTI->INTFR = EXTI_Line; +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_flash.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_flash.c new file mode 100644 index 0000000000..e6b430f9ef --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_flash.c @@ -0,0 +1,965 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_flash.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the FLASH firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + ***************************************************************************************/ +#include "ch32v20x_flash.h" + +/* Flash Control Register bits */ +#define CR_PG_Set ((uint32_t)0x00000001) +#define CR_PG_Reset ((uint32_t)0xFFFFFFFE) +#define CR_PER_Set ((uint32_t)0x00000002) +#define CR_PER_Reset ((uint32_t)0xFFFFFFFD) +#define CR_MER_Set ((uint32_t)0x00000004) +#define CR_MER_Reset ((uint32_t)0xFFFFFFFB) +#define CR_OPTPG_Set ((uint32_t)0x00000010) +#define CR_OPTPG_Reset ((uint32_t)0xFFFFFFEF) +#define CR_OPTER_Set ((uint32_t)0x00000020) +#define CR_OPTER_Reset ((uint32_t)0xFFFFFFDF) +#define CR_STRT_Set ((uint32_t)0x00000040) +#define CR_LOCK_Set ((uint32_t)0x00000080) +#define CR_FAST_LOCK_Set ((uint32_t)0x00008000) +#define CR_PAGE_PG ((uint32_t)0x00010000) +#define CR_PAGE_ER ((uint32_t)0x00020000) +#define CR_BER32 ((uint32_t)0x00040000) +#define CR_BER64 ((uint32_t)0x00080000) +#define CR_PG_STRT ((uint32_t)0x00200000) + +/* FLASH Status Register bits */ +#define SR_BSY ((uint32_t)0x00000001) +#define SR_WR_BSY ((uint32_t)0x00000002) +#define SR_WRPRTERR ((uint32_t)0x00000010) +#define SR_EOP ((uint32_t)0x00000020) + +/* FLASH Mask */ +#define RDPRT_Mask ((uint32_t)0x00000002) +#define WRP0_Mask ((uint32_t)0x000000FF) +#define WRP1_Mask ((uint32_t)0x0000FF00) +#define WRP2_Mask ((uint32_t)0x00FF0000) +#define WRP3_Mask ((uint32_t)0xFF000000) +#define OB_USER_BFB2 ((uint16_t)0x0008) + +/* FLASH Keys */ +#define RDP_Key ((uint16_t)0x00A5) +#define FLASH_KEY1 ((uint32_t)0x45670123) +#define FLASH_KEY2 ((uint32_t)0xCDEF89AB) + +/* FLASH BANK address */ +#define FLASH_BANK1_END_ADDRESS ((uint32_t)0x807FFFF) + +/* EEPROM address */ +#define EEPROM_ADDRESS ((uint32_t)0x8070000) + +/* Delay definition */ +#define EraseTimeout ((uint32_t)0x000B0000) +#define ProgramTimeout ((uint32_t)0x00005000) + +/********************************************************************* + * @fn FLASH_Unlock + * + * @brief Unlocks the FLASH Program Erase Controller. + * + * @return none + */ +void FLASH_Unlock(void) +{ + /* Authorize the FPEC of Bank1 Access */ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; +} + +/********************************************************************* + * @fn FLASH_UnlockBank1 + * + * @brief Unlocks the FLASH Bank1 Program Erase Controller. + * equivalent to FLASH_Unlock function. + * + * @return none + */ +void FLASH_UnlockBank1(void) +{ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; +} + +/********************************************************************* + * @fn FLASH_Lock + * + * @brief Locks the FLASH Program Erase Controller. + * + * @return none + */ +void FLASH_Lock(void) +{ + FLASH->CTLR |= CR_LOCK_Set; +} + +/********************************************************************* + * @fn FLASH_LockBank1 + * + * @brief Locks the FLASH Bank1 Program Erase Controller. + * + * @return none + */ +void FLASH_LockBank1(void) +{ + FLASH->CTLR |= CR_LOCK_Set; +} + +/********************************************************************* + * @fn FLASH_ErasePage + * + * @brief Erases a specified FLASH page(page size 4KB). + * + * @param Page_Address - The page address to be erased. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ErasePage(uint32_t Page_Address) +{ + FLASH_Status status = FLASH_COMPLETE; + + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + FLASH->CTLR |= CR_PER_Set; + FLASH->ADDR = Page_Address; + FLASH->CTLR |= CR_STRT_Set; + + status = FLASH_WaitForLastOperation(EraseTimeout); + + FLASH->CTLR &= CR_PER_Reset; + } + + return status; +} + +/********************************************************************* + * @fn FLASH_EraseAllPages + * + * @brief Erases all FLASH pages. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseAllPages(void) +{ + FLASH_Status status = FLASH_COMPLETE; + + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + FLASH->CTLR |= CR_MER_Set; + FLASH->CTLR |= CR_STRT_Set; + + status = FLASH_WaitForLastOperation(EraseTimeout); + + FLASH->CTLR &= CR_MER_Reset; + } + + return status; +} + +/********************************************************************* + * @fn FLASH_EraseAllBank1Pages + * + * @brief Erases all Bank1 FLASH pages. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseAllBank1Pages(void) +{ + FLASH_Status status = FLASH_COMPLETE; + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + FLASH->CTLR |= CR_MER_Set; + FLASH->CTLR |= CR_STRT_Set; + + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + FLASH->CTLR &= CR_MER_Reset; + } + return status; +} + +/********************************************************************* + * @fn FLASH_EraseOptionBytes + * + * @brief Erases the FLASH option bytes. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseOptionBytes(void) +{ + uint16_t rdptmp = RDP_Key; + uint32_t Address = 0x1FFFF800; + __IO uint8_t i; + + FLASH_Status status = FLASH_COMPLETE; + if(FLASH_GetReadOutProtectionStatus() != RESET) + { + rdptmp = 0x00; + } + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + FLASH->OBKEYR = FLASH_KEY1; + FLASH->OBKEYR = FLASH_KEY2; + + FLASH->CTLR |= CR_OPTER_Set; + FLASH->CTLR |= CR_STRT_Set; + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + FLASH->CTLR &= CR_OPTER_Reset; + FLASH->CTLR |= CR_OPTPG_Set; + OB->RDPR = (uint16_t)rdptmp; + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status != FLASH_TIMEOUT) + { + FLASH->CTLR &= CR_OPTPG_Reset; + } + } + else + { + if(status != FLASH_TIMEOUT) + { + FLASH->CTLR &= CR_OPTPG_Reset; + } + } + + /* Write 0xFF */ + FLASH->CTLR |= CR_OPTPG_Set; + + for(i = 0; i < 8; i++){ + *(uint16_t *)(Address + 2 * i) = 0x00FF; + while(FLASH->STATR & SR_BSY); + } + + FLASH->CTLR &= ~CR_OPTPG_Set; + } + return status; +} + +/********************************************************************* + * @fn FLASH_ProgramWord + * + * @brief Programs a word at a specified address. + * + * @param Address - specifies the address to be programmed. + * Data - specifies the data to be programmed. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + __IO uint32_t tmp = 0; + + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + FLASH->CTLR |= CR_PG_Set; + + *(__IO uint16_t *)Address = (uint16_t)Data; + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + tmp = Address + 2; + *(__IO uint16_t *)tmp = Data >> 16; + status = FLASH_WaitForLastOperation(ProgramTimeout); + FLASH->CTLR &= CR_PG_Reset; + } + else + { + FLASH->CTLR &= CR_PG_Reset; + } + } + + return status; +} + +/********************************************************************* + * @fn FLASH_ProgramHalfWord + * + * @brief Programs a half word at a specified address. + * + * @param Address - specifies the address to be programmed. + * Data - specifies the data to be programmed. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + FLASH->CTLR |= CR_PG_Set; + *(__IO uint16_t *)Address = Data; + status = FLASH_WaitForLastOperation(ProgramTimeout); + FLASH->CTLR &= CR_PG_Reset; + } + + return status; +} + +/********************************************************************* + * @fn FLASH_ProgramOptionByteData + * + * @brief Programs a half word at a specified Option Byte Data address. + * + * @param Address - specifies the address to be programmed. + * Data - specifies the data to be programmed. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + uint32_t Addr = 0x1FFFF800; + __IO uint8_t i; + uint16_t pbuf[8]; + + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status == FLASH_COMPLETE) + { + FLASH->OBKEYR = FLASH_KEY1; + FLASH->OBKEYR = FLASH_KEY2; + + /* Read optionbytes */ + for(i = 0; i < 8; i++){ + pbuf[i] = *(uint16_t *)(Addr + 2 * i); + } + + /* Erase optionbytes */ + FLASH->CTLR |= CR_OPTER_Set; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY); + FLASH->CTLR &= ~CR_OPTER_Set; + + /* Write optionbytes */ + pbuf[((Address - 0x1FFFF800) / 2)] = ((((uint16_t) ~(Data)) << 8) | ((uint16_t)Data)); + + FLASH->CTLR |= CR_OPTPG_Set; + + for(i = 0; i < 8; i++){ + *(uint16_t *)(Addr + 2 * i) = pbuf[i]; + while(FLASH->STATR & SR_BSY) ; + } + + FLASH->CTLR &= ~CR_OPTPG_Set; + } + + return status; +} + +/********************************************************************* + * @fn FLASH_EnableWriteProtection + * + * @brief Write protects the desired sectors + * + * @param FLASH_Sectors - specifies the address of the pages to be write protected. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Sectors) +{ + uint16_t WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF; + FLASH_Status status = FLASH_COMPLETE; + uint32_t Addr = 0x1FFFF800; + __IO uint8_t i; + uint16_t pbuf[8]; + + FLASH_Sectors = (uint32_t)(~FLASH_Sectors); + WRP0_Data = (uint16_t)(FLASH_Sectors & WRP0_Mask); + WRP1_Data = (uint16_t)((FLASH_Sectors & WRP1_Mask) >> 8); + WRP2_Data = (uint16_t)((FLASH_Sectors & WRP2_Mask) >> 16); + WRP3_Data = (uint16_t)((FLASH_Sectors & WRP3_Mask) >> 24); + + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + FLASH->OBKEYR = FLASH_KEY1; + FLASH->OBKEYR = FLASH_KEY2; + + /* Read optionbytes */ + for(i = 0; i < 8; i++){ + pbuf[i] = *(uint16_t *)(Addr + 2 * i); + } + + /* Erase optionbytes */ + FLASH->CTLR |= CR_OPTER_Set; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY); + FLASH->CTLR &= ~CR_OPTER_Set; + + /* Write optionbytes */ + pbuf[4] = WRP0_Data; + pbuf[5] = WRP1_Data; + pbuf[6] = WRP2_Data; + pbuf[7] = WRP3_Data; + + FLASH->CTLR |= CR_OPTPG_Set; + for(i = 0; i < 8; i++){ + *(uint16_t *)(Addr + 2 * i) = pbuf[i]; + while(FLASH->STATR & SR_BSY); + } + FLASH->CTLR &= ~CR_OPTPG_Set; + } + return status; +} + +/********************************************************************* + * @fn FLASH_ReadOutProtection + * + * @brief Enables or disables the read out protection. + * + * @param Newstate - new state of the ReadOut Protection(ENABLE or DISABLE). + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState) +{ + FLASH_Status status = FLASH_COMPLETE; + uint32_t Addr = 0x1FFFF800; + __IO uint8_t i; + uint16_t pbuf[8]; + + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + FLASH->OBKEYR = FLASH_KEY1; + FLASH->OBKEYR = FLASH_KEY2; + + /* Read optionbytes */ + for(i = 0; i < 8; i++){ + pbuf[i] = *(uint16_t *)(Addr + 2 * i); + } + + /* Erase optionbytes */ + FLASH->CTLR |= CR_OPTER_Set; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY); + FLASH->CTLR &= ~CR_OPTER_Set; + + /* Write optionbytes */ + if(NewState == DISABLE) + pbuf[0] = 0x5AA5; + else + pbuf[0] = 0x00FF; + + FLASH->CTLR |= CR_OPTPG_Set; + for(i = 0; i < 8; i++){ + *(uint16_t *)(Addr + 2 * i) = pbuf[i]; + while(FLASH->STATR & SR_BSY); + } + FLASH->CTLR &= ~CR_OPTPG_Set; + } + return status; +} + +/********************************************************************* + * @fn FLASH_UserOptionByteConfig + * + * @brief Programs the FLASH User Option Byte - IWDG_SW / RST_STOP / RST_STDBY. + * + * @param OB_IWDG - Selects the IWDG mode + * OB_IWDG_SW - Software IWDG selected + * OB_IWDG_HW - Hardware IWDG selected + * OB_STOP - Reset event when entering STOP mode. + * OB_STOP_NoRST - No reset generated when entering in STOP + * OB_STOP_RST - Reset generated when entering in STOP + * OB_STDBY - Reset event when entering Standby mode. + * OB_STDBY_NoRST - No reset generated when entering in STANDBY + * OB_STDBY_RST - Reset generated when entering in STANDBY + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY) +{ + FLASH_Status status = FLASH_COMPLETE; + uint32_t Addr = 0x1FFFF800; + __IO uint8_t i; + uint16_t pbuf[8]; + + FLASH->OBKEYR = FLASH_KEY1; + FLASH->OBKEYR = FLASH_KEY2; + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* Read optionbytes */ + for(i = 0; i < 8; i++){ + pbuf[i] = *(uint16_t *)(Addr + 2 * i); + } + + /* Erase optionbytes */ + FLASH->CTLR |= CR_OPTER_Set; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY); + FLASH->CTLR &= ~CR_OPTER_Set; + + /* Write optionbytes */ + pbuf[1] = OB_IWDG | (uint16_t)(OB_STOP | (uint16_t)(OB_STDBY | ((uint16_t)0xF8))); + + FLASH->CTLR |= CR_OPTPG_Set; + for(i = 0; i < 8; i++){ + *(uint16_t *)(Addr + 2 * i) = pbuf[i]; + while(FLASH->STATR & SR_BSY); + } + FLASH->CTLR &= ~CR_OPTPG_Set; + } + return status; +} + +/********************************************************************* + * @fn FLASH_GetUserOptionByte + * + * @brief Returns the FLASH User Option Bytes values. + * + * @return The FLASH User Option Bytes values:IWDG_SW(Bit0), RST_STOP(Bit1) + * and RST_STDBY(Bit2). + */ +uint32_t FLASH_GetUserOptionByte(void) +{ + return (uint32_t)(FLASH->OBR >> 2); +} + +/********************************************************************* + * @fn FLASH_GetWriteProtectionOptionByte + * + * @brief Returns the FLASH Write Protection Option Bytes Register value. + * + * @return The FLASH Write Protection Option Bytes Register value. + */ +uint32_t FLASH_GetWriteProtectionOptionByte(void) +{ + return (uint32_t)(FLASH->WPR); +} + +/********************************************************************* + * @fn FLASH_GetReadOutProtectionStatus + * + * @brief Checks whether the FLASH Read Out Protection Status is set or not. + * + * @return FLASH ReadOut Protection Status(SET or RESET) + */ +FlagStatus FLASH_GetReadOutProtectionStatus(void) +{ + FlagStatus readoutstatus = RESET; + if((FLASH->OBR & RDPRT_Mask) != (uint32_t)RESET) + { + readoutstatus = SET; + } + else + { + readoutstatus = RESET; + } + return readoutstatus; +} + +/********************************************************************* + * @fn FLASH_ITConfig + * + * @brief Enables or disables the specified FLASH interrupts. + * + * @param FLASH_IT - specifies the FLASH interrupt sources to be enabled or disabled. + * FLASH_IT_ERROR - FLASH Error Interrupt + * FLASH_IT_EOP - FLASH end of operation Interrupt + * NewState - new state of the specified Flash interrupts(ENABLE or DISABLE). + * + * @return FLASH Prefetch Buffer Status (SET or RESET). + */ +void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + FLASH->CTLR |= FLASH_IT; + } + else + { + FLASH->CTLR &= ~(uint32_t)FLASH_IT; + } +} + +/********************************************************************* + * @fn FLASH_GetFlagStatus + * + * @brief Checks whether the specified FLASH flag is set or not. + * + * @param FLASH_FLAG - specifies the FLASH flag to check. + * FLASH_FLAG_BSY - FLASH Busy flag + * FLASH_FLAG_WRPRTERR - FLASH Write protected error flag + * FLASH_FLAG_EOP - FLASH End of Operation flag + * FLASH_FLAG_OPTERR - FLASH Option Byte error flag + * + * @return The new state of FLASH_FLAG (SET or RESET). + */ +FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG) +{ + FlagStatus bitstatus = RESET; + + if(FLASH_FLAG == FLASH_FLAG_OPTERR) + { + if((FLASH->OBR & FLASH_FLAG_OPTERR) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + if((FLASH->STATR & FLASH_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + return bitstatus; +} + +/********************************************************************* + * @fn FLASH_ClearFlag + * + * @brief Clears the FLASH's pending flags. + * + * @param FLASH_FLAG - specifies the FLASH flags to clear. + * FLASH_FLAG_WRPRTERR - FLASH Write protected error flag + * FLASH_FLAG_EOP - FLASH End of Operation flag + * + * @return none + */ +void FLASH_ClearFlag(uint32_t FLASH_FLAG) +{ + FLASH->STATR = FLASH_FLAG; +} + +/********************************************************************* + * @fn FLASH_GetStatus + * + * @brief Returns the FLASH Status. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE. + */ +FLASH_Status FLASH_GetStatus(void) +{ + FLASH_Status flashstatus = FLASH_COMPLETE; + + if((FLASH->STATR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY) + { + flashstatus = FLASH_BUSY; + } + else + { + if((FLASH->STATR & FLASH_FLAG_WRPRTERR) != 0) + { + flashstatus = FLASH_ERROR_WRP; + } + else + { + flashstatus = FLASH_COMPLETE; + } + } + return flashstatus; +} + +/********************************************************************* + * @fn FLASH_GetBank1Status + * + * @brief Returns the FLASH Bank1 Status. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE. + */ +FLASH_Status FLASH_GetBank1Status(void) +{ + FLASH_Status flashstatus = FLASH_COMPLETE; + + if((FLASH->STATR & FLASH_FLAG_BANK1_BSY) == FLASH_FLAG_BSY) + { + flashstatus = FLASH_BUSY; + } + else + { + if((FLASH->STATR & FLASH_FLAG_BANK1_WRPRTERR) != 0) + { + flashstatus = FLASH_ERROR_WRP; + } + else + { + flashstatus = FLASH_COMPLETE; + } + } + return flashstatus; +} + +/********************************************************************* + * @fn FLASH_WaitForLastOperation + * + * @brief Waits for a Flash operation to complete or a TIMEOUT to occur. + * + * @param Timeout - FLASH programming Timeout + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE. + */ +FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout) +{ + FLASH_Status status = FLASH_COMPLETE; + + status = FLASH_GetBank1Status(); + while((status == FLASH_BUSY) && (Timeout != 0x00)) + { + status = FLASH_GetBank1Status(); + Timeout--; + } + if(Timeout == 0x00) + { + status = FLASH_TIMEOUT; + } + return status; +} + +/********************************************************************* + * @fn FLASH_WaitForLastBank1Operation + * + * @brief Waits for a Flash operation on Bank1 to complete or a TIMEOUT to occur. + * + * @param Timeout - FLASH programming Timeout + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE. + */ +FLASH_Status FLASH_WaitForLastBank1Operation(uint32_t Timeout) +{ + FLASH_Status status = FLASH_COMPLETE; + + status = FLASH_GetBank1Status(); + while((status == FLASH_FLAG_BANK1_BSY) && (Timeout != 0x00)) + { + status = FLASH_GetBank1Status(); + Timeout--; + } + if(Timeout == 0x00) + { + status = FLASH_TIMEOUT; + } + return status; +} + +/********************************************************************* + * @fn FLASH_Unlock_Fast + * + * @brief Unlocks the Fast Program Erase Mode. + * + * @return none + */ +void FLASH_Unlock_Fast(void) +{ + /* Authorize the FPEC of Bank1 Access */ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; + + /* Fast program mode unlock */ + FLASH->MODEKEYR = FLASH_KEY1; + FLASH->MODEKEYR = FLASH_KEY2; +} + +/********************************************************************* + * @fn FLASH_Lock_Fast + * + * @brief Locks the Fast Program Erase Mode. + * + * @return none + */ +void FLASH_Lock_Fast(void) +{ + FLASH->CTLR |= CR_LOCK_Set; +} + +/********************************************************************* + * @fn FLASH_ErasePage_Fast + * + * @brief Erases a specified FLASH page (1page = 256Byte). + * + * @param Page_Address - The page address to be erased. + * + * @return none + */ +void FLASH_ErasePage_Fast(uint32_t Page_Address) +{ + Page_Address &= 0xFFFFFF00; + + FLASH->CTLR |= CR_PAGE_ER; + FLASH->ADDR = Page_Address; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY); + FLASH->CTLR &= ~CR_PAGE_ER; +} + +/********************************************************************* + * @fn FLASH_EraseBlock_32K_Fast + * + * @brief Erases a specified FLASH Block (1Block = 32KByte). + * + * @param Block_Address - The block address to be erased. + * + * @return none + */ +void FLASH_EraseBlock_32K_Fast(uint32_t Block_Address) +{ + Block_Address &= 0xFFFF8000; + + FLASH->CTLR |= CR_BER32; + FLASH->ADDR = Block_Address; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY); + FLASH->CTLR &= ~CR_BER32; +} + +/********************************************************************* + * @fn FLASH_EraseBlock_64K_Fast + * + * @brief Erases a specified FLASH Block (1Block = 64KByte). + * + * @param Block_Address - The block address to be erased. + * + * @return none + */ +void FLASH_EraseBlock_64K_Fast(uint32_t Block_Address) +{ + Block_Address &= 0xFFFF0000; + + FLASH->CTLR |= CR_BER64; + FLASH->ADDR = Block_Address; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY); + FLASH->CTLR &= ~CR_BER64; +} + +/********************************************************************* + * @fn FLASH_ProgramPage_Fast + * + * @brief Program a specified FLASH page (1page = 256Byte). + * + * @param Page_Address - The page address to be programed. + * + * @return none + */ +void FLASH_ProgramPage_Fast(uint32_t Page_Address, uint32_t *pbuf) +{ + uint8_t size = 64; + + Page_Address &= 0xFFFFFF00; + + FLASH->CTLR |= CR_PAGE_PG; + while(FLASH->STATR & SR_BSY); + while(FLASH->STATR & SR_WR_BSY); + + while(size) + { + *(uint32_t *)Page_Address = *(uint32_t *)pbuf; + Page_Address += 4; + pbuf += 1; + size -= 1; + while(FLASH->STATR & SR_WR_BSY); + } + + FLASH->CTLR |= CR_PG_STRT; + while(FLASH->STATR & SR_BSY); + FLASH->CTLR &= ~CR_PAGE_PG; +} + +/********************************************************************* + * @fn FLASH_Access_Clock_Cfg + * + * @brief Config FLASH Access Clock(Need to unlock ) + * + * @param FLASH_Access_CLK - + * FLASH_Access_SYSTEM_HALF - System clock/2 + * FLASH_Access_SYSTEM - System clock + * + * @return none + */ +void FLASH_Access_Clock_Cfg(uint32_t FLASH_Access_CLK) +{ + FLASH->CTLR &= ~(1 << 25); + FLASH->CTLR |= FLASH_Access_CLK; +} + +/********************************************************************* + * @fn FLASH_Enhance_Mode + * + * @brief Read FLASH Enhance Mode + * + * @param + * Newstate - new state of the ReadOut Protection(ENABLE or DISABLE). + * + * @return none + */ +void FLASH_Enhance_Mode(FunctionalState NewState) +{ + if(NewState) + { + FLASH->CTLR |= (1 << 24); + } + else + { + FLASH->CTLR &= ~(1 << 24); + FLASH->CTLR |= (1 << 22); + } +} + +/******************************************************************************** + * @fn FLASH_GetMACAddress + * + * @brief Get MAC address + * + * @param *Buffer: Mac address + * + * @return None + */ +void FLASH_GetMACAddress(uint8_t *Buffer) +{ + uint32_t value; + + value = *(uint32_t *)(0x1FFFF7E8); + Buffer[0] = value & 0xFF; + Buffer[1] = (value >> 8) & 0xFF; + Buffer[2] = (value >> 16) & 0xFF; + Buffer[3] = (value >> 24) & 0xFF; + value = *(uint32_t *)(0x1FFFF7EC); + Buffer[4] = value & 0xFF; + Buffer[5] = (value >> 8) & 0xFF; +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_gpio.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_gpio.c new file mode 100644 index 0000000000..c7f3805f06 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_gpio.c @@ -0,0 +1,671 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_gpio.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the GPIO firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#include "ch32v20x_gpio.h" +#include "ch32v20x_rcc.h" + +/* MASK */ +#define ECR_PORTPINCONFIG_MASK ((uint16_t)0xFF80) +#define LSB_MASK ((uint16_t)0xFFFF) +#define DBGAFR_POSITION_MASK ((uint32_t)0x000F0000) +#define DBGAFR_SWJCFG_MASK ((uint32_t)0xF0FFFFFF) +#define DBGAFR_LOCATION_MASK ((uint32_t)0x00200000) +#define DBGAFR_NUMBITS_MASK ((uint32_t)0x00100000) + +#if defined (CH32V20x_D6) +uint8_t MCU_Version = 0; +#endif + +/********************************************************************* + * @fn GPIO_DeInit + * + * @brief Deinitializes the GPIOx peripheral registers to their default + * reset values. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * + * @return none + */ +void GPIO_DeInit(GPIO_TypeDef *GPIOx) +{ + if(GPIOx == GPIOA) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE); + } + else if(GPIOx == GPIOB) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE); + } + else if(GPIOx == GPIOC) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE); + } + else if(GPIOx == GPIOD) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE); + } + else if(GPIOx == GPIOE) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE); + } +} + +/********************************************************************* + * @fn GPIO_AFIODeInit + * + * @brief Deinitializes the Alternate Functions (remap, event control + * and EXTI configuration) registers to their default reset values. + * + * @return none + */ +void GPIO_AFIODeInit(void) +{ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE); +} + +/********************************************************************* + * @fn GPIO_Init + * + * @brief GPIOx - where x can be (A..G) to select the GPIO peripheral. + * + * @param GPIO_InitStruct - pointer to a GPIO_InitTypeDef structure that + * contains the configuration information for the specified GPIO peripheral. + * + * @return none + */ +void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct) +{ + uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00; + uint32_t tmpreg = 0x00, pinmask = 0x00; + + currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F); + + if((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00) + { + currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed; + } +#if defined (CH32V20x_D6) + if(((*(uint32_t *) 0x40022030) & 0x0F000000) == 0) + { + MCU_Version = 1; + } + + if((GPIOx == GPIOC) && MCU_Version){ + GPIO_InitStruct->GPIO_Pin = GPIO_InitStruct->GPIO_Pin >> 13; + } + +#endif + if(((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00) + { + tmpreg = GPIOx->CFGLR; + + for(pinpos = 0x00; pinpos < 0x08; pinpos++) + { + pos = ((uint32_t)0x01) << pinpos; + currentpin = (GPIO_InitStruct->GPIO_Pin) & pos; + + if(currentpin == pos) + { + pos = pinpos << 2; + pinmask = ((uint32_t)0x0F) << pos; + tmpreg &= ~pinmask; + tmpreg |= (currentmode << pos); + + if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) + { + GPIOx->BCR = (((uint32_t)0x01) << pinpos); + } + else + { + if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) + { + GPIOx->BSHR = (((uint32_t)0x01) << pinpos); + } + } + } + } + GPIOx->CFGLR = tmpreg; + } + + if(GPIO_InitStruct->GPIO_Pin > 0x00FF) + { + tmpreg = GPIOx->CFGHR; + + for(pinpos = 0x00; pinpos < 0x08; pinpos++) + { + pos = (((uint32_t)0x01) << (pinpos + 0x08)); + currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos); + + if(currentpin == pos) + { + pos = pinpos << 2; + pinmask = ((uint32_t)0x0F) << pos; + tmpreg &= ~pinmask; + tmpreg |= (currentmode << pos); + + if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) + { + GPIOx->BCR = (((uint32_t)0x01) << (pinpos + 0x08)); + } + + if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) + { + GPIOx->BSHR = (((uint32_t)0x01) << (pinpos + 0x08)); + } + } + } + GPIOx->CFGHR = tmpreg; + } +} + +/********************************************************************* + * @fn GPIO_StructInit + * + * @brief Fills each GPIO_InitStruct member with its default + * + * @param GPIO_InitStruct - pointer to a GPIO_InitTypeDef structure + * which will be initialized. + * + * @return none + */ +void GPIO_StructInit(GPIO_InitTypeDef *GPIO_InitStruct) +{ + GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All; + GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING; +} + +/********************************************************************* + * @fn GPIO_ReadInputDataBit + * + * @brief GPIOx - where x can be (A..G) to select the GPIO peripheral. + * + * @param GPIO_Pin - specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * + * @return The input port pin value. + */ +uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) +{ + uint8_t bitstatus = 0x00; + +#if defined (CH32V20x_D6) + if((GPIOx == GPIOC) && MCU_Version){ + GPIO_Pin = GPIO_Pin >> 13; + } + +#endif + + if((GPIOx->INDR & GPIO_Pin) != (uint32_t)Bit_RESET) + { + bitstatus = (uint8_t)Bit_SET; + } + else + { + bitstatus = (uint8_t)Bit_RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn GPIO_ReadInputData + * + * @brief Reads the specified GPIO input data port. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * + * @return The output port pin value. + */ +uint16_t GPIO_ReadInputData(GPIO_TypeDef *GPIOx) +{ + uint16_t val; + +#if defined (CH32V20x_D6) + if((GPIOx == GPIOC) && MCU_Version){ + val = ( uint16_t )(GPIOx->INDR << 13); + } + else{ + val = ( uint16_t )GPIOx->INDR; + } + +#else + val = ( uint16_t )GPIOx->INDR; +#endif + +return ( val ); +} + +/********************************************************************* + * @fn GPIO_ReadOutputDataBit + * + * @brief Reads the specified output data port bit. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * GPIO_Pin - specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * + * @return none + */ +uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) +{ + uint8_t bitstatus = 0x00; + +#if defined (CH32V20x_D6) + if((GPIOx == GPIOC) && MCU_Version){ + GPIO_Pin = GPIO_Pin >> 13; + } + +#endif + + if((GPIOx->OUTDR & GPIO_Pin) != (uint32_t)Bit_RESET) + { + bitstatus = (uint8_t)Bit_SET; + } + else + { + bitstatus = (uint8_t)Bit_RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn GPIO_ReadOutputData + * + * @brief Reads the specified GPIO output data port. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * + * @return GPIO output port pin value. + */ +uint16_t GPIO_ReadOutputData(GPIO_TypeDef *GPIOx) +{ + uint16_t val; + +#if defined (CH32V20x_D6) + if((GPIOx == GPIOC) && MCU_Version){ + val = ( uint16_t )(GPIOx->OUTDR << 13); + } + else{ + val = ( uint16_t )GPIOx->OUTDR; + } + +#else + val = ( uint16_t )GPIOx->OUTDR; +#endif + + return ( val ); +} + +/********************************************************************* + * @fn GPIO_SetBits + * + * @brief Sets the selected data port bits. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * GPIO_Pin - specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * + * @return none + */ +void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) +{ +#if defined (CH32V20x_D6) + if((GPIOx == GPIOC) && MCU_Version){ + GPIO_Pin = GPIO_Pin >> 13; + } + +#endif + + GPIOx->BSHR = GPIO_Pin; +} + +/********************************************************************* + * @fn GPIO_ResetBits + * + * @brief Clears the selected data port bits. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * GPIO_Pin - specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * + * @return none + */ +void GPIO_ResetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) +{ +#if defined (CH32V20x_D6) + if((GPIOx == GPIOC) && MCU_Version){ + GPIO_Pin = GPIO_Pin >> 13; + } + +#endif + + GPIOx->BCR = GPIO_Pin; +} + +/********************************************************************* + * @fn GPIO_WriteBit + * + * @brief Sets or clears the selected data port bit. + * + * @param GPIO_Pin - specifies the port bit to be written. + * This parameter can be one of GPIO_Pin_x where x can be (0..15). + * BitVal - specifies the value to be written to the selected bit. + * Bit_SetL - to clear the port pin. + * Bit_SetH - to set the port pin. + * + * @return none + */ +void GPIO_WriteBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, BitAction BitVal) +{ +#if defined (CH32V20x_D6) + if((GPIOx == GPIOC) && MCU_Version){ + GPIO_Pin = GPIO_Pin >> 13; + } + +#endif + + if(BitVal != Bit_RESET) + { + GPIOx->BSHR = GPIO_Pin; + } + else + { + GPIOx->BCR = GPIO_Pin; + } +} + +/********************************************************************* + * @fn GPIO_Write + * + * @brief Writes data to the specified GPIO data port. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * PortVal - specifies the value to be written to the port output data register. + * + * @return none + */ +void GPIO_Write(GPIO_TypeDef *GPIOx, uint16_t PortVal) +{ +#if defined (CH32V20x_D6) + if((GPIOx == GPIOC) && MCU_Version){ + PortVal = PortVal >> 13; + } + +#endif + + GPIOx->OUTDR = PortVal; +} + +/********************************************************************* + * @fn GPIO_PinLockConfig + * + * @brief Locks GPIO Pins configuration registers. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * GPIO_Pin - specifies the port bit to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * + * @return none + */ +void GPIO_PinLockConfig(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) +{ + uint32_t tmp = 0x00010000; + +#if defined (CH32V20x_D6) + if((GPIOx == GPIOC) && MCU_Version){ + GPIO_Pin = GPIO_Pin >> 13; + } + +#endif + + tmp |= GPIO_Pin; + GPIOx->LCKR = tmp; + GPIOx->LCKR = GPIO_Pin; + GPIOx->LCKR = tmp; + tmp = GPIOx->LCKR; + tmp = GPIOx->LCKR; +} + +/********************************************************************* + * @fn GPIO_EventOutputConfig + * + * @brief Selects the GPIO pin used as Event output. + * + * @param GPIO_PortSource - selects the GPIO port to be used as source + * for Event output. + * This parameter can be GPIO_PortSourceGPIOx where x can be (A..E). + * GPIO_PinSource - specifies the pin for the Event output. + * This parameter can be GPIO_PinSourcex where x can be (0..15). + * + * @return none + */ +void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) +{ + uint32_t tmpreg = 0x00; + + tmpreg = AFIO->ECR; + tmpreg &= ECR_PORTPINCONFIG_MASK; + tmpreg |= (uint32_t)GPIO_PortSource << 0x04; + tmpreg |= GPIO_PinSource; + AFIO->ECR = tmpreg; +} + +/********************************************************************* + * @fn GPIO_EventOutputCmd + * + * @brief Enables or disables the Event Output. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void GPIO_EventOutputCmd(FunctionalState NewState) +{ + if(NewState) + { + AFIO->ECR |= (1 << 7); + } + else + { + AFIO->ECR &= ~(1 << 7); + } +} + +/********************************************************************* + * @fn GPIO_PinRemapConfig + * + * @brief Changes the mapping of the specified pin. + * + * @param GPIO_Remap - selects the pin to remap. + * GPIO_Remap_SPI1 - SPI1 Alternate Function mapping + * GPIO_Remap_I2C1 - I2C1 Alternate Function mapping + * GPIO_Remap_USART1 - USART1 Alternate Function mapping + * GPIO_Remap_USART2 - USART2 Alternate Function mapping + * GPIO_PartialRemap_USART3 - USART3 Partial Alternate Function mapping + * GPIO_FullRemap_USART3 - USART3 Full Alternate Function mapping + * GPIO_PartialRemap_TIM1 - TIM1 Partial Alternate Function mapping + * GPIO_FullRemap_TIM1 - TIM1 Full Alternate Function mapping + * GPIO_PartialRemap1_TIM2 - TIM2 Partial1 Alternate Function mapping + * GPIO_PartialRemap2_TIM2 - TIM2 Partial2 Alternate Function mapping + * GPIO_FullRemap_TIM2 - TIM2 Full Alternate Function mapping + * GPIO_PartialRemap_TIM3 - TIM3 Partial Alternate Function mapping + * GPIO_FullRemap_TIM3 - TIM3 Full Alternate Function mapping + * GPIO_Remap_TIM4 - TIM4 Alternate Function mapping + * GPIO_Remap1_CAN1 - CAN1 Alternate Function mapping + * GPIO_Remap2_CAN1 - CAN1 Alternate Function mapping + * GPIO_Remap_PD01 - PD01 Alternate Function mapping + * GPIO_Remap_ADC1_ETRGINJ - ADC1 External Trigger Injected Conversion remapping + * GPIO_Remap_ADC1_ETRGREG - ADC1 External Trigger Regular Conversion remapping + * GPIO_Remap_ADC2_ETRGINJ - ADC2 External Trigger Injected Conversion remapping + * GPIO_Remap_ADC2_ETRGREG - ADC2 External Trigger Regular Conversion remapping + * GPIO_Remap_ETH - Ethernet remapping + * GPIO_Remap_CAN2 - CAN2 remapping + * GPIO_Remap_MII_RMII_SEL - MII or RMII selection + * GPIO_Remap_SWJ_NoJTRST - Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST + * GPIO_Remap_SWJ_JTAGDisable - JTAG-DP Disabled and SW-DP Enabled + * GPIO_Remap_SWJ_Disable - Full SWJ Disabled (JTAG-DP + SW-DP) + * GPIO_Remap_TIM2ITR1_PTP_SOF - Ethernet PTP output or USB OTG SOF (Start of Frame) connected + * to TIM2 Internal Trigger 1 for calibration + * GPIO_Remap_TIM2ITR1_PTP_SOF - Ethernet PTP output or USB OTG SOF (Start of Frame) + * GPIO_Remap_TIM8 - TIM8 Alternate Function mapping + * GPIO_PartialRemap_TIM9 - TIM9 Partial Alternate Function mapping + * GPIO_FullRemap_TIM9 - TIM9 Full Alternate Function mapping + * GPIO_PartialRemap_TIM10 - TIM10 Partial Alternate Function mapping + * GPIO_FullRemap_TIM10 - TIM10 Full Alternate Function mapping + * GPIO_Remap_FSMC_NADV - FSMC_NADV Alternate Function mapping + * GPIO_PartialRemap_USART4 - USART4 Partial Alternate Function mapping + * GPIO_FullRemap_USART4 - USART4 Full Alternate Function mapping + * GPIO_PartialRemap_USART5 - USART5 Partial Alternate Function mapping + * GPIO_FullRemap_USART5 - USART5 Full Alternate Function mapping + * GPIO_PartialRemap_USART6 - USART6 Partial Alternate Function mapping + * GPIO_FullRemap_USART6 - USART6 Full Alternate Function mapping + * GPIO_PartialRemap_USART7 - USART7 Partial Alternate Function mapping + * GPIO_FullRemap_USART7 - USART7 Full Alternate Function mapping + * GPIO_PartialRemap_USART8 - USART8 Partial Alternate Function mapping + * GPIO_FullRemap_USART8 - USART8 Full Alternate Function mapping + * GPIO_Remap_USART1_HighBit - USART1 Alternate Function mapping high bit + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState) +{ + uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00; + + if((GPIO_Remap & 0x80000000) == 0x80000000) + { + tmpreg = AFIO->PCFR2; + } + else + { + tmpreg = AFIO->PCFR1; + +#if defined (CH32V20x_D6) || defined (CH32V20x_D8) + if(((*(uint32_t *) 0x40022030) & 0x0F000000) == 0){ + tmpreg = ((tmpreg>>1)&0xFFFFE000)|(tmpreg&0x00001FFF); + } + +#endif + } + + tmpmask = (GPIO_Remap & DBGAFR_POSITION_MASK) >> 0x10; + tmp = GPIO_Remap & LSB_MASK; + + /* Clear bit */ + if((GPIO_Remap & 0x80000000) == 0x80000000) + { /* PCFR2 */ + if((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) /* [31:16] 2bit */ + { + tmp1 = ((uint32_t)0x03) << (tmpmask + 0x10); + tmpreg &= ~tmp1; + } + else if((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK) /* [15:0] 2bit */ + { + tmp1 = ((uint32_t)0x03) << tmpmask; + tmpreg &= ~tmp1; + } + else /* [31:0] 1bit */ + { + tmpreg &= ~(tmp << ((GPIO_Remap >> 0x15) * 0x10)); + } + } + else + { /* PCFR1 */ + if((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) /* [26:24] 3bit SWD_JTAG */ + { + tmpreg &= DBGAFR_SWJCFG_MASK; + AFIO->PCFR1 &= DBGAFR_SWJCFG_MASK; + } + else if((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK) /* [15:0] 2bit */ + { + tmp1 = ((uint32_t)0x03) << tmpmask; + tmpreg &= ~tmp1; + tmpreg |= ~DBGAFR_SWJCFG_MASK; + } + else /* [31:0] 1bit */ + { + tmpreg &= ~(tmp << ((GPIO_Remap >> 0x15) * 0x10)); + tmpreg |= ~DBGAFR_SWJCFG_MASK; + } + } + + /* Set bit */ + if(NewState != DISABLE) + { + tmpreg |= (tmp << ((GPIO_Remap >> 0x15) * 0x10)); + } + + if((GPIO_Remap & 0x80000000) == 0x80000000) + { + AFIO->PCFR2 = tmpreg; + } + else + { + AFIO->PCFR1 = tmpreg; + } +} + +/********************************************************************* + * @fn GPIO_EXTILineConfig + * + * @brief Selects the GPIO pin used as EXTI Line. + * + * @param GPIO_PortSource - selects the GPIO port to be used as source for EXTI lines. + * This parameter can be GPIO_PortSourceGPIOx where x can be (A..G). + * GPIO_PinSource - specifies the EXTI line to be configured. + * This parameter can be GPIO_PinSourcex where x can be (0..15). + * + * @return none + */ +void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) +{ + uint32_t tmp = 0x00; + +#if defined (CH32V20x_D6) + if((GPIO_PortSource == GPIO_PortSourceGPIOC) && MCU_Version){ + GPIO_PinSource -= 13; + } + +#endif + + tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)); + AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp; + AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03))); +} + +/********************************************************************* + * @fn GPIO_ETH_MediaInterfaceConfig + * + * @brief Selects the Ethernet media interface. + * + * @param GPIO_ETH_MediaInterface - specifies the Media Interface mode. + * GPIO_ETH_MediaInterface_MII - MII mode + * GPIO_ETH_MediaInterface_RMII - RMII mode + * + * @return none + */ +void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface) +{ + if(GPIO_ETH_MediaInterface) + { + AFIO->PCFR1 |= (1 << 23); + } + else + { + AFIO->PCFR1 &= ~(1 << 23); + } +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_i2c.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_i2c.c new file mode 100644 index 0000000000..3040b1f2c4 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_i2c.c @@ -0,0 +1,972 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_i2c.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the I2C firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#include "ch32v20x_i2c.h" +#include "ch32v20x_rcc.h" + +/* I2C SPE mask */ +#define CTLR1_PE_Set ((uint16_t)0x0001) +#define CTLR1_PE_Reset ((uint16_t)0xFFFE) + +/* I2C START mask */ +#define CTLR1_START_Set ((uint16_t)0x0100) +#define CTLR1_START_Reset ((uint16_t)0xFEFF) + +/* I2C STOP mask */ +#define CTLR1_STOP_Set ((uint16_t)0x0200) +#define CTLR1_STOP_Reset ((uint16_t)0xFDFF) + +/* I2C ACK mask */ +#define CTLR1_ACK_Set ((uint16_t)0x0400) +#define CTLR1_ACK_Reset ((uint16_t)0xFBFF) + +/* I2C ENGC mask */ +#define CTLR1_ENGC_Set ((uint16_t)0x0040) +#define CTLR1_ENGC_Reset ((uint16_t)0xFFBF) + +/* I2C SWRST mask */ +#define CTLR1_SWRST_Set ((uint16_t)0x8000) +#define CTLR1_SWRST_Reset ((uint16_t)0x7FFF) + +/* I2C PEC mask */ +#define CTLR1_PEC_Set ((uint16_t)0x1000) +#define CTLR1_PEC_Reset ((uint16_t)0xEFFF) + +/* I2C ENPEC mask */ +#define CTLR1_ENPEC_Set ((uint16_t)0x0020) +#define CTLR1_ENPEC_Reset ((uint16_t)0xFFDF) + +/* I2C ENARP mask */ +#define CTLR1_ENARP_Set ((uint16_t)0x0010) +#define CTLR1_ENARP_Reset ((uint16_t)0xFFEF) + +/* I2C NOSTRETCH mask */ +#define CTLR1_NOSTRETCH_Set ((uint16_t)0x0080) +#define CTLR1_NOSTRETCH_Reset ((uint16_t)0xFF7F) + +/* I2C registers Masks */ +#define CTLR1_CLEAR_Mask ((uint16_t)0xFBF5) + +/* I2C DMAEN mask */ +#define CTLR2_DMAEN_Set ((uint16_t)0x0800) +#define CTLR2_DMAEN_Reset ((uint16_t)0xF7FF) + +/* I2C LAST mask */ +#define CTLR2_LAST_Set ((uint16_t)0x1000) +#define CTLR2_LAST_Reset ((uint16_t)0xEFFF) + +/* I2C FREQ mask */ +#define CTLR2_FREQ_Reset ((uint16_t)0xFFC0) + +/* I2C ADD0 mask */ +#define OADDR1_ADD0_Set ((uint16_t)0x0001) +#define OADDR1_ADD0_Reset ((uint16_t)0xFFFE) + +/* I2C ENDUAL mask */ +#define OADDR2_ENDUAL_Set ((uint16_t)0x0001) +#define OADDR2_ENDUAL_Reset ((uint16_t)0xFFFE) + +/* I2C ADD2 mask */ +#define OADDR2_ADD2_Reset ((uint16_t)0xFF01) + +/* I2C F/S mask */ +#define CKCFGR_FS_Set ((uint16_t)0x8000) + +/* I2C CCR mask */ +#define CKCFGR_CCR_Set ((uint16_t)0x0FFF) + +/* I2C FLAG mask */ +#define FLAG_Mask ((uint32_t)0x00FFFFFF) + +/* I2C Interrupt Enable mask */ +#define ITEN_Mask ((uint32_t)0x07000000) + +/********************************************************************* + * @fn I2C_DeInit + * + * @brief Deinitializes the I2Cx peripheral registers to their default + * reset values. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * + * @return none + */ +void I2C_DeInit(I2C_TypeDef *I2Cx) +{ + if(I2Cx == I2C1) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE); + } + else + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE); + } +} + +/********************************************************************* + * @fn I2C_Init + * + * @brief Initializes the I2Cx peripheral according to the specified + * parameters in the I2C_InitStruct. + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_InitStruct - pointer to a I2C_InitTypeDef structure that + * contains the configuration information for the specified I2C peripheral. + * + * @return none + */ +void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitTypeDef *I2C_InitStruct) +{ + uint16_t tmpreg = 0, freqrange = 0; + uint16_t result = 0x04; + uint32_t pclk1 = 8000000; + + RCC_ClocksTypeDef rcc_clocks; + + tmpreg = I2Cx->CTLR2; + tmpreg &= CTLR2_FREQ_Reset; + RCC_GetClocksFreq(&rcc_clocks); + pclk1 = rcc_clocks.PCLK1_Frequency; + freqrange = (uint16_t)(pclk1 / 1000000); + tmpreg |= freqrange; + I2Cx->CTLR2 = tmpreg; + + I2Cx->CTLR1 &= CTLR1_PE_Reset; + tmpreg = 0; + + if(I2C_InitStruct->I2C_ClockSpeed <= 100000) + { + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1)); + + if(result < 0x04) + { + result = 0x04; + } + + tmpreg |= result; + I2Cx->RTR = freqrange + 1; + } + else + { + if(I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2) + { + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 3)); + } + else + { + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 25)); + result |= I2C_DutyCycle_16_9; + } + + if((result & CKCFGR_CCR_Set) == 0) + { + result |= (uint16_t)0x0001; + } + + tmpreg |= (uint16_t)(result | CKCFGR_FS_Set); + I2Cx->RTR = (uint16_t)(((freqrange * (uint16_t)300) / (uint16_t)1000) + (uint16_t)1); + } + + I2Cx->CKCFGR = tmpreg; + I2Cx->CTLR1 |= CTLR1_PE_Set; + + tmpreg = I2Cx->CTLR1; + tmpreg &= CTLR1_CLEAR_Mask; + tmpreg |= (uint16_t)((uint32_t)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack); + I2Cx->CTLR1 = tmpreg; + + I2Cx->OADDR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1); +} + +/********************************************************************* + * @fn I2C_StructInit + * + * @brief Fills each I2C_InitStruct member with its default value. + * + * @param I2C_InitStruct - pointer to an I2C_InitTypeDef structure which + * will be initialized. + * + * @return none + */ +void I2C_StructInit(I2C_InitTypeDef *I2C_InitStruct) +{ + I2C_InitStruct->I2C_ClockSpeed = 5000; + I2C_InitStruct->I2C_Mode = I2C_Mode_I2C; + I2C_InitStruct->I2C_DutyCycle = I2C_DutyCycle_2; + I2C_InitStruct->I2C_OwnAddress1 = 0; + I2C_InitStruct->I2C_Ack = I2C_Ack_Disable; + I2C_InitStruct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; +} + +/********************************************************************* + * @fn I2C_Cmd + * + * @brief Enables or disables the specified I2C peripheral. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_Cmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_PE_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_PE_Reset; + } +} + +/********************************************************************* + * @fn I2C_DMACmd + * + * @brief Enables or disables the specified I2C DMA requests. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_DMACmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR2 |= CTLR2_DMAEN_Set; + } + else + { + I2Cx->CTLR2 &= CTLR2_DMAEN_Reset; + } +} + +/********************************************************************* + * @fn I2C_DMALastTransferCmd + * + * @brief Specifies if the next DMA transfer will be the last one. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_DMALastTransferCmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR2 |= CTLR2_LAST_Set; + } + else + { + I2Cx->CTLR2 &= CTLR2_LAST_Reset; + } +} + +/********************************************************************* + * @fn I2C_GenerateSTART + * + * @brief Generates I2Cx communication START condition. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_GenerateSTART(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_START_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_START_Reset; + } +} + +/********************************************************************* + * @fn I2C_GenerateSTOP + * + * @brief Generates I2Cx communication STOP condition. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_GenerateSTOP(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_STOP_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_STOP_Reset; + } +} + +/********************************************************************* + * @fn I2C_AcknowledgeConfig + * + * @brief Enables or disables the specified I2C acknowledge feature. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_AcknowledgeConfig(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_ACK_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_ACK_Reset; + } +} + +/********************************************************************* + * @fn I2C_OwnAddress2Config + * + * @brief Configures the specified I2C own address2. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * Address - specifies the 7bit I2C own address2. + * + * @return none + */ +void I2C_OwnAddress2Config(I2C_TypeDef *I2Cx, uint8_t Address) +{ + uint16_t tmpreg = 0; + + tmpreg = I2Cx->OADDR2; + tmpreg &= OADDR2_ADD2_Reset; + tmpreg |= (uint16_t)((uint16_t)Address & (uint16_t)0x00FE); + I2Cx->OADDR2 = tmpreg; +} + +/********************************************************************* + * @fn I2C_DualAddressCmd + * + * @brief Enables or disables the specified I2C dual addressing mode. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_DualAddressCmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->OADDR2 |= OADDR2_ENDUAL_Set; + } + else + { + I2Cx->OADDR2 &= OADDR2_ENDUAL_Reset; + } +} + +/********************************************************************* + * @fn I2C_GeneralCallCmd + * + * @brief Enables or disables the specified I2C general call feature. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_GeneralCallCmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_ENGC_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_ENGC_Reset; + } +} + +/********************************************************************* + * @fn I2C_ITConfig + * + * @brief Enables or disables the specified I2C interrupts. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_IT - specifies the I2C interrupts sources to be enabled or disabled. + * I2C_IT_BUF - Buffer interrupt mask. + * I2C_IT_EVT - Event interrupt mask. + * I2C_IT_ERR - Error interrupt mask. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_ITConfig(I2C_TypeDef *I2Cx, uint16_t I2C_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR2 |= I2C_IT; + } + else + { + I2Cx->CTLR2 &= (uint16_t)~I2C_IT; + } +} + +/********************************************************************* + * @fn I2C_SendData + * + * @brief Sends a data byte through the I2Cx peripheral. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * Data - Byte to be transmitted. + * + * @return none + */ +void I2C_SendData(I2C_TypeDef *I2Cx, uint8_t Data) +{ + I2Cx->DATAR = Data; +} + +/********************************************************************* + * @fn I2C_ReceiveData + * + * @brief Returns the most recent received data by the I2Cx peripheral. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * + * @return The value of the received data. + */ +uint8_t I2C_ReceiveData(I2C_TypeDef *I2Cx) +{ + return (uint8_t)I2Cx->DATAR; +} + +/********************************************************************* + * @fn I2C_Send7bitAddress + * + * @brief Transmits the address byte to select the slave device. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * Address - specifies the slave address which will be transmitted. + * I2C_Direction - specifies whether the I2C device will be a + * Transmitter or a Receiver. + * I2C_Direction_Transmitter - Transmitter mode. + * I2C_Direction_Receiver - Receiver mode. + * + * @return none + */ +void I2C_Send7bitAddress(I2C_TypeDef *I2Cx, uint8_t Address, uint8_t I2C_Direction) +{ + if(I2C_Direction != I2C_Direction_Transmitter) + { + Address |= OADDR1_ADD0_Set; + } + else + { + Address &= OADDR1_ADD0_Reset; + } + + I2Cx->DATAR = Address; +} + +/********************************************************************* + * @fn I2C_ReadRegister + * + * @brief Reads the specified I2C register and returns its value. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_Register - specifies the register to read. + * I2C_Register_CTLR1. + * I2C_Register_CTLR2. + * I2C_Register_OADDR1. + * I2C_Register_OADDR2. + * I2C_Register_DATAR. + * I2C_Register_STAR1. + * I2C_Register_STAR2. + * I2C_Register_CKCFGR. + * I2C_Register_RTR. + * + * @return none + */ +uint16_t I2C_ReadRegister(I2C_TypeDef *I2Cx, uint8_t I2C_Register) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)I2Cx; + tmp += I2C_Register; + + return (*(__IO uint16_t *)tmp); +} + +/********************************************************************* + * @fn I2C_SoftwareResetCmd + * + * @brief Enables or disables the specified I2C software reset. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_SoftwareResetCmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_SWRST_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_SWRST_Reset; + } +} + +/********************************************************************* + * @fn I2C_NACKPositionConfig + * + * @brief Selects the specified I2C NACK position in master receiver mode. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_NACKPosition - specifies the NACK position. + * I2C_NACKPosition_Next - indicates that the next byte will be + * the last received byte. + * I2C_NACKPosition_Current - indicates that current byte is the + * last received byte. + * + * @return none + */ +void I2C_NACKPositionConfig(I2C_TypeDef *I2Cx, uint16_t I2C_NACKPosition) +{ + if(I2C_NACKPosition == I2C_NACKPosition_Next) + { + I2Cx->CTLR1 |= I2C_NACKPosition_Next; + } + else + { + I2Cx->CTLR1 &= I2C_NACKPosition_Current; + } +} + +/********************************************************************* + * @fn I2C_SMBusAlertConfig + * + * @brief Drives the SMBusAlert pin high or low for the specified I2C. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_SMBusAlert - specifies SMBAlert pin level. + * I2C_SMBusAlert_Low - SMBAlert pin driven low. + * I2C_SMBusAlert_High - SMBAlert pin driven high. + * + * @return none + */ +void I2C_SMBusAlertConfig(I2C_TypeDef *I2Cx, uint16_t I2C_SMBusAlert) +{ + if(I2C_SMBusAlert == I2C_SMBusAlert_Low) + { + I2Cx->CTLR1 |= I2C_SMBusAlert_Low; + } + else + { + I2Cx->CTLR1 &= I2C_SMBusAlert_High; + } +} + +/********************************************************************* + * @fn I2C_TransmitPEC + * + * @brief Enables or disables the specified I2C PEC transfer. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_TransmitPEC(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_PEC_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_PEC_Reset; + } +} + +/********************************************************************* + * @fn I2C_PECPositionConfig + * + * @brief Selects the specified I2C PEC position. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_PECPosition - specifies the PEC position. + * I2C_PECPosition_Next - indicates that the next byte is PEC. + * I2C_PECPosition_Current - indicates that current byte is PEC. + * + * @return none + */ +void I2C_PECPositionConfig(I2C_TypeDef *I2Cx, uint16_t I2C_PECPosition) +{ + if(I2C_PECPosition == I2C_PECPosition_Next) + { + I2Cx->CTLR1 |= I2C_PECPosition_Next; + } + else + { + I2Cx->CTLR1 &= I2C_PECPosition_Current; + } +} + +/********************************************************************* + * @fn I2C_CalculatePEC + * + * @brief Enables or disables the PEC value calculation of the transferred bytes. + * + * @param I2Cx- where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_CalculatePEC(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_ENPEC_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_ENPEC_Reset; + } +} + +/********************************************************************* + * @fn I2C_GetPEC + * + * @brief Returns the PEC value for the specified I2C. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * + * @return The PEC value. + */ +uint8_t I2C_GetPEC(I2C_TypeDef *I2Cx) +{ + return ((I2Cx->STAR2) >> 8); +} + +/********************************************************************* + * @fn I2C_ARPCmd + * + * @brief Enables or disables the specified I2C ARP. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return The PEC value. + */ +void I2C_ARPCmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_ENARP_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_ENARP_Reset; + } +} + +/********************************************************************* + * @fn I2C_StretchClockCmd + * + * @brief Enables or disables the specified I2C Clock stretching. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_StretchClockCmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState == DISABLE) + { + I2Cx->CTLR1 |= CTLR1_NOSTRETCH_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_NOSTRETCH_Reset; + } +} + +/********************************************************************* + * @fn I2C_FastModeDutyCycleConfig + * + * @brief Selects the specified I2C fast mode duty cycle. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_DutyCycle - specifies the fast mode duty cycle. + * I2C_DutyCycle_2 - I2C fast mode Tlow/Thigh = 2. + * I2C_DutyCycle_16_9 - I2C fast mode Tlow/Thigh = 16/9. + * + * @return none + */ +void I2C_FastModeDutyCycleConfig(I2C_TypeDef *I2Cx, uint16_t I2C_DutyCycle) +{ + if(I2C_DutyCycle != I2C_DutyCycle_16_9) + { + I2Cx->CKCFGR &= I2C_DutyCycle_2; + } + else + { + I2Cx->CKCFGR |= I2C_DutyCycle_16_9; + } +} + +/********************************************************************* + * @fn I2C_CheckEvent + * + * @brief Checks whether the last I2Cx Event is equal to the one passed + * as parameter. + * + * @param I2Cx- where x can be 1 or 2 to select the I2C peripheral. + * I2C_EVENT: specifies the event to be checked. + * I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED - EV1. + * I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED - EV1. + * I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED - EV1. + * I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED - EV1. + * I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED - EV1. + * I2C_EVENT_SLAVE_BYTE_RECEIVED - EV2. + * (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF) - EV2. + * (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL) - EV2. + * I2C_EVENT_SLAVE_BYTE_TRANSMITTED - EV3. + * (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF) - EV3. + * (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL) - EV3. + * I2C_EVENT_SLAVE_ACK_FAILURE - EV3_2. + * I2C_EVENT_SLAVE_STOP_DETECTED - EV4. + * I2C_EVENT_MASTER_MODE_SELECT - EV5. + * I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED - EV6. + * I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED - EV6. + * I2C_EVENT_MASTER_BYTE_RECEIVED - EV7. + * I2C_EVENT_MASTER_BYTE_TRANSMITTING - EV8. + * I2C_EVENT_MASTER_BYTE_TRANSMITTED - EV8_2. + * I2C_EVENT_MASTER_MODE_ADDRESS10 - EV9. + * + * @return none + */ +ErrorStatus I2C_CheckEvent(I2C_TypeDef *I2Cx, uint32_t I2C_EVENT) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + ErrorStatus status = NoREADY; + + flag1 = I2Cx->STAR1; + flag2 = I2Cx->STAR2; + flag2 = flag2 << 16; + + lastevent = (flag1 | flag2) & FLAG_Mask; + + if((lastevent & I2C_EVENT) == I2C_EVENT) + { + status = READY; + } + else + { + status = NoREADY; + } + + return status; +} + +/********************************************************************* + * @fn I2C_GetLastEvent + * + * @brief Returns the last I2Cx Event. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * + * @return none + */ +uint32_t I2C_GetLastEvent(I2C_TypeDef *I2Cx) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + + flag1 = I2Cx->STAR1; + flag2 = I2Cx->STAR2; + flag2 = flag2 << 16; + lastevent = (flag1 | flag2) & FLAG_Mask; + + return lastevent; +} + +/********************************************************************* + * @fn I2C_GetFlagStatus + * + * @brief Checks whether the last I2Cx Event is equal to the one passed + * as parameter. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_FLAG - specifies the flag to check. + * I2C_FLAG_DUALF - Dual flag (Slave mode). + * I2C_FLAG_SMBHOST - SMBus host header (Slave mode). + * I2C_FLAG_SMBDEFAULT - SMBus default header (Slave mode). + * I2C_FLAG_GENCALL - General call header flag (Slave mode). + * I2C_FLAG_TRA - Transmitter/Receiver flag. + * I2C_FLAG_BUSY - Bus busy flag. + * I2C_FLAG_MSL - Master/Slave flag. + * I2C_FLAG_SMBALERT - SMBus Alert flag. + * I2C_FLAG_TIMEOUT - Timeout or Tlow error flag. + * I2C_FLAG_PECERR - PEC error in reception flag. + * I2C_FLAG_OVR - Overrun/Underrun flag (Slave mode). + * I2C_FLAG_AF - Acknowledge failure flag. + * I2C_FLAG_ARLO - Arbitration lost flag (Master mode). + * I2C_FLAG_BERR - Bus error flag. + * I2C_FLAG_TXE - Data register empty flag (Transmitter). + * I2C_FLAG_RXNE- Data register not empty (Receiver) flag. + * I2C_FLAG_STOPF - Stop detection flag (Slave mode). + * I2C_FLAG_ADD10 - 10-bit header sent flag (Master mode). + * I2C_FLAG_BTF - Byte transfer finished flag. + * I2C_FLAG_ADDR - Address sent flag (Master mode) "ADSL" + * Address matched flag (Slave mode)"ENDA". + * I2C_FLAG_SB - Start bit flag (Master mode). + * + * @return none + */ +FlagStatus I2C_GetFlagStatus(I2C_TypeDef *I2Cx, uint32_t I2C_FLAG) +{ + FlagStatus bitstatus = RESET; + __IO uint32_t i2creg = 0, i2cxbase = 0; + + i2cxbase = (uint32_t)I2Cx; + i2creg = I2C_FLAG >> 28; + I2C_FLAG &= FLAG_Mask; + + if(i2creg != 0) + { + i2cxbase += 0x14; + } + else + { + I2C_FLAG = (uint32_t)(I2C_FLAG >> 16); + i2cxbase += 0x18; + } + + if(((*(__IO uint32_t *)i2cxbase) & I2C_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn I2C_ClearFlag + * + * @brief Clears the I2Cx's pending flags. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_FLAG - specifies the flag to clear. + * I2C_FLAG_SMBALERT - SMBus Alert flag. + * I2C_FLAG_TIMEOUT - Timeout or Tlow error flag. + * I2C_FLAG_PECERR - PEC error in reception flag. + * I2C_FLAG_OVR - Overrun/Underrun flag (Slave mode). + * I2C_FLAG_AF - Acknowledge failure flag. + * I2C_FLAG_ARLO - Arbitration lost flag (Master mode). + * I2C_FLAG_BERR - Bus error flag. + * + * @return none + */ +void I2C_ClearFlag(I2C_TypeDef *I2Cx, uint32_t I2C_FLAG) +{ + uint32_t flagpos = 0; + + flagpos = I2C_FLAG & FLAG_Mask; + I2Cx->STAR1 = (uint16_t)~flagpos; +} + +/********************************************************************* + * @fn I2C_GetITStatus + * + * @brief Checks whether the specified I2C interrupt has occurred or not. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * II2C_IT - specifies the interrupt source to check. + * I2C_IT_SMBALERT - SMBus Alert flag. + * I2C_IT_TIMEOUT - Timeout or Tlow error flag. + * I2C_IT_PECERR - PEC error in reception flag. + * I2C_IT_OVR - Overrun/Underrun flag (Slave mode). + * I2C_IT_AF - Acknowledge failure flag. + * I2C_IT_ARLO - Arbitration lost flag (Master mode). + * I2C_IT_BERR - Bus error flag. + * I2C_IT_TXE - Data register empty flag (Transmitter). + * I2C_IT_RXNE - Data register not empty (Receiver) flag. + * I2C_IT_STOPF - Stop detection flag (Slave mode). + * I2C_IT_ADD10 - 10-bit header sent flag (Master mode). + * I2C_IT_BTF - Byte transfer finished flag. + * I2C_IT_ADDR - Address sent flag (Master mode) "ADSL" Address matched + * flag (Slave mode)"ENDAD". + * I2C_IT_SB - Start bit flag (Master mode). + * + * @return none + */ +ITStatus I2C_GetITStatus(I2C_TypeDef *I2Cx, uint32_t I2C_IT) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + + enablestatus = (uint32_t)(((I2C_IT & ITEN_Mask) >> 16) & (I2Cx->CTLR2)); + I2C_IT &= FLAG_Mask; + + if(((I2Cx->STAR1 & I2C_IT) != (uint32_t)RESET) && enablestatus) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn I2C_ClearITPendingBit + * + * @brief Clears the I2Cx interrupt pending bits. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_IT - specifies the interrupt pending bit to clear. + * I2C_IT_SMBALERT - SMBus Alert interrupt. + * I2C_IT_TIMEOUT - Timeout or Tlow error interrupt. + * I2C_IT_PECERR - PEC error in reception interrupt. + * I2C_IT_OVR - Overrun/Underrun interrupt (Slave mode). + * I2C_IT_AF - Acknowledge failure interrupt. + * I2C_IT_ARLO - Arbitration lost interrupt (Master mode). + * I2C_IT_BERR - Bus error interrupt. + * + * @return none + */ +void I2C_ClearITPendingBit(I2C_TypeDef *I2Cx, uint32_t I2C_IT) +{ + uint32_t flagpos = 0; + + flagpos = I2C_IT & FLAG_Mask; + I2Cx->STAR1 = (uint16_t)~flagpos; +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_iwdg.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_iwdg.c new file mode 100644 index 0000000000..cae190cc15 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_iwdg.c @@ -0,0 +1,120 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_iwdg.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the IWDG firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#include "ch32v20x_iwdg.h" + +/* CTLR register bit mask */ +#define CTLR_KEY_Reload ((uint16_t)0xAAAA) +#define CTLR_KEY_Enable ((uint16_t)0xCCCC) + +/********************************************************************* + * @fn IWDG_WriteAccessCmd + * + * @brief Enables or disables write access to IWDG_PSCR and IWDG_RLDR registers. + * + * @param WDG_WriteAccess - new state of write access to IWDG_PSCR and + * IWDG_RLDR registers. + * IWDG_WriteAccess_Enable - Enable write access to IWDG_PSCR and + * IWDG_RLDR registers. + * IWDG_WriteAccess_Disable - Disable write access to IWDG_PSCR + * and IWDG_RLDR registers. + * + * @return none + */ +void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) +{ + IWDG->CTLR = IWDG_WriteAccess; +} + +/********************************************************************* + * @fn IWDG_SetPrescaler + * + * @brief Sets IWDG Prescaler value. + * + * @param IWDG_Prescaler - specifies the IWDG Prescaler value. + * IWDG_Prescaler_4 - IWDG prescaler set to 4. + * IWDG_Prescaler_8 - IWDG prescaler set to 8. + * IWDG_Prescaler_16 - IWDG prescaler set to 16. + * IWDG_Prescaler_32 - IWDG prescaler set to 32. + * IWDG_Prescaler_64 - IWDG prescaler set to 64. + * IWDG_Prescaler_128 - IWDG prescaler set to 128. + * IWDG_Prescaler_256 - IWDG prescaler set to 256. + * + * @return none + */ +void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) +{ + IWDG->PSCR = IWDG_Prescaler; +} + +/********************************************************************* + * @fn IWDG_SetReload + * + * @brief Sets IWDG Reload value. + * + * @param Reload - specifies the IWDG Reload value. + * This parameter must be a number between 0 and 0x0FFF. + * + * @return none + */ +void IWDG_SetReload(uint16_t Reload) +{ + IWDG->RLDR = Reload; +} + +/********************************************************************* + * @fn IWDG_ReloadCounter + * + * @brief Reloads IWDG counter with value defined in the reload register. + * + * @return none + */ +void IWDG_ReloadCounter(void) +{ + IWDG->CTLR = CTLR_KEY_Reload; +} + +/********************************************************************* + * @fn IWDG_Enable + * + * @brief Enables IWDG (write access to IWDG_PSCR and IWDG_RLDR registers disabled). + * + * @return none + */ +void IWDG_Enable(void) +{ + IWDG->CTLR = CTLR_KEY_Enable; +} + +/********************************************************************* + * @fn IWDG_GetFlagStatus + * + * @brief Checks whether the specified IWDG flag is set or not. + * + * @param IWDG_FLAG - specifies the flag to check. + * IWDG_FLAG_PVU - Prescaler Value Update on going. + * IWDG_FLAG_RVU - Reload Value Update on going. + * + * @return none + */ +FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((IWDG->STATR & IWDG_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_misc.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_misc.c new file mode 100644 index 0000000000..3001affafe --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_misc.c @@ -0,0 +1,107 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_misc.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the miscellaneous firmware functions . + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *********************************************************************************/ +#include "ch32v20x_misc.h" + +__IO uint32_t NVIC_Priority_Group = 0; + +/********************************************************************* + * @fn NVIC_PriorityGroupConfig + * + * @brief Configures the priority grouping - pre-emption priority and subpriority. + * + * @param NVIC_PriorityGroup - specifies the priority grouping bits length. + * NVIC_PriorityGroup_0 - 0 bits for pre-emption priority + * 4 bits for subpriority + * NVIC_PriorityGroup_1 - 1 bits for pre-emption priority + * 3 bits for subpriority + * NVIC_PriorityGroup_2 - 2 bits for pre-emption priority + * 2 bits for subpriority + * NVIC_PriorityGroup_3 - 3 bits for pre-emption priority + * 1 bits for subpriority + * NVIC_PriorityGroup_4 - 4 bits for pre-emption priority + * 0 bits for subpriority + * + * @return none + */ +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) +{ + NVIC_Priority_Group = NVIC_PriorityGroup; +} + +/********************************************************************* + * @fn NVIC_Init + * + * @brief Initializes the NVIC peripheral according to the specified parameters in + * the NVIC_InitStruct. + * + * @param NVIC_InitStruct - pointer to a NVIC_InitTypeDef structure that contains the + * configuration information for the specified NVIC peripheral. + * + * @return none + */ +void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct) +{ + uint8_t tmppre = 0; + + if(NVIC_Priority_Group == NVIC_PriorityGroup_0) + { + NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4); + } + else if(NVIC_Priority_Group == NVIC_PriorityGroup_1) + { + if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority == 1) + { + NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4)); + } + else + { + NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4)); + } + } + else if(NVIC_Priority_Group == NVIC_PriorityGroup_2) + { + if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority <= 1) + { + tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (4 * NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority); + NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (tmppre << 4)); + } + else + { + tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (4 * (NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority - 2)); + NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (tmppre << 4)); + } + } + else if(NVIC_Priority_Group == NVIC_PriorityGroup_3) + { + if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority <= 3) + { + tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (2 * NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority); + NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (0 << 7) | (tmppre << 4)); + } + else + { + tmppre = NVIC_InitStruct->NVIC_IRQChannelSubPriority + (2 * (NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority - 4)); + NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (1 << 7) | (tmppre << 4)); + } + } + else if(NVIC_Priority_Group == NVIC_PriorityGroup_4) + { + NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << 4); + } + + if(NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE) + { + NVIC_EnableIRQ(NVIC_InitStruct->NVIC_IRQChannel); + } + else + { + NVIC_DisableIRQ(NVIC_InitStruct->NVIC_IRQChannel); + } +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_opa.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_opa.c new file mode 100644 index 0000000000..36aa3f2db5 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_opa.c @@ -0,0 +1,84 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_opa.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the OPA firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + ***************************************************************************************/ +#include "ch32v20x_opa.h" + +#define OPA_MASK ((uint32_t)0x000F) +#define OPA_Total_NUM 4 + +/********************************************************************* + * @fn OPA_DeInit + * + * @brief Deinitializes the OPA peripheral registers to their default + * reset values. + * + * @return none + */ +void OPA_DeInit(void) +{ + OPA->CR = 0; +} + +/********************************************************************* + * @fn OPA_Init + * + * @brief Initializes the OPA peripheral according to the specified + * parameters in the OPA_InitStruct. + * + * @param OPA_InitStruct - pointer to a OPA_InitTypeDef structure + * + * @return none + */ +void OPA_Init(OPA_InitTypeDef *OPA_InitStruct) +{ + uint32_t tmp = 0; + tmp = OPA->CR; + tmp &= ~(OPA_MASK << (OPA_InitStruct->OPA_NUM * OPA_Total_NUM)); + tmp |= (((OPA_InitStruct->PSEL << OPA_PSEL_OFFSET) | (OPA_InitStruct->NSEL << OPA_NSEL_OFFSET) | (OPA_InitStruct->Mode << OPA_MODE_OFFSET)) << (OPA_InitStruct->OPA_NUM * OPA_Total_NUM)); + OPA->CR = tmp; +} + +/********************************************************************* + * @fn OPA_StructInit + * + * @brief Fills each OPA_StructInit member with its reset value. + * + * @param OPA_StructInit - pointer to a OPA_InitTypeDef structure + * + * @return none + */ +void OPA_StructInit(OPA_InitTypeDef *OPA_InitStruct) +{ + OPA_InitStruct->Mode = OUT_IO_OUT1; + OPA_InitStruct->PSEL = CHP0; + OPA_InitStruct->NSEL = CHN0; + OPA_InitStruct->OPA_NUM = OPA1; +} + +/********************************************************************* + * @fn OPA_Cmd + * + * @brief Enables or disables the specified OPA peripheral. + * + * @param OPA_NUM - Select OPA + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void OPA_Cmd(OPA_Num_TypeDef OPA_NUM, FunctionalState NewState) +{ + if(NewState == ENABLE) + { + OPA->CR |= (1 << (OPA_NUM * OPA_Total_NUM)); + } + else + { + OPA->CR &= ~(1 << (OPA_NUM * OPA_Total_NUM)); + } +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_pwr.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_pwr.c new file mode 100644 index 0000000000..e17fdbe43a --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_pwr.c @@ -0,0 +1,400 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_pwr.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the PWR firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +#include "ch32v20x_pwr.h" +#include "ch32v20x_rcc.h" + +/* PWR registers bit mask */ +/* CTLR register bit mask */ +#define CTLR_DS_MASK ((uint32_t)0xFFFFFFFC) +#define CTLR_PLS_MASK ((uint32_t)0xFFFFFF1F) + +/********************************************************************* + * @fn PWR_DeInit + * + * @brief Deinitializes the PWR peripheral registers to their default + * reset values. + * + * @return none + */ +void PWR_DeInit(void) +{ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, DISABLE); +} + +/********************************************************************* + * @fn PWR_BackupAccessCmd + * + * @brief Enables or disables access to the RTC and backup registers. + * + * @param NewState - new state of the access to the RTC and backup registers, + * This parameter can be: ENABLE or DISABLE. + * + * @return none + */ +void PWR_BackupAccessCmd(FunctionalState NewState) +{ + if(NewState) + { + PWR->CTLR |= (1 << 8); + } + else + { + PWR->CTLR &= ~(1 << 8); + } +} + +/********************************************************************* + * @fn PWR_PVDCmd + * + * @brief Enables or disables the Power Voltage Detector(PVD). + * + * @param NewState - new state of the PVD(ENABLE or DISABLE). + * + * @return none + */ +void PWR_PVDCmd(FunctionalState NewState) +{ + if(NewState) + { + PWR->CTLR |= (1 << 4); + } + else + { + PWR->CTLR &= ~(1 << 4); + } +} + +/********************************************************************* + * @fn PWR_PVDLevelConfig + * + * @brief Configures the voltage threshold detected by the Power Voltage + * Detector(PVD). + * + * @param PWR_PVDLevel - specifies the PVD detection level + * PWR_PVDLevel_2V2 - PVD detection level set to 2.2V + * PWR_PVDLevel_2V3 - PVD detection level set to 2.3V + * PWR_PVDLevel_2V4 - PVD detection level set to 2.4V + * PWR_PVDLevel_2V5 - PVD detection level set to 2.5V + * PWR_PVDLevel_2V6 - PVD detection level set to 2.6V + * PWR_PVDLevel_2V7 - PVD detection level set to 2.7V + * PWR_PVDLevel_2V8 - PVD detection level set to 2.8V + * PWR_PVDLevel_2V9 - PVD detection level set to 2.9V + * + * @return none + */ +void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + tmpreg &= CTLR_PLS_MASK; + tmpreg |= PWR_PVDLevel; + PWR->CTLR = tmpreg; +} + +/********************************************************************* + * @fn PWR_WakeUpPinCmd + * + * @brief Enables or disables the WakeUp Pin functionality. + * + * @param NewState - new state of the WakeUp Pin functionality + * (ENABLE or DISABLE). + * + * @return none + */ +void PWR_WakeUpPinCmd(FunctionalState NewState) +{ + if(NewState) + { + PWR->CSR |= (1 << 8); + } + else + { + PWR->CSR &= ~(1 << 8); + } +} + +/********************************************************************* + * @fn PWR_EnterSTOPMode + * + * @brief Enters STOP mode. + * + * @param PWR_Regulator - specifies the regulator state in STOP mode. + * PWR_Regulator_ON - STOP mode with regulator ON + * PWR_Regulator_LowPower - STOP mode with regulator in low power mode + * PWR_STOPEntry - specifies if STOP mode in entered with WFI or WFE instruction. + * PWR_STOPEntry_WFI - enter STOP mode with WFI instruction + * PWR_STOPEntry_WFE - enter STOP mode with WFE instruction + * + * @return none + */ +void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + tmpreg &= CTLR_DS_MASK; + tmpreg |= PWR_Regulator; + PWR->CTLR = tmpreg; + + NVIC->SCTLR |= (1 << 2); + + if(PWR_STOPEntry == PWR_STOPEntry_WFI) + { + __WFI(); + } + else + { + __WFE(); + } + + NVIC->SCTLR &= ~(1 << 2); +} + +/********************************************************************* + * @fn PWR_EnterSTANDBYMode + * + * @brief Enters STANDBY mode. + * + * @return none + */ +void PWR_EnterSTANDBYMode(void) +{ + PWR->CTLR |= PWR_CTLR_CWUF; + PWR->CTLR |= PWR_CTLR_PDDS; + NVIC->SCTLR |= (1 << 2); + + __WFI(); +} + +/********************************************************************* + * @fn PWR_GetFlagStatus + * + * @brief Checks whether the specified PWR flag is set or not. + * + * @param PWR_FLAG - specifies the flag to check. + * PWR_FLAG_WU - Wake Up flag + * PWR_FLAG_SB - StandBy flag + * PWR_FLAG_PVDO - PVD Output + * + * @return none + */ +FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((PWR->CSR & PWR_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn PWR_ClearFlag + * + * @brief Clears the PWR's pending flags. + * + * @param PWR_FLAG - specifies the flag to clear. + * PWR_FLAG_WU - Wake Up flag + * PWR_FLAG_SB - StandBy flag + * + * @return none + */ +void PWR_ClearFlag(uint32_t PWR_FLAG) +{ + PWR->CTLR |= PWR_FLAG << 2; +} + +/********************************************************************* + * @fn PWR_EnterSTANDBYMode_RAM + * + * @brief Enters STANDBY mode with RAM data retention function on. + * + * @return none + */ +void PWR_EnterSTANDBYMode_RAM(void) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + + tmpreg |= PWR_CTLR_CWUF; + tmpreg |= PWR_CTLR_PDDS; + +#if defined (CH32V20x_D8) || defined (CH32V20x_D8W) + //2K+30K in standby w power. + tmpreg |= (0x1 << 16) | (0x1 << 17); +#else + //RAM in standby power. + tmpreg |= ( ( uint32_t )1 << 16 ); + +#endif + + PWR->CTLR = tmpreg; + + NVIC->SCTLR |= (1 << 2); + + __WFI(); +} + +/********************************************************************* + * @fn PWR_EnterSTANDBYMode_RAM_LV + * + * @brief Enters STANDBY mode with RAM data retention function and LV mode on. + * + * @return none + */ +void PWR_EnterSTANDBYMode_RAM_LV(void) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + + tmpreg |= PWR_CTLR_CWUF; + tmpreg |= PWR_CTLR_PDDS; + +#if defined (CH32V20x_D8) || defined (CH32V20x_D8W) + //2K+30K in standby power. + tmpreg |= (0x1 << 16) | (0x1 << 17); + //2K+30K in standby LV . + tmpreg |= (0x1 << 20); +#else + //RAM in standby power. + tmpreg |= ( ( uint32_t )1 << 16 ); + //RAM in standby LV . + tmpreg |= ( ( uint32_t )1 << 20 ); + +#endif + + PWR->CTLR = tmpreg; + + NVIC->SCTLR |= (1 << 2); + + __WFI(); +} + +/********************************************************************* + * @fn PWR_EnterSTANDBYMode_RAM_VBAT_EN + * + * @brief Enters STANDBY mode with RAM data retention function on (VBAT Enable). + * + * @return none + */ +void PWR_EnterSTANDBYMode_RAM_VBAT_EN(void) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + + tmpreg |= PWR_CTLR_CWUF; + tmpreg |= PWR_CTLR_PDDS; + +#if defined (CH32V20x_D8) || defined (CH32V20x_D8W) + //2K+30K in standby power (VBAT Enable). + tmpreg |= (0x1 << 18) | (0x1 << 19); +#else + //RAM in standby w power. + tmpreg |= ( ( uint32_t )1 << 18 ); + +#endif + + PWR->CTLR = tmpreg; + + NVIC->SCTLR |= (1 << 2); + + __WFI(); +} + +/********************************************************************* + * @fn PWR_EnterSTANDBYMode_RAM_LV_VBAT_EN + * + * @brief Enters STANDBY mode with RAM data retention function and LV mode on(VBAT Enable). + * + * @return none + */ +void PWR_EnterSTANDBYMode_RAM_LV_VBAT_EN(void) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + + tmpreg |= PWR_CTLR_CWUF; + tmpreg |= PWR_CTLR_PDDS; + +#if defined (CH32V20x_D8) || defined (CH32V20x_D8W) + //2K+30K in standby power (VBAT Enable). + tmpreg |= (0x1 << 18) | (0x1 << 19); + //2K+30K in standby LV . + tmpreg |= (0x1 << 20); +#else + //RAM in standby w power. + tmpreg |= ( ( uint32_t )1 << 18 ); + //RAM in standby LV . + tmpreg |= ( ( uint32_t )1 << 20 ); + +#endif + + PWR->CTLR = tmpreg; + + NVIC->SCTLR |= (1 << 2); + + __WFI(); +} + + +/********************************************************************* + * @fn PWR_EnterSTOPMode_RAM_LV + * + * @brief Enters STOP mode with RAM data retention function and LV mode on. + * + * @param PWR_Regulator - specifies the regulator state in STOP mode. + * PWR_Regulator_ON - STOP mode with regulator ON + * PWR_Regulator_LowPower - STOP mode with regulator in low power mode + * PWR_STOPEntry - specifies if STOP mode in entered with WFI or WFE instruction. + * PWR_STOPEntry_WFI - enter STOP mode with WFI instruction + * PWR_STOPEntry_WFE - enter STOP mode with WFE instruction + * + * @return none + */ +void PWR_EnterSTOPMode_RAM_LV(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + tmpreg &= CTLR_DS_MASK; + tmpreg |= PWR_Regulator; + +#if defined (CH32V20x_D8) || defined (CH32V20x_D8W) + //2K+30K in standby power. + tmpreg |= (0x1 << 16) | (0x1 << 17); + //2K+30K in standby LV . + tmpreg |= (0x1 << 20); +#else + //RAM in standby power. + tmpreg |= ( ( uint32_t )1 << 16 ); + //RAM in standby LV . + tmpreg |= ( ( uint32_t )1 << 20 ); + +#endif + + PWR->CTLR = tmpreg; + + NVIC->SCTLR |= (1 << 2); + + if(PWR_STOPEntry == PWR_STOPEntry_WFI) + { + __WFI(); + } + else + { + __WFE(); + } + + NVIC->SCTLR &= ~(1 << 2); +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_rcc.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_rcc.c new file mode 100644 index 0000000000..261c9082c1 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_rcc.c @@ -0,0 +1,1018 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_rcc.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the RCC firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#include "ch32v20x_rcc.h" + +/* RCC registers bit address in the alias region */ +#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) + +/* BDCTLR Register */ +#define BDCTLR_OFFSET (RCC_OFFSET + 0x20) + +/* RCC registers bit mask */ + +/* CTLR register bit mask */ +#define CTLR_HSEBYP_Reset ((uint32_t)0xFFFBFFFF) +#define CTLR_HSEBYP_Set ((uint32_t)0x00040000) +#define CTLR_HSEON_Reset ((uint32_t)0xFFFEFFFF) +#define CTLR_HSEON_Set ((uint32_t)0x00010000) +#define CTLR_HSITRIM_Mask ((uint32_t)0xFFFFFF07) + +#define CFGR0_PLL_Mask ((uint32_t)0xFFC0FFFF) + +#define CFGR0_PLLMull_Mask ((uint32_t)0x003C0000) +#define CFGR0_PLLSRC_Mask ((uint32_t)0x00010000) +#define CFGR0_PLLXTPRE_Mask ((uint32_t)0x00020000) +#define CFGR0_SWS_Mask ((uint32_t)0x0000000C) +#define CFGR0_SW_Mask ((uint32_t)0xFFFFFFFC) +#define CFGR0_HPRE_Reset_Mask ((uint32_t)0xFFFFFF0F) +#define CFGR0_HPRE_Set_Mask ((uint32_t)0x000000F0) +#define CFGR0_PPRE1_Reset_Mask ((uint32_t)0xFFFFF8FF) +#define CFGR0_PPRE1_Set_Mask ((uint32_t)0x00000700) +#define CFGR0_PPRE2_Reset_Mask ((uint32_t)0xFFFFC7FF) +#define CFGR0_PPRE2_Set_Mask ((uint32_t)0x00003800) +#define CFGR0_ADCPRE_Reset_Mask ((uint32_t)0xFFFF3FFF) +#define CFGR0_ADCPRE_Set_Mask ((uint32_t)0x0000C000) + +/* RSTSCKR register bit mask */ +#define RSTSCKR_RMVF_Set ((uint32_t)0x01000000) + +/* CFGR2 register bit mask */ +#define CFGR2_PREDIV1SRC ((uint32_t)0x00010000) +#define CFGR2_PREDIV1 ((uint32_t)0x0000000F) +#define CFGR2_PREDIV2 ((uint32_t)0x000000F0) +#define CFGR2_PLL2MUL ((uint32_t)0x00000F00) +#define CFGR2_PLL3MUL ((uint32_t)0x0000F000) + +/* RCC Flag Mask */ +#define FLAG_Mask ((uint8_t)0x1F) + +/* INTR register byte 2 (Bits[15:8]) base address */ +#define INTR_BYTE2_ADDRESS ((uint32_t)0x40021009) + +/* INTR register byte 3 (Bits[23:16]) base address */ +#define INTR_BYTE3_ADDRESS ((uint32_t)0x4002100A) + +/* CFGR0 register byte 4 (Bits[31:24]) base address */ +#define CFGR0_BYTE4_ADDRESS ((uint32_t)0x40021007) + +/* BDCTLR register base address */ +#define BDCTLR_ADDRESS (PERIPH_BASE + BDCTLR_OFFSET) + + +static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9}; +static __I uint8_t ADCPrescTable[4] = {2, 4, 6, 8}; + +/********************************************************************* + * @fn RCC_DeInit + * + * @brief Resets the RCC clock configuration to the default reset state. + * + * @return none + */ +void RCC_DeInit(void) +{ + RCC->CTLR |= (uint32_t)0x00000001; + RCC->CFGR0 &= (uint32_t)0xF8FF0000; + RCC->CTLR &= (uint32_t)0xFEF6FFFF; + RCC->CTLR &= (uint32_t)0xFFFBFFFF; + RCC->CFGR0 &= (uint32_t)0xFF80FFFF; + RCC->INTR = 0x009F0000; +} + +/********************************************************************* + * @fn RCC_HSEConfig + * + * @brief Configures the External High Speed oscillator (HSE). + * + * @param RCC_HSE - + * RCC_HSE_OFF - HSE oscillator OFF. + * RCC_HSE_ON - HSE oscillator ON. + * RCC_HSE_Bypass - HSE oscillator bypassed with external clock. + * + * @return none + */ +void RCC_HSEConfig(uint32_t RCC_HSE) +{ + RCC->CTLR &= CTLR_HSEON_Reset; + RCC->CTLR &= CTLR_HSEBYP_Reset; + + switch(RCC_HSE) + { + case RCC_HSE_ON: + RCC->CTLR |= CTLR_HSEON_Set; + break; + + case RCC_HSE_Bypass: + RCC->CTLR |= CTLR_HSEBYP_Set | CTLR_HSEON_Set; + break; + + default: + break; + } +} + +/********************************************************************* + * @fn RCC_WaitForHSEStartUp + * + * @brief Waits for HSE start-up. + * + * @return SUCCESS - HSE oscillator is stable and ready to use. + * ERROR - HSE oscillator not yet ready. + */ +ErrorStatus RCC_WaitForHSEStartUp(void) +{ + __IO uint32_t StartUpCounter = 0; + + ErrorStatus status = NoREADY; + FlagStatus HSEStatus = RESET; + + do + { + HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY); + StartUpCounter++; + } while((StartUpCounter != HSE_STARTUP_TIMEOUT) && (HSEStatus == RESET)); + + if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET) + { + status = READY; + } + else + { + status = NoREADY; + } + + return (status); +} + +/********************************************************************* + * @fn RCC_AdjustHSICalibrationValue + * + * @brief Adjusts the Internal High Speed oscillator (HSI) calibration value. + * + * @param HSICalibrationValue - specifies the calibration trimming value. + * This parameter must be a number between 0 and 0x1F. + * + * @return none + */ +void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CTLR; + tmpreg &= CTLR_HSITRIM_Mask; + tmpreg |= (uint32_t)HSICalibrationValue << 3; + RCC->CTLR = tmpreg; +} + +/********************************************************************* + * @fn RCC_HSICmd + * + * @brief Enables or disables the Internal High Speed oscillator (HSI). + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_HSICmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->CTLR |= (1<<0); + } + else{ + RCC->CTLR &= ~(1<<0); + } +} + +/********************************************************************* + * @fn RCC_PLLConfig + * + * @brief Configures the PLL clock source and multiplication factor. + * + * @param RCC_PLLSource - specifies the PLL entry clock source. + * RCC_PLLSource_HSI_Div2 - HSI oscillator clock divided by 2 + * selected as PLL clock entry. + * RCC_PLLSource_PREDIV1 - PREDIV1 clock selected as PLL clock + * entry. + * RCC_PLLMul - specifies the PLL multiplication factor. + * This parameter can be RCC_PLLMul_x where x:[2,16]. + * RCC_PLLMul_2 + * RCC_PLLMul_3 + * RCC_PLLMul_4 + * RCC_PLLMul_5 + * RCC_PLLMul_6 + * RCC_PLLMul_7 + * RCC_PLLMul_8 + * RCC_PLLMul_9 + * RCC_PLLMul_10 + * RCC_PLLMul_11 + * RCC_PLLMul_12 + * RCC_PLLMul_13 + * RCC_PLLMul_14 + * RCC_PLLMul_15 + * RCC_PLLMul_16 + * RCC_PLLMul_18 + * + * @return none + */ +void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR0; + + tmpreg &= CFGR0_PLL_Mask; + tmpreg |= RCC_PLLSource | RCC_PLLMul; + RCC->CFGR0 = tmpreg; +} + +/********************************************************************* + * @fn RCC_PLLCmd + * + * @brief Enables or disables the PLL. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_PLLCmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->CTLR |= (1<<24); + } + else{ + RCC->CTLR &= ~(1<<24); + } +} + +/********************************************************************* + * @fn RCC_SYSCLKConfig + * + * @brief Configures the system clock (SYSCLK). + * + * @param RCC_SYSCLKSource - specifies the clock source used as system clock. + * RCC_SYSCLKSource_HSI - HSI selected as system clock. + * RCC_SYSCLKSource_HSE - HSE selected as system clock. + * RCC_SYSCLKSource_PLLCLK - PLL selected as system clock. + * + * @return none + */ +void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR0; + tmpreg &= CFGR0_SW_Mask; + tmpreg |= RCC_SYSCLKSource; + RCC->CFGR0 = tmpreg; +} + +/********************************************************************* + * @fn RCC_GetSYSCLKSource + * + * @brief Returns the clock source used as system clock. + * + * @return 0x00 - HSI used as system clock. + * 0x04 - HSE used as system clock. + * 0x08 - PLL used as system clock. + */ +uint8_t RCC_GetSYSCLKSource(void) +{ + return ((uint8_t)(RCC->CFGR0 & CFGR0_SWS_Mask)); +} + +/********************************************************************* + * @fn RCC_HCLKConfig + * + * @brief Configures the AHB clock (HCLK). + * + * @param RCC_SYSCLK - defines the AHB clock divider. This clock is derived from + * the system clock (SYSCLK). + * RCC_SYSCLK_Div1 - AHB clock = SYSCLK. + * RCC_SYSCLK_Div2 - AHB clock = SYSCLK/2. + * RCC_SYSCLK_Div4 - AHB clock = SYSCLK/4. + * RCC_SYSCLK_Div8 - AHB clock = SYSCLK/8. + * RCC_SYSCLK_Div16 - AHB clock = SYSCLK/16. + * RCC_SYSCLK_Div64 - AHB clock = SYSCLK/64. + * RCC_SYSCLK_Div128 - AHB clock = SYSCLK/128. + * RCC_SYSCLK_Div256 - AHB clock = SYSCLK/256. + * RCC_SYSCLK_Div512 - AHB clock = SYSCLK/512. + * + * @return none + */ +void RCC_HCLKConfig(uint32_t RCC_SYSCLK) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR0; + tmpreg &= CFGR0_HPRE_Reset_Mask; + tmpreg |= RCC_SYSCLK; + RCC->CFGR0 = tmpreg; +} + +/********************************************************************* + * @fn RCC_PCLK1Config + * + * @brief Configures the Low Speed APB clock (PCLK1). + * + * @param RCC_HCLK - defines the APB1 clock divider. This clock is derived from + * the AHB clock (HCLK). + * RCC_HCLK_Div1 - APB1 clock = HCLK. + * RCC_HCLK_Div2 - APB1 clock = HCLK/2. + * RCC_HCLK_Div4 - APB1 clock = HCLK/4. + * RCC_HCLK_Div8 - APB1 clock = HCLK/8. + * RCC_HCLK_Div16 - APB1 clock = HCLK/16. + * + * @return none + */ +void RCC_PCLK1Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR0; + tmpreg &= CFGR0_PPRE1_Reset_Mask; + tmpreg |= RCC_HCLK; + RCC->CFGR0 = tmpreg; +} + +/********************************************************************* + * @fn RCC_PCLK2Config + * + * @brief Configures the High Speed APB clock (PCLK2). + * + * @param RCC_HCLK - defines the APB2 clock divider. This clock is derived from + * the AHB clock (HCLK). + * RCC_PCLK2_Div2 - APB2 clock = HCLK. + * RCC_PCLK2_Div4 - APB2 clock = HCLK/2. + * RCC_PCLK2_Div6 - APB2 clock = HCLK/4. + * RCC_PCLK2_Div8 - APB2 clock = HCLK/8. + * + * @return none + */ +void RCC_PCLK2Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR0; + tmpreg &= CFGR0_PPRE2_Reset_Mask; + tmpreg |= RCC_HCLK << 3; + RCC->CFGR0 = tmpreg; +} + +/********************************************************************* + * @fn RCC_ITConfig + * + * @brief Enables or disables the specified RCC interrupts. + * + * @param RCC_IT - specifies the RCC interrupt sources to be enabled or disabled. + * RCC_IT_LSIRDY - LSI ready interrupt. + * RCC_IT_LSERDY - LSE ready interrupt. + * RCC_IT_HSIRDY - HSI ready interrupt. + * RCC_IT_HSERDY - HSE ready interrupt. + * RCC_IT_PLLRDY - PLL ready interrupt. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState) +{ + if (NewState != DISABLE) + { + *(__IO uint8_t *) INTR_BYTE2_ADDRESS |= RCC_IT; + } + else + { + *(__IO uint8_t *) INTR_BYTE2_ADDRESS &= (uint8_t)~RCC_IT; + } +} + +/********************************************************************* + * @fn RCC_USBCLKConfig + * + * @brief Configures the USB clock (USBCLK). + * + * @param RCC_USBCLKSource: specifies the USB clock source. This clock is + * derived from the PLL output. + * RCC_USBCLKSource_PLLCLK_Div1 - PLL clock selected as USB clock source(48Mhz). + * RCC_USBCLKSource_PLLCLK_Div2 - PLL clock selected as USB clock source(96MHz). + * RCC_USBCLKSource_PLLCLK_Div3 - PLL clock selected as USB clock source(144MHz). + * RCC_USBCLKSource_PLLCLK_Div5 - PLL clock selected as USB clock source(240MHz). + * + * @return none + */ +void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource) +{ + RCC->CFGR0 &= ~((uint32_t)3<<22); + RCC->CFGR0 |= RCC_USBCLKSource<<22; +} + +/********************************************************************* + * @fn RCC_ADCCLKConfig + * + * @brief Configures the ADC clock (ADCCLK). + * + * @param RCC_PCLK2 - defines the ADC clock divider. This clock is derived from + * the APB2 clock (PCLK2). + * RCC_PCLK2_Div2 - ADC clock = PCLK2/2. + * RCC_PCLK2_Div4 - ADC clock = PCLK2/4. + * RCC_PCLK2_Div6 - ADC clock = PCLK2/6. + * RCC_PCLK2_Div8 - ADC clock = PCLK2/8. + * + * @return none + */ +void RCC_ADCCLKConfig(uint32_t RCC_PCLK2) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR0; + tmpreg &= CFGR0_ADCPRE_Reset_Mask; + tmpreg |= RCC_PCLK2; + RCC->CFGR0 = tmpreg; +} + +/********************************************************************* + * @fn RCC_LSEConfig + * + * @brief Configures the External Low Speed oscillator (LSE). + * + * @param RCC_LSE - specifies the new state of the LSE. + * RCC_LSE_OFF - LSE oscillator OFF. + * RCC_LSE_ON - LSE oscillator ON. + * RCC_LSE_Bypass - LSE oscillator bypassed with external clock. + * + * @return none + */ +void RCC_LSEConfig(uint8_t RCC_LSE) +{ + *(__IO uint8_t *) BDCTLR_ADDRESS = RCC_LSE_OFF; + *(__IO uint8_t *) BDCTLR_ADDRESS = RCC_LSE_OFF; + + switch(RCC_LSE) + { + case RCC_LSE_ON: + *(__IO uint8_t *) BDCTLR_ADDRESS = RCC_LSE_ON; + break; + + case RCC_LSE_Bypass: + *(__IO uint8_t *) BDCTLR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON; + break; + + default: + break; + } +} + +/********************************************************************* + * @fn RCC_LSICmd + * + * @brief Enables or disables the Internal Low Speed oscillator (LSI). + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_LSICmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->RSTSCKR |= (1<<0); + } + else{ + RCC->RSTSCKR &= ~(1<<0); + } +} + +/********************************************************************* + * @fn RCC_RTCCLKConfig + * + * @brief Once the RTC clock is selected it can't be changed unless the Backup domain is reset. + * + * @param RCC_RTCCLKSource - specifies the RTC clock source. + * RCC_RTCCLKSource_LSE - LSE selected as RTC clock. + * RCC_RTCCLKSource_LSI - LSI selected as RTC clock. + * RCC_RTCCLKSource_HSE_Div128 - HSE clock divided by 128 selected as RTC clock. + * + * @return none + */ +void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource) +{ + RCC->BDCTLR |= RCC_RTCCLKSource; +} + +/********************************************************************* + * @fn RCC_RTCCLKCmd + * + * @brief This function must be used only after the RTC clock was selected + * using the RCC_RTCCLKConfig function. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_RTCCLKCmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->BDCTLR |= (1<<15); + } + else{ + RCC->BDCTLR &= ~(1<<15); + } +} + +/********************************************************************* + * @fn RCC_GetClocksFreq + * + * @brief The result of this function could be not correct when using + * fractional value for HSE crystal. + * + * @param RCC_Clocks - pointer to a RCC_ClocksTypeDef structure which will hold + * the clocks frequencies. + * + * @return none + */ +void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks) +{ + uint32_t tmp = 0, pllmull = 0, pllsource = 0, presc = 0; + + tmp = RCC->CFGR0 & CFGR0_SWS_Mask; + + switch (tmp) + { + case 0x00: + RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; + break; + + case 0x04: + RCC_Clocks->SYSCLK_Frequency = HSE_VALUE; + break; + + case 0x08: + pllmull = RCC->CFGR0 & CFGR0_PLLMull_Mask; + pllsource = RCC->CFGR0 & CFGR0_PLLSRC_Mask; + + pllmull = ( pllmull >> 18) + 2; + + if(pllmull == 17) pllmull = 18; + + + if (pllsource == 0x00) + { + if(EXTEN->EXTEN_CTR & EXTEN_PLL_HSI_PRE){ + RCC_Clocks->SYSCLK_Frequency = (HSI_VALUE) * pllmull; + } + else{ + RCC_Clocks->SYSCLK_Frequency = (HSI_VALUE >>1) * pllmull; + } + } + else + { +#if defined (CH32V20x_D8W) + if((RCC->CFGR0 & (3<<22)) == (3<<22)) + { + RCC_Clocks->SYSCLK_Frequency = ((HSE_VALUE>>1)) * pllmull; + } + else +#endif + if ((RCC->CFGR0 & CFGR0_PLLXTPRE_Mask) != (uint32_t)RESET) + { +#if defined (CH32V20x_D8) || defined (CH32V20x_D8W) + RCC_Clocks->SYSCLK_Frequency = ((HSE_VALUE>>2) >> 1) * pllmull; +#else + RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE >> 1) * pllmull; +#endif + } + else + { +#if defined (CH32V20x_D8) || defined (CH32V20x_D8W) + RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE>>2) * pllmull; +#else + RCC_Clocks->SYSCLK_Frequency = HSE_VALUE * pllmull; +#endif + + } + } + + break; + + default: + RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; + break; + } + + tmp = RCC->CFGR0 & CFGR0_HPRE_Set_Mask; + tmp = tmp >> 4; + presc = APBAHBPrescTable[tmp]; + RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc; + tmp = RCC->CFGR0 & CFGR0_PPRE1_Set_Mask; + tmp = tmp >> 8; + presc = APBAHBPrescTable[tmp]; + RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc; + tmp = RCC->CFGR0 & CFGR0_PPRE2_Set_Mask; + tmp = tmp >> 11; + presc = APBAHBPrescTable[tmp]; + RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc; + tmp = RCC->CFGR0 & CFGR0_ADCPRE_Set_Mask; + tmp = tmp >> 14; + presc = ADCPrescTable[tmp]; + RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc; +} + +/********************************************************************* + * @fn RCC_AHBPeriphClockCmd + * + * @brief Enables or disables the AHB peripheral clock. + * + * @param RCC_AHBPeriph - specifies the AHB peripheral to gates its clock. + * RCC_AHBPeriph_DMA1. + * RCC_AHBPeriph_DMA2. + * RCC_AHBPeriph_SRAM. + * RCC_AHBPeriph_CRC. + * RCC_AHBPeriph_OTG_FS + * NewState: ENABLE or DISABLE. + * + * @return none + */ +void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) +{ + if (NewState != DISABLE) + { + RCC->AHBPCENR |= RCC_AHBPeriph; + } + else + { + RCC->AHBPCENR &= ~RCC_AHBPeriph; + } +} + +/********************************************************************* + * @fn RCC_APB2PeriphClockCmd + * + * @brief Enables or disables the High Speed APB (APB2) peripheral clock. + * + * @param RCC_APB2Periph - specifies the APB2 peripheral to gates its clock. + * RCC_APB2Periph_AFIO. + * RCC_APB2Periph_GPIOA. + * RCC_APB2Periph_GPIOB. + * RCC_APB2Periph_GPIOC. + * RCC_APB2Periph_GPIOD. + * RCC_APB2Periph_GPIOE + * RCC_APB2Periph_ADC1. + * RCC_APB2Periph_ADC2 + * RCC_APB2Periph_TIM1. + * RCC_APB2Periph_SPI1. + * RCC_APB2Periph_TIM8 + * RCC_APB2Periph_USART1. + * NewState - ENABLE or DISABLE + * + * @return none + */ +void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) +{ + if (NewState != DISABLE) + { + RCC->APB2PCENR |= RCC_APB2Periph; + } + else + { + RCC->APB2PCENR &= ~RCC_APB2Periph; + } +} + +/********************************************************************* + * @fn RCC_APB1PeriphClockCmd + * + * @brief Enables or disables the Low Speed APB (APB1) peripheral clock. + * + * @param RCC_APB1Periph - specifies the APB1 peripheral to gates its clock. + * RCC_APB1Periph_TIM2. + * RCC_APB1Periph_TIM3. + * RCC_APB1Periph_TIM4. + * RCC_APB1Periph_TIM5 + * RCC_APB1Periph_WWDG. + * RCC_APB1Periph_SPI2. + * RCC_APB1Periph_USART2. + * RCC_APB1Periph_USART3. + * RCC_APB1Periph_UART4 + * RCC_APB1Periph_I2C1. + * RCC_APB1Periph_I2C2. + * RCC_APB1Periph_USB. + * RCC_APB1Periph_CAN1. + * RCC_APB1Periph_BKP. + * RCC_APB1Periph_PWR. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) +{ + if (NewState != DISABLE) + { + RCC->APB1PCENR |= RCC_APB1Periph; + } + else + { + RCC->APB1PCENR &= ~RCC_APB1Periph; + } +} + +/********************************************************************* + * @fn RCC_APB2PeriphResetCmd + * + * @brief Forces or releases High Speed APB (APB2) peripheral reset. + * + * @param RCC_APB2Periph - specifies the APB2 peripheral to reset. + * RCC_APB2Periph_AFIO. + * RCC_APB2Periph_GPIOA. + * RCC_APB2Periph_GPIOB. + * RCC_APB2Periph_GPIOC. + * RCC_APB2Periph_GPIOD. + * RCC_APB2Periph_GPIOE + * RCC_APB2Periph_ADC1. + * RCC_APB2Periph_ADC2 + * RCC_APB2Periph_TIM1. + * RCC_APB2Periph_SPI1. + * RCC_APB2Periph_TIM8 + * RCC_APB2Periph_USART1. + * NewState - ENABLE or DISABLE + * + * @return none + */ +void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) +{ + if (NewState != DISABLE) + { + RCC->APB2PRSTR |= RCC_APB2Periph; + } + else + { + RCC->APB2PRSTR &= ~RCC_APB2Periph; + } +} + +/********************************************************************* + * @fn RCC_APB1PeriphResetCmd + * + * @brief Forces or releases Low Speed APB (APB1) peripheral reset. + * + * @param RCC_APB1Periph - specifies the APB1 peripheral to reset. + * RCC_APB1Periph_TIM2. + * RCC_APB1Periph_TIM3. + * RCC_APB1Periph_TIM4. + * RCC_APB1Periph_TIM5 + * RCC_APB1Periph_WWDG. + * RCC_APB1Periph_SPI2. + * RCC_APB1Periph_USART2. + * RCC_APB1Periph_USART3. + * RCC_APB1Periph_UART4 + * RCC_APB1Periph_I2C1. + * RCC_APB1Periph_I2C2. + * RCC_APB1Periph_USB. + * RCC_APB1Periph_CAN1. + * RCC_APB1Periph_BKP. + * RCC_APB1Periph_PWR. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) +{ + if (NewState != DISABLE) + { + RCC->APB1PRSTR |= RCC_APB1Periph; + } + else + { + RCC->APB1PRSTR &= ~RCC_APB1Periph; + } +} + +/********************************************************************* + * @fn RCC_BackupResetCmd + * + * @brief Forces or releases the Backup domain reset. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_BackupResetCmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->BDCTLR |= (1<<16); + } + else{ + RCC->BDCTLR &= ~(1<<16); + } +} + +/******************************************************************************* +* Function Name : RCC_ClockSecuritySystemCmd +* Description : Enables or disables the Clock Security System. +* Input : NewState: ENABLE or DISABLE. +* Return : None +*******************************************************************************/ +void RCC_ClockSecuritySystemCmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->CTLR |= (1<<19); + } + else{ + RCC->CTLR &= ~(1<<19); + } +} + +/********************************************************************* + * @fn RCC_MCOConfig + * + * @brief Selects the clock source to output on MCO pin. + * + * @param RCC_MCO - specifies the clock source to output. + * RCC_MCO_NoClock - No clock selected. + * RCC_MCO_SYSCLK - System clock selected. + * RCC_MCO_HSI - HSI oscillator clock selected. + * RCC_MCO_HSE - HSE oscillator clock selected. + * RCC_MCO_PLLCLK_Div2 - PLL clock divided by 2 selected. + * + * @return none + */ +void RCC_MCOConfig(uint8_t RCC_MCO) +{ + *(__IO uint8_t *) CFGR0_BYTE4_ADDRESS = RCC_MCO; +} + +/********************************************************************* + * @fn RCC_GetFlagStatus + * + * @brief Checks whether the specified RCC flag is set or not. + * + * @param RCC_FLAG - specifies the flag to check. + * RCC_FLAG_HSIRDY - HSI oscillator clock ready. + * RCC_FLAG_HSERDY - HSE oscillator clock ready. + * RCC_FLAG_PLLRDY - PLL clock ready. + * RCC_FLAG_PLL2RDY - PLL2 clock ready. + * RCC_FLAG_PLL3RDY - PLL3 clock ready. + * RCC_FLAG_LSERDY - LSE oscillator clock ready. + * RCC_FLAG_LSIRDY - LSI oscillator clock ready. + * RCC_FLAG_PINRST - Pin reset. + * RCC_FLAG_PORRST - POR/PDR reset. + * RCC_FLAG_SFTRST - Software reset. + * RCC_FLAG_IWDGRST - Independent Watchdog reset. + * RCC_FLAG_WWDGRST - Window Watchdog reset. + * RCC_FLAG_LPWRRST - Low Power reset. + * + * @return FlagStatus - SET or RESET. + */ +FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) +{ + uint32_t tmp = 0; + uint32_t statusreg = 0; + + FlagStatus bitstatus = RESET; + tmp = RCC_FLAG >> 5; + + if (tmp == 1) + { + statusreg = RCC->CTLR; + } + else if (tmp == 2) + { + statusreg = RCC->BDCTLR; + } + else + { + statusreg = RCC->RSTSCKR; + } + + tmp = RCC_FLAG & FLAG_Mask; + + if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn RCC_ClearFlag + * + * @brief Clears the RCC reset flags. + * + * @return none + */ +void RCC_ClearFlag(void) +{ + RCC->RSTSCKR |= RSTSCKR_RMVF_Set; +} + +/********************************************************************* + * @fn RCC_GetITStatus + * + * @brief Checks whether the specified RCC interrupt has occurred or not. + * + * @param RCC_IT - specifies the RCC interrupt source to check. + * RCC_IT_LSIRDY - LSI ready interrupt. + * RCC_IT_LSERDY - LSE ready interrupt. + * RCC_IT_HSIRDY - HSI ready interrupt. + * RCC_IT_HSERDY - HSE ready interrupt. + * RCC_IT_PLLRDY - PLL ready interrupt. + * RCC_IT_PLL2RDY - PLL2 ready interrupt. + * RCC_IT_PLL3RDY - PLL3 ready interrupt. + * RCC_IT_CSS - Clock Security System interrupt. + * + * @return ITStatus - SET or RESET. + */ + +ITStatus RCC_GetITStatus(uint8_t RCC_IT) +{ + ITStatus bitstatus = RESET; + + if ((RCC->INTR & RCC_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn RCC_ClearITPendingBit + * + * @brief Clears the RCC's interrupt pending bits. + * + * @param RCC_IT - specifies the interrupt pending bit to clear. + * RCC_IT_LSIRDY - LSI ready interrupt. + * RCC_IT_LSERDY - LSE ready interrupt. + * RCC_IT_HSIRDY - HSI ready interrupt. + * RCC_IT_HSERDY - HSE ready interrupt. + * RCC_IT_PLLRDY - PLL ready interrupt. + * RCC_IT_PLL2RDY - PLL2 ready interrupt. + * RCC_IT_PLL3RDY - PLL3 ready interrupt. + * RCC_IT_CSS - Clock Security System interrupt. + * + * @return none + */ +void RCC_ClearITPendingBit(uint8_t RCC_IT) +{ + *(__IO uint8_t *) INTR_BYTE3_ADDRESS = RCC_IT; +} + +/********************************************************************* + * @fn RCC_ADCCLKADJcmd + * + * @brief Enable ADC clock duty cycle adjustment. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_ADCCLKADJcmd(FunctionalState NewState) +{ + if (NewState != DISABLE) + { + RCC->CFGR0 |= (1<<31); + } + else + { + RCC->CFGR0 &= ~(1<<31); + } +} + +/********************************************************************* + * @fn RCC_ETHDIVConfig + * + * @brief Configures the ETH clock. + * + * @param RCC_ETHPRE_Div - defines the USBHS clock divider. + * RCC_ETHCLK_Div1 - ETH clock = AHB/1. + * RCC_ETHCLK_Div2 - ETH clock = AHB/2. + * + * @return none + */ +void RCC_ETHDIVConfig(uint32_t RCC_ETHPRE_Div) +{ + RCC->CFGR0 &= ~((uint32_t)1<<28); + RCC->CFGR0 |= RCC_ETHPRE_Div<<28; +} + + + diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_rtc.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_rtc.c new file mode 100644 index 0000000000..816d48781f --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_rtc.c @@ -0,0 +1,373 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_rtc.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the RTC firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +#include "ch32v20x_rtc.h" + +/* RTC_Private_Defines */ +#define RTC_LSB_MASK ((uint32_t)0x0000FFFF) /* RTC LSB Mask */ +#define PRLH_MSB_MASK ((uint32_t)0x000F0000) /* RTC Prescaler MSB Mask */ + +/********************************************************************* + * @fn RTC_ITConfig + * + * @brief Enables or disables the specified RTC interrupts. + * + * @param RTC_IT - specifies the RTC interrupts sources to be enabled or disabled. + * RTC_IT_OW - Overflow interrupt + * RTC_IT_ALR - Alarm interrupt + * RTC_IT_SEC - Second interrupt + * + * @return NewState - new state of the specified RTC interrupts(ENABLE or DISABLE). + */ +void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + RTC->CTLRH |= RTC_IT; + } + else + { + RTC->CTLRH &= (uint16_t)~RTC_IT; + } +} + +/********************************************************************* + * @fn RTC_EnterConfigMode + * + * @brief Enters the RTC configuration mode. + * + * @return none + */ +void RTC_EnterConfigMode(void) +{ + RTC->CTLRL |= RTC_CTLRL_CNF; +} + +/********************************************************************* + * @fn RTC_ExitConfigMode + * + * @brief Exits from the RTC configuration mode. + * + * @return none + */ +void RTC_ExitConfigMode(void) +{ + RTC->CTLRL &= (uint16_t) ~((uint16_t)RTC_CTLRL_CNF); +} + +/********************************************************************* + * @fn RTC_GetCounter + * + * @brief Gets the RTC counter value + * + * @return RTC counter value + */ +uint32_t RTC_GetCounter(void) +{ + uint16_t high1 = 0, high2 = 0, low = 0; + + high1 = RTC->CNTH; + low = RTC->CNTL; + high2 = RTC->CNTH; + + if(high1 != high2) + { + return (((uint32_t)high2 << 16) | RTC->CNTL); + } + else + { + return (((uint32_t)high1 << 16) | low); + } +} + +/********************************************************************* + * @fn RTC_SetCounter + * + * @brief Sets the RTC counter value. + * + * @param CounterValue - RTC counter new value. + * + * @return RTC counter value + */ +void RTC_SetCounter(uint32_t CounterValue) +{ + RTC_EnterConfigMode(); + RTC->CNTH = CounterValue >> 16; + RTC->CNTL = (CounterValue & RTC_LSB_MASK); + RTC_ExitConfigMode(); +} + +/********************************************************************* + * @fn RTC_SetPrescaler + * + * @brief Sets the RTC prescaler value + * + * @param PrescalerValue - RTC prescaler new value + * + * @return none + */ +void RTC_SetPrescaler(uint32_t PrescalerValue) +{ + RTC_EnterConfigMode(); + RTC->PSCRH = (PrescalerValue & PRLH_MSB_MASK) >> 16; + RTC->PSCRL = (PrescalerValue & RTC_LSB_MASK); + RTC_ExitConfigMode(); +} + +/********************************************************************* + * @fn RTC_SetAlarm + * + * @brief Sets the RTC alarm value + * + * @param AlarmValue - RTC alarm new value + * + * @return none + */ +void RTC_SetAlarm(uint32_t AlarmValue) +{ + RTC_EnterConfigMode(); + RTC->ALRMH = AlarmValue >> 16; + RTC->ALRML = (AlarmValue & RTC_LSB_MASK); + RTC_ExitConfigMode(); +} + +/********************************************************************* + * @fn RTC_GetDivider + * + * @brief Gets the RTC divider value + * + * @return RTC Divider value + */ +uint32_t RTC_GetDivider(void) +{ + uint32_t tmp = 0x00; + tmp = ((uint32_t)RTC->DIVH & (uint32_t)0x000F) << 16; + tmp |= RTC->DIVL; + return tmp; +} + +/********************************************************************* + * @fn RTC_WaitForLastTask + * + * @brief Waits until last write operation on RTC registers has finished + * + * @return none + */ +void RTC_WaitForLastTask(void) +{ + while((RTC->CTLRL & RTC_FLAG_RTOFF) == (uint16_t)RESET) + { + } +} + +/********************************************************************* + * @fn RTC_WaitForSynchro + * + * @brief Waits until the RTC registers are synchronized with RTC APB clock + * + * @return none + */ +void RTC_WaitForSynchro(void) +{ + RTC->CTLRL &= (uint16_t)~RTC_FLAG_RSF; + while((RTC->CTLRL & RTC_FLAG_RSF) == (uint16_t)RESET) + { + } +} + +/********************************************************************* + * @fn RTC_GetFlagStatus + * + * @brief Checks whether the specified RTC flag is set or not + * + * @param RTC_FLAG- specifies the flag to check + * RTC_FLAG_RTOFF - RTC Operation OFF flag + * RTC_FLAG_RSF - Registers Synchronized flag + * RTC_FLAG_OW - Overflow flag + * RTC_FLAG_ALR - Alarm flag + * RTC_FLAG_SEC - Second flag + * + * @return none + */ +FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG) +{ + FlagStatus bitstatus = RESET; + if((RTC->CTLRL & RTC_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn RTC_ClearFlag + * + * @brief Clears the RTC's pending flags + * + * @param RTC_FLAG - specifies the flag to clear + * RTC_FLAG_RSF - Registers Synchronized flag + * RTC_FLAG_OW - Overflow flag + * RTC_FLAG_ALR - Alarm flag + * RTC_FLAG_SEC - Second flag + * + * @return none + */ +void RTC_ClearFlag(uint16_t RTC_FLAG) +{ + RTC->CTLRL &= (uint16_t)~RTC_FLAG; +} + +/********************************************************************* + * @fn RTC_GetITStatus + * + * @brief Checks whether the specified RTC interrupt has occurred or not + * + * @param RTC_IT - specifies the RTC interrupts sources to check + * RTC_FLAG_OW - Overflow interrupt + * RTC_FLAG_ALR - Alarm interrupt + * RTC_FLAG_SEC - Second interrupt + * + * @return The new state of the RTC_IT (SET or RESET) + */ +ITStatus RTC_GetITStatus(uint16_t RTC_IT) +{ + ITStatus bitstatus = RESET; + + bitstatus = (ITStatus)(RTC->CTLRL & RTC_IT); + if(((RTC->CTLRH & RTC_IT) != (uint16_t)RESET) && (bitstatus != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn RTC_ClearITPendingBit + * + * @brief Clears the RTC's interrupt pending bits + * + * @param RTC_IT - specifies the interrupt pending bit to clear + * RTC_FLAG_OW - Overflow interrupt + * RTC_FLAG_ALR - Alarm interrupt + * RTC_FLAG_SEC - Second interrupt + * + * @return none + */ +void RTC_ClearITPendingBit(uint16_t RTC_IT) +{ + RTC->CTLRL &= (uint16_t)~RTC_IT; +} + +#if defined(CH32V20x_D8) || defined(CH32V20x_D8W) +/******************************************************************************* + * @fn Calibration_LSI + * + * @brief LSI calibration + * + * @param cali_Lv : calibration level + * Level_32 - 1.2ms 1100ppm + * Level_64 - 2.2ms 1000ppm + * Level_128 - 4.2ms 800ppm + * + * @return None + */ +void Calibration_LSI(Cali_LevelTypeDef cali_Lv) +{ + uint32_t i; + int32_t cnt_offset; + int32_t Freq = 0; + uint8_t retry = 0; + uint32_t cnt_32k = 0; + Freq = SystemCoreClock; + // Coarse tuning + OSC->LSI32K_CAL_CFG &= ~RB_OSC_CNT_VLU; + OSC->LSI32K_CAL_CFG |= 0; + while(1) + { + OSC->LSI32K_CAL_CTRL |= RB_OSC_CAL_EN; + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_CNT_OV; + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_IF_END; + while(!(OSC->LSI32K_CAL_STATR & RB_OSC_CAL_IF_END)); + i = OSC->LSI32K_CAL_STATR; + OSC->LSI32K_CAL_CTRL &= ~RB_OSC_CAL_EN; + OSC->LSI32K_CAL_CTRL |= RB_OSC_CAL_EN; + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_CNT_OV; + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_IF_END; + cnt_32k = RTC_GetCounter(); + while(RTC_GetCounter() == cnt_32k); + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_CNT_OV; + while(OSC->LSI32K_CAL_STATR & RB_OSC_CAL_IF_END); + while(!(OSC->LSI32K_CAL_STATR & RB_OSC_CAL_IF_END)); + i = OSC->LSI32K_CAL_STATR; + cnt_offset = (i & 0x3FFF) + OSC->LSI32K_CAL_OV_CNT * 0x3FFF - 2000 * (Freq / 1000) / CAB_LSIFQ; + if(((cnt_offset > -(20 * (Freq / 1000) / 36000)) && (cnt_offset < (20 * (Freq / 1000) / 36000))) || retry > 2) + break; + retry++; + cnt_offset = (cnt_offset > 0) ? (((cnt_offset * 2) / (40 * (Freq / 1000) / 36000)) + 1) / 2 : (((cnt_offset * 2) / (40 * (Freq / 1000) / 36000)) - 1) / 2; + OSC->LSI32K_TUNE += cnt_offset; + } + OSC->LSI32K_CAL_CFG &= ~RB_OSC_CNT_VLU; + OSC->LSI32K_CAL_CFG |= 2; + OSC->LSI32K_CAL_CTRL &= ~RB_OSC_CAL_EN; + OSC->LSI32K_CAL_CTRL |= RB_OSC_CAL_EN; + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_IF_END; + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_CNT_OV; + + // Fine tuning + // After configuring the fine-tuning parameters, discard the two captured values (software behavior) and judge once, only one time is left here + while(!(OSC->LSI32K_CAL_STATR & RB_OSC_CAL_IF_END)); + i = OSC->LSI32K_CAL_STATR; + OSC->LSI32K_CAL_CTRL &= ~RB_OSC_CAL_EN; + OSC->LSI32K_CAL_CTRL |= RB_OSC_CAL_EN; + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_IF_END; + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_CNT_OV; + cnt_32k = RTC_GetCounter(); + while(RTC_GetCounter() == cnt_32k); + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_CNT_OV; + while(OSC->LSI32K_CAL_STATR & RB_OSC_CAL_IF_END); + while(!(OSC->LSI32K_CAL_STATR & RB_OSC_CAL_IF_END)); + i = OSC->LSI32K_CAL_STATR; + cnt_offset = (i & 0x3FFF) + OSC->LSI32K_CAL_OV_CNT * 0x3FFF - 8000 * (1 << 2) * (Freq / 1000000) / 256 * 1000 / (CAB_LSIFQ / 256); + cnt_offset = (cnt_offset > 0) ? ((((cnt_offset * 2 * 100) / (748 * ((1 << 2) / 4) * (Freq / 1000) / 36000)) + 1) / 2) << 5 : ((((cnt_offset * 2 * 100) / (748 * ((1 << 2) / 4) * (Freq / 1000) / 36000)) - 1) / 2) << 5; + OSC->LSI32K_TUNE += cnt_offset; + OSC->LSI32K_CAL_CFG &= ~RB_OSC_CNT_VLU; + OSC->LSI32K_CAL_CFG |= cali_Lv; + OSC->LSI32K_CAL_CTRL &= ~RB_OSC_CAL_EN; + OSC->LSI32K_CAL_CTRL |= RB_OSC_CAL_EN; + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_IF_END; + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_CNT_OV; + // Fine tuning + // After configuring the fine-tuning parameters, discard the two captured values (software behavior) and judge once, only one time is left here + while(!(OSC->LSI32K_CAL_STATR & RB_OSC_CAL_IF_END)); + i = OSC->LSI32K_CAL_STATR; + OSC->LSI32K_CAL_CTRL &= ~RB_OSC_CAL_EN; + OSC->LSI32K_CAL_CTRL |= RB_OSC_CAL_EN; + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_IF_END; + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_CNT_OV; + cnt_32k = RTC_GetCounter(); + while(RTC_GetCounter() == cnt_32k); + OSC->LSI32K_CAL_STATR |= RB_OSC_CAL_CNT_OV; + while(OSC->LSI32K_CAL_STATR & RB_OSC_CAL_IF_END); + while(!(OSC->LSI32K_CAL_STATR & RB_OSC_CAL_IF_END)); + OSC->LSI32K_CAL_CTRL &= ~RB_OSC_CAL_EN; + i = OSC->LSI32K_CAL_STATR; + cnt_offset = (i & 0x3FFF) + OSC->LSI32K_CAL_OV_CNT * 0x3FFF - 8000 * (1 << cali_Lv) * (Freq / 1000000) / 256 * 1000 / (CAB_LSIFQ / 256); + cnt_offset = (cnt_offset > 0) ? ((((cnt_offset * 2 * 100) / (748 * ((1 << cali_Lv) / 4) * (Freq / 1000) / 36000)) + 1) / 2) << 5 : ((((cnt_offset * 2 * 100) / (748 * ((1 << cali_Lv) / 4) * (Freq / 1000) / 36000)) - 1) / 2) << 5; + OSC->LSI32K_TUNE += cnt_offset; +} + +#endif diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_spi.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_spi.c new file mode 100644 index 0000000000..1f3f3f0b99 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_spi.c @@ -0,0 +1,638 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_spi.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the SPI firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *********************************************************************************/ +#include "ch32v20x_spi.h" +#include "ch32v20x_rcc.h" + +/* SPI SPE mask */ +#define CTLR1_SPE_Set ((uint16_t)0x0040) +#define CTLR1_SPE_Reset ((uint16_t)0xFFBF) + +/* I2S I2SE mask */ +#define I2SCFGR_I2SE_Set ((uint16_t)0x0400) +#define I2SCFGR_I2SE_Reset ((uint16_t)0xFBFF) + +/* SPI CRCNext mask */ +#define CTLR1_CRCNext_Set ((uint16_t)0x1000) + +/* SPI CRCEN mask */ +#define CTLR1_CRCEN_Set ((uint16_t)0x2000) +#define CTLR1_CRCEN_Reset ((uint16_t)0xDFFF) + +/* SPI SSOE mask */ +#define CTLR2_SSOE_Set ((uint16_t)0x0004) +#define CTLR2_SSOE_Reset ((uint16_t)0xFFFB) + +/* SPI registers Masks */ +#define CTLR1_CLEAR_Mask ((uint16_t)0x3040) +#define I2SCFGR_CLEAR_Mask ((uint16_t)0xF040) + +/* SPI or I2S mode selection masks */ +#define SPI_Mode_Select ((uint16_t)0xF7FF) +#define I2S_Mode_Select ((uint16_t)0x0800) + +/* I2S clock source selection masks */ +#define I2S2_CLOCK_SRC ((uint32_t)(0x00020000)) +#define I2S3_CLOCK_SRC ((uint32_t)(0x00040000)) +#define I2S_MUL_MASK ((uint32_t)(0x0000F000)) +#define I2S_DIV_MASK ((uint32_t)(0x000000F0)) + +/********************************************************************* + * @fn SPI_I2S_DeInit + * + * @brief Deinitializes the SPIx peripheral registers to their default + * reset values (Affects also the I2Ss). + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * + * @return none + */ +void SPI_I2S_DeInit(SPI_TypeDef *SPIx) +{ + if(SPIx == SPI1) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE); + } + else if(SPIx == SPI2) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE); + } +} + +/********************************************************************* + * @fn SPI_Init + * + * @brief Initializes the SPIx peripheral according to the specified + * parameters in the SPI_InitStruct. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * SPI_InitStruct - pointer to a SPI_InitTypeDef structure that + * contains the configuration information for the specified SPI peripheral. + * + * @return none + */ +void SPI_Init(SPI_TypeDef *SPIx, SPI_InitTypeDef *SPI_InitStruct) +{ + uint16_t tmpreg = 0; + + tmpreg = SPIx->CTLR1; + tmpreg &= CTLR1_CLEAR_Mask; + tmpreg |= (uint16_t)((uint32_t)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_Mode | + SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL | + SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS | + SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit); + + SPIx->CTLR1 = tmpreg; + SPIx->I2SCFGR &= SPI_Mode_Select; + SPIx->CRCR = SPI_InitStruct->SPI_CRCPolynomial; +} + +/********************************************************************* + * @fn I2S_Init + * + * @brief Initializes the SPIx peripheral according to the specified + * parameters in the I2S_InitStruct. + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * (configured in I2S mode). + * I2S_InitStruct - pointer to an I2S_InitTypeDef structure that + * contains the configuration information for the specified SPI peripheral + * configured in I2S mode. + * @return none + */ +void I2S_Init(SPI_TypeDef *SPIx, I2S_InitTypeDef *I2S_InitStruct) +{ + uint16_t tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1; + uint32_t tmp = 0; + RCC_ClocksTypeDef RCC_Clocks; + uint32_t sourceclock = 0; + + SPIx->I2SCFGR &= I2SCFGR_CLEAR_Mask; + SPIx->I2SPR = 0x0002; + tmpreg = SPIx->I2SCFGR; + + if(I2S_InitStruct->I2S_AudioFreq == I2S_AudioFreq_Default) + { + i2sodd = (uint16_t)0; + i2sdiv = (uint16_t)2; + } + else + { + if(I2S_InitStruct->I2S_DataFormat == I2S_DataFormat_16b) + { + packetlength = 1; + } + else + { + packetlength = 2; + } + + if(((uint32_t)SPIx) == SPI2_BASE) + { + tmp = I2S2_CLOCK_SRC; + } + else + { + tmp = I2S3_CLOCK_SRC; + } + + RCC_GetClocksFreq(&RCC_Clocks); + + sourceclock = RCC_Clocks.SYSCLK_Frequency; + + if(I2S_InitStruct->I2S_MCLKOutput == I2S_MCLKOutput_Enable) + { + tmp = (uint16_t)(((((sourceclock / 256) * 10) / I2S_InitStruct->I2S_AudioFreq)) + 5); + } + else + { + tmp = (uint16_t)(((((sourceclock / (32 * packetlength)) * 10) / I2S_InitStruct->I2S_AudioFreq)) + 5); + } + + tmp = tmp / 10; + i2sodd = (uint16_t)(tmp & (uint16_t)0x0001); + i2sdiv = (uint16_t)((tmp - i2sodd) / 2); + i2sodd = (uint16_t)(i2sodd << 8); + } + + if((i2sdiv < 2) || (i2sdiv > 0xFF)) + { + i2sdiv = 2; + i2sodd = 0; + } + + SPIx->I2SPR = (uint16_t)(i2sdiv | (uint16_t)(i2sodd | (uint16_t)I2S_InitStruct->I2S_MCLKOutput)); + tmpreg |= (uint16_t)(I2S_Mode_Select | (uint16_t)(I2S_InitStruct->I2S_Mode | + (uint16_t)(I2S_InitStruct->I2S_Standard | (uint16_t)(I2S_InitStruct->I2S_DataFormat | + (uint16_t)I2S_InitStruct->I2S_CPOL)))); + SPIx->I2SCFGR = tmpreg; +} + +/********************************************************************* + * @fn SPI_StructInit + * + * @brief Fills each SPI_InitStruct member with its default value. + * + * @param SPI_InitStruct - pointer to a SPI_InitTypeDef structure which + * will be initialized. + * + * @return none + */ +void SPI_StructInit(SPI_InitTypeDef *SPI_InitStruct) +{ + SPI_InitStruct->SPI_Direction = SPI_Direction_2Lines_FullDuplex; + SPI_InitStruct->SPI_Mode = SPI_Mode_Slave; + SPI_InitStruct->SPI_DataSize = SPI_DataSize_8b; + SPI_InitStruct->SPI_CPOL = SPI_CPOL_Low; + SPI_InitStruct->SPI_CPHA = SPI_CPHA_1Edge; + SPI_InitStruct->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; + SPI_InitStruct->SPI_FirstBit = SPI_FirstBit_MSB; + SPI_InitStruct->SPI_CRCPolynomial = 7; +} + +/********************************************************************* + * @fn I2S_StructInit + * + * @brief Fills each I2S_InitStruct member with its default value. + * + * @param I2S_InitStruct - pointer to a I2S_InitTypeDef structure which + * will be initialized. + * + * @return none + */ +void I2S_StructInit(I2S_InitTypeDef *I2S_InitStruct) +{ + I2S_InitStruct->I2S_Mode = I2S_Mode_SlaveTx; + I2S_InitStruct->I2S_Standard = I2S_Standard_Phillips; + I2S_InitStruct->I2S_DataFormat = I2S_DataFormat_16b; + I2S_InitStruct->I2S_MCLKOutput = I2S_MCLKOutput_Disable; + I2S_InitStruct->I2S_AudioFreq = I2S_AudioFreq_Default; + I2S_InitStruct->I2S_CPOL = I2S_CPOL_Low; +} + +/********************************************************************* + * @fn SPI_Cmd + * + * @brief Enables or disables the specified SPI peripheral. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void SPI_Cmd(SPI_TypeDef *SPIx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + SPIx->CTLR1 |= CTLR1_SPE_Set; + } + else + { + SPIx->CTLR1 &= CTLR1_SPE_Reset; + } +} + +/********************************************************************* + * @fn I2S_Cmd + * + * @brief Enables or disables the specified SPI peripheral (in I2S mode). + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2S_Cmd(SPI_TypeDef *SPIx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + SPIx->I2SCFGR |= I2SCFGR_I2SE_Set; + } + else + { + SPIx->I2SCFGR &= I2SCFGR_I2SE_Reset; + } +} + +/********************************************************************* + * @fn SPI_I2S_ITConfig + * + * @brief Enables or disables the specified SPI/I2S interrupts. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * SPI_I2S_IT - specifies the SPI/I2S interrupt source to be + * enabled or disabled. + * SPI_I2S_IT_TXE - Tx buffer empty interrupt mask. + * SPI_I2S_IT_RXNE - Rx buffer not empty interrupt mask. + * SPI_I2S_IT_ERR - Error interrupt mask. + * NewState: ENABLE or DISABLE. + * @return none + */ +void SPI_I2S_ITConfig(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState) +{ + uint16_t itpos = 0, itmask = 0; + + itpos = SPI_I2S_IT >> 4; + itmask = (uint16_t)1 << (uint16_t)itpos; + + if(NewState != DISABLE) + { + SPIx->CTLR2 |= itmask; + } + else + { + SPIx->CTLR2 &= (uint16_t)~itmask; + } +} + +/********************************************************************* + * @fn SPI_I2S_DMACmd + * + * @brief Enables or disables the SPIx/I2Sx DMA interface. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * SPI_I2S_DMAReq - specifies the SPI/I2S DMA transfer request to + * be enabled or disabled. + * SPI_I2S_DMAReq_Tx - Tx buffer DMA transfer request. + * SPI_I2S_DMAReq_Rx - Rx buffer DMA transfer request. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void SPI_I2S_DMACmd(SPI_TypeDef *SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + SPIx->CTLR2 |= SPI_I2S_DMAReq; + } + else + { + SPIx->CTLR2 &= (uint16_t)~SPI_I2S_DMAReq; + } +} + +/********************************************************************* + * @fn SPI_I2S_SendData + * + * @brief Transmits a Data through the SPIx/I2Sx peripheral. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * Data - Data to be transmitted. + * + * @return none + */ +void SPI_I2S_SendData(SPI_TypeDef *SPIx, uint16_t Data) +{ + SPIx->DATAR = Data; +} + +/********************************************************************* + * @fn SPI_I2S_ReceiveData + * + * @brief Returns the most recent received data by the SPIx/I2Sx peripheral. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * Data - Data to be transmitted. + * + * @return SPIx->DATAR - The value of the received data. + */ +uint16_t SPI_I2S_ReceiveData(SPI_TypeDef *SPIx) +{ + return SPIx->DATAR; +} + +/********************************************************************* + * @fn SPI_NSSInternalSoftwareConfig + * + * @brief Configures internally by software the NSS pin for the selected SPI. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * SPI_NSSInternalSoft - + * SPI_NSSInternalSoft_Set - Set NSS pin internally. + * SPI_NSSInternalSoft_Reset - Reset NSS pin internally. + * + * @return none + */ +void SPI_NSSInternalSoftwareConfig(SPI_TypeDef *SPIx, uint16_t SPI_NSSInternalSoft) +{ + if(SPI_NSSInternalSoft != SPI_NSSInternalSoft_Reset) + { + SPIx->CTLR1 |= SPI_NSSInternalSoft_Set; + } + else + { + SPIx->CTLR1 &= SPI_NSSInternalSoft_Reset; + } +} + +/********************************************************************* + * @fn SPI_SSOutputCmd + * + * @brief Enables or disables the SS output for the selected SPI. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * NewState - new state of the SPIx SS output. + * + * @return none + */ +void SPI_SSOutputCmd(SPI_TypeDef *SPIx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + SPIx->CTLR2 |= CTLR2_SSOE_Set; + } + else + { + SPIx->CTLR2 &= CTLR2_SSOE_Reset; + } +} + +/********************************************************************* + * @fn SPI_DataSizeConfig + * + * @brief Configures the data size for the selected SPI. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * SPI_DataSize - specifies the SPI data size. + * SPI_DataSize_16b - Set data frame format to 16bit. + * SPI_DataSize_8b - Set data frame format to 8bit. + * + * @return none + */ +void SPI_DataSizeConfig(SPI_TypeDef *SPIx, uint16_t SPI_DataSize) +{ + SPIx->CTLR1 &= (uint16_t)~SPI_DataSize_16b; + SPIx->CTLR1 |= SPI_DataSize; +} + +/********************************************************************* + * @fn SPI_TransmitCRC + * + * @brief Transmit the SPIx CRC value. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * + * @return none + */ +void SPI_TransmitCRC(SPI_TypeDef *SPIx) +{ + SPIx->CTLR1 |= CTLR1_CRCNext_Set; +} + +/********************************************************************* + * @fn SPI_CalculateCRC + * + * @brief Enables or disables the CRC value calculation of the transferred bytes. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * NewState - new state of the SPIx CRC value calculation. + * + * @return none + */ +void SPI_CalculateCRC(SPI_TypeDef *SPIx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + SPIx->CTLR1 |= CTLR1_CRCEN_Set; + } + else + { + SPIx->CTLR1 &= CTLR1_CRCEN_Reset; + } +} + +/********************************************************************* + * @fn SPI_GetCRC + * + * @brief Returns the transmit or the receive CRC register value for the specified SPI. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * SPI_CRC - specifies the CRC register to be read. + * SPI_CRC_Tx - Selects Tx CRC register. + * SPI_CRC_Rx - Selects Rx CRC register. + * + * @return crcreg: The selected CRC register value. + */ +uint16_t SPI_GetCRC(SPI_TypeDef *SPIx, uint8_t SPI_CRC) +{ + uint16_t crcreg = 0; + + if(SPI_CRC != SPI_CRC_Rx) + { + crcreg = SPIx->TCRCR; + } + else + { + crcreg = SPIx->RCRCR; + } + + return crcreg; +} + +/********************************************************************* + * @fn SPI_GetCRCPolynomial + * + * @brief Returns the CRC Polynomial register value for the specified SPI. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * + * @return SPIx->CRCR - The CRC Polynomial register value. + */ +uint16_t SPI_GetCRCPolynomial(SPI_TypeDef *SPIx) +{ + return SPIx->CRCR; +} + +/********************************************************************* + * @fn SPI_BiDirectionalLineConfig + * + * @brief Selects the data transfer direction in bi-directional mode + * for the specified SPI. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * SPI_Direction - specifies the data transfer direction in + * bi-directional mode. + * SPI_Direction_Tx - Selects Tx transmission direction. + * SPI_Direction_Rx - Selects Rx receive direction. + * + * @return none + */ +void SPI_BiDirectionalLineConfig(SPI_TypeDef *SPIx, uint16_t SPI_Direction) +{ + if(SPI_Direction == SPI_Direction_Tx) + { + SPIx->CTLR1 |= SPI_Direction_Tx; + } + else + { + SPIx->CTLR1 &= SPI_Direction_Rx; + } +} + +/********************************************************************* + * @fn SPI_I2S_GetFlagStatus + * + * @brief Checks whether the specified SPI/I2S flag is set or not. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * SPI_I2S_FLAG - specifies the SPI/I2S flag to check. + * SPI_I2S_FLAG_TXE - Transmit buffer empty flag. + * SPI_I2S_FLAG_RXNE - Receive buffer not empty flag. + * SPI_I2S_FLAG_BSY - Busy flag. + * SPI_I2S_FLAG_OVR - Overrun flag. + * SPI_FLAG_MODF - Mode Fault flag. + * SPI_FLAG_CRCERR - CRC Error flag. + * I2S_FLAG_UDR - Underrun Error flag. + * I2S_FLAG_CHSIDE - Channel Side flag. + * + * @return none + */ +FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef *SPIx, uint16_t SPI_I2S_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((SPIx->STATR & SPI_I2S_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn SPI_I2S_ClearFlag + * + * @brief Clears the SPIx CRC Error (CRCERR) flag. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * SPI_I2S_FLAG - specifies the SPI flag to clear. + * SPI_FLAG_CRCERR - CRC Error flag. + * + * @return none + */ +void SPI_I2S_ClearFlag(SPI_TypeDef *SPIx, uint16_t SPI_I2S_FLAG) +{ + SPIx->STATR = (uint16_t)~SPI_I2S_FLAG; +} + +/********************************************************************* + * @fn SPI_I2S_GetITStatus + * + * @brief Checks whether the specified SPI/I2S interrupt has occurred or not. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * SPI_I2S_IT - specifies the SPI/I2S interrupt source to check.. + * SPI_I2S_IT_TXE - Transmit buffer empty interrupt. + * SPI_I2S_IT_RXNE - Receive buffer not empty interrupt. + * SPI_I2S_IT_OVR - Overrun interrupt. + * SPI_IT_MODF - Mode Fault interrupt. + * SPI_IT_CRCERR - CRC Error interrupt. + * I2S_IT_UDR - Underrun Error interrupt. + * + * @return FlagStatus: SET or RESET. + */ +ITStatus SPI_I2S_GetITStatus(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT) +{ + ITStatus bitstatus = RESET; + uint16_t itpos = 0, itmask = 0, enablestatus = 0; + + itpos = 0x01 << (SPI_I2S_IT & 0x0F); + itmask = SPI_I2S_IT >> 4; + itmask = 0x01 << itmask; + enablestatus = (SPIx->CTLR2 & itmask); + + if(((SPIx->STATR & itpos) != (uint16_t)RESET) && enablestatus) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn SPI_I2S_ClearITPendingBit + * + * @brief Clears the SPIx CRC Error (CRCERR) interrupt pending bit. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * SPI_I2S_IT - specifies the SPI interrupt pending bit to clear. + * SPI_IT_CRCERR - CRC Error interrupt. + * + * @return none + */ +void SPI_I2S_ClearITPendingBit(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT) +{ + uint16_t itpos = 0; + + itpos = 0x01 << (SPI_I2S_IT & 0x0F); + SPIx->STATR = (uint16_t)~itpos; +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_tim.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_tim.c new file mode 100644 index 0000000000..523bac5b4f --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_tim.c @@ -0,0 +1,2351 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_tim.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the TIM firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#include "ch32v20x_tim.h" +#include "ch32v20x_rcc.h" + +/* TIM registers bit mask */ +#define SMCFGR_ETR_Mask ((uint16_t)0x00FF) +#define CHCTLR_Offset ((uint16_t)0x0018) +#define CCER_CCE_Set ((uint16_t)0x0001) +#define CCER_CCNE_Set ((uint16_t)0x0004) + +static void TI1_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI2_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI3_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI4_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); + +/********************************************************************* + * @fn TIM_DeInit + * + * @brief Deinitializes the TIMx peripheral registers to their default + * reset values. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * + * @return none + */ +void TIM_DeInit(TIM_TypeDef *TIMx) +{ + if(TIMx == TIM1) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE); + } + else if(TIMx == TIM2) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE); + } + else if(TIMx == TIM3) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE); + } + else if(TIMx == TIM4) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE); + } + else if(TIMx == TIM5) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE); + } +} + +/********************************************************************* + * @fn TIM_TimeBaseInit + * + * @brief Initializes the TIMx Time Base Unit peripheral according to + * the specified parameters in the TIM_TimeBaseInitStruct. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_TimeBaseInitStruct - pointer to a TIM_TimeBaseInitTypeDef + * structure. + * + * @return none + */ +void TIM_TimeBaseInit(TIM_TypeDef *TIMx, TIM_TimeBaseInitTypeDef *TIM_TimeBaseInitStruct) +{ + uint16_t tmpcr1 = 0; + + tmpcr1 = TIMx->CTLR1; + + if((TIMx == TIM1) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4) || (TIMx == TIM5)) + { + tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_DIR | TIM_CMS))); + tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode; + } + + tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CTLR1_CKD)); + tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision; + + TIMx->CTLR1 = tmpcr1; + TIMx->ATRLR = TIM_TimeBaseInitStruct->TIM_Period; + TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler; + + if((TIMx == TIM1)) + { + TIMx->RPTCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter; + } + + TIMx->SWEVGR = TIM_PSCReloadMode_Immediate; +} + +/********************************************************************* + * @fn TIM_OC1Init + * + * @brief Initializes the TIMx Channel1 according to the specified + * parameters in the TIM_OCInitStruct. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure. + * + * @return none + */ +void TIM_OC1Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + TIMx->CCER &= (uint16_t)(~(uint16_t)TIM_CC1E); + tmpccer = TIMx->CCER; + tmpcr2 = TIMx->CTLR2; + tmpccmrx = TIMx->CHCTLR1; + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_OC1M)); + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CC1S)); + tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC1P)); + tmpccer |= TIM_OCInitStruct->TIM_OCPolarity; + tmpccer |= TIM_OCInitStruct->TIM_OutputState; + + if((TIMx == TIM1)) + { + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC1NP)); + tmpccer |= TIM_OCInitStruct->TIM_OCNPolarity; + + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC1NE)); + tmpccer |= TIM_OCInitStruct->TIM_OutputNState; + + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS1)); + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS1N)); + + tmpcr2 |= TIM_OCInitStruct->TIM_OCIdleState; + tmpcr2 |= TIM_OCInitStruct->TIM_OCNIdleState; + } + + TIMx->CTLR2 = tmpcr2; + TIMx->CHCTLR1 = tmpccmrx; + TIMx->CH1CVR = TIM_OCInitStruct->TIM_Pulse; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC2Init + * + * @brief Initializes the TIMx Channel2 according to the specified + * parameters in the TIM_OCInitStruct. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure. + * + * @return none + */ +void TIM_OC2Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CC2E)); + tmpccer = TIMx->CCER; + tmpcr2 = TIMx->CTLR2; + tmpccmrx = TIMx->CHCTLR1; + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_OC2M)); + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CC2S)); + tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC2P)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 4); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 4); + + if((TIMx == TIM1)) + { + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC2NP)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 4); + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC2NE)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 4); + + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS2)); + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS2N)); + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 2); + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 2); + } + + TIMx->CTLR2 = tmpcr2; + TIMx->CHCTLR1 = tmpccmrx; + TIMx->CH2CVR = TIM_OCInitStruct->TIM_Pulse; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC3Init + * + * @brief Initializes the TIMx Channel3 according to the specified + * parameters in the TIM_OCInitStruct. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure. + * + * @return none + */ +void TIM_OC3Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CC3E)); + tmpccer = TIMx->CCER; + tmpcr2 = TIMx->CTLR2; + tmpccmrx = TIMx->CHCTLR2; + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_OC3M)); + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CC3S)); + tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC3P)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 8); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 8); + + if((TIMx == TIM1)) + { + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC3NP)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 8); + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC3NE)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 8); + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS3)); + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS3N)); + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 4); + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 4); + } + + TIMx->CTLR2 = tmpcr2; + TIMx->CHCTLR2 = tmpccmrx; + TIMx->CH3CVR = TIM_OCInitStruct->TIM_Pulse; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC4Init + * + * @brief Initializes the TIMx Channel4 according to the specified + * parameters in the TIM_OCInitStruct. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure. + * + * @return none + */ +void TIM_OC4Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CC4E)); + tmpccer = TIMx->CCER; + tmpcr2 = TIMx->CTLR2; + tmpccmrx = TIMx->CHCTLR2; + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_OC4M)); + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CC4S)); + tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC4P)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 12); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 12); + + if((TIMx == TIM1)) + { + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS4)); + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 6); + } + + TIMx->CTLR2 = tmpcr2; + TIMx->CHCTLR2 = tmpccmrx; + TIMx->CH4CVR = TIM_OCInitStruct->TIM_Pulse; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_ICInit + * + * @brief IInitializes the TIM peripheral according to the specified + * parameters in the TIM_ICInitStruct. + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_ICInitStruct - pointer to a TIM_ICInitTypeDef structure. + * + * @return none + */ +void TIM_ICInit(TIM_TypeDef *TIMx, TIM_ICInitTypeDef *TIM_ICInitStruct) +{ + if(TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) + { + TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else if(TIM_ICInitStruct->TIM_Channel == TIM_Channel_2) + { + TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else if(TIM_ICInitStruct->TIM_Channel == TIM_Channel_3) + { + TI3_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC3Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else + { + TI4_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC4Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } +} + +/********************************************************************* + * @fn TIM_PWMIConfig + * + * @brief Configures the TIM peripheral according to the specified + * parameters in the TIM_ICInitStruct to measure an external + * PWM signal. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_ICInitStruct - pointer to a TIM_ICInitTypeDef structure. + * + * @return none + */ +void TIM_PWMIConfig(TIM_TypeDef *TIMx, TIM_ICInitTypeDef *TIM_ICInitStruct) +{ + uint16_t icoppositepolarity = TIM_ICPolarity_Rising; + uint16_t icoppositeselection = TIM_ICSelection_DirectTI; + + if(TIM_ICInitStruct->TIM_ICPolarity == TIM_ICPolarity_Rising) + { + icoppositepolarity = TIM_ICPolarity_Falling; + } + else + { + icoppositepolarity = TIM_ICPolarity_Rising; + } + + if(TIM_ICInitStruct->TIM_ICSelection == TIM_ICSelection_DirectTI) + { + icoppositeselection = TIM_ICSelection_IndirectTI; + } + else + { + icoppositeselection = TIM_ICSelection_DirectTI; + } + + if(TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) + { + TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + TI2_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else + { + TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + TI1_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } +} + +/********************************************************************* + * @fn TIM_BDTRConfig + * + * @brief Configures the: Break feature, dead time, Lock level, the OSSI, + * the OSSR State and the AOE(automatic output enable). + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_BDTRInitStruct - pointer to a TIM_BDTRInitTypeDef structure. + * + * @return none + */ +void TIM_BDTRConfig(TIM_TypeDef *TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct) +{ + TIMx->BDTR = (uint32_t)TIM_BDTRInitStruct->TIM_OSSRState | TIM_BDTRInitStruct->TIM_OSSIState | + TIM_BDTRInitStruct->TIM_LOCKLevel | TIM_BDTRInitStruct->TIM_DeadTime | + TIM_BDTRInitStruct->TIM_Break | TIM_BDTRInitStruct->TIM_BreakPolarity | + TIM_BDTRInitStruct->TIM_AutomaticOutput; +} + +/********************************************************************* + * @fn TIM_TimeBaseStructInit + * + * @brief Fills each TIM_TimeBaseInitStruct member with its default value. + * + * @param TIM_TimeBaseInitStruct - pointer to a TIM_TimeBaseInitTypeDef structure. + * + * @return none + */ +void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef *TIM_TimeBaseInitStruct) +{ + TIM_TimeBaseInitStruct->TIM_Period = 0xFFFF; + TIM_TimeBaseInitStruct->TIM_Prescaler = 0x0000; + TIM_TimeBaseInitStruct->TIM_ClockDivision = TIM_CKD_DIV1; + TIM_TimeBaseInitStruct->TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInitStruct->TIM_RepetitionCounter = 0x0000; +} + +/********************************************************************* + * @fn TIM_OCStructInit + * + * @brief Fills each TIM_OCInitStruct member with its default value. + * + * @param TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure. + * + * @return none + */ +void TIM_OCStructInit(TIM_OCInitTypeDef *TIM_OCInitStruct) +{ + TIM_OCInitStruct->TIM_OCMode = TIM_OCMode_Timing; + TIM_OCInitStruct->TIM_OutputState = TIM_OutputState_Disable; + TIM_OCInitStruct->TIM_OutputNState = TIM_OutputNState_Disable; + TIM_OCInitStruct->TIM_Pulse = 0x0000; + TIM_OCInitStruct->TIM_OCPolarity = TIM_OCPolarity_High; + TIM_OCInitStruct->TIM_OCNPolarity = TIM_OCPolarity_High; + TIM_OCInitStruct->TIM_OCIdleState = TIM_OCIdleState_Reset; + TIM_OCInitStruct->TIM_OCNIdleState = TIM_OCNIdleState_Reset; +} + +/********************************************************************* + * @fn TIM_ICStructInit + * + * @brief Fills each TIM_ICInitStruct member with its default value. + * + * @param TIM_ICInitStruct - pointer to a TIM_ICInitTypeDef structure. + * + * @return none + */ +void TIM_ICStructInit(TIM_ICInitTypeDef *TIM_ICInitStruct) +{ + TIM_ICInitStruct->TIM_Channel = TIM_Channel_1; + TIM_ICInitStruct->TIM_ICPolarity = TIM_ICPolarity_Rising; + TIM_ICInitStruct->TIM_ICSelection = TIM_ICSelection_DirectTI; + TIM_ICInitStruct->TIM_ICPrescaler = TIM_ICPSC_DIV1; + TIM_ICInitStruct->TIM_ICFilter = 0x00; +} + +/********************************************************************* + * @fn TIM_BDTRStructInit + * + * @brief Fills each TIM_BDTRInitStruct member with its default value. + * + * @param TIM_BDTRInitStruct - pointer to a TIM_BDTRInitTypeDef structure. + * + * @return none + */ +void TIM_BDTRStructInit(TIM_BDTRInitTypeDef *TIM_BDTRInitStruct) +{ + TIM_BDTRInitStruct->TIM_OSSRState = TIM_OSSRState_Disable; + TIM_BDTRInitStruct->TIM_OSSIState = TIM_OSSIState_Disable; + TIM_BDTRInitStruct->TIM_LOCKLevel = TIM_LOCKLevel_OFF; + TIM_BDTRInitStruct->TIM_DeadTime = 0x00; + TIM_BDTRInitStruct->TIM_Break = TIM_Break_Disable; + TIM_BDTRInitStruct->TIM_BreakPolarity = TIM_BreakPolarity_Low; + TIM_BDTRInitStruct->TIM_AutomaticOutput = TIM_AutomaticOutput_Disable; +} + +/********************************************************************* + * @fn TIM_Cmd + * + * @brief Enables or disables the specified TIM peripheral. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_Cmd(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR1 |= TIM_CEN; + } + else + { + TIMx->CTLR1 &= (uint16_t)(~((uint16_t)TIM_CEN)); + } +} + +/********************************************************************* + * @fn TIM_CtrlPWMOutputs + * + * @brief Enables or disables the TIM peripheral Main Outputs. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_CtrlPWMOutputs(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->BDTR |= TIM_MOE; + } + else + { + TIMx->BDTR &= (uint16_t)(~((uint16_t)TIM_MOE)); + } +} + +/********************************************************************* + * @fn TIM_ITConfig + * + * @brief Enables or disables the specified TIM interrupts. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_IT - specifies the TIM interrupts sources to be enabled or disabled. + * TIM_IT_Update - TIM update Interrupt source. + * TIM_IT_CC1 - TIM Capture Compare 1 Interrupt source. + * TIM_IT_CC2 - TIM Capture Compare 2 Interrupt source + * TIM_IT_CC3 - TIM Capture Compare 3 Interrupt source. + * TIM_IT_CC4 - TIM Capture Compare 4 Interrupt source. + * TIM_IT_COM - TIM Commutation Interrupt source. + * TIM_IT_Trigger - TIM Trigger Interrupt source. + * TIM_IT_Break - TIM Break Interrupt source. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_ITConfig(TIM_TypeDef *TIMx, uint16_t TIM_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->DMAINTENR |= TIM_IT; + } + else + { + TIMx->DMAINTENR &= (uint16_t)~TIM_IT; + } +} + +/******************************************************************************* + * @fn TIM_GenerateEvent + * + * @brief Configures the TIMx event to be generate by software. + * + * @param TIMx: where x can be 1 to 4 to select the TIM peripheral. + * TIM_EventSource: specifies the event source. + * TIM_EventSource_Update: Timer update Event source. + * TIM_EventSource_CC1: Timer Capture Compare 1 Event source. + * TIM_EventSource_CC2: Timer Capture Compare 2 Event source. + * TIM_EventSource_CC3: Timer Capture Compare 3 Event source. + * TIM_EventSource_CC4: Timer Capture Compare 4 Event source. + * TIM_EventSource_COM: Timer COM event source. + * TIM_EventSource_Trigger: Timer Trigger Event source. + * TIM_EventSource_Break: Timer Break event source. + * + * @return None + */ +void TIM_GenerateEvent(TIM_TypeDef *TIMx, uint16_t TIM_EventSource) +{ + TIMx->SWEVGR = TIM_EventSource; +} + +/********************************************************************* + * @fn TIM_DMAConfig + * + * @brief Configures the TIMx's DMA interface. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_DMABase: DMA Base address. + * TIM_DMABase_CR. + * TIM_DMABase_CR2. + * TIM_DMABase_SMCR. + * TIM_DMABase_DIER. + * TIM1_DMABase_SR. + * TIM_DMABase_EGR. + * TIM_DMABase_CCMR1. + * TIM_DMABase_CCMR2. + * TIM_DMABase_CCER. + * TIM_DMABase_CNT. + * TIM_DMABase_PSC. + * TIM_DMABase_CCR1. + * TIM_DMABase_CCR2. + * TIM_DMABase_CCR3. + * TIM_DMABase_CCR4. + * TIM_DMABase_BDTR. + * TIM_DMABase_DCR. + * TIM_DMABurstLength - DMA Burst length. + * TIM_DMABurstLength_1Transfer. + * TIM_DMABurstLength_18Transfers. + * + * @return none + */ +void TIM_DMAConfig(TIM_TypeDef *TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength) +{ + TIMx->DMACFGR = TIM_DMABase | TIM_DMABurstLength; +} + +/********************************************************************* + * @fn TIM_DMACmd + * + * @brief Enables or disables the TIMx's DMA Requests. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_DMASource - specifies the DMA Request sources. + * TIM_DMA_Update - TIM update Interrupt source. + * TIM_DMA_CC1 - TIM Capture Compare 1 DMA source. + * TIM_DMA_CC2 - TIM Capture Compare 2 DMA source. + * TIM_DMA_CC3 - TIM Capture Compare 3 DMA source. + * TIM_DMA_CC4 - TIM Capture Compare 4 DMA source. + * TIM_DMA_COM - TIM Commutation DMA source. + * TIM_DMA_Trigger - TIM Trigger DMA source. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_DMACmd(TIM_TypeDef *TIMx, uint16_t TIM_DMASource, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->DMAINTENR |= TIM_DMASource; + } + else + { + TIMx->DMAINTENR &= (uint16_t)~TIM_DMASource; + } +} + +/********************************************************************* + * @fn TIM_InternalClockConfig + * + * @brief Configures the TIMx internal Clock. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * + * @return none + */ +void TIM_InternalClockConfig(TIM_TypeDef *TIMx) +{ + TIMx->SMCFGR &= (uint16_t)(~((uint16_t)TIM_SMS)); +} + +/********************************************************************* + * @fn TIM_ITRxExternalClockConfig + * + * @brief Configures the TIMx Internal Trigger as External Clock. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_InputTriggerSource: Trigger source. + * TIM_TS_ITR0 - Internal Trigger 0. + * TIM_TS_ITR1 - Internal Trigger 1. + * TIM_TS_ITR2 - Internal Trigger 2. + * TIM_TS_ITR3 - Internal Trigger 3. + * + * @return none + */ +void TIM_ITRxExternalClockConfig(TIM_TypeDef *TIMx, uint16_t TIM_InputTriggerSource) +{ + TIM_SelectInputTrigger(TIMx, TIM_InputTriggerSource); + TIMx->SMCFGR |= TIM_SlaveMode_External1; +} + +/********************************************************************* + * @fn TIM_TIxExternalClockConfig + * + * @brief Configures the TIMx Trigger as External Clock. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_TIxExternalCLKSource - Trigger source. + * TIM_TIxExternalCLK1Source_TI1ED - TI1 Edge Detector. + * TIM_TIxExternalCLK1Source_TI1 - Filtered Timer Input 1. + * TIM_TIxExternalCLK1Source_TI2 - Filtered Timer Input 2. + * TIM_ICPolarity - specifies the TIx Polarity. + * TIM_ICPolarity_Rising. + * TIM_ICPolarity_Falling. + * TIM_DMA_COM - TIM Commutation DMA source. + * TIM_DMA_Trigger - TIM Trigger DMA source. + * ICFilter - specifies the filter value. + * This parameter must be a value between 0x0 and 0xF. + * + * @return none + */ +void TIM_TIxExternalClockConfig(TIM_TypeDef *TIMx, uint16_t TIM_TIxExternalCLKSource, + uint16_t TIM_ICPolarity, uint16_t ICFilter) +{ + if(TIM_TIxExternalCLKSource == TIM_TIxExternalCLK1Source_TI2) + { + TI2_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); + } + else + { + TI1_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); + } + + TIM_SelectInputTrigger(TIMx, TIM_TIxExternalCLKSource); + TIMx->SMCFGR |= TIM_SlaveMode_External1; +} + +/********************************************************************* + * @fn TIM_ETRClockMode1Config + * + * @brief Configures the External clock Mode1. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_ExtTRGPrescaler - The external Trigger Prescaler. + * TIM_ExtTRGPSC_OFF - ETRP Prescaler OFF. + * TIM_ExtTRGPSC_DIV2 - ETRP frequency divided by 2. + * TIM_ExtTRGPSC_DIV4 - ETRP frequency divided by 4. + * TIM_ExtTRGPSC_DIV8 - ETRP frequency divided by 8. + * TIM_ExtTRGPolarity - The external Trigger Polarity. + * TIM_ExtTRGPolarity_Inverted - active low or falling edge active. + * TIM_ExtTRGPolarity_NonInverted - active high or rising edge active. + * ExtTRGFilter - External Trigger Filter. + * This parameter must be a value between 0x0 and 0xF. + * + * @return none + */ +void TIM_ETRClockMode1Config(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter) +{ + uint16_t tmpsmcr = 0; + + TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); + tmpsmcr = TIMx->SMCFGR; + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMS)); + tmpsmcr |= TIM_SlaveMode_External1; + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_TS)); + tmpsmcr |= TIM_TS_ETRF; + TIMx->SMCFGR = tmpsmcr; +} + +/********************************************************************* + * @fn TIM_ETRClockMode2Config + * + * @brief Configures the External clock Mode2. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_ExtTRGPrescaler - The external Trigger Prescaler. + * TIM_ExtTRGPSC_OFF - ETRP Prescaler OFF. + * TIM_ExtTRGPSC_DIV2 - ETRP frequency divided by 2. + * TIM_ExtTRGPSC_DIV4 - ETRP frequency divided by 4. + * TIM_ExtTRGPSC_DIV8 - ETRP frequency divided by 8. + * TIM_ExtTRGPolarity - The external Trigger Polarity. + * TIM_ExtTRGPolarity_Inverted - active low or falling edge active. + * TIM_ExtTRGPolarity_NonInverted - active high or rising edge active. + * ExtTRGFilter - External Trigger Filter. + * This parameter must be a value between 0x0 and 0xF. + * + * @return none + */ +void TIM_ETRClockMode2Config(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler, + uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter) +{ + TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); + TIMx->SMCFGR |= TIM_ECE; +} + +/********************************************************************* + * @fn TIM_ETRConfig + * + * @brief Configures the TIMx External Trigger (ETR). + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_ExtTRGPrescaler - The external Trigger Prescaler. + * TIM_ExtTRGPSC_OFF - ETRP Prescaler OFF. + * TIM_ExtTRGPSC_DIV2 - ETRP frequency divided by 2. + * TIM_ExtTRGPSC_DIV4 - ETRP frequency divided by 4. + * TIM_ExtTRGPSC_DIV8 - ETRP frequency divided by 8. + * TIM_ExtTRGPolarity - The external Trigger Polarity. + * TIM_ExtTRGPolarity_Inverted - active low or falling edge active. + * TIM_ExtTRGPolarity_NonInverted - active high or rising edge active. + * ExtTRGFilter - External Trigger Filter. + * This parameter must be a value between 0x0 and 0xF. + * + * @return none + */ +void TIM_ETRConfig(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter) +{ + uint16_t tmpsmcr = 0; + + tmpsmcr = TIMx->SMCFGR; + tmpsmcr &= SMCFGR_ETR_Mask; + tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8))); + TIMx->SMCFGR = tmpsmcr; +} + +/********************************************************************* + * @fn TIM_PrescalerConfig + * + * @brief Configures the TIMx Prescaler. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * Prescaler - specifies the Prescaler Register value. + * TIM_PSCReloadMode - specifies the TIM Prescaler Reload mode. + * TIM_PSCReloadMode - specifies the TIM Prescaler Reload mode. + * TIM_PSCReloadMode_Update - The Prescaler is loaded at the update event. + * TIM_PSCReloadMode_Immediate - The Prescaler is loaded immediately. + * + * @return none + */ +void TIM_PrescalerConfig(TIM_TypeDef *TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode) +{ + TIMx->PSC = Prescaler; + TIMx->SWEVGR = TIM_PSCReloadMode; +} + +/********************************************************************* + * @fn TIM_CounterModeConfig + * + * @brief Specifies the TIMx Counter Mode to be used. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_CounterMode - specifies the Counter Mode to be used. + * TIM_CounterMode_Up - TIM Up Counting Mode. + * TIM_CounterMode_Down - TIM Down Counting Mode. + * TIM_CounterMode_CenterAligned1 - TIM Center Aligned Mode1. + * TIM_CounterMode_CenterAligned2 - TIM Center Aligned Mode2. + * TIM_CounterMode_CenterAligned3 - TIM Center Aligned Mode3. + * + * @return none + */ +void TIM_CounterModeConfig(TIM_TypeDef *TIMx, uint16_t TIM_CounterMode) +{ + uint16_t tmpcr1 = 0; + + tmpcr1 = TIMx->CTLR1; + tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_DIR | TIM_CMS))); + tmpcr1 |= TIM_CounterMode; + TIMx->CTLR1 = tmpcr1; +} + +/********************************************************************* + * @fn TIM_SelectInputTrigger + * + * @brief Selects the Input Trigger source. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_InputTriggerSource - The Input Trigger source. + * TIM_TS_ITR0 - Internal Trigger 0. + * TIM_TS_ITR1 - Internal Trigger 1. + * TIM_TS_ITR2 - Internal Trigger 2. + * TIM_TS_ITR3 - Internal Trigger 3. + * TIM_TS_TI1F_ED - TI1 Edge Detector. + * TIM_TS_TI1FP1 - Filtered Timer Input 1. + * TIM_TS_TI2FP2 - Filtered Timer Input 2. + * TIM_TS_ETRF - External Trigger input. + * + * @return none + */ +void TIM_SelectInputTrigger(TIM_TypeDef *TIMx, uint16_t TIM_InputTriggerSource) +{ + uint16_t tmpsmcr = 0; + + tmpsmcr = TIMx->SMCFGR; + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_TS)); + tmpsmcr |= TIM_InputTriggerSource; + TIMx->SMCFGR = tmpsmcr; +} + +/********************************************************************* + * @fn TIM_EncoderInterfaceConfig + * + * @brief Configures the TIMx Encoder Interface. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_EncoderMode - specifies the TIMx Encoder Mode. + * TIM_EncoderMode_TI1 - Counter counts on TI1FP1 edge depending + * on TI2FP2 level. + * TIM_EncoderMode_TI2 - Counter counts on TI2FP2 edge depending + * on TI1FP1 level. + * TIM_EncoderMode_TI12 - Counter counts on both TI1FP1 and + * TI2FP2 edges depending. + * TIM_IC1Polarity - specifies the IC1 Polarity. + * TIM_ICPolarity_Falling - IC Falling edge. + * TTIM_ICPolarity_Rising - IC Rising edge. + * TIM_IC2Polarity - specifies the IC2 Polarity. + * TIM_ICPolarity_Falling - IC Falling edge. + * TIM_ICPolarity_Rising - IC Rising edge. + * + * @return none + */ +void TIM_EncoderInterfaceConfig(TIM_TypeDef *TIMx, uint16_t TIM_EncoderMode, + uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity) +{ + uint16_t tmpsmcr = 0; + uint16_t tmpccmr1 = 0; + uint16_t tmpccer = 0; + + tmpsmcr = TIMx->SMCFGR; + tmpccmr1 = TIMx->CHCTLR1; + tmpccer = TIMx->CCER; + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMS)); + tmpsmcr |= TIM_EncoderMode; + tmpccmr1 &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC1S)) & (uint16_t)(~((uint16_t)TIM_CC2S))); + tmpccmr1 |= TIM_CC1S_0 | TIM_CC2S_0; + tmpccer &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC1P)) & ((uint16_t) ~((uint16_t)TIM_CC2P))); + tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4)); + TIMx->SMCFGR = tmpsmcr; + TIMx->CHCTLR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_ForcedOC1Config + * + * @brief Forces the TIMx output 1 waveform to active or inactive level. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_ForcedAction - specifies the forced Action to be set to the + * output waveform. + * TIM_ForcedAction_Active - Force active level on OC1REF. + * TIM_ForcedAction_InActive - Force inactive level on OC1REF. + * + * @return none + */ +void TIM_ForcedOC1Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC1M); + tmpccmr1 |= TIM_ForcedAction; + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_ForcedOC2Config + * + * @brief Forces the TIMx output 2 waveform to active or inactive level. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_ForcedAction - specifies the forced Action to be set to the + * output waveform. + * TIM_ForcedAction_Active - Force active level on OC2REF. + * TIM_ForcedAction_InActive - Force inactive level on OC2REF. + * + * @return none + */ +void TIM_ForcedOC2Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC2M); + tmpccmr1 |= (uint16_t)(TIM_ForcedAction << 8); + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_ForcedOC3Config + * + * @brief Forces the TIMx output 3 waveform to active or inactive level. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_ForcedAction - specifies the forced Action to be set to the + * output waveform. + * TIM_ForcedAction_Active - Force active level on OC3REF. + * TIM_ForcedAction_InActive - Force inactive level on OC3REF. + * + * @return none + */ +void TIM_ForcedOC3Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC3M); + tmpccmr2 |= TIM_ForcedAction; + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_ForcedOC4Config + * + * @brief Forces the TIMx output 4 waveform to active or inactive level. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_ForcedAction - specifies the forced Action to be set to the + * output waveform. + * TIM_ForcedAction_Active - Force active level on OC4REF. + * TIM_ForcedAction_InActive - Force inactive level on OC4REF. + * + * @return none + */ +void TIM_ForcedOC4Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC4M); + tmpccmr2 |= (uint16_t)(TIM_ForcedAction << 8); + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_ARRPreloadConfig + * + * @brief Enables or disables TIMx peripheral Preload register on ARR. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_ARRPreloadConfig(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR1 |= TIM_ARPE; + } + else + { + TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_ARPE); + } +} + +/********************************************************************* + * @fn TIM_SelectCOM + * + * @brief Selects the TIM peripheral Commutation event. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_SelectCOM(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR2 |= TIM_CCUS; + } + else + { + TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_CCUS); + } +} + +/********************************************************************* + * @fn TIM_SelectCCDMA + * + * @brief Selects the TIMx peripheral Capture Compare DMA source. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_SelectCCDMA(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR2 |= TIM_CCDS; + } + else + { + TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_CCDS); + } +} + +/********************************************************************* + * @fn TIM_CCPreloadControl + * + * @brief DSets or Resets the TIM peripheral Capture Compare Preload Control bit. + * reset values (Affects also the I2Ss). + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_CCPreloadControl(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR2 |= TIM_CCPC; + } + else + { + TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_CCPC); + } +} + +/********************************************************************* + * @fn TIM_OC1PreloadConfig + * + * @brief Enables or disables the TIMx peripheral Preload register on CCR1. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCPreload - new state of the TIMx peripheral Preload register. + * TIM_OCPreload_Enable. + * TIM_OCPreload_Disable. + * + * @return none + */ +void TIM_OC1PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC1PE); + tmpccmr1 |= TIM_OCPreload; + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_OC2PreloadConfig + * + * @brief Enables or disables the TIMx peripheral Preload register on CCR2. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCPreload - new state of the TIMx peripheral Preload register. + * TIM_OCPreload_Enable. + * TIM_OCPreload_Disable. + * + * @return none + */ +void TIM_OC2PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC2PE); + tmpccmr1 |= (uint16_t)(TIM_OCPreload << 8); + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_OC3PreloadConfig + * + * @brief Enables or disables the TIMx peripheral Preload register on CCR3. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCPreload - new state of the TIMx peripheral Preload register. + * TIM_OCPreload_Enable. + * TIM_OCPreload_Disable. + * + * @return none + */ +void TIM_OC3PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC3PE); + tmpccmr2 |= TIM_OCPreload; + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_OC4PreloadConfig + * + * @brief Enables or disables the TIMx peripheral Preload register on CCR4. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCPreload - new state of the TIMx peripheral Preload register. + * TIM_OCPreload_Enable. + * TIM_OCPreload_Disable. + * + * @return none + */ +void TIM_OC4PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC4PE); + tmpccmr2 |= (uint16_t)(TIM_OCPreload << 8); + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_OC1FastConfig + * + * @brief Configures the TIMx Output Compare 1 Fast feature. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCFast - new state of the Output Compare Fast Enable Bit. + * TIM_OCFast_Enable - TIM output compare fast enable. + * TIM_OCFast_Disable - TIM output compare fast disable. + * + * @return none + */ +void TIM_OC1FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC1FE); + tmpccmr1 |= TIM_OCFast; + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_OC2FastConfig + * + * @brief Configures the TIMx Output Compare 2 Fast feature. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCFast - new state of the Output Compare Fast Enable Bit. + * TIM_OCFast_Enable - TIM output compare fast enable. + * TIM_OCFast_Disable - TIM output compare fast disable. + * + * @return none + */ +void TIM_OC2FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC2FE); + tmpccmr1 |= (uint16_t)(TIM_OCFast << 8); + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_OC3FastConfig + * + * @brief Configures the TIMx Output Compare 3 Fast feature. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCFast - new state of the Output Compare Fast Enable Bit. + * TIM_OCFast_Enable - TIM output compare fast enable. + * TIM_OCFast_Disable - TIM output compare fast disable. + * + * @return none + */ +void TIM_OC3FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC3FE); + tmpccmr2 |= TIM_OCFast; + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_OC4FastConfig + * + * @brief Configures the TIMx Output Compare 4 Fast feature. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCFast - new state of the Output Compare Fast Enable Bit. + * TIM_OCFast_Enable - TIM output compare fast enable. + * TIM_OCFast_Disable - TIM output compare fast disable. + * + * @return none + */ +void TIM_OC4FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC4FE); + tmpccmr2 |= (uint16_t)(TIM_OCFast << 8); + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_ClearOC1Ref + * + * @brief Clears or safeguards the OCREF1 signal on an external event. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCClear - new state of the Output Compare Clear Enable Bit. + * TIM_OCClear_Enable - TIM Output clear enable. + * TIM_OCClear_Disable - TIM Output clear disable. + * + * @return none + */ +void TIM_ClearOC1Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC1CE); + tmpccmr1 |= TIM_OCClear; + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_ClearOC2Ref + * + * @brief Clears or safeguards the OCREF2 signal on an external event. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCClear - new state of the Output Compare Clear Enable Bit. + * TIM_OCClear_Enable - TIM Output clear enable. + * TIM_OCClear_Disable - TIM Output clear disable. + * + * @return none + */ +void TIM_ClearOC2Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC2CE); + tmpccmr1 |= (uint16_t)(TIM_OCClear << 8); + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_ClearOC3Ref + * + * @brief Clears or safeguards the OCREF3 signal on an external event. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCClear - new state of the Output Compare Clear Enable Bit. + * TIM_OCClear_Enable - TIM Output clear enable. + * TIM_OCClear_Disable - TIM Output clear disable. + * + * @return none + */ +void TIM_ClearOC3Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC3CE); + tmpccmr2 |= TIM_OCClear; + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_ClearOC4Ref + * + * @brief Clears or safeguards the OCREF4 signal on an external event. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCClear - new state of the Output Compare Clear Enable Bit. + * TIM_OCClear_Enable - TIM Output clear enable. + * TIM_OCClear_Disable - TIM Output clear disable. + * + * @return none + */ +void TIM_ClearOC4Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC4CE); + tmpccmr2 |= (uint16_t)(TIM_OCClear << 8); + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_OC1PolarityConfig + * + * @brief Configures the TIMx channel 1 polarity. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCPolarity - specifies the OC1 Polarity. + * TIM_OCPolarity_High - Output Compare active high. + * TIM_OCPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC1PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC1P); + tmpccer |= TIM_OCPolarity; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC1NPolarityConfig + * + * @brief Configures the TIMx channel 1 polarity. + * + * @param TIMx - where x can be 1 to select the TIM peripheral. + * TIM_OCNPolarity - specifies the OC1N Polarity. + * TIM_OCNPolarity_High - Output Compare active high. + * TIM_OCNPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC1NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC1NP); + tmpccer |= TIM_OCNPolarity; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC2PolarityConfig + * + * @brief Configures the TIMx channel 2 polarity. + * + * @param TIMx - where x can be 1 to 4 to select the TIM peripheral. + * TIM_OCPolarity - specifies the OC2 Polarity. + * TIM_OCPolarity_High - Output Compare active high. + * TIM_OCPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC2PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC2P); + tmpccer |= (uint16_t)(TIM_OCPolarity << 4); + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC2NPolarityConfig + * + * @brief Configures the TIMx channel 2 polarity. + * + * @param TIMx - where x can be 1 to select the TIM peripheral. + * TIM_OCNPolarity - specifies the OC1N Polarity. + * TIM_OCNPolarity_High - Output Compare active high. + * TIM_OCNPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC2NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC2NP); + tmpccer |= (uint16_t)(TIM_OCNPolarity << 4); + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC3PolarityConfig + * + * @brief Configures the TIMx Channel 3 polarity. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_OCPolarit - specifies the OC3 Polarity. + * TIM_OCPolarity_High - Output Compare active high. + * TIM_OCPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC3PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC3P); + tmpccer |= (uint16_t)(TIM_OCPolarity << 8); + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC3NPolarityConfig + * + * @brief Configures the TIMx Channel 3N polarity. + * + * @param TIMx - where x can be 1 to select the TIM peripheral. + * TIM_OCNPolarity - specifies the OC2N Polarity. + * TIM_OCNPolarity_High - Output Compare active high. + * TIM_OCNPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC3NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC3NP); + tmpccer |= (uint16_t)(TIM_OCNPolarity << 8); + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC4PolarityConfig + * + * @brief Configures the TIMx Channel 4 polarity. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_OCPolarit - specifies the OC3 Polarity. + * TIM_OCPolarity_High - Output Compare active high. + * TIM_OCPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC4PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC4P); + tmpccer |= (uint16_t)(TIM_OCPolarity << 12); + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_CCxCmd + * + * @brief Enables or disables the TIM Capture Compare Channel x. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_Channel - specifies the TIM Channel. + * TIM_Channel_1 - TIM Channel 1. + * TIM_Channel_2 - TIM Channel 2. + * TIM_Channel_3 - TIM Channel 3. + * TIM_Channel_4 - TIM Channel 4. + * TIM_CCx - specifies the TIM Channel CCxE bit new state. + * TIM_CCx_Enable. + * TIM_CCx_Disable. + * + * @return none + */ +void TIM_CCxCmd(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx) +{ + uint16_t tmp = 0; + + tmp = CCER_CCE_Set << TIM_Channel; + TIMx->CCER &= (uint16_t)~tmp; + TIMx->CCER |= (uint16_t)(TIM_CCx << TIM_Channel); +} + +/********************************************************************* + * @fn TIM_CCxNCmd + * + * @brief Enables or disables the TIM Capture Compare Channel xN. + * + * @param TIMx - where x can be 1 select the TIM peripheral. + * TIM_Channel - specifies the TIM Channel. + * TIM_Channel_1 - TIM Channel 1. + * TIM_Channel_2 - TIM Channel 2. + * TIM_Channel_3 - TIM Channel 3. + * TIM_CCxN - specifies the TIM Channel CCxNE bit new state. + * TIM_CCxN_Enable. + * TIM_CCxN_Disable. + * + * @return none + */ +void TIM_CCxNCmd(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN) +{ + uint16_t tmp = 0; + + tmp = CCER_CCNE_Set << TIM_Channel; + TIMx->CCER &= (uint16_t)~tmp; + TIMx->CCER |= (uint16_t)(TIM_CCxN << TIM_Channel); +} + +/********************************************************************* + * @fn TIM_SelectOCxM + * + * @brief Selects the TIM Output Compare Mode. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_Channel - specifies the TIM Channel. + * TIM_Channel_1 - TIM Channel 1. + * TIM_Channel_2 - TIM Channel 2. + * TIM_Channel_3 - TIM Channel 3. + * TIM_Channel_4 - TIM Channel 4. + * TIM_OCMode - specifies the TIM Output Compare Mode. + * TIM_OCMode_Timing. + * TIM_OCMode_Active. + * TIM_OCMode_Toggle. + * TIM_OCMode_PWM1. + * TIM_OCMode_PWM2. + * TIM_ForcedAction_Active. + * TIM_ForcedAction_InActive. + * + * @return none + */ +void TIM_SelectOCxM(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode) +{ + uint32_t tmp = 0; + uint16_t tmp1 = 0; + + tmp = (uint32_t)TIMx; + tmp += CHCTLR_Offset; + tmp1 = CCER_CCE_Set << (uint16_t)TIM_Channel; + TIMx->CCER &= (uint16_t)~tmp1; + + if((TIM_Channel == TIM_Channel_1) || (TIM_Channel == TIM_Channel_3)) + { + tmp += (TIM_Channel >> 1); + *(__IO uint32_t *)tmp &= (uint32_t) ~((uint32_t)TIM_OC1M); + *(__IO uint32_t *)tmp |= TIM_OCMode; + } + else + { + tmp += (uint16_t)(TIM_Channel - (uint16_t)4) >> (uint16_t)1; + *(__IO uint32_t *)tmp &= (uint32_t) ~((uint32_t)TIM_OC2M); + *(__IO uint32_t *)tmp |= (uint16_t)(TIM_OCMode << 8); + } +} + +/********************************************************************* + * @fn TIM_UpdateDisableConfig + * + * @brief Enables or Disables the TIMx Update event. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_UpdateDisableConfig(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR1 |= TIM_UDIS; + } + else + { + TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_UDIS); + } +} + +/********************************************************************* + * @fn TIM_UpdateRequestConfig + * + * @brief Configures the TIMx Update Request Interrupt source. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_UpdateSource - specifies the Update source. + * TIM_UpdateSource_Regular. + * TIM_UpdateSource_Global. + * + * @return none + */ +void TIM_UpdateRequestConfig(TIM_TypeDef *TIMx, uint16_t TIM_UpdateSource) +{ + if(TIM_UpdateSource != TIM_UpdateSource_Global) + { + TIMx->CTLR1 |= TIM_URS; + } + else + { + TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_URS); + } +} + +/********************************************************************* + * @fn TIM_SelectHallSensor + * + * @brief Enables or disables the TIMx's Hall sensor interface. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_SelectHallSensor(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR2 |= TIM_TI1S; + } + else + { + TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_TI1S); + } +} + +/********************************************************************* + * @fn TIM_SelectOnePulseMode + * + * @brief Selects the TIMx's One Pulse Mode. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_OPMode - specifies the OPM Mode to be used. + * TIM_OPMode_Single. + * TIM_OPMode_Repetitive. + * + * @return none + */ +void TIM_SelectOnePulseMode(TIM_TypeDef *TIMx, uint16_t TIM_OPMode) +{ + TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_OPM); + TIMx->CTLR1 |= TIM_OPMode; +} + +/********************************************************************* + * @fn TIM_SelectOutputTrigger + * + * @brief Selects the TIMx Trigger Output Mode. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_TRGOSource - specifies the Trigger Output source. + * TIM_TRGOSource_Reset - The UG bit in the TIM_EGR register is + * used as the trigger output (TRGO). + * TIM_TRGOSource_Enable - The Counter Enable CEN is used as the + * trigger output (TRGO). + * TIM_TRGOSource_Update - The update event is selected as the + * trigger output (TRGO). + * TIM_TRGOSource_OC1 - The trigger output sends a positive pulse + * when the CC1IF flag is to be set, as soon as a capture or compare match occurs (TRGO). + * TIM_TRGOSource_OC1Ref - OC1REF signal is used as the trigger output (TRGO). + * TIM_TRGOSource_OC2Ref - OC2REF signal is used as the trigger output (TRGO). + * TIM_TRGOSource_OC3Ref - OC3REF signal is used as the trigger output (TRGO). + * TIM_TRGOSource_OC4Ref - OC4REF signal is used as the trigger output (TRGO). + * + * @return none + */ +void TIM_SelectOutputTrigger(TIM_TypeDef *TIMx, uint16_t TIM_TRGOSource) +{ + TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_MMS); + TIMx->CTLR2 |= TIM_TRGOSource; +} + +/********************************************************************* + * @fn TIM_SelectSlaveMode + * + * @brief Selects the TIMx Slave Mode. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_SlaveMode - specifies the Timer Slave Mode. + * TIM_SlaveMode_Reset - Rising edge of the selected trigger + * signal (TRGI) re-initializes. + * TIM_SlaveMode_Gated - The counter clock is enabled when the + * trigger signal (TRGI) is high. + * TIM_SlaveMode_Trigger - The counter starts at a rising edge + * of the trigger TRGI. + * TIM_SlaveMode_External1 - Rising edges of the selected trigger + * (TRGI) clock the counter. + * + * @return none + */ +void TIM_SelectSlaveMode(TIM_TypeDef *TIMx, uint16_t TIM_SlaveMode) +{ + TIMx->SMCFGR &= (uint16_t) ~((uint16_t)TIM_SMS); + TIMx->SMCFGR |= TIM_SlaveMode; +} + +/********************************************************************* + * @fn TIM_SelectMasterSlaveMode + * + * @brief Sets or Resets the TIMx Master/Slave Mode. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_MasterSlaveMode - specifies the Timer Master Slave Mode. + * TIM_MasterSlaveMode_Enable - synchronization between the current + * timer and its slaves (through TRGO). + * TIM_MasterSlaveMode_Disable - No action. + * + * @return none + */ +void TIM_SelectMasterSlaveMode(TIM_TypeDef *TIMx, uint16_t TIM_MasterSlaveMode) +{ + TIMx->SMCFGR &= (uint16_t) ~((uint16_t)TIM_MSM); + TIMx->SMCFGR |= TIM_MasterSlaveMode; +} + +/********************************************************************* + * @fn TIM_SetCounter + * + * @brief Sets the TIMx Counter Register value. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * Counter - specifies the Counter register new value. + * + * @return none + */ +void TIM_SetCounter(TIM_TypeDef *TIMx, uint16_t Counter) +{ + TIMx->CNT = Counter; +} + +/********************************************************************* + * @fn TIM_SetAutoreload + * + * @brief Sets the TIMx Autoreload Register value. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * Autoreload - specifies the Autoreload register new value. + * + * @return none + */ +void TIM_SetAutoreload(TIM_TypeDef *TIMx, uint16_t Autoreload) +{ + TIMx->ATRLR = Autoreload; +} + +/********************************************************************* + * @fn TIM_SetCompare1 + * + * @brief Sets the TIMx Capture Compare1 Register value. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * Compare1 - specifies the Capture Compare1 register new value. + * + * @return none + */ +void TIM_SetCompare1(TIM_TypeDef *TIMx, uint16_t Compare1) +{ + TIMx->CH1CVR = Compare1; +} + +/********************************************************************* + * @fn TIM_SetCompare2 + * + * @brief Sets the TIMx Capture Compare2 Register value. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * Compare1 - specifies the Capture Compare1 register new value. + * + * @return none + */ +void TIM_SetCompare2(TIM_TypeDef *TIMx, uint16_t Compare2) +{ + TIMx->CH2CVR = Compare2; +} + +/********************************************************************* + * @fn TIM_SetCompare3 + * + * @brief Sets the TIMx Capture Compare3 Register value. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * Compare1 - specifies the Capture Compare1 register new value. + * + * @return none + */ +void TIM_SetCompare3(TIM_TypeDef *TIMx, uint16_t Compare3) +{ + TIMx->CH3CVR = Compare3; +} + +/********************************************************************* + * @fn TIM_SetCompare4 + * + * @brief Sets the TIMx Capture Compare4 Register value. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * Compare1 - specifies the Capture Compare1 register new value. + * + * @return none + */ +void TIM_SetCompare4(TIM_TypeDef *TIMx, uint16_t Compare4) +{ + TIMx->CH4CVR = Compare4; +} + +/********************************************************************* + * @fn TIM_SetIC1Prescaler + * + * @brief Sets the TIMx Input Capture 1 prescaler. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_ICPSC - specifies the Input Capture1 prescaler new value. + * TIM_ICPSC_DIV1 - no prescaler. + * TIM_ICPSC_DIV2 - capture is done once every 2 events. + * TIM_ICPSC_DIV4 - capture is done once every 4 events. + * TIM_ICPSC_DIV8 - capture is done once every 8 events. + * + * @return none + */ +void TIM_SetIC1Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC) +{ + TIMx->CHCTLR1 &= (uint16_t) ~((uint16_t)TIM_IC1PSC); + TIMx->CHCTLR1 |= TIM_ICPSC; +} + +/********************************************************************* + * @fn TIM_SetIC2Prescaler + * + * @brief Sets the TIMx Input Capture 2 prescaler. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_ICPSC - specifies the Input Capture1 prescaler new value. + * TIM_ICPSC_DIV1 - no prescaler. + * TIM_ICPSC_DIV2 - capture is done once every 2 events. + * TIM_ICPSC_DIV4 - capture is done once every 4 events. + * TIM_ICPSC_DIV8 - capture is done once every 8 events. + * + * @return none + */ +void TIM_SetIC2Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC) +{ + TIMx->CHCTLR1 &= (uint16_t) ~((uint16_t)TIM_IC2PSC); + TIMx->CHCTLR1 |= (uint16_t)(TIM_ICPSC << 8); +} + +/********************************************************************* + * @fn TIM_SetIC3Prescaler + * + * @brief Sets the TIMx Input Capture 3 prescaler. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_ICPSC - specifies the Input Capture1 prescaler new value. + * TIM_ICPSC_DIV1 - no prescaler. + * TIM_ICPSC_DIV2 - capture is done once every 2 events. + * TIM_ICPSC_DIV4 - capture is done once every 4 events. + * TIM_ICPSC_DIV8 - capture is done once every 8 events. + * + * @return none + */ +void TIM_SetIC3Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC) +{ + TIMx->CHCTLR2 &= (uint16_t) ~((uint16_t)TIM_IC3PSC); + TIMx->CHCTLR2 |= TIM_ICPSC; +} + +/********************************************************************* + * @fn TIM_SetIC4Prescaler + * + * @brief Sets the TIMx Input Capture 4 prescaler. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_ICPSC - specifies the Input Capture1 prescaler new value. + * TIM_ICPSC_DIV1 - no prescaler. + * TIM_ICPSC_DIV2 - capture is done once every 2 events. + * TIM_ICPSC_DIV4 - capture is done once every 4 events. + * TIM_ICPSC_DIV8 - capture is done once every 8 events. + * + * @return none + */ +void TIM_SetIC4Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC) +{ + TIMx->CHCTLR2 &= (uint16_t) ~((uint16_t)TIM_IC4PSC); + TIMx->CHCTLR2 |= (uint16_t)(TIM_ICPSC << 8); +} + +/********************************************************************* + * @fn TIM_SetClockDivision + * + * @brief Sets the TIMx Clock Division value. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_CKD - specifies the clock division value. + * TIM_CKD_DIV1 - TDTS = Tck_tim. + * TIM_CKD_DIV2 - TDTS = 2*Tck_tim. + * TIM_CKD_DIV4 - TDTS = 4*Tck_tim. + * + * @return none + */ +void TIM_SetClockDivision(TIM_TypeDef *TIMx, uint16_t TIM_CKD) +{ + TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_CTLR1_CKD); + TIMx->CTLR1 |= TIM_CKD; +} + +/********************************************************************* + * @fn TIM_GetCapture1 + * + * @brief Gets the TIMx Input Capture 1 value. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * + * @return TIMx->CH1CVR - Capture Compare 1 Register value. + */ +uint16_t TIM_GetCapture1(TIM_TypeDef *TIMx) +{ + return TIMx->CH1CVR; +} + +/********************************************************************* + * @fn TIM_GetCapture2 + * + * @brief Gets the TIMx Input Capture 2 value. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * + * @return TIMx->CH2CVR - Capture Compare 2 Register value. + */ +uint16_t TIM_GetCapture2(TIM_TypeDef *TIMx) +{ + return TIMx->CH2CVR; +} + +/********************************************************************* + * @fn TIM_GetCapture3 + * + * @brief Gets the TIMx Input Capture 3 value. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * + * @return TIMx->CH3CVR - Capture Compare 3 Register value. + */ +uint16_t TIM_GetCapture3(TIM_TypeDef *TIMx) +{ + return TIMx->CH3CVR; +} + +/********************************************************************* + * @fn TIM_GetCapture4 + * + * @brief Gets the TIMx Input Capture 4 value. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * + * @return TIMx->CH4CVR - Capture Compare 4 Register value. + */ +uint16_t TIM_GetCapture4(TIM_TypeDef *TIMx) +{ + return TIMx->CH4CVR; +} + +/********************************************************************* + * @fn TIM_GetCounter + * + * @brief Gets the TIMx Counter value. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * + * @return TIMx->CNT - Counter Register value. + */ +uint16_t TIM_GetCounter(TIM_TypeDef *TIMx) +{ + return TIMx->CNT; +} + +/********************************************************************* + * @fn TIM_GetPrescaler + * + * @brief Gets the TIMx Prescaler value. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * + * @return TIMx->PSC - Prescaler Register value. + */ +uint16_t TIM_GetPrescaler(TIM_TypeDef *TIMx) +{ + return TIMx->PSC; +} + +/********************************************************************* + * @fn TIM_GetFlagStatus + * + * @brief Checks whether the specified TIM flag is set or not. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_FLAG - specifies the flag to check. + * TIM_FLAG_Update - TIM update Flag. + * TIM_FLAG_CC1 - TIM Capture Compare 1 Flag. + * TIM_FLAG_CC2 - TIM Capture Compare 2 Flag. + * TIM_FLAG_CC3 - TIM Capture Compare 3 Flag. + * TIM_FLAG_CC4 - TIM Capture Compare 4 Flag. + * TIM_FLAG_COM - TIM Commutation Flag. + * TIM_FLAG_Trigger - TIM Trigger Flag. + * TIM_FLAG_Break - TIM Break Flag. + * TIM_FLAG_CC1OF - TIM Capture Compare 1 overcapture Flag. + * TIM_FLAG_CC2OF - TIM Capture Compare 2 overcapture Flag. + * TIM_FLAG_CC3OF - TIM Capture Compare 3 overcapture Flag. + * TIM_FLAG_CC4OF - TIM Capture Compare 4 overcapture Flag. + * + * @return none + */ +FlagStatus TIM_GetFlagStatus(TIM_TypeDef *TIMx, uint16_t TIM_FLAG) +{ + ITStatus bitstatus = RESET; + + if((TIMx->INTFR & TIM_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn TIM_ClearFlag + * + * @brief Clears the TIMx's pending flags. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_FLAG - specifies the flag to check. + * TIM_FLAG_Update - TIM update Flag. + * TIM_FLAG_CC1 - TIM Capture Compare 1 Flag. + * TIM_FLAG_CC2 - TIM Capture Compare 2 Flag. + * TIM_FLAG_CC3 - TIM Capture Compare 3 Flag. + * TIM_FLAG_CC4 - TIM Capture Compare 4 Flag. + * TIM_FLAG_COM - TIM Commutation Flag. + * TIM_FLAG_Trigger - TIM Trigger Flag. + * TIM_FLAG_Break - TIM Break Flag. + * TIM_FLAG_CC1OF - TIM Capture Compare 1 overcapture Flag. + * TIM_FLAG_CC2OF - TIM Capture Compare 2 overcapture Flag. + * TIM_FLAG_CC3OF - TIM Capture Compare 3 overcapture Flag. + * TIM_FLAG_CC4OF - TIM Capture Compare 4 overcapture Flag. + * + * @return none + */ +void TIM_ClearFlag(TIM_TypeDef *TIMx, uint16_t TIM_FLAG) +{ + TIMx->INTFR = (uint16_t)~TIM_FLAG; +} + +/********************************************************************* + * @fn TIM_GetITStatus + * + * @brief Checks whether the TIM interrupt has occurred or not. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_IT - specifies the TIM interrupt source to check. + * TIM_IT_Update - TIM update Interrupt source. + * TIM_IT_CC1 - TIM Capture Compare 1 Interrupt source. + * TIM_IT_CC2 - TIM Capture Compare 2 Interrupt source. + * TIM_IT_CC3 - TIM Capture Compare 3 Interrupt source. + * TIM_IT_CC4 - TIM Capture Compare 4 Interrupt source. + * TIM_IT_COM - TIM Commutation Interrupt source. + * TIM_IT_Trigger - TIM Trigger Interrupt source. + * TIM_IT_Break - TIM Break Interrupt source. + * + * @return none + */ +ITStatus TIM_GetITStatus(TIM_TypeDef *TIMx, uint16_t TIM_IT) +{ + ITStatus bitstatus = RESET; + uint16_t itstatus = 0x0, itenable = 0x0; + + itstatus = TIMx->INTFR & TIM_IT; + + itenable = TIMx->DMAINTENR & TIM_IT; + if((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn TIM_ClearITPendingBit + * + * @brief Clears the TIMx's interrupt pending bits. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * TIM_IT - specifies the TIM interrupt source to check. + * TIM_IT_Update - TIM update Interrupt source. + * TIM_IT_CC1 - TIM Capture Compare 1 Interrupt source. + * TIM_IT_CC2 - TIM Capture Compare 2 Interrupt source. + * TIM_IT_CC3 - TIM Capture Compare 3 Interrupt source. + * TIM_IT_CC4 - TIM Capture Compare 4 Interrupt source. + * TIM_IT_COM - TIM Commutation Interrupt source. + * TIM_IT_Trigger - TIM Trigger Interrupt source. + * TIM_IT_Break - TIM Break Interrupt source. + * + * @return none + */ +void TIM_ClearITPendingBit(TIM_TypeDef *TIMx, uint16_t TIM_IT) +{ + TIMx->INTFR = (uint16_t)~TIM_IT; +} + +/********************************************************************* + * @fn TI1_Config + * + * @brief Configure the TI1 as Input. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * IM_ICPolarity - The Input Polarity. + * TIM_ICPolarity_Rising. + * TIM_ICPolarity_Falling. + * TIM_ICSelection - specifies the input to be used. + * TIM_ICSelection_DirectTI - TIM Input 1 is selected to be + * connected to IC1. + * TIM_ICSelection_IndirectTI - TIM Input 1 is selected to be + * connected to IC2. + * TIM_ICSelection_TRC - TIM Input 1 is selected to be connected + * to TRC. + * TIM_ICFilter - Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * + * @return none + */ +static void TI1_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr1 = 0, tmpccer = 0; + + TIMx->CCER &= (uint16_t) ~((uint16_t)TIM_CC1E); + tmpccmr1 = TIMx->CHCTLR1; + tmpccer = TIMx->CCER; + tmpccmr1 &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC1S)) & ((uint16_t) ~((uint16_t)TIM_IC1F))); + tmpccmr1 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); + + if((TIMx == TIM1) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4) || (TIMx == TIM5)) + { + tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC1P)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CC1E); + } + else + { + tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC1P | TIM_CC1NP)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CC1E); + } + + TIMx->CHCTLR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TI2_Config + * + * @brief Configure the TI2 as Input. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * IM_ICPolarity - The Input Polarity. + * TIM_ICPolarity_Rising. + * TIM_ICPolarity_Falling. + * TIM_ICSelection - specifies the input to be used. + * TIM_ICSelection_DirectTI - TIM Input 1 is selected to be + * connected to IC1. + * TIM_ICSelection_IndirectTI - TIM Input 1 is selected to be + * connected to IC2. + * TIM_ICSelection_TRC - TIM Input 1 is selected to be connected + * to TRC. + * TIM_ICFilter - Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * + * @return none + */ +static void TI2_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr1 = 0, tmpccer = 0, tmp = 0; + + TIMx->CCER &= (uint16_t) ~((uint16_t)TIM_CC2E); + tmpccmr1 = TIMx->CHCTLR1; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 4); + tmpccmr1 &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC2S)) & ((uint16_t) ~((uint16_t)TIM_IC2F))); + tmpccmr1 |= (uint16_t)(TIM_ICFilter << 12); + tmpccmr1 |= (uint16_t)(TIM_ICSelection << 8); + + if((TIMx == TIM1) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4) || (TIMx == TIM5)) + { + tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC2P)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CC2E); + } + else + { + tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC2P | TIM_CC2NP)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CC2E); + } + + TIMx->CHCTLR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TI3_Config + * + * @brief Configure the TI3 as Input. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * IM_ICPolarity - The Input Polarity. + * TIM_ICPolarity_Rising. + * TIM_ICPolarity_Falling. + * TIM_ICSelection - specifies the input to be used. + * TIM_ICSelection_DirectTI - TIM Input 1 is selected to be + * connected to IC1. + * TIM_ICSelection_IndirectTI - TIM Input 1 is selected to be + * connected to IC2. + * TIM_ICSelection_TRC - TIM Input 1 is selected to be connected + * to TRC. + * TIM_ICFilter - Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * + * @return none + */ +static void TI3_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; + + TIMx->CCER &= (uint16_t) ~((uint16_t)TIM_CC3E); + tmpccmr2 = TIMx->CHCTLR2; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 8); + tmpccmr2 &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC3S)) & ((uint16_t) ~((uint16_t)TIM_IC3F))); + tmpccmr2 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); + + if((TIMx == TIM1) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4) || (TIMx == TIM5)) + { + tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC3P)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CC3E); + } + else + { + tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC3P | TIM_CC3NP)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CC3E); + } + + TIMx->CHCTLR2 = tmpccmr2; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TI4_Config + * + * @brief Configure the TI4 as Input. + * + * @param TIMx - where x can be 1 to 4 select the TIM peripheral. + * IM_ICPolarity - The Input Polarity. + * TIM_ICPolarity_Rising. + * TIM_ICPolarity_Falling. + * TIM_ICSelection - specifies the input to be used. + * TIM_ICSelection_DirectTI - TIM Input 1 is selected to be + * connected to IC1. + * TIM_ICSelection_IndirectTI - TIM Input 1 is selected to be + * connected to IC2. + * TIM_ICSelection_TRC - TIM Input 1 is selected to be connected + * to TRC. + * TIM_ICFilter - Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * + * @return none + */ +static void TI4_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; + + TIMx->CCER &= (uint16_t) ~((uint16_t)TIM_CC4E); + tmpccmr2 = TIMx->CHCTLR2; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 12); + tmpccmr2 &= (uint16_t)((uint16_t)(~(uint16_t)TIM_CC4S) & ((uint16_t) ~((uint16_t)TIM_IC4F))); + tmpccmr2 |= (uint16_t)(TIM_ICSelection << 8); + tmpccmr2 |= (uint16_t)(TIM_ICFilter << 12); + + if((TIMx == TIM1) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4) || (TIMx == TIM5)) + { + tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC4P)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CC4E); + } + else + { + tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC3P | TIM_CC4NP)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CC4E); + } + + TIMx->CHCTLR2 = tmpccmr2; + TIMx->CCER = tmpccer; +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_usart.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_usart.c new file mode 100644 index 0000000000..4985fefda6 --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_usart.c @@ -0,0 +1,806 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_usart.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the USART firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + *******************************************************************************/ +#include "ch32v20x_usart.h" +#include "ch32v20x_rcc.h" + +/* USART_Private_Defines */ +#define CTLR1_UE_Set ((uint16_t)0x2000) /* USART Enable Mask */ +#define CTLR1_UE_Reset ((uint16_t)0xDFFF) /* USART Disable Mask */ + +#define CTLR1_WAKE_Mask ((uint16_t)0xF7FF) /* USART WakeUp Method Mask */ + +#define CTLR1_RWU_Set ((uint16_t)0x0002) /* USART mute mode Enable Mask */ +#define CTLR1_RWU_Reset ((uint16_t)0xFFFD) /* USART mute mode Enable Mask */ +#define CTLR1_SBK_Set ((uint16_t)0x0001) /* USART Break Character send Mask */ +#define CTLR1_CLEAR_Mask ((uint16_t)0xE9F3) /* USART CR1 Mask */ +#define CTLR2_Address_Mask ((uint16_t)0xFFF0) /* USART address Mask */ + +#define CTLR2_LINEN_Set ((uint16_t)0x4000) /* USART LIN Enable Mask */ +#define CTLR2_LINEN_Reset ((uint16_t)0xBFFF) /* USART LIN Disable Mask */ + +#define CTLR2_LBDL_Mask ((uint16_t)0xFFDF) /* USART LIN Break detection Mask */ +#define CTLR2_STOP_CLEAR_Mask ((uint16_t)0xCFFF) /* USART CR2 STOP Bits Mask */ +#define CTLR2_CLOCK_CLEAR_Mask ((uint16_t)0xF0FF) /* USART CR2 Clock Mask */ + +#define CTLR3_SCEN_Set ((uint16_t)0x0020) /* USART SC Enable Mask */ +#define CTLR3_SCEN_Reset ((uint16_t)0xFFDF) /* USART SC Disable Mask */ + +#define CTLR3_NACK_Set ((uint16_t)0x0010) /* USART SC NACK Enable Mask */ +#define CTLR3_NACK_Reset ((uint16_t)0xFFEF) /* USART SC NACK Disable Mask */ + +#define CTLR3_HDSEL_Set ((uint16_t)0x0008) /* USART Half-Duplex Enable Mask */ +#define CTLR3_HDSEL_Reset ((uint16_t)0xFFF7) /* USART Half-Duplex Disable Mask */ + +#define CTLR3_IRLP_Mask ((uint16_t)0xFFFB) /* USART IrDA LowPower mode Mask */ +#define CTLR3_CLEAR_Mask ((uint16_t)0xFCFF) /* USART CR3 Mask */ + +#define CTLR3_IREN_Set ((uint16_t)0x0002) /* USART IrDA Enable Mask */ +#define CTLR3_IREN_Reset ((uint16_t)0xFFFD) /* USART IrDA Disable Mask */ +#define GPR_LSB_Mask ((uint16_t)0x00FF) /* Guard Time Register LSB Mask */ +#define GPR_MSB_Mask ((uint16_t)0xFF00) /* Guard Time Register MSB Mask */ +#define IT_Mask ((uint16_t)0x001F) /* USART Interrupt Mask */ + +/* USART OverSampling-8 Mask */ +#define CTLR1_OVER8_Set ((uint16_t)0x8000) /* USART OVER8 mode Enable Mask */ +#define CTLR1_OVER8_Reset ((uint16_t)0x7FFF) /* USART OVER8 mode Disable Mask */ + +/* USART One Bit Sampling Mask */ +#define CTLR3_ONEBITE_Set ((uint16_t)0x0800) /* USART ONEBITE mode Enable Mask */ +#define CTLR3_ONEBITE_Reset ((uint16_t)0xF7FF) /* USART ONEBITE mode Disable Mask */ + +/********************************************************************* + * @fn USART_DeInit + * + * @brief Deinitializes the USARTx peripheral registers to their default + * reset values. + * + * @param USARTx - where x can be 1, 2 or 3 to select the UART peripheral. + * + * @return none + */ +void USART_DeInit(USART_TypeDef *USARTx) +{ + if(USARTx == USART1) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); + } + else if(USARTx == USART2) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE); + } + else if(USARTx == USART3) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE); + } + else if(USARTx == UART4) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE); + } +} + +/********************************************************************* + * @fn USART_Init + * + * @brief Initializes the USARTx peripheral according to the specified + * parameters in the USART_InitStruct. + * + * @param USARTx - where x can be 1, 2 or 3 to select the UART peripheral. + * USART_InitStruct - pointer to a USART_InitTypeDef structure + * that contains the configuration information for the specified + * USART peripheral. + * + * @return none + */ +void USART_Init(USART_TypeDef *USARTx, USART_InitTypeDef *USART_InitStruct) +{ + uint32_t tmpreg = 0x00, apbclock = 0x00; + uint32_t integerdivider = 0x00; + uint32_t fractionaldivider = 0x00; + uint32_t usartxbase = 0; + RCC_ClocksTypeDef RCC_ClocksStatus; + + if(USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None) + { + } + + usartxbase = (uint32_t)USARTx; + tmpreg = USARTx->CTLR2; + tmpreg &= CTLR2_STOP_CLEAR_Mask; + tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits; + + USARTx->CTLR2 = (uint16_t)tmpreg; + tmpreg = USARTx->CTLR1; + tmpreg &= CTLR1_CLEAR_Mask; + tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity | + USART_InitStruct->USART_Mode; + USARTx->CTLR1 = (uint16_t)tmpreg; + + tmpreg = USARTx->CTLR3; + tmpreg &= CTLR3_CLEAR_Mask; + tmpreg |= USART_InitStruct->USART_HardwareFlowControl; + USARTx->CTLR3 = (uint16_t)tmpreg; + + RCC_GetClocksFreq(&RCC_ClocksStatus); + + if(usartxbase == USART1_BASE) + { + apbclock = RCC_ClocksStatus.PCLK2_Frequency; + } + else + { + apbclock = RCC_ClocksStatus.PCLK1_Frequency; + } + + if((USARTx->CTLR1 & CTLR1_OVER8_Set) != 0) + { + integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate))); + } + else + { + integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate))); + } + tmpreg = (integerdivider / 100) << 4; + + fractionaldivider = integerdivider - (100 * (tmpreg >> 4)); + + if((USARTx->CTLR1 & CTLR1_OVER8_Set) != 0) + { + tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07); + } + else + { + tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F); + } + + USARTx->BRR = (uint16_t)tmpreg; +} + +/********************************************************************* + * @fn USART_StructInit + * + * @brief Fills each USART_InitStruct member with its default value. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * + * @return none + */ +void USART_StructInit(USART_InitTypeDef *USART_InitStruct) +{ + USART_InitStruct->USART_BaudRate = 9600; + USART_InitStruct->USART_WordLength = USART_WordLength_8b; + USART_InitStruct->USART_StopBits = USART_StopBits_1; + USART_InitStruct->USART_Parity = USART_Parity_No; + USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None; +} + +/********************************************************************* + * @fn USART_ClockInit + * + * @brief Initializes the USARTx peripheral Clock according to the + * specified parameters in the USART_ClockInitStruct . + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_ClockInitStruct - pointer to a USART_ClockInitTypeDef + * structure that contains the configuration information for the specified + * USART peripheral. + * + * @return none + */ +void USART_ClockInit(USART_TypeDef *USARTx, USART_ClockInitTypeDef *USART_ClockInitStruct) +{ + uint32_t tmpreg = 0x00; + + tmpreg = USARTx->CTLR2; + tmpreg &= CTLR2_CLOCK_CLEAR_Mask; + tmpreg |= (uint32_t)USART_ClockInitStruct->USART_Clock | USART_ClockInitStruct->USART_CPOL | + USART_ClockInitStruct->USART_CPHA | USART_ClockInitStruct->USART_LastBit; + USARTx->CTLR2 = (uint16_t)tmpreg; +} + +/********************************************************************* + * @fn USART_ClockStructInit + * + * @brief Fills each USART_ClockStructInit member with its default value. + * + * @param USART_ClockInitStruct - pointer to a USART_ClockInitTypeDef + * structure which will be initialized. + * + * @return none + */ +void USART_ClockStructInit(USART_ClockInitTypeDef *USART_ClockInitStruct) +{ + USART_ClockInitStruct->USART_Clock = USART_Clock_Disable; + USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low; + USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge; + USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable; +} + +/********************************************************************* + * @fn USART_Cmd + * + * @brief Enables or disables the specified USART peripheral. + * reset values (Affects also the I2Ss). + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * NewState: ENABLE or DISABLE. + * + * @return none + */ +void USART_Cmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR1 |= CTLR1_UE_Set; + } + else + { + USARTx->CTLR1 &= CTLR1_UE_Reset; + } +} + +/********************************************************************* + * @fn USART_ITConfig + * + * @brief Enables or disables the specified USART interrupts. + * reset values (Affects also the I2Ss). + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_IT - specifies the USART interrupt sources to be enabled or disabled. + * USART_IT_CTS - CTS change interrupt. + * USART_IT_LBD - LIN Break detection interrupt. + * USART_IT_TXE - Transmit Data Register empty interrupt. + * USART_IT_TC - Transmission complete interrupt. + * USART_IT_RXNE - Receive Data register not empty interrupt. + * USART_IT_IDLE - Idle line detection interrupt. + * USART_IT_PE - Parity Error interrupt. + * USART_IT_ERR - Error interrupt. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_ITConfig(USART_TypeDef *USARTx, uint16_t USART_IT, FunctionalState NewState) +{ + uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00; + uint32_t usartxbase = 0x00; + + if(USART_IT == USART_IT_CTS) + { + } + + usartxbase = (uint32_t)USARTx; + usartreg = (((uint8_t)USART_IT) >> 0x05); + itpos = USART_IT & IT_Mask; + itmask = (((uint32_t)0x01) << itpos); + + if(usartreg == 0x01) + { + usartxbase += 0x0C; + } + else if(usartreg == 0x02) + { + usartxbase += 0x10; + } + else + { + usartxbase += 0x14; + } + + if(NewState != DISABLE) + { + *(__IO uint32_t *)usartxbase |= itmask; + } + else + { + *(__IO uint32_t *)usartxbase &= ~itmask; + } +} + +/********************************************************************* + * @fn USART_DMACmd + * + * @brief Enables or disables the USART DMA interface. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_DMAReq - specifies the DMA request. + * USART_DMAReq_Tx - USART DMA transmit request. + * USART_DMAReq_Rx - USART DMA receive request. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_DMACmd(USART_TypeDef *USARTx, uint16_t USART_DMAReq, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR3 |= USART_DMAReq; + } + else + { + USARTx->CTLR3 &= (uint16_t)~USART_DMAReq; + } +} + +/********************************************************************* + * @fn USART_SetAddress + * + * @brief Sets the address of the USART node. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_Address - Indicates the address of the USART node. + * + * @return none + */ +void USART_SetAddress(USART_TypeDef *USARTx, uint8_t USART_Address) +{ + USARTx->CTLR2 &= CTLR2_Address_Mask; + USARTx->CTLR2 |= USART_Address; +} + +/********************************************************************* + * @fn USART_WakeUpConfig + * + * @brief Selects the USART WakeUp method. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_WakeUp - specifies the USART wakeup method. + * USART_WakeUp_IdleLine - WakeUp by an idle line detection. + * USART_WakeUp_AddressMark - WakeUp by an address mark. + * + * @return none + */ +void USART_WakeUpConfig(USART_TypeDef *USARTx, uint16_t USART_WakeUp) +{ + USARTx->CTLR1 &= CTLR1_WAKE_Mask; + USARTx->CTLR1 |= USART_WakeUp; +} + +/********************************************************************* + * @fn USART_ReceiverWakeUpCmd + * + * @brief Determines if the USART is in mute mode or not. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_ReceiverWakeUpCmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR1 |= CTLR1_RWU_Set; + } + else + { + USARTx->CTLR1 &= CTLR1_RWU_Reset; + } +} + +/********************************************************************* + * @fn USART_LINBreakDetectLengthConfig + * + * @brief Sets the USART LIN Break detection length. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_LINBreakDetectLength - specifies the LIN break detection length. + * USART_LINBreakDetectLength_10b - 10-bit break detection. + * USART_LINBreakDetectLength_11b - 11-bit break detection. + * + * @return none + */ +void USART_LINBreakDetectLengthConfig(USART_TypeDef *USARTx, uint16_t USART_LINBreakDetectLength) +{ + USARTx->CTLR2 &= CTLR2_LBDL_Mask; + USARTx->CTLR2 |= USART_LINBreakDetectLength; +} + +/********************************************************************* + * @fn USART_LINCmd + * + * @brief Enables or disables the USART LIN mode. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_LINCmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR2 |= CTLR2_LINEN_Set; + } + else + { + USARTx->CTLR2 &= CTLR2_LINEN_Reset; + } +} + +/********************************************************************* + * @fn USART_SendData + * + * @brief Transmits single data through the USARTx peripheral. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * Data - the data to transmit. + * + * @return none + */ +void USART_SendData(USART_TypeDef *USARTx, uint16_t Data) +{ + USARTx->DATAR = (Data & (uint16_t)0x01FF); +} + +/********************************************************************* + * @fn USART_ReceiveData + * + * @brief Returns the most recent received data by the USARTx peripheral. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * + * @return The received data. + */ +uint16_t USART_ReceiveData(USART_TypeDef *USARTx) +{ + return (uint16_t)(USARTx->DATAR & (uint16_t)0x01FF); +} + +/********************************************************************* + * @fn USART_SendBreak + * + * @brief Transmits break characters. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * + * @return none + */ +void USART_SendBreak(USART_TypeDef *USARTx) +{ + USARTx->CTLR1 |= CTLR1_SBK_Set; +} + +/********************************************************************* + * @fn USART_SetGuardTime + * + * @brief Sets the specified USART guard time. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_GuardTime - specifies the guard time. + * + * @return none + */ +void USART_SetGuardTime(USART_TypeDef *USARTx, uint8_t USART_GuardTime) +{ + USARTx->GPR &= GPR_LSB_Mask; + USARTx->GPR |= (uint16_t)((uint16_t)USART_GuardTime << 0x08); +} + +/********************************************************************* + * @fn USART_SetPrescaler + * + * @brief Sets the system clock prescaler. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_Prescaler - specifies the prescaler clock. + * + * @return none + */ +void USART_SetPrescaler(USART_TypeDef *USARTx, uint8_t USART_Prescaler) +{ + USARTx->GPR &= GPR_MSB_Mask; + USARTx->GPR |= USART_Prescaler; +} + +/********************************************************************* + * @fn USART_SmartCardCmd + * + * @brief Enables or disables the USART Smart Card mode. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_SmartCardCmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR3 |= CTLR3_SCEN_Set; + } + else + { + USARTx->CTLR3 &= CTLR3_SCEN_Reset; + } +} + +/********************************************************************* + * @fn USART_SmartCardNACKCmd + * + * @brief Enables or disables NACK transmission. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_SmartCardNACKCmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR3 |= CTLR3_NACK_Set; + } + else + { + USARTx->CTLR3 &= CTLR3_NACK_Reset; + } +} + +/********************************************************************* + * @fn USART_HalfDuplexCmd + * + * @brief Enables or disables the USART Half Duplex communication. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_HalfDuplexCmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR3 |= CTLR3_HDSEL_Set; + } + else + { + USARTx->CTLR3 &= CTLR3_HDSEL_Reset; + } +} + +/********************************************************************* + * @fn USART_OverSampling8Cmd + * + * @brief Enables or disables the USART's 8x oversampling mode. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_OverSampling8Cmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR1 |= CTLR1_OVER8_Set; + } + else + { + USARTx->CTLR1 &= CTLR1_OVER8_Reset; + } +} + +/********************************************************************* + * @fn USART_OneBitMethodCmd + * + * @brief Enables or disables the USART's one bit sampling method. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_OneBitMethodCmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR3 |= CTLR3_ONEBITE_Set; + } + else + { + USARTx->CTLR3 &= CTLR3_ONEBITE_Reset; + } +} + +/********************************************************************* + * @fn USART_IrDAConfig + * + * @brief Configures the USART's IrDA interface. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_IrDAMode - specifies the IrDA mode. + * USART_IrDAMode_LowPower. + * USART_IrDAMode_Normal. + * + * @return none + */ +void USART_IrDAConfig(USART_TypeDef *USARTx, uint16_t USART_IrDAMode) +{ + USARTx->CTLR3 &= CTLR3_IRLP_Mask; + USARTx->CTLR3 |= USART_IrDAMode; +} + +/********************************************************************* + * @fn USART_IrDACmd + * + * @brief Enables or disables the USART's IrDA interface. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_IrDACmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR3 |= CTLR3_IREN_Set; + } + else + { + USARTx->CTLR3 &= CTLR3_IREN_Reset; + } +} + +/********************************************************************* + * @fn USART_GetFlagStatus + * + * @brief Checks whether the specified USART flag is set or not. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_FLAG - specifies the flag to check. + * USART_FLAG_CTS - CTS Change flag. + * USART_FLAG_LBD - LIN Break detection flag. + * USART_FLAG_TXE - Transmit data register empty flag. + * USART_FLAG_TC - Transmission Complete flag. + * USART_FLAG_RXNE - Receive data register not empty flag. + * USART_FLAG_IDLE - Idle Line detection flag. + * USART_FLAG_ORE - OverRun Error flag. + * USART_FLAG_NE - Noise Error flag. + * USART_FLAG_FE - Framing Error flag. + * USART_FLAG_PE - Parity Error flag. + * + * @return none + */ +FlagStatus USART_GetFlagStatus(USART_TypeDef *USARTx, uint16_t USART_FLAG) +{ + FlagStatus bitstatus = RESET; + + if(USART_FLAG == USART_FLAG_CTS) + { + } + + if((USARTx->STATR & USART_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn USART_ClearFlag + * + * @brief Clears the USARTx's pending flags. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_FLAG - specifies the flag to clear. + * USART_FLAG_CTS - CTS Change flag. + * USART_FLAG_LBD - LIN Break detection flag. + * USART_FLAG_TC - Transmission Complete flag. + * USART_FLAG_RXNE - Receive data register not empty flag. + * + * @return none + */ +void USART_ClearFlag(USART_TypeDef *USARTx, uint16_t USART_FLAG) +{ + if((USART_FLAG & USART_FLAG_CTS) == USART_FLAG_CTS) + { + } + + USARTx->STATR = (uint16_t)~USART_FLAG; +} + +/********************************************************************* + * @fn USART_GetITStatus + * + * @brief Checks whether the specified USART interrupt has occurred or not. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_IT - specifies the USART interrupt source to check. + * USART_IT_CTS - CTS change interrupt. + * USART_IT_LBD - LIN Break detection interrupt. + * USART_IT_TXE - Tansmit Data Register empty interrupt. + * USART_IT_TC - Transmission complete interrupt. + * USART_IT_RXNE - Receive Data register not empty interrupt. + * USART_IT_IDLE - Idle line detection interrupt. + * USART_IT_ORE_RX - OverRun Error interrupt if the RXNEIE bit is set. + * USART_IT_ORE_ER - OverRun Error interrupt if the EIE bit is set. + * USART_IT_NE - Noise Error interrupt. + * USART_IT_FE - Framing Error interrupt. + * USART_IT_PE - Parity Error interrupt. + * + * @return none + */ +ITStatus USART_GetITStatus(USART_TypeDef *USARTx, uint16_t USART_IT) +{ + uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00; + ITStatus bitstatus = RESET; + + if(USART_IT == USART_IT_CTS) + { + } + + usartreg = (((uint8_t)USART_IT) >> 0x05); + itmask = USART_IT & IT_Mask; + itmask = (uint32_t)0x01 << itmask; + + if(usartreg == 0x01) + { + itmask &= USARTx->CTLR1; + } + else if(usartreg == 0x02) + { + itmask &= USARTx->CTLR2; + } + else + { + itmask &= USARTx->CTLR3; + } + + bitpos = USART_IT >> 0x08; + bitpos = (uint32_t)0x01 << bitpos; + bitpos &= USARTx->STATR; + + if((itmask != (uint16_t)RESET) && (bitpos != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn USART_ClearITPendingBit + * + * @brief Clears the USARTx's interrupt pending bits. + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_IT - specifies the interrupt pending bit to clear. + * USART_IT_CTS - CTS change interrupt. + * USART_IT_LBD - LIN Break detection interrupt. + * USART_IT_TC - Transmission complete interrupt. + * USART_IT_RXNE - Receive Data register not empty interrupt. + * + * @return none + */ +void USART_ClearITPendingBit(USART_TypeDef *USARTx, uint16_t USART_IT) +{ + uint16_t bitpos = 0x00, itmask = 0x00; + + if(USART_IT == USART_IT_CTS) + { + } + + bitpos = USART_IT >> 0x08; + itmask = ((uint16_t)0x01 << (uint16_t)bitpos); + USARTx->STATR = (uint16_t)~itmask; +} diff --git a/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_wwdg.c b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_wwdg.c new file mode 100644 index 0000000000..522a871a9a --- /dev/null +++ b/bsp/wch/risc-v/Libraries/ch32v20x_libraries/ch32v208_hal/source/ch32v20x_wwdg.c @@ -0,0 +1,139 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : ch32v20x_wwdg.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : This file provides all the WWDG firmware functions. + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * SPDX-License-Identifier: Apache-2.0 + **********************************************************************************/ +#include "ch32v20x_wwdg.h" +#include "ch32v20x_rcc.h" + +/* CTLR register bit mask */ +#define CTLR_WDGA_Set ((uint32_t)0x00000080) + +/* CFGR register bit mask */ +#define CFGR_WDGTB_Mask ((uint32_t)0xFFFFFE7F) +#define CFGR_W_Mask ((uint32_t)0xFFFFFF80) +#define BIT_Mask ((uint8_t)0x7F) + +/********************************************************************* + * @fn WWDG_DeInit + * + * @brief Deinitializes the WWDG peripheral registers to their default reset values + * + * @return none + */ +void WWDG_DeInit(void) +{ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, DISABLE); +} + +/********************************************************************* + * @fn WWDG_SetPrescaler + * + * @brief Sets the WWDG Prescaler + * + * @param WWDG_Prescaler - specifies the WWDG Prescaler + * WWDG_Prescaler_1 - WWDG counter clock = (PCLK1/4096)/1 + * WWDG_Prescaler_2 - WWDG counter clock = (PCLK1/4096)/2 + * WWDG_Prescaler_4 - WWDG counter clock = (PCLK1/4096)/4 + * WWDG_Prescaler_8 - WWDG counter clock = (PCLK1/4096)/8 + * + * @return none + */ +void WWDG_SetPrescaler(uint32_t WWDG_Prescaler) +{ + uint32_t tmpreg = 0; + tmpreg = WWDG->CFGR & CFGR_WDGTB_Mask; + tmpreg |= WWDG_Prescaler; + WWDG->CFGR = tmpreg; +} + +/********************************************************************* + * @fn WWDG_SetWindowValue + * + * @brief Sets the WWDG window value + * + * @param WindowValue - specifies the window value to be compared to the + * downcounter,which must be lower than 0x80 + * + * @return none + */ +void WWDG_SetWindowValue(uint8_t WindowValue) +{ + __IO uint32_t tmpreg = 0; + + tmpreg = WWDG->CFGR & CFGR_W_Mask; + + tmpreg |= WindowValue & (uint32_t)BIT_Mask; + + WWDG->CFGR = tmpreg; +} + +/********************************************************************* + * @fn WWDG_EnableIT + * + * @brief Enables the WWDG Early Wakeup interrupt(EWI) + * + * @return none + */ +void WWDG_EnableIT(void) +{ + WWDG->CFGR |= (1 << 9); +} + +/********************************************************************* + * @fn WWDG_SetCounter + * + * @brief Sets the WWDG counter value + * + * @param Counter - specifies the watchdog counter value,which must be a + * number between 0x40 and 0x7F + * + * @return none + */ +void WWDG_SetCounter(uint8_t Counter) +{ + WWDG->CTLR = Counter & BIT_Mask; +} + +/********************************************************************* + * @fn WWDG_Enable + * + * @brief Enables WWDG and load the counter value + * + * @param Counter - specifies the watchdog counter value,which must be a + * number between 0x40 and 0x7F + * @return none + */ +void WWDG_Enable(uint8_t Counter) +{ + WWDG->CTLR = CTLR_WDGA_Set | Counter; +} + +/********************************************************************* + * @fn WWDG_GetFlagStatus + * + * @brief Checks whether the Early Wakeup interrupt flag is set or not + * + * @return The new state of the Early Wakeup interrupt flag (SET or RESET) + */ +FlagStatus WWDG_GetFlagStatus(void) +{ + return (FlagStatus)(WWDG->STATR); +} + +/********************************************************************* + * @fn WWDG_ClearFlag + * + * @brief Clears Early Wakeup interrupt flag + * + * @return none + */ +void WWDG_ClearFlag(void) +{ + WWDG->STATR = (uint32_t)RESET; +} diff --git a/bsp/wch/risc-v/ch32v103r-evt/rtconfig.py b/bsp/wch/risc-v/ch32v103r-evt/rtconfig.py index d95c6af7ae..3901f63416 100644 --- a/bsp/wch/risc-v/ch32v103r-evt/rtconfig.py +++ b/bsp/wch/risc-v/ch32v103r-evt/rtconfig.py @@ -1,6 +1,6 @@ import os ARCH = 'risc-v' -CPU = 'ch32v1' +CPU = 'ch32' # toolchains options CROSS_TOOL = 'gcc' @@ -10,13 +10,13 @@ if os.getenv('RTT_CC'): if CROSS_TOOL == 'gcc': PLATFORM = 'gcc' - EXEC_PATH = r'D:/Softwares/RT_ThreadStudio/repo/Extract/ToolChain_Support_Packages/WCH/RISC-V-GCC-WCH/8.2.0/bin' + EXEC_PATH = r'D:\RT-ThreadStudio\repo\Extract\ToolChain_Support_Packages\WCH\RISC-V-GCC-WCH\8.2.0\bin' else: print('Please make sure your toolchains is GNU GCC!') exit(0) # if os.getenv('RTT_EXEC_PATH'): - # EXEC_PATH = os.getenv('RTT_EXEC_PATH') +# EXEC_PATH = os.getenv('RTT_EXEC_PATH') BUILD = 'debug' #BUILD = 'release' @@ -53,7 +53,7 @@ if PLATFORM == 'gcc': LPATH = '' if BUILD == 'debug': - CFLAGS += ' -O0 -g3' + CFLAGS += ' -O1 -g3' AFLAGS += ' -g3' else: CFLAGS += ' -O2' diff --git a/bsp/wch/risc-v/ch32v208v-r0/.config b/bsp/wch/risc-v/ch32v208v-r0/.config new file mode 100644 index 0000000000..30fd17be0e --- /dev/null +++ b/bsp/wch/risc-v/ch32v208v-r0/.config @@ -0,0 +1,980 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# 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=1000 +# CONFIG_RT_USING_OVERFLOW_CHECK is not set +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=512 +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_DEBUG 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_SIGNALS is not set + +# +# Memory Management +# +# CONFIG_RT_USING_MEMPOOL is not set +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 is not set +# 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=0x50000 +# CONFIG_RT_USING_CACHE 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 +CONFIG_ARCH_RISCV=y + +# +# 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=2048 +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_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 is not set +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 + +# +# 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 +# +CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 + +# +# 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_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_LIBMODBUS 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_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 + +# +# 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 + +# +# PainterEngine: A cross-platform graphics application framework written in C language +# +# CONFIG_PKG_USING_PAINTERENGINE is not set +# CONFIG_PKG_USING_PAINTERENGINE_AUX 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 + +# +# 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_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 + +# +# peripheral libraries and drivers +# + +# +# sensors drivers +# +# CONFIG_PKG_USING_FINGERPRINT is not set +# 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 + +# +# 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_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ESP_IDF is not set +# CONFIG_PKG_USING_ICM20608 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 +# CONFIG_PKG_USING_WM_LIBRARIES 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_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_NUCLEI_SDK 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_PAJ7620 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_BL_MCU_SDK is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_CW2015 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 + +# +# 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_UKAL 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_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_DIGITALCTRL 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 +# +# 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_U8G2 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 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 + +# +# Other +# + +# +# 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 +# +CONFIG_SOC_RISCV_FAMILY_CH32=y +CONFIG_SOC_RISCV_SERIES_CH32V2=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_CH32V208WBU6=y + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_USING_UART4 is not set +# CONFIG_BSP_USING_UART5 is not set +# CONFIG_BSP_USING_UART6 is not set +# CONFIG_BSP_USING_UART7 is not set +# CONFIG_BSP_USING_UART8 is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_DAC is not set +# CONFIG_BSP_USING_SOFT_I2C is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_RTC is not set +CONFIG_LSI_VALUE=40000 +# CONFIG_BSP_USING_IWDT is not set +# CONFIG_BSP_USING_CAN is not set +# CONFIG_BSP_USING_TIM is not set + +# +# Onboard Peripheral Drivers +# + +# +# Board extended module Drivers +# diff --git a/bsp/wch/risc-v/ch32v208v-r0/Kconfig b/bsp/wch/risc-v/ch32v208v-r0/Kconfig new file mode 100644 index 0000000000..c80a8958fd --- /dev/null +++ b/bsp/wch/risc-v/ch32v208v-r0/Kconfig @@ -0,0 +1,21 @@ +mainmenu "RT-Thread 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 "../Libraries/Kconfig" +source "board/Kconfig" diff --git a/bsp/wch/risc-v/ch32v208v-r0/README_zh.md b/bsp/wch/risc-v/ch32v208v-r0/README_zh.md new file mode 100644 index 0000000000..18eb07552b --- /dev/null +++ b/bsp/wch/risc-v/ch32v208v-r0/README_zh.md @@ -0,0 +1,108 @@ +# CH32V208W-R0 BSP 说明 + +**中文** + +## 1 开发板简介 + +CH32V208W-R0 是 WCH 推出的一款基于 RISC-V 内核的开发板,最高主频为 144Mhz。比较适合入门学习 RISC-V 架构。 + +![board](./figures/ch32v208.png) + +**基本特性:** + +- MCU:CH32V208WBU6,主频 144MHz,FLASH和RAM可配置 +- LED:2个。 +- 按键:3个 Download ,Reset, User 。 +- USB:2个,Tpye-C。 +- 网口:1个,内置 10M PHY。 +- 板上无 WCH-Link 下载调试工具,需外接。 + +## 2 编译说明 + +板级包支持 RISC-V GCC 开发环境,以下是具体版本信息: + +| IDE/编译器 | 已测试版本 | +| ---------- | -------------------- | +| GCC | WCH RISC-V GCC 8.2.0 | + +## 3 使用说明 + +>本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +### 3.1 使用Env编译BSP + +本节讲解如何使用Env工具来编译BSP工程。 + +#### 3.1.1 编译BSP + +1. [下载WCH编译工具链](https://github.com/NanjingQinheng/sdk-toolchain-RISC-V-GCC-WCH/archive/refs/tags/V1.0.0.zip) +2. 下载Env工具[最新版本](https://github.com/RT-Thread/env-windows/releases) +3. 下载RT-Thread[最新源码](https://github.com/RT-Thread/rt-thread/archive/refs/heads/master.zip) +4. 并在当前BSP根目录下打开Env工具并执行 `scons --exec-path=D:\sdk-toolchain-RISC-V-GCC-WCH-1.0.0\bin` 命令,在指定工具链位置的同时直接编译。 +5. 编译完成之后会生成 **rtthread.bin** 文件。 + +![sconscompile](./figures/sconscompile.jpg) + +#### 3.1.2 硬件连接 + +使用数据线连接板载 wch-link 到 PC,打开电源开关。 + +#### 3.1.3 下载 + +打开 WCH RISC-V MCU ProgrammerTool 下载软件,选择刚刚生成的 **rtthread.bin** 文件,进行下载。 + +![tool](./figures/tool.png) + +#### 3.1.4 运行结果 + +在终端工具里打开板载 wch-link 串口(WCHDapLink SERIAL,默认115200-8-1-N),复位设备后,在串口上可以看到 RT-Thread 的输出信息: + +![end](./figures/end.png) + +### 3.2 使用VSCode编译工程 + +在Env终端中敲入命令 `scons --target=vsc` 来生成VSCode工程. 接着敲入命令 `code .` 来打开VSCode. + +使用 **VSCode 终端** 敲入命令 `scons -j12 --exec-path=D:\sdk-toolchain-RISC-V-GCC-WCH-1.0.0bin` 来编译工程。 + +![vscode-terminal](./figures/vscode-terminal.png) + +### 3.3 导入 RT-Thread Studio 工程 + +#### 3.3.1 导入 + +打开 RT-Thread Studio 后点击:文件->导入: + +![import](./figures/import.png) + +选择“RT-Thread Bsp 到工作空间中”: + +![windows](./figures/windows.png) + +填写项目信息,Bsp 根目录为 `\rt-thread\bsp\wch\risc-v\ch32v307v-r1` 目录: + +![config](./figures/config.png) + +#### 3.3.2 配置环境 + +工程导入后进行编译环境的设置,首先点击“打开构建设置”进入设置界面: + +![set](./figures/set.png) + +将编译链路径复制到 Toolchain path 中: + +![toolchain](./figures/toolchain.png) + +如图更改 Prefix : + +![prefix](./figures/prefix.png) + +进行工具设置: + +![toolset](./figures/toolset.png) + +#### 3.3.3 编译 + +编译结果如下: + +![success](./figures/success.png) diff --git a/bsp/wch/risc-v/ch32v208v-r0/SConscript b/bsp/wch/risc-v/ch32v208v-r0/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/wch/risc-v/ch32v208v-r0/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os +Import('RTT_ROOT') +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/wch/risc-v/ch32v208v-r0/SConstruct b/bsp/wch/risc-v/ch32v208v-r0/SConstruct new file mode 100644 index 0000000000..1c21f19f0a --- /dev/null +++ b/bsp/wch/risc-v/ch32v208v-r0/SConstruct @@ -0,0 +1,64 @@ +import os +import sys +import rtconfig +from SCons.Script import * + +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')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + + +TARGET = 'rtthread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +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 = env["LINKCOM"] + ' --map project.map') + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/Libraries'): + libraries_path_prefix = SDK_ROOT + '/Libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/Libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +ch32_library = 'ch32v20x_libraries' +rtconfig.BSP_LIBRARY_TYPE = ch32_library + +bsp_vdir = 'build' +library_vdir = 'build/libraries' + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, ch32_library, 'SConscript'), variant_dir=library_vdir + '/ch32_library', duplicate=0)) + +# common include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'ch32_drivers','SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/wch/risc-v/ch32v208v-r0/applications/SConscript b/bsp/wch/risc-v/ch32v208v-r0/applications/SConscript new file mode 100644 index 0000000000..9bb9abae89 --- /dev/null +++ b/bsp/wch/risc-v/ch32v208v-r0/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/wch/risc-v/ch32v208v-r0/applications/main.c b/bsp/wch/risc-v/ch32v208v-r0/applications/main.c new file mode 100644 index 0000000000..3246340a93 --- /dev/null +++ b/bsp/wch/risc-v/ch32v208v-r0/applications/main.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-11-03 WangShun first version + */ + +#include "ch32v20x.h" +#include +#include +#include "drivers/pin.h" +#include + +#define LED0 rt_pin_get("PA.0") + +int main(void) +{ + rt_pin_mode(LED0,PIN_MODE_OUTPUT); + rt_kprintf("MCU-CH32V208WBU6\r\n"); + while(1) + { + rt_pin_write(LED0, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED0, PIN_LOW); + rt_thread_mdelay(500); + } +} diff --git a/bsp/wch/risc-v/ch32v208v-r0/board/Kconfig b/bsp/wch/risc-v/ch32v208v-r0/board/Kconfig new file mode 100644 index 0000000000..613551495b --- /dev/null +++ b/bsp/wch/risc-v/ch32v208v-r0/board/Kconfig @@ -0,0 +1,579 @@ +menu "Hardware Drivers Config" + +config SOC_CH32V208WBU6 + bool + select SOC_RISCV_SERIES_CH32V2 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +menu "On-chip Peripheral Drivers" + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + select RT_USING_SERIAL + default n + + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default n + + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_USING_UART3 + bool "Enable UART3" + default n + + config BSP_USING_UART4 + bool "Enable UART4" + default n + + config BSP_USING_UART5 + bool "Enable UART5" + default n + + config BSP_USING_UART6 + bool "Enable UART6" + default n + + config BSP_USING_UART7 + bool "Enable UART7" + default n + + config BSP_USING_UART8 + bool "Enable UART8" + default n + endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + select RT_USING_ADC + default n + + if BSP_USING_ADC + config BSP_USING_ADC1 + bool "Enable ADC1" + default n + + config BSP_USING_ADC2 + bool "Enable ADC2" + default n + + config ADC_CHANNEL_16 + bool "Enable ADC CHANNEL 16 (inside temperature)" + default n + + config ADC_CHANNEL_17 + bool "Enable ADC CHANNEL 17 (inside Verf)" + default n + endif + + menuconfig BSP_USING_DAC + bool "Enable DAC" + select RT_USING_DAC + default n + + if BSP_USING_DAC + config BSP_USING_DAC_CHANNEL1 + bool "Enable DAC CHANNEL1" + default n + config BSP_USING_DAC_CHANNEL2 + bool "Enable DAC CHANNEL2" + default n + endif + + menuconfig BSP_USING_SOFT_I2C + bool "Enable I2C Bus" + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + default n + + if BSP_USING_SOFT_I2C + config BSP_USING_I2C1 + bool "Enable I2C1 Bus (software simulation)" + default n + + if BSP_USING_I2C1 + comment "Notice: PC7 --> 39; PC6 --> 38" + + config BSP_I2C1_SCL_PIN + int "i2c1 SCL pin number" + range 0 79 + default 38 + config BSP_I2C1_SDA_PIN + int "i2c1 SDA pin number" + range 0 79 + default 39 + endif + + config BSP_USING_I2C2 + bool "Enable I2C2 Bus (software simulation)" + default n + + if BSP_USING_I2C2 + comment "Notice: PC1 --> 33; PC0 --> 32" + config BSP_I2C2_SCL_PIN + int "i2c2 SCL pin number" + range 0 79 + default 32 + config BSP_I2C2_SDA_PIN + int "i2c2 SDA pin number" + range 0 79 + default 33 + endif + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI" + select RT_USING_SPI_BITOPS + select RT_USING_SPI + + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1" + default n + + config BSP_USING_SPI2 + bool "Enable SPI2" + default n + + config BSP_USING_SPI3 + bool "Enable SPI3" + default n + + if BSP_USING_SPI3 + config BSP_USING_SPI_FLASH + bool "Enable SPI Flash" + default n + endif + + config BSP_USING_SOFT_SPI1 + bool "Enable SSPI1 Bus (User SPI)" + default n + if BSP_USING_SOFT_SPI1 + comment "Notice: PB9 --> 25; PB8 --> 24; PB7 --> 23" + config BSP_S_SPI1_SCK_PIN + int "sspi1 SCL pin number" + range 1 79 + default 25 + config BSP_S_SPI1_MOSI_PIN + int "sspi1 MISO pin number" + range 1 79 + default 24 + config BSP_S_SPI1_MISO_PIN + int "sspi1 MOSI pin number" + range 1 79 + default 23 + endif + + config BSP_USING_SOFT_SPI2 + bool "Enable SSPI2 Bus (soft SPI)" + default n + if BSP_USING_SOFT_SPI2 + comment "Notice: PE0 --> 64; PE1 --> 65; PE2 --> 66" + config BSP_S_SPI2_SCK_PIN + int "sspi2 SCL pin number" + range 1 79 + default 64 + config BSP_S_SPI2_MOSI_PIN + int "sspi2 MISO pin number" + range 1 79 + default 65 + config BSP_S_SPI2_MISO_PIN + int "sspi2 MOSI pin number" + range 1 79 + default 66 + endif + endif + + config BSP_USING_RTC + bool "Enable RTC" + select RT_USING_RTC + default n + + if BSP_USING_RTC + config BSP_USING_RTC_LSI + bool "Using LSI clock for rtc, if not, LSE default" + select LSI_VALUE + default n + endif + + config LSI_VALUE + int + default 40000 + + config BSP_USING_IWDT + bool "Enable IWDT" + select RT_USING_WDT + select LSI_VALUE + default n + + menuconfig BSP_USING_CAN + bool "Enable CAN" + default n + select RT_USING_CAN + if BSP_USING_CAN + config BSP_USING_CAN1 + bool "Using CAN1" + default n + config BSP_USING_CAN2 + bool "Using CAN2" + default n + endif + + config BSP_USING_TIM + bool "Using TIMx" + default n + + if BSP_USING_TIM + config BSP_USING_HWTIMER + bool + select RT_USING_HWTIMER + default n + + config BSP_USING_PWM + bool + select RT_USING_PWM + default n + + config BSP_USING_TIM1 + bool "using TIM1" + default n + + if BSP_USING_TIM1 + choice + prompt "Using TIM1 as hwtimer or PWM mode" + default BSP_USING_TIM1_HWTIMER + + config BSP_USING_TIM1_HWTIMER + bool "Using TIM1 as hwtimer mode" + select BSP_USING_HWTIMER + + config BSP_USING_TIM1_PWM + bool "Using TIM1 as PWM mode" + select BSP_USING_PWM + endchoice + + if BSP_USING_TIM1_PWM + config BSP_USING_TIM1_PWM_CH1 + bool "Using TIM1 channel 1" + default n + + config BSP_USING_TIM1_PWM_CH2 + bool "Using TIM1 channel 2" + default n + + config BSP_USING_TIM1_PWM_CH3 + bool "Using TIM1 channel 3" + + config BSP_USING_TIM1_PWM_CH4 + bool "Using TIM1 channel 4" + endif + + endif + + config BSP_USING_TIM2 + bool "Using TIM2" + default n + + if BSP_USING_TIM2 + choice + prompt "Using TIM2 as hwtimer or PWM mode" + default BSP_USING_TIM2_HWTIMER + + config BSP_USING_TIM2_HWTIMER + bool "Using TIM2 as hwtimer mode" + select BSP_USING_HWTIMER + + config BSP_USING_TIM2_PWM + bool "Using TIM2 as PWM mode" + select BSP_USING_PWM + endchoice + + if BSP_USING_TIM2_PWM + config BSP_USING_TIM2_PWM_CH1 + bool "Using TIM2 channel 1" + default n + + config BSP_USING_TIM2_PWM_CH2 + bool "Using TIM2 channel 2" + default n + + config BSP_USING_TIM2_PWM_CH3 + bool "Using TIM2 channel 3" + + config BSP_USING_TIM2_PWM_CH4 + bool "Using TIM2 channel 4" + endif + + endif + + config BSP_USING_TIM3 + bool "Using TIM3" + default n + + if BSP_USING_TIM3 + choice + prompt "Using TIM3 as hwtimer or PWM mode" + default BSP_USING_TIM3_HWTIMER + + config BSP_USING_TIM3_HWTIMER + bool "Using TIM3 as hwtimer mode" + select BSP_USING_HWTIMER + + config BSP_USING_TIM3_PWM + bool "Using TIM3 as PWM mode" + select BSP_USING_PWM + endchoice + + if BSP_USING_TIM3_PWM + config BSP_USING_TIM3_PWM_CH1 + bool "Using TIM3 channel 1" + default n + + config BSP_USING_TIM3_PWM_CH2 + bool "Using TIM3 channel 2" + default n + + config BSP_USING_TIM3_PWM_CH3 + bool "Using TIM3 channel 3" + + config BSP_USING_TIM3_PWM_CH4 + bool "Using TIM3 channel 4" + endif + + endif + + config BSP_USING_TIM4 + bool "Using TIM4" + default n + + if BSP_USING_TIM4 + choice + prompt "Using TIM4 as hwtimer or PWM mode" + default BSP_USING_TIM4_HWTIMER + + config BSP_USING_TIM4_HWTIMER + bool "Using TIM4 as hwtimer mode" + select BSP_USING_HWTIMER + + config BSP_USING_TIM4_PWM + bool "Using TIM4 as PWM mode" + select BSP_USING_PWM + endchoice + + if BSP_USING_TIM4_PWM + config BSP_USING_TIM4_PWM_CH1 + bool "Using TIM4 channel 1" + default n + + config BSP_USING_TIM4_PWM_CH2 + bool "Using TIM4 channel 2" + default n + + config BSP_USING_TIM4_PWM_CH3 + bool "Using TIM4 channel 3" + + config BSP_USING_TIM4_PWM_CH4 + bool "Using TIM4 channel 4" + endif + + endif + + config BSP_USING_TIM5 + bool "Using TIM5" + default n + + if BSP_USING_TIM5 + choice + prompt "Using TIM5 as hwtimer or PWM mode" + default BSP_USING_TIM5_HWTIMER + + config BSP_USING_TIM5_HWTIMER + bool "Using TIM5 as hwtimer mode" + select BSP_USING_HWTIMER + + config BSP_USING_TIM5_PWM + bool "Using TIM5 as PWM mode" + select BSP_USING_PWM + endchoice + + if BSP_USING_TIM5_PWM + config BSP_USING_TIM5_PWM_CH1 + bool "Using TIM5 channel 1" + default n + + config BSP_USING_TIM5_PWM_CH2 + bool "Using TIM5 channel 2" + default n + + config BSP_USING_TIM5_PWM_CH3 + bool "Using TIM5 channel 3" + + config BSP_USING_TIM5_PWM_CH4 + bool "Using TIM5 channel 4" + endif + + endif + + config BSP_USING_TIM6 + bool "Using TIM6" + default n + + if BSP_USING_TIM6 + choice + prompt "Using TIM5 as hwtimer (PWM mode not supported)" + default BSP_USING_TIM6_HWTIMER + + config BSP_USING_TIM6_HWTIMER + bool "Using TIM6 as hwtimer mode" + select BSP_USING_HWTIMER + endchoice + + endif + + config BSP_USING_TIM7 + bool "Using TIM7" + default n + + if BSP_USING_TIM7 + choice + prompt "Using TIM7 as hwtimer (PWM mode not supported)" + default BSP_USING_TIM7_HWTIMER + + config BSP_USING_TIM7_HWTIMER + bool "Using TIM7 as hwtimer mode" + select BSP_USING_HWTIMER + endchoice + + endif + + config BSP_USING_TIM8 + bool "Using TIM8" + default n + + if BSP_USING_TIM8 + choice + prompt "Using TIM8 as hwtimer or PWM mode" + default BSP_USING_TIM8_HWTIMER + + config BSP_USING_TIM8_HWTIMER + bool "Using TIM8 as hwtimer mode" + select BSP_USING_HWTIMER + + config BSP_USING_TIM8_PWM + bool "Using TIM8 as PWM mode" + select BSP_USING_PWM + endchoice + + if BSP_USING_TIM8_PWM + config BSP_USING_TIM8_PWM_CH1 + bool "Using TIM8 channel 1" + default n + + config BSP_USING_TIM8_PWM_CH2 + bool "Using TIM8 channel 2" + default n + + config BSP_USING_TIM8_PWM_CH3 + bool "Using TIM8 channel 3" + + config BSP_USING_TIM8_PWM_CH4 + bool "Using TIM8 channel 4" + endif + + endif + + config BSP_USING_TIM9 + bool "Using TIM9" + default n + + if BSP_USING_TIM9 + choice + prompt "Using TIM9 as hwtimer or PWM mode" + default BSP_USING_TIM9_HWTIMER + + config BSP_USING_TIM9_HWTIMER + bool "Using TIM9 as hwtimer mode" + select BSP_USING_HWTIMER + + config BSP_USING_TIM9_PWM + bool "Using TIM9 as PWM mode" + select BSP_USING_PWM + endchoice + + if BSP_USING_TIM9_PWM + config BSP_USING_TIM9_PWM_CH1 + bool "Using TIM9 channel 1" + default n + + config BSP_USING_TIM9_PWM_CH2 + bool "Using TIM9 channel 2" + default n + + config BSP_USING_TIM9_PWM_CH3 + bool "Using TIM9 channel 3" + + config BSP_USING_TIM9_PWM_CH4 + bool "Using TIM9 channel 4" + endif + + endif + + config BSP_USING_TIM10 + bool "Using TIM10" + default n + + if BSP_USING_TIM10 + choice + prompt "Using TIM10 as hwtimer or PWM mode" + default BSP_USING_TIM10_HWTIMER + + config BSP_USING_TIM10_HWTIMER + bool "Using TIM10 as hwtimer mode" + select BSP_USING_HWTIMER + + config BSP_USING_TIM10_PWM + bool "Using TIM10 as PWM mode" + select BSP_USING_PWM + endchoice + + if BSP_USING_TIM10_PWM + config BSP_USING_TIM10_PWM_CH1 + bool "Using TIM10 channel 1" + default n + + config BSP_USING_TIM10_PWM_CH2 + bool "Using TIM10 channel 2" + default n + + config BSP_USING_TIM10_PWM_CH3 + bool "Using TIM10 channel 3" + + config BSP_USING_TIM10_PWM_CH4 + bool "Using TIM10 channel 4" + endif + + endif + + endif + +endmenu + +menu "Onboard Peripheral Drivers" + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/wch/risc-v/ch32v208v-r0/board/SConscript b/bsp/wch/risc-v/ch32v208v-r0/board/SConscript new file mode 100644 index 0000000000..bc8e7636f1 --- /dev/null +++ b/bsp/wch/risc-v/ch32v208v-r0/board/SConscript @@ -0,0 +1,17 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +''') + +path = [cwd] + +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path) +Return('group') diff --git a/bsp/wch/risc-v/ch32v208v-r0/board/board.c b/bsp/wch/risc-v/ch32v208v-r0/board/board.c new file mode 100644 index 0000000000..197c3c66ad --- /dev/null +++ b/bsp/wch/risc-v/ch32v208v-r0/board/board.c @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-08-23 liYony first version + */ + +#include "board.h" +#include +#include "drv_usart.h" +#include +#include + +extern uint32_t SystemCoreClock; + +static uint32_t _SysTick_Config(rt_uint32_t ticks) +{ + NVIC_SetPriority(SysTicK_IRQn,0xf0); + NVIC_SetPriority(Software_IRQn,0xf0); + NVIC_EnableIRQ(SysTicK_IRQn); + NVIC_EnableIRQ(Software_IRQn); + SysTick->CTLR=0; + SysTick->SR=0; + SysTick->CNT=0; + SysTick->CMP=ticks-1; + SysTick->CTLR=0xF; + return 0; +} + +#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) +#define RT_HEAP_SIZE (1024*10) +static uint32_t rt_heap[RT_HEAP_SIZE]; +rt_weak void *rt_heap_begin_get(void) +{ + return rt_heap; +} + +rt_weak void *rt_heap_end_get(void) +{ + return rt_heap + RT_HEAP_SIZE; +} +#endif + +/** + * This function will initial your board. + */ +void rt_hw_board_init() +{ + /* System Tick Configuration */ + _SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); + +#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) + rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get()); +#endif + /* USART driver initialization is open by default */ +#ifdef RT_USING_SERIAL + rt_hw_usart_init(); +#endif +#ifdef RT_USING_CONSOLE + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +#endif + /* Call components board initial (use INIT_BOARD_EXPORT()) */ +#ifdef RT_USING_COMPONENTS_INIT + rt_components_board_init(); +#endif + +} + +void SysTick_Handler(void) __attribute__((interrupt())); +void SysTick_Handler(void) +{ + GET_INT_SP(); + /* enter interrupt */ + rt_interrupt_enter(); + SysTick->SR=0; + rt_tick_increase(); + /* leave interrupt */ + rt_interrupt_leave(); + FREE_INT_SP(); + +} diff --git a/bsp/wch/risc-v/ch32v208v-r0/board/board.h b/bsp/wch/risc-v/ch32v208v-r0/board/board.h new file mode 100644 index 0000000000..9086e24c4e --- /dev/null +++ b/bsp/wch/risc-v/ch32v208v-r0/board/board.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-08-23 liYony first version + */ + +// <<< Use Configuration Wizard in Context Menu >>> +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include "ch32v20x.h" + +#define ch32v20x_PIN_NUMBERS 64 +/* board configuration */ +#define SRAM_SIZE 64 +#define SRAM_END (0x20000000 + SRAM_SIZE * 1024) + +extern int _ebss; +#define HEAP_BEGIN ((void *)&_ebss) +#define HEAP_END (SRAM_END-_stack_size) + +void rt_hw_board_init(void); + +#endif /* __BOARD_H__ */ diff --git a/bsp/wch/risc-v/ch32v208v-r0/board/linker_scripts/link.lds b/bsp/wch/risc-v/ch32v208v-r0/board/linker_scripts/link.lds new file mode 100644 index 0000000000..b0051ab14d --- /dev/null +++ b/bsp/wch/risc-v/ch32v208v-r0/board/linker_scripts/link.lds @@ -0,0 +1,194 @@ +ENTRY( _start ) + +__stack_size = 2048; + +PROVIDE( _stack_size = __stack_size ); + + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K +} + + +SECTIONS +{ + + .init : + { + _sinit = .; + . = ALIGN(4); + KEEP(*(SORT_NONE(.init))) + . = ALIGN(4); + _einit = .; + } >FLASH AT>FLASH + + .vector : + { + *(.vector); + . = ALIGN(64); + } >FLASH AT>FLASH + + .text : + { + . = ALIGN(4); + *(.text) + *(.text.*) + *(.rodata) + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t.*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + . = ALIGN(4); + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + . = ALIGN(4); + + /* section information for modules */ + . = ALIGN(4); + __rtmsymtab_start = .; + KEEP(*(RTMSymTab)) + __rtmsymtab_end = .; + . = ALIGN(4); + + } >FLASH AT>FLASH + + .fini : + { + KEEP(*(SORT_NONE(.fini))) + . = ALIGN(4); + } >FLASH AT>FLASH + + PROVIDE( _etext = . ); + PROVIDE( _eitcm = . ); + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH AT>FLASH + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH AT>FLASH + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH AT>FLASH + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >FLASH AT>FLASH + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >FLASH AT>FLASH + + .dalign : + { + . = ALIGN(4); + PROVIDE(_data_vma = .); + } >RAM AT>FLASH + + .dlalign : + { + . = ALIGN(4); + PROVIDE(_data_lma = .); + } >FLASH AT>FLASH + + .data : + { + *(.gnu.linkonce.r.*) + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800 ); + *(.sdata .sdata.*) + *(.sdata2.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + . = ALIGN(4); + PROVIDE( _edata = .); + } >RAM AT>FLASH + + .bss : + { + . = ALIGN(4); + PROVIDE( _sbss = .); + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss*) + *(.gnu.linkonce.b.*) + *(COMMON*) + . = ALIGN(4); + PROVIDE( _ebss = .); + } >RAM AT>FLASH + + PROVIDE( _end = _ebss); + PROVIDE( end = . ); + + .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size : + { + PROVIDE( _heap_end = . ); + . = ALIGN(4); + PROVIDE(_susrstack = . ); + . = . + __stack_size; + PROVIDE( _eusrstack = .); + } >RAM + +} + + + diff --git a/bsp/wch/risc-v/ch32v208v-r0/figures/ch32v208.png b/bsp/wch/risc-v/ch32v208v-r0/figures/ch32v208.png new file mode 100644 index 0000000000000000000000000000000000000000..752edca1d60f02e4a43367bf7c9b3ec7e85c6338 GIT binary patch literal 1590139 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�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%0A~1UhB3mpY6n<$KA-XK{YR$F67S;%^geAj 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%0AeE-a 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�Z8yP*VHdEbjS98FB3W~sFi zpEhFGu}X#tjipf)CTV7-rqUJ37y(v;X5KVhU0vavq>hilGpifYIG~ke7+hVgX`G>| zElwNO+a5m#hCZQ^1V@s=*+wi`38rmW@RG0|29K*m)~+(-ER~>R*UJVvOR(K~+o6GO zv*UWR<;nBs9vh@%Y7L`tHwp)nP;b?6K+26P5uAPy2vS5*#jB>0h}p{W|2bzHny z(QkXU+Z|OiqaPv>sRqm`3!z59B#q4m6N?`-Ysd=iGc}H+0yb+ZWwA-JO;XZSmF9SP z%-|z21%?m^G2x?Pz1~WWLC6g29gCw=Nbq!h4~ zB$NAUwxJ3$uYnA`<`Ea`Webuo?orl?s}qzvDnpGWjLQNaid`jBfX70?N>B@ z&cmx`T*r>yeRo}Ge~h?U)-!4w2b>&g1JBxT+%BOd2y%MmYtL2}_&E;$=?4!u#O4b#jafEzPmTj|pV=>`<$DjP*4|)6E>wN3( z>o{dut#^F-@DWYhGHVwMcy{}1_Oo*hxu4mYb`p+5LVy#8PKkS%w%0 zF<_gTFhnk{FS)pQ!K)8m!Ouso`z@E(E39!G-(O&xnspfX^x0!*E2`WObi&$1$l#Ua zGUQ@^n+U;4`KOUUR9#i*rY4jC%9!&F^L{XAq?`#^fcy;5HmIf%*}FA_0@mhz$Xi)2 zR4&TXOq%Sr<-RrrGQU*SrW7j6eKIRb2ACw|mj&n>8FOksn;a}s`+f36)lW0h;qL%@ zwme12ZOT({YPsv?mjdbzE8f)pwZ54#^$j__0%Zp8&EUPM%uW&cXM6mk2KU8cp{}-D zlu}A5%`o(8O7DzOR`RNq)MEIB*}nuW6{= zv*XhS=-_XG8}MP0pijqUdM)pTxt}}ne3>%v?o;6lI57S9bSQ%}0| z8Al1Ks_VVa{QqI@y`E)D&-1?DmsaYq_daPNFaQXU6d@2yN-jm(@{L_8msP&>jsHQF z>{7XG28kj{5E4m%2s4;GXJ$^`sk>MBqA%XHdhatN?J8Lp?5e4A=G5NZEA{ui&-*?h z<;-TYIo_{n93^Y>*10Y3eQZ!H%!K(qEYHN!01^F|r6_f5tfZ8V*Y}Iw1B;H`EEDMz zrSm~W$m*CQW|=&HI#sfe48U8144Op=g@ThN47cSKFHBk6-Zo$d1gw(g3Pt1^5<7F#^egk^Ak3SGvI^rICPVR2 zG`igelN7`5fbx;)(9^9t9ESdC$K|@60aoT@yM9hiC|o?Au&OW(TdogRoSmLvT}@pzY&WNT zUY-IFz0e~=%4jV<9ZULy_lY~(GlCDqDUhbfX1itF_2QC^NJkF4J-l*{qTuA@9(pzu zymIfjb^)-@OfwYFe{s=s@2fkkt=TJ!w#C#;(Wmmv-w*E!yK z=RHm~YwD&0*PEO9KAHQICwL@XBMG^WDWi)#~a__ZQuu7qF#%M*D*OQXU z-24+$re*zJrtHTU)_migQa23-b!3bIxAr}mbSEFEss?gI6^%-nDMay!NQn|86^5Ab z!^EHq))wl#*$ zdJReubH?v_+NLFjjBz#Na0yydDMztZ%o>%YxEltXHIkD)jRTezZ4_Etyq~a23$Rd{ zwrS}5fwrzGNf=P$6bZgS5ie(}4F!!>hT^2SOmY!HW&9W@F_M!s{E9AUqsWt|t{r|F zaE-xgM^Tc|UUEUZig7;zmVP&2o0i}u^SQB>m;+WuW7wieJ_wMtmNa_W%8_P?#yE}C zMpHQ}5qd?DGaL>R-X|`vp5tR;8Y2`v>+rMWVJk;vB$myZnYLZ#N#?>$W?=cSb*<{48i%v2$*-r!eGHbXx?7%R4@rdWo zC!c)Gy?gg)jH4JQdE@gm(b$TR4rpsJ#)2x0(?qxJL_Sp4gcN1ckH~)fG;wdWVy$YK zDu+N!6V`Q7x9`Wf0a7SRBpF#}lAiq*Doe?VVeF-8t7LjB;5$<5ivIkPZ+`t(x!0c1 z8AqHFc@oCsH-Gilu~^1D@#pXUjKk#>sgX4_hY4%Nhh-cG%>12g+LraYV;6c-PF!AH z;jHHUk3Jx)#FyXt66Y`W=&MUyQ{%&m-}&}8X_|)0IDY=~clhv=hv+jWi6q8|zs?LE zQ%ZDA$CdACH*3Zuo=F#%m;C#G|Hu5V|NMVO)tT4Pj6s^ItCjdW{p_8$3A#|NJK7xB z?RS(EF||c2W>@}M8E?#uDcd~ZE@gIYpBa_tS*yOpoGG)YJuzC%>rf$+(VGpnu5Q(= zB9UAw+1oPOC5COmd&j8eENi{3Dlv*%rscCdE322hyZ^?QQVLQ$9xKZ^Ds`;0jy3iS z{BKY0#ScoD9gD91xNj}ze`J&0;0C26KKuAa%V#W~ZwyMItT9Sav=4z7{iyD4Hh;UQ z^85Y102r;yFbt(~RS}2IK(}sR)+^73UW=L6?dkfm;V%GkwORojHRp@d_iY-(qBCDW z_ySHB@L1RNk+!|))6=YRZrk?wdCQ**17JC(#SCrHV=v%-`T2!nUs?AOoqPe5%kSNu ztcMVekvYo)VJr92aWBP@Q|2Y(w#EESKutKl_YwRK!*N2poV!eDMFZ-+7wXZ>IJnIO zxa~N<{N8OUAH@?;Xv1Qq?8!P@d)UaDeVHvU!vg8?1qH~f1Ap0t(5|! z6s&eQBiYu`2dbt%7LB*#)E0XF(p-tLyyS1-jNIR%I3^z~%!=E<7$A60&fJ`@Qev** zgG?(X#WajJMVvOwzVyTpsp@JjZpx7wv@}eXXg7G7-ji?9a+X5*HiHB>vQH!t;KnOr zc^0awnhQgJbZ;*t+HTGH#T8>LtXCVT#h{3y7{`Dz7U!Tp3^Fw+^E58W`&X_ahA5i& zWr3S1;jXKQC1cx$cR%`o^W8P=_Eqk_`YI1ze}m7SJmsf9f1AoFE?zvBNt3lGm1*6E z_dfcNu4^b(=%RXlMoWy;O+&X@6MSUTZJ5TucmDLd+`s>TXP-aj;>86gr)S)G?NwsV z1PVWU=WTYO$DFi`Y2*)o_$Pe%{(bH?TdY!i{`46?e)|{v=Y5H&!OW`~n_v#PEMS(;>3u2EU0F19k{?C0-xg_?E6 zAqgN~T-LSH)U~6ZM#)(ZVb%-JaW##l4vOL6aY|gW?d-xl^`o5o*_QobM=sFRHS4CM zb``or$|5!kGw31{L!fRQ*2on9&e>faoZP{k8CJ>gsDFr=Ct4~ca>zXX>@lyr@e0@1 z*PPxt6C<&dSgqDvo?l_L#%W88k{>_r2htcQS`iV(fJCf;A0~W1LMn8&X1v~`oJEm& z_V@`+ZHX~c*Bw>UQoDw#s*$MCnivz_3p1uN4$9&|A^3w&LRQIZ7$6uC7Jip(P$~90SHxjJqCNS(!e~dF|dy z;sbLNeOa@Nl1Q*+uU)S$~tCFaoN}1i$=RHg|JDjT-{DBxVW%SqtufF~YmoJ{P z-|vaj5`7u5S{k`pX=zM^i1(VH0*5%xYo@G&;~@SfF)MNoq;bMnhXGEur}$|?sls8u zqZG*#FCkz7lR*_>X(}aArhXc6*0CQ(`f)-j*;5UMS}TTWqHZcu%ExQdHZ3_OcGo*} zE;wx@%FYPkBYb|~n(M`qadc)~{5fFH%7J$f&D?L0uqDRX*yigOiH3`Cze_(+V?}f~O%rX`;D?a`bu`PWYRhMzeI~Tpl4-k+DP?k9NmO1Dv#w>@ zc|DCZ*6{f1oIxcXK7CBs_xQd?8BN_agd7;dh^-td4b+Wgm`|myE*|Qg1TwHK@ag9N-XE5>O= z)dFO6Z74>Iac|c_NN8P1Iq>o4pYZsjM}(3YgQp+&7_B(jZu#}Eew}XH5o{q>it}+t zZVicqQ3_&V94C?LV9;8ci(@~^z~L}pQ{kjr(M76yQ5xw ziCmk1PTdAc%S~B8N7FP%6EksY7VUdC$J{L7eVMo}^zeoHetS~COm=SrH?76Zdx?7k zUZS@z)9&SW7Onl_+^&>57BIsw9D%uHx33t-@d);tra?P(j1dbV9N+J7IIzUiEz^wK zKu!uK{nBv*N29joGrO)k0{xe@AnK)aI7aL(bdkA%uzY@Xi>kc<;uOWvQr)72EXT0` zO1SAtEv$;=9(HX@iRGn6$8t|#rp(XpxilXZ06q)@>-8EL@=HM{*~Lc8{^t98`-{Ca zGL|OCZC!Yn8v=_@f~%_;K;L*I$e-bOY|?Cz=0cq18H>*I_+D|A6QqQy#lYiuoeM|S z!t$)&0Qi?>4`0;KET3`PU*NVkL5xxyTW61~j2PzUWPX-Jo+6$5rfIOwv0ANYyN>(o zSBbh%H!JxLr8JX9G{#g|ZDhfZ`4}fMO_MY+vgopHBMqXq>+l59GylAD#YkHyMK>|pMHX=Dq7cYe*S{HufED|cTMn~rt9#z&^Sl4 zZHdTt?%wHL3YwFX6V9)$>8Bu*8lySAe~;4#_c%-=rPloE_y04&!lWjOjr{u`{s|jb z(L{-V@iFuK>XKN=HM}|ueE-kB!}~w`KDKt0b;}`n_IONFF_nm|9T@4(TO$j0p6_jp ziIsH(ok?n@TxnVSQ$AX*2(2)eS#K-Pm}TDh(!3!inYb#H0E#RzYk3kUdC@nEyKM9w zDFMm|DA1N&*bze@_y{;c@ZwY-6V4h`%oHEdl_kfCv>*A>y;u0PU-f8j$s(EPPEdst5GEOrE3M%jmq=HmGasU=eq$wnBdnvSRwaq@(ea9M!fg9i^74?S<6 zUl4|o(sZm>9pgCRv{3$Q=NJw>)hiDm&2g=+=JN6i@r)7%Vhl;-3_b`|J_lB9$JyC^ z`hH-yyCMfqjtS)?wL>z_GnJ_zCTd&LR4pNR+P0pD85Mm$kfNAX#gK_HVB3mtm}r}h zuG=u}4rnyj{f?$-a9R_*WHrmPDEn&LG$>;@U9Z`6EA%WIB14!W-izEJA{s6jA8z)RS<3Oi*=&Uhno=ygF@84`UOg>=T9O6%90dw9~`9ZcpFCmm5*d~fUAHCpNFn1Y$HnC}p@3d>*!7wc z=D`gGp97z~c*=B0T#g5D7KLJWeZ^_JrsNT06c~7V@swf;l{2I~30tPF$TI+n(heYN z(a@)oX`I0a&t}!}?8zgpFAqc?BqHTKMyVBDDY%sJ{S_Bimuy_koz)t!ym)es ztL7A@9I(2fZX23)M>dMgT8fXi! z&gGVI_I%7a&)rIEZt33DaymB#ar57WDXfnp^D;L@7JdH>M#`x9_?OqQPM`6KoZHLw z`4{N$FX1iu+_D^J$)zNvRaDmGI>mB`)89Ve4lsrZtu3x{$BA%J8Q0VhW6@gULr@El zH^vZW*YJg|UXTl~;h1~9OoA7Xz5v&St}Y#u8wdFXgf75mF_ydiZ;QFzVv_bn9sO++ zyM;c!<=*=$fnHh~4q-_ESJ&Jtq8Ix+alB_9FvaRNK%L0cohbm<(GaszUg zqVovs=j(D?bH6kaQcBYCZJVRv*loi~95+;WhFl%O4`P*`YW0NT*#K=OfpJ3uyvM}rA+-$<+ ztQFcSvZhp(CFMkkH;jeb=e9IZ@-0HpZH>+CDf`k-(6qbd0UDLfz-{MsAe;Onov$y;x|g&#*ww`<1XfHSaa8zz51slxe-7ku*YAwT}fUr@pXR-S`H zOl(#ihZOnyzw^7CY)>(+rtVfec>Pt-W@ZLRL!??Ys8z%F|NMKr_xVH2Sxc&<(|gDh zyWxP1bK|5qa#iNMF1AwXGMHi$q1W(j}fZ*D#LgEDe=@>akTt8fOU(Fdjx~t!S+ys0ph;YnjRn{YXA7 zl&ol*4(~@ifgBQ5Wd&#>UG}bNBx-A33&~y$ z(jk*{xlWfCmu&Bx^5pZUV*KR9w6SSwuCI0yL!}XIce&9kcH_9MRXm9O&f z!w-1;*&~`tVoFnrq!ec=c;@NTr`&yThl}$|nx^5f?->r`vFTYBDOH$=DUwv7t~WeC zf5Bh==+F86-~VqpIcxatAN?`A7w4R8)|3Ecj=61{ny8XcX{R9fE0!Z`%Q;63K^PiF zbojrhLP=CwghH zjfYWKPu7X1Q(II~RMyf@6Iah(pjz>?SXB+zhk>eX8RuuPX&RWxpU#@jGaM_(5zz! z6!M(P5{WU*`fu@bFvc>gj3t+R&I8}|1D}8Lkdy=6Y9&BA1)NcYTyWNqf}(9}uCFgy zwH+}=cDo%_RnZ>?G0(GN0N7L&{Wy|iz^BB?YR%bt%MX9?HixTgjFxLklxbg_Jc>e7 zRrvmZGlshDFxJtJBm4bc*3A%Us)}KphZXZ)pF`xqoqOClyT|9_XFR^#k@LL%S|jYU z*M>;e-DCP~w%?i_v` zFhI@)r!_fvR!v2vHKfQmiWc5#i&l}!)lh=4ilXelhr_`7l@%#Pt}n0Y_dQx^Dr-?i zl2OdUObd}R*Dl5=R$WIS5vG8$8b1Yweq!t=jCNS#IP80@sjx+{UY~G&agIaixNTDt zrU`4rY&Ol&Z6!mD(uleL;4Uc@QZ7_Rq=o%>pt22p*v;meFbyNCW{pBioR$v~r&!9o z{})IJB_4*fRgJcqVJOtCG@+WdJ`OHYloXh03gT5`Dl#KhOZ0Bt)l4hTAAJA2G^GY> zFj=wfRx|_}G~IT~mtK2~tTPw;OF~-&_@c-piq%3JW}c85CsBV+lR_aO^b@TVch63l z_7mInmi21GQ(JL%vgM68-@r9BmrpC>mYdh+F$23=(#49X^W{4eKB$_Zr@ZQHPJ z8x&e5+mlEww1T^*r>v?qPoF$ycYRI0u}}hW^rSwaQ>OSpiHVpa_wV0lih;IUVY6a= z_Z|c}fGI?#5Ey%jV{DB>r%bIK+k+uwwqIknq)MiNwT&@c<|spSjF`GIrq0) zuEuA?9FIU-Ya_#iBFwTQ=$xn1I4kjO3X+=dm%3%nHrM7^9OUL$Me#9NBq$|`Ot#GT z{I-O7F*{vAc21eLsu`H5tz#NTiDH}^fGMOos_ur;{t{5;uYcVDaP<->zx}7ulGJkC z9}CBQh8yhv*T4P-p#H^Q$|)Tst;e6$swkz4nyt5uR)5oJ{8xMZm%GYSVU$rZMl}sH z<=M;`iz$^fPm?I6#2Am6?zbn(HK>{ox?-Xx@ua%zTb*+v1#~@B5p$JZ?t{8TR}A zQ5xaBr>VsS{|3e9bo|0AnHEn1lym;T$wtl`*!T)qQk z@iNGnJiBt3oTY0zOC$QeKT?;B5=z;Cuf-6@!ju!kDrtu&}q%t$tl0{ zTi?P@17p9#TFce-L@9}r(^JOx-UVZ5?24qpDI|y2T28iSm{mt}a>B{U8OmBr+e$Q; z5qhH4nopm6#vlK|kND9qe~NBvbmho+3K>)a2dR=JPNjk_l4ojF!4JFRrdB#fb-KbU z$$FPtqewYIjG$$bNJjQNqU@fQ2IC>7dJ?*-KEbN|scR(pc+caEVk79B-8#5lg zH)hJO&7v89^2w(>NusN6jKvyD%o$fz_~aS-fjf8Z5T`gtUq+g`qp50Es}(964u}0w z?jzBL;*XG0Vt?rAHft_-SA6*59Bajq)>fKQ5`Djy@B6A@=zG!TAtnsBnI;R{CPqIS z$}Gti;#qP3&Ru@^z5mSHKl>RM7v~t59g8z86uq1%C6hwn(dUm@buB4J{NxE!oWc5t z4}q?&P*FZtQ6MH(P0NeNPx-U&e~+u@FF1ev1go^T5j#r=l5wvP7wJcj9QJ#&aZow(0Bzv9G8dFPS=5Tq9@inG4gnmR9+3V`2Cgn`@k-BPFtv0k> z!=p!!$Ut2+#JDi2#5_-HLqU=!^xSYy6vF8F_HX|#pZwyN_>{?MqWFNe2B+2hb8>$S ziaeWrO~Zh3%rwt}pCX5SKZ6E4%gUsYSyvUq;lQ)QBM#SBq!ebrrg6%MR=AW|&Qz$Y zitG%}o;~Go*fF&OG2VE^^nDKq3nrJ0QBG*-b;FaVPx<-bFZrN;hpWp=N{lGysI(=; z#JcT>Sq$NfRpgM_UGJGHe{7)l{p=@VtZ3>{^MB$}-|u@qeD6IzNFT7@?b+}5+`WG) zfW075fCXwRJ|@P_MzE7dDUBaJITkL@uTV;2WQIbwV4Ajn2S%cMzsUPOXT7xx~-EL2biQpqfTSAiBXgKt!0w28d z-i;ScWf%@Uo353~sFj+{`*D^J)tqcrXk!?LK??7vDaDg~B#eQ2)e=&sWVpDzVDrYB zix)2#4n2PKY)`k;u4bABlrB`2W6D`-6)$YL$~o5SHNndeVI1aWWA7=IVt*}61fwir zoQNt&of8uwdQMMIFcj>(uaNT5TuU2`*3wqeAcnIuvr3q2g(-~;hfx?!`w`W4l(P=C zu7yF>)|_8m^5wJF`SNRT5MyEMYVNz1x88V@x?6Ggbj$l6e@HZtD}|{YDF#VH$wjiX zwL&>ZZ7ng*wRtXN5`Xl^f5gA~oqxu!{pvS(?ZF!;?eH-XVrIMQxc|y4y!YNO`QtzR z545Z9mI2u87v;owSk2#Ml{BuZ7^efaGCaFH=PO_PDz9wrqLsxeO~1RsIfJb$RDz%W zvdeb%QZTs^+x{Mk8| zmpjRD2gco=fAl-Q$Abs=sP1oh60Uf*dx}_R8VZS0WKGE_GtKL0Dut?R&_;9b-YG5> zF3vCb*Z=Zg@#gkbRz?Ou&tJS?7zVo4if{btukqkZZ}IW-bE@4rQ#0|GZ~qy7nlRSl zL!de7&~ubs37J%qNLy0j-o1Og@#dR6efKG!zWWJ%&P+4&GmiuR+yC;f$)&J8^fX4; zbW`vsE9c-$O(KiKyqYnP(GYLpf(6LKONMgGYmwIG*{flxN6OJOb$*_V0Arcz%loF8 zwYA7(ON=uvQH1kz(W6fjYP&hI6~FkBI+>d(x>A3oJ}&d1Q)rDd$X=Lu^YN8Zjs|#3 z{h;OvTq*e|e=Wxkn;Edn)c*^EwZHb2^A|yWku3UBQYuAj$~fn^uj=}5m&P67;^I;n zE8hMg1{IeHbBZOUG8+#l$S_TwQotBRI*nqbl@*( z64Z@${Pt8j=W_h}(y3plk>1PC8)Ih>A4U69HGn1rnOOIIFJQ0lZzfjUOt6<}@M6dZ zH{jRI-KyG2OxOZ?r}?2F-#8zNMuelz$r*bD%1S8~Xa3uq4t zLHcd>z|yE#j(Pd_qbI;@?3crhHf3pc+}>EmX`*S{BU56LJt(CZrwLol?)0+^vP)Blk7jk~!RFbFf%U>KnTJ7hlT+ z9{4Nl3eAmnKISCa)cMu-J=@bWUVY^i#*#R_f0v*A@&hjR2M+rkqmQh*nlX9$!w%J2 ztQC1kQ&)^dDCjW;x~4(T8*sjsgF$2vC@rQlAxPFb(%c#SUM4)1V;B6fBdc#|uvDBq9E?E~82jOvw`z?c&qh?% zwz9d$C=yYGzP7l4UtM0(G?hdU#>8&u#Uu~NSvuytm8|35d!{VFyz4qrgpi`dSt;p6H+7BH92qIEJb1v_*%|M> z_Z~(oYFCk>I12~wMc21l;hbZ?+e@aewF1I?z_}Z?4l^B9Kp)3-sjVxdIj%OUxpHn8p#M6~Rp?CF`Wtnv07IkxJP_4kA;rTHl%qh?(Ex&mS@N zJ(n+Dp!2*Z6miYgN|95hF*gyA<1k`Kcs~-o7rktftoN#_WO_KWbZYCEa%9{cP~NaT zJt2q0kP=x%(e&nsHI8ro#kYS`^|@F^Fvk!-@ zDoPA!WeB538PT45A21jmefEUyc7xXP3^aAeI1Gd!*Re8^ovvnjXpWi7^Gp0Z(I#iQ zN~VEYDNse8HD!*5Xr&aAmuSi8m%U)3t(tkeDOfa_BG=Vg#_7O&Po5Kpk=j*~4lpyd zg7;`d&s|CqH~d3SclV4qd4|4c)vk##F%F*V>mAlQF~rj{oij?2L*$bWKY~)YzPx0! zSyQ`Knq5lntJT8bkXnbMgl-r`QaDW$ZL=ch!gTO7t|QHiAUkVkFE1~-zPJ`s)groF zQxr|rptYobL>-RnY*p2CuEiNA5}#6#9$%)`HRFDusVW&wCJ3WvNC(DV8VRm;LZzM8 zY^4-g2}`d;*}E6!-?7;e1rDhs@`K%#7~5K982gcFh`7q&?rt$kSTVo(>%YNQ?|q58 z-3i%8(r)05lRMnMa|hdXeE#GqKlrmBVpa{=dJdt-SfMXF<(Pu7QjInkYni;qI)`Mr%RDi|Z0 z_pA%0tNC|-@`wD7fB(PZS6_RJDjV`J@ukx{VnUlEzkKJHeE88PsLH`4k)FHjL>wk! zDXhDWu5DSj9okwx_~c`X(u~tYr45IROWyd>m*`e2e(>H8=&uJZFLtC9&}0aK-~R32 zW=)R@H9N*`udut(YU&zsDNv0c3$FTmqA`t zIefUJsvJ#I^WKw3oL^t@Y&;MUDNPv$s4T-_hjN-1SLgKOKnxSsi0srEgHAH*4KYje z$jlRTrAoeR=>PyA07*naRFQZ!j(^WlQWj7%%{wzUG=MD6td8>hmYm74%uM{*6RU8O z$6mw$F3n)JAYMR6IZ!Fmtlw;IhFCN0U1=%5q!^Z=6-owNFHN&q*r@a8Ep_ukQ$JGe zWuUUKWS3)G7y&nZi@E+@qy%52)a#e)^5by`E%vX}>@WT7@|T?c-+t`B%Im)vxNkNU z!)O`C;Rw8zKV!)f>Eargds2!&Z0g4qV{{CPA`*a=bUtfW{`VZ z?>-CyDsDTGFQD*nm}J_R3)AH1DXTx4x@j%(a_jZ_NUevPc(dCYc!_{1$LalI7#3q> z7)Lgn4R)S7FaIt8emsJ?1%NLsfn`y=t@&Th?WP%VW9Ifn=Xv>=8x1+!39&R4 z;0ClW3-IxLvpCs%?@>mY4SoR&F$#UsIjXvrji43~V`u$~Ybw^x%z9ykrO+ra+DZ0% zNaAEaPwf}3dx$qNaJO~+e^o1UlN)#ilfyDM~K`Pql>P@GJZrfE2;p{$YVq)d+E z{OruKhsk4G(WQ1(O;F&+35(_Q{+3^P>uY@d!CP1#a3zTobewP+>Pn_4r39+VvD&Qo z{PAOc^y9xErbJg&Xl;lEunyNWY)?+Pw>e|oZOBDoR~=K%$B7%I&~_bfeC=y|`TFbp z+yD4~GYuZsh%u68?m&}4gD#p9y+p}OUh?iWV(j7^DS9c!l_sZ%Ef$rEOxqJ;W@9DK zxs;4Gjua!7TDtejGWluw5=cR+wU`?zb@WXrSsHOZda71r|1Q+nxS zi{V(A!D82~nfxFVJqy-~F7EvD97z-r9jP;RUT>vq?VO`)8ou)7xA^?C<y^lq43< z8cktlTFw3#Ig2LOhe?_YGu1sNF&fpz&@?SmNcf>=yWNULTFHc<22B; z4bB-t@NBj#F0U?Wn;JikGh4?}=2VHgm4;NiUeRBToSdCu>|3APe5)I28)2!$4E zYnf(m4QCz3NF(6RoinBs$q~^mLuvd*iHlc2KZdGmIlj%hcBzF>#yx zL@5drHQ)L>zs_&}=5Mhd4*cMIKcs6rVSZUh&Y~r)YA1WZ%f*6LwD^471sjvq$4 zs$tI_QxH}`WB7Wyq>9dXE?<6)NXY7NLcPOjEan5JhJl6O|RS zN4q4?6v!b{RZiBknMQ4lL1&>XhY(n;R;<@+uCA`As|Ka?k^N9+$y^8?t2IU|oH4?> zNr{pol`$ye0QpWB<47TrW^>Pym9Pw4BNJXF22MVjTOU`*`q?W(LA3`Z-3j z!dXYk0i`(BG=3VX=E&7B1+1>grO?(5Ic1!7SZ(lw$0DqrezzwlnNTSZx@t^}!@&Av zO)8Sspl4ZB-$zO=vi2*HM#Px$(*$_Yn`?#Evv%B8#A%|kR{Q}bk26LV!B~4#pV9aiD5yrjU4aeZ_Zv@O{o-ea>&Z^$qT}Ym$%b_Sbyy z`DY9{f--cQEhhHtUOXoc5$!Xkah%<~Lv7`G`~2w>iiSAXdj&}y3rX02qn`*dFisQb zf^#BSs#Y~oNBVK#($)MROuKDKB@t7i(uUXHc$3K| ze))@c`Sjz*Jiol;>gt-5BH#Vt4>&nHW^ zSxTB4N^|pn90$;fZnNUf{Y>f`4t}I$g<7>Dy{avbE}rw*(?{gZ92cp?taYiKOHQ+q zn*el_dbt)=674KQ1!0tBDNHGGu2qY~yJj!Vv}K^El(^96V-r!1p#Zt$qwZZxcbz;6 z&I)x+Q`h3*afG#BnEWe6o*TbMtZ}YI-2 zEi*EN;yFw=I+ev;ewp$gAJX|8jWIAkL<|`9n?ywwoV{uI+&;(SHOLt#k^`>(W)S~3P2`Q%RF#~2vtIH3`ycY~;X~ef>#N+k zd&c(Omg`}Fx?!{KsGKbF&Kcf(^L3idiof{fUy^h{i}YCE~Tyhkj25W^5 z7$d4Up^^siMaXCfnRV0h9dgI4ndxrp9yeX{2Fe)sqI z+1tP1{CdZkvF!If?db`A?6FGocYftpxw|@{R!&S#)@!CDS@kF|1+pr1cTc!`eTQAY z=ihzj57E|PoI|7VAqwa&Nj`syd!@L>K69!!pDo0EP zZH*WSg~(xlz*tQfCqP`uQ!dAxczM=luLi4SgDDV##~A@4OD`#;B+o)D)OAaUo|Fn# zS67^!Y{ab2dz!jMDaGa071xIyt4^Y|oVEB-T*!xM#9B=VnTMY|6sq_P+-heyj1zb7 zoC-*8Dz2`sXxdhExG|%(5=U#bu!!QZF!tUP^9@_5t{i^qDJhVHpEJ-!>uarmKY5BV%rTQ0r6fW5 zwwx)1z>60z*t887eUGMa*zZX}Xqd-FbIGF1%{Sf^Rw=?1nfigD6soqO%xt1p?!L}9 z|IRmQ>joc#G`ds4xf)8Qo*U812-C;TAWLg`1^`}p@PJ33e$INeVtD?7Vc*NNSZj1H zSglA2`u>1L(Nq;qFR3mSgP%w#OMbhxk~xg%uIsuHFg~v-0zl{If2NqKEbj2qvlD5C zP(NkDyLg72o}RKJzdvftY+AcRJ9}POo(3U zvjUZ|pde;>-lQp0Q0B(u)*6vqVxj&K0klXGz7M`p(~0QJ*W5X(^}2o6F!XO1pY9=khpVthB;}-29j3n z_B;A8i9|}z`&d$#%JJ~ihrD_ADsO%1%RK({3A@Xl&FKbhBj5PiTNtOQYRgZ4@Ds*3 zVjD+t(rmRxN&KEMsBCfTma6SgIq?55_g>$YWcPjFXUD2K=iJbJyL);D6A%Uj0T84~ zk)mwa3<{RRgT4IV2m257vZW`>A}LW4Axa`a0V0F}2?7KLlQGlrh7&665GfjV`vZ3#+-En8JifYNDv*>#xrS0Q&#$i~pTug~ zRmbyZk9qXTCwT9%wqU#?Sw$#`X5A4f7-bo!fz_%dSjW5XzRTtH6)(N~GB#UG(^0f2 zHHgTxte;EU8A)HoybZt9%CY`8)O z-%{sZs#^GXo;voi|CKZG(fc|6pE^1}9}C~L)})#ITjsUf^Y*M1_-mi5{?0s0%yZcB zYgF=is95rU(xDxGmchMNs2Ob-hEWF7Lr)(9SxLt$uvD7O|D4(H*)u*@vCRykuN|^4 z%HQ)M^`2SdlJfFcz!G={w_$WMC@}Yq&qLjMy{^*vsRnv=i!{G!+%go-m2@+ZFn^iW zT0ygqUc0FW%WfqyZD$?({k{gODUmEvJ1Nm9B_U|DC*9OT*&Mt!zrIfoqzlq>1ZW(; zu2OD;BW6Hkmfn|AXzPJ4tJ{n9_&}H{b3Fg|Sy7;AQa^HWdWJ2aOTs!w3?r>`42LaY9Iytg z(OeBZ*W2e@J$ue(wdVQNHM{FQXw9(QQF5Xw8m35~=j^1xb}cuD1C95XqH4X8d`~LE z{na_Y@^fG18~^GX3_)1QJW5w_IVFlJb=_`h8qf1*PemH*{Bn;N5p>TD5%^8}L^+xswok{gIQ)R@)IGT3FZnv)kM9bI@csEO#!=i%m zwRgRgA{ib=B(X}H8Voft^cb4?n1u|334b4Mc66of%avhFQ=l&K zlp~o;$puq^Uu6Zz=zJsBaw-hNLdBLnQ%=_>tU6&4jWW2#v+EC(B156Ih8Rbz24khNPgfvG z21fyyVvrQMrcGY6%*yWQno!y=Fw!>5PC1O2C_vvt)r7%ali) z(d04EI?v<^W_`-{e*71F{|7(BDTj-NjbHIgU;HvZ_xk7PI?wBGewOj+W8Q!7QmXoV z!McVi4!0q=DWROSWRy}QV+ojsfj8fLlUGk)C0-8f4-+4M@{HYf%c|>m`Qbwz-n-!9 z^o$>U@Gj%cV_f#+1lBqB`vb16jY-;&RVJiN+co0r)|&J68DDt#d74Qx?k4)I(8|(u zo>yM`46XuQ&p)_g+U?09u-IQ4G$hZM43WNJzxCtn?#fN(MRv{laJqHRFUSSV<50;Pb6QV?uTix6k~~2 zVNAne>Pb1GwIxz`a&tv`U2%T*4x!JiJ6RXD*MVRAwO?bsTH(EA-yeAU-M1;K;9D;p zl-3Y)U_`ECAp%6@5n^O>dd8C{&-s_%{MY;szy5c5$-ct*exz+0lr|`%P;1XO{_P+0 z<0tRK+R(?Itm|NIMS&!qqguaMt+(?Yonl(f8PpkQuJ1HTiNdf-<*hcTkVxYM!vG<^rt zp41K9GED=G_l#kZ!v@k18)KBt(~?m|h6u4&7*dKDBdNpAdxm;oDy1xJ^31-^p6nSw zkRULTnHX&eQ{?RAjDlRuVGdj<^V}^6s&^7VWox3hRT8Yx7zwR8?Dr@%T3bR4BGIv4 zQiYwR@1;&h7JS1rjTq-K&MyA;Cz$_GEV9~BpKN+?|UBb=YLL7q~fKr z<+nhJu;7BAQGG4)e^U@<9t9~$C01Ljf1I(E0h$E0GnzuKgSz4MuEk-Fq7%|omq5v4qTdBAz3T>2xO~rz@hC;zwN#+knN&wm54Js?FmM&XgrK|n^ z0Ej20m9 zvquP>64|%b;^}qHqtq?BII9TeAwH!!&@s@iTc#itPJMr1x4q_fe&_#Tj6JSVeDd@$ z|L#xzgy)YR(VpDp+2u9wzW)JV{K{A8&dwl;3{DkcXQZM`filEYpj5yt22@Ds1THD| z!+>i<9+hK}z`P+)`ib+dLk%P2u;)jA@#lQ_!FzbEAVnVBzu=XJFA-zpgO5I>7&*%6YQ-=A`rl&Z z8t!%HxIr-)sq<^lymaSf38c%J4-NyvVZ?T8+-imCTE-%kGuAp(DdaSvl7=ipJCmXD zE6O3rVr?|eYo_6Vat>=9V;t~ZLkJTp#JZ?U0((fZ)?|vHv>||Qi8 zC8NXEL!kE!{h=pYM;HSqn-zyD^-a3ozglCh1iXbHa^4gqEK1~ZmY9Tj)VfLnr=hY& zNs#yuaJB;!QjaK1?GyqZe)KWpI53O}Qw-zOqpN2*$B5B|DfHOt`PWL5qJT8}{a$hn zVxVhIh$YfCa>%}Weuu;1K#CcoG;Q1Q?AbG{HH_1UR-O=~$2X9-|cA zS$0(kB)}@m+M$(^PU;LPWRfX3Tft)rx`G`!R02V3N-A`|6Go#XR956X(I0j)5NSmU zQT*(6ZH-fq&vMF(l1gk?wJOr6+D8k+BnR7*P0NT32J4dzAxH)cDv|O?QT6eaC@-cM zguM%5qdDxhG;ND2g~MULfO%2{X#gc{C*Gkbkmb;BjA582Vo0pJ4&QVf>VZantd zw$;Q#MCZiHH#Dm|?8lL_volUl*4)2$k9+qn_~G|{zz}-UG*PCA>pZ@-w_vo991ZO( zuJw#zsDOxK?1Qk5eNRw^k~IlYg7p2wVHmNtWxpTTY)-4%v4|CF)pGfKM=AlOGljBb zXvA1S0wsslxkotEb_ruF<1jLX10THi5pRC3W8Ix_eYr;)%NR0RJ4*Fm=bWltLpH@s z!P%-%2*S)OV=&s1QY2*oo|?81AUlE#w$i|nQxR6oRE9Jqx>j;^B)=qL-R<5dSrFn2 zANHc?G1@T19$S;|+g9ZF#wAKtpcU48!Z=cDdb_cfQ1cg3iKr@_Eyx}pg)Bk<6A;0+>AR}=cj;9@M!yl@4xp0{>R_`Z#g|b=fUcN@h5+ZTN#oP zKucRIDw$H``wv0RaV2A;K}P{4HtQ3NahSGnaqoitVdP}h^5Y-;1@}+ZeEExCWb>I< z!CSufhi}uJbZoEo(oybO`l%-+sR-*!AZvp)iZlc)j=%F;zrh20g6$(=*K^`Jh#8e( zz4mA{5AWXL```O6;pQ4rV0G`DAq|)a!)4F7J5ZECYsJaQ8P0pgHe$LK=QJPpm%M%T z5wG2Qz^OUoCDSq<_Gq0kYt2uup78CT{2A};9}&(R*=cmiOeJEyBR8sstT|#T7;iXC z16d_pYuWdr2>a2yZ}Yc*{Wo~!E~H_k2jWo|MvHIdi4x@ zr=dA-7~;T?25_KqA@m0sR+Th^gc!&vpf@dl{=tv=`LBMJ*YCYTb0%Sa+E_wK{F}f0 zQ~u!3|CnnPNR1)uL@A<(%aoeX9>GYpiBi>CTkW|@D@rQlB!9;!RdZVb_Pg8KP$}!OWr6^I$GYpIOPBt5qwjBU`W>$ZwyEstPC)Jgk*e zUMi(gHHZ?5D*E;j=EL0m&8l$Cf3lySVQ}~2F`FjN&d%6gU2`}bIKO*`VHi{xr-F00 zJ>tm1J+s8KpM9Dp)+_0yU3HzjsMaw%b7VvMv+TL&3o`m}!0|89)1F0;gUu5|uF|A^yHIE-Zmfx?#RmxJ07VCwpVX1X9*2;!pgyERV zNGXE!l#(eZ`hK_t8k{3$si4wFtm^#wW}owMQn@yB6~oMS*RL|`<^9gpck_=(!oxCn z4#Ob6&~e1tD!;GKH9w!N>92Er%dAi+xzIGyPw%}aMHwVwPNW1FF!na_z0|b%QVP_6 z&Xp7M`zWBDxNjRJ5&V3Fjg!+D^i`!ZZ;>6rCa((tD#FbpH6nChXOZspEOR0rLeJlX1nU4 zM4nHOx?E-R^EEw(3(oBOY>xosdr&omqyDZll9qXOb;a-h{_nHeblknWVTdCsNWyZQ zMwIbr;JtU=<;|~t6{8HwSy-1{u zCus=;(mCM`y#3CP`1Zg3H=L~3sMa$a_Qd{%U;mX~q#t_r`)mI3@BS`VH(So`T=3=_ zpXKcA4q7|jdh0Dxj2xal=gYtGTaYtd)9_FJ=|AO_&%Dg%Uw?(o**WJI7yR>Y{2_1s z(I4`)U;SmqDbZ?+&6+$U?w#M`mw*0CT&zwwaVI!ux%|Z&ZiX$t`;9-~;b<9fmH+@C z07*naRQ=a*t2NpyUV8lw-~HZq=nn^4<(bAnygBgFy_b3T>H|J==K&kvVwC0EfBJ3S zdH-!}+fl3~SKrhW0%mQ=)J;c=hglYOBuTdvxm6VshT{ZmENG0iB9m1DN+~5?b)^;2 zIh?krrbQt>@0{eilbNj4d&sa_ok|!|%xG&!6@1HCVXUSg3EqcZ27oy^U4w+@IY%mz z${#{te>m{?=`+Sbnmtq$x%V{ei6N4*fS1;4jM0nwMpQX+ZF^@Jvv{CwmC_z|JEj;V zN1}*??&jvEN~0atc=r1NP`A=KME>fmsq2VHa$^u=KcqpOuoChJmy5Q&5`ieuvUd299YG zi$)Q4TO+`(Fgb>CinK*qBuJ55GMm#i-}=tCP$l#AU;cGozW;#V{>|SaWe7?X0PCjV zWV7M?WW$4t2Ryxe!u9qNtuz+Rq3?P8=m`WlgpFasILnv#*-9v{GC> zzu`yWZDK4K?dXRA+cY>Q1H&*Jmi1Ty8fD;>e)AP5jdcwL7{_guN{Y;Nk?}Jx2?k{> zVLV{0`1qw7N_^ZR@00^&rieXawud1g9EGYHlY?){32h9+81T-Kvx3@+k&-Z>(t;wk zE@7xd?i`ZX8FR!)En&CDFqAoDwF+YEem0IH z#@i*0T!I88gFt1em^+LUC1<8Atr)`;uv)T5KuMQ<8kvSs)-PR4n22O0s-c+Y4r(C< z`o5PCFRcmFT;~Ku2Xavo(rEdk95W$Dw6!Q}>8z#S55m-g5F=fSiHVRU?*nVdMwEReC!S9`!t==Q{Lw!{Db2;} zpW*$-?_utoqO4}z9wa;uB{mE#Z3WtStad1Afun6Zyl>d<_I&c=_lU*t(#sFIdVa<3 z`kJSoJYxUwA#K}YwPL%y2Hi5{KtD}vT4^~bHQhg{LRK(_u?8Dz9zT7=c6vk;3Sqm$ z6b(h;P0J_GpWuq+r|-Pa#~;0qF^Q9t6?j9M6vOqN6cQRsKTh1ae?fP8M$wvL41JF1 z))9;1Uw-$SoElF)446=8jA7L|u68#J8G2pVwuM~PUd9=`wru+ycHN@1A!;EDvl3~$ zF;)(%S}b}`pFiW<|L)uT>g!+T^!{C5x_coQzPDW5J?Gnh{7pXm_+y?PZn$`G4|Ts| zuST{v2b8lM#w~e&L+X3ny$g(W6(lx9Ed%y-82BgO`UdCi1~(PbDEUmbZFqe3oM&l= z>KsEFF^xm#3I?Y_{Sw4`Z3K*y?4?SS8BzF_oaJ7r|7})GElVKFSc z

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

MN(nMeB&2}r96knAmTvMGQXR>vqC^$~ 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