0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32庫(kù)函數(shù)與寄存器開發(fā)區(qū)別

冬至子 ? 來(lái)源:Qt歷險(xiǎn)記 ? 作者:諾蘇編程 ? 2023-10-31 16:04 ? 次閱讀

**1.1 **寄存器

寄存器開發(fā)優(yōu)點(diǎn)

直接操作寄存器,運(yùn)行效率高。

寄存器開發(fā)缺點(diǎn)

1、開發(fā)難度大,開發(fā)周期長(zhǎng)

2、代碼可閱讀性差,可移植差

3、后期維護(hù)難度高

1.2****庫(kù)函數(shù)

庫(kù)函數(shù)開發(fā)優(yōu)點(diǎn)

1、開發(fā)難度較小,開發(fā)周期短

2、代碼可閱讀性強(qiáng),可移植高

3、后期維護(hù)難度低

庫(kù)函數(shù)開發(fā)缺點(diǎn)

相對(duì)于寄存器開發(fā),運(yùn)行效率略低

注意:庫(kù)函數(shù)其實(shí)是ST公司對(duì)寄存器的進(jìn)一步封裝。

圖片

一、 庫(kù)函數(shù)開發(fā)LED

庫(kù)函數(shù)開發(fā)LED要添加的庫(kù)函數(shù)文件:stm32f4xx_gpio.c

圖片

1、理解led燈原理圖

LED0連接在PF9

PF9輸出低電平(0),燈亮;PF9輸出高電平(0),燈滅;

圖片

2、打開GPIOF組時(shí)鐘

在STM32芯片中,所有的外設(shè)時(shí)鐘是不打開,為了降低功耗

//打開GPIOF組時(shí)鐘
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

3、設(shè)置PF9燈為輸出模式 輸出推挽 上拉 速度(50MHZ)

GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_9;    //引腳
GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //輸出模式
GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //輸出推挽
GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz;  //速度50MHZ
GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉
GPIO_Init(GPIOF, &GPIO_InitStruct);

4、通過(guò)下面控制LED燈亮與滅

GPIO_SetBits()   引腳置1
GPIO_ResetBits() 引腳置0

官方參考案例

路徑:D:GZFX2103STM32STM32上課資料STM32F4xx固件庫(kù)stm32f4_dsp_stdperiph_libSTM32F4xx_DSP_StdPeriph_Lib_V1.4.0stm32f4xx_dsp_stdperiph_lib_um.chm官方參考案例

圖片

三、 按鍵庫(kù)函數(shù)開發(fā)

庫(kù)函數(shù)開發(fā)按鍵要添加的庫(kù)函數(shù)文件:stm32f4xx_gpio.c

1、理解按鍵控制原理

KEY0連接在PA0

按鍵未按下,PA0為高電平

按鍵 按下,PA0為低電平

圖片

2、打開GPIOA組時(shí)鐘

//打開GPIOA組時(shí)鐘
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

3、設(shè)置引腳為輸入,上拉。

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  GPIO_InitTypeDef  GPIO_InitStruct;


  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_0;        //引腳0
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;        //輸入模式
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;        //上拉
  GPIO_Init(GPIOA, &GPIO_InitStruct);

4、通過(guò)下面函數(shù)獲取引腳電平

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

一、 中斷

中斷概念

中斷是指計(jì)算機(jī)運(yùn)行過(guò)程中,出現(xiàn)某些意外情況需主機(jī)干預(yù)時(shí),機(jī)器能自動(dòng)停止正在運(yùn)行的程序并轉(zhuǎn)入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續(xù)運(yùn)行(面試題)。

圖片

圖片

STM32外部中部需要注重知識(shí)點(diǎn)EXTINVIC ,STM32所有引腳均可以做為外部中斷。

4.1、外部中斷 / **事件控制器 ** (EXTI)

