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

时间:2015-11-17 18:10:08

标签: c embedded microcontroller electronics stm32f4discovery

我尝试使用面包板上的外部开关来控制板上的LED,但事实并非如此?开关连接到端口d号9,我试图这样做,这样一旦按下开关,绿色LED亮起。但由于一些奇怪的原因,它不起作用,我试图摆弄它,但没有运气。我怎么能解决这个问题呢?

这是我的代码:

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

由于

1 个答案:

答案 0 :(得分:1)

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

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);