1 /*
2  * Copyright (c) 2006-2022, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2020-08-20     Abbcc        first version
9  */
10 
11 #include "board.h"
12 
apm32_usart_init(void)13 void apm32_usart_init(void)
14 {
15     GPIO_Config_T GPIO_ConfigStruct;
16 
17 #ifdef BSP_USING_UART1
18     RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
19     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1);
20 
21     GPIO_ConfigStruct.mode = GPIO_MODE_AF;
22     GPIO_ConfigStruct.pin = GPIO_PIN_9;
23     GPIO_ConfigStruct.otype = GPIO_OTYPE_PP;
24     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
25     GPIO_Config(GPIOA, &GPIO_ConfigStruct);
26     GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_9, GPIO_AF_USART1);
27 
28     GPIO_ConfigStruct.mode = GPIO_MODE_AF;
29     GPIO_ConfigStruct.pin = GPIO_PIN_10;
30     GPIO_ConfigStruct.pupd = GPIO_PUPD_UP;
31     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
32     GPIO_Config(GPIOA, &GPIO_ConfigStruct);
33     GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_10, GPIO_AF_USART1);
34 #endif
35 
36 #ifdef BSP_USING_UART2
37     RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
38     RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_USART2);
39 
40     GPIO_ConfigStruct.mode = GPIO_MODE_AF;
41     GPIO_ConfigStruct.pin = GPIO_PIN_2;
42     GPIO_ConfigStruct.otype = GPIO_OTYPE_PP;
43     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
44     GPIO_Config(GPIOA, &GPIO_ConfigStruct);
45     GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_2, GPIO_AF_USART2);
46 
47     GPIO_ConfigStruct.mode = GPIO_MODE_AF;
48     GPIO_ConfigStruct.pin = GPIO_PIN_3;
49     GPIO_ConfigStruct.pupd = GPIO_PUPD_UP;
50     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
51     GPIO_Config(GPIOA, &GPIO_ConfigStruct);
52     GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_3, GPIO_AF_USART2);
53 #endif
54 }
55 
apm32_msp_can_init(void * Instance)56 void apm32_msp_can_init(void *Instance)
57 {
58 #if defined(BSP_USING_CAN1) || defined(BSP_USING_CAN2)
59     GPIO_Config_T  GPIO_InitStructure;
60     CAN_T *CANx = (CAN_T *)Instance;
61 
62     if (CAN1 == CANx)
63     {
64         RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1);
65 
66         RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB);
67 
68         /* PB8: CAN1_RX, PB9: CAN1_TX */
69         GPIO_InitStructure.pin = GPIO_PIN_8 | GPIO_PIN_9;
70         GPIO_InitStructure.mode = GPIO_MODE_AF;
71         GPIO_InitStructure.otype = GPIO_OTYPE_PP;
72         GPIO_InitStructure.speed = GPIO_SPEED_100MHz;
73         GPIO_InitStructure.pupd = GPIO_PUPD_UP;
74         GPIO_Config(GPIOB, &GPIO_InitStructure);
75 
76         GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_8, GPIO_AF_CAN1);
77         GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_9, GPIO_AF_CAN1);
78     }
79     else if (CAN2 == CANx)
80     {
81         /* When using the CAN2 peripheral, the CAN1 clock must be turned on */
82         RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1);
83         RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN2);
84 
85         RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB);
86 
87         /* PB12: CAN2_RX, PB13: CAN2_TX */
88         GPIO_InitStructure.pin = GPIO_PIN_12 | GPIO_PIN_13;
89         GPIO_InitStructure.mode = GPIO_MODE_AF;
90         GPIO_InitStructure.otype = GPIO_OTYPE_PP;
91         GPIO_InitStructure.speed = GPIO_SPEED_100MHz;
92         GPIO_InitStructure.pupd = GPIO_PUPD_UP;
93         GPIO_Config(GPIOB, &GPIO_InitStructure);
94 
95         GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_12, GPIO_AF_CAN2);
96         GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_13, GPIO_AF_CAN2);
97     }
98 #endif
99 }
100