国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

第五章 GPIO輸出——使用固件庫點亮LED

W55MH32 ? 來源:W55MH32 ? 作者:W55MH32 ? 2025-05-22 16:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

單芯片解決方案,開啟全新體驗——W55MH32 高性能以太網單片機

W55MH32是WIZnet重磅推出的高性能以太網單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內置高性能Arm? Cortex-M3核心,其主頻最高可達216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數據處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協議棧、內置MAC以及PHY,擁有獨立的32KB以太網收發緩存,可供8個獨立硬件socket使用。如此配置,真正實現了All-in-One解決方案,為開發者提供極大便利。

在封裝規格上,W55MH32 提供了兩種選擇:QFN100和QFN68。

W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復雜工控場景設計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設資源,能夠輕松應對工業控制中多樣化的連接需求,無論是與各類傳感器、執行器的通信,還是對復雜工業協議的支持,都能游刃有余,成為復雜工控領域的理想選擇。 同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網關模組等場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網站或者私信獲取。

此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網絡通信安全再添保障。

為助力開發者快速上手與深入開發,基于W55MH32L這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。

若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。

wKgZPGgbOfaANhwzACodXd3sVzg463.png

第五章 GPIO輸出——使用固件庫點亮LED

本章參考資料:《W55MH32-參考手冊》GPIO和RCC章節、庫幫助文檔。

利用庫建立好的工程模板,就可以方便地使用標準庫編寫應用程序了,可以說從這一章我們真正開始邁入固件庫開發的大門。LED燈的控制使用到GPIO外設的基本輸出功能。

5.1 硬件設計

在本教程中W55MH32芯片與LED燈的連接見圖LED硬件原理圖 :

wKgZO2gu3yGAfkuzAAA-YOD2HOc501.png

此電路為參考電路,這個LED燈的陰極都是連接到W55MH32的GPIO引腳,只要我們控制GPIO引腳的電平輸出狀態,即可控制LED燈的亮滅。若您使用的實驗板LED燈的連接方式或引腳不一樣, 只需根據我們的工程修改引腳即可,程序的控制原理相同。

5.2 軟件設計

5.2.1 編程要點

1.使能GPIO端口時鐘

2.初始化GPIO目標引腳為推挽輸出模式;

3.編寫簡單測試程序,控制GPIO引腳輸出高、低電平。

5.2.2 代碼分析

1. 頭文件與宏定義

#include #include #include #include "delay.h" #include "w55mh32.h" #define GPIO_GROUP_TEST GPIOB // 使用GPIOB #define GPIO_MODE_TEST GPIO_Mode_Out_PP // 推挽輸出模式 #define GPIO_SPEED_TEST GPIO_Speed_50MHz // 50MHz速度 #define GPIO_PIN1_TEST GPIO_Pin_0 // 引腳0 #define GPIO_PIN2_TEST GPIO_Pin_2 // 引腳2 #define GPIO_PIN3_TEST GPIO_Pin_3 // 引腳3 USART_TypeDef *USART_TEST = USART1; // 使用USART1

頭文件:包含標準庫和自定義頭文件(如延時和芯片相關庫)。

宏定義:

GPIO_GROUP_TEST:指定使用 GPIOB。

GPIO_MODE_TEST:設置為推挽輸出(GPIO_Mode_Out_PP),用于驅動外部設備(如 LED)。

GPIO_PIN1_TEST/Pin2/Pin3:定義三個輸出引腳(PB0、PB2、PB3)。

串口配置:使用 USART1 進行通信。

2. 函數聲明

void UART_Configuration(uint32_t bound); // 串口配置函數 void GPIO_Configuration(void); // GPIO配置函數

3. main 函數(主邏輯)

