安富莱LED初始化讲解 |
您所在的位置:网站首页 › gpio口的定义 › 安富莱LED初始化讲解 |
1. 本文背景
在阅读安富莱STM32的代码时,看到一句话:由于将GPIO设置为输出时,GPIO输出寄存器的值缺省是0,因此会驱动LED点亮。这句话有点费解,本文将提出作者的见解。 在硬件电路上,LED一端接VDD,一端接GPIO,如下图所示。当PF11、PF7、PF8、PF9这4个引脚输出低电平时,LED将点亮,当PF11、PF7、PF8、PF9这4个引脚输出高电平时,LED将熄灭。 可以看到,在初始化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输出寄存器的值缺省是0。 这句话的意思是GPIO输出寄存器的复位值全是0,因此才会将LED点亮。 所以安富莱的代码才会在GPIO初始化函数前,将输出数据寄存器设置为高电平,熄灭LED,再初始化。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |