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