新建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等 早先經典處理器...