SWM341_gpio.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. /******************************************************************************************************************************************
  2. * 文件名称: SWM341_gpio.c
  3. * 功能说明: SWM341单片机的通用输入输出功能驱动库
  4. * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
  5. * 注意事项:
  6. * 版本日期: V1.0.0 2016年1月30日
  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 "SWM341.h"
  22. #include "SWM341_gpio.h"
  23. /******************************************************************************************************************************************
  24. * 函数名称: GPIO_Init()
  25. * 功能说明: 引脚初始化,包含引脚方向、上拉、下拉、开漏
  26. * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  27. * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  28. * uint32_t dir 引脚方向,0 输入 1 输出
  29. * uint32_t pull_up 上拉使能
  30. * uint32_t pull_down 下拉使能
  31. * uint32_t open_drain 开漏使能
  32. * 输 出: 无
  33. * 注意事项: 无
  34. ******************************************************************************************************************************************/
  35. void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down, uint32_t open_drain)
  36. {
  37. PORT_TypeDef * PORTx = PORTA;
  38. switch((uint32_t)GPIOx)
  39. {
  40. case ((uint32_t)GPIOA):
  41. SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOA_Pos);
  42. PORTx = PORTA;
  43. break;
  44. case ((uint32_t)GPIOB):
  45. SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOB_Pos);
  46. PORTx = PORTB;
  47. break;
  48. case ((uint32_t)GPIOC):
  49. SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOC_Pos);
  50. PORTx = PORTC;
  51. break;
  52. case ((uint32_t)GPIOD):
  53. SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOD_Pos);
  54. PORTx = PORTD;
  55. break;
  56. case ((uint32_t)GPIOE):
  57. SYS->CLKEN1 |= (0x01 << SYS_CLKEN1_GPIOE_Pos);
  58. PORTx = PORTE;
  59. break;
  60. case ((uint32_t)GPIOM):
  61. SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOM_Pos);
  62. PORTx = PORTM;
  63. break;
  64. case ((uint32_t)GPION):
  65. SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPION_Pos);
  66. PORTx = PORTN;
  67. break;
  68. }
  69. PORT_Init(PORTx, n, 0, 1); //PORTx.PINn引脚配置为GPIO功能,数字输入开启
  70. if(dir == 1)
  71. {
  72. GPIOx->DIR |= (0x01 << n);
  73. }
  74. else
  75. {
  76. GPIOx->DIR &= ~(0x01 << n);
  77. }
  78. if(pull_up == 1) PORTx->PULLU |= (1 << n);
  79. else PORTx->PULLU &= ~(1 << n);
  80. if(pull_down == 1) PORTx->PULLD |= (1 << n);
  81. else PORTx->PULLD &= ~(1 << n);
  82. if(open_drain == 1) PORTx->OPEND |= (1 << n);
  83. else PORTx->OPEND &= ~(1 << n);
  84. }
  85. /******************************************************************************************************************************************
  86. * 函数名称: GPIO_SetBit()
  87. * 功能说明: 将参数指定的引脚电平置高
  88. * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  89. * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  90. * 输 出: 无
  91. * 注意事项: 无
  92. ******************************************************************************************************************************************/
  93. void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n)
  94. {
  95. *(&GPIOx->DATAPIN0 + n) = 1;
  96. }
  97. /******************************************************************************************************************************************
  98. * 函数名称: GPIO_ClrBit()
  99. * 功能说明: 将参数指定的引脚电平置低
  100. * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  101. * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  102. * 输 出: 无
  103. * 注意事项: 无
  104. ******************************************************************************************************************************************/
  105. void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
  106. {
  107. *(&GPIOx->DATAPIN0 + n) = 0;
  108. }
  109. /******************************************************************************************************************************************
  110. * 函数名称: GPIO_InvBit()
  111. * 功能说明: 将参数指定的引脚电平反转
  112. * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  113. * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  114. * 输 出: 无
  115. * 注意事项: 无
  116. ******************************************************************************************************************************************/
  117. void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n)
  118. {
  119. *(&GPIOx->DATAPIN0 + n) = 1 - *(&GPIOx->DATAPIN0 + n);
  120. }
  121. /******************************************************************************************************************************************
  122. * 函数名称: GPIO_GetBit()
  123. * 功能说明: 读取参数指定的引脚的电平状态
  124. * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  125. * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  126. * 输 出: 参数指定的引脚的电平状态 0 低电平 1 高电平
  127. * 注意事项: 无
  128. ******************************************************************************************************************************************/
  129. uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n)
  130. {
  131. return *(&GPIOx->DATAPIN0 + n);
  132. }
  133. /******************************************************************************************************************************************
  134. * 函数名称: GPIO_SetBits()
  135. * 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高
  136. * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  137. * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  138. * uint32_t w 指定要将引脚电平置高的引脚的个数
  139. * 输 出: 无
  140. * 注意事项: 无
  141. ******************************************************************************************************************************************/
  142. void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
  143. {
  144. uint32_t bits;
  145. bits = 0xFFFF >> (16 - w);
  146. GPIOx->ODR |= (bits << n);
  147. }
  148. /******************************************************************************************************************************************
  149. * 函数名称: GPIO_ClrBits()
  150. * 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低
  151. * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  152. * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  153. * uint32_t w 指定要将引脚电平置低的引脚的个数
  154. * 输 出: 无
  155. * 注意事项: 无
  156. ******************************************************************************************************************************************/
  157. void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
  158. {
  159. uint32_t bits;
  160. bits = 0xFFFF >> (16 - w);
  161. GPIOx->ODR &= ~(bits << n);
  162. }
  163. /******************************************************************************************************************************************
  164. * 函数名称: GPIO_InvBits()
  165. * 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转
  166. * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  167. * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  168. * uint32_t w 指定要将引脚电平反转的引脚的个数
  169. * 输 出: 无
  170. * 注意事项: 无
  171. ******************************************************************************************************************************************/
  172. void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
  173. {
  174. uint32_t bits;
  175. bits = 0xFFFF >> (16 - w);
  176. GPIOx->ODR ^= (bits << n);
  177. }
  178. /******************************************************************************************************************************************
  179. * 函数名称: GPIO_GetBits()
  180. * 功能说明: 读取参数指定的从n开始的w位连续引脚的电平状态
  181. * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  182. * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  183. * uint32_t w 指定要将引脚电平置高的引脚的个数
  184. * 输 出: 参数指定的从n开始的w位连续引脚的电平状态 0 低电平 1 高电平
  185. * 返回值的第0位表示引脚n的电平状态、返回值的第1位表示引脚n+1的电平状态... ...返回值的第w位表示引脚n+w的电平状态
  186. * 注意事项: 无
  187. ******************************************************************************************************************************************/
  188. uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
  189. {
  190. uint32_t bits;
  191. bits = 0xFFFF >> (16 - w);
  192. return ((GPIOx->IDR >> n) & bits);
  193. }
  194. /******************************************************************************************************************************************
  195. * 函数名称: GPIO_AtomicSetBits()
  196. * 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
  197. * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  198. * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  199. * uint32_t w 指定要将引脚电平置高的引脚的个数
  200. * 输 出: 无
  201. * 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
  202. ******************************************************************************************************************************************/
  203. void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
  204. {
  205. uint32_t bits;
  206. bits = 0xFFFF >> (16 - w);
  207. __disable_irq();
  208. GPIOx->ODR |= (bits << n);
  209. __enable_irq();
  210. }
  211. /******************************************************************************************************************************************
  212. * 函数名称: GPIO_AtomicClrBits()
  213. * 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
  214. * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  215. * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  216. * uint32_t w 指定要将引脚电平置低的引脚的个数
  217. * 输 出: 无
  218. * 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
  219. ******************************************************************************************************************************************/
  220. void GPIO_AtomicClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
  221. {
  222. uint32_t bits;
  223. bits = 0xFFFF >> (16 - w);
  224. __disable_irq();
  225. GPIOx->ODR &= ~(bits << n);
  226. __enable_irq();
  227. }
  228. /******************************************************************************************************************************************
  229. * 函数名称: GPIO_AtomicInvBits()
  230. * 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
  231. * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
  232. * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
  233. * uint32_t w 指定要将引脚电平反转的引脚的个数
  234. * 输 出: 无
  235. * 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
  236. ******************************************************************************************************************************************/
  237. void GPIO_AtomicInvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
  238. {
  239. uint32_t bits;
  240. bits = 0xFFFF >> (16 - w);
  241. __disable_irq();
  242. GPIOx->ODR ^= (bits << n);
  243. __enable_irq();
  244. }