common_gpio.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "at32f403a_407.h"
  2. #include "common_gpio.h"
  3. #include "FreeRTOS.h"
  4. #include "task.h"
  5. #include "io.h"
  6. #include <stdbool.h>
  7. #define ADDR_PIN_NUM 4
  8. #define HW_REV_PIN_NUM 3
  9. //
  10. din_t addr_in[ADDR_PIN_NUM] = {
  11. {GPIOC, GPIO_PINS_4, 0, 0, false, 0}, // 1
  12. {GPIOA, GPIO_PINS_7, 0, 0, false, 0}, // 2
  13. {GPIOA, GPIO_PINS_6, 0, 0, false, 0}, // 3
  14. {GPIOA, GPIO_PINS_5, 0, 0, false, 0}, // 4
  15. };
  16. //
  17. din_t rev_in[ADDR_PIN_NUM] = {
  18. {GPIOB, GPIO_PINS_13, 0, 0, false, 0}, // 1
  19. {GPIOB, GPIO_PINS_14, 0, 0, false, 0}, // 2
  20. {GPIOB, GPIO_PINS_15, 0, 0, false, 0}, // 3
  21. };
  22. //
  23. void gpio_wdt_init(void)
  24. {
  25. gpio_init_type gpio_initstructure;
  26. crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
  27. // WDT
  28. gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  29. gpio_initstructure.gpio_pull = GPIO_PULL_NONE;
  30. gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
  31. gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  32. gpio_initstructure.gpio_pins = GPIO_PINS_7;
  33. gpio_init(GPIOC, &gpio_initstructure);
  34. }
  35. // Пины переключателя modbus-адреса
  36. void gpio_mbaddr_init(void)
  37. {
  38. gpio_init_type gpio_init_struct;
  39. gpio_default_para_init(&gpio_init_struct);
  40. for (uint8_t i = 0; i < ADDR_PIN_NUM; i++)
  41. {
  42. gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  43. gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  44. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  45. gpio_init_struct.gpio_pins = addr_in[i].pin ;
  46. gpio_init(addr_in[i].port, &gpio_init_struct);
  47. }
  48. }
  49. //
  50. uint8_t gpio_get_mbaddr(void)
  51. {
  52. uint8_t ret = 0;
  53. for (uint8_t i = 0; i < ADDR_PIN_NUM; i++)
  54. {
  55. ret |= (uint8_t)gpio_input_data_bit_read(addr_in[i].port, addr_in[i].pin) << i;
  56. }
  57. ret = ret > 1 ? ret : 1;
  58. return ret;
  59. }
  60. // Ревизия платы
  61. uint8_t gpio_get_rev(void)
  62. {
  63. uint8_t ret = 0;
  64. gpio_init_type gpio_init_struct;
  65. gpio_default_para_init(&gpio_init_struct);
  66. for (uint8_t i = 0; i < HW_REV_PIN_NUM; i++)
  67. {
  68. gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  69. gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  70. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  71. gpio_init_struct.gpio_pins = rev_in[i].pin ;
  72. gpio_init(rev_in[i].port, &gpio_init_struct);
  73. }
  74. for (uint8_t i = 0; i < HW_REV_PIN_NUM; i++)
  75. {
  76. ret |= (uint8_t)gpio_input_data_bit_read(rev_in[i].port, rev_in[i].pin) << i;
  77. }
  78. ret = ret > 1 ? ret : 1;
  79. return ret;
  80. }
  81. //
  82. void extern_wdt_togle(void)
  83. {
  84. static bool toogle = false;
  85. if (!toogle) {
  86. toogle = true;
  87. gpio_bits_set(GPIOC, GPIO_PINS_7);
  88. }
  89. else {
  90. toogle = false;
  91. gpio_bits_reset(GPIOC, GPIO_PINS_7);
  92. }
  93. }