ARM32開發——LED點燈

🎬 秋野醬:《個人主頁》
🔥 個人專欄:《Java專欄》《Python專欄》

??心若有所向往,何懼道阻且長

文章目錄

    • 點燈的兩種方式
    • 灌入電流法
    • 輸出電流法
    • 擴展板點燈
    • 點燈方式
    • 點亮LED1-4
    • 完整實現

點燈的兩種方式

不同顏色LED,達到相同亮度,對應的電壓不同,通常需要接入220Ω到10KΩ的限流電阻,阻值越小,LED越亮,反之LED越暗,以下兩種方式皆可。

灌入電流法

在這里插入圖片描述

灌入電流接法:LED亮燈供電VCC由芯片外部提供,灌入MCU的GPIO_PIN引腳
● 優點:可提供較大電壓電流,讓燈更亮
● 缺點:外部電源大幅變化時,可能導致MCU引腳燒毀。

輸出電流法

在這里插入圖片描述

輸出電流法:由MCU提供正極供電,使用推挽輸出模式可以讓一般LED亮起。通常接小LED用這種接法。
● 優點:安全可控
● 缺點:驅動能力有限

擴展板點燈

在這里插入圖片描述
LED驅動包含什么功能?

  1. 初始化4個LED燈
  2. 打開某一個燈
  3. 關閉某一個燈

在這里插入圖片描述

點燈方式

● 初始化所有IO為推挽輸出模式
● 默認將總開關LED_SW拉高,總開關關閉
● 默認將所有LED1-8拉高,為關閉狀態
● LED_SW總開關拉低導通(三極管為PNP型),所有LED陽極可有供電。
● 在總開關拉低導通時,任意LED直接拉低自己的IO即可點亮

點亮LED1-4

為了能夠應對批量初始化的需求,我們可以定義結構體來描述參數:

// 聲明gpio初始化所需參數的結構體
typedef struct {rcu_periph_enum rcu;uint32_t port;uint32_t pin;
} Led_GPIO_t;

進而聲明出所有的GPIO對應參數

// 聲明所有gpio對應參數的數組
Led_GPIO_t g_gpio_list[] = {{RCU_GPIOC, GPIOC, GPIO_PIN_6},        // LED_SW{RCU_GPIOD, GPIOD, GPIO_PIN_8},        // LED1{RCU_GPIOD, GPIOD, GPIO_PIN_9},        // LED2{RCU_GPIOD, GPIOD, GPIO_PIN_10},       // LED3{RCU_GPIOD, GPIOD, GPIO_PIN_11},       // LED4
};

完整實現

頭文件聲明

#ifndef __BSP_LEDS_H__
#define __BSP_LEDS_H__#include "gd32f4xx.h"#define LED1	1
#define LED2	2
#define LED3	3
#define LED4	4void bsp_leds_init();void bsp_led_turn_on(uint8_t led_index);void bsp_led_turn_off(uint8_t led_index);#endif

c文件實現

