stm32外部中断问题(每次stm32进行系统复位按键控制NRST=0,程序立马进入中断服务函数)

rf射频数据收发芯片的一个数据接收指示引脚连接stm32的一个gpio口,设置为中断口。当rf接收到数据的时候,数据接收指示引脚由高电平变为低电平,所以中断配置里面配置的是IPU,下降沿触发。系统复位后,发送模块没有发送数据,也就是说这个接收模块没有接收到数据,这个中断口根本不会触发立马。可是实际上是一旦复位,在线调试发现k=100,说明进入中断服务函数,不得其解,大佬帮忙看看是不是配置错误呢。中断代码如下:

#include "wakeup_interrupt.h"


extern uint8_t Signalll;
uint8_t g_RF24L01RxBuffer[ 32 ] = { 0 }; 
uint32_t t=0,i = 0,n=0,k=0;
const char *g_changeok = "changeok";
const char *g_wakingup = "wakingup";




void wakeup_interrupt_Configuration(void)
{
    GPIO_InitTypeDef    GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_Init(GPIOA, &GPIO_InitStructure);


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA , GPIO_PinSource12);
}


//*****外部事件的配置函数
void EXTI_Configuration(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;


    /*PA12外部中断输入*/
    EXTI_InitStructure.EXTI_Line = EXTI_Line12;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd    = ENABLE; 
    EXTI_Init(&EXTI_InitStructure);
}


//*********中断配置函数
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);


    /*外部中断线*/
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn ;      
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0 ;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE ;
    NVIC_Init(&NVIC_InitStructure);
}




//**********中断服务函数
void EXTI15_10_IRQHandler(void)
{
    k=100;
    if(EXTI_GetITStatus(EXTI_Line12)!= RESET)  
    {  
        EXTI_ClearITPendingBit(EXTI_Line12);
        Signalll = 50;
i = CC1101_Rx_Packet( g_RF24L01RxBuffer ); //此程序里面包含了打开spi模式
if((g_RF24L01RxBuffer[0])!=0)
{
drv_uart_tx_bytes(g_RF24L01RxBuffer, 32 );
}

if(memcmp(g_wakingup,g_RF24L01RxBuffer,8) == 0)//判断接收到的字符串
{
drv_uart_tx_bytes("recieved waking up command", 26 );
t=10;
CC1101_Set_Idle_Mode( );

n=1;
while(1)
{

CC1101_Tx_Packet( (uint8_t *)g_changeok, 8 , ADDRESS_CHECK );
t=2;
//输出发送的数据到串口显示器
drv_delay_500Ms( 1 );
drv_delay_500Ms( 1 );
}
}
    }    

}



除此之外,主程序里面的灯不闪烁,貌似是被直接中断了,下面是部分main程序:

int main( void )
{
//串口初始化,设置波特率
drv_uart_init( 115200 );

//延时初始化
drv_delay_init( );


//LED初始化
drv_led_init( );


//SPI初始化
drv_spi_init( );


//CC1101初始化
CC1101_Init( );

//唤醒时中断的相关配置
wakeup_interrupt_Configuration();
NVIC_Configuration();
  EXTI_Configuration();

for(a=0;a<6;a++)//红灯绿灯分别亮灭3次代表初始化成功,处于发送或接收状态
{
led_red_flashing( );
led_green_flashing( );
drv_delay_500Ms( 1 );

}


系统复位时,理论上程序从头到尾运行,然而上面的红灯绿灯没有闪烁。





















猜你喜欢

转载自blog.csdn.net/dkkknight/article/details/80650635