900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > stm32外部中断问题(每次stm32进行系统复位按键控制NRST=0 程序立马进入中断服务函数)

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

时间:2021-09-16 18:36:34

相关推荐

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 );

}

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。