国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

單片機第三季-第七課:STM32中斷體系

這篇具有很好參考價值的文章主要介紹了單片機第三季-第七課:STM32中斷體系。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

1,NVIC

2,中斷和事件的區(qū)別

3,優(yōu)先級的概念?

4,如何實際編程使用外部中斷

5,STM32開發(fā)板通過按鍵控制LED?

5.1,打開相應GPIO模塊時鐘

5.2,NVIC設置

5.3,外部中斷線和配套的GPIO進行連接映射

5.4,代碼文件?

6,FSMC


1,NVIC

NVIC: Nested Vector Interrupt Control,嵌套向量中斷控制器;

68個可屏蔽中斷通道。

單片機第三季-第七課:STM32中斷體系,單片機,stm32,嵌入式硬件

數據手冊得向量表結合起始代碼查看:?

可以理解為數組里(__Vectors?)定義了數據類型為DCD的許多個元素。

單片機第三季-第七課:STM32中斷體系,單片機,stm32,嵌入式硬件

下邊圖中可理解為復位時調用Reset_Handler函數,先執(zhí)行SystemInit,然后執(zhí)行__main:?

單片機第三季-第七課:STM32中斷體系,單片機,stm32,嵌入式硬件

本章節(jié)我們關注的是外部中斷相關的內容:?

單片機第三季-第七課:STM32中斷體系,單片機,stm32,嵌入式硬件

起始代碼中為我們提供了中斷函數默認的執(zhí)行程序,即下圖中的 B? ? . ,其含義即是C中的while(1)。

單片機第三季-第七課:STM32中斷體系,單片機,stm32,嵌入式硬件

起始文件中的這些函數屬性是[WEAK],即弱函數。?

始代碼文件是用匯編語言編寫,[WEAK]標志代表該函數是弱函數,如果在其它地方定義這些函數則以定義的函數執(zhí)行,也就是不再執(zhí)行默認的while(1)函數,如果沒有在其它地方定義則以起始文件中的函數為準。

起始代碼的作用可以認為是建立了中斷向量表,中斷向量表是軟件實現的,但是是由硬件決定的。

即下圖中的地址是硬件設計時就決定了的。

單片機第三季-第七課:STM32中斷體系,單片機,stm32,嵌入式硬件

中斷要配置使能,中斷處理程序要清中斷掛起。

2,中斷和事件的區(qū)別

單片機第三季-第七課:STM32中斷體系,單片機,stm32,嵌入式硬件

中斷需要CPU參與,事件不需要CPU參與,中斷使用CPU處理程序比較靈活,事件不需要CPU參與通過產生脈沖直接與外設交互,可以節(jié)省CPU資源。

3,優(yōu)先級的概念?

搶占優(yōu)先級?NVIC_IRQChannelPreemptionPriority

子優(yōu)先級?NVIC_IRQChannelSubPriority

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

搶占優(yōu)先級內部劃分子優(yōu)先級,同一搶占優(yōu)先級內的中斷子優(yōu)先級必須不同。

優(yōu)先級為0的搶占優(yōu)先級可以打斷優(yōu)先級為1的搶占優(yōu)先級。

同一搶占優(yōu)先級內等級為0的子優(yōu)先級中斷不能打斷等級為1的子優(yōu)先級中斷,只有兩個不同子優(yōu)先級的中斷同時發(fā)生時,子優(yōu)先級高的中斷才會處于優(yōu)先地位。

單片機第三季-第七課:STM32中斷體系,單片機,stm32,嵌入式硬件

4,如何實際編程使用外部中斷

?
(1)時鐘設置并打開相應GPIO模塊時鐘
(2)將相應GPIO配置為浮空輸入
(3)NVIC設置
(4)將外部中斷線和配套的GPIO進行連接映射
(5)外部中斷線使能觸發(fā)
(6)準備好ISR,并在ISR處等待執(zhí)行中斷程序即可

在下一節(jié)中通過相應的代碼對應對上述步驟。

5,STM32開發(fā)板通過按鍵控制LED?

中斷相關標準庫代碼在misc.c中,misc是miscellaneous(雜項)的縮寫。?

在51單片機中已經通過使用中斷,通過識別外部按鍵操作來控制LED燈。本節(jié)在STM32開發(fā)板上,通過使用標準庫中的中斷函數來控制LED燈,達到的效果為:按一個按鍵打開LED燈,按另一個按鍵關閉這個LED燈,主程序中控制另外一個LED燈閃爍。

