stm32專題一 GPIO輸出 點亮LED

2021-09-25 15:19:25 字數 2991 閱讀 5945

新建led資料夾和bsp_led.c和bsp_led.h的板級支援包。

在bsp_led.c中,函式led_gpio_config(void)提供了gpio的初始化過程:

定義gpio初始化結構體;

開啟rcc時鐘,這一步非常重要,要找到對應的匯流排和外設時鐘;

給初始化結構體成員賦值,由於和硬體相關,都在bsp_led.h中定義成巨集,提高可移植性。

bsp_led.c

// bsp: board support package 板級支援包

#include "bsp_led.h"

void led_gpio_config(void)

在bsp_led.h中,大量使用了巨集定義,來封裝硬體相關的函式

bsp_led.h

#ifndef __bsp_led_h

#define __bsp_led_h

#include "stm32f10x.h"

// 硬體封裝巨集

#define led_r_gpio_pin gpio_pin_5

#define led_r_gpio_port gpiob

#define led_r_gpio_clk rcc_apb2periph_gpiob

#define led_g_gpio_pin gpio_pin_0

#define led_g_gpio_port gpiob

#define led_g_gpio_clk rcc_apb2periph_gpiob

#define led_b_gpio_pin gpio_pin_1

#define led_b_gpio_port gpiob

#define led_b_gpio_clk rcc_apb2periph_gpiob

// 直接操作暫存器的方法控制io

#define digitalhi(port, pin) do while (0) // 置位

#define digitallo(port, pin) do while (0) // 復位

#define digitaltoggle(port, pin) do while (0) // 反轉

// 定義控制io的巨集

#define led_r_toggle digitaltoggle(led_r_gpio_port, led_r_gpio_pin)

#define led_r_on digitallo(led_r_gpio_port, led_r_gpio_pin)

#define led_r_off digitalhi(led_r_gpio_port, led_r_gpio_pin)

#define led_g_toggle digitaltoggle(led_g_gpio_port, led_g_gpio_pin)

#define led_g_on digitallo(led_g_gpio_port, led_g_gpio_pin)

#define led_g_off digitalhi(led_g_gpio_port, led_g_gpio_pin)

#define led_b_toggle digitaltoggle(led_b_gpio_port, led_b_gpio_pin)

#define led_b_on digitallo(led_b_gpio_port, led_b_gpio_pin)

#define led_b_off digitalhi(led_b_gpio_port, led_b_gpio_pin)

// 顏色設定

#define led_red do while (0)

#define led_green do while (0)

#define led_blue do while (0)

#define led_yellow do while (0)

#define led_purple do while (0)

#define led_cyan do while (0)

#define led_all_on do while (0)

#define led_all_off do while (0)

void led_gpio_config(void);

#endif /* __bsp_led_h */

然後在主函式中進行呼叫

main.c

#include "stm32f10x.h"

#include "bsp_led.h"

void delay(uint32_t count);

int main(void)

}void delay(uint32_t count)

gpio具有鎖定機制,可以凍結該gpio的配置,即在下次復位前,不能更改gpio的配置。

鎖定操作的暫存器為gpiox_lckr,具體描述如下

上面的說明起始我感覺挺難理解的,於是找到了標準庫裡面的原始碼,發現寫的非常清晰,具體如下

void gpio_pinlockconfig(gpio_typedef* gpiox, uint16_t gpio_pin)

tmp為lcck位置1,然後把gpio_pin的相應值也置1。接下來就是對相應的位執行寫入序列操作。

首先是寫1,即寫入帶lcck和gpio_pin的位;

然後寫0,寫只帶gpio_pin的位;

然後重複寫1;

接下來讀gpiox_lckr的值到tmp,連續讀取兩次,完成操作。

STM32之GPIO輸入輸出

gpio的輸出 背景 應用在點亮led。led串聯電阻再上拉,另一端與gpio口相連。因此,gpio輸出高電平則led滅,輸出低電平則led亮。第一步工作是初始化gpio,使能外設時鐘,因為gpio是掛載在apb2中線上的。然後對gpio inittypedef結構體進行初始化,設定gpio pin...

stm32專題二 GPIO輸入 按鍵檢測

新建板級支援包bsp key.c和bsp key.h gpio輸入配置過程 定義初始化結構體 開啟rcc時鐘,非常重要 寫入引腳和模式配置,不需要配置速度 呼叫初始化函式,將初始化結構體寫入對應的gpio埠。bsp key.c包含兩個函式,乙個是初始化函式,另乙個是按鍵掃瞄函式,會按鍵被按下時,返回...

STM32專題講解

要學習stm32必須要了解一些arm的基礎知識 arm advanced risc machines 有三種含義 它是乙個公司的名稱 它是一類微處理器的通稱 它是一種技術的名稱。arm公司其實是乙個智財權 商,它既不生產晶元也不 晶元,而是轉讓設計方案給半導體的廠商,比如三星,ti等 早先經典處理器...