STM32F1中断NVIC

本文详细介绍了STM32F1的中断系统,包括中断向量表、NVIC的基本结构、优先级分组以及中断程序的编写。重点讨论了NVIC如何管理中断通道的优先级,中断嵌套的概念,以及中断分组、抢占优先级和响应优先级的配置。文章还涵盖了中断结构体变量、中断通道选择和实际编程应用。
摘要由CSDN通过智能技术生成

目录

1.  中断系统

2.  中断向量表

3.  NVIC基本结构

4.  NVIC优先级分组

5.   NVIC程序编写

5.1  中断分组

5.2  中断结构体变量

5.3  中断通道选择

5.4  抢占优先级和响应优先级配置

6.  中断程序执行


1.  中断系统

中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行

        在此时的断点部分,若是此时主程序还在进行例如加减乘除运算,但是突然有个更加紧急的的事情需要处理,可以在此时进行中断,优先处理更加紧急的事情,等事情处理完后,在返回主程序继续处理。

        在中断这里,我们在断点处离开,编译器会自动帮我们保护现场(当前程序),等我们回来(中断完成后),继续工作。

中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源

        例如:两个人同时就医,急诊和门诊。

中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回

        STM32F1系列包含最多:68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设。

        使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级

2.  中断向量表

        灰色部分为内核中断,了解即可,一般用不上,初学者可以不用那么深入。

        这里仅做了解,编译器已经帮我们做好了。

        中断函数的地址由编译器来进行分配的,是不固定的,但是终端的跳转因为硬件的限制,只能调到固定的地址进行程序的执行,为了让硬件跳转到不固定的一个中断函数里,这里需要在中断

  • 51
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F1系列微控制器支持中断管理机制,允许处理器响应和处理来自各种外部设备的事件。中断优先级配置是确保系统稳定运行的关键步骤之一,它决定了当多个中断请求同时发生时,处理器将如何选择并处理哪一个中断。 ### 中断优先级配置的主要组件 在STM32F1上配置中断优先级涉及到以下几个主要组件: #### NVIC (Nested Vectored Interrupt Controller) STM32F1使用NVIC作为其嵌入式向量中断控制器。NVIC负责管理所有中断源,并为每个中断源分配一个优先级。 #### 中断优先级等级 STM32F1有5个中断优先级级别,其中0表示最高优先级,4表示最低优先级。例如,在配置时可以将某些中断设置为较高优先级以便在系统响应时间关键任务时立即处理它们。 #### 配置步骤 1. **初始化NVIC**:首先需要初始化NVIC,通常在程序开始时完成。这包括启用NVIC、配置中断屏蔽寄存器(ISER)、中断清除寄存器(ICER)、中断设置寄存器(ISPR)、中断屏蔽寄存器(IMR)等。 ```c RCC_AHBPeriphClockCmd(RCC_AHBPeriph_NVIC, ENABLE); // 启动NVIC的总线时钟 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; // 指定中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 设置预抢占优先级,即中断的优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 设置子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 开启中断 NVIC_Init(&NVIC_InitStructure); ``` 2. **确定中断源的优先级**:在确定了中断源之后,接下来就需要为其配置优先级。在实际应用中,通常会根据中断源的重要性和实时性的需求来决定其优先级。 3. **检查和调试**:完成中断配置后,需要通过添加一些诊断代码来验证中断是否按预期工作,并检查优先级配置是否正确影响了中断响应顺序。 ### 示例代码片段 ```c // 初始化NVIC NVIC_InitTypeDef NVIC_InitStructure; NVIC_DeInit(); // 清空NVIC配置 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置优先级分组为等级2(低延迟) // 分配中断源 EXTI_InitTypeDef s_EXTI_Init; s_EXTI_Init.Line = EXTI_Line0; // 仅示例,实际应根据需要设置正确的引脚线号 s_EXTI_Init.mode = EXTI_Mode_Interrupt; // 使用中断模式 s_EXTI_Init.Trigger = EXTI_Trigger_Rising; // 上升沿触发 EXTI_Init(&s_EXTI_Init); // 开始中断服务例程 void EXTI0_IRQHandler(void) { if(__HAL_GPIO_GET_IT_SOURCE(GPIO_PIN_0)) { // 检查是否有中断发生 HAL_NVIC_SetPendingIRQ(EXTI0_IRQn); // 将中断标记为已准备就绪供中断处理程序使用 __HAL_GPIO_CLEAR_IT(GPIO_PIN_0); // 确保中断标志清除 } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光の尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值