從單片機的啟動說起一個單片機到點燈發生了什么下——使用GPIO點一個燈

目錄

前言

HAL庫對GPIO的抽象

核心分析:HAL_GPIO_Init

前言

我們終于到達了熟悉的地方,對GPIO的初始化。經過漫長的鋪墊,我們終于歷經千辛萬苦,來到了這里。關于GPIO的八種模式等更加詳細的細節,由于只是點個燈,我們不做所有的分析。

HAL庫對GPIO的抽象

HAL庫對GPIO的抽象可以說是到了一個巔峰。使能一個GPIO,被化簡到了一個非常顯然的步驟。

  • 使能對應GPIO所在的Port的時鐘

  • 設置GPIO對應的模式——點燈的時候,我們是推挽強力的控制外設

  • 使用HAL_GPIO_Init函數注冊到寄存器當中

  • 做一些Post Init工作。比如說,我們明確的要求拉高拉低GPIO。這個,需要根據外設電路來實現

以我板子上外接的PA9作為一個例子把!

static void __open_gpioclk(){__HAL_RCC_GPIOF_CLK_ENABLE();
}
?
CCGPIOInitTypeDef led0_init = {.type = {.Pin ? ?= GPIO_PIN_9,.Mode ? = GPIO_MODE_OUTPUT_PP,.Speed ?= GPIO_SPEED_HIGH,.Pull ? = GPIO_PULLUP},.open_clock = __open_gpioclk,.post_init ?= __post_init,.port = GPIOF
};
?
void configure_ccgpio(CCGPIOType* type, ?CCGPIOInitTypeDef* initer)
{type->port = initer->port;type->pinType = initer->type.Pin;
?// oh shit, the open clock is missing initediniter->open_clock ? initer->open_clock() : __die();
?HAL_GPIO_Init(type->port, &initer->type);
?if(initer->post_init) initer->post_init(type);
}

核心分析:HAL_GPIO_Init

我們只是簡單的點個燈,這個函數就可被化簡為如下的邏輯

void HAL_GPIO_Init(GPIO_TypeDef ?*GPIOx, GPIO_InitTypeDef *GPIO_Init)
{uint32_t position;uint32_t ioposition = 0x00U;uint32_t iocurrent = 0x00U;uint32_t temp = 0x00U;
?/* 檢查參數 */assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));assert_param(IS_GPIO_PIN(GPIO_Init->Pin));assert_param(IS_GPIO_MODE(GPIO_Init->Mode));
?/* 配置GPIO引腳 */for(position = 0U; position < GPIO_NUMBER; position++){/* 獲取IO引腳位置 */ioposition = 0x01U << position;/* 獲取當前IO引腳的狀態 */iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition;
?...
?/* 配置引腳為高電平來點亮LED */GPIOx->ODR |= iocurrent; // 設置為高電平}}
}

這就是為什么我們可以使用Pin9 | Pin10完成我們的組操作,因為內部,我們是逐個比特的完成我們對GPIO的設置,對于每一個滿足——的確是我們要設置的GPIO

 ?
  if(iocurrent == ioposition){/* --------------------- GPIO模式配置 ------------------------*//* 僅當輸出模式時才需要配置 */if(((GPIO_Init->Mode & GPIO_MODE) == MODE_OUTPUT)){/* 配置IO速度 */assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));temp = GPIOx->OSPEEDR;temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U));temp |= (GPIO_Init->Speed << (position * 2U));GPIOx->OSPEEDR = temp;
?/* 配置IO輸出類型 */temp = GPIOx->OTYPER;temp &= ~(GPIO_OTYPER_OT_0 << position);temp |= (((GPIO_Init->Mode & OUTPUT_TYPE) >> OUTPUT_TYPE_Pos) << position);GPIOx->OTYPER = temp;
?/* 配置IO輸出模式 */temp = GPIOx->MODER;temp &= ~(GPIO_MODER_MODER0 << (position * 2U));temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U));GPIOx->MODER = temp;}

也就是說,設置我們的輸出類型是下面的:

  • 上拉是指在GPIO引腳與電源(通常是3.3V或5V)之間連接一個電阻,這樣當引腳處于輸入狀態時,如果沒有外部信號驅動該引腳,它會自動被拉到高電平。也就是被高電平拽上去了!

  • 下拉是指在GPIO引腳與地(0V)之間連接一個電阻,這樣當引腳處于輸入狀態時,如果沒有外部信號驅動該引腳,它會自動被拉到低電平。也就是被低電平拽下去了!

  • 無上下拉配置意味著不連接任何上拉或下拉電阻。當GPIO引腳處于輸入模式時,它的電平狀態將取決于外部電路。如果沒有外部驅動信號,這個引腳將處于浮空狀態(Hi-Z),可能會導致電平不穩定,容易受到噪聲干擾。

