#include "board.h" static int16_t GPIO_ClkNest = 0; void GPIO_ReqClkOn(void) { rt_base_t level; level = rt_hw_interrupt_disable(); GPIO_ClkNest++; M0P_SYSCTRL->PERI_CLKEN0 |= (1u<<28); // set GPIO clk on rt_hw_interrupt_enable(level); } void GPIO_ReqClkOff(void) { rt_base_t level; level = rt_hw_interrupt_disable(); GPIO_ClkNest--; if (GPIO_ClkNest<=0){ GPIO_ClkNest = 0; M0P_SYSCTRL->PERI_CLKEN0 &= ~(1u<<28); // set GPIO clk off } rt_hw_interrupt_enable(level); } void SetClrRegBits(uint32_t Addr, uint32_t BitsMask, uint32_t SetOrClr){ if (SetOrClr){ *((volatile uint32_t *)Addr) |= BitsMask; } else { *((volatile uint32_t *)Addr) &= ~BitsMask; } } void GpioInit(uint32_t PinFunc, uint32_t Property){ uint32_t ClkEn; uint32_t ClkOff; rt_base_t level; uint32_t enPort, enPin; enPort = PinFunc>>16; enPin = (PinFunc>>8)&0xFFU; level = rt_hw_interrupt_disable(); ClkEn = M0P_SYSCTRL->PERI_CLKEN0; ClkOff = (~ClkEn) & (1u<<28); // check GPIO clk is off or not if (ClkOff){ M0P_SYSCTRL->PERI_CLKEN0 = ClkEn | (0x1u<<28); // set GPIO clk on } *((volatile uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL))) + enPort + (enPin<<2))) = PinFunc&0xFFU; enPin = 0x1U<PAADS))) + enPort, enPin, Property&GPIO_ADS_Msk); SetClrRegBits(((uint32_t)(&(M0P_GPIO->PAOD))) + enPort, enPin, Property&GPIO_OD_Msk); SetClrRegBits(((uint32_t)(&(M0P_GPIO->PADIR))) + enPort, enPin, Property&GPIO_DIR_Msk); SetClrRegBits(((uint32_t)(&(M0P_GPIO->PADR))) + enPort, enPin, Property&GPIO_DR_Msk); SetClrRegBits(((uint32_t)(&(M0P_GPIO->PAPU))) + enPort, enPin, Property&GPIO_PU_Msk); SetClrRegBits(((uint32_t)(&(M0P_GPIO->PAPD))) + enPort, enPin, Property&GPIO_PD_Msk); if (ClkOff){ M0P_SYSCTRL->PERI_CLKEN0 = ClkEn; // set back GPIO clk off } rt_hw_interrupt_enable(level); } void GpioEventInit(uint32_t PinFunc, uint32_t EventType) { uint32_t ClkEn; uint32_t ClkOff; rt_base_t level; uint32_t enPort, enPin; enPort = PinFunc>>16; enPin = (PinFunc>>8)&0xFU; enPin = 0x1U<PERI_CLKEN0; ClkOff = (~ClkEn) & (1u<<28); // check GPIO clk is off or not if (ClkOff){ M0P_SYSCTRL->PERI_CLKEN0 = ClkEn | (0x1u<<28); // set GPIO clk on } SetClrRegBits(((uint32_t)(&(M0P_GPIO->PAHIE))) + enPort, enPin, (EventType&GPIO_EVENT_HIGH)); SetClrRegBits(((uint32_t)(&(M0P_GPIO->PALIE))) + enPort, enPin, (EventType&GPIO_EVENT_LOW )); SetClrRegBits(((uint32_t)(&(M0P_GPIO->PARIE))) + enPort, enPin, (EventType&GPIO_EVENT_RISE)); SetClrRegBits(((uint32_t)(&(M0P_GPIO->PAFIE))) + enPort, enPin, (EventType&GPIO_EVENT_FALL)); if (ClkOff){ M0P_SYSCTRL->PERI_CLKEN0 = ClkEn; // set back GPIO clk off } rt_hw_interrupt_enable(level); } uint32_t GpioGetEvents(en_gpio_port_t Port, uint32_t BitsMsk) { uint32_t ClkEn; uint32_t ClkOff; rt_base_t level; uint32_t Events; level = rt_hw_interrupt_disable(); ClkEn = M0P_SYSCTRL->PERI_CLKEN0; ClkOff = (~ClkEn) & (1u<<28); // check GPIO clk is off or not if (ClkOff){ M0P_SYSCTRL->PERI_CLKEN0 = ClkEn | (0x1u<<28); // set GPIO clk on } Events = *((volatile uint32_t*)(((uint32_t)&M0P_GPIO->PA_STAT) + Port)); Events &= BitsMsk; *((volatile uint32_t*)(((uint32_t)&M0P_GPIO->PA_ICLR) + Port)) = ~Events; if (ClkOff){ M0P_SYSCTRL->PERI_CLKEN0 = ClkEn; // set back GPIO clk off } rt_hw_interrupt_enable(level); return(Events); } void GpioSetPins(en_gpio_port_t GpioPort, uint32_t BitsMask) { uint32_t ClkEn; uint32_t ClkOff; rt_base_t level; uint32_t Addr; Addr = (uint32_t)(&(M0P_GPIO->PABSET)) + GpioPort; level = rt_hw_interrupt_disable(); ClkEn = M0P_SYSCTRL->PERI_CLKEN0; ClkOff = (~ClkEn) & (1u<<28); // check GPIO clk is off or not if (ClkOff){ M0P_SYSCTRL->PERI_CLKEN0 = ClkEn | (0x1u<<28); // set GPIO clk on } *((volatile uint32_t*)Addr) = BitsMask; if (ClkOff){ M0P_SYSCTRL->PERI_CLKEN0 = ClkEn; // set back GPIO clk off } rt_hw_interrupt_enable(level); } void GpioClrPins(en_gpio_port_t GpioPort, uint32_t BitsMask) { uint32_t ClkEn; uint32_t ClkOff; rt_base_t level; uint32_t Addr; Addr = (uint32_t)(&(M0P_GPIO->PABCLR)) + GpioPort; level = rt_hw_interrupt_disable(); ClkEn = M0P_SYSCTRL->PERI_CLKEN0; ClkOff = (~ClkEn) & (1u<<28); // check GPIO clk is off or not if (ClkOff){ M0P_SYSCTRL->PERI_CLKEN0 = ClkEn | (0x1u<<28); // set GPIO clk on } *((volatile uint32_t*)Addr) = BitsMask; if (ClkOff){ M0P_SYSCTRL->PERI_CLKEN0 = ClkEn; // set back GPIO clk off } rt_hw_interrupt_enable(level); } uint16_t GpioInPins(en_gpio_port_t GpioPort, uint32_t BitsMask) { uint32_t ClkEn; uint32_t ClkOff; rt_base_t level; uint32_t Addr; uint16_t InBits; Addr = (uint32_t)(&(M0P_GPIO->PAIN)) + GpioPort; level = rt_hw_interrupt_disable(); ClkEn = M0P_SYSCTRL->PERI_CLKEN0; ClkOff = (~ClkEn) & (1u<<28); // check GPIO clk is off or not if (ClkOff){ M0P_SYSCTRL->PERI_CLKEN0 = ClkEn | (0x1u<<28); // set GPIO clk on } InBits = *((volatile uint32_t*)Addr) & BitsMask; if (ClkOff){ M0P_SYSCTRL->PERI_CLKEN0 = ClkEn; // set back GPIO clk off } rt_hw_interrupt_enable(level); return(InBits); } //void GpioSetFunc(uint32_t PinFunc) //{ // rt_base_t level; // uint32_t enPort, PinGap; // // enPort = PinFunc>>16; // PinGap = (PinFunc&0xFF00u)>>(8-2); // level = rt_hw_interrupt_disable(); // M0P_SYSCTRL->PERI_CLKEN0_f.GPIO = 1; // *((volatile uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL))) + enPort + PinGap)) = PinFunc&0xFFU; // M0P_SYSCTRL->PERI_CLKEN0_f.GPIO = 0; // rt_hw_interrupt_enable(level); //} // //void GpioClrFunc(uint32_t PinFunc) //{ // rt_base_t level; // uint32_t enPort, PinGap; // // enPort = PinFunc>>16; // PinGap = (PinFunc&0xFF00u)>>(8-2); // level = rt_hw_interrupt_disable(); // M0P_SYSCTRL->PERI_CLKEN0_f.GPIO = 1; // *((volatile uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL))) + enPort + PinGap)) = 0x00u; // M0P_SYSCTRL->PERI_CLKEN0_f.GPIO = 0; // rt_hw_interrupt_enable(level); //}