1. 程式人生 > >stm32實現LED燈的閃爍

stm32實現LED燈的閃爍

stm32 標準庫 led燈閃爍

stm32單片機設計比較復雜,所以,對於外設的控制就相對於51單片機來說,就復雜很多。那麽如何用stm32單片機點亮LED呢?通過一下幾個步驟,就可以實現LED的閃爍。這裏使用的stm32型號是stm32f03ZET6。

首先,我們要對LED做一個基本的硬件了解。LED,中文名稱,發光二極管。它是一種發光器件。LED通常情況下只有兩個引腳,一個正極,一個負極。當給正極一個高電平,負極一個低電平時,LED發光二極管可以點亮。當給正極一個低電平時,LED熄滅。

技術分享

LED燈有可能共陽接電源,也有可能共陰接電源,具體情況要根據原理圖來確定。這裏,采用的是LED共陽接電源,也就是說,8個LED的負極通過IO端口引出來。然後通過,IO端口輸入高低電平來給LED供電,以此來控制LED的亮滅。也就是說,操控LED的關鍵就在於操控stm32的端口。那麽,我們接下來就要根據原理圖來接線了。

技術分享

其次,根據原理圖我們可以發現,在開發板內部,已經將LED引出來的引腳結了端口C的PC0~PC7。所以我們的任務就是要能夠操控端口PC0~PC7。在操控端口之前,我們得對端口做個了解。

然後,我們要對IO端口進行了解。要學會如何操控stm32的IO端口。關於stm32,一個端口有16個引腳。比如端口A,有16個引腳,其中PA0~PA7為低8位,PA8~PA15為高8位。每一個IO口都可以通過軟件自由配置成輸入模式和輸出模式。輸入模式有四種:輸入浮空、輸入上拉、輸入下拉、模擬輸入。輸出模式也有四種:開漏輸出、推挽輸出、推挽式復用輸出、開漏復用輸出。stm32單片機的每個IO端口都有7個寄存器來控制。註意:IO口和IO端口是不一樣的。在stm32中,一個IO端口是由16個IO口組成。那麽,能夠操控IO端口的寄存器分別是:配置模式的2個32位的端口配置寄存器CRL和CRH;2個32位數據寄存器IDR和ODR;1個32位的置位/復位寄存器BSRR;1個16位的復位寄存器BRR;1個32位的鎖存寄存器LCKR。舉個例子,我們來看一下配置端口寄存器。該寄存器的復位值為0x44444444,很重要的一點就是,復位值其實就是配置端口為浮空輸入模式。因為PC0~PC7是端口的低四位,所以,我們只要對配置端口寄存器的CRL做個配置就可以了,至於高八位,因為我們並不使用,所以可以不用管它。通過查看數據手冊我們可以知道,在CRL中,一個IO口占四位,分別是CNF【1:0】,MODE【1:0】。MODE控制端口是輸入模式還是輸出模式,而CNF配置端口為具體的哪一種輸入模式或者輸出模式(因為不管是輸入模式還是輸出模式都有四種模式)。對於幾種常見的配置,我們還可以記住它。比如:0x00,表示模擬輸入模式(ADC用);0x03表示推挽輸出模式,50MHz速率;0x08表示上/下拉輸入模式;0x0B,表示復用輸出。而CRH和CRL的配置和功能完全一樣,具體信息可以參考數據手冊。在輸出模式中,有開漏輸出和推挽輸出,那麽這兩種輸出模式有什麽區別呢?推挽輸出:可以輸出高低電平,連接數字器件;開漏輸出:相當於三極管的集電極,想要得到高電平,需要上拉電阻,其吸收電流能力較強,適合做電流型驅動。所以,控制LED燈,我們一般采用推挽輸出模式。至於詳細的關於這些寄存器的用法,可以通過《stm32中文參考手冊》去做一個詳細的了解。我們現在已經對IO端口有了一個基本的了解了,接下來,就可以開始了解,stm32的庫了,因為,stm32的庫操作為我們操作外設提供了很大的便利。

既然是通過庫來操作這些GPIO,那麽我們就得對庫函數有所了解。在3.5的庫中,有一個初始化的函數GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct ),可以通過這個函數對GPIO進行初始化。我們可以看到,在這個函數中,有一個形參類型是GPIO_InitTypeDef,這個類型事實上是一個結構體類型,這個類型的原型就是:

typedef struct{

    uint16_t GPIO_Pin;
    GPIOSpeed_TypeDef GPIO_Speed;
    GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;

通過這個結構體原型我們可以看出,GPIO_InitTypeDefy這個結構體有三個參數

GPIO_Pin; 用來設置要選擇的Pin口。

GPIO_Speed; 用來設置IO的速率。

GPIO_Mode; 用來選擇要設置的IO模式。

我們控制LED,對LED進行初始化,起始就是對GPIO進行初始化。代碼如下:

void LED_Init (){

    GPIO_InitTypeDef GPIO_InitStructure;
    
    SystemInit();    //系統時鐘初始化
    RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOC, ENALBE );
    
    //配置GPIO的模式和IO口
    GPIO_InitStructure.GPIO_Pin = LED;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //設置推挽輸出模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //設置IO速率
    GPIO_Init ( GPIOC, &GPIO_InitStructure );          //GPIO初始化
    
}

當有了這個LED初始化函數之後,我們只要在寫一個閃爍函數就行了。所謂閃爍,其實就是LED亮一段時間,LED滅一段時間,這個步驟不斷重復。LED亮其實就是給二極管陰極一個低電平,LED滅其實就是給二極管陰極一個高電平。那麽,代碼如下:

void led_display(){

    GPIO_SetBits ( GPIOC, LED );
    delay ( 6000000 );    //約為1s
    GPIO_ResetBits ( GPIOC, LED );
    delay ( 6000000 );    //約為1s
}

最後,我們只要有一個主函數,就可以運行了。代碼如下:

#include "stm32f01x.h"
#include "led.h"

int main()
{
    LED_Init();
    
    while ( 1 ){
    
        led_display();
    }

}


本文出自 “梵高說我腦子有病” 博客,請務必保留此出處http://chen0547.blog.51cto.com/12489941/1970173

stm32實現LED燈的閃爍