STM32学习笔记(五)---NVIC

发布者:快乐的小鸟最新更新时间:2022-10-18 来源: csdn关键字:STM32  学习笔记  NVIC 手机看文章 扫描二维码
随时随地手机看文章

F407在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和中断,其中系统异常有10个,中断有82个。


一、NVIC简介

NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。


在配置中断的时候一般只用ISER、ICER和IP这三个寄存器,ISER用来使能中断,ICER用来失能中断,IP用来设置中断的优先级。


二、中断优先级

优先级定义

NVIC有一个专门的中断优先级寄存器NVIC_IPRx,来配置外部中断的优先级,IPR宽度为8bit,原则上每个外部中断可配置的优先级为0-255,数值越小,优先级越高。


F407中只使用了高4位,bit[7:4]

在这里插入图片描述

表达优先级的这4bit,又被分组成抢占优先级和子优先级。


抢占优先级高优先执行,

抢占优先级相同,子优先级高的优先执行

抢占优先级和子优先级都相同,比较硬件中断编号,编号越小,优先级越高。

别的地方看到的一个结论:抢占优先级高中断可以打断抢占优先级低的中断。抢占优先级相同的中断,子优先级高的不能打断子优先级低的中断。


优先级分组

优先级的分组由内核外设 SCB 的应用程序中断及复位控制寄存器 AIRCR 的PRIGROUP[10:8]位决定, F407 分为了 5 组。

优先级分组

设置优先级分组可调用库函数NVIC_PriorityGroupConfig()实现。


/**

  * @brief 配置中断优先级分组:抢占优先级和子优先级

  * @param  NVIC_PriorityGroup: 特定的优先级分组 

  *   参数如下:

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

  * @note   如果优先级分组为0,则抢占优先级就不存在了,优先级就全部由子优先级控制

  * @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_PriorityGroupConfig()


特定外设初始化时,使能外设的某个中断


初始化NVIC_InitTypeDef结构体(配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求)


typedef struct

{

  uint8_t NVIC_IRQChannel;      //中断源,定义在stm32f4xx.h文件中的IRQn_Type结构体定义

  uint8_t NVIC_IRQChannelPreemptionPriority;  //抢占优先级

  uint8_t NVIC_IRQChannelSubPriority;         //子优先级

  FunctionalState NVIC_IRQChannelCmd;         //中断使能或失能

} NVIC_InitTypeDef;


编写中断服务函数


注意:中断服务的函数名必须跟启动文件里面预先设置的一样。


编写中断服务函数


注意:中断服务的函数名必须跟启动文件里面预先设置的一样。

关键字:STM32  学习笔记  NVIC 引用地址:STM32学习笔记(五)---NVIC

上一篇:STM32学习笔记(六)---EXTI
下一篇:STM32学习笔记(四)---RCC

推荐阅读最新更新时间:2024-11-13 21:15

STM32 IO口的八种方式的解释
1、上拉输入:上拉就是把电位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!弱强只是上拉电阻的阻值不同,没有什么严格区分。 2、下拉输入:就是把电压拉低,拉到GND。与上拉原理相似。 3、浮空输入:浮空(floating)就是逻辑器件的输入引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰。 通俗讲就是让管脚什么都不接,浮空着。 4、模拟输入:模拟输入是指传统方式的输入.数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的
[单片机]
stm32智能小车之路之小车启动
首先,安装完小车后最激动的还是想让他跑动,那么就开始吧。写个简单的程序测试下电机是否正常。打开keil软件新建一个工程,具体简历keil工程不会的请百度,或者call我,我有简历Keil工程的文档,保证你会的。 第一初始化管脚,来进行控制电机,输出高低电平,方可让电机转动。 /******************************************************************************* * 函数名字 : GPIO_Configuration(void) * 描述 : 初始化PE7~PE8为输出口.并使能这两个口的时钟 Motor(电机输出引脚) IO初始化 * 输
[单片机]
<font color='red'>stm32</font>智能小车之路之小车启动
STM32 HardFault_Handler处理方法
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。 STM32出现硬件错误可能有以下原因: (1)数组越界操作; (2)内存溢出,访问越界; (3)堆栈溢出,程序跑飞; (4)中断处理错误; 遇到这种情况,可以通过以下2种方式来定位到出错代码段。 方法1: 1.1在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击“STOP”停止仿真。 1.2 在Keil菜
[单片机]
<font color='red'>STM32</font> HardFault_Handler处理方法
STM32的uart1、uart2、uart3重定向函数(标准库版)
标准库 //uart1 int fputc(int ch,FILE *f) { while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET); USART_SendData(USART1,(unsigned char)ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET); return (ch); } //uart2 int fputc(int ch,FILE *f) { while(USART_GetFlagStatus(USART2,USART_FLAG
[单片机]
关于STM32外部中断
以下总结参考原子STM32开发指南 STM32F103 的中断控制器支持 19 个外部中断/事件请求。STM32F103 的19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断。 线 16:连接到 PVD 输出。 线 17:连接到 RTC 闹钟事件。 线 18:连接到 USB 唤醒事件。 每个中断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、 GPIOF.0、 GPIOG.0。 在库函数中,配置 GPIO 与中断线的映射关系的函数 GPIO_EXTILineConfig()来实现的: void GPIO_EXTILine
[单片机]
采用STM32单片机的太阳能LED街灯解决方案
随着化石类能源的日益减少,以及温室气体的过度排放导致全球变暖问题越来越受到重视,人们一方面在积极开发各类可再生新能源,另一方面也在倡导节能减排的绿色环保技术。太阳能作为取之不尽、用之不竭的清洁能源,成为众多可再生能源的重要代表;而在照明领域,寿命长、节能、安全、绿色环保、色彩丰富、微型化的LED固态照明也已被公认为世界一种节能环保的重要途径。太阳能-LED街灯同时整合了这两者的优势,利用清洁能源以及高效率的LED实现绿色照明。 本文介绍的太阳能-LED街灯方案,能自动检测环境光以控制路灯的工作状态,最大功率点追踪(MPPT)保证最大太阳能电池板效率,恒电流控制LED,并带有蓄电池状态输出以及用户可设定LED工作时间等功能。 系
[单片机]
采用<font color='red'>STM32</font>单片机的太阳能LED街灯解决方案
适用于STM32 MCU的NanoEdge人工智能软件
Cartesiam已针对STM32微控制器开发板推出优化的NanoEdge人工智能软件。 据Cartesiam称,NanoEdge AI Studio专为没有机器学习相关资源的公司而设计。 “在许多改进中,它直接通过STM32串行USB端口和Cartesiam的自动数据符合性和质量验证工具的增强版,将实时数据记录到NanoEdge AI Studio中。” ST的Nucleo-F401RE和Nucleo-L432KC开发板现已完全支持。 该软件套件可在Windows 10或Ubuntu上运行,用户能够生成并验证嵌入式系统的机器学习库。 用户可以选择上述开发板之一并下载自定义的NanoEdge AI库,可以构建可在板
[单片机]
STM32 通用底层函数集锦, 自用
#include xustm32.h #include xucommon.h //#define COM_DEBUG #include xudebug.h //-------------------- STM32通用函数集锦 --------------------------------------------------- #if 0 HardFault_Handler PROC ; EXPORT HardFault_Handler ; B . IMPORT hard_fault_handler_c TST LR, #4 ITE EQ
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved