pin.txt 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. Как проверить состояние пина порта?
  2. Скажем 4 пина порта С?
  3. просто.
  4. Можно использовать стандартную библиотеку:
  5. if (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)== Bit_RESET)....
  6. Можно и так(само коротко и быстро:
  7. if (GPIOС->IDR & GPIO_IDR_IDR4)...
  8. #define pin_X (GPIOС->IDR & GPIO_IDR_IDR4)
  9. if (pin_X == 1) {......}
  10. -=-=-
  11. Код:
  12. #define GPIO_ODR_ODR0 ((uint16_t)0x0001) /*!< Port output data, bit 0 */
  13. #define GPIO_ODR_ODR1 ((uint16_t)0x0002) /*!< Port output data, bit 1 */
  14. #define GPIO_ODR_ODR2 ((uint16_t)0x0004) /*!< Port output data, bit 2 */
  15. GPIO_ODR_ODR0 это макросы описывающие битовую маску.
  16. Хотите изменить сразу несколько - пишите как я в примере или укажите свою маску:
  17. Код:
  18. GPIOB->ODR ^=0x00ff; //переключит младшие 8 ног.
  19. или что-б потом самому легче читалось:
  20. Код:
  21. /* маска для 8-ми нечетных ног */
  22. #define ODD_0_8 0x0055
  23. /* маска для 8-ми четных ног */
  24. #define EVEN_0_8 0x00AA
  25. GPIOB->ODR ^= ODD_0_8; //переключит нечетные
  26. GPIOB->ODR ^= EVEN_0_8; //переключит четные
  27. -=-=-=-=-=-
  28. а как тогда событие нажатия отследить?
  29. Ну, как-то так (одновременно и с дребезгом поборемся):
  30. Код:
  31. #define MAXCNT 10
  32. char flip=0, pressed=0;
  33. while(1)
  34. {
  35. if((GPIOA->IDR&0x01)==0) //кнопка не нажата (или 0 читается во впемя дребезга) - готовимся к обработке
  36. {
  37. pressed=0;
  38. cntr=0;
  39. }
  40. else
  41. if(!pressed) //кнопка вроде бы нажата, но возможно это пока что только дребезг
  42. {
  43. cntr++; // сосчитаем до десяти в надежде, что за это время переходные процессы завершатся
  44. if(cntr>MAXCNT) // десять последних проходов кнопка в состоянии "нажато" - считаем, что событие "нажатие кнопки" свершилось
  45. { // тут соб-сно ваша реакция на событие "нажатие кнопки", т.е. переход от 0 к 1
  46. flip=!flip; // организуем простейший двоичный переключатель ("flip-flop")
  47. if(flip) // и в зависимости от его состояния выполняем ту или иную ветвь
  48. {
  49. GPIOC->BSRR = GPIO_BSRR_BS9;
  50. GPIOC->BSRR = GPIO_BSRR_BR8;
  51. }
  52. else
  53. {
  54. GPIOC->BSRR = GPIO_BSRR_BS8;
  55. GPIOC->BSRR = GPIO_BSRR_BR9;
  56. }
  57. pressed=1; // отработав событие "нажатие кнопки", отключаем проверку на это событие -> до следующего отпускания кнопки
  58. }
  59. }
  60. else //кнопка в состоянии "нажато" (после отловленного события "нажатие кнопки") - в нашем случае неинтересно
  61. {
  62. }
  63. }