求教!为什么直接向led灯相应的管脚写0不能关闭led灯?
#include"stm32f10x.h"
#include "stdio.h"
#define BitBand(addr,n) *(volatile unsigned long *)((addr & 0xf0000000)+0x2000000+(addr & 0xfffff)*32+n*2)
#define GPIOA_ODR_A (GPIOA_BASE+0x0c)
#define GPIOA_IDR_A (GPIOA_BASE+0x08)
#define GPIOB_ODR_A (GPIOB_BASE+0x0c)
#define GPIOB_IDR_A (GPIOB_BASE+0x08)
#define GPIOC_ODR_A (GPIOC_BASE+0x0c)
#define GPIOC_IDR_A (GPIOC_BASE+0x08)
#define GPIOD_ODR_A (GPIOD_BASE+0x0c)
#define GPIOD_IDR_A (GPIOD_BASE+0x08)
#define GPIOE_ODR_A (GPIOE_BASE+0x0c)
#define GPIOE_IDR_A (GPIOE_BASE+0x08)
#define PAout(n) BitBand(GPIOA_ODR_A,n)
#define PAin(n) BitBand(GPIOA_IDR_A,n)
#define PBout(n) BitBand(GPIOB_ODR_A,n)
#define PBin(n) BitBand(GPIOB_IDR_A,n)
#define PCout(n) BitBand(GPIOC_ODR_A,n)
#define PCin(n) BitBand(GPIOC_IDR_A,n)
#define PDout(n) BitBand(GPIOD_ODR_A,n)
#define PDin(n) BitBand(GPIOD_IDR_A,n)
#define PEout(n) BitBand(GPIOE_ODR_A,n)
#define PEin(n) BitBand(GPIOE_IDR_A,n)
#define LED1 PDout(2)
#define LED2 PDout(3)
void RCC_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate =9600;
USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx |USART_Mode_Rx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength =USART_WordLength_8b;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
void delay(__IO uint32_t nCount)
{
for (; nCount != 0; nCount--);
}
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3; /////选中之后相应的LED灯就会亮了,不用写0就亮了
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();
LED_Init();
while(1)
{
LED1=0; /////////////因为是共电源,所以写0灯亮。
LED2=1; //但是写1,灯并不会灭
//但是,如果换成GPIO_SetBits(GPIOD,GPIO_Pin_2); 和 GPIO_ResetBits(GPIOD,GPIO_Pin_3);就能实现亮灭
delay(5000000);
LED1=1;
LED1=0;
delay(5000000);
}
}
出现以上情况是为什么啊?不应该写0led灯亮,写1led等灭吗?向管脚不管是写1还是写0都实现不了led灭。
原因找到了 卧槽 是位绑定公式写错了,
#define BitBand(addr,n) *(volatile unsigned long *)((addr & 0xf0000000)+0x2000000+(addr & 0xfffff)*32+n*2)
出现了的错误:n*2应改为n*4。之前写的是n<<2, 然后改成*的时候没有把2改成4,太粗心了
原因找到了 卧槽 是位绑定公式写错了,
#define BitBand(addr,n) *(volatile unsigned long *)((addr & 0xf0000000)+0x2000000+(addr & 0xfffff)*32+n*2)
出现了的错误:n*2应改为n*4。之前写的是n<<2, 然后改成*的时候没有把2改成4,太粗心了
曾学过这样一句话:粗心是数学家最大的天敌,这事我也干过,,,,,
嗯,一般多为程序问题。找到原因就好!
在错误中进步
引脚要设置成输出的。
看你灯的接法不同,写1才能关的。