你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
踮起脚摘苹果 提问时间:2019-8-30 17:49 /
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也不会退出循环吗?

收藏 评论10 发布时间:2019-8-30 17:49

举报

10个回答
TLLED 回答时间:2019-8-30 18:41:10
是不是看门狗IWDG_FEED设置的时间太小,机器重启了
踮起脚摘苹果 回答时间: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)应该就超过喂狗的时间了。
无标题.png

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

踮起脚摘苹果 回答时间: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种
踮起脚摘苹果 回答时间:2019-8-31 17:38:01
wenyangzeng 发表于 2019-8-31 16:11
蜂鸣器有2种类型,通电就响和需要脉冲驱动才响2种

脉冲就是输出一个高电平或者是低电平触发吧,比如这个图是触发蜂鸣器推挽输出
beep.png
STM8S003_beep.png
wenyangzeng 回答时间:2019-8-31 19:22:20
hejun96 发表于 2019-8-31 17:38
脉冲就是输出一个高电平或者是低电平触发吧,比如这个图是触发蜂鸣器推挽输出 ...

是高、低电平脉冲驱动蜂鸣器。单端驱动而非推挽。
踮起脚摘苹果 回答时间:2019-8-31 19:48:00
wenyangzeng 发表于 2019-8-31 19:22
是高、低电平脉冲驱动蜂鸣器。单端驱动而非推挽。

但是这个图的蜂鸣器不是如果内部输入一个高电平,那么应该输出一个低电平;如果内部输入一个低电平,则需要输出一个高电平,不就是推挽输出?
七哥 回答时间:2019-8-31 20:49:26
hejun96 发表于 2019-8-31 19:48
但是这个图的蜂鸣器不是如果内部输入一个高电平,那么应该输出一个低电平;如果内部输入一个低电平,则需 ...

推挽的概念没搞清楚啊,
简单的说,COMS就是推挽,上半部PMOS、下半部NMOS。
当栅级输入为逻辑1时,NMOS导通,强输出0;当栅级输入为逻辑0时,PMOS导通,强输出电源电压。这就是推挽原理。推即往出推,挽即往回拉。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

踮起脚摘苹果 回答时间:2019-8-31 22:21:46
toofree 发表于 2019-8-31 20:49
推挽的概念没搞清楚啊,
简单的说,COMS就是推挽,上半部PMOS、下半部NMOS。
当栅级输入为逻辑1时,NMOS ...

谢谢这位坛友的纠正
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版