stm32cubeide外部中斷_【STM32】HAL庫 STM32CubeMX教程三----外部中斷(HAL庫GPIO講解)

前言

上一節我們講解了STM32CubeMX的基本使用和工程的配置,那么這一節我們正式來學習CubeMX配置STM32的各個外設功能了

今天我們會詳細的帶你學習STM32CubeMX配置外部中斷,并且講解HAL庫的GPIO的各種函數,帶你學習不一樣的STM32

那么話不多說,我們開始正式的講解吧!

準備工作:

1、STM32開發板(我的是STM32F407ZE和STM32F103RC)

2、STM32CubeMx軟件、 IDE:?Keil軟件

3、STM32F1xx/STM32F4xxHAL庫

4、按鍵管腳? PA11? PB4

5? ?LED管腳 PC4 PC5 PB0 PB1

1新建工程

1.1New Project

1 搜索芯片型號

2選擇芯片

3創建工程

1.2設置RCC

1 點擊RCC

2高速時鐘(HSE)選擇外部晶振

3 軟件自動配置管腳

1.3GPIO初始化

LED:4個GPIO_OUTPUT (輸出模式)

按鍵:2個GPIO_EXITx(外部中斷模式)

1 點擊對應管腳

2 設置對應模式

GPIO的各種模式設置

GPIO output level? ?引腳電平設置? ?高/低

GPIO mode? ?GPIO模式? ? ?推挽輸出/開漏輸出

GPIO Pull-up/Pull-dowm? ?上拉下拉電阻? ? ??上拉電阻/下拉電阻/無上拉或下拉

Maxinum output speed? ?引腳速度設置? ?低速/中速/高速

User Label? ? 用戶標簽? ?給引腳設置名稱? 如LED0

這里可以看出看和我們使用庫函數的時候配置是一樣的,但我們只需要動幾下鼠標便可以完成操作,這正是STM32CubeMX的強大之處

GPIO_EXIT的6種模式

我們的按鍵選擇下降沿觸發

1.4設置NVIC(嵌套向量中斷控制器)

1點擊NVIC2 勾選EXIT Line

2 interrupt 和 EXIT Line[15:12] interrupt 使能中斷

1.5時鐘源設置

1選擇外部時鐘HSE 8MHz

2PLL鎖相環倍頻9倍

3系統時鐘來源選擇為PLL

4設置APB1分頻器為 /2

1 設置項目名稱

2 設置存儲路徑

3 選擇所用IDE

1.7創建工程文件

然后點擊GENERATE CODE??創建工程

隨后我們可以在stm32f1xx_it.c中看到我們所配置的中斷服務函數? 并且可以看到gpio的初始化分到了gpio.c里面

我們看到他有一個HAL_GPIO_EXTI_IRQHandler();函數

Go To Definition 查看一下函數代碼

和我們庫函數配置差不多,就是清除中斷標志位,之后進入中斷回調函數中

在HAL庫中,中斷運行結束后不會立刻退出,而是會先進入相對應的中斷回調函數,處理該函數中的代碼之后,才會退出中斷,所以在HAL庫中我們一般將中斷需要處理代碼放在中斷回調函數中,

配置下載工具

新建的工程所有配置都是默認的? 我們需要自行選擇下載模式,勾選上下載后復位運行

所有自己編寫的代碼請放在/* USER CODE BEGIN XXX */ ? /* USER CODE END XXX */之間

這樣我們修改工程的時候你自己寫的代碼就不會被刪除

HAL庫 GPIO函數庫講解

在正常使用中,除了STM32CubeMX配置之外,我們有時候還需要自己配置一些東西,學習并理解HAL庫,也是我們必須要學習的一個地方

首先打開stm32f4xx_hal_gpio.h? 發現一共定義有8個函數

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);

void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);

功能: GPIO初始化

實例:HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);

功能:在函數初始化之后的引腳恢復成默認的狀態,即各個寄存器復位時的值

實例:HAL_GPIO_Init(GPIOC, GPIO_PIN_4);

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:讀取引腳的電平狀態、函數返回值為0或1

實例:HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

功能:引腳寫0或1

實例:HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4,0);

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

翻轉引腳的電平狀態

實例:HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4);? ? 常用在LED上

HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:鎖住引腳電平,比如說一個管腳的當前狀態是1,當這個管腳電平變化時保持鎖定時的值。

實例:HAL_GPIO_LockPin(GPIOC, GPIO_PIN_4);

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);

功能:? 外部中斷服務函數,清除中斷標志位

實例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

功能:? 中斷回調函數,可以理解為中斷函數具體要響應的動作。

實例:HAL_GPIO_EXTI_Callback(GPIO_PIN_4);

GPIO_InitTypeDef結構體定義

typedef struct

