/* ****************************************************************************** * @file main.c * @author APT AE Team * @version V1.10 * @date 2021/08/25 ****************************************************************************** *THIS SOFTWARE WHICH IS FOR ILLUSTRATIVE PURPOSES ONLY WHICH PROVIDES *CUSTOMER WITH CODING INFORMATION REGARDING THEIR PRODUCTS. *APT CHIP SHALL NOT BE HELD RESPONSIBILITY ADN LIABILITY FOR ANY DIRECT, *INDIRECT DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF *SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION *CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.AND APT CHIP RESERVES *THE RIGHT TO MAKE CHANGES IN THE SOFTWARE WITHOUT NOTIFICATION ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "apt32f102_gpio.h" /* define --------------------------------------------------------------------*/ /* externs--------------------------------------------------------------------*/ /*************************************************************/ //IO RESET CLEAR ALL REGISTER //EntryParameter:NONE //ReturnValue:NONE /*************************************************************/ void GPIO_DeInit(void) { GPIOA0->CONLR &= 0xFF000000; GPIOA0->CONHR = GPIO_RESET_VALUE; GPIOB0->CONLR = GPIO_RESET_VALUE; GPIOB0->CONHR = GPIO_RESET_VALUE; GPIOA0->WODR = GPIO_RESET_VALUE; GPIOB0->WODR = GPIO_RESET_VALUE; GPIOA0->SODR = GPIO_RESET_VALUE; GPIOB0->SODR = GPIO_RESET_VALUE; GPIOA0->CODR = GPIO_RESET_VALUE; GPIOB0->CODR = GPIO_RESET_VALUE; GPIOA0->ODSR = GPIO_RESET_VALUE; GPIOB0->ODSR = GPIO_RESET_VALUE; GPIOA0->PSDR = GPIO_RESET_VALUE; GPIOB0->PSDR = GPIO_RESET_VALUE; GPIOA0->FLTEN = 0xffff; GPIOB0->FLTEN = 0x3f; GPIOA0->PUDR = GPIO_RESET_VALUE; GPIOB0->PUDR = GPIO_RESET_VALUE; GPIOA0->DSCR = GPIO_RESET_VALUE; GPIOB0->DSCR = GPIO_RESET_VALUE; GPIOA0->OMCR = GPIO_RESET_VALUE; GPIOB0->OMCR = GPIO_RESET_VALUE; GPIOA0->IECR = GPIO_RESET_VALUE; GPIOB0->IECR = GPIO_RESET_VALUE; GPIOGRP->IGRPL = GPIO_RESET_VALUE; GPIOGRP->IGRPH = GPIO_RESET_VALUE; GPIOGRP->IGREX = GPIO_RESET_VALUE; GPIOGRP->IO_CLKEN = 0xf; } /*************************************************************/ //IO OUTPUT INPUT SET 2 //EntryParameter:GPIOx,byte,val //GPIOx:GPIOA0,GPIOB0 //byte:Lowbyte(PIN_0~7),Highbyte(PIN_8~15) //val:0x0000000~0xFFFFFFFF //val=0x11111111 all IO as input //val=0x22222222 all IO as output //ReturnValue:NONE /*************************************************************/ void GPIO_Init2(CSP_GPIO_T *GPIOx,GPIO_byte_TypeDef byte,uint32_t val) { if (byte==0) { (GPIOx)->CONLR=val; } else if(byte==1) { (GPIOx)->CONHR=val; } } /*************************************************************/ //IO OUTPUT INPUT SET 1 //EntryParameter:GPIOx,GPIO_Pin(0~15),byte,Dir //GPIOx:GPIOA0,GPIOB0 //GPIO_Pin:PIN_0~15 //byte:Lowbyte(PIN_0~7),Highbyte(PIN_8~15) //Dir:0:output 1:input //ReturnValue:NONE /*************************************************************/ void GPIO_Init(CSP_GPIO_T *GPIOx,uint8_t PinNum,GPIO_Dir_TypeDef Dir) { uint32_t data_temp; uint8_t GPIO_Pin; if(PinNum<8) { switch (PinNum) { case 0:data_temp=0xfffffff0;GPIO_Pin=0;break; case 1:data_temp=0xffffff0f;GPIO_Pin=4;break; case 2:data_temp=0xfffff0ff;GPIO_Pin=8;break; case 3:data_temp=0xffff0fff;GPIO_Pin=12;break; case 4:data_temp=0xfff0ffff;GPIO_Pin=16;break; case 5:data_temp=0xff0fffff;GPIO_Pin=20;break; case 6:data_temp=0xf0ffffff;GPIO_Pin=24;break; case 7:data_temp=0x0fffffff;GPIO_Pin=28;break; } if (Dir) { (GPIOx)->CONLR =((GPIOx)->CONLR & data_temp) | 1<CONLR = ((GPIOx)->CONLR & data_temp) | 2<CONHR = ((GPIOx)->CONHR & data_temp) | 1<CONHR = ((GPIOx)->CONHR & data_temp) | 2<CONLR = (GPIOx)->CONLR & data_temp; } else if (PinNum<16) { switch (PinNum) { case 8:data_temp=0xfffffff0;break; case 9:data_temp=0xffffff0f;break; case 10:data_temp=0xfffff0ff;break; case 11:data_temp=0xffff0fff;break; case 12:data_temp=0xfff0ffff;break; case 13:data_temp=0xff0fffff;break; case 14:data_temp=0xf0ffffff;break; case 15:data_temp=0x0fffffff;break; } (GPIOx)->CONHR = (GPIOx)->CONHR & data_temp; } } /*************************************************************/ //IO OUTPUT INPUT SET //EntryParameter:IO_MODE,GPIOx,val //GPIOx:GPIOA0,GPIOB0 //IO_MODE:PUDR(IO PULL HIGH/LOW) //IO_MODE:DSCR(IO DRIVE STRENGHT) //IO_MODE:OMCR(OUTPUT MODE SET) //IO_MODE:IECR(IO INT ENABLE) //ReturnValue:NONE /*************************************************************/ void GPIO_MODE_Init(CSP_GPIO_T *GPIOx,GPIO_Mode_TypeDef IO_MODE,uint32_t val) { switch (IO_MODE) { case PUDR:(GPIOx)->PUDR = val;break; case DSCR:(GPIOx)->DSCR = val;break; case OMCR:(GPIOx)->OMCR = val;break; case IECR:(GPIOx)->IECR = val;break; } } /*************************************************************/ //Write GPIO pull high/low //EntryParameter:GPIOx,uint8_t bit //GPIOx:GPIOA0,GPIOB0 //bit:0~15 //ReturnValue:VALUE /*************************************************************/ void GPIO_PullHigh_Init(CSP_GPIO_T *GPIOx,uint8_t bit) { (GPIOx)->PUDR = (((GPIOx)->PUDR) & ~(0x03<<(bit*2))) | (0x01<<(bit*2)); } void GPIO_PullLow_Init(CSP_GPIO_T *GPIOx,uint8_t bit) { (GPIOx)->PUDR = (((GPIOx)->PUDR) & ~(0x03<<(bit*2))) | (0x02<<(bit*2)); } void GPIO_PullHighLow_DIS(CSP_GPIO_T *GPIOx,uint8_t bit) { (GPIOx)->PUDR = ((GPIOx)->PUDR) & ~(0x03<<(bit*2)); } /*************************************************************/ //Write GPIO open drain init //EntryParameter:GPIOx,uint8_t bit //GPIOx:GPIOA0,GPIOB0 //bit:0~15 //ReturnValue:VALUE /*************************************************************/ void GPIO_OpenDrain_EN(CSP_GPIO_T *GPIOx,uint8_t bit) { (GPIOx)->OMCR = ((GPIOx)->OMCR) | (0x01<OMCR = ((GPIOx)->OMCR) & ~(0x01<DSCR = ((GPIOx)->DSCR) & ~(0x01<<(bit*2+1)); } else { (GPIOx)->DSCR = ((GPIOx)->DSCR) | (0x01<<(bit*2+1)); if(INPUT_MODE_SETECTED_X==INPUT_MODE_SETECTED_TTL1) { (GPIOx)->OMCR = ((GPIOx)->OMCR) | (0x01<<(bit+16)); } else if(INPUT_MODE_SETECTED_X==INPUT_MODE_SETECTED_TTL2) { (GPIOx)->OMCR = ((GPIOx)->OMCR) & ~(0x01<<(bit+16)); } } } /*************************************************************/ //Write GPIO Drive Strength init //EntryParameter:GPIOx,uint8_t bit //GPIOx:GPIOA0,GPIOB0 //bit:0~15 //ReturnValue:VALUE /*************************************************************/ void GPIO_DriveStrength_EN(CSP_GPIO_T *GPIOx,uint8_t bit) { (GPIOx)->DSCR = ((GPIOx)->DSCR) | (0x01<<(bit*2)); } void GPIO_DriveStrength_DIS(CSP_GPIO_T *GPIOx,uint8_t bit) { (GPIOx)->DSCR = ((GPIOx)->DSCR) & ~(0x01<<(bit*2)); } /*************************************************************/ //IO OUTPUT INPUT SET //EntryParameter: //IO_MODE:IGRP(IO INT GROUP) //PinNum:0~15 //SYSCON_EXIPIN_TypeDef:EXI_PIN0~EXI_PIN19 //EXI0~EXI15:GPIOA0,GPIOB0 //EXI16~EXI17:GPIOA0.0~GPIOA0.7 //EXI18~EXI19:GPIOB0.0~GPIOB0.3 //ReturnValue:NONE /*************************************************************/ void GPIO_IntGroup_Set(GPIO_Group_TypeDef IO_MODE , uint8_t PinNum , GPIO_EXIPIN_TypeDef Selete_EXI_x) { volatile unsigned int R_data_temp; volatile unsigned char R_GPIO_Pin; if(Selete_EXI_x<16) { if((Selete_EXI_x==0)||(Selete_EXI_x==8)) { R_data_temp=0xfffffff0; R_GPIO_Pin=0; } else if((Selete_EXI_x==1)||(Selete_EXI_x==9)) { R_data_temp=0xffffff0f; R_GPIO_Pin=4; } else if((Selete_EXI_x==2)||(Selete_EXI_x==10)) { R_data_temp=0xfffff0ff; R_GPIO_Pin=8; } else if((Selete_EXI_x==3)||(Selete_EXI_x==11)) { R_data_temp=0xffff0fff; R_GPIO_Pin=12; } else if((Selete_EXI_x==4)||(Selete_EXI_x==12)) { R_data_temp=0xfff0ffff; R_GPIO_Pin=16; } else if((Selete_EXI_x==5)||(Selete_EXI_x==13)) { R_data_temp=0xff0fffff; R_GPIO_Pin=20; } else if((Selete_EXI_x==6)||(Selete_EXI_x==14)) { R_data_temp=0xf0ffffff; R_GPIO_Pin=24; } else if((Selete_EXI_x==7)||(Selete_EXI_x==15)) { R_data_temp=0x0fffffff; R_GPIO_Pin=28; } if(Selete_EXI_x<8) { GPIOGRP->IGRPL =(GPIOGRP->IGRPL & R_data_temp) | (IO_MODE<=8)) { GPIOGRP->IGRPH =(GPIOGRP->IGRPH & R_data_temp) | (IO_MODE<IGREX =(GPIOGRP->IGREX)|PinNum; } else if(Selete_EXI_x==17) { GPIOGRP->IGREX=(GPIOGRP->IGREX)|(PinNum<<4); } } else if((IO_MODE==2)&&((Selete_EXI_x==18)||(Selete_EXI_x==19))) //PB0.0~PB0.3 { if(Selete_EXI_x==18) { GPIOGRP->IGREX=(GPIOGRP->IGREX)|(PinNum<<8); } else if(Selete_EXI_x==19) { GPIOGRP->IGREX=(GPIOGRP->IGREX)|(PinNum<<12); } } } } /*************************************************************/ //IO EXI SET //EntryParameter:EXI_IO(EXI0~EXI13) //ReturnValue:NONE /*************************************************************/ void GPIOA0_EXI_Init(GPIO_EXI_TypeDef EXI_IO) { switch (EXI_IO) { case 0:GPIOA0->CONLR = (GPIOA0->CONLR&0XFFFFFFF0) | 0X00000001;break; case 1:GPIOA0->CONLR = (GPIOA0->CONLR&0XFFFFFF0F) | 0X00000010;break; case 2:GPIOA0->CONLR = (GPIOA0->CONLR&0XFFFFF0FF) | 0X00000100;break; case 3:GPIOA0->CONLR = (GPIOA0->CONLR&0XFFFF0FFF) | 0X00001000;break; case 4:GPIOA0->CONLR = (GPIOA0->CONLR&0XFFF0FFFF) | 0X00010000;break; case 5:GPIOA0->CONLR = (GPIOA0->CONLR&0XFF0FFFFF) | 0X00100000;break; case 6:GPIOA0->CONLR = (GPIOA0->CONLR&0XF0FFFFFF) | 0X01000000;break; case 7:GPIOA0->CONLR = (GPIOA0->CONLR&0X0FFFFFFF) | 0X10000000;break; case 8:GPIOA0->CONHR = (GPIOA0->CONHR&0XFFFFFFF0) | 0X00000001;break; case 9:GPIOA0->CONHR = (GPIOA0->CONHR&0XFFFFFF0F) | 0X00000010;break; case 10:GPIOA0->CONHR = (GPIOA0->CONHR&0XFFFFF0FF) | 0X00000100;break; case 11:GPIOA0->CONHR = (GPIOA0->CONHR&0XFFFF0FFF) | 0X00001000;break; case 12:GPIOA0->CONHR = (GPIOA0->CONHR&0XFFF0FFFF) | 0X00010000;break; case 13:GPIOA0->CONHR = (GPIOA0->CONHR&0XFF0FFFFF) | 0X00100000;break; case 14:GPIOA0->CONHR = (GPIOA0->CONHR&0XF0FFFFFF) | 0X01000000;break; case 15:GPIOA0->CONHR = (GPIOA0->CONHR&0X0FFFFFFF) | 0X10000000;break; } } void GPIOB0_EXI_Init(GPIO_EXI_TypeDef EXI_IO) { switch (EXI_IO) { case 0:GPIOB0->CONLR = (GPIOB0->CONLR&0XFFFFFFF0) | 0X00000001;break; case 1:GPIOB0->CONLR = (GPIOB0->CONLR&0XFFFFFF0F) | 0X00000010;break; case 2:GPIOB0->CONLR = (GPIOB0->CONLR&0XFFFFF0FF) | 0X00000100;break; case 3:GPIOB0->CONLR = (GPIOB0->CONLR&0XFFFF0FFF) | 0X00001000;break; case 4:GPIOB0->CONLR = (GPIOB0->CONLR&0XFFF0FFFF) | 0X00010000;break; case 5:GPIOB0->CONLR = (GPIOB0->CONLR&0XFF0FFFFF) | 0X00100000;break; default:break; } } void GPIO_EXI_EN(CSP_GPIO_T *GPIOx,GPIO_EXI_TypeDef EXI_IO) { (GPIOx)->IECR |= 1<SODR = (1ul<CODR = (1ul<SODR = (1ul<CODR = (1ul<ODSR>>bit)&1ul; { if (dat==1) { (GPIOx)->CODR = (1ul<SODR = (1ul<PSDR)&(1<ODSR)&(1<