我尝试使用面包板上的外部开关来控制板上的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--;
}
}
由于
答案 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);