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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...