中的一種。至于GPIO的速度,則是分為低速中速高速。我們的輸出模式大致分兩種:

  • 推挽輸出(Push-pull):這種輸出類型意味著GPIO引腳可以驅動電流流向負載,并且在輸出高電平和低電平時都會主動提供電流。即引腳會主動拉高電平和拉低電平。它是最常用的輸出類型。

  • 開漏輸出(Open-drain):這種輸出類型意味著GPIO引腳只有在輸出低電平時才會提供電流(拉低電平),而在輸出高電平時,它不會輸出電流,而是處于高阻態(Hi-Z)。通常需要外部上拉電阻來將引腳拉到高電平。你會在使用軟件IIC的時候,再看到它。

所以,筆者按照給出的這個原理圖:配置為上拉的情況,確保初始化后不會立馬被點亮。

很好,現在,我們終于來到了點燈!

set_ccgpio_state(&led0, CCGPIO_LOW);
?
void set_ccgpio_state(CCGPIOType* type, CCGPIOState state)
{HAL_GPIO_WritePin(type->port, type->pinType, (state ? (GPIO_PIN_SET) : (GPIO_PIN_RESET)));
}

此時此刻,我們的GPIO就會被拉到低,形成一個高低的電壓差,存在的電流就把我們的LED導通了!

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

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

相關文章

ESP32S3:解決RWDT無法觸發中斷問題,二次開發者怎么才能使用內部RTC看門狗中斷RWDT呢?

目錄 基于ESP32S3:解決RWDT無法觸發中斷問題引言解決方案1. 查看報錯日志2. 分析報錯及一步一步找到解決方法3.小結我的源碼基于ESP32S3:解決RWDT無法觸發中斷問題 引言 在嵌入式系統中,RWDT(看門狗定時器)是確保系統穩定性的重要組件。然而,在某些情況下,RWDT可能無法…

對計算機中緩存的理解和使用Redis作為緩存

使用Redis作為緩存緩存例子緩存的引入 Redis緩存的實現 使用Redis作為緩存 緩存 ?什么是緩存&#xff0c;第一次接觸這個東西是在考研學習408的時候&#xff0c;計算機組成原理里面學習到Cache緩存&#xff0c;用于降低由于內存和CPU的速度的差異帶來的延遲。它是在CPU和內存…

vue3的實用工具庫@vueuse/core

1.什么是vueuse/core 是一個基于 ?Vue Composition API? 開發的實用工具庫&#xff0c;旨在通過封裝高頻功能為可復用的組合式函數&#xff08;Composables&#xff09;&#xff0c;簡化 Vue 應用的開發流程。 提供 ?200 開箱即用的函數?&#xff0c;覆蓋狀態管理、瀏覽器…

基于SSM的《計算機網絡》題庫管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘 要 《計算機網絡》題庫管理系統是一種新穎的考試管理模式&#xff0c;因為系統是用Java技術進行開發。系統分為三個用戶進行登錄并操作&#xff0c;分別是管理員、教師和學生。教師在系統后臺新增試題和試卷&#xff0c;學生進行在線考試&#xff0c;還能對考生記錄、錯題…

C++初階——簡單實現stack和queue

目錄 1、Deque(了解) 1.1 起源 1.2 結構 1.3 優缺點 1.4 應用 2、Stack 3、Queue 4、Priority_Queue 注意&#xff1a;stack&#xff0c;queue&#xff0c;priority_queue是容器適配器(container adaptor) &#xff0c;封裝一個容器&#xff0c;按照某種規則使用&#…

第2課 樹莓派鏡像的燒錄

樹莓派的系統通常是安裝在SD卡上的?。SD卡作為啟動設備,負責啟動樹莓派并加載操作系統。這種設計使得樹莓派具有便攜性和靈活性,用戶可以通過更換SD卡來更換操作系統或恢復出廠設置。 燒錄樹莓派的鏡像即是將樹莓派鏡像燒錄到SD卡上,在此期間會格式化SD卡,如果SD卡…

【Unity】URP管線Shader編程實例詳解 (1) : 漩渦效果shader

作者說 本系列教程適用于有編程基礎和圖形學基礎知識的讀者.如果對您有所幫助&#xff0c;請點個免費的贊和關注&#xff0c;您的支持就是我更新最大的動力&#xff01;如果你有任何想看的內容歡迎評論區留言&#xff01;本系列教程Github : https://github.com/Sky0Master/Un…

如何安裝vm 和centos

安裝 VMware Workstation&#xff08;以 Windows 系統為例&#xff09; 1. 下載 VMware Workstation 打開 VMware 官方網站&#xff08;Desktop Hypervisor Solutions | VMware &#xff09;&#xff0c;在頁面中選擇適合你系統的版本進行下載。如果你是個人非商業使用&#x…

STM32-心知天氣項目

