详解STM32F10x NVIC_Init函数及其功能与流程

4星 · 超过85%的资源 需积分: 49 28 下载量 8 浏览量 更新于2024-09-18 收藏 31KB TXT 举报
NVIC_Init是STM32F10x系列微控制器中的一个重要初始化函数,它位于`stm32f10x_nvic.c`文件中,由MCD Application Team编写。这个函数的主要作用是对系统中断向量控制器(NVIC,Nested Vectored Interrupt Controller)进行配置,以便正确地管理和调度微控制器内部以及外部中断事件。NVIC_Init函数接受一个NVIC_InitTypeDef类型的参数NVIC_InitStruct,这个结构体包含了用户需要设置的各种中断参数。 NVIC_Init函数执行流程详解如下: 1. 函数开始,首先检查NVIC_InitStruct的有效性,确保传递的数据结构没有错误。这一步对于理解和调试中断配置至关重要。 2. 函数通过NVIC_InitStruct中的成员,如 NVIC_PriorityGrouping、NVIC_IRQPreemptionPriority、NVIC_IRQSubPriority等,来设置中断优先级。这些设置影响中断事件的处理顺序和中断线程是否可以被抢占。高优先级的中断会打断低优先级的中断处理。 3. 接着,NVIC_Init根据中断组设置(NVIC_PriorityGrouping)调整了所有中断的优先级范围。优先级组决定了中断优先级的步进值,不同的优先级组提供了不同的中断响应时间。 4. 对于每个中断源,NVIC_Init会根据用户指定的中断处理函数和优先级,更新中断向量表(Interrupt Vector Table,IVT)。IVT是一个硬件映射表,它将中断请求映射到相应的处理函数地址。 5. 在配置中断向量表的同时,函数还会初始化中断屏蔽寄存器,控制哪些中断可以被处理器响应。用户可以通过设置NVIC_InitStruct的中断使能标志来开启或关闭特定中断。 6. 最后,NVIC_Init函数可能还会配置其他与中断相关的特性,如全局中断使能(Global Interrupt Enable, GIE)和处理器模式切换(如从低优先级模式进入系统管理模式)。 在整个过程中,NVIC_Init函数的设计目标是简化中断配置过程,使得开发人员能够快速、有效地管理中断处理,从而提高系统的响应速度和可靠性。然而,需要注意的是,虽然该函数提供了指导,但实际使用时仍需谨慎处理,因为错误的配置可能导致中断混乱,甚至系统不稳定。 NVIC_Init函数在STM32F10x系列微控制器的中断管理中扮演着核心角色,理解并正确配置它对于实现高效稳定的嵌入式系统至关重要。学习和掌握这部分内容对于初学者而言,是理解和调试嵌入式系统中断行为的基础。

在保持原来的代码逻辑的条件下,根据STM32F407的特性,把下面STM32F1的代码移植到STM32F407。void ExtiGpioInit(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5 ; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStruct); } void ExtiNvicInit(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void ExtiModeInit(void) { EXTI_InitTypeDef EXTI_InitStructure; GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource4); EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_Line = EXTI_Line4; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5); EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_Line = EXTI_Line5; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); }

2023-07-09 上传
2023-07-22 上传