立創·天空星開發板-GD32F407VE-GPIO

本文以 立創·天空星開發板-GD32F407VET6-青春版 作為學習的板子,記錄學習筆記。

立創·天空星開發板-GD32F407VE-GPIO

    • 基礎概念
      • 三極管
      • MOS管
    • GPIO輸出模式
    • 輸出線與
    • GPIO輸入模式
    • GPIO點燈

基礎概念

  • GPIO,全稱為“通用輸入/輸出”(General Purpose Input/Output),是計算機系統中用于與外部世界進行數字通信的一種接口標準。
  • 它允許硬件和軟件通過電信號來交換數據,控制外部設備或接收外部事件。
  • GPIO通常用于連接各種外設,如按鈕、LED燈、傳感器、馬達、繼電器等,以便與計算機系統進行交互。GD32 支持的 GPIO 模式有如下八種:
模式性質
浮空輸入數字輸入
上拉輸入數字輸入
下拉輸入數字輸入
模擬輸入模擬輸入
開漏輸出數字輸出
推挽輸出數字輸出
復用開漏輸出數字輸出
復用推挽輸出數字輸出

三極管

總是記混 NPN 和 PNP 這兩種型號的三極管,如下圖所示:

三極管原理圖對比
特性描述:

  1. 電流關系: I E = I B + I C I_E = I_B + I_C IE?=IB?+IC?
  2. 導通條件: NPN型的基極比發射極電壓高0.7v,PNP型的基極比發射極電壓低0.7v
  3. 設計原理圖: 無論是 NPN 還是 NPN 型的三極管,耗電元器件都需要接在集電極

助記小技巧:

  1. 電路圖中,箭頭永遠指向的 N 極,根據箭頭可快速確認是 NPN 還是 PNP
  2. 電路圖中,箭頭對應的極比箭尾對應的極的電壓要低

思維導圖:

三極管思維導圖

MOS管

MOS管有 NMOS 和 PMOS 兩種類型。MOS管包含了三個極:

  • 柵極(G),對應英文單詞:Gate
  • 漏極(D),對應英文單詞:Drain
  • 源極(S),對應英文單詞:Source

MOS管的作用就是開關,通過柵極控制漏極和源極的導通。主要關注兩個點:

  1. 控制:負責MOS管導通和截止,高電平導通還是低電平導通。
  2. 流向:是從漏極流向源極,還是從源極流向漏極。

MOS管和三級管主要區別:三極管導通有電流,而MOS管導通沒有電流(有點像繼電器)

一張圖搞懂 MOS 管,如下所示:
一張圖搞懂 MOS 管

如果 Input 為電平,PMOS 斷開,NMOS 導通,如果 GPIO_PIN_X 有上拉電阻,則電流可以順利從 NMOS 的漏極(D)流向源極(S)。
如果 Input 為電平,PMOS 導通,NMOS 斷開,如果 GPIO_PIN_X 有下拉電阻,則電流可以順利從 PMOS 的源極(S)流向漏極(D)。

特點描述:

  • PMOS 的柵極(G)低通高斷,導通時,電流方向是源極(S)流向漏極(D)
  • PMOS 可以類比 PNP 類型的三極管
  • NMOS 的柵極(G)高通低斷,導通時,電流方向是漏極(D)流向源極(S)
  • NMOS 可以類比 NPN 類型的三極管

思維導圖:

MOS管思維導圖

GPIO輸出模式

  1. 推挽輸出
  • 【推】寄存器控制輸出高電平時,過非門后變低電平,PMOS導通,外部引腳為高,電流流出

輸出高電平

  • 【挽】寄存器控制輸出低電平時,過非門后變高電平,NMOS導通,外部引腳為低,電流流入
    輸出低電平
  1. 開漏輸出
  • 寄存器控制輸出低電平時,過非門后變高電平,NMOS導通,外部引腳為低,電流流入

輸出低電平

  • 寄存器控制輸出高電平時,因為PMOS未接入,所以外部引腳斷開。

無法輸出高電平

  1. 高阻態
  • 因為 PMOS和 NMOS 均未接入,無論寄存器輸出高或者低,外部引腳始終斷開。

高阻態

  1. 復用開漏輸出 和 復用推挽輸出
  • 不經過寄存器來輸出高低電平,也就是下圖中的 Alternate function output 部分