#include "bsp_leds.h"// 聲明gpio初始化所需參數的結構體
typedef struct {rcu_periph_enum rcu;uint32_t port;uint32_t pin;
} Led_GPIO_t;// 聲明所有gpio對應參數的數組
Led_GPIO_t g_gpio_list[] = {{RCU_GPIOC, GPIOC, GPIO_PIN_6},        // LED_SW{RCU_GPIOD, GPIOD, GPIO_PIN_8},        // LED1{RCU_GPIOD, GPIOD, GPIO_PIN_9},        // LED2{RCU_GPIOD, GPIOD, GPIO_PIN_10},       // LED3{RCU_GPIOD, GPIOD, GPIO_PIN_11},       // LED4
};// 用于計算數組長度的宏
#define MAX_LED_COUNT	(sizeof(g_gpio_list) / sizeof(Led_GPIO_t))/*********************************************************** @brief LED GPIO初始化**********************************************************/
static void GPIO_config(rcu_periph_enum rcu, uint32_t port, uint32_t pin){// 初始化為推挽輸出模式rcu_periph_clock_enable(rcu);gpio_mode_set(port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, pin);gpio_output_options_set(port, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, pin);
}void bsp_leds_init(){uint8_t count = MAX_LED_COUNT;for(uint8_t i = 0; i < count; i++){Led_GPIO_t gpio = g_gpio_list[i];// 初始化GPIO_config(gpio.rcu,gpio.port, gpio.pin);// 默認全部拉高(關閉)gpio_bit_write(gpio.port, gpio.pin, SET);}// 總開關拉低(打開)gpio_bit_write(g_gpio_list[0].port, g_gpio_list[0].pin, RESET);
}// 開燈
void bsp_led_turn_on(uint8_t led_index){Led_GPIO_t gpio = g_gpio_list[led_index];gpio_bit_write(gpio.port, gpio.pin, RESET);
}// 關燈
void bsp_led_turn_off(uint8_t led_index){Led_GPIO_t gpio = g_gpio_list[led_index];gpio_bit_write(gpio.port, gpio.pin, SET);
}

主文件調用

#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>#include "bsp_leds.h"/*********************
任務目標:點亮LED1-4**********************/int main(void) {// 系統滴答定時器初始化systick_config();// IO引腳初始化bsp_leds_init();while(1) {bsp_led_turn_on(LED1);bsp_led_turn_on(LED2);bsp_led_turn_on(LED3);bsp_led_turn_on(LED4);// 休眠500msdelay_1ms(500);bsp_led_turn_off(LED1);bsp_led_turn_off(LED2);bsp_led_turn_off(LED3);bsp_led_turn_off(LED4);// 休眠1000msdelay_1ms(500);}}

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

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

相關文章

[數據集][目標檢測]貓狗檢測數據集VOC+YOLO格式8291張2類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;8291 標注數量(xml文件個數)&#xff1a;8291 標注數量(txt文件個數)&#xff1a;8291 標注…

ETLCloud中如何使用Kettle組件

ETLCloud中如何使用Kettle組件在當今數據驅動的時代&#xff0c;數據處理和分析已成為企業決策的關鍵。為了更高效地處理海量數據&#xff0c;ETL&#xff08;Extract, Transform, Load&#xff09;工具變得至關重要。而在眾多ETL工具中&#xff0c;Kettle作為一款開源、靈活且…

c#面向對象:接口詳解

接口&#xff08;interface&#xff09; 抽象類中的抽象方法只規定了不能是 private 的&#xff0c;而接口中的“抽象方法”只能是 public 的。這樣的成員訪問級別就決定了接口的本質&#xff1a;接口是服務消費者和服務提供者之間的契約。既然是契約&#xff0c;那就必須是透…

攻防實戰 | 郵件高級威脅檢測與自動化響應

歷經三個月的時間&#xff0c;年度重磅直播節目Fortinet 2024年度“Demo季”近日終于迎來了備受矚目的壓軸大戲——Demo Day第三期&#xff0c;主題為《新郵件安全下的高級威脅檢測與自動化響應》。繼成功舉辦了前兩期《企業網絡中的多源威脅情報自動化整合與集成》和《應急響應…

【持久層】在Spring Boot中使用Hibernate和Gradle構建項目

Hibernate是一個廣泛使用的Java持久化框架&#xff0c;它使得Java對象與關系數據庫之間的映射變得簡單高效。在Spring Boot應用中&#xff0c;結合Gradle構建工具&#xff0c;能夠方便地集成和使用Hibernate。本文將簡述如何在Spring Boot中使用Hibernate&#xff0c;并通過Gra…

Pycharm使用時的紅色波浪線報錯——形如‘break‘ outside loop

背景&#xff1a; 我在一個方法中&#xff0c;寫了一個if判斷&#xff0c;寫了一個break&#xff0c;期望終止這個函數&#xff0c;編輯器出現報錯 形如下圖 視頻版問題教程&#xff1a; Pycharm下出現波浪線報錯&#xff0c;形如break outside loop 過程&#xff1a; 很奇…

IDEA一鍵啟動多個微服務

我們在做微服務項目開發的時候&#xff0c;每次剛打開IDEA&#xff0c;就需要把各個服務一個個依次啟動&#xff0c;特別是服務比較多時&#xff0c;逐個點擊不僅麻煩還費時。下面來說一下如何一鍵啟動多個微服務。 操作步驟 點擊Edit Configurations 2.點擊“”&#xff0c;…

【設計模式】JAVA Design Patterns——Facade(外觀模式)

&#x1f50d;目的 為一個子系統中的一系列接口提供一個統一的接口。外觀定義了一個更高級別的接口以便子系統更容易使用。 &#x1f50d;解釋 真實世界例子 一個金礦是怎么工作的&#xff1f;“嗯&#xff0c;礦工下去然后挖金子&#xff01;”你說。這是你所相信的因為你在使…

性價比為王,物流商怎么選擇高效的國際物流管理平臺

在全球化貿易日益繁榮的今天&#xff0c;國際物流行業作為鏈接國內商家和海外市場的重要橋梁&#xff0c;發揮著極其重要的作用。 然而&#xff0c;隨著國際物流市場競爭的加劇&#xff0c;對物流商來說&#xff0c;也面臨著成本管控和效率提升的雙重挑戰。今天我們會重點探討…

解決 DataGrip 2024.1.3 連接 Tdengine 時timestamp字段顯示時區不正確問題

設置中找到該設置&#xff0c;將原來的設置 yyyy-MM-dd HH:mm:ss 修改為: yyyy-MM-dd HH:mm:ss.SSS z 即可。 注意&#xff1a;只能修改第一個,修改后提示錯誤&#xff0c;但是查詢數據時能成功格式化時間&#xff0c;修改第二個不生效&#xff0c;可能是 bug 具體格式見: Date…

DOS編程入門:探索基礎、深入技巧與實戰應用

DOS編程入門&#xff1a;探索基礎、深入技巧與實戰應用 DOS編程&#xff0c;作為計算機編程的基石之一&#xff0c;對于初學者來說&#xff0c;既是一種挑戰&#xff0c;也是一次深入了解計算機底層運作的絕佳機會。本文將從四個方面、五個方面、六個方面和七個方面&#xff0…

Opera 瀏覽器與Google聯手,推出由Gemini驅動的全新AI功能

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

JavaScript循環語句

JavaScript中的循環語句有三種&#xff1a;for循環、while循環和do...while循環。這些循環語句可以幫助我們重復執行一段代碼&#xff0c;直到滿足某個條件為止。 for循環&#xff1a; for循環是最常用的循環語句之一&#xff0c;它包含一個初始化表達式、一個條件表達式和一個…

富士攝像機X-H2S MOV格式化后重新寫入后的恢復方法

X-H2S是富士數碼的一款旗艦機型&#xff0c;支持4K/6K高清&#xff0c;視頻編碼為最新的HVC。下面我們來看下富士數碼攝像機恢復案例。 故障存儲:512G存儲卡 Exfat文件系統 故障現象: 512G的卡誤格式化后又進行了拍攝&#xff0c;卡使用了120G不到的空間&#xff0c;其它底…

【副業】12種程序員副業大匯總

1&#xff1a;寫博客。技術能力可以的寫技術文章輸出&#xff0c;比如當前網站、掘金、阿里云社區、騰訊云社區、其他社區。 2&#xff1a;賣課程。大廠高P跟知識付費平臺合作、錄課賣課程、比如極課時間、慕課網、騰訊課堂。 3&#xff1a;寫書。技術大拿出書&#xff0c;掙稿…

簡述Vue中同時發送多個請求怎么操作?

在Vue中同時發送多個請求&#xff0c;我們通常使用axios這個庫&#xff0c;因為它基于Promise&#xff0c;可以很好地處理異步操作。以下是兩種常用的方法來同時發送多個請求&#xff1a; 方法一&#xff1a;使用Promise.all() 定義多個請求&#xff1a; 使用axios.get()或axi…

【EFK日志系統】docker一鍵部署kibana、es-head

docker一鍵部署kibana、es-head kibana部署es-head部署 上一篇文章搭建了es集群 規劃服務器是 es01:172.23.165.185 es02:172.23.165.186 es03:172.23.165.187 那么kibana就搭建在主節點es01:172.23.165.185 按照順序參考&#xff1a; docker一鍵部署EFK系統&#xff08;elas…

使用 Vue 3 和 JsBarcode 開發一維碼顯示組件

在現代前端開發中&#xff0c;條形碼&#xff08;或稱一維碼&#xff09;在許多應用場景中非常常見&#xff0c;例如商品管理、物流跟蹤等。本文將介紹如何使用 Vue 3 和 JsBarcode 庫來創建一個靈活的一維碼顯示組件&#xff0c;并展示如何在應用中使用它。 1. 安裝必要的依賴…

簡述Vue 的響應式原理中 Object.defineProperty 有什 么缺陷 ?

Vue.js 2.x 的響應式原理主要依賴于 Object.defineProperty 方法來實現數據劫持&#xff0c;即當數據發生變化時&#xff0c;能夠觸發視圖更新。然而&#xff0c;Object.defineProperty 方法在 Vue 的響應式系統中存在一些缺陷&#xff1a; 無法監聽數組的變化&#xff1a; Obj…

詳解生成式人工智能的開發過程

回到機器學習的“古老”時代&#xff0c;在您可以使用大型語言模型&#xff08;LLM&#xff09;作為調優模型的基礎之前&#xff0c;您基本上必須在所有數據上訓練每個可能的機器學習模型&#xff0c;以找到最佳&#xff08;或最不糟糕&#xff09;的擬合。 開發生成式人工智能…