NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
时间: 2023-12-06 21:43:44 浏览: 185
这段代码是关于中断优先级的配置,具体来说:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
这句代码是设置NVIC的优先级分组,一共有4个分组,这里设置为分组0。
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
这句代码是设置触发中断的外部中断线,这里设置为EXTI0。
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
这句代码是设置中断抢占优先级,这里设置为0。
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
这句代码是设置中断响应优先级,这里设置为2。
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
这句代码是使能中断通道。
NVIC_Init(&NVIC_InitStructure);
这句代码是将上述配置应用到NVIC中,使其生效。
相关问题
解释下这串代码NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure);
这段代码是用于配置中断优先级的设置。让我逐行解释:
1. `NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);` - 这个函数用于配置中断优先级分组。`NVIC_PriorityGroup_2` 表示将中断优先级分为两组,其中一组用于抢占优先级,另一组用于子优先级。
2. `NVIC_InitTypeDef NVIC_InitStructure;` - 定义了一个名为 `NVIC_InitStructure` 的类型为 `NVIC_InitTypeDef` 的变量。
3. `NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;` - 设置中断通道为 `EXTI15_10_IRQn`,表示要配置的是外部中断线15到10的中断通道。
4. `NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;` - 设置中断通道的使能状态为启用。这意味着中断通道将会被使能,可以触发中断。
5. `NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;` - 设置抢占优先级为1。抢占优先级用于确定在多个中断同时发生时,哪个中断具有更高的优先级。
6. `NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;` - 设置子优先级为1。子优先级用于确定在同一抢占优先级内,不同中断之间的优先级关系。
7. `NVIC_Init(&NVIC_InitStructure);` - 通过调用 `NVIC_Init()` 函数,将以上配置应用到指定的中断通道上。
这段代码的目的是配置外部中断线15到10的中断通道的优先级,使其能够按照指定的抢占优先级和子优先级进行中断处理。
int16_t Encoder_Num; void Encoder_Init (void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_InitTypeDef GPIO_Initstructure; GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_Initstructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1; GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_Initstructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0|GPIO_PinSource1); EXTI_InitTypeDef EXTI_Initstructure; EXTI_Initstructure.EXTI_Line=EXTI_Line0|EXTI_Line1; EXTI_Initstructure.EXTI_LineCmd=ENABLE; EXTI_Initstructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_Initstructure.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_Init(&EXTI_Initstructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitTypeDef NVIC_Initstructure; NVIC_Initstructure.NVIC_IRQChannel=EXTI0_IRQn; NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=1; NVIC_Initstructure.NVIC_IRQChannelSubPriority=1; NVIC_Init(&NVIC_Initstructure); NVIC_Initstructure.NVIC_IRQChannel=EXTI1_IRQn; NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_Initstructure.NVIC_IRQChannelSubPriority=2; NVIC_Init(&NVIC_Initstructure); } int Encoder_get() { int16_t temp; temp=Encoder_Num; Encoder_Num=0; return temp; }void EXTI0_IRQHandler () { if (EXTI_GetITStatus(EXTI_Line0)==SET) { if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0) { if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==1) { Encoder_Num--; } else { Encoder_Num++; } } EXTI_ClearITPendingBit(EXTI_Line0); } }
根据您提供的代码,有几个可能导致中断不触发的问题:
1. 外部中断线未正确配置:根据您的代码,外部中断线0已经正确配置为中断模式并连接到GPIOB的引脚0。但是,您需要确保外部中断线1也正确连接到GPIOB的引脚1,并进行相应的配置。
2. 中断优先级设置不正确:根据代码,中断优先级已经设置为EXTI0_IRQn的优先级为1,EXTI1_IRQn的优先级为2。但是,您需要确保这些优先级高于其他可能存在的中断。
3. 中断触发方式设置不正确:根据代码,中断触发方式被配置为下降沿触发。如果您期望使用上升沿触发或其他触发方式,请相应地调整`EXTI_Initstructure.EXTI_Trigger`参数。
请确保以上问题得到正确解决,并检查硬件连接是否正确。如果问题仍然存在,请提供更多关于硬件环境和其他相关代码的信息,以便更好地帮助您解决问题。
阅读全文