| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
-
- #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<<enPin;
- SetClrRegBits(((uint32_t)(&(M0P_GPIO->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<<enPin;
- 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
- }
- 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);
- //}
|