【STM32】HAL庫點燈

【STM32】HAL庫點燈

  • 一、探究目標
  • 二、探究原理
    • 2.1 ST開發庫
    • 2.1.1 直接配置寄存器
    • 2.1.2 標準外設庫
    • 2.1.3 HAL庫
    • 2.2 HAL開發
      • 2.2.1 環境配置
      • 2.2.2 時鐘配置
      • 2.2.3 GPIO配置
      • 2.2.4 工程創建
      • 2.2.5 KEIL代碼![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/bf1c95d5c6724a6a9eb4a5a1d4fb65a8.png)
      • 2.2.6 注意:加入核心文件stm32f10x_md.s
    • 2.3 GPIO函數
  • 三、代碼實現
    • 3.1 實驗一
      • 3.1.1 CubeMX配置
      • 3.1.2 KEIL代碼
    • 3.2 實驗二
      • 3.2.1 CubeMX配置
      • 3.2.2 KEIL代碼
    • 3.3 KEIL仿真
  • 四、探究總結

一、探究目標

  1. 了解并掌握HAL庫函數開發方法。安裝 stm32CubeMX,配合Keil,使用HAL庫方式完成下列任務:

    1)重做上一個LED流水燈作業,用GPIO端口完成2只LED燈的周期閃爍。

    2)接上,再用GPIO端某一管腳接2個開關(用杜邦線模擬代替)。采用中斷模式編程,當2分開關接高電平時,對應的兩個LED燈停止工作(即停止周期性閃爍),接低電平時,恢復工作。

  2. 在沒有示波器條件下,使用Keil的軟件仿真邏輯分析儀功能觀察LED管腳的時序波形,分析上面作業按鍵中斷時,LED燈的波形變化情況。

二、探究原理

2.1 ST開發庫

ST 為開發者提供了非常方便的開發庫,有標準外設庫(SPL庫)、HAL 庫(Hardware Abstraction Layer,硬件抽象層庫)、LL 庫(Low-Layer,底層庫)三種。前者是ST的老庫已經停更了,后兩者是ST現在主推的開發庫。

我們之前所使用的寄存器開發是最底層的開發方法,開發者可以參照ST公司的數據手冊迅速上手。HAL庫和LL

2.1.1 直接配置寄存器

我們之前所使用的寄存器開發是最底層的開發方法。在之前學習51的過程中,我們是通過匯編語言直接操作寄存器實現功能的,而這種方法到了STM32就不太容易行得通了,因為STM32的寄存器數量是51單片機的十數倍,如此多的寄存器根本無法全部記憶,開發時需要經常的翻查芯片的數據手冊,此時直接操作寄存器就變得非常的費力了。
但直接操作寄存器的方法更接近原理,而且適用性更廣泛,只要擁有數據手冊,什么芯片都可以直接上手。

2.1.2 標準外設庫

ST公司為每款芯片都編寫了一份庫文件,也就是工程文件里stm32F1xx…之類的。在使用過程中我們只需要配置結構體變量成員就可以修改外設的配置寄存器,從而選擇不同的功能。
標準庫同時也是目前最多人使用的方式,很多人的STM32啟蒙——江協科技也是用到標準庫教學的。

2.1.3 HAL庫

HAL(Hardware Abstraction Layer,抽象印象層)庫是ST公司目前主力推的開發方式。使用ST公司研發的STMcube軟件,可以通過圖形化的配置功能,直接生成整個使用HAL庫的工程文件,而無需像標準庫那樣配置文件,可以說是方便至極。

2.2 HAL開發

2.2.1 環境配置

環境配置可參考博客STM32_Cube MX配置及使用HAL庫

2.2.2 時鐘配置

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在方框內輸入72,回車確認。

2.2.3 GPIO配置

由于我們LED所接引腳為PB9,因此我們需要將PB9引腳初始化為高電平輸出,即High。
在這里插入圖片描述

2.2.4 工程創建

在這里插入圖片描述
在這里插入圖片描述
Generate后工程就創建成功啦,此時我們只需要open project就可以打開KEIL工程了。

