Как сделать внешний переключатель управления светодиодной платой stm32f4?

Я пытался управлять светодиодом на плате с помощью внешнего переключателя на макетной плате, но это не так? Переключатель подключен к порту d номер 9, я пытался сделать так, чтобы при нажатии на переключатель загорался зеленый светодиод. Но по какой-то странной причине он не работает, я пытался с ним повозиться, но безуспешно. Как исправить, чтобы работало?

Вот мой код:

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

Спасибо


person suronix    schedule 17.11.2015    source источник
comment
Во-первых, убедитесь, что зеленый светодиод работает без выключателя. Заставьте его мигать, переключая его в цикле с задержками.   -  person Weather Vane    schedule 17.11.2015
comment
Зеленый светодиод работает, я делал это без переключателя, теперь я включаю переключатель, но он не работает.   -  person suronix    schedule 17.11.2015


Ответы (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);                           
person Weather Vane    schedule 17.11.2015
comment
Спасибо большое что помогло :) - person suronix; 17.11.2015