STM32F4 GPIO 呼吸灯【库函数操作】

时间:2022-05-10 17:52:08

GPIO的一些特性,翻译自ST的参考手册

1、16组IO可用

2、推挽/开漏+上拉/下拉

3、可从ODR输出数据,也可从外设输出数据

4、每个IO速度可独立设置

5、浮空输入,上下拉输入,模拟输入

6、输入数据到IDR或者外设

7、ODR中数据可通过GPIOx_BSRR单独设置某一位。

8、IO锁定装置,可冻结IO配置。(知道下次reset)

9、模拟公呢

10、复用输入输出选择及存取

11、IO快速反转,两个时钟周期可反转一次。

12、易配置的复用功能,可使一个IO有多个功能。

本实验值用到了数字输出,控制IO反转时间以形成一组PWM波形驱动接在IO口上的LED。

【代码实现】

LED的定义:

typedef enum
{
  LED1 = 0,
  LED2 = 1,
  LED3 = 2,
  LED4 = 3
} Led_Def;

static GPIO_TypeDef* LED_PORT[4]={GPIOD, GPIOD, GPIOD, GPIOD};
static const u16 LED_PIN[4]={GPIO_Pin_12, GPIO_Pin_13, GPIO_Pin_14,GPIO_Pin_15};

LED的初始化函数

void LED_Init(void)
{
      GPIO_InitTypeDef  GPIO_InitStructure;

      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 |GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
      GPIO_Init(GPIOD, &GPIO_InitStructure);
}

void LEDOn(Led_Def Led)//LED亮
{
      LED_PORT[Led]->BSRRL=LED_PIN[Led];
}

void LEDOff(Led_Def Led)//LED灭
{
      LED_PORT[Led]->BSRRH=LED_PIN[Led]; 
}

void LEDTog(Led_Def Led)//LED状态翻转
{
      LED_PORT[Led]->ODR^=LED_PIN[Led];
}

初始化完成后,在主函数中控制LED的通断。当PWM占空比大于一个值时候,LED亮度变化不明显,所以调整PWM的变化率使得整个过程中亮度变化均匀。当占空比太小时,LED完全没亮度,我将这段占空比取消掉了,主函数的实现如下:

没有用while(1)这个循环,照样是无休止的反复亮灭。

for(i = 100;(i<2000)&(i>=0);i=i+j)
{
  LEDOn(LED2);
  delay_us(i);
  LEDOff(LED2);
  delay_us(2000-i);
  if( i == 1990)
    j =-5;
  if(i == 10)
    j = 1;
  if(i>=1000)
    j = 5;
  if((j == 5)&(i <= 1000))
    j = -1;
}

 

 

Technorati 标记: STM32F4, GPIO, LED, 呼吸灯