2.2.5 KEIL代碼在這里插入圖片描述

在敲代碼的時候要注意,要把代碼卸載BEGIN和END之間,寫在外面的會在你操作cube生成代碼的時候被清理掉。

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);

一個簡簡單單的LED燈閃爍就這樣寫好了。

2.2.6 注意:加入核心文件stm32f10x_md.s

我們可以將之前標準庫文件中的md.s文件復制粘貼到Drivers中,但是注意:如果更改cubeMX并generate文件都會把這個清除,需要重新添加。
在這里插入圖片描述
在這里插入圖片描述

2.3 GPIO函數

  1. HAL_GPIO_WritePin函數:寫入引腳高低電平
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));assert_param(IS_GPIO_PIN_ACTION(PinState));if (PinState != GPIO_PIN_RESET){GPIOx->BSRR = GPIO_Pin;}else{GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;}
}
  1. HAL_GPIO_TogglePin函數:引腳電平翻轉
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{uint32_t odr;/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));/* get current Output Data Register value */odr = GPIOx->ODR;/* Set selected pins that were at low level, and reset ones that were high */GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin);
}

三、代碼實現

3.1 實驗一

用GPIO端口完成2只LED燈的周期閃爍。
這里用PB8、PB9輸出。

3.1.1 CubeMX配置

按照2.2的步驟操作配置好時鐘后,在GPIO選擇我們需要的引腳PB8、PB9。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
初始化后我們可以觀察到,生成的gpio.c文件中,有如上代碼。

3.1.2 KEIL代碼

想要實現LED1、LED2周期閃爍,我們可以用翻轉電平操作。
由于初始LED1(PB9)高電平熄滅,LED2(LED8)低電平點亮。
加入延時函數,讓二者電平翻轉。

  while (1){HAL_Delay(500);HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

3.2 實驗二

再用GPIO端某一管腳接2個開關(用杜邦線模擬代替)。采用中斷模式編程,當2分開關接高電平時,對應的兩個LED燈停止工作(即停止周期性閃爍),接低電平時,恢復工作。

3.2.1 CubeMX配置

配置輸入,假如兩個開關分別連引腳PA5\PA6。
在這里插入圖片描述
將PA5、PA6選擇為GPIO_Input模式。

3.2.2 KEIL代碼

開關接高電平時LED滅,低電平時LED亮。
因此我們需要用到HAL_GPIO_ReadPin函數讀取開關的輸入電平。

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{GPIO_PinState bitstatus;/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET){bitstatus = GPIO_PIN_SET;}else{bitstatus = GPIO_PIN_RESET;}return bitstatus;
}

因此主函數的代碼寫簡單幾句就能實現。

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define  KEY1_State HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)
#define  KEY2_State HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)
/* USER CODE END PD */
  /* USER CODE BEGIN WHILE */while (1){if(KEY1_State==GPIO_PIN_RESET){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);}if(KEY2_State==GPIO_PIN_SET){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);}/* USER CODE END WHILE */

3.3 KEIL仿真

請添加圖片描述
請添加圖片描述
請添加圖片描述
在這里插入圖片描述

四、探究總結

HAL庫開發只要熟悉函數,很容易就能進行開發。但是HAL庫的覆蓋程度有限,有些芯片并沒有HAL庫,因此掌握寄存器開發和標準庫開發還是很有必要的。

以上則是我本次探究的全部內容,如有錯漏請在評論區指正。

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

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

相關文章

NextGen Mirth Connect XStream反序列化遠程代碼執行漏洞(CVE-2023-43208)

0x01 產品簡介 NextGen Mirth Connect是是美國NextGen公司的一個醫療集成引擎,主要用于醫療領域的系統集成和數據交換,支持多種協議和標準。 0x02 漏洞概述 NextGen Mirth Connect 4.4.1之前版本存在遠程代碼執行漏洞,未經身份認證的攻擊者可利用該漏洞遠程執行代碼。 0…

