安富莱LED初始化讲解

您所在的位置:网站首页 gpio口的定义 安富莱LED初始化讲解

安富莱LED初始化讲解

2023-05-18 03:30| 来源: 网络整理| 查看: 265

1. 本文背景

在阅读安富莱STM32的代码时,看到一句话:由于将GPIO设置为输出时,GPIO输出寄存器的值缺省是0,因此会驱动LED点亮。这句话有点费解,本文将提出作者的见解。

在硬件电路上,LED一端接VDD,一端接GPIO,如下图所示。当PF11、PF7、PF8、PF9这4个引脚输出低电平时,LED将点亮,当PF11、PF7、PF8、PF9这4个引脚输出高电平时,LED将熄灭。 LED LED的初始化代码如下:

void bsp_InitLed(void) { GPIO_InitTypeDef GPIO_InitStructure; /* 打开GPIO时钟 */ RCC_APB2PeriphClockCmd(RCC_ALL_LED, ENABLE); /* 配置所有的LED指示灯GPIO为推挽输出模式 由于将GPIO设置为输出时,GPIO输出寄存器的值缺省是0,因此会驱动LED点亮. 这是我不希望的,因此在改变GPIO为输出前,先关闭LED指示灯 */ bsp_LedOff(1); bsp_LedOff(2); bsp_LedOff(3); bsp_LedOff(4); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* 推挽输出模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED1; GPIO_Init(GPIO_PORT_LED1, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED2; GPIO_Init(GPIO_PORT_LED2, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED3; GPIO_Init(GPIO_PORT_LED3, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED4; GPIO_Init(GPIO_PORT_LED4, &GPIO_InitStructure); }

可以看到,在初始化GPIO前,先调用了bsp_LedOff()函数,该函数的作用是将LED熄灭。 下面是正点原子的LED初始化代码:

void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5 GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽输出 GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高 }

对比而言,发现并没有调用熄灭LED的函数。

2. 原因解答

先调用了bsp_LedOff()函数的作用是:由于将GPIO设置为输出时,GPIO输出寄存器的值缺省是0,因此会驱动LED点亮。这是我不希望的,因此在改变GPIO为输出前,先关闭LED指示灯 下面具体来讲解这句话。 在STM32上电后,会调用初始化函数。所以STM32复位后,GPIO的输出电平是多少呢?GPIO的输出由对应的寄存器控制,下图是控制GPIO的输出寄存器: GPIO_ODR 由上图可以看到,在ODR寄存器复位后,复位值为0x0000 0000,配合下面的寄存器说明可以看到,复位后GPIO输出了低电平,也就会点亮LED了。

GPIO输出寄存器的值缺省是0。 这句话的意思是GPIO输出寄存器的复位值全是0,因此才会将LED点亮。

所以安富莱的代码才会在GPIO初始化函数前,将输出数据寄存器设置为高电平,熄灭LED,再初始化。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3