void pinMode(uint8_t pin, uint8_t mode) { volatile uint32_t *dir; volatile uint8_t *sel; volatile uint32_t *out; volatile uint32_t *pud; uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); dir = portDirRegister(port); sel = portSelRegister(port); out = portOutputRegister(port); pud = portPullupRegister(port); if (port == NOT_A_PORT) return; if(pin > 31){ pin -= 32; } EALLOW; //Turn off peripheral function if(port == PORT_A_2){ *sel &= ~((uint32_t)0x03 << ((pin-16) * 2)); }else{ *sel &= ~((uint32_t)0x03 << (pin * 2)); } *dir &= ~((uint32_t)1 << pin); *dir |= ((uint32_t)(mode & 0x01) << pin); if(mode == INPUT_PULLUP){ *pud &= ~((uint32_t)1 << pin); }else{ *pud |= ((uint32_t)1 << pin); } EDIS; }
void pinMode(uint8_t pin, uint8_t mode) { if(pin & 0x8000) { EALLOW; //Analog Pins pin &= 0x7FFF; if(mode == HARDWARE) { //Turn on normal analog functionality GpioCtrlRegs.AIOMUX1.all |= 3UL << (pin * 2); } else { //Turn on AIO functionality GpioCtrlRegs.AIOMUX1.all &= ~( 3UL << (pin * 2)); if(mode == INPUT) { GpioCtrlRegs.AIODIR.all &= ~(1UL << pin); } else if(mode == OUTPUT) { GpioCtrlRegs.AIODIR.all |= (1UL << pin); } } EDIS; } else { //Digital Pins volatile uint32_t *dir; volatile uint32_t *sel; volatile uint32_t *pud; uint8_t port = digitalPinToPort(pin); dir = portDirRegister(port); sel = portSelRegister(port); pud = portPullupRegister(port); if (port == NOT_A_PORT) return; if(pin > 31){ pin -= 32; } EALLOW; //Turn off peripheral function if(port == PORT_A_2){ *sel &= ~((uint32_t)0x03 << ((pin-16) * 2)); }else{ *sel &= ~((uint32_t)0x03 << (pin * 2)); } *dir &= ~((uint32_t)1 << pin); *dir |= ((uint32_t)(mode & 0x01) << pin); if(mode == INPUT_PULLUP){ *pud &= ~((uint32_t)1 << pin); }else{ *pud |= ((uint32_t)1 << pin); } EDIS; } }
void pinMode(uint8_t pin, uint8_t mode) { uint16_t gpio_number = pin_mapping[pin]; if(gpio_number & 0x8000) { EALLOW; //Analog Pins #ifdef TMS320F28377S AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; AdcaRegs.ADCCTL2.bit.SIGNALMODE = 0; //single-ended AdcaRegs.ADCCTL2.bit.RESOLUTION = 0; //12-bit AdcaRegs.ADCSOC0CTL.bit.CHSEL = gpio_number & 0xF; #else gpio_number &= 0x7FFF; if(mode == HARDWARE) { //Turn on normal analog functionality GpioCtrlRegs.AIOMUX1.all |= 3UL << (gpio_number * 2); } else { //Turn on AIO functionality GpioCtrlRegs.AIOMUX1.all &= ~( 3UL << (gpio_number * 2)); if(mode == INPUT) { GpioCtrlRegs.AIODIR.all &= ~(1UL << gpio_number); } else if(mode == OUTPUT) { GpioCtrlRegs.AIODIR.all |= (1UL << gpio_number); } } #endif EDIS; } else { //Digital Pins volatile uint32_t *dir; volatile uint32_t *sel; volatile uint32_t *pud; uint8_t port = digitalPinToPort(gpio_number); dir = portDirRegister(port); sel = portSelRegister(port); pud = portPullupRegister(port); if (port == NOT_A_PORT) return; gpio_number %= 32; //limits gpio_number to 32 bits EALLOW; //Turn off peripheral function if(port == PORT_A_2) { *sel &= ~((uint32_t)0x03 << ((gpio_number-16) * 2)); } else { *sel &= ~((uint32_t)0x03 << (gpio_number * 2)); } *dir &= ~((uint32_t)1 << gpio_number); *dir |= ((uint32_t)(mode & 0x01) << gpio_number); if(mode == INPUT_PULLUP) { *pud &= ~((uint32_t)1 << gpio_number); } else { *pud |= ((uint32_t)1 << gpio_number); } EDIS; } }