当前位置: 首页 > wzjs >正文

上海网站建设公司联系方式网站内容转载

上海网站建设公司联系方式,网站内容转载,如何进行网络营销推广,为什么 要建设网站【星云 Orbit • STM32F4】05. NVIC中断分组与配置(重要) 引言 STM32F407微控制器是一款高性能的32位微控制器,广泛应用于嵌入式系统开发。中断系统是嵌入式开发中不可或缺的一部分,能够帮助微控制器高效地处理外部事件。STM32F4…

【星云 Orbit • STM32F4】05. NVIC中断分组与配置(重要)


引言

STM32F407微控制器是一款高性能的32位微控制器,广泛应用于嵌入式系统开发。中断系统是嵌入式开发中不可或缺的一部分,能够帮助微控制器高效地处理外部事件。STM32F407集成了一个强大的中断管理系统——Nested Vectored Interrupt Controller(NVIC),支持中断优先级分组和灵活的中断配置。本文将从零开始,详细介绍STM32F407的NVIC中断分组与配置方法,并提供基于HAL库的完整示例代码,帮助读者快速掌握中断系统的开发技能。


1. 基础知识

1.1 中断的基本概念

中断是一种硬件机制,允许微控制器在处理当前任务的同时,快速响应外部事件(如按键按下、定时器溢出等)。中断具有以下特点:

  • 实时性:中断能够实时响应外部事件,确保系统及时处理。
  • 高效性:中断不会阻塞主程序,能够在后台处理事件。
  • 灵活性:支持多种中断源和优先级配置。

1.2 NVIC的结构与功能

STM32F407的NVIC模块负责管理中断的优先级和响应顺序。其主要功能包括:

  • 中断优先级管理:支持中断优先级分组,将中断分为抢占优先级和响应优先级。
  • 中断向量表管理:管理中断向量地址,支持中断向量的动态分配。
  • 中断使能与禁用:提供对中断源的使能和禁用控制。

1.3 中断优先级分组

STM32F407的中断优先级采用分组机制,将8位优先级分为抢占优先级和响应优先级两部分。中断优先级的分组方式可以通过SCB->AIRCR寄存器配置,具体分为以下几种模式:

  • 分组模式0:8位均为抢占优先级。
  • 分组模式1:7位抢占优先级,1位响应优先级。
  • 分组模式2:6位抢占优先级,2位响应优先级。
  • 分组模式3:5位抢占优先级,3位响应优先级。
  • 分组模式4:4位抢占优先级,4位响应优先级。

抢占优先级决定了中断的抢占能力,响应优先级决定了中断的响应顺序。


2. NVIC中断配置步骤

2.1 时钟配置

在配置中断之前,需要确保相关外设时钟已使能。例如,若使用外部中断(EXTI),则需要使能GPIO和SYSCFG时钟。

// 时钟配置
HAL_RCC_MspInitTypeDef RCC_InitTypeDef;
RCC_InitTypeDef.PeriphClockSelection = RCC_PERIPHCLK_SYSCFG;
RCC_InitTypeDef.SysClk = RCC_SYSCLKSOURCE_HSI;
HAL_RCC_Init(&RCC_InitTypeDef);

HAL_RCC_Init函数详解

  • 函数作用:初始化RCC(复用时钟控制)模块,配置外设时钟。

  • 参数说明:

    • RCC_InitTypeDef:结构体,包含外设时钟选择和系统时钟源配置。
  • 返回值:无。

  • 使用示例

    HAL_RCC_MspInitTypeDef RCC_InitTypeDef;
    RCC_InitTypeDef.PeriphClockSelection = RCC_PERIPHCLK_SYSCFG;
    RCC_InitTypeDef.SysClk = RCC_SYSCLKSOURCE_HSI;
    HAL_RCC_Init(&RCC_InitTypeDef);
    

2.2 GPIO配置

配置GPIO引脚为外部中断输入模式。

// GPIO配置
GPIO_InitTypeDef GPIO_InitTypeDef;
GPIO_InitTypeDef.Pin = GPIO_PIN_0; // 按键引脚
GPIO_InitTypeDef.Mode = GPIO_MODE_IT_RISING; // 上升沿触发中断
GPIO_InitTypeDef.Pull = GPIO_PULLUP; // 上拉电阻
HAL_GPIO_Init(GPIOA, &GPIO_InitTypeDef);

