blob: 15cf0fbfdd4adbb905d071c09368c1b38620aff1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
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
+ CLOCK_TIMER 1/2/3/4
+ RT_USING_CLOCK_TIME
+ BSP_USING_CLOCK_TIMER
+ BSP_USING_TIM1_CLOCK_TIMER
+ BSP_USING_TIM2_CLOCK_TIMER
+ BSP_USING_TIM3_CLOCK_TIMER
+ BSP_USING_TIM4_CLOCK_TIMER
~~~c
void ch32f1_tim_clock_init(TIM_TypeDef *timx);
rt_uint32_t ch32f1_tim_clock_get(TIM_TypeDef *timx);
~~~
~~~c
struct rt_clock_timer_info* ch32f1_clock_timer_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_CLOCK_TIMER
struct rt_clock_timer_info* ch32f1_clock_timer_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
~~~
|