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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

冬至子 ? 來源:Qt歷險記 ? 作者:諾蘇編程 ? 2023-10-31 16:04 ? 次閱讀

**1.1 **寄存器

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

直接操作寄存器,運行效率高。

寄存器開發(fā)缺點

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

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

3、后期維護難度高

1.2****庫函數

庫函數開發(fā)優(yōu)點

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

2、代碼可閱讀性強,可移植高

3、后期維護難度低

庫函數開發(fā)缺點

相對于寄存器開發(fā),運行效率略低

注意:庫函數其實是ST公司對寄存器的進一步封裝。

圖片

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

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

圖片

1、理解led燈原理圖

LED0連接在PF9

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

圖片

2、打開GPIOF組時鐘

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

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

3、設置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、通過下面控制LED燈亮與滅

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

官方參考案例

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

圖片

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

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

1、理解按鍵控制原理

KEY0連接在PA0

按鍵未按下,PA0為高電平

按鍵 按下,PA0為低電平

圖片

2、打開GPIOA組時鐘

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

3、設置引腳為輸入,上拉。

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、通過下面函數獲取引腳電平

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

一、 中斷

中斷概念

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

圖片

圖片

STM32外部中部需要注重知識點EXTINVIC ,STM32所有引腳均可以做為外部中斷。

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

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

引腳中斷線

圖片

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

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

圖片

4.2 NVIC

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

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

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

數字越小,優(yōu)先級別越高

優(yōu)先級分組

圖片

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

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

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

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

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

例:

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

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

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

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

圖片

參考庫函數案例

圖片

1、理解按鍵原理

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

圖片

1、設置NVIC分組

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

3、使能SYSCFG及GPIOA****時鐘:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

4、 初始化IO口為輸入。

GPIO_Init();

5、設置IO口與中斷線的映射關系。

void SYSCFG_EXTILineConfig();

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

EXTI_Init();

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

NVIC_Init();

8、 編寫中斷服務函數。

EXTIx_IRQHandler();

9、清除中斷標志位

EXTI_ClearITPendingBit();

五、函數說明

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)

函數功能:使能AHB1外設時鐘

返回值:無

uint32_t RCC_AHB1Periph:哪個外設

FunctionalState NewState:ENABLE or DISABLE


void GPIO_Init(GPIO_TypeDef GPIOx, GPIO_InitTypeDef GPIO_InitStruct)**

函數功能:GPIO初始化

返回值:無

GPIO_TypeDef* GPIOx:哪個GPIO組

GPIO_InitTypeDef* GPIO_InitStruct:GPIO結構

typedef struct

{

uint32_t GPIO_Pin;              //哪個引腳

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

函數說明:引腳置位

函數返回值:無

GPIO_TypeDef* GPIOx:哪個組IO

uint16_t GPIO_Pin:哪個引腳


void GPIO_ResetBits(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin) *

函數說明:引腳復位

函數返回值:無

GPIO_TypeDef* GPIOx:哪個組IO

uint16_t GPIO_Pin:哪個引腳

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin) * ;

函數說明:讀某個引腳輸入狀態(tài)

函數返回值:

Bit_RESET = 0 (低電平)

Bit_SET = 1 (高電平)

GPIO_TypeDef* GPIOx:哪個組IO

uint16_t GPIO_Pin:哪個引腳

void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)

函數說明:設置IO口與中斷線的映射

函數返回值:無

uint8_t EXTI_PortSourceGPIOx:哪個組IO

uint8_t EXTI_PinSourcex:哪個引腳

void EXTI_Init(EXTI_InitTypeDef EXTI_InitStruct) *

函數說明:外部中斷控制器初始化

返回值:無

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

函數說明:NVIC初始化

返回值:無

NVIC_InitTypeDef* NVIC_InitStruct:NVIC結構體

typedef struct

{

uint8_t NVIC_IRQChannel;                    //中斷通道,可在stm32f4xx.h文件當中查找

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

uint8_t NVIC_IRQChannelSubPriority;         //響應優(yōu)先級

FunctionalState NVIC_IRQChannelCmd;         //中斷通道使能

} NVIC_InitTypeDef;

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

函數說明:判斷中斷線標志位

返回值:SET或RESET

uint32_t EXTI_Line:哪個中斷線

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

函數說明:清空中斷線標志位

返回值:無

uint32_t EXTI_Line:哪個中斷線

六、應用產品

1、LED

家用LED

指示燈

按鍵

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • led燈
    +關注

    關注

    22

    文章

    1592

    瀏覽量

    107996
  • 寄存器
    +關注

    關注

    31

    文章

    5343

    瀏覽量

    120348
  • STM32
    +關注

    關注

    2270

    文章

    10900

    瀏覽量

    355981
  • GPIO
    +關注

    關注

    16

    文章

    1204

    瀏覽量

    52091
  • STM32F4
    +關注

    關注

    3

    文章

    194

    瀏覽量

    28056
收藏 人收藏

    評論

    相關推薦

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

    0. 庫函數寄存器區(qū)別本質上是一樣的??梢栽?b class='flag-5'>庫函數模板里面,直接操作寄存器,因為官方庫相關頭文件有
    發(fā)表于 08-10 06:23

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

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

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

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

    STM32庫函數/寄存器/位是什么

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

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

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

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

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

    stm32寄存器版矩陣鍵盤庫函數(附詳細注釋)

    新系列采用LQFP64、LQFP100和LFBGA100三種封裝,不同的封裝保持引腳排列一致性,結合STM32平臺的設計理念,開發(fā)人員通過選擇產品可重新優(yōu)化功能、存儲、性能和引腳數量,以最小的硬件變化來滿足個性化的應用需求。本
    發(fā)表于 02-09 11:48 ?5432次閱讀

    STM32庫函數寄存器應該如何操作

    從開始接觸51單片機,到現在開始轉型學習功能更加強大的STM32f407系列,學習過程中引入了庫函數及相應操作,當時趕著進度做點東西出來,有點不求甚解?,F在返回來求索:相比于原來51單片機的寄存器
    發(fā)表于 09-10 17:26 ?3次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>庫函數</b>和<b class='flag-5'>寄存器</b>應該如何操作

    stm32下標準庫函數與HAL庫函數編程方式的差異

    stm32下標準庫函數與HAL庫函數編程方式的差異標準庫函數HAL庫函數標準庫函數與HAL
    發(fā)表于 12-09 14:21 ?15次下載
    <b class='flag-5'>stm32</b>下標準<b class='flag-5'>庫函數</b>與HAL<b class='flag-5'>庫函數</b>編程方式的差異

    stm32是如何將寄存器值通過標準庫寫入寄存器的?

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

    2021-04-17 STM32串口寄存器庫函數配置

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

    STM32寄存器操作

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

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

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

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

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

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

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