Как сделать внешний переключатель управления светодиодной платой 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--;
}
}
Спасибо
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);