hw_io_pin.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #include "st_sys.h"
  2. #include "hw_io_pin.h"
  3. typedef struct
  4. {
  5. GPIO_TypeDef *gpio;
  6. unsigned short pin;
  7. unsigned char level;
  8. unsigned char pupd;
  9. } io_pin_t;
  10. static io_pin_t io_input_map[IO_PIN_INPUT_NUMBER] = {
  11. { GPIOF, 1, 0, GPIO_PUPD_PU},//0
  12. { GPIOF, 0, 0, GPIO_PUPD_PU},//1
  13. { GPIOG, 2, 0, GPIO_PUPD_PU},//2
  14. { GPIOG, 3, 0, GPIO_PUPD_PU},//3
  15. { GPIOG, 4, 0, GPIO_PUPD_PU},//4
  16. { GPIOE, 5, 0, GPIO_PUPD_PU},//5
  17. { GPIOE, 4, 0, GPIO_PUPD_PU},//6
  18. { GPIOE, 3, 0, GPIO_PUPD_PU},//7
  19. { GPIOE, 2, 0, GPIO_PUPD_PU},//10
  20. { GPIOE, 1, 0, GPIO_PUPD_PU},//11
  21. { GPIOE, 0, 0, GPIO_PUPD_PU},//12
  22. { GPIOB, 9, 0, GPIO_PUPD_PU},//13
  23. { GPIOB, 8, 0, GPIO_PUPD_PU},//14
  24. { GPIOB, 7, 0, GPIO_PUPD_PU},//15
  25. { GPIOB, 6, 0, GPIO_PUPD_PU},//16
  26. { GPIOG, 13, 0, GPIO_PUPD_PU},//17
  27. { GPIOA, 15, 0, GPIO_PUPD_PU},//20
  28. { GPIOB, 3, 0, GPIO_PUPD_PU},//21
  29. { GPIOC, 6, 0, GPIO_PUPD_PU},//22
  30. { GPIOC, 7, 0, GPIO_PUPD_PU}//23
  31. };
  32. static io_pin_t io_output_map[IO_PIN_OUTPUT_NUMBER] = {
  33. { GPIOF, 4, 0, GPIO_PUPD_PU},//0
  34. { GPIOF, 5, 0, GPIO_PUPD_PU},//1
  35. { GPIOF, 10, 0, GPIO_PUPD_PU},//2
  36. { GPIOA, 4, 0, GPIO_PUPD_PU},//3
  37. { GPIOA, 5, 0, GPIO_PUPD_PU},//4
  38. { GPIOA, 6, 0, GPIO_PUPD_PU},//5
  39. { GPIOB, 0, 0, GPIO_PUPD_PU},//6
  40. { GPIOB, 1, 0, GPIO_PUPD_PU},//7
  41. { GPIOF, 11, 0, GPIO_PUPD_PU},//10
  42. { GPIOB, 15, 0, GPIO_PUPD_PU},//11
  43. { GPIOD, 11, 0, GPIO_PUPD_PU},//12
  44. { GPIOF, 12, 0, GPIO_PUPD_PU},//13
  45. { GPIOF, 13, 0, GPIO_PUPD_PU},//14
  46. { GPIOF, 14, 0, GPIO_PUPD_PU},//15
  47. { GPIOF, 15, 0, GPIO_PUPD_PU},//16
  48. { GPIOG, 0, 0, GPIO_PUPD_PU},//17
  49. { GPIOG, 1, 0, GPIO_PUPD_PU},//20
  50. { GPIOE, 7, 0, GPIO_PUPD_PU},//21
  51. { GPIOE, 8, 0, GPIO_PUPD_PU}//22
  52. };
  53. #define OUTPUT_ENABLE_PORT GPIOG
  54. #define OUTPUT_ENABLE_PIN 6
  55. #define INPUT_KEY_PORT GPIOC
  56. #define INPUT_KEY_PIN 0
  57. #define OUTPUT_ENABLE() OUTPUT_ENABLE_PORT->BSRR = 1 << OUTPUT_ENABLE_PIN
  58. #define OUTPUT_DISABLE() OUTPUT_ENABLE_PORT->BRR = 1 << OUTPUT_ENABLE_PIN
  59. void hw_io_pin_init(void) {
  60. int in_size = sizeof(io_input_map) / sizeof(io_pin_t);
  61. int out_size = sizeof(io_output_map) / sizeof(io_pin_t);
  62. if (IO_PIN_INPUT_NUMBER != in_size || IO_PIN_OUTPUT_NUMBER != out_size) {
  63. while (1) {}
  64. }
  65. int i = 0;
  66. for (i = 0; i < in_size; i++) {
  67. RCC->APB2ENR |= 0x04 << (((uint32_t)(io_input_map[i].gpio) - GPIOA_BASE) / 0x400);
  68. GPIO_Set(io_input_map[i].gpio, 1 << io_input_map[i].pin,
  69. GPIO_MODE_IPU,
  70. GPIO_SPEED_50M,
  71. io_input_map[i].pupd);
  72. }
  73. for (i = 0; i < out_size; i++) {
  74. RCC->APB2ENR |= 0x04 << (((uint32_t)(io_output_map[i].gpio) - GPIOA_BASE) / 0x400);
  75. io_output_map[i].pin = 1 << io_output_map[i].pin;
  76. GPIO_Set(io_output_map[i].gpio, io_output_map[i].pin,
  77. GPIO_MODE_OUT_PP,
  78. GPIO_SPEED_50M,
  79. io_output_map[i].pupd);
  80. if (io_output_map[i].level) {
  81. io_output_map[i].gpio->BRR = io_output_map[i].pin;
  82. } else {
  83. io_output_map[i].gpio->BSRR = io_output_map[i].pin;
  84. }
  85. }
  86. {
  87. RCC->APB2ENR |= 0x04 << (((uint32_t)(OUTPUT_ENABLE_PORT)-GPIOA_BASE) / 0x400);
  88. GPIO_Set(OUTPUT_ENABLE_PORT, 1 << OUTPUT_ENABLE_PIN,
  89. GPIO_MODE_OUT_PP,
  90. GPIO_SPEED_50M,
  91. GPIO_PUPD_NONE);
  92. OUTPUT_ENABLE();
  93. }
  94. /*
  95. {
  96. RCC->APB2ENR |= 0x04 << (((uint32_t)(INPUT_KEY_PORT)-GPIOA_BASE) / 0x400);
  97. GPIO_Set(INPUT_KEY_PORT, 1 << INPUT_KEY_PIN,
  98. GPIO_MODE_IN_FLOATING,
  99. GPIO_SPEED_50M,
  100. GPIO_PUPD_NONE);
  101. }*/
  102. //鍏抽棴JTGA璋冭瘯鍙�
  103. GPIO_Remap_Set(GPIO_Remap_SWJ_JTAGDisable, 1);
  104. }
  105. /**
  106. * 杈撳叆鐢靛钩
  107. *
  108. * @author lxz
  109. *
  110. * @param index
  111. * @param sta
  112. */
  113. void hw_io_pin_output(unsigned short index, int sta) {
  114. if (index < IO_PIN_OUTPUT_NUMBER) {
  115. if (sta) {
  116. if (io_output_map[index].level) {
  117. io_output_map[index].gpio->BSRR = io_output_map[index].pin;
  118. } else {
  119. io_output_map[index].gpio->BRR = io_output_map[index].pin;
  120. }
  121. } else {
  122. if (io_output_map[index].level) {
  123. io_output_map[index].gpio->BRR = io_output_map[index].pin;
  124. } else {
  125. io_output_map[index].gpio->BSRR = io_output_map[index].pin;
  126. }
  127. }
  128. }
  129. }
  130. /**
  131. * 杈撳嚭鐢靛钩
  132. *
  133. * @author lxz
  134. *
  135. * @param index
  136. *
  137. * @return int
  138. */
  139. int hw_io_pin_input(unsigned short index) {
  140. if (index < IO_PIN_INPUT_NUMBER) {
  141. return ((io_input_map[index].gpio->IDR >> io_input_map[index].pin) & 0x01) ==
  142. (io_input_map[index].level);
  143. }
  144. return 0;
  145. }
  146. /**
  147. * 杈撳嚭浣胯兘
  148. *
  149. * @author lxz (2019/5/29/鍛ㄤ笁)
  150. */
  151. void hw_io_output_enable(void) {
  152. OUTPUT_ENABLE();
  153. }
  154. /**
  155. * 杈撳嚭绂佹�
  156. *
  157. * @author lxz (2019/5/29/鍛ㄤ笁)
  158. */
  159. void hw_io_output_disable(void) {
  160. OUTPUT_DISABLE();
  161. }
  162. /**
  163. * 鍏抽棴鎵€鏈夌殑IO杈撳嚭
  164. *
  165. * @author lxz (2019/5/30/鍛ㄥ洓)
  166. *
  167. * @param void
  168. */
  169. void hw_io_close_all(void) {
  170. int in_size = sizeof(io_input_map) / sizeof(io_pin_t);
  171. int out_size = sizeof(io_output_map) / sizeof(io_pin_t);
  172. if (IO_PIN_INPUT_NUMBER != in_size || IO_PIN_OUTPUT_NUMBER != out_size) {
  173. while (1) {}
  174. }
  175. //输出禁止
  176. OUTPUT_DISABLE();
  177. int i = 0;
  178. //输入下拉
  179. for (i = 0; i < in_size; i++) {
  180. GPIO_Set(io_output_map[i].gpio, io_output_map[i].pin,
  181. GPIO_MODE_IPD,
  182. GPIO_SPEED_50M,
  183. GPIO_PUPD_NONE);
  184. RCC->APB2ENR &= ~(0x04 << (((uint32_t)(io_input_map[i].gpio) - GPIOA_BASE) / 0x400));
  185. }
  186. //输出切换下拉
  187. for (i = 0; i < out_size; i++) {
  188. GPIO_Set(io_output_map[i].gpio, io_output_map[i].pin,
  189. GPIO_MODE_IPD,
  190. GPIO_SPEED_50M,
  191. GPIO_PUPD_NONE);
  192. RCC->APB2ENR &= ~(0x04 << (((uint32_t)(io_output_map[i].gpio) - GPIOA_BASE) / 0x400));
  193. }
  194. }