0

我正在使用 STM32F103C4、2 个按钮和一个 7seg 显示器制作一个简单的向上/向下计数器,代码是用 Keil uVision 编写的,从中将 hex 文件加载到 Proteus 中。Counter Up 部分完美运行,但 Counter Down 部分只是没有注册任何输入。我尝试切换引脚并得出结论 B0 引脚正在工作,但由于某种原因 B1 引脚不工作。我已经到处搜索了,问了很多,但我找不到解决方案。这是否与特殊端口 B 的重置值有关?

下面是我的代码和 proteus 方案的 ss。

#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;
        }
    }
}
}

在此处输入图像描述

我的怀疑是我宣布 GPIO 错误。

4

1 回答 1

-1

尝试使用提供的 GPIO init 定义:

  GPIO_InitTypeDef  GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1| GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //you have an external pulldown.
  GPIO_Init(GPIOB, &GPIO_InitStructure);
于 2020-05-15T02:39:19.813 回答