📄 main.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**--------------------------------------------------------------------------------------------------------
** Created by: lizhongsheng
** Created date: 2006-3-15
** Version: 1.0
** Descriptions: PLL PowerDown and wake up
**
**--------------------------------------------------------------------------------------------------------
** Modified by: Liuyanlong
** Modified date: 2007-08-17
** Version: 对代码风格和注释进行校对、修改
**
** Descriptions:
** Rechecked by : Litiantian
*********************************************************************************************************/
#include "config.h"
#define BEEP (1 << 30) /* P3.30控制蜂鸣器,低电平蜂鸣 */
/*********************************************************************************************************
** 函数名称 :PLLinit
** 函数功能 :PLL初始化
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void PLLinit(void)
{
SCS = (SCS & 0x04) | 0x20; /* 使能主振荡器,1MHz~20MHz */
while ((SCS & 0x40) == 0 ); /* 等待主振荡器可用 */
if (PLLSTAT & (1 << 25)){ /* 如果PLL连接 */
PLLCON = 0x01;
PLLFEED = 0xAA; /* 断开连接 */
PLLFEED = 0x55;
PLLCON = 0x00;
PLLFEED = 0xAA; /* 不使能PLL */
PLLFEED = 0x55;
} else if (PLLSTAT & (1 << 24)){ /* 如果PLL使能 */ // 如果PLL已被使能,则先禁止PLL
PLLCON = 0x00;
PLLFEED = 0xAA; /* 不使能PLL */
PLLFEED = 0x55;
}
CLKSRCSEL = 0x01; /* 选择主振荡器作为PLL输入时钟源*/
PLLCFG = (((PLL_NValue) << 16) | (PLL_MValue) ); /* 设置N、M值 */
PLLCON = 1; /* 使能但不连接PLL */
PLLFEED = 0xAA; /* 使能PLL */
PLLFEED = 0x55;
while (((PLLSTAT & (1 << 24)) == 0)); /* 等待PLL可用 */
CCLKCFG = (Fcco / Fcclk - 1); /* 用于防止CPU工作频率过大 */
while ( ((PLLSTAT & (1 << 26)) == 0) ); /* Check lock bit status */
PLLCON = 3; /* 连接PLL */
PLLFEED = 0xAA;
PLLFEED = 0x55;
while (((PLLSTAT & (3 << 25)) != (3 << 25))); /* 等待PLL连接好 */
}
/*********************************************************************************************************
** 函数名称 :IRQ_EINT0
** 函数功能 :外部中断0服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void __irq IRQ_EINT0(void)
{
EXTINT = (1 << 0); /* 清中断标志“请在此句设置断点 */
PLLinit(); /* 重新初始化PLL及时钟 */
VICVectAddr = 0;
}
/*********************************************************************************************************
** 函数名称 :DelayNS
** 函数功能 :长软件延时
** 入口参数 :dly 延时参数,值越大,延时越久
** 出口参数 :无
*********************************************************************************************************/
void DelayNS(uint32 dly)
{
uint32 i = 0;
for ( ; dly > 0; dly--)
for (i = 0; i < 50000; i++);
}
/*********************************************************************************************************
** 函数名称 :main
** 函数功能 :演示外部中断0唤醒掉电的CPU
** 调试说明 :实验前将P2.10(ISP跳线下方)与KEY1短接,同时需要短接P3.30与BEEP,但外部中断唤醒
CPU一次时,蜂鸣器将会蜂鸣一声。
** 注 意 :程序测试完成后,可能出现JTAG不能被发现的问题,请短接ISP,然后按复位键 或者通过ISP擦除Flash中
的程序
*********************************************************************************************************/
int main(void)
{
PINSEL7 = 0x00000000; /* 设置管脚连接GPIO */
FIO3DIR = BEEP; /* 设置BEEP控制口为输出 */
FIO3SET = BEEP; /* BEEP停止蜂鸣 */
PINSEL4 = 0x00100000; /* P2.10连接EINT0 */
EXTMODE = 0x01;
EXTPOLAR = 0x00; /* 下降沿触发 */
EXTINT = 1 << 0;
INTWAKE = 1 << 0; /* 外部中断0可唤醒芯片 */
IRQEnable(); /* IRQ中断使能 */
/* 设置外部中断0位IRQ */
VICIntSelect = 0x00; /* 所有中断通道设置为IRQ中断 */
VICVectPri14 = 0; /* 设置外部中断0中断最高优先级 */
VICVectAddr14 = (uint32)IRQ_EINT0; /* 设置中断服务程序地址 */
VICIntEnable = 1 << 14; /* 使能EINT0中断 */
while (1) {
FIO3CLR = BEEP; /* BEEP停止蜂鸣 */
DelayNS(50);
FIO3SET = BEEP; /* BEEP 蜂鸣 */
DelayNS(50);
PCONP = 0x800; /* 关闭定时器、RTC、 */
/* UART等功能部件 */
PCON = 0x02; /* 系统进入掉电模式 */
}
return (0);
}
/*********************************************************************************************************
** End Of File
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -