STM32 Контакт B0 работает как вход, но B1 не работает - PullRequest
0 голосов
/ 16 апреля 2020

Я делаю простой счетчик вверх / вниз, используя STM32F103C4, 2 кнопки и 7-сегментный дисплей, и код написан в Keil uVision, откуда шестнадцатеричный файл загружается в Proteus. Часть Counter Up работает отлично, но часть Counter Down просто не регистрирует никаких входных данных. Я попытался переключить контакты и пришел к выводу, что контакт B0 работает, но по какой-то причине контакт B1 не работает. Я искал все и спросил много, но я не могу найти решение. Связано ли это со специальным значением сброса порта B?

Ниже приведен мой код и сс схемы протей.

#include "stm32f10x.h"  // Device header

int dispBroj[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92,  0x82, 0xF8, 0x80, 0x90};
int j = 0;

void reset()
{
    for(int i = 0; i < 7; i++)
    {
     GPIOA->ODR &=~ (1<<i);
    }
}

void cifre(int broj) 
{

    GPIOA->ODR |= dispBroj[broj];

}

int main(void)
{

RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;

GPIOA->CRL |=GPIO_CRL_MODE;
GPIOA->CRL &=~GPIO_CRL_CNF;

GPIOB->CRL|=((1<<7)|(1<<3));
GPIOB->CRL &=~((1<<2)|(1<<1)|(1<<0)|(1<<4)|(1<<5)|(1<<6));
GPIOB->CRH|=((1<<7)|(1<<3));
GPIOB->CRH &=~((1<<2)|(1<<1)|(1<<0)|(1<<4)|(1<<5)|(1<<6));


while(1){

    cifre(j%10);

    if(GPIOB->IDR & GPIO_IDR_IDR0){

        reset();
        j++;
        cifre(j%10);
        while(GPIOB->IDR & GPIO_IDR_IDR0){
            if(!GPIOB->IDR & GPIO_IDR_IDR0)
                break;
        }
    }

    if(GPIOB->IDR & GPIO_IDR_IDR1){

        reset();
        j--;
        cifre(j%10);
        while(GPIOB->IDR & GPIO_IDR_IDR1){
            if(!GPIOB->IDR & GPIO_IDR_IDR1)
                break;
        }
    }
}
}

enter image description here

Я подозреваю, что я объявил GPIO неправильным.

...