pin.txt 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. https://hubstub.ru/stm32/65-stm32-gpio-ili-porty-vvoda-vyvoda.html
  2. stm32f1xx
  3. //Полагаем что выводы после сброса в режиме плавающего входа
  4. //разрешаем тактирование порта A
  5. RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
  6. //вход с подтяжкой к +
  7. GPIOA->CRL &= ~GPIO_CRL_CNF0;
  8. GPIOA->CRL |= GPIO_CRL_CNF0_1;
  9. GPIOA->ODR |= GPIO_ODR_ODR0;
  10. //вход с подтяжкой к -
  11. GPIOA->CRL &= ~GPIO_CRL_CNF1;
  12. GPIOA->CRL |= GPIO_CRL_CNF1_1;
  13. GPIOA->ODR &= ~GPIO_ODR_ODR1;
  14. //аналоговый режим
  15. GPIOA->CRL &= ~GPIO_CRL_CNF2;
  16. //выход с открытым стоком 2MHz
  17. GPIOA->CRL &= ~GPIO_CRL_CNF3;
  18. GPIOA->CRL |= GPIO_CRL_CNF3_0;
  19. GPIOA->CRL |= GPIO_CRL_MODE3_1;
  20. //двухтактный выход 10MHz
  21. GPIOA->CRL &= ~GPIO_CRL_CNF4;
  22. GPIOA->CRL |= GPIO_CRL_MODE4_0;
  23. //альтернативная ф-ция, двухтактный выход, 50 MHz
  24. GPIOA->CRL &= ~GPIO_CRL_CNF5;
  25. GPIOA->CRL |= GPIO_CRL_CNF5_1;
  26. GPIOA->CRL |= GPIO_CRL_MODE5;
  27. //альтернативная ф-ция, выход с открытым стоком, 50 MHz
  28. GPIOA->CRL |= GPIO_CRL_CNF6;
  29. GPIOA->CRL |= GPIO_CRL_MODE6;
  30. //проверяем значение нулевого вывода порта А
  31. if (GPIOА->IDR & GPIO_IDR_IDR0)
  32. //если вывод в режиме входа то активируется подтяжка к питанию
  33. GPIOA->ODR |= GPIO_ODR_ODR0;
  34. //или к земле
  35. GPIOA->ODR &= ~GPIO_ODR_ODR0;
  36. //если в режиме выхода, то на нём установится соответствующий лог.уровень
  37. //например так можно установить все выходы порта в 1
  38. GPIOA->ODR = 0xFFFF;
  39. //сбросить нулевой бит порта А
  40. GPIOA->BRR = GPIO_BRR_BR0;
  41. //сбросить нулевой бит
  42. GPIOA->BSRR = GPIO_BSRR_BR0;
  43. //установить нулевой бит
  44. GPIOA->BSRR = GPIO_BSRR_BS0;
  45. -=-=-
  46. Как проверить состояние пина порта?
  47. Скажем 4 пина порта С?
  48. просто.
  49. Можно использовать стандартную библиотеку:
  50. if (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)== Bit_RESET)....
  51. Можно и так(само коротко и быстро:
  52. if (GPIOС->IDR & GPIO_IDR_IDR4)...
  53. #define pin_X (GPIOС->IDR & GPIO_IDR_IDR4)
  54. if (pin_X == 1) {......}
  55. -=-=-
  56. Код:
  57. #define GPIO_ODR_ODR0 ((uint16_t)0x0001) /*!< Port output data, bit 0 */
  58. #define GPIO_ODR_ODR1 ((uint16_t)0x0002) /*!< Port output data, bit 1 */
  59. #define GPIO_ODR_ODR2 ((uint16_t)0x0004) /*!< Port output data, bit 2 */
  60. GPIO_ODR_ODR0 это макросы описывающие битовую маску.
  61. Хотите изменить сразу несколько - пишите как я в примере или укажите свою маску:
  62. Код:
  63. GPIOB->ODR ^=0x00ff; //переключит младшие 8 ног.
  64. или что-б потом самому легче читалось:
  65. Код:
  66. /* маска для 8-ми нечетных ног */
  67. #define ODD_0_8 0x0055
  68. /* маска для 8-ми четных ног */
  69. #define EVEN_0_8 0x00AA
  70. GPIOB->ODR ^= ODD_0_8; //переключит нечетные
  71. GPIOB->ODR ^= EVEN_0_8; //переключит четные
  72. -=-=-=-=-=-
  73. а как тогда событие нажатия отследить?
  74. Ну, как-то так (одновременно и с дребезгом поборемся):
  75. Код:
  76. #define MAXCNT 10
  77. char flip=0, pressed=0;
  78. while(1)
  79. {
  80. if((GPIOA->IDR&0x01)==0) //кнопка не нажата (или 0 читается во впемя дребезга) - готовимся к обработке
  81. {
  82. pressed=0;
  83. cntr=0;
  84. }
  85. else
  86. if(!pressed) //кнопка вроде бы нажата, но возможно это пока что только дребезг
  87. {
  88. cntr++; // сосчитаем до десяти в надежде, что за это время переходные процессы завершатся
  89. if(cntr>MAXCNT) // десять последних проходов кнопка в состоянии "нажато" - считаем, что событие "нажатие кнопки" свершилось
  90. { // тут соб-сно ваша реакция на событие "нажатие кнопки", т.е. переход от 0 к 1
  91. flip=!flip; // организуем простейший двоичный переключатель ("flip-flop")
  92. if(flip) // и в зависимости от его состояния выполняем ту или иную ветвь
  93. {
  94. GPIOC->BSRR = GPIO_BSRR_BS9;
  95. GPIOC->BSRR = GPIO_BSRR_BR8;
  96. }
  97. else
  98. {
  99. GPIOC->BSRR = GPIO_BSRR_BS8;
  100. GPIOC->BSRR = GPIO_BSRR_BR9;
  101. }
  102. pressed=1; // отработав событие "нажатие кнопки", отключаем проверку на это событие -> до следующего отпускания кнопки
  103. }
  104. }
  105. else //кнопка в состоянии "нажато" (после отловленного события "нажатие кнопки") - в нашем случае неинтересно
  106. {
  107. }
  108. }