NXP's driver library for LPC17xx, ported to mbed's online compiler. Not tested! I had to fix a lot of warings and found a couple of pretty obvious bugs, so the chances are there are more. Original: http://ics.nxp.com/support/documents/microcontrollers/zip/lpc17xx.cmsis.driver.library.zip

Dependencies:   mbed

Committer:
igorsk
Date:
Wed Feb 17 16:22:39 2010 +0000
Revision:
0:1063a091a062

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igorsk 0:1063a091a062 1 /**
igorsk 0:1063a091a062 2 * @file : lpc17xx_pinsel.c
igorsk 0:1063a091a062 3 * @brief : Contains all functions support for Pin connect block firmware
igorsk 0:1063a091a062 4 * library on LPC17xx
igorsk 0:1063a091a062 5 * @version : 1.0
igorsk 0:1063a091a062 6 * @date : 25. Feb. 2009
igorsk 0:1063a091a062 7 * @author : HoanTran
igorsk 0:1063a091a062 8 **************************************************************************
igorsk 0:1063a091a062 9 * Software that is described herein is for illustrative purposes only
igorsk 0:1063a091a062 10 * which provides customers with programming information regarding the
igorsk 0:1063a091a062 11 * products. This software is supplied "AS IS" without any warranties.
igorsk 0:1063a091a062 12 * NXP Semiconductors assumes no responsibility or liability for the
igorsk 0:1063a091a062 13 * use of the software, conveys no license or title under any patent,
igorsk 0:1063a091a062 14 * copyright, or mask work right to the product. NXP Semiconductors
igorsk 0:1063a091a062 15 * reserves the right to make changes in the software without
igorsk 0:1063a091a062 16 * notification. NXP Semiconductors also make no representation or
igorsk 0:1063a091a062 17 * warranty that such application will be suitable for the specified
igorsk 0:1063a091a062 18 * use without further testing or modification.
igorsk 0:1063a091a062 19 **********************************************************************/
igorsk 0:1063a091a062 20
igorsk 0:1063a091a062 21 /* Peripheral group ----------------------------------------------------------- */
igorsk 0:1063a091a062 22 /** @addtogroup PINSEL
igorsk 0:1063a091a062 23 * @{
igorsk 0:1063a091a062 24 */
igorsk 0:1063a091a062 25
igorsk 0:1063a091a062 26 /* Includes ------------------------------------------------------------------- */
igorsk 0:1063a091a062 27 #include "lpc17xx_pinsel.h"
igorsk 0:1063a091a062 28
igorsk 0:1063a091a062 29
igorsk 0:1063a091a062 30 /* Public Functions ----------------------------------------------------------- */
igorsk 0:1063a091a062 31 /** @addtogroup PINSEL_Public_Functions
igorsk 0:1063a091a062 32 * @{
igorsk 0:1063a091a062 33 */
igorsk 0:1063a091a062 34
igorsk 0:1063a091a062 35 /*********************************************************************//**
igorsk 0:1063a091a062 36 * @brief Setup the pin selection function
igorsk 0:1063a091a062 37 * @param[in] portnum PORT number,
igorsk 0:1063a091a062 38 * should be one of the following:
igorsk 0:1063a091a062 39 * - PINSEL_PORT_0 : Port 0
igorsk 0:1063a091a062 40 * - PINSEL_PORT_1 : Port 1
igorsk 0:1063a091a062 41 * - PINSEL_PORT_2 : Port 2
igorsk 0:1063a091a062 42 * - PINSEL_PORT_3 : Port 3
igorsk 0:1063a091a062 43 *
igorsk 0:1063a091a062 44 * @param[in] pinnum Pin number,
igorsk 0:1063a091a062 45 * should be one of the following:
igorsk 0:1063a091a062 46 - PINSEL_PIN_0 : Pin 0
igorsk 0:1063a091a062 47 - PINSEL_PIN_1 : Pin 1
igorsk 0:1063a091a062 48 - PINSEL_PIN_2 : Pin 2
igorsk 0:1063a091a062 49 - PINSEL_PIN_3 : Pin 3
igorsk 0:1063a091a062 50 - PINSEL_PIN_4 : Pin 4
igorsk 0:1063a091a062 51 - PINSEL_PIN_5 : Pin 5
igorsk 0:1063a091a062 52 - PINSEL_PIN_6 : Pin 6
igorsk 0:1063a091a062 53 - PINSEL_PIN_7 : Pin 7
igorsk 0:1063a091a062 54 - PINSEL_PIN_8 : Pin 8
igorsk 0:1063a091a062 55 - PINSEL_PIN_9 : Pin 9
igorsk 0:1063a091a062 56 - PINSEL_PIN_10 : Pin 10
igorsk 0:1063a091a062 57 - PINSEL_PIN_11 : Pin 11
igorsk 0:1063a091a062 58 - PINSEL_PIN_12 : Pin 12
igorsk 0:1063a091a062 59 - PINSEL_PIN_13 : Pin 13
igorsk 0:1063a091a062 60 - PINSEL_PIN_14 : Pin 14
igorsk 0:1063a091a062 61 - PINSEL_PIN_15 : Pin 15
igorsk 0:1063a091a062 62 - PINSEL_PIN_16 : Pin 16
igorsk 0:1063a091a062 63 - PINSEL_PIN_17 : Pin 17
igorsk 0:1063a091a062 64 - PINSEL_PIN_18 : Pin 18
igorsk 0:1063a091a062 65 - PINSEL_PIN_19 : Pin 19
igorsk 0:1063a091a062 66 - PINSEL_PIN_20 : Pin 20
igorsk 0:1063a091a062 67 - PINSEL_PIN_21 : Pin 21
igorsk 0:1063a091a062 68 - PINSEL_PIN_22 : Pin 22
igorsk 0:1063a091a062 69 - PINSEL_PIN_23 : Pin 23
igorsk 0:1063a091a062 70 - PINSEL_PIN_24 : Pin 24
igorsk 0:1063a091a062 71 - PINSEL_PIN_25 : Pin 25
igorsk 0:1063a091a062 72 - PINSEL_PIN_26 : Pin 26
igorsk 0:1063a091a062 73 - PINSEL_PIN_27 : Pin 27
igorsk 0:1063a091a062 74 - PINSEL_PIN_28 : Pin 28
igorsk 0:1063a091a062 75 - PINSEL_PIN_29 : Pin 29
igorsk 0:1063a091a062 76 - PINSEL_PIN_30 : Pin 30
igorsk 0:1063a091a062 77 - PINSEL_PIN_31 : Pin 31
igorsk 0:1063a091a062 78
igorsk 0:1063a091a062 79 * @param[in] funcnum Function number,
igorsk 0:1063a091a062 80 * should be one of the following:
igorsk 0:1063a091a062 81 * - PINSEL_FUNC_0 : default function
igorsk 0:1063a091a062 82 * - PINSEL_FUNC_1 : first alternate function
igorsk 0:1063a091a062 83 * - PINSEL_FUNC_2 : second alternate function
igorsk 0:1063a091a062 84 * - PINSEL_FUNC_3 : third alternate function
igorsk 0:1063a091a062 85 *
igorsk 0:1063a091a062 86 * @return None
igorsk 0:1063a091a062 87 **********************************************************************/
igorsk 0:1063a091a062 88 void PINSEL_SetPinFunc ( uint8_t portnum, uint8_t pinnum, uint8_t funcnum)
igorsk 0:1063a091a062 89 {
igorsk 0:1063a091a062 90 uint32_t pinnum_t = pinnum;
igorsk 0:1063a091a062 91 uint32_t pinselreg_idx = 2 * portnum;
igorsk 0:1063a091a062 92 uint32_t *pPinCon = (uint32_t *)&LPC_PINCON->PINSEL0;
igorsk 0:1063a091a062 93
igorsk 0:1063a091a062 94 if (pinnum_t >= 16) {
igorsk 0:1063a091a062 95 pinnum_t -= 16;
igorsk 0:1063a091a062 96 pinselreg_idx++;
igorsk 0:1063a091a062 97 }
igorsk 0:1063a091a062 98 *(uint32_t *)(pPinCon + pinselreg_idx) &= ~(0x03UL << (pinnum_t * 2));
igorsk 0:1063a091a062 99 *(uint32_t *)(pPinCon + pinselreg_idx) |= ((uint32_t)funcnum) << (pinnum_t * 2);
igorsk 0:1063a091a062 100 }
igorsk 0:1063a091a062 101
igorsk 0:1063a091a062 102
igorsk 0:1063a091a062 103
igorsk 0:1063a091a062 104 /*********************************************************************//**
igorsk 0:1063a091a062 105 * @brief Configure trace function
igorsk 0:1063a091a062 106 * @param[in] NewState State of the Trace function configuration,
igorsk 0:1063a091a062 107 * should be one of the following:
igorsk 0:1063a091a062 108 * - ENABLE : Enable Trace Function
igorsk 0:1063a091a062 109 * - DISABLE : Disable Trace Function
igorsk 0:1063a091a062 110 *
igorsk 0:1063a091a062 111 * @return None
igorsk 0:1063a091a062 112 **********************************************************************/
igorsk 0:1063a091a062 113 void PINSEL_ConfigTraceFunc(FunctionalState NewState)
igorsk 0:1063a091a062 114 {
igorsk 0:1063a091a062 115 if (NewState == ENABLE) {
igorsk 0:1063a091a062 116 LPC_PINCON->PINSEL10 |= (0x01UL << 3);
igorsk 0:1063a091a062 117 } else if (NewState == DISABLE) {
igorsk 0:1063a091a062 118 LPC_PINCON->PINSEL10 &= ~(0x01UL << 3);
igorsk 0:1063a091a062 119 }
igorsk 0:1063a091a062 120 }
igorsk 0:1063a091a062 121
igorsk 0:1063a091a062 122
igorsk 0:1063a091a062 123
igorsk 0:1063a091a062 124 /*********************************************************************//**
igorsk 0:1063a091a062 125 * @brief Setup resistor mode for each pin
igorsk 0:1063a091a062 126 * @param[in] portnum PORT number,
igorsk 0:1063a091a062 127 * should be one of the following:
igorsk 0:1063a091a062 128 * - PINSEL_PORT_0 : Port 0
igorsk 0:1063a091a062 129 * - PINSEL_PORT_1 : Port 1
igorsk 0:1063a091a062 130 * - PINSEL_PORT_2 : Port 2
igorsk 0:1063a091a062 131 * - PINSEL_PORT_3 : Port 3
igorsk 0:1063a091a062 132 * @param[in] pinnum Pin number,
igorsk 0:1063a091a062 133 * should be one of the following:
igorsk 0:1063a091a062 134 - PINSEL_PIN_0 : Pin 0
igorsk 0:1063a091a062 135 - PINSEL_PIN_1 : Pin 1
igorsk 0:1063a091a062 136 - PINSEL_PIN_2 : Pin 2
igorsk 0:1063a091a062 137 - PINSEL_PIN_3 : Pin 3
igorsk 0:1063a091a062 138 - PINSEL_PIN_4 : Pin 4
igorsk 0:1063a091a062 139 - PINSEL_PIN_5 : Pin 5
igorsk 0:1063a091a062 140 - PINSEL_PIN_6 : Pin 6
igorsk 0:1063a091a062 141 - PINSEL_PIN_7 : Pin 7
igorsk 0:1063a091a062 142 - PINSEL_PIN_8 : Pin 8
igorsk 0:1063a091a062 143 - PINSEL_PIN_9 : Pin 9
igorsk 0:1063a091a062 144 - PINSEL_PIN_10 : Pin 10
igorsk 0:1063a091a062 145 - PINSEL_PIN_11 : Pin 11
igorsk 0:1063a091a062 146 - PINSEL_PIN_12 : Pin 12
igorsk 0:1063a091a062 147 - PINSEL_PIN_13 : Pin 13
igorsk 0:1063a091a062 148 - PINSEL_PIN_14 : Pin 14
igorsk 0:1063a091a062 149 - PINSEL_PIN_15 : Pin 15
igorsk 0:1063a091a062 150 - PINSEL_PIN_16 : Pin 16
igorsk 0:1063a091a062 151 - PINSEL_PIN_17 : Pin 17
igorsk 0:1063a091a062 152 - PINSEL_PIN_18 : Pin 18
igorsk 0:1063a091a062 153 - PINSEL_PIN_19 : Pin 19
igorsk 0:1063a091a062 154 - PINSEL_PIN_20 : Pin 20
igorsk 0:1063a091a062 155 - PINSEL_PIN_21 : Pin 21
igorsk 0:1063a091a062 156 - PINSEL_PIN_22 : Pin 22
igorsk 0:1063a091a062 157 - PINSEL_PIN_23 : Pin 23
igorsk 0:1063a091a062 158 - PINSEL_PIN_24 : Pin 24
igorsk 0:1063a091a062 159 - PINSEL_PIN_25 : Pin 25
igorsk 0:1063a091a062 160 - PINSEL_PIN_26 : Pin 26
igorsk 0:1063a091a062 161 - PINSEL_PIN_27 : Pin 27
igorsk 0:1063a091a062 162 - PINSEL_PIN_28 : Pin 28
igorsk 0:1063a091a062 163 - PINSEL_PIN_29 : Pin 29
igorsk 0:1063a091a062 164 - PINSEL_PIN_30 : Pin 30
igorsk 0:1063a091a062 165 - PINSEL_PIN_31 : Pin 31
igorsk 0:1063a091a062 166
igorsk 0:1063a091a062 167 * @param[in] modenum: Mode number,
igorsk 0:1063a091a062 168 * should be one of the following:
igorsk 0:1063a091a062 169 - PINSEL_PINMODE_PULLUP : Internal pull-up resistor
igorsk 0:1063a091a062 170 - PINSEL_PINMODE_TRISTATE : Tri-state
igorsk 0:1063a091a062 171 - PINSEL_PINMODE_PULLDOWN : Internal pull-down resistor
igorsk 0:1063a091a062 172
igorsk 0:1063a091a062 173 * @return None
igorsk 0:1063a091a062 174 **********************************************************************/
igorsk 0:1063a091a062 175 void PINSEL_SetResistorMode ( uint8_t portnum, uint8_t pinnum, uint8_t modenum)
igorsk 0:1063a091a062 176 {
igorsk 0:1063a091a062 177 uint32_t pinnum_t = pinnum;
igorsk 0:1063a091a062 178 uint32_t pinmodereg_idx = 2 * portnum;
igorsk 0:1063a091a062 179 uint32_t *pPinCon = (uint32_t *)&LPC_PINCON->PINMODE0;
igorsk 0:1063a091a062 180
igorsk 0:1063a091a062 181 if (pinnum_t >= 16) {
igorsk 0:1063a091a062 182 pinnum_t -= 16;
igorsk 0:1063a091a062 183 pinmodereg_idx++ ;
igorsk 0:1063a091a062 184 }
igorsk 0:1063a091a062 185
igorsk 0:1063a091a062 186 *(uint32_t *)(pPinCon + pinmodereg_idx) &= ~(0x03UL << (pinnum_t * 2));
igorsk 0:1063a091a062 187 *(uint32_t *)(pPinCon + pinmodereg_idx) |= ((uint32_t)modenum) << (pinnum_t * 2);
igorsk 0:1063a091a062 188 }
igorsk 0:1063a091a062 189
igorsk 0:1063a091a062 190
igorsk 0:1063a091a062 191
igorsk 0:1063a091a062 192 /*********************************************************************//**
igorsk 0:1063a091a062 193 * @brief Setup Open drain mode for each pin
igorsk 0:1063a091a062 194 * @param[in] portnum PORT number,
igorsk 0:1063a091a062 195 * should be one of the following:
igorsk 0:1063a091a062 196 * - PINSEL_PORT_0 : Port 0
igorsk 0:1063a091a062 197 * - PINSEL_PORT_1 : Port 1
igorsk 0:1063a091a062 198 * - PINSEL_PORT_2 : Port 2
igorsk 0:1063a091a062 199 * - PINSEL_PORT_3 : Port 3
igorsk 0:1063a091a062 200 *
igorsk 0:1063a091a062 201 * @param[in] pinnum Pin number,
igorsk 0:1063a091a062 202 * should be one of the following:
igorsk 0:1063a091a062 203 - PINSEL_PIN_0 : Pin 0
igorsk 0:1063a091a062 204 - PINSEL_PIN_1 : Pin 1
igorsk 0:1063a091a062 205 - PINSEL_PIN_2 : Pin 2
igorsk 0:1063a091a062 206 - PINSEL_PIN_3 : Pin 3
igorsk 0:1063a091a062 207 - PINSEL_PIN_4 : Pin 4
igorsk 0:1063a091a062 208 - PINSEL_PIN_5 : Pin 5
igorsk 0:1063a091a062 209 - PINSEL_PIN_6 : Pin 6
igorsk 0:1063a091a062 210 - PINSEL_PIN_7 : Pin 7
igorsk 0:1063a091a062 211 - PINSEL_PIN_8 : Pin 8
igorsk 0:1063a091a062 212 - PINSEL_PIN_9 : Pin 9
igorsk 0:1063a091a062 213 - PINSEL_PIN_10 : Pin 10
igorsk 0:1063a091a062 214 - PINSEL_PIN_11 : Pin 11
igorsk 0:1063a091a062 215 - PINSEL_PIN_12 : Pin 12
igorsk 0:1063a091a062 216 - PINSEL_PIN_13 : Pin 13
igorsk 0:1063a091a062 217 - PINSEL_PIN_14 : Pin 14
igorsk 0:1063a091a062 218 - PINSEL_PIN_15 : Pin 15
igorsk 0:1063a091a062 219 - PINSEL_PIN_16 : Pin 16
igorsk 0:1063a091a062 220 - PINSEL_PIN_17 : Pin 17
igorsk 0:1063a091a062 221 - PINSEL_PIN_18 : Pin 18
igorsk 0:1063a091a062 222 - PINSEL_PIN_19 : Pin 19
igorsk 0:1063a091a062 223 - PINSEL_PIN_20 : Pin 20
igorsk 0:1063a091a062 224 - PINSEL_PIN_21 : Pin 21
igorsk 0:1063a091a062 225 - PINSEL_PIN_22 : Pin 22
igorsk 0:1063a091a062 226 - PINSEL_PIN_23 : Pin 23
igorsk 0:1063a091a062 227 - PINSEL_PIN_24 : Pin 24
igorsk 0:1063a091a062 228 - PINSEL_PIN_25 : Pin 25
igorsk 0:1063a091a062 229 - PINSEL_PIN_26 : Pin 26
igorsk 0:1063a091a062 230 - PINSEL_PIN_27 : Pin 27
igorsk 0:1063a091a062 231 - PINSEL_PIN_28 : Pin 28
igorsk 0:1063a091a062 232 - PINSEL_PIN_29 : Pin 29
igorsk 0:1063a091a062 233 - PINSEL_PIN_30 : Pin 30
igorsk 0:1063a091a062 234 - PINSEL_PIN_31 : Pin 31
igorsk 0:1063a091a062 235
igorsk 0:1063a091a062 236 * @param[in] modenum Open drain mode number,
igorsk 0:1063a091a062 237 * should be one of the following:
igorsk 0:1063a091a062 238 * - PINSEL_PINMODE_NORMAL : Pin is in the normal (not open drain) mode
igorsk 0:1063a091a062 239 * - PINSEL_PINMODE_OPENDRAIN : Pin is in the open drain mode
igorsk 0:1063a091a062 240 *
igorsk 0:1063a091a062 241 * @return None
igorsk 0:1063a091a062 242 **********************************************************************/
igorsk 0:1063a091a062 243 void PINSEL_SetOpenDrainMode( uint8_t portnum, uint8_t pinnum, uint8_t modenum)
igorsk 0:1063a091a062 244 {
igorsk 0:1063a091a062 245 uint32_t *pPinCon = (uint32_t *)&LPC_PINCON->PINMODE_OD0;
igorsk 0:1063a091a062 246
igorsk 0:1063a091a062 247 if (modenum == PINSEL_PINMODE_OPENDRAIN){
igorsk 0:1063a091a062 248 *(uint32_t *)(pPinCon + portnum) |= (0x01UL << pinnum);
igorsk 0:1063a091a062 249 } else {
igorsk 0:1063a091a062 250 *(uint32_t *)(pPinCon + portnum) &= ~(0x01UL << pinnum);
igorsk 0:1063a091a062 251 }
igorsk 0:1063a091a062 252 }
igorsk 0:1063a091a062 253
igorsk 0:1063a091a062 254
igorsk 0:1063a091a062 255
igorsk 0:1063a091a062 256 /*********************************************************************//**
igorsk 0:1063a091a062 257 * @brief Setup I2C0 pins
igorsk 0:1063a091a062 258 * @param[in] i2cPinMode I2C pin mode,
igorsk 0:1063a091a062 259 * should be one of the following:
igorsk 0:1063a091a062 260 * - PINSEL_I2C_Normal_Mode : The standard drive mode
igorsk 0:1063a091a062 261 * - PINSEL_I2C_Fast_Mode : Fast Mode Plus drive mode
igorsk 0:1063a091a062 262 *
igorsk 0:1063a091a062 263 * @param[in] filterSlewRateEnable should be:
igorsk 0:1063a091a062 264 * - ENABLE: Enable filter and slew rate.
igorsk 0:1063a091a062 265 * - DISABLE: Disable filter and slew rate.
igorsk 0:1063a091a062 266 *
igorsk 0:1063a091a062 267 * @return None
igorsk 0:1063a091a062 268 **********************************************************************/
igorsk 0:1063a091a062 269 void PINSEL_SetI2C0Pins(uint8_t i2cPinMode, FunctionalState filterSlewRateEnable)
igorsk 0:1063a091a062 270 {
igorsk 0:1063a091a062 271 uint32_t regVal=0;
igorsk 0:1063a091a062 272
igorsk 0:1063a091a062 273 if (i2cPinMode == PINSEL_I2C_Fast_Mode){
igorsk 0:1063a091a062 274 regVal |= PINSEL_I2CPADCFG_SCLDRV0 | PINSEL_I2CPADCFG_SDADRV0;
igorsk 0:1063a091a062 275 }
igorsk 0:1063a091a062 276
igorsk 0:1063a091a062 277 if (filterSlewRateEnable == DISABLE){
igorsk 0:1063a091a062 278 regVal |= PINSEL_I2CPADCFG_SCLI2C0 | PINSEL_I2CPADCFG_SDAI2C0;
igorsk 0:1063a091a062 279 }
igorsk 0:1063a091a062 280 LPC_PINCON->I2CPADCFG = regVal;
igorsk 0:1063a091a062 281 }
igorsk 0:1063a091a062 282
igorsk 0:1063a091a062 283
igorsk 0:1063a091a062 284 /*********************************************************************//**
igorsk 0:1063a091a062 285 * @brief Configure Pin corresponding to specified parameters passed
igorsk 0:1063a091a062 286 * in the PinCfg
igorsk 0:1063a091a062 287 * @param[in] PinCfg Pointer to a PINSEL_CFG_Type structure
igorsk 0:1063a091a062 288 * that contains the configuration information for the
igorsk 0:1063a091a062 289 * specified pin.
igorsk 0:1063a091a062 290 * @return None
igorsk 0:1063a091a062 291 **********************************************************************/
igorsk 0:1063a091a062 292 void PINSEL_ConfigPin(PINSEL_CFG_Type *PinCfg)
igorsk 0:1063a091a062 293 {
igorsk 0:1063a091a062 294 PINSEL_SetPinFunc(PinCfg->Portnum, PinCfg->Pinnum, PinCfg->Funcnum);
igorsk 0:1063a091a062 295 PINSEL_SetResistorMode(PinCfg->Portnum, PinCfg->Pinnum, PinCfg->Pinmode);
igorsk 0:1063a091a062 296 PINSEL_SetOpenDrainMode(PinCfg->Portnum, PinCfg->Pinnum, PinCfg->OpenDrain);
igorsk 0:1063a091a062 297 }
igorsk 0:1063a091a062 298
igorsk 0:1063a091a062 299
igorsk 0:1063a091a062 300 /**
igorsk 0:1063a091a062 301 * @}
igorsk 0:1063a091a062 302 */
igorsk 0:1063a091a062 303
igorsk 0:1063a091a062 304 /**
igorsk 0:1063a091a062 305 * @}
igorsk 0:1063a091a062 306 */
igorsk 0:1063a091a062 307
igorsk 0:1063a091a062 308 /* --------------------------------- End Of File ------------------------------ */