hw_io_pin.c 5.2 KB

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