1. 程式人生 > >STM32F4 GPIO 呼吸燈【庫函式操作】

STM32F4 GPIO 呼吸燈【庫函式操作】

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, 呼吸燈