Определение высокого / низкого сигнала на STM32 Nucleo

Я только начал учиться программировать с помощью платы Nucleo и решил выполнить простую задачу. Когда я нажимаю кнопку пользователя, я хочу, чтобы мой светодиод загорелся (выключился в начале). У меня есть следующие проблемы, и я не совсем уверен, каков ответ. Мне интересно, относится ли это к STM32 или это тонкость, которую я не понимаю.

Я запускаю следующий код. Я спрашиваю, что в настоящее время мой светодиод всегда включен, и только когда я нажимаю пользовательскую кнопку, он гаснет. Для меня не имеет смысла, что когда я нажимаю кнопку, значение моего PinState = 0. Я думал, что оно должно быть равным единице.

заранее спасибо

    #include "stm32f4xx.h"
    #include "stm32f4xx_nucleo.h"
    #include "system_stm32f4xx.h"
    #include "stm32f4xx_hal_gpio.h"
    #include "stm32f4xx_hal_rcc.h"

    GPIO_InitTypeDef GPIO_InitStructure; 

    int main(void) {

        HAL_Init(); 

        __GPIOA_CLK_ENABLE();
        GPIO_InitStructure.Pin   = GPIO_PIN_5;
        GPIO_InitStructure.Mode  = GPIO_MODE_OUTPUT_PP;    
        GPIO_InitStructure.Pull  = GPIO_PULLUP;
        GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;  
        HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);    

        __GPIOC_CLK_ENABLE();
        GPIO_InitStructure.Pin   = GPIO_PIN_13;
        GPIO_InitStructure.Mode  = GPIO_MODE_INPUT;
        GPIO_InitStructure.Pull  = GPIO_PULLDOWN;
        GPIO_InitStructure.Speed = GPIO_SPEED_FAST;
        HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
        int PinState;
       while (1)
       {
         PinState = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13);

         if(PinState == 1){
              HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5, GPIO_PIN_SET);
         }
         else {
             HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5, GPIO_PIN_RESET);
         }
      }
  }

person Hawk_08    schedule 02.04.2017    source источник
comment
Какая нуклео-плата? Нет никаких оснований предполагать, что состояние вывода 0 означает, что светодиод выключен, а 1 означает, что светодиод включен. Вы должны посмотреть на схему. Детали (площадки ввода / вывода) часто могут опускать воду больше, чем они могут служить источником.   -  person old_timer    schedule 03.04.2017
comment
так глядя на одну из досок. высокий уровень на PA5 включит светодиод. низкий выкл. Контактный выключатель PC13 обычно разомкнут и при нажатии выводит контакт на низкий уровень, поэтому при нажатии pc13 принимает значение 0, и ваш код говорит, что в этом случае нужно выключить светодиод.   -  person old_timer    schedule 03.04.2017
comment
установка выхода на 1 обычно означает, что напряжение VCC или VDD (или довольно близкое к нему) приложено к выводу, а 0 означает, что применяется GND (или довольно близко к нему). Для двухтактного, открытого слива и т. Д. Это меняет вещи: он может только опускаться, но не исток, если нет подтягивания. для погружения вы устанавливаете выход на 0, чтобы позволить ему плавать, вы устанавливаете его на 1, если у вас есть подтягивание, тогда он пытается подтянуть вверх или потянуть вниз или пытается потянуть вниз, аналогично с внешним подтягиванием вверх или вниз.   -  person old_timer    schedule 03.04.2017
comment
Связь между 1 и источником напряжения и 0 и землей не обязательно документируется (каждый производитель каждой части), но предполагается.   -  person old_timer    schedule 03.04.2017
comment
Я использую NucleoF446RE, я подумал, что это что-то вроде этого, но мне показалось странным, поэтому я задал вопрос. Я пока не очень хорошо знаком с этой платой / инфраструктурой. Я бы посмотрел на схему, но они не так доступны, как таблица данных Arduino.   -  person Hawk_08    schedule 03.04.2017
comment
нашел схему при первом поиске, который занял всего несколько секунд. можно просто перейти на веб-сайт st, так как это плата st (при чем здесь arduino?).   -  person old_timer    schedule 03.04.2017


Ответы (2)


Если вы посмотрите страницу 64 документации f401re (см. изображение ниже) вы можете видеть, что кнопка B1 (синяя) имеет подтягивающий резистор. Для программиста это означает, что цифровой сигнал всегда будет 1, пока кнопка не нажата, и 0, когда она нажата.

введите здесь описание изображения

person mikelsr    schedule 18.09.2018

В электронике этот сигнал известен как «активный минимум» и представлен полосой __ над символом.

person Richard at ImageCraft    schedule 14.05.2019