求教!为什么直接向led灯相应的管脚写0不能关闭led灯?

2019-07-14 19:39发布

使用的是STM32F107vc芯片。LED灯共接3.3V的电源。程序如下:
#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灭。。。。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
Mr_RMS
1楼-- · 2019-07-15 03:46
原因找到了 卧槽 是位绑定公式写错了,
#define BitBand(addr,n) *(volatile unsigned long *)((addr & 0xf0000000)+0x2000000+(addr & 0xfffff)*32+n*2)
出现了的错误:n*2应改为n*4。。。。。之前写的是n<<2, 然后改成*的时候没有把2改成4,太粗心了
青龙书生
2楼-- · 2019-07-15 04:42
曾学过这样一句话:粗心是数学家最大的天敌,这事我也干过,,,,,
houjue
3楼-- · 2019-07-15 07:51
Mr_RMS 发表于 2017-4-18 19:44
原因找到了 卧槽 是位绑定公式写错了,
#define BitBand(addr,n) *(volatile unsigned long *)((addr & 0xf0000000)+0x2000000+(addr & 0xfffff)*32+n*2)
出现了的错误:n*2应改为n*4。。。。。之前写的是n

嗯,一般多为程序问题。找到原因就好!
zhj1163979310
4楼-- · 2019-07-15 12:42
在错误中进步                     
妳丶镜月之诺
5楼-- · 2019-07-15 13:05
 精彩回答 2  元偷偷看……
jijuxie
6楼-- · 2019-07-15 13:08
引脚要设置成输出的。

一周热门 更多>