一、項目需求 使用 ESP8266 通過 HTTP 獲取天氣數據&#xff08;心知天氣&#xff09;&#xff0c;并顯示在 OLED 屏幕上。 按鍵 1 &#xff1a;循環切換今天 / 明天 / 后天天氣數據&#xff1b; 按鍵 2 &#xff1a;更新天氣。 二、項目框圖 三、cjson作用 https://gi…

Wireshark簡單教程

1.打開Wireshark,點擊最上面欄目里面的“捕獲”中的“選項” 2.進入網卡選擇界面,選擇需要捕獲的選擇&#xff0c;這里我選擇WLAN 3.雙擊捕獲選擇出現下面界面 4.點擊如下圖紅方框即可停止捕獲 5.點擊下圖放大鏡可以進行放大 6.你也可以查詢tcp報文如下圖

【Http和Https區別】

概念&#xff1a; 一、Http協議 HTTP&#xff08;超文本傳輸協議&#xff09;是一種用于傳輸超媒體文檔&#xff08;如HTML&#xff09;的應用層協議&#xff0c;主要用于Web瀏覽器和服務器之間的通信。http也是客戶端和服務器之間請求與響應的標準協議&#xff0c;客戶端通常…

Unity Shader 學習13:屏幕后處理 - 使用高斯模糊的Bloom輝光效果

目錄 一、基本的后處理流程 - 以將畫面轉化為灰度圖為例 1. C#調用shader 2. Shader實現效果 二、Bloom輝光效果 1. 主要變量 2. Shader效果 &#xff08;1&#xff09;提取較亮區域 - pass1 &#xff08;2&#xff09;高斯模糊 - pass2&3 &#xff08;3&#xff…

【R語言】dplyr包經典函數summarise函數

dplyr包經典函數summarise函數&#xff0c;后面改名乘reframe函數了&#xff0c;但是summarise仍然適用 這個函數的返回結果是一個新的數據框&#xff0c;下面講一下幾種常見用法 示例數據為R自帶的數據集mtcars 1.不分組 mtcars %>%summarise(mean mean(disp), n n()…

使用DeepSeek/ChatGPT等AI工具輔助編寫wireshark過濾器

隨著deepseek,chatgpt等大模型的能力越來越強大&#xff0c;本文將介紹借助deepseek&#xff0c;chatgpt等大模型工具&#xff0c;通過編寫提示詞&#xff0c;輔助生成全面的Wireshark顯示過濾器的能力。 每一種協議的字段眾多&#xff0c;流量分析的需求多種多樣&#xff0c;…

vscode設置自動換行

vscode設置自動換行 方法 方法 點擊文件->首選項->設置。搜索word wrap -> 選擇 on 。 搜索Word Wrap&#xff0c;并把選項改為on。

QT 中的元對象系統(一):元對象和元數據

目錄 1.為什么需要元系統 2.元數據 3.模擬元對象系統 3.1.元對象聲明 3.2.對C擴展 3.3初始化元對象 3.4.使用元對象 4.QT的元系統 4.1.元對象系統基于QObject類、Q_OBJECT宏、元對象編譯器MOC實現 4.2.元對象系統的功能 4.3.Q_PROPERTY()的使用 4.4.Q_INVOKABLE使用…

Pytorch實現之渾濁水下圖像增強

簡介 簡介:這也是一篇非常適合GAN小白們上手的架構文章!提出了一種基于GAN的水下圖像增強網絡。這種網絡與其他架構類似,生成器是卷積+激活函數+歸一化+殘差結構的組成,鑒別器是卷積+激活函數+歸一化以及全連接層。損失函數是常用的均方誤差、感知損失和對抗損失三部分。 …

TCPDF 任意文件讀取漏洞:隱藏在 PDF 生成背后的危險

在網絡安全的世界里&#xff0c;漏洞就像隱藏在黑暗中的“定時炸彈”&#xff0c;稍有不慎就會引發災難性的后果。今天&#xff0c;我們要聊的是一個與 PDF 生成相關的漏洞——TCPDF 任意文件讀取漏洞。這個漏洞可能讓攻擊者輕松讀取服務器上的敏感文件&#xff0c;甚至獲取整個…

【Git】六、企業級開發模型

文章目錄 Ⅰ. 前言Ⅱ. 系統開發環境Ⅲ. Git 分支設計規范master分支release分支develop分支feature分支hotfix分支 Ⅰ. 前言 ? 我們知道&#xff0c;一個軟件從零開始到最終交付&#xff0c;大概包括以下幾個階段&#xff1a;規劃、編碼、構建、測試、發布、部署和維護。 ?…

Kafka可視化工具EFAK(Kafka-eagle)安裝部署

Kafka Eagle是什么&#xff1f; Kafka Eagle是一款用于監控和管理Apache Kafka的開源系統&#xff0c;它提供了完善的管理頁面&#xff0c;例如Broker詳情、性能指標趨勢、Topic集合、消費者信息等。 源代碼地址&#xff1a;https://github.com/smartloli/kafka-eagle 前置條件…