{

uint32_t Pin;? ? ? ?/*!

*/

uint32_t Mode;? ? ? /*!< 設置引腳模式

*/

uint32_t Pull;? ? ? /*!< 引腳是否上拉或下拉

*/

uint32_t Speed;? ? ?/*!< 設置引腳速度

*/

} GPIO_InitTypeDef;

同時,不管是標準庫還是HAL庫,都是基于寄存器開發的,寄存器編程在哪個庫都是適用的

GPIO的相關配置寄存器

STM32的每組GPIO口包括7個寄存器。也就是說,每個寄存器可以控制一組GPIO的16個GPIO口。這7個寄存器分別為:

GPIOx_CRL:端口配置低寄存器(32位)

GPIOx_CRH:端口配置高寄存器(32位)

GPIOx_IDR:端口輸入寄存器(32位)

GPIOx_ODR:端口輸出寄存器(32位)

GPIOx_BSRR:端口位設置/清除寄存器(32位)

GPIOx_BRR:端口位清除寄存器(16位)

GPIOx_LCKR:端口配置鎖存寄存器(32位)

具體我們這里就不講了,篇幅有限,可以到《STM32中文參考手冊》中查看

關于GPIO的八種模式請參看 《STM32 GPIO八種模式及工作原理詳解》

按鍵消抖:

/**

* 函數功能: 按鍵外部中斷回調函數

* 輸入參數: GPIO_Pin:中斷引腳

* 返 回 值: 無

* 說? ? 明: 無

*/

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin==KEY1_GPIO_PIN)

{

HAL_Delay(20);/* 延時一小段時間,消除抖動 */

if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)

{

BEEP_TOGGLE;

LED1_ON;

LED2_ON;

LED3_ON;

}

__HAL_GPIO_EXTI_CLEAR_IT(KEY1_GPIO_PIN);

}

else if(GPIO_Pin==KEY2_GPIO_PIN)

{

HAL_Delay(20);/* 延時一小段時間,消除抖動 */

if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)

{

BEEP_TOGGLE;

LED1_OFF;

LED2_OFF;

LED3_OFF;

}

__HAL_GPIO_EXTI_CLEAR_IT(KEY2_GPIO_PIN);

}

}

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

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

相關文章

html5兼容ie

https://www.jb51.net/html5/143049.html轉載于:https://www.cnblogs.com/rivsidn/p/10913532.html

什么叫內部銀團_什么是紫鈦晶?紫鈦晶是不是天然水晶?

都說紫鈦晶是紫水晶與鈦晶的結合&#xff0c;聽上去好像這種水晶不是天然的&#xff0c;像是人工合成的&#xff0c;事實上并非如此&#xff0c;紫鈦晶也是天然形成的水晶&#xff0c;由于內部的包裹體是金色的&#xff0c;因此被稱為紫鈦晶。和菩心晶舍家的晶舞傾城一起了解紫…

如何使用Squid服務來構建=》傳統和透明代理服務器,通俗易懂!

1、緩存代理概述&#xff1a; 作為應用層的代理服務軟件&#xff0c;Squid主要提供緩存加速和應用層過濾控制的功能 2、代理的工作機制&#xff1a; &#xff08;1&#xff09;當客戶機通過代理來請求web頁面時&#xff0c;指定的代理服務器會先檢查自己的緩存&#xff0c;若緩…

排序算法-C++實現

#include <iostream>using namespace std;void show(int M[], int n) {for(int i0; i<n; i)cout<<M[i]<<" ";cout<<endl; }//快速排序 void quick_sort(int M[], int left, int right) {if(left < right){int i,j,x;i left;j right;…

Bootstrap開發框架視頻整理

最近到客戶處進行實地培訓&#xff0c;整理了很多培訓的材料&#xff0c;現將它們錄制相關主題的視頻&#xff0c;作為我的Bootstrap開發框架的知識補充&#xff0c;希望給感興趣的朋友進行了解。培訓內容主要包括基礎框架部分、MVC框架部分、Bootstrap框架部分、Bootstrap重要…

安卓隨機通話記錄_Android 通話記錄

查詢通話記錄private static final String[] CALLLOGS_PROJECTION new String[]{CallLog.Calls._ID,CallLog.Calls.CACHED_NAME, CallLog.Calls.NUMBER, CallLog.Calls.TYPE, CallLog.Calls.DATE,CallLog.Calls.DURATION};/*** * 概述&#xff1a;獲取最近10條通話記錄 */publ…

【c基礎】入門語法

%d:占位符 表示要輸出一個整形數。 %f:為float 浮點數 %lf:為double型 雙精度浮點數 \n:換行 const:定義一個常量,一旦被初始化就不能修改&#xff0c;只讀的變量&#xff08;read-only variable&#xff09;。 整數運算 的結果是整數 如果有小數就拋棄沒有考慮四舍五入。 一&a…

vue的移動app項目中,自定義拖拽指令的問題

