日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

stm32cubeide外部中断_【STM32】HAL库 STM32CubeMX教程三----外部中断(HAL库GPIO讲解)

發(fā)布時(shí)間:2023/12/9 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32cubeide外部中断_【STM32】HAL库 STM32CubeMX教程三----外部中断(HAL库GPIO讲解) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

上一節(jié)我們講解了STM32CubeMX的基本使用和工程的配置,那么這一節(jié)我們正式來(lái)學(xué)習(xí)CubeMX配置STM32的各個(gè)外設(shè)功能了

今天我們會(huì)詳細(xì)的帶你學(xué)習(xí)STM32CubeMX配置外部中斷,并且講解HAL庫(kù)的GPIO的各種函數(shù),帶你學(xué)習(xí)不一樣的STM32

那么話不多說(shuō),我們開(kāi)始正式的講解吧!

準(zhǔn)備工作:

1、STM32開(kāi)發(fā)板(我的是STM32F407ZE和STM32F103RC)

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

3、STM32F1xx/STM32F4xxHAL庫(kù)

4、按鍵管腳? PA11? PB4

5? ?LED管腳 PC4 PC5 PB0 PB1

1新建工程

1.1New Project

1 搜索芯片型號(hào)

2選擇芯片

3創(chuàng)建工程

1.2設(shè)置RCC

1 點(diǎn)擊RCC

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

3 軟件自動(dòng)配置管腳

1.3GPIO初始化

LED:4個(gè)GPIO_OUTPUT (輸出模式)

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

1 點(diǎn)擊對(duì)應(yīng)管腳

2 設(shè)置對(duì)應(yīng)模式

GPIO的各種模式設(shè)置

GPIO output level? ?引腳電平設(shè)置? ?高/低

GPIO mode? ?GPIO模式? ? ?推挽輸出/開(kāi)漏輸出

GPIO Pull-up/Pull-dowm? ?上拉下拉電阻? ? ??上拉電阻/下拉電阻/無(wú)上拉或下拉

Maxinum output speed? ?引腳速度設(shè)置? ?低速/中速/高速

User Label? ? 用戶標(biāo)簽? ?給引腳設(shè)置名稱? 如LED0

這里可以看出看和我們使用庫(kù)函數(shù)的時(shí)候配置是一樣的,但我們只需要?jiǎng)訋紫率髽?biāo)便可以完成操作,這正是STM32CubeMX的強(qiáng)大之處

GPIO_EXIT的6種模式

我們的按鍵選擇下降沿觸發(fā)

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

1點(diǎn)擊NVIC2 勾選EXIT Line

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

1.5時(shí)鐘源設(shè)置

1選擇外部時(shí)鐘HSE 8MHz

2PLL鎖相環(huán)倍頻9倍

3系統(tǒng)時(shí)鐘來(lái)源選擇為PLL

4設(shè)置APB1分頻器為 /2

1 設(shè)置項(xiàng)目名稱

2 設(shè)置存儲(chǔ)路徑

3 選擇所用IDE

1.7創(chuàng)建工程文件

然后點(diǎn)擊GENERATE CODE??創(chuàng)建工程

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

我們看到他有一個(gè)HAL_GPIO_EXTI_IRQHandler();函數(shù)

Go To Definition 查看一下函數(shù)代碼

和我們庫(kù)函數(shù)配置差不多,就是清除中斷標(biāo)志位,之后進(jìn)入中斷回調(diào)函數(shù)中

在HAL庫(kù)中,中斷運(yùn)行結(jié)束后不會(huì)立刻退出,而是會(huì)先進(jìn)入相對(duì)應(yīng)的中斷回調(diào)函數(shù),處理該函數(shù)中的代碼之后,才會(huì)退出中斷,所以在HAL庫(kù)中我們一般將中斷需要處理代碼放在中斷回調(diào)函數(shù)中,

配置下載工具

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

所有自己編寫(xiě)的代碼請(qǐng)放在/* USER CODE BEGIN XXX */ ? /* USER CODE END XXX */之間

這樣我們修改工程的時(shí)候你自己寫(xiě)的代碼就不會(huì)被刪除

HAL庫(kù) GPIO函數(shù)庫(kù)講解

在正常使用中,除了STM32CubeMX配置之外,我們有時(shí)候還需要自己配置一些東西,學(xué)習(xí)并理解HAL庫(kù),也是我們必須要學(xué)習(xí)的一個(gè)地方

首先打開(kāi)stm32f4xx_hal_gpio.h? 發(fā)現(xiàn)一共定義有8個(gè)函數(shù)

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初始化

實(shí)例:HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);

功能:在函數(shù)初始化之后的引腳恢復(fù)成默認(rèn)的狀態(tài),即各個(gè)寄存器復(fù)位時(shí)的值

實(shí)例:HAL_GPIO_Init(GPIOC, GPIO_PIN_4);

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:讀取引腳的電平狀態(tài)、函數(shù)返回值為0或1

實(shí)例:HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);

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

功能:引腳寫(xiě)0或1

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

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

翻轉(zhuǎn)引腳的電平狀態(tài)

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

HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:鎖住引腳電平,比如說(shuō)一個(gè)管腳的當(dāng)前狀態(tài)是1,當(dāng)這個(gè)管腳電平變化時(shí)保持鎖定時(shí)的值。

實(shí)例:HAL_GPIO_LockPin(GPIOC, GPIO_PIN_4);

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);

功能:? 外部中斷服務(wù)函數(shù),清除中斷標(biāo)志位

實(shí)例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

功能:? 中斷回調(diào)函數(shù),可以理解為中斷函數(shù)具體要響應(yīng)的動(dòng)作。

實(shí)例:HAL_GPIO_EXTI_Callback(GPIO_PIN_4);

GPIO_InitTypeDef結(jié)構(gòu)體定義

typedef struct

{

uint32_t Pin;? ? ? ?/*!

*/

uint32_t Mode;? ? ? /*!< 設(shè)置引腳模式

*/

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

*/

uint32_t Speed;? ? ?/*!< 設(shè)置引腳速度

*/

} GPIO_InitTypeDef;

同時(shí),不管是標(biāo)準(zhǔn)庫(kù)還是HAL庫(kù),都是基于寄存器開(kāi)發(fā)的,寄存器編程在哪個(gè)庫(kù)都是適用的

GPIO的相關(guān)配置寄存器

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

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

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

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

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

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

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

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

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

關(guān)于GPIO的八種模式請(qǐng)參看 《STM32 GPIO八種模式及工作原理詳解》

按鍵消抖:

/**

* 函數(shù)功能: 按鍵外部中斷回調(diào)函數(shù)

* 輸入?yún)?shù): GPIO_Pin:中斷引腳

* 返 回 值: 無(wú)

* 說(shuō)? ? 明: 無(wú)

*/

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin==KEY1_GPIO_PIN)

{

HAL_Delay(20);/* 延時(shí)一小段時(shí)間,消除抖動(dòng) */

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);/* 延時(shí)一小段時(shí)間,消除抖動(dòng) */

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);

}

}

總結(jié)

以上是生活随笔為你收集整理的stm32cubeide外部中断_【STM32】HAL库 STM32CubeMX教程三----外部中断(HAL库GPIO讲解)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。