【GD32】01-GPIO通用輸入輸出

GD32

閑話說在前頭

這里又開一個系列啦。

原因就是之前買了立創開發板的9.9的GD32E230C8T6的板子,買都買了就跟著立創開發板學習一下(屬于是一次性支持了兩個國產品牌了,立創和兆易創新)。并且我還買了GD32F407VET6的板子,后續也會使用GD32F407VET6這塊板子來做一些別的。

GD32可以說是STM32的國產平替版,聽說部分型號可以直接替換掉STM32(我沒試過)。

反正以后有啥項目我的首選MCU肯定不會是STM32了(雖然我是用的STM32入門的32位單片機),因為上有更好用ESP32,下有供貨穩定(21年的時候STM32斷貨,STM32F103C8T6的價格曾被炒到六十多一片)的GD32。

剛剛去某寶逛了逛,目前為止(2024.4.23),我在同一家店鋪里發現GD32F103C8T6的芯片會比STM32F103C8T6的芯片稍貴三毛錢(不過GD32的主頻更高,其他外設和性能什么的沒去翻手冊對比不太清楚)。并且在某寶上賣STM32開發板的商家明顯比GD32開發板的多。現在一個STM32F103C8T6的最小系統板我找到的便宜的可能也就十塊錢出頭,但是GD32F103C8T6的核心板要二十多塊,而且選擇還很少。我想這大概是市場上的差異,因為有了需求才會有供給,大家都去買STM32那么STM32自然就能投入更多到研發和生產上,導致了強者愈強的局面。隨著國內技術的不斷發展和市場的逐步成熟,GD32等國產MCU正在逐漸縮小與國際品牌的差距。

本人懷著強烈的愛國之心,呼吁各位小伙伴支持國產。你不支持,我不支持,那國產品牌哪來的研發資金給咱整什么國貨崛起。

總之一句話,支持國產就完事了。

命名規則

GD32和STM32可以說是非常相似的,連命名規則都差不多。

外設資源

上面紅框框出來的是GD32E230的外設資源。相比較STM32F103C8T6來說,相對少一些。不過E230在GD32系列芯片里屬于入門級,拿來學習是綽綽有余的。

GPIO

接下來我們直接看如何驅動GPIO,點個燈先。

國產的還有一個好處就是手冊對中文的支持比較好,省的跑去找翻譯了。

可以看得出GD32的固件庫功能還是挺多的,比如最后一個翻轉GPIO的引腳狀態,這個在STM32的固件庫里是沒有的(HAL庫有)。雖然不用人家提供,我們另外也有辦法可以實現翻轉的操作,但是直接就有的話還是很舒服的。

在STM32中,我們配置GPIO口是需要一個結構體變量的,通過給這個結構體的成員賦值來配置GPIO口。

在GD32中,我們可以看到配置GPIO口是通過兩個函數來配置的,分別是設置GPIO模式和GPIO輸出模式和速度。

gpio_mode_set

可以選什么參數,在上面的表格寫的非常清楚。

這邊就簡單說一下一些參數的具體含義。

首先是mode,輸入輸出這個沒什么好說的,模擬模式就是我們使用ADC的時候用的。備用功能模式也就是復用引腳,比如我現在要用串口,那么就需要給串口的TX和RX這倆引腳配上這個備用功能模式。

pull_up_down是配置電阻的,和STM32不同的是GD32把這個配置拆開了,STM32中是直接配置為上拉輸入,下拉輸入等,而在GD32中是配置輸入模式,再加上上拉電阻或者是下拉電阻。

gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_0);

上面示例代碼的意思就是我們配置GPIOA的0號引腳為輸出模式,沒有加電阻。

gpio_output_options_set

配置輸出的模式和速率。

一般來說咱就陪推挽輸出是夠用的,不過具體還得看咱要驅動的模塊的手冊來判斷。

輸出速度,如果是通過高低電平來傳輸數據,那么速度是建議在通信速率的5~10倍的。

gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,GPIO_PIN_0);

上面配置了GPIOA的0號引腳為2MHz的推挽輸出模式。?

如果是輸入模式則不需要使用這個函數。

gpio_bit_write

設置輸出電平的函數有很多個,除了這個還有gpio_bit_set gpio_bit_resetgpio_port_write不過我這邊就講gpio_bit_write,因為這個是最常用的,并且剩下三個能實現的功能,用這個函數都可以實現。

參數就是指定端口和引腳,以及高電平(SET)或是低電平(RESET)。

gpio_input_bit_get

gpio_output_bit_get

上面的兩個函數都可以讀取指定端口和引腳的電平。

跟STM32不一樣的是GD32細分了讀取電平,分為了讀取輸出模式下的引腳和讀取輸入模式下的引腳。

