📄 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"
/*********************************************************************************************************
** 函数名称 :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输入时钟源
PLLCON = 1; // 使能但不连接PLL
PLLCFG = (((PLL_NValue - 1) << 16) | (PLL_MValue - 1) ); // 设置N、M值
PLLFEED = 0xAA; // 使能PLL
PLLFEED = 0x55;
while (((PLLSTAT & (1 << 24)) == 0)); // 等待PLL可用
CCLKCFG = (Fcco / Fcclk - 1); // 用于防止CPU工作频率过大
PLLCON = 3; // 连接PLL
PLLFEED = 0xAA;
PLLFEED = 0x55;
while (((PLLSTAT & (3 << 25)) != (3 << 25))); // 等待PLL连接好
}
/*********************************************************************************************************
** 函数名称 :IRQ_EINT1
** 函数功能 :外部中断1服务程序
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void __irq IRQ_EINT1(void)
{
EXTINT = (1 << 1); // 清中断标志“请在此句设置断点”
PLLinit(); // 重新初始化PLL及时钟
VICVectAddr = 0;
}
/*******************************************************************************************
** 函数名称 :main
** 函数功能 :演示外部中断1唤醒掉电的CPU
** 调试说明 :实验前将P2.11与KEY1短接
*******************************************************************************************/
int main(void)
{
PINSEL4 = 0x00400000; // P2.11连接EINT1
EXTMODE = 0x02;
EXTPOLAR = 0x00; // 下降沿触发
EXTINT = 1 << 1;
INTWAKE = 1 << 1; // 外部中断1可唤醒芯片
IRQEnable(); // IRQ中断使能
/* 设置外部中断1位IRQ */
VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断
VICVectPri15 = 0; // 设置外部中断1中断最高优先级
VICVectAddr15 = (uint32)IRQ_EINT1; // 设置中断服务程序地址
VICIntEnable = 1 << 15; // 使能EINT1中断
while (1)
{
PCONP = 0x00; // 关闭定时器、RTC、UART等功能部件
PCON = 0x02; // 系统进入掉电模式
}
return (0);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -