单片机型号是GD32F103RCT6,程序是在STM32F103RCT6的模板上修改的,刚开始运行的时候正常,批量运行一断时间后出现莫名的死机问题(大概100台里面有十几台出现),死机后按复位按键无法复位。只有断电或者重新下载程序才会重新运行。经过个人排查有点像是RTC部分的问题。但是具体无法定位。望大神帮忙看看。
以下是RTC初始化函数
u8 RTC_Init(void)
{
//检查是不是第一次配置时钟
u8 temp=0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
{
BKP_DeInit(); //复位备份区域
RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
{
temp++;
DelayMS(5);
IWDG_ReloadCounter();
if(temp>=250)return 1; //初始化时钟失败,晶振有问题
}
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_EnterConfigMode(); //允许配置
RTC_SetPrescaler(32767); //设置RTC预分频的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_Set(2009,12,2,10,0,55); //设置时间
RTC_ExitConfigMode(); //退出配置模式
BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据
}
else//系统继续计时
{
RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
}
RTC_NVIC_Config(); //RCT中断分组设置
RTC_Get(); //更新时间
return 0; //ok
}
以下是主运行函数
int main(void)
{
RCC_Configuration(); //配置系统时钟,设置系统时钟为72M
NVIC_Configuration(); //配置中断
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //打开外设A的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //打开外设B的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE); //打开外设C的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE); //打开外设D的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
IWDG_Configuration();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启AFIO时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//使能JTAGDisable,即禁用JTAG接口
GPIO_INT();
UART_Init();
I2C_GPIO_Init();
time_init();
SHT_30_Init(); //SHT引脚初始化
DS18B20_Init();
//Set_Init_Password();
Initialization_Peripherals();
//SetControlEnable(0,20,0);
//SetControlEnable(0,21,0);
//SetControlEnable(0,22,0);
for(num=0;num<11;num++)
{
SetControlEnable(1,51+num,0);
SetControlEnable(1,71+num,0);
}
SetTextValue(25,11,"不可修改");
SetScreen(0);
RTC_Init();
Set_Time();
Send_TimeNHH(6,20,Now_Time);
System_Settings_Change(); //系统各项参数设置更新
DERE_0FF;
GPIO_ResetBits (GPIOA,GPIO_Pin_6); //关闭蜂鸣器
while (1)
{
if(Time_updata == 1) //屏幕修改时间将RTC时间设置成当前时间
{
Updata_RTC();
}
if(RtcUp_Flag != calendar.hour) //一小时更新一次时钟
{
RtcUp_Flag = calendar.hour;
Set_Time();
}
if(Time0_5s != 0)
{
// TSC();
Time0_5s = 0;
Read_TR_STH30(); //sht温湿度读取
Read_DS8B20();
Time_1S ++;
Time_RTC++;
}
if(Time_RTC > 1) //1S
{
Timeupdate(); //刷新当前时间变量
Time_RTC = 0;
}
Read_ID_Data2(); //读门锁
// Thunder_Read();
// Collection_Data(Initial_Floor);
Connect_ID_Usart2();
// Connect_Cpu1_Usart4();
Collection_VA_Data();
Collection_NEXT_Usart5();
DaCaiUart();
if(Alarm_start>20)
AlarmData();
UploadDataCom1(); //启动串口1上传
IWDG_ReloadCounter();
}
}
以下是 |