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

4星 · 超过85%的资源 需积分: 49 28 下载量 84 浏览量 更新于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系列微控制器的中断管理中扮演着核心角色,理解并正确配置它对于实现高效稳定的嵌入式系统至关重要。学习和掌握这部分内容对于初学者而言,是理解和调试嵌入式系统中断行为的基础。
2023-07-22 上传

void Encoder_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period = 1000 - 1; TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1; TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure); TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); TIM_Cmd(TIM1, ENABLE); GPIO_InitTypeDef GPIO_InitStructure1; GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_IPU; GPIO_InitStructure1.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure1); GPIO_InitTypeDef GPIO_InitStructure2; GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_IPU; GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13; GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure2); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource4); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource10); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource11); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13); EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1|EXTI_Line4|EXTI_Line5|EXTI_Line10|EXTI_Line11|EXTI_Line12|EXTI_Line13; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_Init(&EXTI_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitTypeDef NVIC_InitStruct1; NVIC_InitStruct1.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStruct1.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct1.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStruct1.NVIC_IRQChannelSubPriority = 0x00; NVIC_Init(&NVIC_InitStruct1); NVIC_InitTypeDef NVIC_InitStruct2; NVIC_InitStruct2.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStruct2.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct2.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStruct2.NVIC_IRQChannelSubPriority = 0x00; NVIC_Init(&NVIC_InitStruct2); NVIC_InitTypeDef NVIC_InitStruct3; NVIC_InitStruct3.NVIC_IRQChannel = EXTI4_IRQn; NVIC_InitStruct3.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct3.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStruct3.NVIC_IRQChannelSubPriority = 0x00; NVIC_Init(&NVIC_InitStruct3); NVIC_InitTypeDef NVIC_InitStruct4; NVIC_InitStruct4.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStruct4.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct4.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStruct4.NVIC_IRQChannelSubPriority = 0x00; NVIC_Init(&NVIC_InitStruct4); NVIC_InitTypeDef NVIC_InitStruct5; NVIC_InitStruct5.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStruct5.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct5.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStruct5.NVIC_IRQChannelSubPriority = 0x00; NVIC_Init(&NVIC_InitStruct5); }stm32f103系列芯片,当这段代码初始化时,以PA2PA3初始化的串口不能正常工作,是为什么

2023-05-18 上传