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