程序全文如下
#include "STM8S105C_S.h"
#define _RESET_WATCHDOG() IWDG_KR=0xAA //喂狗
/************************函数*****************************/
void delay(unsigned int count)
{ while(count--);
_RESET_WATCHDOG(); //喂狗同时也是封闭IWDG_PR和IWDG_RLR寄存器写功能
}
/* ==========================================================================
// ROUTINE NAME: start_watchdog
// INPUT/OUTPUT: None.
// DESCRIPTION: 起动看门狗并使之初始化. 定时时长是128kHz 固定二分频率64kHz,
// 再256分频得250Hz,计250个数得1s可产生一次复位
// ========================================================================*/
void start_watchdog(void){
IWDG_KR=0xcc; //起动IWDG命令
IWDG_KR=0x55; //开起IWDG_PR和IWDG_RLR寄存器写功能
IWDG_PR|=0x06; //写入分频值256分频
IWDG_RLR=250; //128kHz时钟经过256分频再计250个时钟脉冲
IWDG_KR=0xAA; //喂狗同时也是封闭IWDG_PR和IWDG_RLR寄存器写功能
}
/* -------------------------------------------------------------------------- */
/* ROUTINE NAME: CLK_Init */
/* INPUT/OUTPUT: None. */
/* DESCRIPTION: Initialize the clock source */
/* 1) Configure fmaster prescaler. */
/* 2) Switch HSI to HSE. */
/* 3) Enable CSS. */
/* -------------------------------------------------------------------------- */
void CLK_Init(void)
{
/* Configure clock prescaler */
CLK_CKDIVR = 0x09; /* fcpu=8M */
/* Fmaster=8M*/
/*
// To select external source by automtic switch
CLK_SWCR |= 0x02; // Enable switch 外部使用8M晶振
CLK_SWR = 0xB4; // Select HSE
while (!(CLK_SWCR & 0x08)); // Wait for switch done
// verify the external clock is selected (optional)
if (CLK_CMSR != 0xB4)
while(1); //切换时钟没有成功,停止执行
delay(10);
*/
CLK_CSSR |= 0x01; //起动外部时钟保护
//CLK_CCOR = 0x19; while(1){_RESET_WATCHDOG();} //送出fmaster到引脚上
}
void init_relay_IO(void)
{
PD_DDR |= 0x1f; //set output
PD_CR1 |= 0x1f; //set pull推挽输出
CFG_GCR |= 0x01;//禁用SWIM,执行本指令后不能仿真,烧写程序
//口线PD1复用成IO口了
}
main()
{
delay(1000);
CLK_Init();
init_relay_IO();
while (1)
{
PD_ODR|=0x10; //照明
//_asm("nop");
PD_ODR&=0xEF;
delay(60000);
}
}
|