STM32 #1 控制GPIO以閃爍LED - ntut-rf/mcu GitHub Wiki

在這個練習當中,我們要控制STM32F103 MCU,讓他從某一 GPIO 輸出高低變換的數位訊號,以使開發板上的LED閃爍。

GPIO是種可以藉由軟體控制 (software-controlled) 的數位訊號。常見於開發版邊緣, 以針腳 (Pin) 的形式呈現。這些針腳可已藉由電位高低的不同變化,向外界輸出訊號(output),或從外界輸入訊號(input)。詳細可以參見成大資工Wiki對於GPIO的介紹

NUCLEO-F103RB開發板有許多GPIO已針腳的形式接出來,可以和外界訊對接,但有部份GPIO是直接和板子上的元件連接在一起,如藍色按鈕以及綠色LED。

1. 了解NUCLEO-F103RB開發板上LED的電路連接配置

首先,注意到開發板上有一使用者可以控制的綠色LED,在MCU的右上方,標示為LD2

LD2是接到MCU的GPIO PA5的腳位,這可以從STM32 Nucleo-64 boards User manual (UM1724)得知。在文件的第23頁寫著:

User LD2: the green LED is a user LED connected to Arduino signal D13 corresponding to STM32 I/O PA5 (pin 21) or PB13 (pin 34) depending on the STM32 target. Refer to Table 11 to Table 23 when:

  • the I/O is HIGH value, the LED is on
  • the I/O is LOW, the LED is off

又從P.39 Table 12.可得知對於NUCLEO-F103RB開發板,D13訊號實際是接到PA5,即LD2是接到PA5,因此可知要控制LD2開關,需要控制PA5的電位高低。

2. 撰寫程式

我們會利用libopencm3這套程式庫來協助我們。除了libopencm3,我們還需要兩個檔案:

  • blink.c: 主程式的C原始碼,裡面呼叫libopencm3提供的function協助我們控制GPIO
  • Makefile: 呼叫GNU Make配合libopencm3,編譯原始碼成為可以執行的檔案,以上傳到MCU上執行

建立這兩個檔案,並放在同個資料夾底下,此資料夾與libopencm3又處於同路徑,如:

  • libopencm3
  • 01-blink
    • blink.c
    • Makefile

其檔案內容如下:

blink.c

#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>

int main (void)
{
    /* Enable GPIOA clock. */
    rcc_periph_clock_enable(RCC_GPIOA);

    gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO5);

    while (1)
    {
        gpio_toggle(GPIOA, GPIO5);	  /* LED on/off */

        for (int i = 0; i < 800000; i++)  /* Wait a bit. */
            __asm__("nop");
    }

    return 0;
}

寫成此程式主要需參考:

此程式所做的依序是:

  1. 令RCC(Reset & Clock Control)開啟GPIOA的Clock。 RCC是STM32 MCU中控制週邊功能開關以及時脈的模組。(參考STM32F103xx Reference Manual 第7章)

    rcc_periph_clock_enable(RCC_GPIOA);
    
  2. 設定GPIO PA5的模式為Push-pull輸出,最高速度2MHz。(參考STM32F103xx Reference Manual p.170)

    gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO5);
    
  3. 用一無線迴圈以定時間間隔輸出高低電位,閃爍LED。

Makefile

BINARY		:= blink
DEVICE 		:= STM32F103C4T6
OPENOCD_FILE 	:= board/st_nucleo_f103rb.cfg
OPENCM3_DIR 	:= ../libopencm3
OBJS	        += build/blink.o
include ../libopencm3.mk

Makefile設定我們的程式名稱,程式目標檔案,和目標的開發板型號,並引入libopencm3的Makefile自動化程式的編譯。

3. 讓LED閃爍吧!

在Makefile路徑處開啟命令列,並執行

$ make

以編譯程式,

$ make flash

就可以上傳程式到MCU。如程式正確執行,就可以看到開發板上的綠色的LED閃爍。可以嘗試調整閃爍頻率,確認變化如預期。