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)36void 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