stm32f4板子如何制作外部开关控制LED?

How to make external switch control LED stm32f4 board?

我尝试使用面包板上的外部开关控制板上的 LED,但它没有?开关连接到端口 d 号 9,我试图做到这样,一旦我按下开关,绿色 LED 就会亮起。但由于某些奇怪的原因,它不起作用,我尝试 fiddle 使用它,但没有成功。我该如何修复它才能正常工作?

这是我的代码:

include <stdio.h>
include "STM32F4xx.h"
void Soft_Delay(void);
void LED_Init_1(void); 
void Push_button (void);
#define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))
#define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))
#define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))
#define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA          0x01000000
struct __FILE { int handle;  };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f) {
  if (DEMCR & TRCENA) {
    while (ITM_Port32(0) == 0);
    ITM_Port8(0) = ch;
  }
  return(ch);
}
int main (void) {

  LED_Init_1();
    Push_button ();

  while(1) 
        {  

if((GPIOD->IDR &= ~  (1UL <<   9))==1)
{
GPIOD->ODR |= (1UL <<   12);    

}    
    else if((GPIOD->IDR &= ~  (1UL <<   9))==0)
    {   

            GPIOD->ODR &= ~(1UL <<   12);                           


    }

}

}
void LED_Init_1 (void) {
  RCC->AHB1ENR    |= ((1UL <<  3) );            
  GPIOD->MODER    &= ~((3UL << 2*12));              
  GPIOD->MODER    |=  ((1UL << 2*12)  ); 
  GPIOD->OTYPER   &= ~((1UL <<   12) );             
  GPIOD->OSPEEDR  &= ~((3UL << 2*12) );         
  GPIOD->OSPEEDR  |=  ((2UL << 2*12) ); 
  GPIOD->PUPDR    &= ~((3UL << 2*12) );             
  GPIOD->PUPDR    |=  ((1UL << 2*12) ); 
}
void Push_button (void) {
    RCC->AHB1ENR      |= ((1UL <<  3) );            
  GPIOD->MODER    &= ~((3UL << 9));             
}
void Soft_Delay(void) {

    uint32_t i=10000000;  
    while(i>0)  
    {
        i--;  
    }
}

谢谢

查看似乎正在检查输入的这一行(两个相似行之一):

if((GPIOD->IDR &= ~  (1UL <<   9))==1)

首先我质疑你为什么用 &=

写回端口值

其次,为什么位 9 上的输入等于 1

第三,针对相反状态的 else 测试(显然)是多余的 - 一个简单的 else 就可以了。我没有你的系统或工具,所以我猜这个代码。

if((GPIOD->IDR & (1UL << 9)) != 0)
    GPIOD->ODR |= (1UL << 12);    
else
    GPIOD->ODR &= ~(1UL << 12);