资源描述:
《stm32在SRAM中调试部分中断不响应的问题》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、stm32在SRAM中调试部分中断不响应的问题 因为stm32在flash区擦写的次数有限,所以我选择在sram中调试,SRAM擦除次数无限次,不过掉电代码就消失。代码放在SRAM中,对于我们调试是非常有帮助的。(我用的是原子的开发板) 最近这几天发现,在SRAM中调试,部分中断不响应的问题,比如RTC秒中断,明明使能了秒中断,可是总是卡在某个地方不动,然后怎么也进入不了中断。下面是我的代码。结合代码说明问题吧。 rtc.h文件中代码 #ifndef__RTC_H#define__RTC_Htypedef
2、struct{ u8m; u8h; u8s;}calendar;externcalendarrl;externu8tim_bz;u8RTC_Init(void);#endifrtc.c文件中代码#include"sys.h"#include"delay.h"#include"rtc.h"u8tim_bz=0;calendarrl;u8RTC_Init(void){ u8temp=0; if(BKP->DR1!=0X5050)//检测是不是第一次配置,后面会有向BKP->DR1写数据的语句 { //1,使能电源时
3、钟和备份区域时钟 RCC->APB1ENR
4、=1<<28;//电源接口时钟使能 RCC->APB1ENR
5、=1<<27;//备份接口时钟使能 //2,取消备份区域写保护,需要向备份区域写 //一个字节来标记时钟已经配置过了,避免每次复位启动 PWR->CR
6、=1<<8;//取消后备区域的写保护 //3,复位备份区域,开启外部低速振荡器 RCC->BDCR
7、=1<<16;//备份域软件复位 RCC->BDCR&=~(1<<16);//备份域软件复位清,因为备份域软件复位要由软件清除,且不能一直复
8、位。 RCC->BDCR
9、=1<<0;//外部低速时钟使能 while((!(RCC->BDCR&0X02))&&temp<250)//判断rtc外部低速振荡器是否就绪 { temp++; delay_ms(10); } if(temp>=250)return1;//初始化失败,外部晶振有问题 //4,选择RTC时钟源并使能 RCC->BDCR
10、=1<<8;//LSE振荡器作为rtc时钟 RCC->BDCR
11、=1<<15;//RTC时钟使能 while(!(RTC->CRL&(1<<5
12、)));//等待rtc写操作完成 while(!(RTC->CRL&(1<<3)));//等待RTC寄存器和APB1接口同步 RTC->CRH
13、=0x01;//允许秒中断 while(!(RTC->CRL&(1<<5)));//等待rtc写操作完成 RTC->CRL
14、=1<<4;//允许配置RTC寄存器 RTC->PRLH=0x0000; RTC->PRLL
15、=32767;//设置RTC时钟频率为1hz RTC->CNTL=0x0005; RTC->CNTH=0X0000; RTC->CRL&=
16、~(1<<4);//配置更新 while(!(RTC->CRL&(1<<5)));//等待rtc写操作完成 RTC->CRL&=~(1<<5);//rtc操作关闭 BKP->DR1=0X5050; } else { while(!(RTC->CRL&(1<<3)));//等待RTC寄存器和APB1接口同步 RTC->CRH
17、=0x01;//允许秒中断 while(!(RTC->CRL&(1<<5)));//等待rtc写操作完成 } MY_NVIC_Init(0,0,RTC_IRQn,2);//设置
18、中断 return0;}voidRTC_IRQHandler(void){ if(RTC->CRL&0X01) { tim_bz=1;//进入中断标志,等下判断是否发生中断 RTC->CRL&=~(1<<0);//清除秒标志 while(!(RTC->CRL&(1<<5)));//等待rtc写操作完成 }} 主函数代码#include"sys.h"#include"usart.h" #include"delay.h" #include"led.h"#include"beep.h" #inclu
19、de"key.h" #include"exti.h" #include"wdg.h" #include"timer.h" #include"tpad.h" #include"lcd.h"#include"rtc.h" intmain(void){ u32TimeData=0; Stm32_Clock_Init(9);