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也不会退出循环吗? |
测试标签123
IAR FOR ARM和IAR FOR STM8无法共存,
STM8L052,液晶内部电源怎么用?
STM8S103飞线外接芯片,I2C不能得到slaveAddress应答,通讯失败。
STM8S105C6T6 UART2串口,能接收数据,不能发送数据
STM8S105K4 串口2 无奇偶校验,也能接收 偶校验的 数据
在STM8S的IAP使用中断和APP使用中断问题
STM8L151 SMBUS设计
STM8S103F复位异常
STM8L的LCD调试时不亮
#define IWDG_FEED (IWDG->KR = IWDG_KEY_REFRESH)
#define IWDG_KEY_REFRESH ((uint8_t)0xAA)
时间不小吧
评分
查看全部评分
果然如此,窗口看门狗的复位时间是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
蜂鸣器有2种类型,通电就响和需要脉冲驱动才响2种
脉冲就是输出一个高电平或者是低电平触发吧,比如这个图是触发蜂鸣器推挽输出
是高、低电平脉冲驱动蜂鸣器。单端驱动而非推挽。
但是这个图的蜂鸣器不是如果内部输入一个高电平,那么应该输出一个低电平;如果内部输入一个低电平,则需要输出一个高电平,不就是推挽输出?
推挽的概念没搞清楚啊,
简单的说,COMS就是推挽,上半部PMOS、下半部NMOS。
当栅级输入为逻辑1时,NMOS导通,强输出0;当栅级输入为逻辑0时,PMOS导通,强输出电源电压。这就是推挽原理。推即往出推,挽即往回拉。
评分
查看全部评分