HAL_GPIO_Init函数详解

  • 函数作用:初始化GPIO模块,配置GPIO引脚模式。

  • 参数说明 :

    • GPIO_TypeDef *GPIOx:GPIO端口(如GPIOA、GPIOB等)。
    • GPIO_InitTypeDef *GPIO_InitTypeDef:结构体,包含引脚配置信息。
  • 返回值:无。

  • 使用示例 :

    GPIO_InitTypeDef GPIO_InitTypeDef;
    GPIO_InitTypeDef.Pin = GPIO_PIN_0;
    GPIO_InitTypeDef.Mode = GPIO_MODE_IT_RISING;
    GPIO_InitTypeDef.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOA, &GPIO_InitTypeDef);
    

2.3 NVIC中断分组配置

通过SCB->AIRCR寄存器配置中断优先级分组模式。以下代码将中断分组模式设置为模式4(4位抢占优先级,4位响应优先级)。

// 中断分组配置
SCB->AIRCR = (SCB->AIRCR & (~SCB_AIRCR_VECTKEY_Msk)) | SCB_AIRCR_VECTKEY_Msk;
SCB->AIRCR |= SCB_AIRCR_PRIGROUP_Msk; // 设置为分组模式4
SCB->AIRCR &= ~SCB_AIRCR_VECTKEY_Msk;

SCB->AIRCR寄存器详解

  • 寄存器作用:配置中断优先级分组模式。

  • 关键位 :

    • VECTKEY:写入密钥,确保配置有效。
    • PRIGROUP:中断优先级分组模式选择。
  • 使用示例 :

    c复制代码SCB->AIRCR = (SCB->AIRCR & (~SCB_AIRCR_VECTKEY_Msk)) | SCB_AIRCR_VECTKEY_Msk;
    SCB->AIRCR |= SCB_AIRCR_PRIGROUP_Msk; // 设置为分组模式4
    SCB->AIRCR &= ~SCB_AIRCR_VECTKEY_Msk;
    

2.4 中断优先级配置

通过 NVIC_InitTypeDef结构体配置中断的抢占优先级和响应优先级。

// 中断优先级配置
NVIC_InitTypeDef NVIC_InitTypeDef;
NVIC_InitTypeDef.NVIC_IRQChannel = GPIOA_IRQn; // 配置GPIOA中断
NVIC_InitTypeDef.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级1
NVIC_InitTypeDef.NVIC_IRQChannelSubPriority = 0; // 响应优先级0
NVIC_InitTypeDef.NVIC_IRQChannelCmd = ENABLE; // 使能中断
HAL_NVIC_Init(&NVIC_InitTypeDef);

HAL_NVIC_Init函数详解

  • 函数作用:初始化NVIC模块,配置中断优先级。

  • 参数说明 :

    • NVIC_InitTypeDef *NVIC_InitTypeDef:结构体,包含中断通道、抢占优先级、响应优先级和中断使能配置。
  • 返回值:无。

  • 使用示例 :

    NVIC_InitTypeDef NVIC_InitTypeDef;
    NVIC_InitTypeDef.NVIC_IRQChannel = GPIOA_IRQn;
    NVIC_InitTypeDef.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitTypeDef.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitTypeDef.NVIC_IRQChannelCmd = ENABLE;
    HAL_NVIC_Init(&NVIC_InitTypeDef);
    

2.5 中断服务函数配置

定义中断服务函数,并将其与中断向量表关联。

// 中断服务函数
void GPIOA_IRQHandler(void)
{if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) // 检查中断源{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); // 示例:LED点亮HAL_Delay(500);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); // 示例:LED熄灭HAL_GPIO_ClearITPendingBit(GPIOA, GPIO_PIN_0); // 清除中断标志}
}

HAL_GPIO_ReadPin函数详解

  • 函数作用:读取GPIO引脚的当前状态。

  • 参数说明 :

    • GPIO_TypeDef *GPIOx:GPIO端口。
    • uint16_t GPIO_Pin:要读取的引脚。
  • 返回值:GPIO_Pin_State,表示引脚状态(GPIO_PIN_RESET或GPIO_PIN_SET)。

  • 使用示例 :

 if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)