gpio_af_set

設置復用哪一個外設。

這個具體看我們要使用哪一個外設,對照著表格去配置就好了。后續我們會用到。

點亮LED

剩下還有一點就是GD32和STM32一樣,默認都是關閉外設時鐘的,因此我們還需要打開外設時鐘。

rcu_periph_clock_enable ?

參照著表格填寫我們需要打開的外設時鐘即可。?

#include "gd32e23x.h"void Z_Init_GPIO(void){rcu_periph_clock_enable(RCU_GPIOA);gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_0);gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,GPIO_PIN_0);
}int main(void){Z_Init_GPIO();gpio_bit_write(GPIOA,GPIO_PIN_0,0);while(1){}
}

閃爍LED

點亮LED之后我們再讓LED閃爍。

我們需要延時函數,這個時候就直接把立創開發板寫的拿過來用就好了。

systick.c

 /******************************************************************************* 測試硬件:立創開發板·GD32E230C8T6    使用主頻72Mhz    晶振8Mhz* 版 本 號: V1.0* 修改作者: www.lckfb.com* 修改日期: 2023年11月02日* 功能介紹:      ****************************************************************************** 梁山派軟硬件資料與相關擴展板軟硬件資料官網全部開源  * 開發板官網:www.lckfb.com   * 技術支持常駐論壇,任何技術問題歡迎隨時交流學習  * 立創論壇:club.szlcsc.com   * 其余模塊移植手冊:【立創·GD32E230C8T6開發板】模塊移植手冊* 關注bilibili賬號:【立創開發板】,掌握我們的最新動態!* 不靠賣板賺錢,以培養中國工程師為己任******************************************************************************/
/*!\file  systick.c\brief the systick configuration file\version 2019-02-19, V1.0.0, firmware for GD32E23x
*//*Copyright (c) 2019, GigaDevice Semiconductor Inc.All rights reserved.Redistribution and use in source and binary forms, with or without modification, 
are permitted provided that the following conditions are met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
OF SUCH DAMAGE.
*/#include "gd32e23x.h"
#include "systick.h"volatile static float count_1us = 0;
volatile static float count_1ms = 0;/*!\brief      configure systick\param[in]  none\param[out] none\retval     none
*/
void systick_config(void)
{/* systick clock source is from HCLK/8 */systick_clksource_set(SYSTICK_CLKSOURCE_HCLK_DIV8);count_1us = (float)SystemCoreClock/8000000;count_1ms = (float)count_1us * 1000;
}/*!\brief      delay a time in microseconds in polling mode\param[in]  count: count in microseconds\param[out] none\retval     none
*/
void delay_1us(uint32_t count)
{uint32_t ctl;/* reload the count value */SysTick->LOAD = (uint32_t)(count * count_1us);/* clear the current count value */SysTick->VAL = 0x0000U;/* enable the systick timer */SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;/* wait for the COUNTFLAG flag set */do{ctl = SysTick->CTRL;}while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));/* disable the systick timer */SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;/* clear the current count value */SysTick->VAL = 0x0000U;
}void delay_us(uint32_t count)
{uint32_t ctl;/* reload the count value */SysTick->LOAD = (uint32_t)(count * count_1us);/* clear the current count value */SysTick->VAL = 0x0000U;/* enable the systick timer */SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;/* wait for the COUNTFLAG flag set */do{ctl = SysTick->CTRL;}while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));/* disable the systick timer */SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;/* clear the current count value */SysTick->VAL = 0x0000U;
}/*!\brief      delay a time in milliseconds in polling mode\param[in]  count: count in milliseconds\param[out] none\retval     none
*/
void delay_1ms(uint32_t count)
{uint32_t ctl;/* reload the count value */SysTick->LOAD = (uint32_t)(count * count_1ms);/* clear the current count value */SysTick->VAL = 0x0000U;/* enable the systick timer */SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;/* wait for the COUNTFLAG flag set */do{ctl = SysTick->CTRL;}while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));/* disable the systick timer */SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;/* clear the current count value */SysTick->VAL = 0x0000U;
}void delay_ms(uint32_t count)
{uint32_t ctl;/* reload the count value */SysTick->LOAD = (uint32_t)(count * count_1ms);/* clear the current count value */SysTick->VAL = 0x0000U;/* enable the systick timer */SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;/* wait for the COUNTFLAG flag set */do{ctl = SysTick->CTRL;}while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));/* disable the systick timer */SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;/* clear the current count value */SysTick->VAL = 0x0000U;
}

systick.h