在這里插入圖片描述

輸出線與

  1. 推挽線與

推挽過程中,如果一方輸出高,一方輸出低,則會燒芯片。因此,推挽是不可以線與的。

推挽線與
2. 開漏線與

開漏過程中,無論雙方輸出高低電平,芯片都不會收到影響。I2C就是線與的一個實例。
開漏線與

GPIO輸入模式

  1. 浮空輸入
  • 就是將模擬信號、上拉、下拉全部斷開,只接收外部電路的輸入信號。如下圖紅色線條所示:
    浮空輸入
  1. 上拉輸入
  • 過上拉電阻后,經由斯密特觸發器,寫入寄存器。如下圖紅色線條所示:
  • 過斯密特后,也可做復用輸入,不寫入寄存器
    上拉輸入
  1. 下拉輸入
  • 過下拉電阻后,經由斯密特觸發器,寫入寄存器。如下圖紅色線條所示:
  • 過斯密特后,可做復用輸入,不寫入寄存器
    下拉輸入
  1. 模擬輸入
  • 不經過斯密特觸發器,直接讀入。如下圖紅色線條所示:

模擬輸入

GPIO點燈

我用 GPIO 封裝了一個可以動態點亮多個 LED 的拓展驅動,針對 PD 端口, 可以動態增加 LED 燈的引腳。只需要修改 LED_PINS 數組的元素即可。

  • ExtendedLED.h
#ifndef __EXTENDED_LED_H__
#define __EXTENDED_LED_H__#include "gd32f4xx.h"
#include "systick.h"#define LED_RCU  RCU_GPIOD
#define LED_PORT GPIOD
#ifndef BIT
#define BIT(x) ((uint16_t)((uint16_t)0x01U<<(x)))
#endif// 聲明需要針對的引腳, PDx(x=8...15)
static uint32_t LED_PINS[] = {BIT(8),  BIT(9),  BIT(10), BIT(11),BIT(12), BIT(13), BIT(14), BIT(15)
};/*!\brief    初始化 LED\param[in]  none\param[out] none\retval     none
*/
void extended_led_init();/*!\brief    熄滅所有 LED 燈\param[in]  none\param[out] none\retval     none
*/
void extended_led_turn_off_all();/*!\brief    點亮所有 LED 燈\param[in]  none\param[out] none\retval     none
*/
void extended_led_turn_on_all();/*!\brief    熄滅 LED 燈\param[in]  index[int]: LED 燈在 LED_PINS 數組中的索引, -1 針對所有引腳\param[out] none\retval     none
*/
void extended_led_turn_off(int index);/*!\brief    點亮 LED 燈\param[in]  index[int]: LED 燈在 LED_PINS 數組中的索引, -1 針對所有引腳\param[out] none\retval     none
*/
void extended_led_turn_on(int index);/*!\brief    運行多個共陽 LED 燈示例: extended_led_run(0,  1, 1); 效果為:從第一個燈開始依次亮起, 切燈過程不熄滅其他燈[流水燈]示例: extended_led_run(0,  1, 0); 效果為:從第一個燈開始依次亮起, 切燈過程會熄滅其他燈[跑馬燈]示例: extended_led_run(0,  2, 1); 效果為:按 0.2.4.6 順序依次亮起, 切燈過程不熄滅其他燈[流水燈]示例: extended_led_run(1,  2, 0); 效果為:按 1.3.5.7 順序依次亮起, 切燈過程會熄滅其他燈[跑馬燈]示例: extended_led_run(6, -2, 1); 效果為:按 6.4.2.0 順序依次亮起, 切燈過程不熄滅其他燈[流水燈]示例: extended_led_run(7, -2, 0); 效果為:按 7.5.3.1 順序依次亮起, 切燈過程會熄滅其他燈[跑馬燈]\param[in]  status  [uint16_t]:     表示燈的狀態, 可選值有 (亮:0) 或 (滅:1)\param[in]  start   [uint32_t]:     表示從哪個燈開始亮, 可選值有 0...\param[in]  step    [int16_t] :     表示切燈的時候跨越步長, 可選值有 0...\param[in]  flowing [uint16_t]:     表示切燈的時候是否采用流水燈\param[out] none\retval     none
*/
void extended_led_run(uint16_t status, uint32_t start, int16_t step, uint16_t flowing);#endif
  • ExtendedLED.c
