hejun96 发表于 2019-8-30 17:49:45

STM8S003中主函数中执行完while(1)自动跳出循环的问题

void main(void)
{
    init();                  /* 初始化 */

    while (1)
    {

               
                IWDG_FEED;      /*喂狗*/

#if DEBUG
                LED_BG_ON;
#endif

                BEEP_ON;
                delay_ms(1000);
                IWDG_FEED;
               
                BEEP_OFF;
                delay_ms(1000);
                IWDG_FEED;
               
                KOUT_scan();                   /*按键扫描*/
                IWDG_FEED;   /*喂狗*/
                UART1_Heartbeat_Parse(&Recv);/*解析心跳包*/
                IWDG_FEED;   /*喂狗*/
                //Display();                     /*LCD显示*/


               
               
               
    }
}

在上面这段主函数的代码中,如果不加看门狗IWDG_FEED,程序执行完while(1)后就会自动跳出,为什么会非要加看门狗才不会跳出while(1)?不应该是不加IWDG_FEED也不会退出循环吗?

TLLED 发表于 2019-8-30 18:41:10

是不是看门狗IWDG_FEED设置的时间太小,机器重启了

hejun96 发表于 2019-8-30 19:14:15

TLLED 发表于 2019-8-30 18:41
是不是看门狗IWDG_FEED设置的时间太小,机器重启了

#define IWDG_FEED         (IWDG->KR = IWDG_KEY_REFRESH)

#define IWDG_KEY_REFRESH    ((uint8_t)0xAA)


时间不小吧

wenyangzeng 发表于 2019-8-30 19:45:04

循环中的delay_ms(1000)应该就超过喂狗的时间了。

hejun96 发表于 2019-8-30 19:54:30

wenyangzeng 发表于 2019-8-30 19:45
循环中的delay_ms(1000)应该就超过喂狗的时间了。
果然如此,窗口看门狗的复位时间是0xAA,最大也就是255,而我设置的1000大于了这个时间值,谢谢坛友还有一个问题,就是我的蜂鸣器初始化了,但是没有响,不知道是什么问题
//main.c

/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"

#include "stdlib.h"
#include "stdio.h"
#include "main.h"
#include "beep.h"


//#include "clock.h"
#include "key.h"
#include "led.h"
#include "uart.h"
#include "timer.h"
#include "ht1621b.h"
#include "wdg.h"
#include "MotorWinding.h"

/* 结构体*/
//time_t time = {0};
extern Kout_status_t Key_status;
extern Recv_Data_t Recv;
extern System_t SystemStatus;



/*
* 初始化成员变量
*/
void init(void)
{

    CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV); /* 16MHz */   
    CLK->CKDIVR |= (uint8_t)CLK_PRESCALER_HSIDIV1;/* Set High speed internal clock prescaler */

    timer4_init();                        /* timer4初始化,延时、定时器初始化 */

    timer1_init();

    KEY_LED_init();                      /* 按键灯初始化*/

    LED_Background_init();               /* 背光灯初始化 */

    KOUT_init();                         /* 按键初始化 */

    Ht1621_Init();                                                /* HT1621显示屏初始化 */

    UART_init();                        /* 串口通信初始化 */

    enableInterrupts() ;                              /* 全局中断使能 */

    WatchDog_init();                                        /* 看门狗初始化 */

      beep_init(BEEP_FREQUENCY_4KHZ);//Initial beep
               
      motor_winding_init();//马达螺旋浆初始化
      water_bump_init();//水泵初始化
      
    LED_BG_ON;//背光灯打开

    SystemStatus.led_state = 1;
}



void main(void)
{
    init();                  /* 初始化 */

    while (1)
    {
               
                        
                IWDG_FEED;      /*喂狗*/

#if DEBUG
                LED_BG_ON;
#endif

                BEEP_ON;
                delay_ms(100);
                //IWDG_FEED;
               
                BEEP_OFF;
                delay_ms(100);
                //IWDG_FEED;
               
                KOUT_scan();                   /*按键扫描*/
                IWDG_FEED;   /*喂狗*/
                UART1_Heartbeat_Parse(&Recv);/*解析心跳包*/
                IWDG_FEED;   /*喂狗*/
                //Display();                     /*LCD显示*/


               
               
               
    }
}



void assert_failed(u8* file, u32 line)
{
         /* User can add his own implementation to report the file name and line number,
         ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
      /* Infinite loop */
      while (1)
      {
      }
}





//beep.c
#include "beep.h"
#include "stm8s_clk.h"


//#include "pbdata.h"

/**
*@brief:Ininial beep function
*@param:BEEP_Frequency
*
*
*@retval:None
*/
void beep_init(BEEP_Frequency_TypeDef BEEP_Frequency)//Ininial beep function
{
          CLK_LSICmd(ENABLE);//使能内部低速时钟
      BEEP_Init(BEEP_Frequency);//初始化蜂鸣器
      BEEP_Cmd(ENABLE);
      BEEP_LSICalibrationConfig(128000);//低速内部时钟128kHz
      
}


//beep.h

#ifndef _BEEP_H_
#define _BEEP_H_


#include "stm8s.h"


#define BEEP_GPIO        GPIOC
#define BEEP_PIN        GPIO_PIN_1

#define BEEP_ON   (BEEP_GPIO->ODR |= BEEP_PIN)
#define BEEP_OFF(BEEP_GPIO->ODR &= (~BEEP_PIN))

void beep_init(BEEP_Frequency_TypeDef BEEP_Frequency);


#endif


wenyangzeng 发表于 2019-8-31 16:11:36

hejun96 发表于 2019-8-30 19:54
果然如此,窗口看门狗的复位时间是0xAA,最大也就是255,而我设置的1000大于了这个时间值,谢谢坛友还有一 ...

蜂鸣器有2种类型,通电就响和需要脉冲驱动才响2种

hejun96 发表于 2019-8-31 17:38:01

wenyangzeng 发表于 2019-8-31 16:11
蜂鸣器有2种类型,通电就响和需要脉冲驱动才响2种
脉冲就是输出一个高电平或者是低电平触发吧,比如这个图是触发蜂鸣器推挽输出

wenyangzeng 发表于 2019-8-31 19:22:20

hejun96 发表于 2019-8-31 17:38
脉冲就是输出一个高电平或者是低电平触发吧,比如这个图是触发蜂鸣器推挽输出 ...

是高、低电平脉冲驱动蜂鸣器。单端驱动而非推挽。

hejun96 发表于 2019-8-31 19:48:00

wenyangzeng 发表于 2019-8-31 19:22
是高、低电平脉冲驱动蜂鸣器。单端驱动而非推挽。

但是这个图的蜂鸣器不是如果内部输入一个高电平,那么应该输出一个低电平;如果内部输入一个低电平,则需要输出一个高电平,不就是推挽输出?

toofree 发表于 2019-8-31 20:49:26

hejun96 发表于 2019-8-31 19:48
但是这个图的蜂鸣器不是如果内部输入一个高电平,那么应该输出一个低电平;如果内部输入一个低电平,则需 ...

推挽的概念没搞清楚啊,
简单的说,COMS就是推挽,上半部PMOS、下半部NMOS。
当栅级输入为逻辑1时,NMOS导通,强输出0;当栅级输入为逻辑0时,PMOS导通,强输出电源电压。这就是推挽原理。推即往出推,挽即往回拉。
页: [1] 2
查看完整版本: STM8S003中主函数中执行完while(1)自动跳出循环的问题