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協助我們控制GPIOMakefile
: 呼叫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;
}
寫成此程式主要需參考:
此程式所做的依序是:
-
令RCC(Reset & Clock Control)開啟GPIOA的Clock。 RCC是STM32 MCU中控制週邊功能開關以及時脈的模組。(參考STM32F103xx Reference Manual 第7章)
rcc_periph_clock_enable(RCC_GPIOA);
-
設定GPIO PA5的模式為Push-pull輸出,最高速度2MHz。(參考STM32F103xx Reference Manual p.170)
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO5);
-
用一無線迴圈以定時間間隔輸出高低電位,閃爍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閃爍。可以嘗試調整閃爍頻率,確認變化如預期。