|
| 1 | +# CH32F10X系列BSP移植 |
| 2 | +## 1 工程结构 |
| 3 | ++ wch\arm\ch32f103c8-core |
| 4 | ++ wch\arm\Libraries |
| 5 | ++ wch\arm\Libraries\ch32_drivers |
| 6 | ++ wch\arm\Libraries\CH32F10x_StdPeriph_Driver |
| 7 | ++ wch\arm\tools |
| 8 | + |
| 9 | +ch32f103c8-core为移植到具体芯片的BSP, Libraries存放的是厂商的驱动库(CH32F10x_StdPeriph_Driver等)和适配rt-thread的驱动(ch32_drivers), |
| 10 | +tools是在env环境下使用scons --dist所需要的依赖工具 |
| 11 | + |
| 12 | +### 1.1 已适配rt-thread的驱动(ch32_drivers): |
| 13 | +现已支持以下驱动(支持的驱动,使用到的宏开关,需要实现的接口): |
| 14 | ++ GPIO |
| 15 | + + RT_USING_PIN |
| 16 | ++ UART 1/2/3 |
| 17 | + + RT_USING_SERIAL |
| 18 | + + BSP_USING_UART |
| 19 | + + BSP_USING_UART1 |
| 20 | + + BSP_USING_UART2 |
| 21 | + + BSP_USING_UART3 |
| 22 | +~~~c |
| 23 | +void ch32f1_usart_clock_and_io_init(USART_TypeDef* usartx); |
| 24 | +~~~ |
| 25 | ++ SPI 1/2 |
| 26 | + + RT_USING_SPI |
| 27 | + + BSP_USING_SPI |
| 28 | + + BSP_USING_SPI1 |
| 29 | + + BSP_USING_SPI2 |
| 30 | +~~~c |
| 31 | +void ch32f1_spi_clock_and_io_init(SPI_TypeDef* spix); |
| 32 | +rt_uint32_t ch32f1_spi_clock_get(SPI_TypeDef* spix); |
| 33 | +~~~ |
| 34 | ++ I2C(hardware) 1/2 |
| 35 | + + RT_USING_I2C |
| 36 | + + BSP_USING_HWI2C |
| 37 | + + BSP_USING_HWI2C1 |
| 38 | + + BSP_USING_HWI2C2 |
| 39 | +~~~c |
| 40 | +void ch32f1_i2c_clock_and_io_init(I2C_TypeDef* i2cx); |
| 41 | +void ch32f1_i2c_config(I2C_TypeDef* i2cx); |
| 42 | +~~~ |
| 43 | ++ WDT |
| 44 | + + RT_USING_WDT |
| 45 | + + BSP_USING_IWDT |
| 46 | + + LSI_VALUE |
| 47 | ++ RTC |
| 48 | + + RT_USING_RTC |
| 49 | + + BSP_USING_RTC |
| 50 | + + BSP_USING_RTC_LSI |
| 51 | + + LSI_VALUE |
| 52 | ++ HWTIMER 1/2/3/4 |
| 53 | + + RT_USING_HWTIMER |
| 54 | + + BSP_USING_HWTIMER |
| 55 | + + BSP_USING_TIM1_HWTIMER |
| 56 | + + BSP_USING_TIM2_HWTIMER |
| 57 | + + BSP_USING_TIM3_HWTIMER |
| 58 | + + BSP_USING_TIM4_HWTIMER |
| 59 | +~~~c |
| 60 | +void ch32f1_tim_clock_init(TIM_TypeDef *timx); |
| 61 | +rt_uint32_t ch32f1_tim_clock_get(TIM_TypeDef *timx); |
| 62 | +~~~ |
| 63 | +~~~c |
| 64 | +struct rt_hwtimer_info* ch32f1_hwtimer_info_config_get(TIM_TypeDef *timx); |
| 65 | +~~~ |
| 66 | ++ PWM 4(timer) x 4 (channel) |
| 67 | + + RT_USING_PWM |
| 68 | + + BSP_USING_TIM1_PWM |
| 69 | + + BSP_USING_TIM1_PWM_CH1 |
| 70 | + + BSP_USING_TIM1_PWM_CH2 |
| 71 | + + BSP_USING_TIM1_PWM_CH3 |
| 72 | + + BSP_USING_TIM1_PWM_CH4 |
| 73 | + + BSP_USING_TIM2_PWM |
| 74 | + + BSP_USING_TIM2_PWM_CH1 |
| 75 | + + BSP_USING_TIM2_PWM_CH2 |
| 76 | + + BSP_USING_TIM2_PWM_CH3 |
| 77 | + + BSP_USING_TIM2_PWM_CH4 |
| 78 | + + BSP_USING_TIM3_PWM |
| 79 | + + BSP_USING_TIM3_PWM_CH1 |
| 80 | + + BSP_USING_TIM3_PWM_CH2 |
| 81 | + + BSP_USING_TIM3_PWM_CH3 |
| 82 | + + BSP_USING_TIM3_PWM_CH4 |
| 83 | + + BSP_USING_TIM4_PWM |
| 84 | + + BSP_USING_TIM4_PWM_CH1 |
| 85 | + + BSP_USING_TIM4_PWM_CH2 |
| 86 | + + BSP_USING_TIM4_PWM_CH3 |
| 87 | + + BSP_USING_TIM4_PWM_CH4 |
| 88 | +~~~c |
| 89 | +void ch32f1_pwm_io_init(TIM_TypeDef *timx, rt_uint8_t channel); |
| 90 | +~~~ |
| 91 | +其中需要依赖定时器的接口: |
| 92 | +~~~c |
| 93 | +void ch32f1_tim_clock_init(TIM_TypeDef *timx); |
| 94 | +rt_uint32_t ch32f1_tim_clock_get(TIM_TypeDef *timx); |
| 95 | +~~~ |
| 96 | +
|
| 97 | +
|
| 98 | +### 1.2 需要实现的接口: |
| 99 | +除了使用上面驱动提及的接口外,以下的接口必须实现: |
| 100 | +~~~c |
| 101 | +rt_uint32_t ch32_get_sysclock_frequency(void); |
| 102 | +~~~ |
| 103 | +## 2 构建具体芯片BSP |
| 104 | +以ch32f103c8-core为例,在ENV环境下,使用MDK,至少需要准备 |
| 105 | ++ ch32f103c8-core (具体的BSP名) |
| 106 | ++ ch32f103c8-core\applications |
| 107 | ++ ch32f103c8-core\applications\SConscript |
| 108 | ++ ch32f103c8-core\applications\main.c |
| 109 | ++ ch32f103c8-core\board |
| 110 | ++ ch32f103c8-core\board\linker_scripts |
| 111 | ++ ch32f103c8-core\board\linker_scripts\link.sct |
| 112 | ++ ch32f103c8-core\board\board.c |
| 113 | ++ ch32f103c8-core\board\board.h |
| 114 | ++ ch32f103c8-core\board\ch32f10x_conf.h |
| 115 | ++ ch32f103c8-core\board\system_ch32f10x.c |
| 116 | ++ ch32f103c8-core\board\Kconfig |
| 117 | ++ ch32f103c8-core\board\SConscript |
| 118 | ++ ch32f103c8-core\Kconfig |
| 119 | ++ ch32f103c8-core\rtconfig.py |
| 120 | ++ ch32f103c8-core\SConscript |
| 121 | ++ ch32f103c8-core\SConstruct |
| 122 | ++ ch32f103c8-core\template.uvprojx |
| 123 | + |
| 124 | +### 2.1 创建template.uvprojx |
| 125 | +新建名为template的MDK工程,删除多余的子目录target1,将目录改名为rtthread-ch32f103x,options选项栏device设置具体芯片,user编译后的动作, 如"fromelf --bin !L --output rtthread.bin" |
| 126 | + |
| 127 | +### 2.2 编写board/Kconfig |
| 128 | + |
| 129 | +~~~ |
| 130 | +menu "Hardware Drivers Config" |
| 131 | +
|
| 132 | +config SOC_CH32F103C8 |
| 133 | + bool |
| 134 | + select SOC_ARM_SERIES_CH32F103 |
| 135 | + select RT_USING_COMPONENTS_INIT |
| 136 | + select RT_USING_USER_MAIN |
| 137 | + default y |
| 138 | +~~~ |
| 139 | +SOC_CH32F103C8为具体的芯片,SOC_ARM_SERIES_CH32F103在Libraries\Kconfig下已定义。 |
| 140 | +RT_USING_COMPONENTS_INIT,RT_USING_USER_MAIN为rt-thread设备框架默认选项。 |
| 141 | + |
| 142 | + |
| 143 | +使用适配的驱动根据宏开关编写即可,以串口驱动为例: |
| 144 | ++ BSP_USING_XXX |
| 145 | + + select RT_USING_XXX |
| 146 | + + BSP_USING_XXX1 |
| 147 | + + BSP_USING_XXX2 |
| 148 | + |
| 149 | +~~~ |
| 150 | +menu "On-chip Peripheral Drivers" |
| 151 | +
|
| 152 | +config BSP_USING_UART |
| 153 | + bool "using onchip usart" |
| 154 | + select RT_USING_SERIAL |
| 155 | + default n |
| 156 | +
|
| 157 | + if BSP_USING_UART |
| 158 | + config BSP_USING_UART1 |
| 159 | + bool "using uart1" |
| 160 | + default n |
| 161 | +
|
| 162 | + config BSP_USING_UART2 |
| 163 | + bool "using uart2" |
| 164 | + default n |
| 165 | +
|
| 166 | + config BSP_USING_UART3 |
| 167 | + bool "using uart3" |
| 168 | + default n |
| 169 | + endif |
| 170 | +~~~ |
| 171 | + |
| 172 | +比较特殊的定时器和PWM驱动额外定义了以下宏开关,详见ch32f103c8-core。 |
| 173 | ++ BSP_USING_TIM |
| 174 | + + BSP_USING_TIM1 |
| 175 | + + BSP_USING_TIM2 |
| 176 | + + BSP_USING_TIM3 |
| 177 | + + BSP_USING_TIM4 |
| 178 | +### 2.3 在board/board.h加入接口,并在board/board.c实现 |
| 179 | +使用适配的驱动根据宏开关编写即可,如串口驱动: |
| 180 | ++ BSP_USING_XXX |
| 181 | +~~~ |
| 182 | +#ifdef BSP_USING_UART |
| 183 | +void ch32f1_usart_clock_and_io_init(USART_TypeDef* usartx); |
| 184 | +#endif |
| 185 | +~~~ |
| 186 | +比较特殊的定时器和PWM驱动使用额外定义了的宏开关 |
| 187 | +~~~c |
| 188 | +#ifdef BSP_USING_TIM |
| 189 | +void ch32f1_tim_clock_init(TIM_TypeDef *timx); |
| 190 | +rt_uint32_t ch32f1_tim_clock_get(TIM_TypeDef *timx); |
| 191 | + |
| 192 | +#ifdef BSP_USING_HWTIMER |
| 193 | +struct rt_hwtimer_info* ch32f1_hwtimer_info_config_get(TIM_TypeDef *timx); |
| 194 | +#endif |
| 195 | + |
| 196 | +#ifdef BSP_USING_PWM |
| 197 | +void ch32f1_pwm_io_init(TIM_TypeDef *timx, rt_uint8_t channel); |
| 198 | +#endif |
| 199 | +#endif |
| 200 | +~~~ |
0 commit comments