/******************************** *
***********************************************************************
* 基本描述
* 采用的主控芯片LPC1768系列CORTEX-M3内核处理器,时钟晶振XT=12MHZ,系统时钟96MHZ,外部时钟PLCK
本程序使用定时器作为硬件延时函数
***********************************************************************/
#include "LPC17xx.h"
#define FCCLK 96000000UL // 系统主时钟96MHZ
#define FPCLK FCCLK/4 // 外设时钟24MHZ 为主时钟的1/4 提供给定时器,串口和AD等模块使用
#define LED4 (1 << 3) /* P2.0连接发光二极管 */
#define LEDOFF() LPC_GPIO2->FIOSET = LED4 /* 发光二极管亮 */
#define LEDON() LPC_GPIO2->FIOCLR = LED4 /* 发光二极管灭 */
/****************************************************************************
** 函数名称:LED_Switch
** 函数功能:切换LED状态
** 入口参数:ionum:控制LED引脚的序号,如用P2.0控制,则序号是0,P2.3控制,则序号是3
** 出口参数:无。
** 其他 :本程序只完成P2口的引脚状态切换
*****************************************************************************/
void LED_Switch(unsigned char ionum)
{
if( (LPC_GPIO2->FIOPIN & (0x00000001<<ionum) )==0 ) // 口线原来状态为0--低电平
{
LPC_GPIO2->FIOSET = LPC_GPIO2->FIOSET | (0x00000001<<ionum);
}
else
{
LPC_GPIO2->FIOCLR = LPC_GPIO2->FIOCLR | (0x00000001<<ionum);
}
}
/*********************************************************************
函 数 名:TIMER1_Init(void)
功 能:初始化定时器1,作为硬件延时函数使用
说 明:模块的外部函数,提供给主程序调用
入口参数:无
返 回 值:无
其 他:只完成初始化,没有赋定时器初值和启动定时器
**********************************************************************/
void TIMER1_Init(void)
{
LPC_TIM1->TCR = 0x02; // 复位定时值
LPC_TIM1->CTCR = 0; // 工作于定时模式
LPC_TIM1->TC = 0; // 定时器初值为0
LPC_TIM1->PR = 0; // 设置定时器0分频
// 定时器1匹配通道0后复位T0TC,同时停止计数,将TCR的Bit0清除
// 通过查询TCR的Bit0可以判断定时时间到没有
LPC_TIM1->MCR = 0x06;
}
/****************************************************************************
* 名 称:DelayUs(unsigned int us)
* 功 能:精确硬件延时,利用定时器1完成
* 入口参数:usTime:延时参数,以us为单位
* 出口参数:无
* 说明 :采用通用定时器1完成延时
****************************************************************************/
void DelayUs(unsigned int usTime)
{
//LPC_TIM1->TC = 0; // 初值清零,匹配后TC复位并停止,可以不加这句
LPC_TIM1->MR0 = (FPCLK/(1000000UL))*usTime; // 设定定时器的初值
LPC_TIM1->TCR = 0x01; // 启动定时器
while( LPC_TIM1->TCR & 0x01 ); // 定时时间到,TCR的Bit0清零
// 注意:必须要停止定时器,因为这里不是形成固定时间间隔,而是不同的时间
// 同时对于短延时,虽然设置了匹配时定时器复位,但是短延时可能就是计数几个值
// 如果没有停止定时器,有可能在清除中断标志的时候,定时器计数值就会超过了匹
// 配值,则延时时间可能就会很长(要等定时器完成本次循环记到FFFFFFFFH后重新
// 翻转到0)
//LPC_TIM1->TCR = 0x02; // 匹配后TC复位并停止,可以不加这句:复位定时值,停止定时器
//LPC_TIM1->TC = 0; // 匹配后TC复位并停止,可以不加这句:初值清零,为下一次启动做准备
}
/*****************************************************************************
** 函数名称:main
** 函数功能:利用定时器延时1S控制LED的状态变化
*****************************************************************************/
int main (void)
{
LPC_GPIO2->FIODIR |= LED4; // 设置发光二极管控制引脚P2.0方向为输出
LPC_GPIO2->FIOSET = LED4; // 初始化关闭发光二极管
TIMER1_Init(); // 初始化定时器1
while(1)
{
LED_Switch(3); // 切换LED状态
DelayUs(10); // 延时1S
}
}