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也不会退出循环吗?
是不是看门狗IWDG_FEED设置的时间太小,机器重启了 TLLED 发表于 2019-8-30 18:41
是不是看门狗IWDG_FEED设置的时间太小,机器重启了
#define IWDG_FEED (IWDG->KR = IWDG_KEY_REFRESH)
#define IWDG_KEY_REFRESH ((uint8_t)0xAA)
时间不小吧 循环中的delay_ms(1000)应该就超过喂狗的时间了。
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
hejun96 发表于 2019-8-30 19:54
果然如此,窗口看门狗的复位时间是0xAA,最大也就是255,而我设置的1000大于了这个时间值,谢谢坛友还有一 ...
蜂鸣器有2种类型,通电就响和需要脉冲驱动才响2种 wenyangzeng 发表于 2019-8-31 16:11
蜂鸣器有2种类型,通电就响和需要脉冲驱动才响2种
脉冲就是输出一个高电平或者是低电平触发吧,比如这个图是触发蜂鸣器推挽输出 hejun96 发表于 2019-8-31 17:38
脉冲就是输出一个高电平或者是低电平触发吧,比如这个图是触发蜂鸣器推挽输出 ...
是高、低电平脉冲驱动蜂鸣器。单端驱动而非推挽。 wenyangzeng 发表于 2019-8-31 19:22
是高、低电平脉冲驱动蜂鸣器。单端驱动而非推挽。
但是这个图的蜂鸣器不是如果内部输入一个高电平,那么应该输出一个低电平;如果内部输入一个低电平,则需要输出一个高电平,不就是推挽输出? hejun96 发表于 2019-8-31 19:48
但是这个图的蜂鸣器不是如果内部输入一个高电平,那么应该输出一个低电平;如果内部输入一个低电平,则需 ...
推挽的概念没搞清楚啊,
简单的说,COMS就是推挽,上半部PMOS、下半部NMOS。
当栅级输入为逻辑1时,NMOS导通,强输出0;当栅级输入为逻辑0时,PMOS导通,强输出电源电压。这就是推挽原理。推即往出推,挽即往回拉。
页:
[1]
2