混合組網VS傳統網絡:智能硬件混合組網優劣勢淺要解析

智能硬件混合組網是一種利用多種通信技術相結合的方法&#xff0c;以實現更靈活、更可靠的網絡連接。通過藍牙、Wi-Fi、LoRa、4G相互之間的不同通訊方式&#xff0c;根據應用場景的不同以及現場實際環境&#xff0c;優選最佳物聯網混合組網方案&#xff0c;以達到部署最便捷性價…

一張SSL證書如何同時保護多個域名及其子域名?

在互聯網時代&#xff0c;數據安全和隱私保護變得至關重要&#xff0c;而SSL證書作為確保網站安全的重要工具&#xff0c;其重要性不言而喻。本文將詳細探討一種特殊的SSL證書——多域名通配符SSL證書&#xff0c;它為網站管理員提供了一種高效、經濟的方式來保護多個域名及其子…

學Java以及IDEA工具中遇到的常用單詞

Arithmetic 算術 operator 運算符 relational 關系 logic 邏輯 assign 分配 TernaryOperator 三元運算符、 gender 性別 lebal 標簽 array 數組 two dimesional 二維 object 對象 method 方法 row 行 column 列 parameter 參數 recursion 遞歸 overload 方法重載 calculate 計算…

MyBatis從入門到“入土“

&#x1f495;喜歡的朋友可以關注一下&#xff0c;下次更新不迷路&#xff01;&#x1f495;(●?●) 目錄 一、Mybatis為何物&#xff1f;&#x1f44c; 二、快速入門&#x1f923; 1、新建項目&#x1f60a; 2、數據庫建表&#x1f60a; 3、導入依賴的jar包&#x1f60a;…

Linux學習筆記6

TFTP 服務器搭建和測試 關于TFTP:TFTP&#xff08;Trivial File Transfer Protocol&#xff0c;簡單文件傳輸協議&#xff09;&#xff0c;是一個基于UDP 協議實現 的用于在客戶機和服務器之間進行簡單文件傳輸的協議&#xff0c;適合于開銷不大、不復雜的應用場合 搭建服務器…

后量子密碼的發展和應用

后量子算法&#xff0c;特別是后量子密碼(PQC)&#xff0c;是近年來密碼學領域的一個熱門話題。隨著量子計算技術的快速發展&#xff0c;傳統的公鑰密碼算法面臨著被量子計算機破解的威脅。為了應對這一挑戰&#xff0c;后量子密碼應運而生&#xff0c;成為了一種能夠抵抗量子計…

【論文筆記】| 蛋白質大模型ProLLaMA

【論文筆記】| 蛋白質大模型ProLLaMA ProLLaMA: A Protein Large Language Model for Multi-Task Protein Language Processing Peking University Theme: Domain Specific LLM Main work&#xff1a; 當前 ProLLM 的固有局限性&#xff1a;&#xff08;i&#xff09;缺乏自然…

Redis篇 在linux系統上安裝Redis

安裝Redis 在Ubuntu上安裝Redis 在Ubuntu上安裝Redis 在linux系統中,我們安裝Redis,必須先使它有root權限. 那么在linux中,如何切換到root用戶權限呢? sudo su 就可切換到用戶權限了. 在切換到用戶權限后,我們需要用一條命令來搜索Redis相關的軟件包 apt search redis 會出現非…

ROS2學習——節點話題通信(2)

目錄 一、ROS2節點 1.概念 2.實例 &#xff08;1&#xff09;ros2 run &#xff08;2&#xff09;ros2 node list &#xff08;3&#xff09;remapping重映射 &#xff08;4&#xff09;ros2 node info 二、話題 &#xff08;1&#xff09; ros2 topic list &#xf…

頭歌openGauss-存儲過程第1關:創建存儲過程

編程要求 1、創建第1個存儲過程&#xff0c;并調用&#xff1b; 1&#xff09;創建存儲過程&#xff0c;查詢emp表數據&#xff1b; 2&#xff09;調用存儲過程&#xff1b; --創建存儲過程&#xff0c;獲得計算機&#xff08;cs&#xff09;系學生選課情況并將結果寫入臨時表t…

人臉識別:基于卷積神經網絡(CNN)分類思想的人臉識別系統

本文來自公眾號 “AI大道理” —————— 項目配套視頻課程&#xff1a; 平臺&#xff1a;荔枝微課 鏈接&#xff1a;十方教育 項目地址&#xff1a;https://github.com/AIBigTruth/CNN_faces_recognition 之前很多人來詢問這個項目怎么做&#xff0c;代碼跑不起來&#…

數據庫讀寫分離

實現 MySQL 的讀寫分離主要可以通過以下幾種方式&#xff1a; 一主多從架構&#xff1a; 設置一個主數據庫&#xff08;Master&#xff09;來處理寫操作&#xff08;如 INSERT、UPDATE、DELETE&#xff09;。 設置多個從數據庫&#xff08;Slave&#xff09;來處理讀操作&…

USB數據恢復軟件:輕松找回U盤重要數據!

USB數據丟失的原因 USB數據丟失有一些常見原因&#xff0c;了解這些原因有利于恢復數據。 文件意外刪除病毒攻擊軟件錯誤未安全彈出USB設備格式化USB設備 順便一提&#xff0c;如果你通過快捷鍵“Ctrl D”刪除了數據&#xff0c;那你可以從回收站中還原它們。如果你永久刪除…

Isaac Sim仿真平臺學習(1)認識Isaac Sim

0.前言 上一個教程中我們下載好了Isaac Sim&#xff0c;這一章我們將來簡單了解一下Isaac Sim平臺。 isaac Sim仿真平臺安裝-CSDN博客 1.Isaac Sim是啥&#xff1f; What Is Isaac Sim? — Omniverse IsaacSim latest documentation Isaac Sim是NVDIA Omniverse平臺的機器…

【編譯原理復習筆記】屬性文法

屬性文法 也稱為屬性翻譯文法&#xff0c;由 Knuth 提出&#xff0c;以上下文無關文法為基礎 &#xff08;1&#xff09;為每個文法符號&#xff08;終結符與非終結符&#xff09;配備相關的屬性&#xff0c;代表與該文法符號相關的信息 &#xff08;2&#xff09;屬性文法對于…

【LSTM】基于Matlab的LSTM模型建模(代碼)

訓練目標&#xff1a;用LSTM訓練數據 數據&#xff1a;隨時間遞增&#xff0c;患者患病的概率&#xff08;橫坐標1個單位代表1個時間單位&#xff09; 以下代碼可直接運行 clc clear close all warning off % 關閉報警信息 %% 1.數據操作 % 1.1.導入數據&#x…

數據鏈路層協議——以太網協議

1. 數據鏈路層 網絡層用于將數據從一臺主機發送到另一臺主機。傳輸層用于將數據可靠的從一臺主機發送到另一臺主機。&#xff08;網絡層沒有保證可靠性的策略&#xff0c;傳輸過程中可能會出現各種意外&#xff0c;例如&#xff1a;丟包&#xff0c;網絡擁塞等。通過傳輸層可以…

跨域問題的4種解決方案

文章導讀 前言 跨域問題指的是在Web開發中&#xff0c;由于瀏覽器的同源策略限制&#xff0c;當一個網頁嘗試訪問與它不同源&#xff08;協議、域名或端口不同&#xff09;的資源時&#xff0c;可能會遇到安全限制導致無法正常訪問的問題。這種策略旨在防止惡意網站讀取或修改其…

yarn的基本命令和用法

Yarn通過并行安裝、離線模式、確定性安裝以及更好的依賴解析算法&#xff0c;為開發者提供了更快、更穩定、更安全的包管理體驗。它保留了npm的大部分功能&#xff0c;并在此基礎上做了大量優化&#xff0c;下面我們就來詳述Yarn的核心命令和實用技巧。&#x1f4da; 安裝Yarn…