int main(void) { RCC_ClocksTypeDef clocks; delay_init(); // 初始化延時 UART_Configuration(115200); // 配置串口(波特率115200) RCC_GetClocksFreq(&clocks); // 獲取系統時鐘頻率 // 打印系統時鐘信息 printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhzn", (float)clocks.SYSCLK_Frequency / 1000000, ...); printf("GPIO IO Out Tset.n"); // 打印測試信息 GPIO_Configuration(); // 配置GPIO為輸出 // 無限循環:流水燈效果 while (1) { // 依次點亮PB0 → PB2 → PB3 GPIO_SetBits(GPIOB, GPIO_Pin_0); delay_ms(200); GPIO_SetBits(GPIOB, GPIO_Pin_2); delay_ms(200); GPIO_SetBits(GPIOB, GPIO_Pin_3); delay_ms(200); // 依次熄滅PB0 → PB2 → PB3 GPIO_ResetBits(GPIOB, GPIO_Pin_0); delay_ms(200); GPIO_ResetBits(GPIOB, GPIO_Pin_2); delay_ms(200); GPIO_ResetBits(GPIOB, GPIO_Pin_3); delay_ms(200); } }

初始化:延時、串口、時鐘頻率獲取。

串口輸出:打印系統時鐘信息和測試提示。

GPIO 配置:設置 GPIOB 的三個引腳為輸出。

流水燈邏輯:

GPIO_SetBits:置高電平(熄滅 LED)。

GPIO_ResetBits:置低電平(點亮 LED)。

delay_ms(200):每個動作間隔 200ms,形成循環閃爍。

4. GPIO_Configuration 函數(GPIO 初始化)

void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB時鐘 // 配置PB0、PB2、PB3為推挽輸出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIOB }

時鐘使能:啟用 GPIOB 的時鐘。

引腳配置:

引腳:PB0、PB2、PB3(通過位或運算同時配置)。

模式:推挽輸出(GPIO_Mode_Out_PP),適合驅動 LED 等外設。

速度:50MHz(滿足高頻操作需求)。

5. UART_Configuration 函數(串口初始化)

void UART_Configuration(uint32_t bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 使能USART1和GPIOA時鐘(PA9/TX, PA10/RX) RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置TX引腳(PA9):復用推挽輸出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置RX引腳(PA10):浮空輸入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1參數 USART_InitStructure.USART_BaudRate = bound; // 波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位數據 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1位停止位 USART_InitStructure.USART_Parity = USART_Parity_No; // 無校驗 USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // 收發模式 USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); // 使能USART1 }

引腳配置:

PA9(TX):復用推挽輸出(用于發送數據)。

PA10(RX):浮空輸入(用于接收數據)。

串口參數:115200 波特率、8 位數據、1 位停止位、無校驗。

6. 串口輸出函數(SER_PutChar 和 fputc)

int SER_PutChar(int ch) { while (!USART_GetFlagStatus(USART_TEST, USART_FLAG_TC)); // 等待發送完成 USART_SendData(USART_TEST, (uint8_t)ch); // 發送字符 return ch; } int fputc(int c, FILE *f) { if (c == 'n') SER_PutChar('r'); // 換行時添加回車(適配終端) return SER_PutChar(c); // 重定向printf到串口 }

SER_PutChar:通過 USART 發送單個字符,等待發送完成標志(USART_FLAG_TC)。

fputc:重定向 C 庫的printf函數到串口,支持換行符(n)自動添加回車(r)。

5.2.3 下載驗證

把編譯好的程序下載到開發板并復位,可看到LED亮滅交互。

5.3 W55MH32標準庫補充知識

5.3.1 SystemInit函數去哪了?

這個函數在W55MH32標準庫的“system_w55mh32.c”文件中定義了,而我們的工程已經包含該文件。標準庫中的SystemInit函數把芯片的系統時鐘設置成了72MHz, 即此時AHB時鐘頻率為72MHz,APB2為72MHz,APB1為36MHz。當W55MH32芯片上電后,執行啟動文件中的指令后,會調用該函數,設置系統時鐘為以上狀態。

5.3.2 斷言

5.3.2.1 斷言的作用

在 W55MH32 開發過程中,開發者編寫的代碼需要對各種參數和狀態進行檢查。斷言提供了一種簡單有效的方式,用于在代碼中插入檢查點,驗證某些條件是否滿足。如果條件不滿足,斷言會觸發錯誤,幫助開發者快速定位和解決問題。具體見代碼清單:GPIO輸出-1 :

代碼清單:GPIO輸出-1 GPIO_Init函數的斷言部分

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) { uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00; /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode)); assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin)); /* ------- 以下內容省略,跟前面我們定義的函數內容相同----- */

