summaryrefslogtreecommitdiff
path: root/bsp/wch
diff options
context:
space:
mode:
authorcharlown <[email protected]>2021-10-12 21:27:39 +0800
committercharlown <[email protected]>2021-10-12 21:27:39 +0800
commit0ea1fac551cf8a7dbed10de49fa84801c4c4f723 (patch)
treeb783e7de7c1c3b781e21af5644fad56f77361c18 /bsp/wch
parent06fdc108b420f34044a132a19c9adbebf86a7a90 (diff)
[bsp/wch/arm/ch32f103c8-core/board/board.h]: add macro definition.
[bsp/wch/arm/ch32f10x_port_cn.md]: add ch32f10x_port_cn.md.
Diffstat (limited to 'bsp/wch')
-rw-r--r--bsp/wch/arm/ch32f103c8-core/board/board.h18
-rw-r--r--bsp/wch/arm/ch32f10x_port_cn.md200
2 files changed, 218 insertions, 0 deletions
diff --git a/bsp/wch/arm/ch32f103c8-core/board/board.h b/bsp/wch/arm/ch32f103c8-core/board/board.h
index ce0408bcfc..a606f4dc03 100644
--- a/bsp/wch/arm/ch32f103c8-core/board/board.h
+++ b/bsp/wch/arm/ch32f103c8-core/board/board.h
@@ -45,15 +45,33 @@ extern int __bss_end;
rt_uint32_t ch32_get_sysclock_frequency(void);
+
+#ifdef BSP_USING_UART
void ch32f1_usart_clock_and_io_init(USART_TypeDef* usartx);
+#endif
+
+#ifdef BSP_USING_SPI
void ch32f1_spi_clock_and_io_init(SPI_TypeDef* spix);
rt_uint32_t ch32f1_spi_clock_get(SPI_TypeDef* spix);
+#endif
+
+#ifdef BSP_USING_HWI2C
void ch32f1_i2c_clock_and_io_init(I2C_TypeDef* i2cx);
void ch32f1_i2c_config(I2C_TypeDef* i2cx);
+#endif
+
+#ifdef BSP_USING_TIM
void ch32f1_tim_clock_init(TIM_TypeDef *timx);
rt_uint32_t ch32f1_tim_clock_get(TIM_TypeDef *timx);
+
+#ifdef BSP_USING_HWTIMER
struct rt_hwtimer_info* ch32f1_hwtimer_info_config_get(TIM_TypeDef *timx);
+#endif
+
+#ifdef BSP_USING_PWM
void ch32f1_pwm_io_init(TIM_TypeDef *timx, rt_uint8_t channel);
+#endif
+#endif
diff --git a/bsp/wch/arm/ch32f10x_port_cn.md b/bsp/wch/arm/ch32f10x_port_cn.md
new file mode 100644
index 0000000000..ff0f3d9313
--- /dev/null
+++ b/bsp/wch/arm/ch32f10x_port_cn.md
@@ -0,0 +1,200 @@
+# CH32F10X系列BSP移植
+## 1 工程结构
++ wch\arm\ch32f103c8-core
++ wch\arm\Libraries
++ wch\arm\Libraries\ch32_drivers
++ wch\arm\Libraries\CH32F10x_StdPeriph_Driver
++ wch\arm\tools
+
+ch32f103c8-core为移植到具体芯片的BSP, Libraries存放的是厂商的驱动库(CH32F10x_StdPeriph_Driver等)和适配rt-thread的驱动(ch32_drivers),
+tools是在env环境下使用scons --dist所需要的依赖工具
+
+### 1.1 已适配rt-thread的驱动(ch32_drivers):
+现已支持以下驱动(支持的驱动,使用到的宏开关,需要实现的接口):
++ GPIO
+ + RT_USING_PIN
++ UART 1/2/3
+ + RT_USING_SERIAL
+ + BSP_USING_UART
+ + BSP_USING_UART1
+ + BSP_USING_UART2
+ + BSP_USING_UART3
+~~~c
+void ch32f1_usart_clock_and_io_init(USART_TypeDef* usartx);
+~~~
++ SPI 1/2
+ + RT_USING_SPI
+ + BSP_USING_SPI
+ + BSP_USING_SPI1
+ + BSP_USING_SPI2
+~~~c
+void ch32f1_spi_clock_and_io_init(SPI_TypeDef* spix);
+rt_uint32_t ch32f1_spi_clock_get(SPI_TypeDef* spix);
+~~~
++ I2C(hardware) 1/2
+ + RT_USING_I2C
+ + BSP_USING_HWI2C
+ + BSP_USING_HWI2C1
+ + BSP_USING_HWI2C2
+~~~c
+void ch32f1_i2c_clock_and_io_init(I2C_TypeDef* i2cx);
+void ch32f1_i2c_config(I2C_TypeDef* i2cx);
+~~~
++ WDT
+ + RT_USING_WDT
+ + BSP_USING_IWDT
+ + LSI_VALUE
++ RTC
+ + RT_USING_RTC
+ + BSP_USING_RTC
+ + BSP_USING_RTC_LSI
+ + LSI_VALUE
++ HWTIMER 1/2/3/4
+ + RT_USING_HWTIMER
+ + BSP_USING_HWTIMER
+ + BSP_USING_TIM1_HWTIMER
+ + BSP_USING_TIM2_HWTIMER
+ + BSP_USING_TIM3_HWTIMER
+ + BSP_USING_TIM4_HWTIMER
+~~~c
+void ch32f1_tim_clock_init(TIM_TypeDef *timx);
+rt_uint32_t ch32f1_tim_clock_get(TIM_TypeDef *timx);
+~~~
+~~~c
+struct rt_hwtimer_info* ch32f1_hwtimer_info_config_get(TIM_TypeDef *timx);
+~~~
++ PWM 4(timer) x 4 (channel)
+ + RT_USING_PWM
+ + BSP_USING_TIM1_PWM
+ + BSP_USING_TIM1_PWM_CH1
+ + BSP_USING_TIM1_PWM_CH2
+ + BSP_USING_TIM1_PWM_CH3
+ + BSP_USING_TIM1_PWM_CH4
+ + BSP_USING_TIM2_PWM
+ + BSP_USING_TIM2_PWM_CH1
+ + BSP_USING_TIM2_PWM_CH2
+ + BSP_USING_TIM2_PWM_CH3
+ + BSP_USING_TIM2_PWM_CH4
+ + BSP_USING_TIM3_PWM
+ + BSP_USING_TIM3_PWM_CH1
+ + BSP_USING_TIM3_PWM_CH2
+ + BSP_USING_TIM3_PWM_CH3
+ + BSP_USING_TIM3_PWM_CH4
+ + BSP_USING_TIM4_PWM
+ + BSP_USING_TIM4_PWM_CH1
+ + BSP_USING_TIM4_PWM_CH2
+ + BSP_USING_TIM4_PWM_CH3
+ + BSP_USING_TIM4_PWM_CH4
+~~~c
+void ch32f1_pwm_io_init(TIM_TypeDef *timx, rt_uint8_t channel);
+~~~
+其中需要依赖定时器的接口:
+~~~c
+void ch32f1_tim_clock_init(TIM_TypeDef *timx);
+rt_uint32_t ch32f1_tim_clock_get(TIM_TypeDef *timx);
+~~~
+
+
+### 1.2 需要实现的接口:
+除了使用上面驱动提及的接口外,以下的接口必须实现:
+~~~c
+rt_uint32_t ch32_get_sysclock_frequency(void);
+~~~
+## 2 构建具体芯片BSP
+以ch32f103c8-core为例,在ENV环境下,使用MDK,至少需要准备
++ ch32f103c8-core (具体的BSP名)
++ ch32f103c8-core\applications
++ ch32f103c8-core\applications\SConscript
++ ch32f103c8-core\applications\main.c
++ ch32f103c8-core\board
++ ch32f103c8-core\board\linker_scripts
++ ch32f103c8-core\board\linker_scripts\link.sct
++ ch32f103c8-core\board\board.c
++ ch32f103c8-core\board\board.h
++ ch32f103c8-core\board\ch32f10x_conf.h
++ ch32f103c8-core\board\system_ch32f10x.c
++ ch32f103c8-core\board\Kconfig
++ ch32f103c8-core\board\SConscript
++ ch32f103c8-core\Kconfig
++ ch32f103c8-core\rtconfig.py
++ ch32f103c8-core\SConscript
++ ch32f103c8-core\SConstruct
++ ch32f103c8-core\template.uvprojx
+
+### 2.1 创建template.uvprojx
+新建名为template的MDK工程,删除多余的子目录target1,将目录改名为rtthread-ch32f103x,options选项栏device设置具体芯片,user编译后的动作, 如"fromelf --bin !L --output rtthread.bin"
+
+### 2.2 编写board/Kconfig
+
+~~~
+menu "Hardware Drivers Config"
+
+config SOC_CH32F103C8
+ bool
+ select SOC_ARM_SERIES_CH32F103
+ select RT_USING_COMPONENTS_INIT
+ select RT_USING_USER_MAIN
+ default y
+~~~
+SOC_CH32F103C8为具体的芯片,SOC_ARM_SERIES_CH32F103在Libraries\Kconfig下已定义。
+RT_USING_COMPONENTS_INIT,RT_USING_USER_MAIN为rt-thread设备框架默认选项。
+
+
+使用适配的驱动根据宏开关编写即可,以串口驱动为例:
++ BSP_USING_XXX
+ + select RT_USING_XXX
+ + BSP_USING_XXX1
+ + BSP_USING_XXX2
+
+~~~
+menu "On-chip Peripheral Drivers"
+
+config BSP_USING_UART
+ bool "using onchip usart"
+ select RT_USING_SERIAL
+ default n
+
+ if BSP_USING_UART
+ config BSP_USING_UART1
+ bool "using uart1"
+ default n
+
+ config BSP_USING_UART2
+ bool "using uart2"
+ default n
+
+ config BSP_USING_UART3
+ bool "using uart3"
+ default n
+ endif
+~~~
+
+比较特殊的定时器和PWM驱动额外定义了以下宏开关,详见ch32f103c8-core。
++ BSP_USING_TIM
+ + BSP_USING_TIM1
+ + BSP_USING_TIM2
+ + BSP_USING_TIM3
+ + BSP_USING_TIM4
+### 2.3 在board/board.h加入接口,并在board/board.c实现
+使用适配的驱动根据宏开关编写即可,如串口驱动:
++ BSP_USING_XXX
+~~~
+#ifdef BSP_USING_UART
+void ch32f1_usart_clock_and_io_init(USART_TypeDef* usartx);
+#endif
+~~~
+比较特殊的定时器和PWM驱动使用额外定义了的宏开关
+~~~c
+#ifdef BSP_USING_TIM
+void ch32f1_tim_clock_init(TIM_TypeDef *timx);
+rt_uint32_t ch32f1_tim_clock_get(TIM_TypeDef *timx);
+
+#ifdef BSP_USING_HWTIMER
+struct rt_hwtimer_info* ch32f1_hwtimer_info_config_get(TIM_TypeDef *timx);
+#endif
+
+#ifdef BSP_USING_PWM
+void ch32f1_pwm_io_init(TIM_TypeDef *timx, rt_uint8_t channel);
+#endif
+#endif
+~~~