SN_GPIO.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. #include "SN_GPIO.h"
  2. /*
  3. 文件名:SN_GPIO.c/.h
  4. 作者: SN_FAE_黄泽洪
  5. 免责声明:无版权,可随意传播和篡改,该代码仅供开发参考,如需使用请自行验证
  6. 本人不担负商业使用上带来的风险。
  7. */
  8. /*
  9. SN_GPIO模块的使用方法
  10. int main(void){
  11. SN_SYSCLK_set(SYSCLK_48MHZ);
  12. std_delay_init();
  13. SN_GPIO_PIN_init(GPIOA ,GPIO_PIN_0 , GPIO_MODE_OUTPUT ,GPIO_PULLUP ,GPIO_OUTPUT_PUSHPULL);
  14. while(1){
  15. std_delayms(500);
  16. SN_GPIO_PIN_set(GPIOA,GPIO_PIN_0);
  17. }
  18. }
  19. 或是
  20. int main(void){
  21. SN_SYSCLK_set(SYSCLK_48MHZ);
  22. std_delay_init();
  23. SN_GPIO_PIN_init(GPIOA ,GPIO_PIN_0 , GPIO_MODE_INPUT ,GPIO_PULLUP ,GPIO_OUTPUT_OPENDRAIN);
  24. while(1){
  25. if(SN_GPIO_PIN_get(GPIOA, GPIO_PIN_0)){
  26. //用户逻辑
  27. }
  28. }
  29. }
  30. */
  31. /*
  32. 函数名称:SN_GPIO_PIN_init()
  33. 功能: 设置对应的PIN脚的IO工作模式
  34. @参数:GPIO_PORT
  35. @GPIOA
  36. @GPIOB
  37. @GPIOC
  38. @参数: PIN
  39. @GPIO_PIN_0
  40. @GPIO_PIN_1
  41. @GPIO_PIN_2
  42. @GPIO_PIN_3
  43. @GPIO_PIN_4
  44. @GPIO_PIN_5
  45. @GPIO_PIN_6
  46. @GPIO_PIN_7
  47. @GPIO_PIN_x|GPIO_PIN_y|GPIO_PIN_z
  48. @参数:MODE (输入输出)
  49. @GPIO_MODE_INPUT 输入模式
  50. @GPIO_MODE_OUTPUT 输出模式
  51. @参数:GPIO_PULL (上下拉电阻) :
  52. @GPIO_PULLUP 设置上拉
  53. @GPIO_PULLDOWN 设置下拉
  54. @GPIO_NOPULL 不设置上下拉
  55. @参数:output_type (是否开漏输出)
  56. @GPIO_OUTPUT_PUSHPULL
  57. @GPIO_OUTPUT_OPENDRAIN
  58. (注意:如果是MODE设置为输入,该参数会被忽略)
  59. @返回值:无
  60. */
  61. void SN_GPIO_PIN_init(GPIO_t* gpiox , uint32_t pin_mask , uint32_t GPIO_MODE ,uint32_t GPIO_PULL ,uint32_t output_type){
  62. std_gpio_init_t gpio_config = {0};
  63. /*开启对应时钟*/
  64. if(gpiox == GPIOA)std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOA );
  65. if(gpiox == GPIOB)std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOB );
  66. if(gpiox == GPIOC)std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOC );
  67. /* 配置IO */
  68. gpio_config.pin = pin_mask;
  69. gpio_config.mode = GPIO_MODE;
  70. if(GPIO_MODE == GPIO_MODE_INPUT ){gpio_config.pull = GPIO_PULL;}else{gpio_config.pull = GPIO_NOPULL;}
  71. if(GPIO_MODE == GPIO_MODE_OUTPUT ){gpio_config.output_type = output_type;}
  72. std_gpio_init(gpiox, &gpio_config);
  73. }
  74. /*
  75. 函数名称:SN_GPIO_PIN_write()
  76. 功能: 输出高低电平
  77. @参数:GPIO_PORT :
  78. @GPIOA
  79. @GPIOB ,
  80. @GPIOC
  81. @参数:PIN :
  82. @GPIO_PIN_0
  83. @GPIO_PIN_1
  84. @GPIO_PIN_2
  85. @GPIO_PIN_3
  86. @GPIO_PIN_4
  87. @GPIO_PIN_5
  88. @GPIO_PIN_6
  89. @GPIO_PIN_7
  90. @GPIO_PIN_x|GPIO_PIN_y|GPIO_PIN_z
  91. @返回值:失败 1 ,成功 0
  92. */
  93. uint8_t SN_GPIO_PIN_write(GPIO_t* gpiox, uint32_t pin_mask, uint8_t status){
  94. //判断是否可以输出
  95. if(std_gpio_get_pin_mode(gpiox, pin_mask) != GPIO_MODE_OUTPUT ){ return 1;}
  96. if(status == 1)gpiox->BSR = pin_mask;
  97. else
  98. gpiox->BR = pin_mask;
  99. return 0;
  100. }
  101. /*
  102. 函数名称:SN_GPIO_PIN_set()
  103. 功能: 输出高低电平
  104. @参数:GPIO_PORT :
  105. @GPIOA
  106. @GPIOB ,
  107. @GPIOC
  108. @参数:PIN :
  109. @GPIO_PIN_0
  110. @GPIO_PIN_1
  111. @GPIO_PIN_2
  112. @GPIO_PIN_3
  113. @GPIO_PIN_4
  114. @GPIO_PIN_5
  115. @GPIO_PIN_6
  116. @GPIO_PIN_7
  117. @GPIO_PIN_x|GPIO_PIN_y|GPIO_PIN_z
  118. @返回值:失败 1 ,成功 0
  119. */
  120. uint8_t SN_GPIO_PIN_set(GPIO_t* gpiox, uint32_t pin_mask){
  121. //判断是否可以输出
  122. if(std_gpio_get_pin_mode(gpiox, pin_mask) != GPIO_MODE_OUTPUT ){ return 1;}
  123. gpiox->BSR = pin_mask;
  124. return 0;
  125. }
  126. /*
  127. 函数名称:SN_GPIO_PIN_reset()
  128. 功能: 输出高低电平
  129. @参数:GPIO_PORT
  130. @GPIOA
  131. @GPIOB ,
  132. @GPIOC
  133. @参数:PIN :
  134. @GPIO_PIN_0
  135. @GPIO_PIN_1
  136. @GPIO_PIN_2
  137. @GPIO_PIN_3
  138. @GPIO_PIN_4
  139. @GPIO_PIN_5
  140. @GPIO_PIN_6
  141. @GPIO_PIN_7
  142. @GPIO_PIN_x|GPIO_PIN_y|GPIO_PIN_z
  143. @返回值:失败 1 ,成功 0
  144. */
  145. uint8_t SN_GPIO_PIN_reset(GPIO_t* gpiox, uint32_t pin_mask){
  146. //判断是否可以输出
  147. if(std_gpio_get_pin_mode(gpiox, pin_mask) != GPIO_MODE_OUTPUT ){ return 1;}
  148. gpiox->BR = pin_mask;
  149. return 0;
  150. }
  151. /*
  152. 函数名称:SN_GPIO_PIN_get()
  153. 功能: 获取输入io电平
  154. @参数:GPIO_PORT
  155. @GPIOA
  156. @GPIOB ,
  157. @GPIOC
  158. @参数:PIN
  159. @GPIO_PIN_0
  160. @GPIO_PIN_1
  161. @GPIO_PIN_2
  162. @GPIO_PIN_3
  163. @GPIO_PIN_4
  164. @GPIO_PIN_5
  165. @GPIO_PIN_6
  166. @GPIO_PIN_7
  167. @GPIO_PIN_x|GPIO_PIN_y|GPIO_PIN_z
  168. @返回值:失败 0xff ,成功 0/1
  169. */
  170. uint8_t SN_GPIO_PIN_get(GPIO_t* gpiox, uint32_t pin){
  171. //判断是否可以输输入
  172. if(std_gpio_get_pin_mode(gpiox, pin) != GPIO_MODE_INPUT ){ return 0xff;}
  173. return ((gpiox->IDR & (pin)) == (pin));
  174. }
  175. /*
  176. 函数名称:SN_GPIO_PIN_toggle()
  177. 功能: 获取输入io电平
  178. @参数:GPIO_PORT
  179. @GPIOA
  180. @GPIOB ,
  181. @GPIOC
  182. @参数:PIN
  183. @GPIO_PIN_0
  184. @GPIO_PIN_1
  185. @GPIO_PIN_2
  186. @GPIO_PIN_3
  187. @GPIO_PIN_4
  188. @GPIO_PIN_5
  189. @GPIO_PIN_6
  190. @GPIO_PIN_7
  191. @返回值:@返回值:失败 0xff ,成功 0/1
  192. */
  193. uint8_t SN_GPIO_PIN_toggle(GPIO_t* gpiox, uint32_t pin_mask){
  194. //判断是否可以输出
  195. if(std_gpio_get_pin_mode(gpiox, pin_mask) != GPIO_MODE_OUTPUT ){ return 0xff;}
  196. gpiox->ODR ^= pin_mask;
  197. return 1;
  198. }
  199. /*
  200. 函数名称:SN_GPIO_Deinit(uint8 GPIO_X)
  201. 参数: GPIOA
  202. GPIOB
  203. GPIOC
  204. 返回:无
  205. */
  206. void SN_GPIO_Deinit(GPIO_t * GPIOx){
  207. std_gpio_deinit(GPIOx);
  208. if(GPIOx == GPIOA)std_rcc_gpio_clk_disable(RCC_PERIPH_CLK_GPIOA );
  209. if(GPIOx == GPIOB)std_rcc_gpio_clk_disable(RCC_PERIPH_CLK_GPIOB );
  210. if(GPIOx == GPIOC)std_rcc_gpio_clk_disable(RCC_PERIPH_CLK_GPIOC );
  211. }