lutunovoleg

Untitled

Feb 18th, 2026
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.41 KB | None | 0 0
  1. // === Конфигурация периферии и утилиты ===
  2. #include "riscv_csr_encoding.h"
  3. #include "scr1_csr_encoding.h"
  4. #include "mcu32_memory_map.h"
  5. #include <power_manager.h>
  6. #include <pad_config.h>
  7. #include <gpio_irq.h>
  8. #include <epic.h>
  9. #include <csr.h>
  10. #include <gpio.h>
  11.  
  12. // === Аппаратные определения ===
  13. #define INDICATOR_A 9U
  14. #define INDICATOR_B 10U
  15. #define USER_SWITCH 15U
  16. #define SWITCH_BANK 1U
  17.  
  18. // === Вспомогательные макросы ===
  19. #define BIT(n) (1U << (n))
  20. #define IS_PRESSED(p) (((p)->STATE & BIT(USER_SWITCH)) == 0U)
  21. #define TOGGLE_STATE(s) ((s) ^= 1U)
  22.  
  23. // === Прототипы локальных функций ===
  24. static void system_clocks_init(void);
  25. static void io_pins_configure(void);
  26. static void indicators_set(uint8_t pattern);
  27. static void short_delay_ms(uint32_t cycles);
  28. static uint8_t read_switch_stable(void);
  29.  
  30. // === Точка входа ===
  31. void main(void)
  32. {
  33. system_clocks_init();
  34. io_pins_configure();
  35.  
  36. uint8_t current_pattern = 0U; // 0 → A, 1 → B
  37. indicators_set(current_pattern);
  38.  
  39. for (;;) {
  40. if (read_switch_stable()) {
  41. TOGGLE_STATE(current_pattern);
  42. indicators_set(current_pattern);
  43.  
  44. // Ждём отпускания с подтверждением
  45. while (read_switch_stable()) {
  46. short_delay_ms(100U);
  47. }
  48. }
  49. }
  50. }
  51.  
  52. // === Реализация функций ===
  53.  
  54. static void system_clocks_init(void)
  55. {
  56. // Включаем тактирование GPIO-портов и контроллеров прерываний
  57. PM->CLK_APB_P_SET = PM_CLOCK_APB_P_GPIO_0_M
  58. | PM_CLOCK_APB_P_GPIO_1_M
  59. | PM_CLOCK_APB_P_GPIO_2_M
  60. | PM_CLOCK_APB_P_GPIO_IRQ_M;
  61.  
  62. // Активируем модули конфигурации, пробуждения, питания и EPIC
  63. PM->CLK_APB_M_SET = PM_CLOCK_APB_M_PAD_CONFIG_M
  64. | PM_CLOCK_APB_M_WU_M
  65. | PM_CLOCK_APB_M_PM_M
  66. | PM_CLOCK_APB_M_EPIC_M;
  67.  
  68. // Тактируем SPIFI для полной совместимости
  69. PM->CLK_AHB_SET |= PM_CLOCK_AHB_SPIFI_M;
  70. }
  71.  
  72. static void io_pins_configure(void)
  73. {
  74. // Кнопка — вход с подтяжкой (аппаратной)
  75. GPIO_1->DIRECTION_IN = BIT(USER_SWITCH);
  76.  
  77. // Светодиоды — выходы
  78. GPIO_0->DIRECTION_OUT = BIT(INDICATOR_A) | BIT(INDICATOR_B);
  79.  
  80. // Начальное состояние: горит первый индикатор
  81. GPIO_0->OUTPUT = BIT(INDICATOR_A);
  82. }
  83.  
  84. static void indicators_set(uint8_t pattern)
  85. {
  86. // pattern == 0 → INDICATOR_A, иначе → INDICATOR_B
  87. GPIO_0->OUTPUT = (pattern == 0U) ? BIT(INDICATOR_A) : BIT(INDICATOR_B);
  88. }
  89.  
  90. static void short_delay_ms(uint32_t cycles)
  91. {
  92. for (volatile uint32_t c = 0U; c < cycles; ++c) {
  93. __asm__ volatile ("" ::: "memory"); // барьер компилятора
  94. }
  95. }
  96.  
  97. static uint8_t read_switch_stable(void)
  98. {
  99. // Антидребезг: два подтверждения с паузой
  100. if (!IS_PRESSED(GPIO_1)) return 0U;
  101.  
  102. short_delay_ms(30000U); // ~10-20 мс в зависимости от частоты
  103.  
  104. return IS_PRESSED(GPIO_1) ? 1U : 0U;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment