1 /******************************************************************************************************************************************
2 * 文件名称: SWM320_port.c
3 * 功能说明: SWM320单片机的端口引脚功能选择库函数
4 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
5 * 注意事项:
6 * 版本日期: V1.1.0      2017年10月25日
7 * 升级记录:
8 *
9 *
10 *******************************************************************************************************************************************
11 * @attention
12 *
13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
14 * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
15 * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
16 * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
17 * -ECTION WITH THEIR PRODUCTS.
18 *
19 * COPYRIGHT 2012 Synwit Technology
20 *******************************************************************************************************************************************/
21 #include "SWM320.h"
22 #include "SWM320_port.h"
23 
24 
25 /******************************************************************************************************************************************
26 * 函数名称: PORT_Init()
27 * 功能说明: 端口引脚功能选择,可用的功能见"SWM320_port.h"文件
28 * 输    入: uint32_t PORTx            指定PORT端口,有效值包括PORTA、PORTB、PORTC、PORTM、PORTN、PORTP
29 *           uint32_t n              指定PORT引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
30 *           uint32_t func           指定端口引脚要设定的功能,其可取值见"SWM320_port.h"文件
31 *           uint32_t digit_in_en    数字输入使能
32 * 输    出: 无
33 * 注意事项: 当引脚标号n为偶数时,func取值只能是FUNMUX0开头的,如FUNMUX0_UART0_RXD
34 *           当引脚标号n为奇数时,func取值只能是FUNMUX1开头的,如FUNMUX1_UART0_TXD
35 ******************************************************************************************************************************************/
PORT_Init(uint32_t PORTx,uint32_t n,uint32_t func,uint32_t digit_in_en)36 void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en)
37 {
38     switch((uint32_t)PORTx)
39     {
40         case ((uint32_t)PORTA):
41             if(func > 99)
42             {
43                 if(n < PIN6)
44                 {
45                     PORT->PORTA_MUX0 &= ~(0x1F << (n*5));
46                     PORT->PORTA_MUX0 |= (func-100) << (n*5);
47                 }
48                 else if(n < PIN12)
49                 {
50                     PORT->PORTA_MUX1 &= ~(0x1F << ((n-6)*5));
51                     PORT->PORTA_MUX1 |= (func-100) << ((n-6)*5);
52                 }
53             }
54 
55             PORT->PORTA_SEL &= ~(0x03 << (n*2));
56             PORT->PORTA_SEL |= (func > 99 ? 1 : func) << (n*2);
57 
58             PORT->PORTA_INEN &= ~(0x01 << n);
59             PORT->PORTA_INEN |= (digit_in_en << n);
60             break;
61 
62         case ((uint32_t)PORTB):
63             if(func > 99)
64             {
65                 if(n < PIN6)
66                 {
67                     PORT->PORTB_MUX0 &= ~(0x1F << (n*5));
68                     PORT->PORTB_MUX0 |= (func-100) << (n*5);
69                 }
70                 else if(n < PIN12)
71                 {
72                     PORT->PORTB_MUX1 &= ~(0x1F << ((n-6)*5));
73                     PORT->PORTB_MUX1 |= (func-100) << ((n-6)*5);
74                 }
75             }
76 
77             PORT->PORTB_SEL &= ~(0x03 << (n*2));
78             PORT->PORTB_SEL |= (func > 99 ? 1 : func) << (n*2);
79 
80             PORT->PORTB_INEN &= ~(0x01 << n);
81             PORT->PORTB_INEN |= (digit_in_en << n);
82             break;
83 
84         case ((uint32_t)PORTC):
85             if(func > 99)
86             {
87                 if(n < PIN6)
88                 {
89                     PORT->PORTC_MUX0 &= ~(0x1F << (n*5));
90                     PORT->PORTC_MUX0 |= (func-100) << (n*5);
91                 }
92                 else if(n < PIN12)
93                 {
94                     PORT->PORTC_MUX1 &= ~(0x1F << ((n-6)*5));
95                     PORT->PORTC_MUX1 |= (func-100) << ((n-6)*5);
96                 }
97             }
98 
99             PORT->PORTC_SEL &= ~(0x03 << (n*2));
100             PORT->PORTC_SEL |= (func > 99 ? 1 : func) << (n*2);
101 
102             PORT->PORTC_INEN &= ~(0x01 << n);
103             PORT->PORTC_INEN |= (digit_in_en << n);
104             break;
105 
106         case ((uint32_t)PORTM):
107             if(func > 99)
108             {
109                 if(n < PIN6)
110                 {
111                     PORT->PORTM_MUX0 &= ~(0x1F << (n*5));
112                     PORT->PORTM_MUX0 |= (func-100) << (n*5);
113                 }
114                 else if(n < PIN12)
115                 {
116                     PORT->PORTM_MUX1 &= ~(0x1F << ((n-6)*5));
117                     PORT->PORTM_MUX1 |= (func-100) << ((n-6)*5);
118                 }
119                 else if(n < PIN18)
120                 {
121                     PORT->PORTM_MUX2 &= ~(0x1F << ((n-12)*5));
122                     PORT->PORTM_MUX2 |= (func-100) << ((n-12)*5);
123                 }
124                 else if(n < PIN24)
125                 {
126                     PORT->PORTM_MUX3 &= ~(0x1F << ((n-18)*5));
127                     PORT->PORTM_MUX3 |= (func-100) << ((n-18)*5);
128                 }
129             }
130 
131             if(n < 16)
132             {
133                 PORT->PORTM_SEL0 &= ~(0x03 << (n*2));
134                 PORT->PORTM_SEL0 |= (func > 99 ? 1 : func) << (n*2);
135             }
136             else
137             {
138                 PORT->PORTM_SEL1 &= ~(0x03 << ((n-16)*2));
139                 PORT->PORTM_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2);
140             }
141 
142             PORT->PORTM_INEN &= ~(0x01 << n);
143             PORT->PORTM_INEN |= (digit_in_en << n);
144             break;
145 
146         case ((uint32_t)PORTN):
147             if(func > 99)
148             {
149                 if(n < PIN6)
150                 {
151                     PORT->PORTN_MUX0 &= ~(0x1F << (n*5));
152                     PORT->PORTN_MUX0 |= (func-100) << (n*5);
153                 }
154                 else if(n < PIN12)
155                 {
156                     PORT->PORTN_MUX1 &= ~(0x1F << ((n-6)*5));
157                     PORT->PORTN_MUX1 |= (func-100) << ((n-6)*5);
158                 }
159                 else if(n < PIN18)
160                 {
161                     PORT->PORTN_MUX2 &= ~(0x1F << ((n-12)*5));
162                     PORT->PORTN_MUX2 |= (func-100) << ((n-12)*5);
163                 }
164             }
165 
166             if(n < 16)
167             {
168                 PORT->PORTN_SEL0 &= ~(0x03 << (n*2));
169                 PORT->PORTN_SEL0 |= (func > 99 ? 1 : func) << (n*2);
170             }
171             else
172             {
173                 PORT->PORTN_SEL1 &= ~(0x03 << ((n-16)*2));
174                 PORT->PORTN_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2);
175             }
176 
177             PORT->PORTN_INEN &= ~(0x01 << n);
178             PORT->PORTN_INEN |= (digit_in_en << n);
179             break;
180 
181         case ((uint32_t)PORTP):
182             if(func > 99)
183             {
184                 if(n < PIN6)
185                 {
186                     PORT->PORTP_MUX0 &= ~(0x1F << (n*5));
187                     PORT->PORTP_MUX0 |= (func-100) << (n*5);
188                 }
189                 else if(n < PIN12)
190                 {
191                     PORT->PORTP_MUX1 &= ~(0x1F << ((n-6)*5));
192                     PORT->PORTP_MUX1 |= (func-100) << ((n-6)*5);
193                 }
194                 else if(n < PIN18)
195                 {
196                     PORT->PORTP_MUX2 &= ~(0x1F << ((n-12)*5));
197                     PORT->PORTP_MUX2 |= (func-100) << ((n-12)*5);
198                 }
199                 else if(n < PIN24)
200                 {
201                     PORT->PORTP_MUX3 &= ~(0x1F << ((n-18)*5));
202                     PORT->PORTP_MUX3 |= (func-100) << ((n-18)*5);
203                 }
204             }
205 
206             if(n < 16)
207             {
208                 PORT->PORTP_SEL0 &= ~(0x03 << (n*2));
209                 PORT->PORTP_SEL0 |= (func > 99 ? 1 : func) << (n*2);
210             }
211             else
212             {
213                 PORT->PORTP_SEL1 &= ~(0x03 << ((n-16)*2));
214                 PORT->PORTP_SEL1 |= (func > 99 ? 1 : func) << ((n-16)*2);
215             }
216 
217             PORT->PORTP_INEN &= ~(0x01 << n);
218             PORT->PORTP_INEN |= (digit_in_en << n);
219             break;
220     }
221 }
222