我正在开发一个项目,该项目将使用 pa1 和 pa2 作为外部中断,并使用 pb12 pb13 pb14 pb15 作为 LED 输出。我的目标是,当我按 pa1 LED 时,按顺序从 pb12 到 pb15 打开,当我按 pa2 LED 时将从 pb15 到 pb12 打开,换句话说,方向相反。而且 pa1 中断的优先级高于 pa2 中断。但是当我按下按钮时,无论如何我都无法从 LED 获得任何响应。
#include "stm32f4xx.h"
void delay(uint32_t time) {
time--;
}
void gpioa_config(void) { //input port (input pins are 1 2)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
GPIO_InitTypeDef gpio_init;
gpio_init.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_2;
gpio_init.GPIO_Mode=GPIO_Mode_IN;
gpio_init.GPIO_OType=GPIO_OType_PP;
gpio_init.GPIO_PuPd=GPIO_PuPd_DOWN;
gpio_init.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOA,&gpio_init);
}
void gpiob_config(void) { //output port(output pins are 12 13 14 15)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
GPIO_InitTypeDef gpiob_init;
gpiob_init.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
gpiob_init.GPIO_Mode=GPIO_Mode_OUT;
gpiob_init.GPIO_OType=GPIO_OType_PP;
gpiob_init.GPIO_PuPd=GPIO_PuPd_NOPULL;
gpiob_init.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOB,&gpiob_init);
}
void exti_config(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
EXTI_InitTypeDef exti_init;
exti_init.EXTI_Line= EXTI_Line1 | EXTI_Line2;
exti_init.EXTI_LineCmd=ENABLE;
exti_init.EXTI_Mode=EXTI_Mode_Interrupt;
exti_init.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&exti_init);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitTypeDef nvic_init;
nvic_init.NVIC_IRQChannel=EXTI1_IRQn;
nvic_init.NVIC_IRQChannelCmd=ENABLE;
nvic_init.NVIC_IRQChannelPreemptionPriority=0; // channel 1's priority is higher than channel 2's
nvic_init.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&nvic_init);
NVIC_InitTypeDef nvic_init_2;
nvic_init_2.NVIC_IRQChannel=EXTI2_IRQn;
nvic_init_2.NVIC_IRQChannelCmd=ENABLE;
nvic_init_2.NVIC_IRQChannelPreemptionPriority=1;
nvic_init_2.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&nvic_init_2);
}
void exti1_irqhandler(void) {
if (EXTI_GetITStatus(EXTI_Line1)!=RESET) {
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay(840000);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
delay(840000);
GPIO_SetBits(GPIOB,GPIO_Pin_14);
delay(840000);
GPIO_SetBits(GPIOB,GPIO_Pin_15);
delay(840000);
EXTI_ClearITPendingBit(EXTI_Line1);
}
}
void exti2_irqhandler(void) {
if(EXTI_GetITStatus(EXTI_Line2)!=RESET) {
GPIO_SetBits(GPIOB,GPIO_Pin_15);
delay(840000);
GPIO_SetBits(GPIOB,GPIO_Pin_14);
delay(84000);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
delay(84000);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay(840000);
EXTI_ClearITPendingBit(EXTI_Line2);
}
}
int main(void)
{
gpioa_config();
gpiob_config();
exti_config();
while (1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
exti1_irqhandler();
exti2_irqhandler();
}
}
我的proteus原理图或我的代码有什么问题吗?
我也配置了 nvic 来确定优先级,但没有任何变化。结果是相同的。
我的问题出在哪里?
我正在等待我的 LED 由于我的中断而打开,但由于我的中断,我的 LED 没有响应
首先延迟功能应该如何工作?您是否知道程序只是转到该函数,在该函数中实现了操作 840000-1,仅此而已 - 每个参数时间的延迟都是相同的?如果您想使用延迟,请使用例如空 for 循环:
for(int i=0; i<840000; i++)
{
// just empty loop for delay
}
此外,我怀疑这样的延迟(如果有效)会太长而无法在中断中实现。尝试使用较小的值。如果您告诉我们更多问题是什么,也会很有帮助。尝试调试代码并判断程序是否进入中断(调试时使用断点)。如果您不知道如何在 stm32 上调试代码,我相信您会在 yt 上找到很多教程。