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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM