中斷及EXTI的配置


中斷的定義

為什么要有中斷?

問題:閃爍燈 執行 同時 按鍵控制蜂鳴器?

image-20201116192712830

問題: 按鍵的檢測頻率: 500ms

​ 采樣的速度太慢,導致按鍵的實時性很低。

如果有一個事務,CPU不知道它什么時候會觸發;但是一旦觸發,需要立即執行,對於這種事務,我們可以做成中斷。

中斷的概念

Cortex-M3響應中斷的形式:

image-20201116195413273
  1. 中斷的作用:實時性
  2. 中斷源:能夠產生中斷請求的。(固定的)
  3. 中斷優先級:中斷同時到來,誰先執行。--數字越小,優先級越高。

(1). 內核的NVIC--嵌套向量中斷控制器

NVIC 分了兩個部分

搶占(占先):高優先級 可打斷低優先級

次級:同時到來先執行誰

中斷優先級的分組:

image-20201116193441344

優先級分組 分的是搶占 次級 在 優先級寄存器內所占的位數

(2). STM32F10x的 NVIC使用

16個可編程的優先級分組(使用了4位中斷優先級)

image-20201116193811784

xxxx 搶占:0-15
xxx.y 搶占:0-7 次級0-1
xx.yy 搶占:0-3 次級0-3
x.yyy 搶占:0-1 次級0-7
yyyy 次級0-15

對於只使用了4位優先級寄存器的芯片, 分組時PRIGROUP[2:0]寄存器值0-3 的分組 只有搶占優先級。

一個芯片在寫程序時 優先級分組 分幾次???

只分一次,在程序的最開始分組,接下來所配置的中斷優先級都按照上面的分組情況來分
例如 : 分組 5 搶占2 次級2
某中斷: 01 01
01 01 5 就是這個中斷的優先級

​ 兩個搶占 兩個次級
取值范圍: 0-3 0-3
取值:0 – 15( 4位優先級管理 )
0 0000 00 00
1 0001 00 01
2 0010 00 10

  1. 中斷響應:中斷事件發生,Cortex-M3內核准備執行該事件 -- 響應。

  2. 中斷嵌套:內核

    可嵌套的內核: 中斷可以被其他中斷打斷。
    不可嵌套的內核: 不可以打斷。

  3. 中斷掛起:中斷事件發生了,但是Cortex-M3內核還沒准備去執行。

  4. 中斷服務函數:中斷發生后,要執行的程序。(固定格式或則別人要求)

中斷服務函數,需要有一個入口地址,而對於STM32來說,中斷服務函數的入口地址(中斷向量表),在startup_stm32f10x_md.s中。

image-20201116194721785

中斷服務函數:執行的特點:

只進行一些 標志位的設置,一般是不允許有延時操作,中斷服務函數可以稱之為 “執行的速度很快”。

中斷服務函數的書寫方法:

stm32f10x_it.c 中是官方推薦我們將“中斷服務函數”寫在這一個文件夾中。

函數的書寫方法:void xxx_Handler(void),當發生中斷時,由於有中斷服務函數向量表,所以CPU 會自動找到這個函數,並且執行這個函數中的操作。

image-20201116195010682

STM32的 EXTI配置

寄存器配置

EXTI的寄存器

image-20201116195755013

硬件中斷選擇

通過下面的過程來配置20個線路做為中斷源:
● 配置20個中斷線的屏蔽位(EXTI_IMR)

● 配置所選中斷線的觸發選擇位(EXTI_RTSR和EXTI_FTSR);

● 配置對應到外部中斷控制器(EXTI)的NVIC中斷通道的使能和屏蔽位,使得20個中斷線中的請求可以被正確地響應。

硬件事件選擇

通過下面的過程,可以配置20個線路為事件源
● 配置20個事件線的屏蔽位(EXTI_EMR)
● 配置事件線的觸發選擇位(EXTI_RTSR和EXTI_FTSR)

軟件中斷/事件的選擇

20個線路可以被配置成軟件中斷/事件線。下面是產生軟件中斷的過程:
● 配置20個中斷/事件線屏蔽位(EXTI_IMR, EXTI_EMR)
● 設置軟件中斷寄存器的請求位(EXTI_SWIER)

外部中斷/事件線路映像

外部中斷通用I/O映像

image-20201116200114254

通過AFIO_EXTICRx配置GPIO線上的外部中斷/事件,必須先使能AFIO時鍾。

外部中斷(EXTI)的中斷源

image-20201116200459294

EXTI 寄存器描述

中斷屏蔽寄存器(EXTI_IMR)

中斷使能

image-20201116200607099

事件屏蔽寄存器(EXTI_EMR)

當你配置為事件模式

image-20201116200705190

上升沿觸發選擇寄存器(EXTI_RTSR)

image-20201116200905969

下降沿觸發選擇寄存器(EXTI_FTSR)

image-20201116200928096

軟件中斷事件寄存器(EXTI_SWIER)

軟件觸發中斷,用軟件的方式將對應位置1,可以觸發中斷的產生,進而轉入中斷服務函數,執行對應的服務函數。

image-20201116201123960

掛起寄存器(EXTI_PR)

中斷標志位

image-20201116201209547

程序代碼

void EXTI0_Config(void)
{
    //配置AFIO時要打開時鍾
	RCC->APB2ENR |= (0x1<<0);
    //EXTI0的中斷源選擇:默認是PA0
	AFIO->EXTICR[0] |= (0x00<<0);
    //EXTI的中斷配置
	EXTI->IMR  |= (0x1<<0);
    EXTI->FTSR |= (0x1<<0);
//	EXTI->RTSR |= (0x1<<0);
	EXTI->PR |= (0x1<<0);
	//NVIC的配置
	NVIC_SetPriority(EXTI0_IRQn, 0x00);
	NVIC_EnableIRQ(EXTI0_IRQn);
}
//中斷服務函數
void EXTI0_IRQHandler(void)
{
	EXTI->PR |= (0x1<<0);				//清除中斷標志
	Beep_Toggle(BEEP_PORT, BEEP_PIN);
}

內核的NVIC中斷管理的函數

1、 4個常用的NVIC的配置函數(內核提供的配置函數);

image-20201116205042541

image-20201116205109251

2、這四個函數是使用 寄存器 來配置的函數,與 庫函數 的四個NVIC函數不同。

3、寄存器配置是用的NVIC功能函數 在 core_cm3.h

image-20201116205509687
image-20201118222235978 image-20201118222319553

EXTI的庫函數配置

1、中斷源的選擇

包含文件:

image-20201116210249582 image-20201116210408964

開時鍾,選擇EXTI 中斷的 中斷源

image-20201116210504454

中斷源的選擇函數: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)));
}

EXTI的配置

EXTI中斷的配置函數:EXTI_Init

image-20201116210821164

外部中斷觸發方式

1、上升沿

2、下降沿

3、上升沿和下降沿

NVIC的配置

NVIC中斷的分組:在程序的最開始就給NVIC(嵌套向量中斷控制器)分好組

image-20201116211152741

配置對應中斷的NVIC的優先級和使能。

image-20201116211103263

中斷服務函數

中斷向量:XXX_Handler

image-20201116211544012

中斷服務函數的書寫:void EXTI0_IRQHandler(void)

image-20201116212227115


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM