SWM320_port.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /******************************************************************************************************************************************
  2. * 文件名称: SWM320_port.c
  3. * 功能说明: SWM320单片机的端口引脚功能选择库函数
  4. * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
  5. * 注意事项:
  6. * 版本日期: V1.1.0 2017年10月25日
  7. * 升级记录:
  8. *
  9. *
  10. *******************************************************************************************************************************************
  11. * @attention
  12. *
  13. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
  14. * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
  15. * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
  16. * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
  17. * -ECTION WITH THEIR PRODUCTS.
  18. *
  19. * COPYRIGHT 2012 Synwit Technology
  20. *******************************************************************************************************************************************/
  21. #include "SWM320.h"
  22. #include "SWM320_port.h"
  23. /******************************************************************************************************************************************
  24. * 函数名称: PORT_Init()
  25. * 功能说明: 端口引脚功能选择,可用的功能见"SWM320_port.h"文件
  26. * 输 入: uint32_t PORTx 指定PORT端口,有效值包括PORTA、PORTB、PORTC、PORTM、PORTN、PORTP
  27. * uint32_t n 指定PORT引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN22、PIN23
  28. * uint32_t func 指定端口引脚要设定的功能,其可取值见"SWM320_port.h"文件
  29. * uint32_t digit_in_en 数字输入使能
  30. * 输 出: 无
  31. * 注意事项: 当引脚标号n为偶数时,func取值只能是FUNMUX0开头的,如FUNMUX0_UART0_RXD
  32. * 当引脚标号n为奇数时,func取值只能是FUNMUX1开头的,如FUNMUX1_UART0_TXD
  33. ******************************************************************************************************************************************/
  34. void PORT_Init(uint32_t PORTx, uint32_t n, uint32_t func, uint32_t digit_in_en)
  35. {
  36. switch ((uint32_t)PORTx)
  37. {
  38. case ((uint32_t)PORTA):
  39. if (func > 99)
  40. {
  41. if (n < PIN6)
  42. {
  43. PORT->PORTA_MUX0 &= ~(0x1F << (n * 5));
  44. PORT->PORTA_MUX0 |= (func - 100) << (n * 5);
  45. }
  46. else if (n < PIN12)
  47. {
  48. PORT->PORTA_MUX1 &= ~(0x1F << ((n - 6) * 5));
  49. PORT->PORTA_MUX1 |= (func - 100) << ((n - 6) * 5);
  50. }
  51. }
  52. PORT->PORTA_SEL &= ~(0x03 << (n * 2));
  53. PORT->PORTA_SEL |= (func > 99 ? 1 : func) << (n * 2);
  54. PORT->PORTA_INEN &= ~(0x01 << n);
  55. PORT->PORTA_INEN |= (digit_in_en << n);
  56. break;
  57. case ((uint32_t)PORTB):
  58. if (func > 99)
  59. {
  60. if (n < PIN6)
  61. {
  62. PORT->PORTB_MUX0 &= ~(0x1F << (n * 5));
  63. PORT->PORTB_MUX0 |= (func - 100) << (n * 5);
  64. }
  65. else if (n < PIN12)
  66. {
  67. PORT->PORTB_MUX1 &= ~(0x1F << ((n - 6) * 5));
  68. PORT->PORTB_MUX1 |= (func - 100) << ((n - 6) * 5);
  69. }
  70. }
  71. PORT->PORTB_SEL &= ~(0x03 << (n * 2));
  72. PORT->PORTB_SEL |= (func > 99 ? 1 : func) << (n * 2);
  73. PORT->PORTB_INEN &= ~(0x01 << n);
  74. PORT->PORTB_INEN |= (digit_in_en << n);
  75. break;
  76. case ((uint32_t)PORTC):
  77. if (func > 99)
  78. {
  79. if (n < PIN6)
  80. {
  81. PORT->PORTC_MUX0 &= ~(0x1F << (n * 5));
  82. PORT->PORTC_MUX0 |= (func - 100) << (n * 5);
  83. }
  84. else if (n < PIN12)
  85. {
  86. PORT->PORTC_MUX1 &= ~(0x1F << ((n - 6) * 5));
  87. PORT->PORTC_MUX1 |= (func - 100) << ((n - 6) * 5);
  88. }
  89. }
  90. PORT->PORTC_SEL &= ~(0x03 << (n * 2));
  91. PORT->PORTC_SEL |= (func > 99 ? 1 : func) << (n * 2);
  92. PORT->PORTC_INEN &= ~(0x01 << n);
  93. PORT->PORTC_INEN |= (digit_in_en << n);
  94. break;
  95. case ((uint32_t)PORTM):
  96. if (func > 99)
  97. {
  98. if (n < PIN6)
  99. {
  100. PORT->PORTM_MUX0 &= ~(0x1F << (n * 5));
  101. PORT->PORTM_MUX0 |= (func - 100) << (n * 5);
  102. }
  103. else if (n < PIN12)
  104. {
  105. PORT->PORTM_MUX1 &= ~(0x1F << ((n - 6) * 5));
  106. PORT->PORTM_MUX1 |= (func - 100) << ((n - 6) * 5);
  107. }
  108. else if (n < PIN18)
  109. {
  110. PORT->PORTM_MUX2 &= ~(0x1F << ((n - 12) * 5));
  111. PORT->PORTM_MUX2 |= (func - 100) << ((n - 12) * 5);
  112. }
  113. else if (n < PIN24)
  114. {
  115. PORT->PORTM_MUX3 &= ~(0x1F << ((n - 18) * 5));
  116. PORT->PORTM_MUX3 |= (func - 100) << ((n - 18) * 5);
  117. }
  118. }
  119. if (n < 16)
  120. {
  121. PORT->PORTM_SEL0 &= ~(0x03 << (n * 2));
  122. PORT->PORTM_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
  123. }
  124. else
  125. {
  126. PORT->PORTM_SEL1 &= ~(0x03 << ((n - 16) * 2));
  127. PORT->PORTM_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
  128. }
  129. PORT->PORTM_INEN &= ~(0x01 << n);
  130. PORT->PORTM_INEN |= (digit_in_en << n);
  131. break;
  132. case ((uint32_t)PORTN):
  133. if (func > 99)
  134. {
  135. if (n < PIN6)
  136. {
  137. PORT->PORTN_MUX0 &= ~(0x1F << (n * 5));
  138. PORT->PORTN_MUX0 |= (func - 100) << (n * 5);
  139. }
  140. else if (n < PIN12)
  141. {
  142. PORT->PORTN_MUX1 &= ~(0x1F << ((n - 6) * 5));
  143. PORT->PORTN_MUX1 |= (func - 100) << ((n - 6) * 5);
  144. }
  145. else if (n < PIN18)
  146. {
  147. PORT->PORTN_MUX2 &= ~(0x1F << ((n - 12) * 5));
  148. PORT->PORTN_MUX2 |= (func - 100) << ((n - 12) * 5);
  149. }
  150. }
  151. if (n < 16)
  152. {
  153. PORT->PORTN_SEL0 &= ~(0x03 << (n * 2));
  154. PORT->PORTN_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
  155. }
  156. else
  157. {
  158. PORT->PORTN_SEL1 &= ~(0x03 << ((n - 16) * 2));
  159. PORT->PORTN_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
  160. }
  161. PORT->PORTN_INEN &= ~(0x01 << n);
  162. PORT->PORTN_INEN |= (digit_in_en << n);
  163. break;
  164. case ((uint32_t)PORTP):
  165. if (func > 99)
  166. {
  167. if (n < PIN6)
  168. {
  169. PORT->PORTP_MUX0 &= ~(0x1F << (n * 5));
  170. PORT->PORTP_MUX0 |= (func - 100) << (n * 5);
  171. }
  172. else if (n < PIN12)
  173. {
  174. PORT->PORTP_MUX1 &= ~(0x1F << ((n - 6) * 5));
  175. PORT->PORTP_MUX1 |= (func - 100) << ((n - 6) * 5);
  176. }
  177. else if (n < PIN18)
  178. {
  179. PORT->PORTP_MUX2 &= ~(0x1F << ((n - 12) * 5));
  180. PORT->PORTP_MUX2 |= (func - 100) << ((n - 12) * 5);
  181. }
  182. else if (n < PIN24)
  183. {
  184. PORT->PORTP_MUX3 &= ~(0x1F << ((n - 18) * 5));
  185. PORT->PORTP_MUX3 |= (func - 100) << ((n - 18) * 5);
  186. }
  187. }
  188. if (n < 16)
  189. {
  190. PORT->PORTP_SEL0 &= ~(0x03 << (n * 2));
  191. PORT->PORTP_SEL0 |= (func > 99 ? 1 : func) << (n * 2);
  192. }
  193. else
  194. {
  195. PORT->PORTP_SEL1 &= ~(0x03 << ((n - 16) * 2));
  196. PORT->PORTP_SEL1 |= (func > 99 ? 1 : func) << ((n - 16) * 2);
  197. }
  198. PORT->PORTP_INEN &= ~(0x01 << n);
  199. PORT->PORTP_INEN |= (digit_in_en << n);
  200. break;
  201. }
  202. }