bsp_gpio.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. /*----------------------------------------------------------------------------------------------------
  2. INCLUDE HEADE FILES
  3. ----------------------------------------------------------------------------------------------------*/
  4. #include "Platform.h"
  5. #include "test_config.h"
  6. IoHandler_callback IoHandler_Callback = (IoHandler_callback)0;
  7. /* ---------------------------------------------------------------------------------------------------
  8. - 用户配置如下系统IO功能
  9. ----------------------------------------------------------------------------------------------------*/
  10. gpio_config_t gpio_mux_config = {
  11. /*CPR_CTL_MUXCTL1*/
  12. .mux1_ctl.pad1.gpio15 = 0, .mux1_ctl.pad1.gpio14 = 0, .mux1_ctl.pad1.gpio13 = 0, .mux1_ctl.pad1.gpio12 = 0,
  13. .mux1_ctl.pad1.gpio11 = 0, .mux1_ctl.pad1.gpio10 = 0, .mux1_ctl.pad1.gpio9 = 0, .mux1_ctl.pad1.gpio8 = 0,
  14. .mux1_ctl.pad1.gpio7 = 0, .mux1_ctl.pad1.gpio6 = 0, .mux1_ctl.pad1.gpio5 = 0, .mux1_ctl.pad1.gpio4 = 0,
  15. .mux1_ctl.pad1.gpio3 = 0, .mux1_ctl.pad1.gpio2 = 0, .mux1_ctl.pad1.gpio1 = 0, .mux1_ctl.pad1.gpio0 = 0,
  16. /*CPR_CTL_MUXCTL2*/
  17. .mux2_ctl.pad2.swd = 0, .mux2_ctl.pad2.swk = 0, .mux2_ctl.pad2.bootctl =0, .mux2_ctl.pad2.gpio28 = 0,
  18. .mux2_ctl.pad2.gpio27 = 0, .mux2_ctl.pad2.gpio26 = 0, .mux2_ctl.pad2.gpio25 = 0, .mux2_ctl.pad2.gpio24 = 0,
  19. .mux2_ctl.pad2.gpio23 = 0, .mux2_ctl.pad2.gpio22 = 0, .mux2_ctl.pad2.gpio21 = 0, .mux2_ctl.pad2.gpio20 = 0,
  20. .mux2_ctl.pad2.gpio19 = 0, .mux2_ctl.pad2.gpio18 = 0, .mux2_ctl.pad2.gpio17 = 0, .mux2_ctl.pad2.gpio16 = 0
  21. };
  22. /* ------------------------------------------------------------------------------------------------------------------
  23. - 用户配置如下IO复用控制 -
  24. 0:GPIO_Dx 1:UART0_TX 2:UART0_RX 3:UART0_CTS 4:UART0_RTS 5:I2C_SCL 6:I2C_SDA 7:UART1_RX 8:UART1_TX
  25. 9:SIM_IO 10:SIM_RST 11:SIM_CLK_OUT 12:PWM0 13:PWM1 14:SSI1_CLK 15:SSI1_SSN 16:SSI1_RX 17:SSI1_TX
  26. -------------------------------------------------------------------------------------------------------------------*/
  27. gpio_fun_sel_config_t gpio_fun_sel_config = {
  28. /*CPR_GPIO_FUN_SEL0*/.fun_sel0.bits.b0004= GPIO_Dx,/*GPIO 0*/.fun_sel0.bits.b0812= GPIO_Dx,/*GPIO 1*/.fun_sel0.bits.b1620= GPIO_Dx,/*GPIO 2*/.fun_sel0.bits.b2428= GPIO_Dx,/*GPIO 3*/
  29. /*CPR_GPIO_FUN_SEL1*/.fun_sel1.bits.b0004= GPIO_Dx,/*GPIO 4*/.fun_sel1.bits.b0812= GPIO_Dx,/*GPIO 5*/.fun_sel1.bits.b1620= GPIO_Dx,/*GPIO 6*/.fun_sel1.bits.b2428= GPIO_Dx,/*GPIO 7*/
  30. /*CPR_GPIO_FUN_SEL2*/.fun_sel2.bits.b0004= GPIO_Dx,/*GPIO 8*/.fun_sel2.bits.b0812= GPIO_Dx,/*GPIO 9*/.fun_sel2.bits.b1620= GPIO_Dx,/*GPIO10*/.fun_sel2.bits.b2428= GPIO_Dx,/*GPIO11*/
  31. /*CPR_GPIO_FUN_SEL3*/.fun_sel3.bits.b0004= GPIO_Dx,/*GPIO12*/.fun_sel3.bits.b0812= GPIO_Dx,/*GPIO13*/.fun_sel3.bits.b1620= GPIO_Dx,/*GPIO14*/.fun_sel3.bits.b2428= GPIO_Dx,/*GPIO15*/
  32. /*CPR_GPIO_FUN_SEL4*/.fun_sel4.bits.b0004= GPIO_Dx,/*GPIO16*/.fun_sel4.bits.b0812= GPIO_Dx,/*GPIO17*/.fun_sel4.bits.b1620=UART0_TX,/*GPIO18*/.fun_sel4.bits.b2428=UART0_RX,/*GPIO19*/
  33. /*CPR_GPIO_FUN_SEL5*/.fun_sel5.bits.b0004= GPIO_Dx,/*GPIO20*/.fun_sel5.bits.b0812= GPIO_Dx,/*GPIO21*/.fun_sel5.bits.b1620= GPIO_Dx,/*GPIO22*/.fun_sel5.bits.b2428= GPIO_Dx,/*GPIO23*/
  34. /*CPR_GPIO_FUN_SEL6*/.fun_sel6.bits.b0004= GPIO_Dx,/*GPIO24*/.fun_sel6.bits.b0812= GPIO_Dx,/*GPIO25*/.fun_sel6.bits.b1620= GPIO_Dx,/*GPIO26*/.fun_sel6.bits.b2428= GPIO_Dx,/*GPIO27*/
  35. /*CPR_GPIO_FUN_SEL7*/.fun_sel7.bits.b0004= GPIO_Dx,/*GPIO28*/.fun_sel7.bits.b0812= GPIO_Dx,/*GPIO29*/.fun_sel7.bits.b1620= GPIO_Dx,/*GPIO30*/.fun_sel7.bits.b2428= GPIO_Dx /*GPIO31*/
  36. };
  37. /* ---------------------------------------------------------------------------------------------------
  38. - 用户配置如下系统IO的中断模式 NOT_INT(无中断) RIS_EDGE_INT(上升沿中断) FAIL_EDGE_INT(下降沿中断)
  39. ----------------------------------------------------------------------------------------------------*/
  40. interrupt_config_t interrupt_config = {
  41. /*GPIO_INTR_CTRL0*/.intr_ctl0.pad.mode3=NOT_INT,/*GPIO 3*/.intr_ctl0.pad.mode2=NOT_INT,/*GPIO 2*/.intr_ctl0.pad.mode1=NOT_INT,/*GPIO 1*/.intr_ctl0.pad.mode0=NOT_INT,/*GPIO 0*/
  42. /*GPIO_INTR_CTRL1*/.intr_ctl1.pad.mode3=NOT_INT,/*GPIO 7*/.intr_ctl1.pad.mode2=NOT_INT,/*GPIO 6*/.intr_ctl1.pad.mode1=NOT_INT,/*GPIO 5*/.intr_ctl1.pad.mode0=NOT_INT,/*GPIO 4*/
  43. /*GPIO_INTR_CTRL2*/.intr_ctl2.pad.mode3=NOT_INT,/*GPIO11*/.intr_ctl2.pad.mode2=NOT_INT,/*GPIO10*/.intr_ctl2.pad.mode1=NOT_INT,/*GPIO 9*/.intr_ctl2.pad.mode0=NOT_INT,/*GPIO 8*/
  44. /*GPIO_INTR_CTRL3*/.intr_ctl3.pad.mode3=NOT_INT,/*GPIO15*/.intr_ctl3.pad.mode2=NOT_INT,/*GPIO14*/.intr_ctl3.pad.mode1=NOT_INT,/*GPIO13*/.intr_ctl3.pad.mode0=NOT_INT,/*GPIO12*/
  45. /*GPIO_INTR_CTRL4*/.intr_ctl4.pad.mode3=NOT_INT,/*GPIO19*/.intr_ctl4.pad.mode2=NOT_INT,/*GPIO18*/.intr_ctl4.pad.mode1=NOT_INT,/*GPIO17*/.intr_ctl4.pad.mode0=NOT_INT,/*GPIO16*/
  46. /*GPIO_INTR_CTRL5*/.intr_ctl5.pad.mode3=NOT_INT,/*GPIO23*/.intr_ctl5.pad.mode2=NOT_INT,/*GPIO22*/.intr_ctl5.pad.mode1=NOT_INT,/*GPIO21*/.intr_ctl5.pad.mode0=NOT_INT,/*GPIO20*/
  47. /*GPIO_INTR_CTRL6*/.intr_ctl6.pad.mode3=NOT_INT,/*GPIO27*/.intr_ctl6.pad.mode2=NOT_INT,/*GPIO26*/.intr_ctl6.pad.mode1=NOT_INT,/*GPIO25*/.intr_ctl6.pad.mode0=NOT_INT,/*GPIO24*/
  48. /*GPIO_INTR_CTRL7*/.intr_ctl7.pad.mode3=NOT_INT,/*GPIO31*/.intr_ctl7.pad.mode2=NOT_INT,/*GPIO30*/.intr_ctl7.pad.mode1=NOT_INT,/*GPIO29*/.intr_ctl7.pad.mode0=NOT_INT,/*GPIO28*/
  49. };
  50. /* ---------------------------------------------------------------------------------------------------
  51. - 函数名称: Init_gpio
  52. - 函数功能: Gpio模块初始化
  53. - 输入参数: 无
  54. - 创建日期: 2016-05-24
  55. ----------------------------------------------------------------------------------------------------*/
  56. void Init_gpio(void)
  57. {
  58. __write_hw_reg32(CPR_CTLAPBCLKEN_GRCTL , 0x40004); /*gpio_pclk enable*/
  59. __write_hw_reg32(CPR_OTHERCLKEN_GRCTL , 0x10001); /*gpio_clk enable*/
  60. __write_hw_reg32(CPR_GPIO_FUN_SEL0 , gpio_fun_sel_config.fun_sel0.config);
  61. __write_hw_reg32(CPR_GPIO_FUN_SEL1 , gpio_fun_sel_config.fun_sel1.config);
  62. __write_hw_reg32(CPR_GPIO_FUN_SEL2 , gpio_fun_sel_config.fun_sel2.config);
  63. __write_hw_reg32(CPR_GPIO_FUN_SEL3 , gpio_fun_sel_config.fun_sel3.config);
  64. __write_hw_reg32(CPR_GPIO_FUN_SEL4 , gpio_fun_sel_config.fun_sel4.config);
  65. __write_hw_reg32(CPR_GPIO_FUN_SEL5 , gpio_fun_sel_config.fun_sel5.config);
  66. __write_hw_reg32(CPR_GPIO_FUN_SEL6 , gpio_fun_sel_config.fun_sel6.config);
  67. __write_hw_reg32(CPR_GPIO_FUN_SEL7 , gpio_fun_sel_config.fun_sel7.config);
  68. __write_hw_reg32(CPR_CTL_MUXCTL1 , gpio_mux_config.mux1_ctl.muxctl1);
  69. __write_hw_reg32(CPR_CTL_MUXCTL2 , gpio_mux_config.mux2_ctl.muxctl2);
  70. __write_hw_reg32(GPIO_INTR_CTRL0 , (0xF0000|(interrupt_config.intr_ctl0.interrupt))); __write_hw_reg32(GPIO_INTR_CTRL1 , (0xF0000|(interrupt_config.intr_ctl1.interrupt)));
  71. __write_hw_reg32(GPIO_INTR_CTRL2 , (0xF0000|(interrupt_config.intr_ctl2.interrupt))); __write_hw_reg32(GPIO_INTR_CTRL3 , (0xF0000|(interrupt_config.intr_ctl3.interrupt)));
  72. __write_hw_reg32(GPIO_INTR_CTRL4 , (0xF0000|(interrupt_config.intr_ctl4.interrupt))); __write_hw_reg32(GPIO_INTR_CTRL5 , (0xF0000|(interrupt_config.intr_ctl5.interrupt)));
  73. __write_hw_reg32(GPIO_INTR_CTRL6 , (0xF0000|(interrupt_config.intr_ctl6.interrupt))); __write_hw_reg32(GPIO_INTR_CTRL7 , (0xF0000|(interrupt_config.intr_ctl7.interrupt)));
  74. NVIC_EnableIRQ(GPIO_IRQn);
  75. }
  76. /* ---------------------------------------------------------------------------------------------------
  77. - 函数名称: gpio_mux_pin_ctl
  78. - 函数功能: pin脚连接控制
  79. - 输入参数: mux
  80. - 创建日期: 2019-12-03
  81. - 48 PIN脚
  82. - GPIO0 : 【mux=0 连接到gpio_d[0] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  83. - GPIO1 : 【mux=0 连接到gpio_d[1] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  84. - GPIO2 : 【mux=0 连接到gpio_d[2] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  85. - GPIO3 : 【mux=0 连接到gpio_d[3] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  86. - GPIO4 : 【mux=0 连接到gpio_d[4] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  87. - GPIO5 : 【mux=0 连接到gpio_d[5] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  88. - GPIO6 : 【mux=0 连接到gpio_d[6] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  89. - GPIO7 : 【mux=0 连接到gpio_d[7] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  90. - GPIO8 : 【mux=0 连接到gpio_d[8] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  91. - GPIO9 : 【mux=0 连接到gpio_d[9] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  92. - GPIO10: 【mux=0 连接到gpio_d[10]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  93. - GPIO11: 【mux=0 连接到gpio_d[11]】 【mux=1 NA】 【mux=2 txen】 【mux=3 NA】
  94. - GPIO12: 【mux=0 连接到gpio_d[12]】 【mux=1 NA】 【mux=2 rxen】 【mux=3 NA】
  95. - GPIO13: 【mux=0 连接到gpio_d[13]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  96. - GPIO14: 【mux=0 连接到gpio_d[14]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  97. - GPIO15: 【mux=0 连接到gpio_d[15]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  98. - GPIO16: 【mux=0 连接到gpio_d[16]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  99. - GPIO17: 【mux=0 连接到gpio_d[17]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  100. - GPIO18: 【mux=0 连接到gpio_d[18]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  101. - GPIO19: 【mux=0 连接到gpio_d[19]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  102. - GPIO20: 【mux=0 连接到gpio_d[20]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  103. - GPIO21: 【mux=0 连接到gpio_d[21]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  104. - GPIO22: 【mux=0 连接到gpio_d[22]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  105. - GPIO23: 【mux=0 连接到gpio_d[23]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  106. - GPIO24: 【mux=0 连接到gpio_d[24]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  107. - GPIO25: 【mux=0 连接到gpio_d[25]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  108. - GPIO27: 【mux=0 连接到gpio_d[27]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  109. - GPIO28: 【mux=0 连接到gpio_d[28]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  110. - GPIO29: 【mux=0 连接到BOOT_CTL 】 【mux=1 连接到gpio_d[29]】 【mux=1 NA】 【mux=2 NA】
  111. - GPIO30: 【mux=0 连接到SWI的 SWCK】 【mux=1 连接到gpio_d[30]】 【mux=1 NA】 【mux=2 NA】
  112. - GPIO31: 【mux=0 连接到SWI的 SWD 】 【mux=1 连接到gpio_d[31]】 【mux=1 NA】 【mux=2 NA】
  113. - 32/16 PIN脚
  114. - GPIO0 : 【mux=0 连接到gpio_d[0] 】 【mux=1 NA】 【mux=2 pwm2】 【mux=3 NA】
  115. - GPIO1 : 【mux=0 连接到gpio_d[1] 】 【mux=1 NA】 【mux=2 pwm3】 【mux=3 NA】
  116. - GPIO2 : 【mux=0 连接到gpio_d[2] 】 【mux=1 NA】 【mux=2 clk_12M_out】【mux=3 NA】
  117. - GPIO3 : 【mux=0 连接到gpio_d[3] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  118. - GPIO4 : 【mux=0 连接到gpio_d[4] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  119. - GPIO5 : 【mux=0 连接到gpio_d[5] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  120. - GPIO6 : 【mux=0 连接到gpio_d[6] 】 【mux=1 NA】 【mux=2 txen】 【mux=3 NA】
  121. - GPIO7 : 【mux=0 连接到gpio_d[7] 】 【mux=1 NA】 【mux=2 rxen】 【mux=3 NA】
  122. - GPIO8 : 【mux=0 连接到gpio_d[8] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  123. - GPIO9 : 【mux=0 连接到gpio_d[9] 】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  124. - GPIO10: 【mux=0 连接到gpio_d[10]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  125. - GPIO11: 【mux=0 连接到BOOT_CTL 】 【mux=1 连接到gpio_d[11]】 【mux=2 NA】 【mux=3 NA】
  126. - GPIO12: 【mux=0 连接到SWI的 SWCK】 【mux=1 连接到gpio_d[12]】 【mux=2 NA】 【mux=3 pwm4】
  127. - GPIO13: 【mux=0 连接到SWI的 SWD 】 【mux=1 连接到gpio_d[13]】 【mux=2 NA】 【mux=3 pwm5】
  128. - GPIO14: 【mux=0 连接到gpio_d[14]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  129. - GPIO18: 【mux=0 连接到gpio_d[18]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  130. - GPIO19: 【mux=0 连接到gpio_d[19]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  131. - GPIO20: 【mux=0 连接到gpio_d[20]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  132. - GPIO21: 【mux=0 连接到gpio_d[21]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  133. - GPIO22: 【mux=0 连接到gpio_d[22]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  134. - GPIO23: 【mux=0 连接到gpio_d[23]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  135. - GPIO24: 【mux=0 连接到gpio_d[24]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  136. - GPIO25: 【mux=0 连接到gpio_d[25]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】
  137. - ----------------------------------------------------------------------------------------------------*/
  138. void gpio_mux_ctl(uint8_t num,uint8_t mux)
  139. {
  140. if(mux>3) return;
  141. uint32_t temp=0;
  142. __read_hw_reg32((CPR_CTL_MUXCTL1+(num/16)),temp);
  143. temp=(temp&(~(0x3<<((num%16)*2))))|(mux<<((num%16)*2));
  144. __write_hw_reg32((CPR_CTL_MUXCTL1+(num/16)),temp);
  145. }
  146. /* ---------------------------------------------------------------------------------------------------
  147. - 函数名称: gpio_fun_inter
  148. - 函数功能: gpio中断模式设置
  149. - 输入参数: gpio编号0-28 中断类型0无中断 5上升沿中断 7下降沿中断
  150. -【inter=0 GPIO关闭中断:NOT_INT 】
  151. -【inter=5 GPIO上升沿中断:RIS_EDGE_INT 】
  152. -【inter=7 GPIO下降沿中断:FAIL_EDGE_INT】
  153. -【inter=9 GPIO上升沿下降沿中断:RIS_FAIL_EDGE_INT】
  154. - 创建日期: 2019-12-03
  155. ----------------------------------------------------------------------------------------------------*/
  156. void gpio_fun_inter(uint8_t num,uint8_t inter)
  157. {
  158. unsigned int temp=0;
  159. if(inter>0xF) return;
  160. switch(num%4)
  161. {
  162. case 3:__read_hw_reg32((GPIO_INTR_CTRL0+(num/4)),temp);temp &= 0x0FFF;temp |= ((inter<<12)|0xF0000);__write_hw_reg32((GPIO_INTR_CTRL0+(num/4)),temp);break;
  163. case 2:__read_hw_reg32((GPIO_INTR_CTRL0+(num/4)),temp);temp &= 0xF0FF;temp |= ((inter<< 8)|0xF0000);__write_hw_reg32((GPIO_INTR_CTRL0+(num/4)),temp);break;
  164. case 1:__read_hw_reg32((GPIO_INTR_CTRL0+(num/4)),temp);temp &= 0xFF0F;temp |= ((inter<< 4)|0xF0000);__write_hw_reg32((GPIO_INTR_CTRL0+(num/4)),temp);break;
  165. case 0:__read_hw_reg32((GPIO_INTR_CTRL0+(num/4)),temp);temp &= 0xFFF0;temp |= ((inter )|0xF0000);__write_hw_reg32((GPIO_INTR_CTRL0+(num/4)),temp);break;
  166. default:break;
  167. }
  168. }
  169. /* ---------------------------------------------------------------------------------------------------
  170. - 函数名称: gpio_fun_sel
  171. - 函数功能: gpio复用功能设置
  172. - 输入参数: gpio编号0-28 sel复用
  173. -【sel=0 普通GPIO功能:GPIO_Dx 】
  174. -【sel=1 串口0发送:UART0_TX 】
  175. -【sel=2 串口0接收::UART0_RX 】
  176. -【sel=3 串口0流控:UART0_CTS 】
  177. -【sel=4 串口0流控:UART0_RTS 】
  178. -【sel=5 I2C时钟:I2C_SCL 】
  179. -【sel=6 I2C数据:I2C_SDA 】
  180. -【sel=7 串口1接收:UART1_RX 】
  181. -【sel=8 串口1发送:UART1_TX 】
  182. -【sel=9 SIM_IO 】
  183. -【sel=10 SIM_RST 】
  184. -【sel=11 SIM_CLK_OUT 】
  185. -【sel=12 PWM0输出:PWM0 】
  186. -【sel=13 PWM1输出:PWM1 】
  187. -【sel=14 SPI1时钟:SSI1_CLK 】
  188. -【sel=15 SPI1片选:SSI1_SSN 】
  189. -【sel=16 SPI1接收:SSI1_RX 】
  190. -【sel=17 SPI1发送:SSI1_TX 】
  191. -【sel=18 PWM0互补输出:PWM0_INV(32/16PIN新增)】
  192. -【sel=19 PWM1互补输出:PWM1_INV(32/16PIN新增)】
  193. - 创建日期: 2019-12-03
  194. ----------------------------------------------------------------------------------------------------*/
  195. void gpio_fun_sel(uint8_t num,uint8_t sel)
  196. {
  197. unsigned int temp=0;
  198. if(sel>19) return;
  199. switch(num%4)
  200. {
  201. case 0:__read_hw_reg32((CPR_GPIO_FUN_SEL0+(num/4)),temp);temp &= 0xFFFFFF00;temp |= sel; __write_hw_reg32((CPR_GPIO_FUN_SEL0+(num/4)),temp);break;
  202. case 1:__read_hw_reg32((CPR_GPIO_FUN_SEL0+(num/4)),temp);temp &= 0xFFFF00FF;temp |= (sel<< 8);__write_hw_reg32((CPR_GPIO_FUN_SEL0+(num/4)),temp);break;
  203. case 2:__read_hw_reg32((CPR_GPIO_FUN_SEL0+(num/4)),temp);temp &= 0xFF00FFFF;temp |= (sel<<16);__write_hw_reg32((CPR_GPIO_FUN_SEL0+(num/4)),temp);break;
  204. case 3:__read_hw_reg32((CPR_GPIO_FUN_SEL0+(num/4)),temp);temp &= 0x00FFFFFF;temp |= (sel<<24);__write_hw_reg32((CPR_GPIO_FUN_SEL0+(num/4)),temp);break;
  205. default:break;
  206. }
  207. }
  208. /* ---------------------------------------------------------------------------------------------------
  209. - 函数名称: gpio_Register_Callback
  210. - 函数功能: 为gpio注册中断回调函数
  211. - 输入参数: 中断状态值
  212. - 创建日期: 2016-05-26
  213. ----------------------------------------------------------------------------------------------------*/
  214. void gpio_Register_Callback(IoHandler_callback callback)
  215. {
  216. IoHandler_Callback = callback;
  217. }
  218. /* ---------------------------------------------------------------------------------------------------
  219. - 函数名称: GPIO_Handler
  220. - 函数功能: GPIO0中断处理函数
  221. - 输入参数: 无
  222. - 创建日期: 2016-05-26
  223. ----------------------------------------------------------------------------------------------------*/
  224. void GPIO_Handler(void)
  225. {
  226. uint32_t val;
  227. __read_hw_reg32(GPIO_INTR_STATUS_C00 , val);/*read interrupt flag*/
  228. __write_hw_reg32(GPIO_INTR_CLR0 , val); /*clean interrupt flag*/
  229. if(IoHandler_Callback != (IoHandler_callback)0)
  230. IoHandler_Callback(val);
  231. if(DETECT_INTER_NUM(GPIO_PIN_24,val))//判断是否为GPIO24中断
  232. {
  233. printf("GPIO24 interrupt\n");
  234. }
  235. printf("interrupt:%#x\n",val);
  236. }
  237. /* ---------------------------------------------------------------------------------------------------
  238. - 函数名称: gpio_output_high
  239. - 函数功能: Gpio输出高电平
  240. - 输入参数: gpio编号 (< 29)
  241. - 创建日期: 2016-05-24
  242. ----------------------------------------------------------------------------------------------------*/
  243. void gpio_output_high(uint8_t num)
  244. {
  245. __write_hw_reg32((GPIO_PORT_DR0 + (num>>4)), (0x00010001<<(num&0x0F)));
  246. }
  247. /* ---------------------------------------------------------------------------------------------------
  248. - 函数名称: gpio_output_low
  249. - 函数功能: Gpio输出低电平
  250. - 输入参数: gpio编号 (< 29)
  251. - 创建日期: 2016-05-24
  252. ----------------------------------------------------------------------------------------------------*/
  253. void gpio_output_low(uint8_t num)
  254. {
  255. __write_hw_reg32((GPIO_PORT_DR0 + (num>>4)), (0x00010000<<(num&0x0F)));
  256. }
  257. /* ---------------------------------------------------------------------------------------------------
  258. - 函数名称: gpio_input_val
  259. - 函数功能: 获取GPIO管脚状态
  260. - 输入参数: gpio编号
  261. - 输出参数: 高低电平值
  262. - 创建日期: 2016-06-07
  263. ----------------------------------------------------------------------------------------------------*/
  264. uint8_t gpio_input_val(uint8_t num)
  265. {
  266. uint32_t val;
  267. __read_hw_reg32((GPIO_EXT_PORT0 + (num>>5)), val);
  268. return (val & (0x01L << (num & 0x1F)))? (1) : (0);
  269. }
  270. /* ---------------------------------------------------------------------------------------------------
  271. - 函数名称: gpio_direction_output
  272. - 函数功能: 设置GPIO管脚方向为输出
  273. - 输入参数: gpio编号
  274. - 创建日期: 2016-06-07
  275. ----------------------------------------------------------------------------------------------------*/
  276. void gpio_direction_output(uint8_t num)
  277. {
  278. __write_hw_reg32((GPIO_PORT_DDR0 + (num>>4)), ((0x10001)<<(num&0x0F)));
  279. }
  280. /* ---------------------------------------------------------------------------------------------------
  281. - 函数名称: gpio_direction_input
  282. - 函数功能: 设置GPIO管脚方向为输入
  283. - 输入参数: gpio编号 , 上下拉状态(0代表上拉 1代表下拉 其他代表无上下拉)
  284. -【pull_up_type=0 GPIO上拉:GPIO_Mode_Input_Up 】
  285. -【pull_up_type=1 GPIO下拉:GPIO_Mode_Input_Down 】
  286. -【pull_up_type=2 GPIO浮空:GPIO_Mode_Input_Float】
  287. - 创建日期: 2016-06-07
  288. ----------------------------------------------------------------------------------------------------*/
  289. void gpio_direction_input(uint8_t num, uint8_t pull_up_type)
  290. {
  291. uint8_t temp_num=num;
  292. uint32_t val;
  293. uint32_t* base_reg = 0x0;
  294. //uint32_t pos = (num&0x0f)<<1;
  295. // if(num>=0 && num<=4)
  296. // {
  297. // base_reg = (uint32_t*)(0x40002400+0x38);
  298. // }
  299. if( num<=4)
  300. {
  301. base_reg = (uint32_t*)(0x40002400+0x38);
  302. }
  303. else if(num>=5 && num<=15)
  304. {
  305. base_reg = (uint32_t*)(0x40002400+0x34);
  306. #ifdef PIN_32_16
  307. if(num==11) {num=13;base_reg = (uint32_t*)(0x40002400+0x38);}
  308. else if(num==12){num=14;base_reg = (uint32_t*)(0x40002400+0x38);}
  309. else if(num==13){num=15;base_reg = (uint32_t*)(0x40002400+0x38);}
  310. #endif
  311. }
  312. else if(num>=16 && num<=28)
  313. {
  314. base_reg = (uint32_t*)(0x40002400+0x38);
  315. num = num%16;
  316. }
  317. __read_hw_reg32(base_reg , val);
  318. if(pull_up_type == 1)//下拉
  319. {
  320. setbit(val,num*2);
  321. clrbit(val,num*2+1);
  322. }
  323. else if(pull_up_type == 0)//上拉
  324. {
  325. clrbit(val,num*2);
  326. setbit(val,num*2+1);
  327. }
  328. else//无上下拉
  329. {
  330. clrbit(val,num*2);
  331. clrbit(val,num*2+1);
  332. }
  333. __write_hw_reg32(base_reg, val);
  334. __write_hw_reg32((GPIO_PORT_DDR0 + (temp_num>>4)), ((0x10000)<<(temp_num&0x0F)));
  335. __write_hw_reg32((GPIO_DEBOUNCE0 + (temp_num>>4)), ((0x10001)<<(temp_num&0x0F)));
  336. }
  337. void GPIO_Sleep_Config(void)
  338. {
  339. //配置上下拉
  340. __write_hw_reg32((volatile unsigned *)(0x40002400+0x34),0x55555555); //pectrl1 = 0x55555555
  341. __write_hw_reg32((volatile unsigned *)(0x40002400+0x38),0x55555555); //pectrl2 = 0x55555555
  342. // __write_hw_reg32((volatile unsigned *)(0x40002400+0x3c),0xF); //spi0 flash脚上下拉配置(如果不配置会漏电200多微安)
  343. //关闭所有GPIO中断
  344. __write_hw_reg32(GPIO_INTR_CTRL0,0xF0000);
  345. __write_hw_reg32(GPIO_INTR_CTRL1,0xF0000);
  346. __write_hw_reg32(GPIO_INTR_CTRL2,0xF0000);
  347. __write_hw_reg32(GPIO_INTR_CTRL3,0xF0000);
  348. __write_hw_reg32(GPIO_INTR_CTRL4,0xF0000);
  349. __write_hw_reg32(GPIO_INTR_CTRL5,0xF0000);
  350. __write_hw_reg32(GPIO_INTR_CTRL6,0xF0000);
  351. __write_hw_reg32(GPIO_INTR_CTRL7,0xF0000);
  352. //将所有GPIO管脚配置成输入下拉
  353. for(int i=0;i<32;i++)
  354. {
  355. gpio_direction_input(i,1);
  356. }
  357. //将所有GPIO管脚配置成普通IO口
  358. __write_hw_reg32((volatile unsigned *)(0x40000000+0xC0),0x0);
  359. __write_hw_reg32((volatile unsigned *)(0x40000000+0xC4),0x0);
  360. __write_hw_reg32((volatile unsigned *)(0x40000000+0xC8),0x0);
  361. __write_hw_reg32((volatile unsigned *)(0x40000000+0xCC),0x0);
  362. __write_hw_reg32((volatile unsigned *)(0x40000000+0xD0),0x0);
  363. __write_hw_reg32((volatile unsigned *)(0x40000000+0xD4),0x0);
  364. __write_hw_reg32((volatile unsigned *)(0x40000000+0xD8),0x0);
  365. __write_hw_reg32((volatile unsigned *)(0x40000000+0xDC),0x0);
  366. //连接控制 mux=0
  367. __write_hw_reg32((volatile unsigned *)(0x40000000+0x128),0x0);
  368. __write_hw_reg32((volatile unsigned *)(0x40000000+0x12C),0x0);
  369. }