HAL_GPIO_WritePin函数详解

  • 函数作用:写入GPIO引脚的状态。

  • 参数说明 :

    • GPIO_TypeDef *GPIOx:GPIO端口。
    • uint16_t GPIO_Pin:要写入的引脚。
    • GPIO_Pin_State PinState:引脚状态(GPIO_PIN_RESET或GPIO_PIN_SET)。
  • 返回值:无。

  • 使用示例 :

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);

HAL_Delay函数详解

  • 函数作用:产生一个精确的延时。

  • 参数说明 :

    • uint32_t Delay:延时时间,单位为毫秒。
  • 返回值:无。

  • 使用示例
    HAL_Delay(500);

    
    

HAL_GPIO_ClearITPendingBit函数详解

  • 函数作用:清除GPIO中断标志。

  • 参数说明 :

    • GPIO_TypeDef *GPIOx:GPIO端口。
    • uint16_t GPIO_Pin:要清除的中断标志。
  • 返回值:无。

  • 使用示例 :

 HAL_GPIO_ClearITPendingBit(GPIOA, GPIO_PIN_0);

2.6 中断使能

通过 NVIC_EnableIRQ函数使能中断。

// 使能GPIOA中断
HAL_NVIC_EnableIRQ(GPIOA_IRQn);

HAL_NVIC_EnableIRQ函数详解

  • 函数作用:使能指定的中断通道。

  • 参数说明 :

    • IRQn_Type IRQn:中断通道编号。
  • 返回值:无。

  • 使用示例 :

HAL_NVIC_EnableIRQ(GPIOA_IRQn);

3. 使用示例

3.1 实验目标

通过STM32F407的GPIO外部中断实现LED闪烁功能,验证中断分组和配置的正确性。

3.2 实验硬件

  • STM32F407开发板
  • LED灯模块
  • 按键模块

3.3 实验代码

#include "stm32f4xx_hal.h"// LED引脚配置
#define LED_GPIO_PORT GPIOB
#define LED_GPIO_Pin GPIO_PIN_5// 按键引脚配置
#define BUTTON_GPIO_PORT GPIOA
#define BUTTON_GPIO_Pin GPIO_PIN_0// 中断配置
void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitTypeDef;NVIC_InitTypeDef.NVIC_IRQChannel = GPIOA_IRQn;NVIC_InitTypeDef.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级1NVIC_InitTypeDef.NVIC_IRQChannelSubPriority = 0; // 响应优先级0NVIC_InitTypeDef.NVIC_IRQChannelCmd = ENABLE;HAL_NVIC_Init(&NVIC_InitTypeDef);
}// GPIO配置
void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitTypeDef;// LED引脚配置GPIO_InitTypeDef.Pin = LED_GPIO_Pin;GPIO_InitTypeDef.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitTypeDef.Pull = GPIO_NOPULL;GPIO_InitTypeDef.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitTypeDef);// 按键引脚配置GPIO_InitTypeDef.Pin = BUTTON_GPIO_Pin;GPIO_InitTypeDef.Mode = GPIO_MODE_IT_RISING;GPIO_InitTypeDef.Pull = GPIO_PULLUP;HAL_GPIO_Init(BUTTON_GPIO_PORT, &GPIO_InitTypeDef);// 使能GPIOA中断HAL_NVIC_EnableIRQ(GPIOA_IRQn);
}// 中断服务函数
void GPIOA_IRQHandler(void)
{if (HAL_GPIO_ReadPin(BUTTON_GPIO_PORT, BUTTON_GPIO_Pin) == GPIO_PIN_RESET){HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_Pin, GPIO_PIN_SET); // LED点亮HAL_Delay(500);HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GPIO_Pin, GPIO_PIN_RESET); // LED熄灭HAL_GPIO_ClearITPendingBit(BUTTON_GPIO_PORT, BUTTON_GPIO_Pin); // 清除中断标志}
}int main(void)
{// 初始化HAL库HAL_Init();// 时钟配置HAL_RCC_MspInitTypeDef RCC_InitTypeDef;RCC_InitTypeDef.PeriphClockSelection = RCC_PERIPHCLK_SYSCFG;RCC_InitTypeDef.SysClk = RCC_SYSCLKSOURCE_HSI;HAL_RCC_Init(&RCC_InitTypeDef);// 中断分组配置SCB->AIRCR = (SCB->AIRCR & (~SCB_AIRCR_VECTKEY_Msk)) | SCB_AIRCR_VECTKEY_Msk;SCB->AIRCR |= SCB_AIRCR_PRIGROUP_Msk; // 分组模式4SCB->AIRCR &= ~SCB_AIRCR_VECTKEY_Msk;// GPIO配置GPIO_Configuration();// 进入低功耗模式while (1){HAL_Delay(1000);}
}