使用vue的都知道vue有一個自定義指令&#xff0c;我比較喜歡的就是拖拽的自定義指令&#xff0c;感覺挺方便的&#xff01; //組件內的拖拽指令 directives: {//組建內自定義指令drag: {// 指令的定義bind: function(el, value) {let oDiv el; //當前元素let self this; //上…

彈窗php整人_[整人小程序] 超級信息框(無限彈窗++)

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓貌似剛才縮進空格被吞了&#xff0c;再發一次Set FSO  createobject("scripting.filesystemobject")Set ws  Createobject("Wscript.shell")Set SA  CreateObject("Shell.Application")If …

day22 Java學習 IO流(序列流)

IO流&#xff08;序列流&#xff09; 序列流&#xff1a; * 可以把多個字節輸入流整合成一個&#xff0c;從序列流中讀取數據時&#xff0c;將從被整合的第一個流開始讀&#xff0c;讀完一個之后繼續讀第二個。 整合方式&#xff1a; * Seq uenceInputStream ( InputStream &am…

網站建設-簡單動態網站搭建

通過前面Clouder課程的學習&#xff0c;或許你已經掌握了在云服務器上發布和部署靜態網頁的方法&#xff0c;那么如何搭建一個可以隨時更新內容的動態網站&#xff1f;通過本課程的學習&#xff0c;你將掌握如何在云端搭建全世界使用最多的WordPress網站的方法&#xff0c;并學…

mysql的concat函數_MySQL中concat函數(連接字符串)

MySQL中concat函數使用方法&#xff1a;CONCAT(str1,str2,…)返回結果為連接參數產生的字符串。如有任何一個參數為NULL &#xff0c;則返回值為 NULL。注意&#xff1a;如果所有參數均為非二進制字符串&#xff0c;則結果為非二進制字符串。如果自變量中含有任一二進制字符串&…

利用airTest的圖像實別技術測試Web應用

airTest的第三方類庫中有圖像實別功能&#xff0c;根據官網的介紹&#xff0c;這個功能是能夠在Windows上用來定位元素&#xff0c;進行操作的。嘗試過以下腳本&#xff0c;發現真的可以。 from selenium.webdriver.chrome.options import Options from selenium import webdri…

MySQL主從復制故障解決

叢庫復制停止&#xff0c;進叢庫查看&#xff0c;報錯1007&#xff0c;數據庫已存在&#xff0c;不能創建數據庫 mysql> show slave status\G; Slave_IO_Running: Yes Slave_SQL_Running: No Last_Errno: 1007 Last_Error: Error Cant create database test; database exis…

Unraveling the JPEG file

(文章還剩實踐部分沒寫&#xff0c;答辯過后補上...) JPEG文件在當下數字化生活中是無處不在的&#xff0c;但是在熟悉的JPEG面紗背后&#xff0c;隱藏著一些算法&#xff0c;它們去除了人類眼中無法察覺到的細節。這產生了最高的視覺質量與最小的文件大小。讓我們來看看這一算…

mysql interval 3 day_Mysql之INTERVAL與DATE_SUB與EXTRACT函數的使用

1. INTERVALINTERVAL代表的是時間間隔MySQL中的時間間隔類型有如下幾種:1.1 利用INTERVAL做時間的加減法示例&#xff1a;加法:SQL>SELECT DATE 2018-11-01 INTERVAL 10 11 DAY_HOUR;結果:2018-11-11 11:00:00減法&#xff1a;SQL> select date 2018-11-11 11:00:00 -INT…

(二十四)面向對象

class Car {int num;String name;String color;public static void run() {System.out.println("行駛中");} } //再類中定義的變量&#xff1a;成員變量 //在類中定義的函數&#xff1a;成員函數 class Demo1 {public static void main(String[] args) {//創建一個ca…

mysql 三主_MySQL主主復制3

一、創建并授權用戶在每一臺(主)服務器上創建一個用戶&#xff0c;并為之授權&#xff0c;使它們可以互相訪問彼此的數據庫在Server-1上&#xff1a;創建一個充許Server-2來訪問的用戶server2,密碼為&#xff1a;server2mysql> GRANT REPLICATION SLAVE ON *.*> TO ‘ser…

0727日志

為什么80%的碼農都做不了架構師&#xff1f;>>> c端線上地址 http://x.diandanme.com/fe/?d183#/ 什么時候來需求&#xff0c;我做好準備了嗎&#xff1f; eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC94LmRpYW5kYW5tZS5jb21cL2FwaVwvd2VjaGF0XC…

Python基礎學習總結__Day3

一、集合 1&#xff0e;特性&#xff1a;無序且天生去重&#xff0c;格式為{} 2&#xff0e;作用&#xff1a; &#xff08;1&#xff09;去重 &#xff08;2&#xff09;關系測試 3&#xff0e;可調用函數&#xff08;常見對列表操作&#xff09; &#xff08;1&#xff09;取…