5.1,打開相應GPIO模塊時鐘

本例中按鍵使用PIN角為PB8和PB9連接按鍵,所以要使能GPIOB端口所在的APB2總線時鐘,LED燈使用PA0和PA。

對應的標準庫函數是stm32f10x_rcc.c文件中的RCC_APB2PeriphClockCmd(),要使能該總線時鐘,對應的命令如下:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

5.2,NVIC設置

第一步,優(yōu)先級組設置,設置有幾個搶占優(yōu)先級,以及有幾個子優(yōu)先級

對于搶占優(yōu)先級和子優(yōu)先級,因為本例中通過按鍵控制LED燈只需要識別一個中斷,因此搶占優(yōu)先級和子優(yōu)先級可以隨意設置,即NVIC_PriorityGroupConfig()函數的輸入參數可以設置下列代碼中的任意值,對于具體的項目可以根據中斷個數和優(yōu)先級進行設置。?

/**
  * @brief  Configures the priority grouping: pre-emption priority and subpriority.
  * @param  NVIC_PriorityGroup: specifies the priority grouping bits length. 
  *   This parameter can be one of the following values:
  *     @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
  *                                4 bits for subpriority
  *     @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
  *                                3 bits for subpriority
  *     @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
  *                                2 bits for subpriority
  *     @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
  *                                1 bits for subpriority
  *     @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority
  *                                0 bits for subpriority
  * @retval None
  */
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
  /* Check the parameters */
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  
  /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

第二步,NVIC初始化

標準庫misc.c中的NVIC_Init()函數

/**
  * @brief  Initializes the NVIC peripheral according to the specified
  *         parameters in the NVIC_InitStruct.
  * @param  NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure that contains
  *         the configuration information for the specified NVIC peripheral.
  * @retval None
  */
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
{
  uint32_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F;
  
  /* Check the parameters */
  assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
  assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));  
  assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
    
  if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  {
    /* Compute the Corresponding IRQ Priority --------------------------------*/    
    tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
    tmppre = (0x4 - tmppriority);
    tmpsub = tmpsub >> tmppriority;

    tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
    tmppriority |=  NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;
    tmppriority = tmppriority << 0x04;
        
    NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority;
    
    /* Enable the Selected IRQ Channels --------------------------------------*/
    NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
      (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  }
  else
  {
    /* Disable the Selected IRQ Channels -------------------------------------*/
    NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =
      (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F);
  }
}

5.3,外部中斷線和配套的GPIO進行連接映射

首先,確定按鍵和LED對應的PIN端口。通用I/O端口以下圖的方式連接到16個外部中斷/事件線上,若按鍵確定連接到PA0上,則對應的中斷線為EXTI0。

單片機第三季-第七課:STM32中斷體系,單片機,stm32,嵌入式硬件

在外部中斷配置寄存器(AFIO_EXTICRX,X = 1,2,3,4)中設置中斷線與哪個PIN角對應。

對應的設置函數是標準庫GPIO.c文件中的GPIO_EXTILineConfig()函數:

/**
  * @brief  Selects the GPIO pin used as EXTI Line.
  * @param  GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.
  *   This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).
  * @param  GPIO_PinSource: specifies the EXTI line to be configured.
  *   This parameter can be GPIO_PinSourcex where x can be (0..15).
  * @retval None
  */
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
{
  uint32_t tmp = 0x00;
  /* Check the parameters */
  assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource));
  assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  
  tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03));
  AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp;
  AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)));
}

如果要設置PIN角PA0能夠檢測中斷,調用此函數:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

確定模式是中斷還是事件;

typedef enum
{
  EXTI_Mode_Interrupt = 0x00,
  EXTI_Mode_Event = 0x04
}EXTIMode_TypeDef;

配置上升沿/下降沿觸發(fā)選擇寄存器;

因開發(fā)板上的按鍵接通時是接地的,因此需要將中斷設置為下降沿觸發(fā),設置下降沿觸發(fā)選擇寄存器(EXTI_FTSR)

單片機第三季-第七課:STM32中斷體系,單片機,stm32,嵌入式硬件

對應的標準庫中代碼:

typedef enum
{
  EXTI_Trigger_Rising = 0x08,
  EXTI_Trigger_Falling = 0x0C,  
  EXTI_Trigger_Rising_Falling = 0x10
}EXTITrigger_TypeDef;

重寫中斷函數ISR:

注意中斷函數的名稱要使用起始代碼中的對應中斷函數名稱,也就是對這個弱函數重寫。

注意要在ISR中清除中斷掛起寄存器(EXTI_PR),如果不在ISR中清除中斷就會反復進入中斷:

單片機第三季-第七課:STM32中斷體系,單片機,stm32,嵌入式硬件

對應的標準庫函數在stm32f10x_exti.c中的EXTI_ClearFlag(),

/**
  * @brief  Clears the EXTI's line pending flags.
  * @param  EXTI_Line: specifies the EXTI lines flags to clear.
  *   This parameter can be any combination of EXTI_Linex where x can be (0..19).
  * @retval None
  */
void EXTI_ClearFlag(uint32_t EXTI_Line)
{
  /* Check the parameters */
  assert_param(IS_EXTI_LINE(EXTI_Line));
  
  EXTI->PR = EXTI_Line;
}

5.4,代碼文件?

中斷相關.c和.h文件:

#ifndef _exti_H
#define _exti_H


#include "system.h"

void My_EXTI_Init(void);

#endif

注意:需將AFIO使能,因為中斷線和端口的對應配置是在AFIO相關寄存器:外部中斷配置寄存器(AFIO_EXTICR)

單片機第三季-第七課:STM32中斷體系,單片機,stm32,嵌入式硬件

#include "exti.h"
#include "led.h"
#include "SysTick.h"
#include "key.h"


void My_EXTI_Init(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	EXTI_InitTypeDef  EXTI_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //注意需將AFIO使能
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;	
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			
	NVIC_Init(&NVIC_InitStructure);	
	
	
	EXTI_InitStructure.EXTI_Line=EXTI_Line8|EXTI_Line9; 
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	
}



void EXTI9_5_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line8)==1)
	{
		delay_ms(10);
		if(KEY1==0)
		{
			led2=0;
		}
	}
	else if(EXTI_GetITStatus(EXTI_Line9)==1)
	{
		delay_ms(10);
		if(KEY2==0)
		{
			led2=1;
		}
	}
	EXTI_ClearITPendingBit(EXTI_Line8|EXTI_Line9);
}

?main.c函數:

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "key.h"
#include "exti.h"

int main()
{
	u8 i;
	SysTick_Init(72);
	
	LED_Init();
	KEY_Init();
	My_EXTI_Init();  
	while(1)
	{
		i++;
		if(i%20==0)
		{
			led1=!led1;
		}
		delay_ms(10);	
	}
}

6,FSMC

Flexible static memory controller(FSMC)靈活的靜態(tài)存儲控制器文章來源地址http://www.zghlxwxcb.cn/news/detail-799577.html

