STM32F1-GPIO的操作

来源:http://www.cnblogs.com/robohou/archive/2016/09/22/5898046.html
-Advertisement-
Play Games

GPIO 即通用輸入輸出口。凡事都要熟悉,熟能生巧。一定要掌握MDK軟體的工程操作方法。 對於GPIO的操作。 Project裡面要有以下幾個文件夾(開發之前需要包含相應的庫文件,這裡預設已經包含) STEP BY STEP(以按鍵和LED燈為例): 1.在USER文件夾里新建對應功能的C文件和H文 ...


GPIO 即通用輸入輸出口。凡事都要熟悉,熟能生巧。一定要掌握MDK軟體的工程操作方法。

對於GPIO的操作。

Project裡面要有以下幾個文件夾(開發之前需要包含相應的庫文件,這裡預設已經包含)

STEP BY STEP(以按鍵和LED燈為例):

1.在USER文件夾里新建對應功能的C文件和H文件(這裡對應 Key.c  Key.h  LED.c   LED.h)其中C文件用來進行對應外設的硬體配置,H文件是申明對應C文件裡面定義的配置函數。註意H文件開頭要檢查以下時候需要檢查以下重覆定義的情況, 如下:

#ifndef __EXTI_H
#define __EXTI_H

2.下麵重點總結下功能C文件裡面對應外設的硬體配置過程。

STEP1建立數據結構,配置工作時鐘

 STM32這種單片機和51單片機的很大不同就是,對應不同功能的硬體有相應的工作時鐘與其對應。這個時鐘是必不可少的,就像人的心臟一樣。

 

先建立數據結構GPIO_InitTypeDef GPIO_InitStructure;

然後配置時鐘,RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);

可能每次你都不清楚,為什麼硬體配置要那麼來,從庫開發的角度來說,要學會去看庫的幫助文件,打開之後找到Data Structure這一塊,找到對應的GPIO的數據結構。

而庫開發不同關於寄存器開發的地方是,庫是間接的用數據結構去填充寄存器。所以首先得要有這個對應的數據結構,也就是這裡的 GPIO_InitStructure;

打開幫助中GPIO_InitTypeDef 這個結構體,裡面的變數結構就可以看出來,分別是:管腳(pin),速度(speed),工作模式(Mode)

00091 typedef struct
00092 {
00093   uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
00094                                       This parameter can be any value of @ref GPIO_pins_define */
00095 
00096   GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
00097                                       This parameter can be a value of @ref GPIOSpeed_TypeDef */
00098 
00099   GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
00100                                       This parameter can be a value of @ref GPIOMode_TypeDef */
00101 }GPIO_InitTypeDef;

然後依照每個變數的值的情況進行賦值如:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;其實在GPIO_InitStructure結構體中的變數都是枚舉型的,也就是說它的值都是一定的,是個常數。

void GPIO_Init ( GPIO_TypeDef GPIOx,
    GPIO_InitTypeDef GPIO_InitStruct 
  )

 

2.初始化寄存器(數據結構映射到寄存器中)


到這裡還沒有好,這一步僅僅是把你申明的一個結構體變數的每個部分確定了,還沒有映射到寄存器中去,那麼怎麼映射到寄存器中去呢?庫開發早就已經設計了一個映射的功能函數在幫助裡面可以看到,這個函數的用法如:GPIO_Init(GPIOC, &GPIO_InitStructure);
#include "bsp_led.h"   

 /**
  * @brief  初始化控制LED的IO
  * @param  無
  * @retval 無
  */
