打印

打印 上一主题 下一主题GD32F103RCT6单片机使用STM32标准库开发,运行一段时间莫名死机,复位按钮无反应

[复制链接]
429|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Farng|  楼主 | 2023-8-17 13:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机型号是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();
    }
}
以下是

使用特权

评论回复
沙发
Jacquetry| | 2023-8-17 23:01 | 只看该作者
还是建议用GD的库重构一遍吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