stm32實現LED燈的閃爍

   stm32單片機設計比較複雜,因此,對於外設的控制就相對於51單片機來講,就複雜不少。那麼如何用stm32單片機點亮LED呢?經過一下幾個步驟,就能夠實現LED的閃爍。這裏使用的stm32型號是stm32f03ZET6。ide

   首先,咱們要對LED作一個基本的硬件瞭解。LED,中文名稱,發光二極管。它是一種發光器件。LED一般狀況下只有兩個引腳,一個正極,一個負極。當給正極一個高電平,負極一個低電平時,LED發光二極管能夠點亮。當給正極一個低電平時,LED熄滅。函數

wKiom1nRIbmArJTAAABQZBLCbUs865.jpg

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

wKiom1nRor2xnJQGAAD2VJOVRn0735.png

   其次,根據原理圖咱們能夠發現,在開發板內部,已經將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的庫操做爲咱們操做外設提供了很大的便利。
blog

   既然是經過庫來操做這些GPIO,那麼咱們就得對庫函數有所瞭解。在3.5的庫中,有一個初始化的函數GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct ),能夠經過這個函數對GPIO進行初始化。咱們能夠看到,在這個函數中,有一個形參類型是GPIO_InitTypeDef,這個類型事實上是一個結構體類型,這個類型的原型就是:
ip

typedef struct{

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

經過這個結構體原型咱們能夠看出,GPIO_InitTypeDefy這個結構體有三個參數開發

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

GPIO_Speed;   用來設置IO的速率。原型

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

咱們控制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();
    }

}
相關文章
相關標籤/搜索