完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
编写中断函数及配置中断时,代码没有问题,使用GPIOA PA11作为中断,程序烧录后一直无法运行,追踪了好久,程序一直死在启动文件.s的B.中,搜索大神们关于程序卡死在B.文件中
但是我找了半天,很确信中断函数都进行了处理处理,说明不是这个问题。继续探究,先附上代码,解决方法如下: void GPIO_InterFuntionInit(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能端口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为2MHz GPIO_Init(GPIOA, &GPIO_InitStructure); // EXTI_DeInit(); EXTI_StructInit(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource11); EXTI_InitStructure.EXTI_Line=EXTI_Line11; //配置EXTI中断线 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //配置EXTI模式为中断 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; //配置EXTI触发方式 EXTI_InitStructure.EXTI_LineCmd=ENABLE; //使能EXTI中断线 EXTI_Init(&EXTI_InitStructure); //根据指定的参数初始化EXTI寄存器 NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //EXTIx 中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化NVIC寄存器 //EXTI_GenerateSWInterrupt(EXTI_Line12); } void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line11)!=RESET) { EXTI_ClearITPendingBit(EXTI_Line11); SendData(USE_USART1,(u8*)“EXTI15_10_IRQnHandlerrn”); MCU_RUN_LED(1); delay_ms(1000); } } 解决方法: 原来除了我在主函数中声明了 GPIO_InterFuntionInit();外,还声明了一个函数DeviceInfo_Read();,这个函数是用来读取STM32的唯一标识符的,问题就出在这个函数,函数内容如下: u32 DeviceInfo_Read(void) { u8 iTempStr[512]; u16 tt1,tt2; STMFLASH_Read(DEVICE_INFO_ADD,(u16*)iTempStr,64); //delay_ms(50); tt1 = Str_PosLtoR((char*)iTempStr,“startid:”,1); tt2 = Str_PosRtoL((char*)iTempStr,“:end”,1); if((tt1==0) || (tt2==0)){ return 0; } else{ tt1 = Str_Pos((char*)iTempStr,“startid:”); tt2 = Str_Pos((char*)iTempStr,“:end”); Str_SubString((char*)iTempStr,tt1,tt2-tt1); DEVICE_NUMBER = Str_StrToNum((char*)iTempStr,1); } if(DEVICE_NUMBER) return DEVICE_NUMBER; return 0; } 函数会读取STM32 FLASH上的内容,同时也会读取stm32的唯一标识符。这个与中断冲突了,屏蔽这个函数就OK了。 另一种可能:NVIC中断优先级配置冲突。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:57 , Processed in 0.616791 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号