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