基本上每個庫函數的開頭都會有這樣類似的內容,這里的“assert_param”實際是一個宏,在庫函數中它用于檢查輸入參數是否符合要求, 若不符合要求則執行某個函數輸出警告,“assert_param”的定義見代碼清單:GPIO輸出-2 :

代碼清單:GPIO輸出-2 w55mh32_conf.h文件中關于斷言的定義

#ifdef USE_FULL_ASSERT /** * @brief assert_param 宏用于函數的輸入參數檢查 * @param expr:若expr值為假,則調用assert_failed函數 * 報告文件名及錯誤行號 * 若expr值為真,則不執行操作 */ #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) /* 錯誤輸出函數 ------------------------------------------------------- */ void assert_failed(uint8_t* file, uint32_t line); #else #define assert_param(expr) ((void)0) #endif

這段代碼的意思是,假如我們不定義“USE_FULL_ASSERT”宏,那么“assert_param”就是一個空的宏(#else與#endif之間的語句生效),沒有任何操作。 從而所有庫函數中的assert_param實際上都無意義,我們就當看不見好了。

假如我們定義了“USE_FULL_ASSERT”宏,那么“assert_param”就是一個有操作的語句(#if與#else之間的語句生效), 該宏對參數expr使用C語言中的問號表達式進行判斷,若expr值為真,則無操作(void 0),若表達式的值為假, 則調用“assert_failed”函數,且該函數的輸入參數為“__FILE__”及“__LINE__”, 這兩個參數分別代表 “assert_param”宏被調用時所在的“文件名”及“行號”。

但庫文件只對“assert_failed”寫了函數聲明,沒有寫函數定義,實際用時需要用戶來定義, 我們一般會用printf函數來輸出這些信息,見代碼清單:GPIO輸出-3 :

代碼清單:GPIO輸出-3 assert_failed 輸出錯誤信息

void assert_failed(uint8_t * file, uint32_t line) { printf(“rn 輸入參數錯誤,錯誤文件名=%s,行號=%s”,file,line); }

那么為什么函數輸入參數不對的時候,assert_param宏中的expr參數值會是假呢?這要回到GPIO_Init函數,看它對assert_param宏的調用, 它被調用時分別以“IS_GPIO_ALL_PERIPH(GPIOx)”、“IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin)”等作為輸入參數,也就是說被調用時, expr實際上是一條針對輸入參數的判斷表達式。例如“IS_GPIO_PIN”的宏定義:

#define IS_GPIO_PIN(PIN) ((PIN) != (uint32_t)0x00)

若它的輸入參數 PIN 值為0,則表達式的值為假,PIN非0時表達式的值為真。 我們知道用于選擇GPIO引腳號的宏“GPIO_Pin_x”的值至少有一個數據位為1, 這樣的輸入參數才有意義,若GPIO_InitStruct->GPIO_Pin的值為0,輸入參數就無效了。配合“IS_GPIO_PIN”這句表達式, “assert_param”就實現了檢查輸入參數的功能。對assert_param宏的其它調用方式類似,大家可以自己看庫源碼來研究一下。

5.3.3 Doxygen注釋規范

在W55MH32標準庫以及我們自己編寫的文件中,可以看到一些比較特別的注釋,類似代碼清單:GPIO輸出-4:

代碼清單:GPIO輸出-4 Doxygen注釋規范

/** * @brief 初始化控制LED的IO * @param 無 * @retval 無 */

這是一種名為“Doxygen”的注釋規范,如果在工程文件中按照這種規范去注釋,可以使用Doxygen軟件自動根據注釋生成幫助文檔。 我們所說非常重要的庫幫助文檔

5.3.4 防止頭文件重復包含

在W55MH32標準庫的所有頭文件以及我們自己編寫的.h頭文件中,可看到類似代碼清單:GPIO輸出-5的宏定義。 它的功能是防止頭文件被重復包含,避免引起編譯錯誤。

代碼清單:GPIO輸出-5 防止頭文件重復包含的宏

#ifndef __LED_H #define __LED_H /*此處省略頭文件的具體內容*/ #endif /* end of __LED_H */

在頭文件的開頭,使用“#ifndef”關鍵字,判斷標號“__LED_H”是否被定義,若沒有被定義,則從“#ifndef”至“#endif”關鍵字之間的內容都有效, 也就是說,這個頭文件若被其它文件“#include”,它就會被包含到其該文件中了,且頭文件中緊接著使用“#define”關鍵字定義上面判斷的標號“__LED_H”。 當這個頭文件被同一個文件第二次“#include”包含的時候, 由于有了第一次包含中的“#define __LED_H”定義,這時再判斷“#ifndef__LED_H”, 判斷的結果就是假了,從“#ifndef”至“#endif”之間的內容都無效,從而防止了同一個頭文件被包含多次,編譯時就不會出現“redefine(重復定義)”的錯誤了。

一般來說,我們不會直接在C的源文件寫兩個“#include”來包含同一個頭文件,但可能因為頭文件內部的包含導致重復,這種代碼主要是避免這樣的問題。

WIZnet 是一家無晶圓廠半導體公司,成立于 1998 年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU? 面向各種應用中的嵌入式互聯網設備。

WIZnet 在全球擁有 70 多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。

香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • led
    led
    +關注

    關注

    243

    文章

    24602

    瀏覽量

    690979
  • GPIO
    +關注

    關注

    16

    文章

    1329

    瀏覽量

    56232
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【「高速數字設計(基礎篇)」閱讀體驗】第五章 去耦電容

    最近在啃《高速數字設計》,第五章“去耦電容:遠交近攻”把高速電路里電源噪聲的問題講透了,對于做硬件設計的同學來說,這簡直是“電源完整性”的入門必讀。 為啥去耦電容是剛需? 數字IC切換邏輯狀態
    發表于 11-19 20:35

    蜂鳥E203在黑金XC7A200T型FPGA上點亮LED并實現流水燈

    使用的GPIO口(共32個GPIO口,我們用到個,三個用于LED輸出,兩個用于中斷觸發)。 2、在main函數中完成對使用
    發表于 10-31 09:04

    RVMCU課堂「11」: 手把手教你玩轉RVSTAR—GPIO使用篇

    ?GPIO是通用輸入輸出接口(General Purpose Input Output)的簡稱,是微控制器最基本也是最常用的外設,本期內容將介紹GPIO的基本原理,然后通過「點亮
    發表于 10-31 07:16

    第2 點亮你的LED

    本章的標題是點亮LED,雖然任務很簡單,但是需要了解的單片機基礎知識卻很多,特別是對于初學者,剛開始要在頭腦中建立一個單片機的概念,然后通過點亮一個LED小燈來增加初學者對單片機的興趣
    的頭像 發表于 10-13 15:52 ?517次閱讀
    第2<b class='flag-5'>章</b>  <b class='flag-5'>點亮</b>你的<b class='flag-5'>LED</b>

    【創龍TLT113-MiniEVM開發板試用體驗】點亮LED

    源(3.3V),負極連接GPIO引腳。 點亮條件 :GPIO輸出低電平時形成電流通路(低電平驅動)或高電平驅動(根據電路設計)。 本開發板LED
    發表于 08-05 21:36

    【創龍TL3562-MiniEVM開發板試用體驗】3、點亮LED

    0 > %s/brightness熄滅LED 三、通過其他GPIO點亮LED 從開發板板上找一個GPIO 就用
    發表于 07-29 16:06

    第五章 W55MH32 UDP示例

    本文介紹了在 W55MH32?芯片上實現 UDP?通信及數據回環測試的方法。闡述了 UDP?協議的概念、特點、應用場景、報文傳輸流程和報文結構,展示了實現過程,借助網絡調試工具完成測試。
    的頭像 發表于 07-24 09:13 ?1108次閱讀
    <b class='flag-5'>第五章</b> W55MH32 UDP示例

    【VisionFive 2單板計算機試用體驗】GPIO點亮LED

    測試板卡GPIO點亮LED燈。 一、搭建環境 1.1、文檔 按照官方的應用文檔搭建測試環境GPIO點亮
    發表于 06-30 07:31

    RK3568驅動指南|第十二篇 GPIO子系統-第130 GPIO的調試方法

    RK3568驅動指南|第十二篇 GPIO子系統-第130 GPIO的調試方法
    的頭像 發表于 06-03 11:32 ?1300次閱讀
    RK3568驅動指南|第十二篇 <b class='flag-5'>GPIO</b>子系統-第130<b class='flag-5'>章</b> <b class='flag-5'>GPIO</b>的調試方法

    AS32X601驅動系列教程 GPIO_點亮LED詳解

    在嵌入式開發的奇妙旅程中,GPIO(通用輸入輸出接口)作為芯片與外部世界交互的重要橋梁,扮演著不可或缺的角色。從簡單的 LED 燈控制,到復雜的外設通信,GPIO 的靈活運用為開發者打
    的頭像 發表于 05-23 16:14 ?772次閱讀
    AS32X601驅動系列教程 <b class='flag-5'>GPIO</b>_<b class='flag-5'>點亮</b><b class='flag-5'>LED</b>詳解

    RK3568驅動指南|第十二篇 GPIO子系統-第135 GPIO子系統與pinctrl子系統相結合實驗

    RK3568驅動指南|第十二篇 GPIO子系統-第135 GPIO子系統與pinctrl子系統相結合實驗
    的頭像 發表于 05-23 13:47 ?1033次閱讀
    RK3568驅動指南|第十二篇 <b class='flag-5'>GPIO</b>子系統-第135<b class='flag-5'>章</b> <b class='flag-5'>GPIO</b>子系統與pinctrl子系統相結合實驗

    德賽西威第五代智能座艙G10PH硬件平臺首發點亮

    2025上海國際車展盛大舉行,全球汽車智能化科技焦點匯聚于此。德賽西威在展會現場展示重大技術突破——第五代智能座艙G10PH硬件平臺成功首發點亮,距離該平臺在今年1月國際消費電子展(CES)上全球首發僅時隔三個月。
    的頭像 發表于 04-30 11:40 ?1097次閱讀

    HTR3310 10路LED驅動器和GPIO控制器中文手冊

    ? ? ? HTR3310是一款10路多功能LED驅動器和GPIO控制器2.5V~5.5V電源供電。10個IO端口中的任何一個都可以配置為LED模式或GPIO模式。此外,任何
    發表于 04-14 16:31 ?2次下載

    HTR3316 16路LED驅動器和GPIO控制器中文手冊

    ? ? ?HTR3316是一款16路多功能LED驅動器和GPIO控制器,2.5V~5.5V電源供電。16個IO端口中的任何一個都可以配置為LED模式或GPIO模式。此外,任何
    發表于 04-11 17:51 ?2次下載

    汽車電路初識

    第一 汽車電路分析基礎第二 汽車電路圖識讀第三 典型汽車電器電路分析第四 汽車電路檢修第五章 汽車電子電路圖識讀
    發表于 03-10 18:04 ?7次下載