EXTI 控制器的主要特性如下:
● 每個(gè)中斷/事件線上都具有獨(dú)立的觸發(fā)和屏蔽
● 每個(gè)中斷線都具有專用的狀態(tài)位
● 支持多達(dá) 23 個(gè)軟件事件/中斷請(qǐng)求
檢測(cè)脈沖寬度低于 APB2 時(shí)鐘寬度的外部信號(hào)。有關(guān)此參數(shù)的詳細(xì)信息,請(qǐng)參見
STM32F4xx 數(shù)據(jù)手冊(cè)的電氣特性部分。

引腳中斷線

圖片

上升沿:數(shù)字電路中,數(shù)字電平從低電平(數(shù)字“0”)變?yōu)楦唠娖剑〝?shù)字“1”)的那一瞬間(時(shí)刻)叫作上升沿。

下降沿:數(shù)字電路中,數(shù)字電平從高電平(數(shù)字“1”)變?yōu)榈碗娖剑〝?shù)字“0”)的那一瞬間叫作下降沿。

圖片

4.2 NVIC

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

**NVIC **特性
嵌套向量中斷控制器 NVIC 包含以下特性:
● STM32F405xx/07xx 和 STM32F415xx/17xx 具有 82 個(gè)可屏蔽中斷通道, STM32F42xxx
和 STM32F43xxx 具有多達(dá) 86 個(gè)可屏蔽中斷通道(不包括 Cortex?-M4F 的 16 根中
斷線)
● 16 個(gè)可編程優(yōu)先級(jí)(使用了 4 位中斷優(yōu)先級(jí))
● 低延遲異常和中斷處理
電源管理控制
● 系統(tǒng)控制寄存器的實(shí)現(xiàn)
嵌套向量中斷控制器 (NVIC) 和處理器內(nèi)核接口緊密配合,可以實(shí)現(xiàn)低延遲的中斷處理和晚
到中斷的高效處理。

NVIC優(yōu)先級(jí)分為搶占優(yōu)先級(jí)與響應(yīng)優(yōu)先級(jí)。

數(shù)字越小,優(yōu)先級(jí)別越高

優(yōu)先級(jí)分組

圖片

搶占優(yōu)先級(jí) & 響應(yīng)優(yōu)先級(jí)區(qū)別: 搶占優(yōu)先級(jí) > 響應(yīng)優(yōu)先級(jí)

高優(yōu)先級(jí)的搶占優(yōu)先級(jí)是可以打斷正在進(jìn)行的低搶占優(yōu)先級(jí)中斷的。

搶占優(yōu)先級(jí)相同的中斷,高響應(yīng)優(yōu)先級(jí)不可以打斷低響應(yīng)優(yōu)先級(jí)的中斷。

搶占優(yōu)先級(jí)相同的中斷,當(dāng)兩個(gè)中斷同時(shí)發(fā)生的情況下,哪個(gè)響應(yīng)優(yōu)先級(jí)高,哪個(gè)先執(zhí)行。

如果兩個(gè)中斷的搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)都是一樣的話,則看哪個(gè)中斷先發(fā)生就先執(zhí)行;

例:

假定設(shè)置中斷優(yōu)先級(jí)組為2,然后設(shè)置中斷3(RTC中斷)的搶占優(yōu)先級(jí)為2,響應(yīng)優(yōu)先級(jí)為1。中斷6(外部中斷0)的搶占優(yōu)先級(jí)為3,響應(yīng)優(yōu)先級(jí)為0。中斷7(外部中斷1)的搶占優(yōu)先級(jí)為2,響應(yīng)優(yōu)先級(jí)為0。

中斷7>中斷3>中斷6。

4.3****外部中斷配置流程

外部中斷配置流程要添加的庫(kù)函數(shù):stm32f4xx_exti.c和stm32f4xx_syscfg.c

圖片

參考庫(kù)函數(shù)案例

圖片

1、理解按鍵原理

KEY0 連接PA0,選擇下降沿觸發(fā)

圖片

1、設(shè)置NVIC分組

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

3、使能SYSCFG及GPIOA****時(shí)鐘:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

4、 初始化IO口為輸入。

