1 /*
2 * Copyright (c) 2006-2021, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2021-08-10 charlown first version
9 */
10
11 #include <rtthread.h>
12 #include <rtdevice.h>
13 #include <rthw.h>
14 #include "board.h"
15 #include "ch32f10x_rcc.h"
16
ch32_get_sysclock_frequency(void)17 rt_uint32_t ch32_get_sysclock_frequency(void)
18 {
19 RCC_ClocksTypeDef RCC_Clocks;
20
21 RCC_GetClocksFreq(&RCC_Clocks);
22
23 return RCC_Clocks.SYSCLK_Frequency;
24 }
25
ch32f1_usart_clock_and_io_init(USART_TypeDef * usartx)26 void ch32f1_usart_clock_and_io_init(USART_TypeDef *usartx)
27 {
28
29 GPIO_InitTypeDef GPIO_InitStructure;
30
31 if (usartx == USART1)
32 {
33
34 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
35 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
36
37 /* USART1 TX-->A.9 RX-->A.10 */
38 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
39 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
40 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
41 GPIO_Init(GPIOA, &GPIO_InitStructure);
42 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
43 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
44 GPIO_Init(GPIOA, &GPIO_InitStructure);
45 }
46
47 if (usartx == USART2)
48 {
49
50 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
51 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
52
53 /* USART2 TX-->A.2 RX-->A.3 */
54 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
55 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
56 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
57 GPIO_Init(GPIOA, &GPIO_InitStructure);
58 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
59 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
60 GPIO_Init(GPIOA, &GPIO_InitStructure);
61 }
62
63 if (usartx == USART3)
64 {
65
66 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
67 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
68
69 /* USART3 TX-->C.10 RX-->C.11 */
70 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
71 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
72 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
73 GPIO_Init(GPIOC, &GPIO_InitStructure);
74 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
75 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
76 GPIO_Init(GPIOC, &GPIO_InitStructure);
77 GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);
78 }
79 }
80
ch32f1_spi_clock_and_io_init(SPI_TypeDef * spix)81 void ch32f1_spi_clock_and_io_init(SPI_TypeDef *spix)
82 {
83
84 GPIO_InitTypeDef GPIO_InitStructure;
85
86 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
87
88 if (spix == SPI1)
89 {
90 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE);
91 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
92
93 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
94 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
95 GPIO_Init(GPIOB, &GPIO_InitStructure);
96 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
97 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
98 GPIO_Init(GPIOB, &GPIO_InitStructure);
99 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
100 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
101 GPIO_Init(GPIOB, &GPIO_InitStructure);
102 }
103
104 if (spix == SPI2)
105 {
106 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
107 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
108
109 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
110 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
111 GPIO_Init(GPIOB, &GPIO_InitStructure);
112 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
113 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
114 GPIO_Init(GPIOB, &GPIO_InitStructure);
115 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
116 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
117 GPIO_Init(GPIOB, &GPIO_InitStructure);
118 }
119 }
120
ch32f1_spi_clock_get(SPI_TypeDef * spix)121 rt_uint32_t ch32f1_spi_clock_get(SPI_TypeDef *spix)
122 {
123 RCC_ClocksTypeDef RCC_Clocks;
124
125 RCC_GetClocksFreq(&RCC_Clocks);
126
127 if (spix == SPI1)
128 {
129 return RCC_Clocks.PCLK2_Frequency;
130 }
131
132 if (spix == SPI2)
133 {
134 return RCC_Clocks.PCLK1_Frequency;
135 }
136
137 return RCC_Clocks.PCLK2_Frequency;
138 }
139
ch32f1_i2c_clock_and_io_init(I2C_TypeDef * i2cx)140 void ch32f1_i2c_clock_and_io_init(I2C_TypeDef *i2cx)
141 {
142
143 GPIO_InitTypeDef GPIO_InitStructure;
144
145 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
146 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
147
148 if (i2cx == I2C1)
149 {
150
151 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
152 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
153
154 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
155 GPIO_Init(GPIOB, &GPIO_InitStructure);
156 GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);
157 }
158
159 if (i2cx == I2C2)
160 {
161 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
162 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
163
164 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
165 GPIO_Init(GPIOB, &GPIO_InitStructure);
166 }
167 }
168
ch32f1_i2c_config(I2C_TypeDef * i2cx)169 void ch32f1_i2c_config(I2C_TypeDef *i2cx)
170 {
171
172 I2C_InitTypeDef I2C_InitTSturcture;
173
174 if (i2cx == I2C1)
175 {
176 I2C_InitTSturcture.I2C_ClockSpeed = 100000;
177 I2C_InitTSturcture.I2C_Mode = I2C_Mode_I2C;
178 I2C_InitTSturcture.I2C_DutyCycle = I2C_DutyCycle_16_9;
179 I2C_InitTSturcture.I2C_OwnAddress1 = 0;
180 I2C_InitTSturcture.I2C_Ack = I2C_Ack_Enable;
181 I2C_InitTSturcture.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
182 I2C_Init(I2C1, &I2C_InitTSturcture);
183
184 I2C_Cmd(I2C1, ENABLE);
185 I2C_AcknowledgeConfig(I2C1, ENABLE);
186 }
187
188 if (i2cx == I2C2)
189 {
190 I2C_InitTSturcture.I2C_ClockSpeed = 100000;
191 I2C_InitTSturcture.I2C_Mode = I2C_Mode_I2C;
192 I2C_InitTSturcture.I2C_DutyCycle = I2C_DutyCycle_16_9;
193 I2C_InitTSturcture.I2C_OwnAddress1 = 0;
194 I2C_InitTSturcture.I2C_Ack = I2C_Ack_Enable;
195 I2C_InitTSturcture.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
196 I2C_Init(I2C2, &I2C_InitTSturcture);
197
198 I2C_Cmd(I2C2, ENABLE);
199 I2C_AcknowledgeConfig(I2C2, ENABLE);
200 }
201 }
202
203 #ifdef BSP_USING_TIM
ch32f1_tim_clock_init(TIM_TypeDef * timx)204 void ch32f1_tim_clock_init(TIM_TypeDef *timx)
205 {
206 if (timx == TIM1)
207 {
208 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
209 }
210
211 if (timx == TIM2)
212 {
213 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
214 }
215
216 if (timx == TIM3)
217 {
218 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
219 }
220
221 if (timx == TIM4)
222 {
223 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
224 }
225 }
226
ch32f1_tim_clock_get(TIM_TypeDef * timx)227 rt_uint32_t ch32f1_tim_clock_get(TIM_TypeDef *timx)
228 {
229 RCC_ClocksTypeDef RCC_Clocks;
230
231 RCC_GetClocksFreq(&RCC_Clocks);
232
233 /*tim1~4 all in HCLK*/
234 return RCC_Clocks.HCLK_Frequency;
235 }
236
237 struct rt_hwtimer_info hwtimer_info1 =
238 {
239 .maxfreq = 1000000,
240 .minfreq = 2000,
241 .maxcnt = 0xFFFF,
242 .cntmode = HWTIMER_CNTMODE_UP,
243
244 };
245
246 struct rt_hwtimer_info hwtimer_info2 =
247 {
248 .maxfreq = 1000000,
249 .minfreq = 2000,
250 .maxcnt = 0xFFFF,
251 .cntmode = HWTIMER_CNTMODE_UP,
252
253 };
254
255 struct rt_hwtimer_info hwtimer_info3 =
256 {
257 .maxfreq = 1000000,
258 .minfreq = 2000,
259 .maxcnt = 0xFFFF,
260 .cntmode = HWTIMER_CNTMODE_UP,
261
262 };
263
264 struct rt_hwtimer_info hwtimer_info4 =
265 {
266 .maxfreq = 1000000,
267 .minfreq = 2000,
268 .maxcnt = 0xFFFF,
269 .cntmode = HWTIMER_CNTMODE_UP,
270
271 };
272
ch32f1_hwtimer_info_config_get(TIM_TypeDef * timx)273 struct rt_hwtimer_info *ch32f1_hwtimer_info_config_get(TIM_TypeDef *timx)
274 {
275 struct rt_hwtimer_info *info = RT_NULL;
276
277 if (timx == TIM1)
278 {
279 info = &hwtimer_info1;
280 }
281 else if (timx == TIM2)
282 {
283 info = &hwtimer_info2;
284 }
285 else if (timx == TIM3)
286 {
287 info = &hwtimer_info3;
288 }
289 else if (timx == TIM4)
290 {
291 info = &hwtimer_info4;
292 }
293
294 return info;
295 }
296
ch32f1_pwm_io_init(TIM_TypeDef * timx,rt_uint8_t channel)297 void ch32f1_pwm_io_init(TIM_TypeDef *timx, rt_uint8_t channel)
298 {
299 GPIO_InitTypeDef GPIO_InitStructure;
300
301 if (timx == TIM1)
302 {
303 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
304
305 if (channel == TIM_Channel_1)
306 {
307 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
308 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
309 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
310 GPIO_Init(GPIOA, &GPIO_InitStructure);
311 }
312 if (channel == TIM_Channel_2)
313 {
314 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
315 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
316 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
317 GPIO_Init(GPIOA, &GPIO_InitStructure);
318 }
319 if (channel == TIM_Channel_3)
320 {
321 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
322 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
323 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
324 GPIO_Init(GPIOA, &GPIO_InitStructure);
325 }
326 if (channel == TIM_Channel_4)
327 {
328 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
329 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
330 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
331 GPIO_Init(GPIOA, &GPIO_InitStructure);
332 }
333 }
334
335 if (timx == TIM2)
336 {
337 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
338
339 if (channel == TIM_Channel_1)
340 {
341 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
342 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
343 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
344 GPIO_Init(GPIOA, &GPIO_InitStructure);
345 }
346 if (channel == TIM_Channel_2)
347 {
348 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
349 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
350 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
351 GPIO_Init(GPIOA, &GPIO_InitStructure);
352 }
353 if (channel == TIM_Channel_3)
354 {
355 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
356 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
357 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
358 GPIO_Init(GPIOA, &GPIO_InitStructure);
359 }
360 if (channel == TIM_Channel_4)
361 {
362 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
363 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
364 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
365 GPIO_Init(GPIOA, &GPIO_InitStructure);
366 }
367 }
368
369 if (timx == TIM3)
370 {
371 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
372 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
373
374 if (channel == TIM_Channel_1)
375 {
376 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
377 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
378 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
379 GPIO_Init(GPIOA, &GPIO_InitStructure);
380 }
381 if (channel == TIM_Channel_2)
382 {
383 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
384 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
385 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
386 GPIO_Init(GPIOA, &GPIO_InitStructure);
387 }
388 if (channel == TIM_Channel_3)
389 {
390 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
391 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
392 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
393 GPIO_Init(GPIOB, &GPIO_InitStructure);
394 }
395 if (channel == TIM_Channel_4)
396 {
397 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
398 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
399 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
400 GPIO_Init(GPIOB, &GPIO_InitStructure);
401 }
402 }
403
404 if (timx == TIM4)
405 {
406 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
407
408 if (channel == TIM_Channel_1)
409 {
410 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
411 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
412 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
413 GPIO_Init(GPIOB, &GPIO_InitStructure);
414 }
415 if (channel == TIM_Channel_2)
416 {
417 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
418 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
419 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
420 GPIO_Init(GPIOB, &GPIO_InitStructure);
421 }
422 if (channel == TIM_Channel_3)
423 {
424 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
425 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
426 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
427 GPIO_Init(GPIOB, &GPIO_InitStructure);
428 }
429 if (channel == TIM_Channel_4)
430 {
431 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
432 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
433 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
434 GPIO_Init(GPIOB, &GPIO_InitStructure);
435 }
436 }
437 }
438 #endif
439