到了這里,關于單片機第三季-第七課:STM32中斷體系的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • STM32單片機(一)STM32簡介

    STM32單片機(一)STM32簡介

    ?? 專欄簡介:本專欄記錄了從零學習單片機的過程,其中包括51單片機和STM32單片機兩部分;建議先學習51單片機,其是STM32等高級單片機的基礎;這樣再學習STM32時才能融會貫通。 ?? 專欄適用人群 :適用于想要從零基礎開始學習入門單片機,且有一定C語言基礎的的童鞋

    2024年02月10日
    瀏覽(28)
  • STM32第七課:PWM控制SG90舵機

    STM32第七課:PWM控制SG90舵機

    ????????學習完上一課的PWM控制LED小燈實現呼吸燈的效果,我們就可以進一步學習PWM控制舵機的效果了。PWM控制舵機相信會是一個更有意思的小實驗的。 ???????? 舵機是一種位置(角度)伺服的驅動器,適用于那些需要角度不斷變化并可以保持的控制系統(tǒng)。目前在高檔

    2024年04月17日
    瀏覽(24)
  • STM32單片機開發(fā)-01 STM32介紹

    STM32單片機開發(fā)-01 STM32介紹

    通過野火開發(fā)板學習單片機 從內核上分有Cortex-M0、M3、M4 和M7 F1 代表了基礎型,基于Cortex-M3 內核,主頻為72MHZ F4 代表了高性能,基于Cortex-M4 內核,主頻180M。 數據手冊:用于芯片選型和設計原理圖 參考手冊:用于編程時查閱 Icode總線 – 該總線講M3內核的指令總線與閃存指令

    2024年01月21日
    瀏覽(28)
  • STM32單片機(二)STM32環(huán)境搭建

    STM32單片機(二)STM32環(huán)境搭建

    ?? 專欄簡介:本專欄記錄了從零學習單片機的過程,其中包括51單片機和STM32單片機兩部分;建議先學習51單片機,其是STM32等高級單片機的基礎;這樣再學習STM32時才能融會貫通。 ?? 專欄適用人群 :適用于想要從零基礎開始學習入門單片機,且有一定C語言基礎的的童鞋

    2024年02月10日
    瀏覽(45)
  • 【單片機】STM32單片機的各個定時器的定時中斷程序,標準庫,STM32F103

    【單片機】STM32單片機的各個定時器的定時中斷程序,標準庫,STM32F103

    高級定時器和普通定時器的區(qū)別(https://zhuanlan.zhihu.com/p/557896041): TIM1是高級定時器,使用的時鐘總線是RCC_APB2Periph_TIM1,和普通定時器不一樣。 timer.c timer.h 調用 timer.c timer.h 調用 timer.c timer.h 調用 timer.c timer.h 調用 timer.c timer.h 調用

    2024年02月07日
    瀏覽(27)
  • 學習筆記|按鍵原理|消抖|按鍵點燈的4種模式|STC32G單片機視頻開發(fā)教程(沖哥)|第七集:按鍵點燈

    學習筆記|按鍵原理|消抖|按鍵點燈的4種模式|STC32G單片機視頻開發(fā)教程(沖哥)|第七集:按鍵點燈

    來源:愛問知識人:sos用燈光怎么表示 三短三長三短 SOS作為世界上通用的求救信號,如果用燈光信號來表示,三短亮代表字母S,三長亮代表字母O,再接著的三短亮代表S。 燈的長亮時間是短亮時間的三倍,而短亮時間則與LED兩次點亮的間隔時間相同,字母與下一個字母間也有

    2024年02月12日
    瀏覽(22)
  • STM32單片機學習3--STM32控制鍵盤

    STM32單片機學習3--STM32控制鍵盤

    單片機型號:STM32F103C8T6 開發(fā)環(huán)境:Keil5 4種輸入模式 上拉輸入模式:在默認狀態(tài)下(GPIO引腳無輸入),讀取得的GPIO引腳數據為1,高電平(與Vdd相連的為上拉電阻); 下拉輸入模式:在默認狀態(tài)下(GPIO引腳無輸入),讀取得的GPIO引腳數據為0,低電平(與Vss相連的為下拉電

    2024年02月10日
    瀏覽(19)
  • 【STM32】STM32單片機結構及部件原理

    【STM32】STM32單片機結構及部件原理

    STM32是目前比較常見并且多功能的單片機,要想學習STM32,首先要去了解它的基本構成部分以及各部分的原理。 單片機型號:正點原子STM32F103ZET6 目錄 STM32內部結構總覽圖: 2.內部結構解析 ????????1.內核 :STM32F103ZET6采用的是 ARM Cortex-M3 處理器,內核可以理解為單片機 處

    2023年04月08日
    瀏覽(20)
  • 【單片機】STM32單片機,定時器的輸入捕獲,基于捕獲的頻率計,STM32F103

    【單片機】STM32單片機,定時器的輸入捕獲,基于捕獲的頻率計,STM32F103

    下面的定時器都具有輸入捕獲能力: 查看另一篇文章:https://qq742971636.blog.csdn.net/article/details/131471539 外部計數頻率計的缺點:需要兩個定時器配合,最高能測量的頻率是否有限制我沒具體嘗試。 基于捕獲的頻率計的缺點:最高能測量的頻率有限制。 TIM3_CH1 PWM PA6 10KHZ。 輸入

    2024年02月14日
    瀏覽(26)
  • 單片機簡介(STM32介紹)

    單片機簡介(STM32介紹)

    ? ? 單片機是 單片微型計算機 的簡稱,Mcu是Microcontroller的簡稱,也就是嵌入式微控制器。采用集成電路技術將具有數據處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、定時器/計時器、多種I/O口和中斷系統(tǒng)等功能集成到一塊硅片上??梢哉f單片機就是一個小而完善

    2024年02月16日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包