/*!\file  systick.h\brief the header file of systick\version 2019-02-19, V1.0.0, firmware for GD32E23x
*//*Copyright (c) 2019, GigaDevice Semiconductor Inc.All rights reserved.Redistribution and use in source and binary forms, with or without modification, 
are permitted provided that the following conditions are met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
OF SUCH DAMAGE.
*/#ifndef SYS_TICK_H
#define SYS_TICK_H#include <stdint.h>/* function declarations */
/* configure systick */
void systick_config(void);
/* delay a time in milliseconds */
void delay_1ms(uint32_t count);/* delay a time in milliseconds */
void delay_ms(uint32_t count);/* delay a time in microseconds */
void delay_1us(uint32_t count);/* delay a time in microseconds */
void delay_us(uint32_t count);#endif /* SYS_TICK_H */

閃爍LED代碼?

#include "gd32e23x.h"
#include "systick.h"void Z_Init_GPIO(void){rcu_periph_clock_enable(RCU_GPIOA);gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_0);gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,GPIO_PIN_0);
}int main(void){systick_config();Z_Init_GPIO();gpio_bit_write(GPIOA,GPIO_PIN_0,0);while(1){//gpio_bit_write(GPIOA,GPIO_PIN_0,!gpio_output_bit_get(GPIOA,GPIO_PIN_0));gpio_bit_toggle(GPIOA,GPIO_PIN_0);delay_ms(500);}
}

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

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

相關文章

資金流分析下的企業供貨關系強度模型

圖技術 利用neo4j、networkx、dgl、python做圖分析挖掘 【1】最短路徑算法dijkstra 【2】基于networkx的隱性集團關系識別模型 【3】基于Neo4j的擔保社群型態分析挖掘 【4】基于python求有向無環圖中target到其他節點全路徑 【5】有向圖中任意兩點的路徑 【6】圖基礎入門 【7】…

項目管理中控制質量的工具與技術

項目管理中控制質量的工具與技術 控制質量的工具與技術包括多種方法&#xff0c;旨在確保產品或服務達到既定的質量標準。關于具體的工具格式和樣式&#xff0c;以下是一些示例&#xff1a; 統計技術&#xff1a; 這是一種將質量控制要素的數據轉化為實際控制手段的技術。通…

Visual Studio和Visual Studio Code適用于哪些編程語言

Visual Studio和Visual Studio Code都適用于多種編程語言&#xff0c;它們的適用編程語言如下&#xff1a; Visual Studio適用于&#xff1a; C#Visual Basic .NETF#CJavaScriptTypeScriptPythonHTML/CSSJava&#xff08;通過插件支持&#xff09; Visual Studio Code適用于…

Jtti:哪些方法可以降低美國CN2服務器的延遲?

降低美國CN2服務器的延遲可以采取多種方法&#xff0c;以下是一些常用的方法&#xff1a; 1.選擇優質的網絡提供商和服務商&#xff1a;選擇具有高質量網絡和優質服務的網絡提供商和服務商是降低延遲的關鍵。確保您選擇的網絡提供商具有可靠的基礎設施和優質的網絡連接&#xf…

C++:關于圓形魚眼半全景圖轉為等距圓柱投影圖

C&#xff1a;空間坐標映射到球面坐標/全景圖_如何將球體坐標映射到球面uv-CSDN博客 C&#xff1a;關于360全景圖像和立方體6面全景圖像的相互轉換_彩色全景拆解正方體6個面-CSDN博客 之前記錄了立方體和360全景之間的轉換&#xff0c;這次記錄下魚眼圖與360全景圖之間的轉換…

C++ STL的鎖介紹

在 C Standard Template Library (STL) 中&#xff0c;有幾個鎖的實現&#xff0c;這些都位于 <mutex> 頭文件。以下是一些常見的鎖及其功能&#xff1a; std::mutex&#xff1a;最基本的互斥鎖&#xff0c;不可遞歸使用。該鎖提供了獨占的非公平鎖定能力。 std::mutex…

處理瀏覽器緩存問題

處理瀏覽器緩存問題 main.js router.onError((error) > {hasRefreshed false;console.log("異常" error.message);let ind0 error.message.indexOf(Loading chunk chunk-)let ind2 error.message.indexOf(failed.)if(ind0 ! -1 && ind2 !-1){console.…

spring-boot-starter-validation校驗框架

介紹 Spring Boot Starter Validation是一個Spring Boot模塊&#xff0c;用于簡化應用程序中的驗證功能。它包含以下依賴&#xff1a; Hibernate Validator&#xff1a;Hibernate Validator是JavaBean Validation&#xff08;JSR 380&#xff09;規范的參考實現&#xff0c;提…

信創應用軟件之辦公流版簽

信創應用軟件之辦公流版簽 文章目錄 信創應用軟件之辦公流版簽概述流式文件版式文件電子簽章廠商金山辦公永中-永中Office中標-中標普華Office福昕科技e簽寶法大大 概述 辦公流版簽軟件主要包括辦公中常用到的流式軟件、版式軟件以及電子簽章。 版式文件和流式文件都是文書類…

軟件體系結構總結

文章目錄 一、軟件體系結構概述1.1 基本概念1.1.1 背景1.1.2 定義1.1.3 系統1.1.3.1 定義1.1.3.2 特性1.1.3.3 系統的體系結構 1.1.4 軟件設計的層次性1.1.5 體系結構的類別&#xff08;類型&#xff09;1.1.6 重要性&#xff08;意義&#xff09; 1.2 模塊及其設計1.2.1 定義1…

HTTP超時時間設置

在進行超時時間設置之前我們需要了解一次http請求經歷的過程 瀏覽器進行DNS域名解析&#xff0c;得到對應的IP地址根據這個IP&#xff0c;找到對應的服務器建立連接&#xff08;三次握手&#xff09;建立TCP連接后發起HTTP請求&#xff08;一個完整的http請求報文&#xff09;服…

[單機]完美國際_V155_GM工具_VM虛擬機

[端游] 完美國際單機版V155一鍵端PC電腦網絡游戲完美世界幻海凌云家園 本教程僅限學習使用&#xff0c;禁止商用&#xff0c;一切后果與本人無關&#xff0c;此聲明具有法律效應&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人親自搭建成功的&#xff0c;絕對是…

出海企業哪種組網方案更省事?

對于出海企業而言&#xff0c;建立跨地區的數據傳輸和協同工作至關重要&#xff0c;以提升運營效率。因此&#xff0c;網絡構建變得迫在眉睫。通過構建企業組網&#xff0c;企業能夠加強與海外分支、客戶和合作伙伴之間的聯系&#xff0c;加速海外業務的發展。 然而&#xff0c…

Stable Diffusion教程|圖生圖原理和實戰

Stable Diffusion憑借其卓越的圖生圖功能&#xff0c;極大地提升了圖像生成的可控性與輸出品質&#xff0c;賦予用戶前所未有的個性化創作風格表達能力。這一革新特性使得Stable Diffusion不僅能精準地捕捉用戶的藝術愿景&#xff0c;更能以數字化手段孕育出新穎且極具創意的畫…

【Java 8】Lambda: mAA::get 返回函數式接口實例

正文 代碼介紹&#xff1a;分別有兩個函數式接口Lazy跟LazyDependencyCreator&#xff0c;一個HashMap存儲<Object, LazyDependencyCreator>鍵值對。重點在于mProviders.put(AA.class,mAA::get)&#xff0c;看了很久都沒看懂&#xff0c;mAA::get返回的不是mAA本身嗎&am…

部署私有YUM源

需將對應版本DVD下載至本機&#xff0c;并保證本機可訪問互聯網&#xff0c;下載需要的rpm包。 下載DVD并進行掛載 mkdir /data/iso -pmkdir /data/yum -pcd /datawget http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1511.isomount -o loop -t…

知識付費app源碼快速發布app定制開發一站式定制開發平臺,開辦技術學校的風險有哪些?如何防范?

現在越來越多的人看好培訓行業&#xff0c;投資者們或選擇加盟&#xff0c;或選擇創業&#xff0c;不管哪一種都是投資&#xff0c;投資就會有風險&#xff0c;那么技術學校在辦學過程中&#xff0c;有哪些風險呢? 1、學生人身傷害事故的風險 技術學校的學生&#xff0c;不是同…

java接口介紹

在Java中,接口(interface)是一種特殊的引用類型,它是一種抽象的規范,用于定義一組方法的集合,但不提供方法的具體實現。接口定義了一種契約,規定了類應該具有的方法,但不規定方法的具體實現。一個類可以實現一個或多個接口,從而獲得接口中定義的所有方法。 接口在Jav…

npm i 與npm install的區別,接上回的npm ERR! code 128

在admin-element-ui拉取框架代碼后&#xff0c;需要先安裝依賴&#xff0c;但是會報128的錯誤&#xff0c;我這里總結一下&#xff0c;接上回一篇博客npm ERR! code 128-CSDN博客后續。 以前一直以為 npm i 與 npm install 是同一個東西&#xff0c;但是就在今天早上安裝依賴的…

在input光標處插入內容,并解決TS報錯

在input或者textarea的光標處插入內容&#xff0c;如果是鍵盤輸入倒是好說&#xff0c;直接把光標定位過去&#xff0c;鍵盤打字就可以了&#xff1b;如果在光標處插入內容呢&#xff0c;稍微費點事&#xff0c;倒是不是問題&#xff1b;但ts總是希望把一切弄得規范一些&#x…