void LED_GPIO_Config(void)
{        
        /*定義一個GPIO_InitTypeDef類型的結構體*/
        GPIO_InitTypeDef GPIO_InitStructure;

        /*開啟LED的外設時鐘*/
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); 

        /*選擇要控制的GPIOB引腳*/                                                               
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;    

        /*設置引腳模式為通用推輓輸出*/
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

        /*設置引腳速率為50MHz */   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

        /*調用庫函數,初始化GPIOB0*/
        GPIO_Init(GPIOB, &GPIO_InitStructure);    
        
        /*選擇要控制的引腳*/                                                               
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
      
        /*調用庫函數,初始化GPIOC*/
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        /* 關閉所有led燈    */
        GPIO_SetBits(GPIOB, GPIO_Pin_0);
        
        /* 關閉所有led燈    */
        GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3);     
}
View Code



LED頭文件內容
***********************************
#ifndef __LED_H
#define    __LED_H

#include "stm32f10x.h"

void LED_GPIO_Config(void);

#endif /* __LED_H */
View Code

 結論:

GPIO的設置分為四步

1.申明結構體     GPIO_InitTypeDef  GPIO_InitStructure;

2.設置時鐘        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);

3.結構體賦值     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

                       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

4.初始化寄存器  GPIO_Init(GPIOC, &GPIO_InitStructure);

設置多個GPIO的時候,如果Mode和Speed都是一樣的,就只可以設置一次就行。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • varchar(n) 長度為 n 個位元組的可變長度且非 Unicode 的字元數據。n 必須是一個介於 1 和 8,000 之間的數值。存儲大小為輸入數據的位元組的實際長度,而不是 n 個位元組。 nvarchar(n) 包含 n 個字元的可變長度 Unicode 字元數據。n 的值必須介於 1 與 4 ...
  • 字元串函數: 時間日期函數: SELECT @@DATEFIRST AS '1st Day', DATEPART(dw, GETDATE()) AS 'Today' SELECT GETDATE() 數據轉換、函數轉換: 練習:查看名字,生日 ...
  • 認識資料庫備份和事務日誌備份 資料庫備份與日誌備份是資料庫維護的日常工作,備份的目的是在於當資料庫出現故障或者遭到破壞時可以根據備份的資料庫及事務日誌文件還原到最近的時間點將損失降到最低點。 資料庫備份 資料庫備份可以手動備份和語句備份 一.手動備份資料庫 1.滑鼠右鍵選擇你要進行備份的資料庫-任務 ...
  • 存儲過程: 因為語句被編譯過,所以特別適合用來執行,查詢、存儲等常用指令,比如文章發佈、文章刪除、會員註冊、會員登錄等常用query我們都可以建立存儲過程。 視圖: 通過視圖,我們可以很方便把幾個表查詢的結果串在一個虛擬表,方便我們查詢,而不需要每次都寫多表查詢的語句。與此同時,虛擬表的字我們都可以 ...
  • 數據類型: --類似於C#中的數據類型 Datetime 範圍是:1753.1.1—— 9999.12.31 Smalldatetime 1900.1.1 ——2079.6.6 操作: 1.查找資料庫的主文件和日誌文件所在位置: 右擊資料庫,點擊屬性,會出現下圖: 可以看出,此資料庫擁有一個主文件( ...
  • 資料庫: 結構化查詢語言(Structured Query Language)簡稱SQL; 資料庫管理系統(Database Management System)簡稱DBMS; 資料庫管理員(Database Administration)簡稱DBA,功能是確保DBMS的正常高效運行; 資料庫分體驗 ...
  • 圖解安裝 PostgreSQL 【博主】反骨仔 【原文地址】http://www.cnblogs.com/liqingwen/p/5894462.html 序 園友的一篇《Asp.Net Core 項目實戰之許可權管理系統(3) 通過EntityFramework Core使用PostgreSQL》需 ...
  • 之前是Windows 10版本1607版本14393.102升級14393.187過後,突然出現不能撥公司防火牆的L2TPVPN了。 網上眾說紛紜,原來遇到這個問題的人真不少,不過我是第一次遇到。結合網上一些分析過後,我電腦的解決方式是: 錯誤描述:當連接VPN是回傳錯誤為“ L2TP連接嘗試失敗, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...