#include "ExtendedLED.h"// 獲取 LED 燈的總數
static uint16_t pins_length(void) {return sizeof(LED_PINS) / sizeof(LED_PINS[0]);
}// 獲取所有引腳
static uint16_t pins_all(void) {int length = 0, i = 0;length = pins_length();uint16_t pin = (uint16_t)0x00U;for(i = 0; i < length; i++) {pin |= LED_PINS[i];}return pin;
}/*!\brief    初始化 LED\param[in]  none\param[out] none\retval     none
*/
void extended_led_init() {rcu_periph_clock_enable(LED_RCU);gpio_mode_set(LED_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, pins_all());gpio_output_options_set(LED_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, pins_all());gpio_bit_set(GPIOD, pins_all());
}/*!\brief    熄滅所有 LED 燈\param[in]  none\param[out] none\retval     none
*/
void extended_led_turn_off_all() { extended_led_turn_off(-1); }/*!\brief    點亮所有 LED 燈\param[in]  none\param[out] none\retval     none
*/
void extended_led_turn_on_all() { extended_led_turn_on(-1); }/*!\brief    熄滅 LED 燈\param[in]  index[int]: LED 燈在 LED_PINS 數組中的索引, -1 針對所有引腳\param[out] none\retval     none
*/
void extended_led_turn_off(int index) {int length = pins_length();if (index >= length) {return;}if (index < 0) {gpio_bit_set(GPIOD, pins_all());   // 負數針對所有return;}gpio_bit_set(GPIOD, LED_PINS[index]);
}/*!\brief    點亮 LED 燈\param[in]  index[int]: LED 燈在 LED_PINS 數組中的索引, -1 針對所有引腳\param[out] none\retval     none
*/
void extended_led_turn_on(int index) {int length = pins_length();if (index >= length) {return;}if (index < 0) {gpio_bit_reset(GPIOD, pins_all());   // 負數針對所有return;}gpio_bit_reset(GPIOD, LED_PINS[index]);}/*!\brief    運行多個共陽 LED 燈示例: extended_led_run(0,  1, 1); 效果為:從第一個燈開始依次亮起, 切燈過程不熄滅其他燈[流水燈]示例: extended_led_run(0,  1, 0); 效果為:從第一個燈開始依次亮起, 切燈過程會熄滅其他燈[跑馬燈]示例: extended_led_run(0,  2, 1); 效果為:按 0.2.4.6 順序依次亮起, 切燈過程不熄滅其他燈[流水燈]示例: extended_led_run(1,  2, 0); 效果為:按 1.3.5.7 順序依次亮起, 切燈過程會熄滅其他燈[跑馬燈]示例: extended_led_run(6, -2, 1); 效果為:按 6.4.2.0 順序依次亮起, 切燈過程不熄滅其他燈[流水燈]示例: extended_led_run(7, -2, 0); 效果為:按 7.5.3.1 順序依次亮起, 切燈過程會熄滅其他燈[跑馬燈]\param[in]  status  [uint16_t]:     表示燈的狀態, 可選值有 (亮:0) 或 (滅:1)\param[in]  start   [uint32_t]:     表示從哪個燈開始亮, 可選值有 0...\param[in]  step    [int16_t] :     表示切燈的時候跨越步長, 可選值有 0...\param[in]  flowing [uint16_t]:     表示切燈的時候是否采用流水燈\param[out] none\retval     none
*/
void extended_led_run(uint16_t status, uint32_t start, int16_t step, uint16_t flowing) {int length = pins_length();int i = 0;if(start < 0 || start >= length) {start = 0;}if(start + step  >= length) {start = length - 1 - (step - 1);}for(i = start; i < length && i > -1; i += step) {if(status) {// 熄滅指定索引的燈extended_led_turn_off(i);} else {// 點亮指定索引的燈if(!flowing) {// 如果不是流水燈, 每次切燈之前都需要關掉所有燈extended_led_turn_off(-1);delay_1ms(200);}extended_led_turn_on(i);}delay_1ms(200);}
}
  • main.c
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>#include "ExtendedLED.h"int main(void) {systick_config();extended_led_init();extended_led_run(0, 0,  1, 1);extended_led_run(1, 7, -1, 1);extended_led_run(0, 0,  1, 0);extended_led_turn_off_all();while(1) { }
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24136.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24136.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24136.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法金 | 這次終于能把張量(Tensor)搞清楚了!

大俠幸會&#xff0c;在下全網同名[算法金] 0 基礎轉 AI 上岸&#xff0c;多個算法賽 Top [日更萬日&#xff0c;讓更多人享受智能樂趣] 1. 張量&#xff08;Tensor&#xff09;基礎概念 1.1 張量的定義與重要性 張量是深度學習中用于表示數據的核心結構&#xff0c;它可以視…

《帝國時代 III:決定版》秘籍 怎么在蘋果電腦上玩《帝國時代 III:決定版》

《帝國時代 III&#xff1a;決定版》是一款讓玩家沉浸于歷史長河體驗從大航海時代到工業革命時期的游戲。下面我們來看看《帝國時代 III&#xff1a;決定版》是什么類型的游戲&#xff0c;《帝國時代 III&#xff1a;決定版》Mac安裝教程的相關內容。 一、《帝國時代 III&…

【BOM02】本地存儲

一&#xff1a;什么是本地存儲 數據存儲在用戶瀏覽器中&#xff0c;用戶設置、讀取方便&#xff0c;同時頁面刷新時不會丟失數據。存儲在瀏覽器中數據約5M&#xff0c;分為sessionStorage和localStorage兩種存儲方式 二&#xff1a;localStorage存儲 作用 將數據永久存儲在…

opencv實戰小結-銀行卡號識別

實戰1-銀行卡號識別 項目來源&#xff1a;opencv入門 項目目的&#xff1a;識別傳入的銀行卡照片中的卡號 難點&#xff1a;銀行卡上會有一些干擾項&#xff0c;如何排除這些干擾項&#xff0c;并且打印正確的號碼是一個問題 最終效果如上圖 實現這樣的功能需要以下幾個步驟…

基于Amazon Linux使用pip安裝certbot并使用Apache配置證書的完整步驟

配置證書 1. 更新系統和安裝必要的軟件包 首先&#xff0c;確保系統和包管理器是最新的&#xff1a; sudo dnf update -y sudo dnf install -y python3 python3-pip python3-virtualenv httpd mod_ssl2. 創建并激活虛擬環境 為了避免依賴沖突&#xff0c;使用virtualenv創建…

算法導論實戰(三)(算法導論習題第二十四章)

&#x1f308; 個人主頁&#xff1a;十二月的貓-CSDN博客 &#x1f525; 系列專欄&#xff1a; &#x1f3c0;算法啟示錄 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻擋不了春天的腳步&#xff0c;十二點的黑夜遮蔽不住黎明的曙光 目錄 前言 第二十四章 24.1-3 24.1-4 2…

筆記:DST與HPPC測試方法

一、DST測試方法&#xff1a; DST全稱為Dynamic Stress Test,是一種動態壓力測試方法&#xff0c;主要用于評估電池在實際使用條件下的綜合性能&#xff0c;模擬了車輛在行駛過程中可能會遇到的各種動態負載變化&#xff0c;如加速、減速、怠速等工況。 它的目的是評估電池在…

setattr前端接收方法深度解析

setattr前端接收方法深度解析 在前端開發中&#xff0c;setattr可能是一個較為陌生的概念&#xff0c;但它卻在某些場景下扮演著關鍵角色。setattr是一個Python內置函數&#xff0c;用于設置對象屬性的值。然而&#xff0c;在前端與后端交互的過程中&#xff0c;我們有時需要處…

【Week-R2】使用LSTM實現火災預測(tf版本)

【Week-R2】使用LSTM實現火災預測&#xff08;tf版本&#xff09; 一、 前期準備1.1 設置GPU1.2 導入數據1.3 數據可視化 二、數據預處理(構建數據集)2.1 設置x、y2.2 歸一化2.3 劃分數據集 三、模型創建、編譯、訓練、得到訓練結果3.1 構建模型3.2 編譯模型3.3 訓練模型3.4 模…

超詳細的java Comparable,Comparator接口解析

前言 Hello大家好呀&#xff0c;在java中我們常常涉及到對象的比較&#xff0c;不同于基本數據類型&#xff0c;對于我們的自定義對象&#xff0c;需要我們自己去建立比較標準&#xff0c;例如我們自定義一個People類&#xff0c;這個類有name和age兩個屬性&#xff0c;那么問…

[數據集][圖像分類]蘑菇分類數據集3122張215類別

數據集類型&#xff1a;圖像分類用&#xff0c;不可用于目標檢測無標注文件 數據集格式&#xff1a;僅僅包含jpg圖片&#xff0c;每個類別文件夾下面存放著對應圖片 圖片數量(jpg文件個數)&#xff1a;3122 分類類別數&#xff1a;215 類別名稱:[“almond_mushroom”,“amanita…

實驗筆記之——DPVO(Deep Patch Visual Odometry)

本博文記錄本文測試DPVO的過程&#xff0c;本博文僅供本人學習記錄用~ 《Deep Patch Visual Odometry》 代碼鏈接&#xff1a;GitHub - princeton-vl/DPVO: Deep Patch Visual Odometry 目錄 配置過程 測試記錄 參考資料 配置過程 首先下載代碼以及創建conda環境 git clo…

Data Management Controls

Data Browsing and Analysis Data Grid 以標準表格或其他視圖格式&#xff08;例如&#xff0c;帶狀網格、卡片、瓷磚&#xff09;顯示數據。Vertical Grid 以表格形式顯示數據&#xff0c;數據字段顯示為行&#xff0c;記錄顯示為列。Pivot Grid 模擬微軟Excel的樞軸表功…

有待挖掘的金礦:大模型的幻覺之境

人工智能正在迅速變得無處不在&#xff0c;在科學和學術研究中&#xff0c;自回歸的大型語言模型&#xff08;LLM&#xff09;走在了前列。自從LLM的概念被整合到自然語言處理&#xff08;NLP&#xff09;的討論中以來&#xff0c;LLM中的幻覺現象一直被廣泛視為一個顯著的社會…

Oracle EBS AP發票創建會計科目提示:APP-SQLAP-10710:無法聯機創建會計分錄

系統版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 問題癥狀: 提交“創建會計科目”請求提示錯誤信息如下: APP-SQLAP-10710:無法聯機創建會計分錄。 請提交應付款管理系統會計流程,而不要為此事務處理創建會計分錄解決方法 數據修復SQL腳本: UPDATE ap_invoi…

LabVIEW閥性能試驗臺測控系統

本項目開發的閥性能試驗臺測控系統是為滿足國家和企業相關標準而設計的&#xff0c;主要用于汽車氣壓制動系統控制裝置和調節裝置等產品的綜合性能測試。系統采用工控機控制&#xff0c;配置電器控制柜&#xff0c;實現運動控制、開關量控制及傳感器信號采集&#xff0c;具備數…

vue封裝一個查詢URL參數方法

vue封裝一個查詢URL參數方法 在 Vue 中&#xff0c;你可以封裝一個查詢 URL 參數的方法來獲取 URL 中的查詢參數。以下是一個示例代碼&#xff1a; export const getQueryParam (param) > {const urlParams new URLSearchParams(window.location.search);return urlPara…

算法-分治策略

概念 分治算法&#xff08;Divide and Conquer&#xff09;是一種解決問題的策略&#xff0c;它將一個問題分解成若干個規模較小的相同問題&#xff0c;然后遞歸地解決這些子問題&#xff0c;最后合并子問題的解得到原問題的解。分治算法的基本思想是將復雜問題分解成若干個較…

東方博宜1565 - 成績(score)

問題描述 牛牛最近學習了 C 入門課程&#xff0c;這門課程的總成績計算方法是&#xff1a; 總成績作業成績 20% 小測成績 30% 期末考試成績 50%。 牛牛想知道&#xff0c;這門課程自己最終能得到多少分。 輸入 三個非負整數 A、B、C &#xff0c;分別表示牛牛的作業成績、…

計算機網絡 期末復習(謝希仁版本)第3章

對于點對點的鏈路&#xff0c;目前使用得最廣泛的數據鏈路層協議是點對點協議 PPP (Point-to-Point Protocol)。局域網的傳輸媒體&#xff0c;包括有線傳輸媒體和無線傳輸媒體兩個大類&#xff0c;那么有線傳輸媒體有同軸電纜、雙絞線和光纖&#xff1b;無線傳輸媒體有微波、紅…