打印
[STM32F1]

为什么中断出来看门狗会复位?

[复制链接]
2149|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32F103   3.5的库
我配置的是IWDG,独立看门狗。配置时间是1.92S不喂狗就复位,500ms喂狗。配置如下:
void IWDG_Configuration(void)
{       
        RCC_LSICmd(ENABLE);          //打开LSI
        while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET); //等待直到LSI稳定
        IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);         //向IWDG_KR中写入0x5555,解除IWDG_PR和IWDG_RLR写保护
        IWDG_SetPrescaler(IWDG_Prescaler_256);  /*设置IWDG预分频值为256,IWDG时钟频率 = LSI/32 = 32(40)Khz/256*/       
          IWDG_SetReload(300);   /*300*256/32(40)k = 1.92 ,不能大于4095(0~0xFFF)*/
        IWDG_ReloadCounter();  /*在IWDG_KR中写入0xAAAA,喂狗*/
        IWDG_Enable();                  /*在IWDG_KR中写入0xCCCC,使能LSI RC振荡器,启用独立看门狗*/
}

/***********************Systick 500ms喂狗*********2014-1-6****************/
void SysTick_Handler(void)
{
        systick_nums++;
        if(systick_nums == 50)                                 
        {
                IWDG_ReloadCounter();
                systick_nums = 0;
        }
}


我现在有个问题就是:
主函数的while(1)里检测GPS是否有效,大概1分钟左右(120次)无效就发送单次北斗定位,然后启动TIM5检测如果10分钟无效就启动一定频度的北斗定位。但现象是一旦发送完BD1_DWSQ(XTCS.routefreq2 * 60); ,并且跳回到while(1)后面继续执行几句,系统就会复位。
我能保证TIM5设置正确,请问为什么啊?

while(1)
{
..........................
        /****************GPS无效时启动BD1定位*********************************/
                if(error_nums > 120)          //通过一定次数统计确认GPS无效         120次是否合理待测试?
                {
                        if(tim5_begin == 0)
                        {
                                BD1_DWSQ(0);    //单次北斗定位
                                TIM_Cmd(TIM5, ENABLE);
                                tim5_begin = 1;
                        }
                        error_nums = 1;       
                }

                if(tim5_end == 1)
                {
                        //复位GPS模块
                        GPIO_ResetBits(GPIOE , GPIO_Pin_7);                                               
                        delay_ms(5); //拉低5ms
                        GPIO_SetBits(GPIOE , GPIO_Pin_7);

                        TIM_Cmd(TIM5, DISABLE);
                        tim5_end = 0;       
                }                                                                                 //从TIM5中断跳出再执行到这到这就会复位!

                if((error_nums == 0) && (tim5_begin == 1))
                {
                        tim5_begin = 0;
                        GPS_error = 0;
                        BD1_JSZL("DWSQ");
                }
.........................
}

/*************************************************************************
                          TIM5中断处理函数

目的: 20秒定时,10分钟后启动BD1定位,并复位GPS
*************************************************************************/
void TIM5_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)         
        {
                TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
                tim5_nums++;
                if(tim5_nums == 30)
                {
                        BD1_DWSQ(XTCS.routefreq2 * 60);
                        GPS_error = 1;           //通知GPS无效,多位置数据包立刻发送出去的标志
                        tim5_nums = 0;               
                        tim5_end = 1;         //通知关闭TIM5的标志       
                }
                TIM_ClearFlag(TIM5, TIM_IT_Update);               
        }
}


沙发
lqab1983|  楼主 | 2014-2-21 14:48 | 只看该作者
能帮忙看看不

使用特权

评论回复
板凳
airwill| | 2014-2-21 14:54 | 只看该作者
看样子, 好象跟 BD1_DWSQ(XTCS.routefreq2 * 60); 有关, 那这个函数执行需要多少时间?

使用特权

评论回复
地板
lqab1983|  楼主 | 2014-2-21 16:39 | 只看该作者
我也有些怀疑!恕我水平低,不太会看调试窗口,也不知道是否调试的对,个人看调试感觉大概是200多毫秒

使用特权

评论回复
5
airwill| | 2014-2-21 19:59 | 只看该作者
lqab1983 发表于 2014-2-21 16:39
我也有些怀疑!恕我水平低,不太会看调试窗口,也不知道是否调试的对,个人看调试感觉大概是200多毫秒 ...

如果不会看调试窗口, 那就学习学习, 了解工具可以事半功倍
当然还有别的办法, 比如通过反转 IO 口的办法, 用示波器测反转时间.
测定时器的计数值来计算等

使用特权

评论回复
6
lqab1983|  楼主 | 2014-2-22 22:18 | 只看该作者
那有经验的同仁们,你们觉得我这个现象问题一般在哪?

使用特权

评论回复
7
zchong| | 2014-2-23 11:36 | 只看该作者
如果看门狗、定时器设置都没有问题,那基本上就是因为某些处理超时了
不妨按照airwill说的,通过一个IO翻转,看看哪里超时

使用特权

评论回复
8
outstanding| | 2014-2-23 16:44 | 只看该作者
支持一下

使用特权

评论回复
9
lqab1983|  楼主 | 2014-2-24 08:52 | 只看该作者
好吧,我再按照你们说的测试下,我也觉得可能是超时了,谢谢了。

使用特权

评论回复
10
Ketose| | 2014-2-24 13:01 | 只看该作者
我严重怀疑你的:delay_ms(5); //拉低5ms

使用特权

评论回复
11
lqab1983|  楼主 | 2014-2-26 10:06 | 只看该作者
为什么?我用示波器看了 确实是5ms,但我不敢确定的是delay用的是Systick,是否会有问题
/*******************************************************************
                 SysTick延时函数  1ms          2013-12-13
********************************************************************/

void delay_ms(u16 nms)
{
        u32 temp;
        SysTick->LOAD = 9000*nms;
        SysTick->VAL = 0x00;//清空计数器
        SysTick->CTRL = 0x01; //使能,减到零时无动作,采用外部时钟源
        do
        {
                temp = SysTick->CTRL;//读取当前计数值
        }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
        SysTick->CTRL = 0x00; //关闭计数器
        SysTick->VAL = 0x00; //清空计数器
}

使用特权

评论回复
12
lqab1983|  楼主 | 2014-2-26 14:41 | 只看该作者
我用了个愚笨的办法,开通TIM8 1ms定时器,只要开始执行爱死机的BD1_DWSQ(XTCS.routefreq2 * 60);就开始计数直道复位为止,测出来的是449ms,我默认设置的是500ms喂次狗,1.92秒不喂就复位,我这有问题吗

使用特权

评论回复
13
lqab1983|  楼主 | 2014-2-26 17:00 | 只看该作者
自己再顶一下

使用特权

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

本版积分规则

17

主题

53

帖子

0

粉丝