4. 总结

本文详细介绍了STM32F407的NVIC中断分组与配置方法,包括中断优先级分组、中断使能、中断服务函数编写等内容,并通过实际实验验证了配置的正确性。通过本文的学习,读者可以掌握STM32F407的中断系统开发技能,并能够在此基础上进行更复杂的中断应用开发。


文章转载自:

http://H4C1LhIt.fgsms.cn
http://g6ecbECF.fgsms.cn
http://YDdEzdhF.fgsms.cn
http://29iruPdC.fgsms.cn
http://5uPwQhSC.fgsms.cn
http://vth2aJkJ.fgsms.cn
http://AJSHf1YV.fgsms.cn
http://tsBYKA7v.fgsms.cn
http://csiXfFq4.fgsms.cn
http://5HJ1th0A.fgsms.cn
http://Cq2xWHin.fgsms.cn
http://ci4NRl34.fgsms.cn
http://K52JW0Sx.fgsms.cn
http://lD6Fpx8a.fgsms.cn
http://0Sz2Kvhm.fgsms.cn
http://VCWEVLGX.fgsms.cn
http://9FwKBT8z.fgsms.cn
http://f4d4ObZp.fgsms.cn
http://PrwqeQ9B.fgsms.cn
http://w13A97ti.fgsms.cn
http://lATaa8BP.fgsms.cn
http://ML5gOryR.fgsms.cn
http://FJaVNyTy.fgsms.cn
http://yRXLU4K3.fgsms.cn
http://xDmu66cY.fgsms.cn
http://jqiACccL.fgsms.cn
http://skuDZ3W2.fgsms.cn
http://0fnTF5dU.fgsms.cn
http://Te1AgIhp.fgsms.cn
http://NNVzdfGw.fgsms.cn
http://www.dtcms.com/wzjs/664960.html

相关文章:

  • 辉县市建设局网站备案的时候需要网站吗
  • 网页设计:编程学习网站素材做外贸必须用的社交网站
  • 服装公司网站模版浏览器入口
  • 国外的做的比较优秀的网站有哪些做网站厦门
  • 公司 网站 模板wordpress 加入搜索
  • 网站页面太多是否做静态wp风格网站
  • 建站助手电脑可以做网站服务器吗
  • 网站注册域名备案宣传片拍摄制作公司报价明细
  • 男女做那个是的视频网站重庆网网站建设公司
  • 文件服务器网站搭建教程云商城app官方下载
  • 手机h5免费模板网站模板会员卡管理系统怎么制作
  • 做网站用cms好吗做视频怎样传到网站
  • 自己做网站原始代码住房和城乡建设部网站唐山
  • 有哪些平面设计网站网站编程学习
  • 响应式网站 产品轮播代码手机网站推广方案
  • 网站兼容9网站推广信息怎么做
  • 建设综合信息网站需要多少钱搜索网
  • 系列图标设计网站推荐wordpress的安装教程
  • 网站建设平台有哪些 谢谢平台建站网站个人备案需要什么
  • cps广告联盟网站wordpress禁止更新
  • c 做网站 知乎企业邮箱登录
  • 企业网站是怎么建站的怎么做网站演示
  • 奉化市住房和城乡建设局网站网站设计毕业设计
  • 东莞建网站公司动广州建设厅网站
  • 做百度联盟怎么才能创建多个网站图片制作工具
  • 网站建设开发方式包括哪些腾讯云服务器如何使用
  • 淄博网站建设优惠臻动传媒团购网站开发代码
  • 网站建设辶首先金手指十五成功的电商网站
  • wordpress 调用子栏目百度网站优化外包
  • 找人做一个网站需要多少钱自己做视频网站资源从哪里来