GPIO_Init();

5、設(shè)置IO口與中斷線的映射關(guān)系。

void SYSCFG_EXTILineConfig();

6、初始化線上中斷,設(shè)置觸發(fā)條件等。

EXTI_Init();

7、配置中斷分組(NVIC),并使能中斷。

NVIC_Init();

8、 編寫中斷服務(wù)函數(shù)。

EXTIx_IRQHandler();

9、清除中斷標(biāo)志位

EXTI_ClearITPendingBit();

五、函數(shù)說(shuō)明

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)

函數(shù)功能:使能AHB1外設(shè)時(shí)鐘

返回值:無(wú)

uint32_t RCC_AHB1Periph:哪個(gè)外設(shè)

FunctionalState NewState:ENABLE or DISABLE


void GPIO_Init(GPIO_TypeDef GPIOx, GPIO_InitTypeDef GPIO_InitStruct)**

函數(shù)功能:GPIO初始化

返回值:無(wú)

GPIO_TypeDef* GPIOx:哪個(gè)GPIO組

GPIO_InitTypeDef* GPIO_InitStruct:GPIO結(jié)構(gòu)

typedef struct

{

uint32_t GPIO_Pin;              //哪個(gè)引腳

GPIOMode_TypeDef GPIO_Mode;     //模式

GPIOSpeed_TypeDef GPIO_Speed;   //速度

GPIOOType_TypeDef GPIO_OType;   //輸出類型

GPIOPuPd_TypeDef GPIO_PuPd;     //上下拉

}GPIO_InitTypeDef;


void GPIO_SetBits(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin) *

函數(shù)說(shuō)明:引腳置位

函數(shù)返回值:無(wú)

GPIO_TypeDef* GPIOx:哪個(gè)組IO

uint16_t GPIO_Pin:哪個(gè)引腳


void GPIO_ResetBits(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin) *

函數(shù)說(shuō)明:引腳復(fù)位

函數(shù)返回值:無(wú)

GPIO_TypeDef* GPIOx:哪個(gè)組IO

uint16_t GPIO_Pin:哪個(gè)引腳

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin) * ;

函數(shù)說(shuō)明:讀某個(gè)引腳輸入狀態(tài)

函數(shù)返回值:

Bit_RESET = 0 (低電平)

Bit_SET = 1 (高電平)

GPIO_TypeDef* GPIOx:哪個(gè)組IO

uint16_t GPIO_Pin:哪個(gè)引腳

void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)

函數(shù)說(shuō)明:設(shè)置IO口與中斷線的映射

函數(shù)返回值:無(wú)

uint8_t EXTI_PortSourceGPIOx:哪個(gè)組IO

uint8_t EXTI_PinSourcex:哪個(gè)引腳

void EXTI_Init(EXTI_InitTypeDef EXTI_InitStruct) *

函數(shù)說(shuō)明:外部中斷控制器初始化

返回值:無(wú)

typedef struct

{

uint32_t EXTI_Line;                //中斷線

EXTIMode_TypeDef EXTI_Mode;       //模式

EXTITrigger_TypeDef EXTI_Trigger; //觸發(fā)條件

FunctionalState EXTI_LineCmd;     //中斷線命令

}EXTI_InitTypeDef;

void NVIC_Init(NVIC_InitTypeDef NVIC_InitStruct) *

函數(shù)說(shuō)明:NVIC初始化

返回值:無(wú)

NVIC_InitTypeDef* NVIC_InitStruct:NVIC結(jié)構(gòu)體

typedef struct

{

uint8_t NVIC_IRQChannel;                    //中斷通道,可在stm32f4xx.h文件當(dāng)中查找

uint8_t NVIC_IRQChannelPreemptionPriority;  //搶占優(yōu)先級(jí)

uint8_t NVIC_IRQChannelSubPriority;         //響應(yīng)優(yōu)先級(jí)

FunctionalState NVIC_IRQChannelCmd;         //中斷通道使能

} NVIC_InitTypeDef;

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

函數(shù)說(shuō)明:判斷中斷線標(biāo)志位

返回值:SET或RESET

uint32_t EXTI_Line:哪個(gè)中斷線

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

函數(shù)說(shuō)明:清空中斷線標(biāo)志位

返回值:無(wú)

uint32_t EXTI_Line:哪個(gè)中斷線

六、應(yīng)用產(chǎn)品

1、LED

家用LED

指示燈

按鍵

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • led燈
    +關(guān)注

    關(guān)注

    22

    文章

    1591

    瀏覽量

    107655
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5271

    瀏覽量

    119654
  • STM32
    +關(guān)注

    關(guān)注

    2263

    文章

    10847

    瀏覽量

    353779
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1182

    瀏覽量

    51739
  • STM32F4
    +關(guān)注

    關(guān)注

    3

    文章

    194

    瀏覽量

    27950
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    庫(kù)函數(shù)寄存器區(qū)別

    0. 庫(kù)函數(shù)寄存器區(qū)別本質(zhì)上是一樣的??梢栽?b class='flag-5'>庫(kù)函數(shù)模板里面,直接操作寄存器,因?yàn)楣俜綆?kù)相關(guān)頭文件有
    發(fā)表于 08-10 06:23

    庫(kù)函數(shù)寄存器開發(fā)區(qū)別

    庫(kù)函數(shù)寄存器開發(fā)區(qū)別寄存器寄存器開發(fā)優(yōu)點(diǎn)直接操作寄存器,運(yùn)行效率高。
    發(fā)表于 08-16 06:56

    庫(kù)函數(shù)寄存器開發(fā)區(qū)別是什么?

    庫(kù)函數(shù)寄存器開發(fā)區(qū)別是什么?
    發(fā)表于 11-17 07:21

    STM32庫(kù)函數(shù)/寄存器/位是什么

    STM32庫(kù)函數(shù)/寄存器/位是什么
    發(fā)表于 11-29 07:07

    庫(kù)函數(shù)寄存器操作的區(qū)別

    。庫(kù)函數(shù)寄存器操作的區(qū)別可能和 C 語(yǔ)言與匯編語(yǔ)言的區(qū)別差不多吧,都是跟效率有關(guān),但有時(shí)候效率并不是唯一指標(biāo)。我們都知道 C 語(yǔ)言的效率要比匯編低,但是現(xiàn)在絕大多數(shù)嵌入式
    發(fā)表于 11-29 06:32

    STM32庫(kù)函數(shù)寄存器區(qū)別是什么

    庫(kù)函數(shù)版和寄存器版的系統(tǒng)時(shí)鐘設(shè)置的區(qū)別:**1.**庫(kù)函數(shù)的目的是讓用戶應(yīng)用的,而寄存器更加原始庫(kù)函數(shù)
    發(fā)表于 01-05 07:30

    寄存器庫(kù)函數(shù)和HAL庫(kù)這些都是什么區(qū)別

    STM32F1精英版(芯片型號(hào):STM32F103ZET6)常見問(wèn)題解答:1.正點(diǎn)原子里標(biāo)準(zhǔn)例程分為寄存器,庫(kù)函數(shù)和HAL庫(kù),這些都是什么區(qū)別
    發(fā)表于 02-28 06:34

    STM32庫(kù)函數(shù)寄存器應(yīng)該如何操作

    從開始接觸51單片機(jī),到現(xiàn)在開始轉(zhuǎn)型學(xué)習(xí)功能更加強(qiáng)大的STM32f407系列,學(xué)習(xí)過(guò)程中引入了庫(kù)函數(shù)及相應(yīng)操作,當(dāng)時(shí)趕著進(jìn)度做點(diǎn)東西出來(lái),有點(diǎn)不求甚解。現(xiàn)在返回來(lái)求索:相比于原來(lái)51單片機(jī)的寄存器
    發(fā)表于 09-10 17:26 ?3次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>庫(kù)函數(shù)</b>和<b class='flag-5'>寄存器</b>應(yīng)該如何操作

    stm32是如何將寄存器值通過(guò)標(biāo)準(zhǔn)庫(kù)寫入寄存器的?

    stm32是如何將配置從庫(kù)函數(shù)調(diào)用一步一步到寄存器的?0. 前言1.綜述1.1 流程2.正式開始2.1 LED庫(kù)函數(shù)初始化2.2 GPIO_TypeDef2.3 GPIOA的訪問(wèn)方法2
    發(fā)表于 12-16 16:58 ?18次下載
    <b class='flag-5'>stm32</b>是如何將<b class='flag-5'>寄存器</b>值通過(guò)標(biāo)準(zhǔn)庫(kù)寫入<b class='flag-5'>寄存器</b>的?

    基于標(biāo)準(zhǔn)庫(kù)函數(shù)與基于HAL庫(kù)函數(shù)stm32編程方式對(duì)比

    一、基于標(biāo)準(zhǔn)庫(kù)函數(shù)stm32編程方式二、基于HAL庫(kù)函數(shù)stm32編程方式差異上面也提到了,STM32有非常多的
    發(fā)表于 12-28 19:09 ?30次下載
    基于標(biāo)準(zhǔn)<b class='flag-5'>庫(kù)函數(shù)</b>與基于HAL<b class='flag-5'>庫(kù)函數(shù)</b>的<b class='flag-5'>stm32</b>編程方式對(duì)比

    2021-04-17 STM32串口寄存器庫(kù)函數(shù)配置

    STM32串口寄存器庫(kù)函數(shù)配置方法STM32常用寄存器庫(kù)函數(shù)串口配置一般步驟(串口實(shí)例)常用的
    發(fā)表于 12-28 19:13 ?7次下載
    2021-04-17  <b class='flag-5'>STM32</b>串口<b class='flag-5'>寄存器</b><b class='flag-5'>庫(kù)函數(shù)</b>配置

    STM32寄存器操作

    STM32寄存器操作在使用STM32單片機(jī)編程時(shí)一般都用ST給的庫(kù)函數(shù)編程,庫(kù)函數(shù)編程的底層就是對(duì)單片機(jī)
    發(fā)表于 01-13 15:43 ?19次下載
    <b class='flag-5'>STM32</b>的<b class='flag-5'>寄存器</b>操作

    STM32庫(kù)函數(shù)開發(fā)-GPIO

    2021-01-11 學(xué)習(xí)日志STM32f1庫(kù)函數(shù)開發(fā)學(xué)習(xí)實(shí)戰(zhàn)一 · I/O口1. 文件夾結(jié)構(gòu)2. 配置細(xì)節(jié) · 從寄存器庫(kù)函數(shù)3. 跑馬
    發(fā)表于 01-13 16:17 ?14次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>庫(kù)函數(shù)</b><b class='flag-5'>開發(fā)</b>-GPIO

    STM32F103使用(3.5)庫(kù)函數(shù)新建工程

    意法半導(dǎo)體的STM32系列都支持庫(kù)函數(shù)編程,庫(kù)函數(shù)比常規(guī)的寄存器方式編程更加好移植,特別是項(xiàng)目需要在幾個(gè)系列芯片上移植,使用庫(kù)函數(shù)編程,底層
    的頭像 發(fā)表于 05-28 14:00 ?3417次閱讀
    <b class='flag-5'>STM32</b>F103使用(3.5)<b class='flag-5'>庫(kù)函數(shù)</b>新建工程

    基于STM32F407庫(kù)函數(shù)開發(fā)按鍵控制LED燈

    STM32庫(kù)函數(shù)實(shí)際是ST公司對(duì)寄存器開發(fā)封裝。
    的頭像 發(fā)表于 05-19 15:09 ?2258次閱讀
    基于<b class='flag-5'>STM32</b>F407<b class='flag-5'>庫(kù)函數(shù)</b><b class='flag-5'>開發(fā)</b>按鍵控制LED燈