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也不会退出循环吗? |
STMS005K6T6 如何采集内部参考电压。
stm8s003 adc中断和通道切换的问题
adc施密特触发器stm8
stm8l051f3 TSSOP20 封装,待机模式下,2天后,电流突然增加到140UA
STM8S用STVP烧录怎么加密?
如何使用ST官网例程_LIN总线通讯_STM8AF
STM8 LIN
IAR代码编辑太费劲了,想问一下有没有好的方法,试了VScode但是头文件老是报错,调了很久也没调好,想换个方法了。
想问一下各位大佬,IAR下载调试代码时出现 warning: is an illegal data sample expression IAR是什么意思啊?
STM8S标准库TIM1编码器功能不计数,请大师帮我看看
#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导通,强输出电源电压。这就是推挽原理。推即往出推,挽即往回拉。
评分
查看全部评分
谢谢这位坛友的纠正