ARM FRDM-KE02Z如何从引脚读取输入

ARM FRDM-KE02Z如何从引脚读取输入,arm,embedded,microcontroller,keil,nxp-microcontroller,Arm,Embedded,Microcontroller,Keil,Nxp Microcontroller,我对ARM编程还不熟悉,但我必须做一个项目来学习。我有开发板(带有KE02Z64VQH2微控制器)。首先,我编写了用于七段显示的库,它运行良好。接下来,我尝试编写按钮库,但在正确设置输入引脚和从PDIR读取时遇到了一些问题。我构建了如下所示的系统: 我编写了测试代码来检验它是如何工作的 void button_init(){ GPIO_PinInit(GPIO_PTE5, GPIO_PinOutput); GPIO_Init(GPIOA, GPIO_PTB0_MASK, GPIO_

我对ARM编程还不熟悉,但我必须做一个项目来学习。我有开发板(带有KE02Z64VQH2微控制器)。首先,我编写了用于七段显示的库,它运行良好。接下来,我尝试编写按钮库,但在正确设置输入引脚和从PDIR读取时遇到了一些问题。我构建了如下所示的系统:

我编写了测试代码来检验它是如何工作的

void button_init(){
   GPIO_PinInit(GPIO_PTE5, GPIO_PinOutput);
   GPIO_Init(GPIOA, GPIO_PTB0_MASK, GPIO_PinInput);
}

uint32_t button_read(){
   return (GPIOA -> PDIR) & (1UL << 8);
}

void led_test(){
   GPIO_PinClear(GPIO_PTE5);
   for(uint32_t i; i <= 3000000; i++){};
   GPIO_PinSet(GPIO_PTE5);
   for(uint32_t i; i <= 3000000; i++){};
   GPIO_PinClear(GPIO_PTE5);
   for(uint32_t i; i <= 3000000; i++){};
   GPIO_PinSet(GPIO_PTE5);
   for(uint32_t i; i <= 3000000; i++){};
   GPIO_PinClear(GPIO_PTE5);
   for(uint32_t i; i <= 3000000; i++){};

   }

int main(){
   sysinit();
   button_init();

   GPIO_PinClear(GPIO_PTE5);

   while(1){
   if (button_read()){led_test();}
   }
}
LED发出微弱的光,当我按下按钮时,LED熄灭。然后,我用透明的和LED的 表现还是一样

我是不是在软件方面遗漏了什么?或者我应该检查连接和硬件吗?
我应该如何设置输入引脚以及如何正确读取它们?

由于您的按钮处于高激活状态,您是否尝试过在按钮的gpio侧添加下拉电阻器?(可以试试10k之类的东西)我在按钮连接5V的同一侧连接了下拉电阻器,在oposite侧连接了输入板引脚。现在它正确了:)非常感谢你的回答你救了我的命和我的事业;)我读了关于下拉电阻器的书,我发现如果没有这个输入管脚,它是浮动的,我可以从电路板上读取噪声,这可能是电路板奇怪行为的原因。这不是软件问题,应该打开。如果嵌入式系统是你的职业,你需要至少获得一些基本的电子知识。请注意,当设置为输入时,您部件上的所有GPIO引脚在芯片上都有一个可编程的上拉电阻器。您可以通过使用它而不是外部电阻器来简化设计。您必须将电路更改为正常高电平(即输入开关GND),但这是软件问题(有源低电平开关:
return(GPIOA->PDIR)&(1UL@clifford在这种情况下,这更多的是一个硬件问题,而stack exchange站点对于这类事情来说要好得多,但我认为这可能是一个代码问题。说到这里,你说得对,像这样的部分经常有内部的、软件可配置的下拉列表(有时是下拉列表)使用起来更好;但是我没有这部分的参考资料来帮助op解决这个问题,但是他们应该花一些时间来查找关于gpio配置的信息。
while(1){
   if(button_read()){
      GPIO_PinSet(GPIO_PTE5);
   }else{
      GPIO_PinClear(GPIO_PTE5);
   }
}