attachment download(工程文件)
昨晚去打羽毛球了,回到家已十点多,洗刷了一下已十一点多,本来想把Cortex M0的学习情况总结一下,可是一不小心在QQ上遇到了高中时一很铁的哥们,这哥们在我印象中非常理性,以前懒猫一有什么想不通的就会找他聊聊,也不知道他是怎么呼悠我的,反正一经他点拨,懒猫就豁然开朗,如醍醐灌顶……可是自从上大学以后我们就聚少离多,很少再见面,毕业后懒猫在外面东奔西闯,最后懒猫把自己埋在了代码堆,而那哥们当了教师,开始了他春风沐人的生涯,懒猫也认为他这样的人适合当教师,肯定能教出好学生……可是人是有感情的动物,昨晚这小子给我吐苦水,原来感情生活上有了点问题,哎,谁让他是我兄弟呢,懒猫就拿出当年他呼悠懒猫的功夫,使劲的安慰他,结果一聊聊到了凌晨1点多,懒猫虽然是猫,可不是夜猫,聊完之后实在困的要命,就只想睡,于是躺在床上就睡,直到今天早上被闹钟吵醒,懒猫才发现电脑还开着,灯也没熄,哎,看来懒猫真的是才老了,竟这么不能熬了……
好了,扯远了,现在开始正题,这次试验主要是就熟悉一下Cortex M0的IO口及PWM波。说一下这次测试电路,两个按键分别接在P2.6/P2.7用来控制LED灯与调节PWM波,P1.1接的是一个Buzzer用来测试PWM波。好了下面给出电路图:
图1-1 PWM控制三极管驱动蜂鸣器
图1-2 LED灯电路(懒猫只用了前三个)
图1-3 按键电路(本次试验只用到两个)
电路都是最基本的电路,没有什么好说的了,下面简单说一下软件;
图1-4 软件工程
这个工程中主要就一个main.c文件,像core_cm0.c、gpio.c…这些都是NXP公司提供的库函数,用的时候可以调用,当然如果你有时间,建议你还是好好研究一下这些库函数,没坏处的。下面是我写的main.c函数的源码,详细的源码可以看附件:
/**************************************************************************
工程名称:LPC11xx_PWM
功 能: LPC1114的PWM功能测试 及IO口的输入输出功能
编译环境: MDKV4.12
时 钟: 外部12Mhz Target: LPC1114
日 期: 11/04/28
作 者: 懒猫爱飞
修 改:null
**************************************************************************/
#include "LPC11xx.h"
#include "GPIO.H"
/******************* 全局变量定义 ***************************************/
uint8_t state=0;
uint32_t pwmvalue=200;
uint8_t valueflag=0;
/********************** 函数声明 ***************************************/
__inline void delay_ms(uint32_t a); //1ms延时函数
void UserIO(void); //IO口初始化函数
void PWM_Init(void); //PWM初始化函数
void LED1(void); //点亮LED1
void LED2(void); //点亮LED2
void LED3(void); //点亮LED1
void Key_Handle(void); //按键处理函数
/**************************************************************************
// 函数名称 :int main(void)
// 函数功能 : 主函数
// 入口参数 : 无
// 出口参数 : 无
// 备 注 :无
**************************************************************************/
int main(void)
{
SystemInit(); //系统初始化,包括使能时钟
UserIO();
PWM_Init();
delay_ms(500);
//直接使用寄存器
LPC_GPIO2->DATA &= ~(((1<<2)|(1<<3))); //P2.2,P2.3输出0,LED1,LED2灭
LPC_GPIO1->DATA &= ~(1<<8); //LED3灭
delay_ms(500);
while(1)
{
Key_Handle(); //检测按键
switch (state)
{
case 1:
LED3();
break;
case 2:
LED2();
break;
case 3:
LED1();
break;
default:
break;
}
}
}
/**************************************************************************
// 函数名称 :__inline void delay_ms(uint32_t a)
// 函数功能 : 1ms延时函数
// 入口参数 : uint32_t a -- 延时时间
// 出口参数 : 无
// 备 注 :内联函数
**************************************************************************/
__inline void delay_ms(uint32_t a) //1ms延时函数
{
uint32_t i;
while( --a != 0)
{
for(i = 0; i<5500; i++);
}
}
/**************************************************************************
// 函数名称 :void UserIO(void)
// 函数功能 : IO口初始化函数
// 入口参数 : 无
// 出口参数 : 无
// 备 注 :无
**************************************************************************/
void UserIO(void)
{
GPIOInit(); //GPIO初始化,使能GPIO模块时钟
//LED端口初始化
GPIOSetDir(2,2,1); //设置P2.2为输出,LED1
GPIOSetDir(2,3,1); //设置P2.3为输出,LED2
GPIOSetDir(1,8,1); //设置P1.8为输出,LED3
//按键端口设置
GPIOSetDir(2,6,0); //设置P2.6为输入,UP键
GPIOSetDir(2,7,0); //设置P2.7为输入,DOWN键
GPIOSetDir(2,8,0); //设置P2.8为输入,LEFT键
GPIOSetDir(2,9,0); //设置P2.9为输入,RIGHT键
GPIOSetDir(2,10,0); //设置P2.10为输入,ENTER键
//调用头文件中函数输出方法
GPIOSetValue(PORT2,2,1); //设置P2.2输出1,点亮LED1
GPIOSetValue(PORT2,3,1); //设置P2.3输出1,点亮LED2
GPIOSetValue(PORT1,8,1); //设置P1.8输出1,点亮LED3
LPC_IOCON->JTAG_TDO_PIO1_1=0x0003; //设置PIO1_1为MAT0接Buzzer
GPIOSetDir(PORT1,1,1); //设置P1.1为输出
delay_ms(10);
GPIOSetValue(PORT1,1,0); //关闭Buzzer
}
/**************************************************************************
// 函数名称 :void PWM_Init(void)
// 函数功能 : PWM初始化函数
// 入口参数 : 无
// 出口参数 : 无
// 备 注 :无
**************************************************************************/
void PWM_Init(void) // CT32B0 MAT0:50%,50KHz,MAT1:70%,50KHz
{
LPC_TMR32B1->TCR=0;
LPC_SYSCON->SYSAHBCLKCTRL|=(1<<10); //打开定时器模块
LPC_TMR32B1->TCR=0x02; //定时器复位
LPC_TMR32B1->MR0 =1000; //90%占空比
LPC_TMR32B1->PWMC =0x01; //设置 MA0,1为PWM输出
LPC_TMR32B1->PR =2; //设置分频系数
LPC_TMR32B1->MR3 =10000; //周期控制, 200us:5K
LPC_TMR32B1->EMR =0x00; //01=L,02=H,03=翻转
LPC_TMR32B1->MCR = (1<<10); //设置如果MR0和TC匹配,TC复位:[2]=1
LPC_TMR32B1->TCR =0x01; //定时器打开
}
/**************************************************************************
// 函数名称 :void LED1(void)
// 函数功能 : 点亮LED1
// 入口参数 : 无
// 出口参数 : 无
// 备 注 :无
**************************************************************************/
void LED1(void)
{
GPIOSetValue(PORT2,2,1); //设置P2.8输出0,LED1亮
GPIOSetValue(PORT2,3,0); //设置P2.9输出1,LED2灭
GPIOSetValue(PORT1,8,0); //设置P3.4输出1,LED3灭
}
/**************************************************************************
// 函数名称 : void LED2(void)
// 函数功能 : 点亮LED3
// 入口参数 : 无
// 出口参数 : 无
// 备 注 :无
**************************************************************************/
void LED2(void)
{
GPIOSetValue(PORT2,2,0); //设置P2.8输出1,LED1灭
GPIOSetValue(PORT2,3,0); //设置P2.9输出1,LED2灭
GPIOSetValue(PORT1,8,1); //设置P3.4输出0,LED3亮
}
/**************************************************************************
// 函数名称 :void LED3(void)
// 函数功能 : 点亮LED2
// 入口参数 : 无
// 出口参数 : 无
// 备 注 :无
**************************************************************************/
void LED3(void)
{
GPIOSetValue(PORT2,2,0); //设置P2.8输出1,LED1灭
GPIOSetValue(PORT2,3,1); //设置P2.9输出0,LED2亮
GPIOSetValue(PORT1,8,0); //设置P3.4输出1,LED3灭
}
/**************************************************************************
// 函数名称 :void Key_Handle(void)
// 函数功能 : 按键处理函数
// 入口参数 : 无
// 出口参数 : 无
// 备 注 :无
**************************************************************************/
void Key_Handle(void)
{
if((LPC_GPIO2->DATA&(1<<6))==0) //如果UP键被按下
{
delay_ms(10); //延时消抖
if((LPC_GPIO2->DATA&(1<<6))==0)//如果还是按下状态
{
while((LPC_GPIO2->DATA&(1<<6))==0); //等待松开按键
state++;
if(state > 3)
{
state = 0;
}
}
}
if((LPC_GPIO2->DATA&(1<<7))==0) //如果DOWN键被按下
{
delay_ms(10); //延时消抖
if((LPC_GPIO2->DATA&(1<<7))==0)//如果还是按下状态
{
while((LPC_GPIO2->DATA&(1<<7))==0); //等待松开按键
if(valueflag) //判断二值信号量
{
pwmvalue+=100; //如果为1则每次加100
LPC_TMR32B1->MR0=pwmvalue;
if(pwmvalue == 9900)
{
valueflag = 0;
}
}
if(!valueflag) //如果为0则每次减100
{
pwmvalue -= 100;
LPC_TMR32B1->MR0=pwmvalue;
if(pwmvalue == 100)
{
valueflag = 1;
}
}
}
}
}
这个程序应该不是太难,就是简单的测试,其中引用的库函数都在NXP提供的C文件中,可以查看一下。最近懒猫已把ucos-ii移植到了LPC1114中,不过有现在只做了简单的测试,跑了两个小任务,懒猫现在正在慢慢把各个功能加进去,哦,听说ucos-iii也出来了,据说里面加了好多东东,具体代码不知道会是什么样,改天懒猫找到了也玩玩去,嘻嘻……
好了,先总结这些,改天接着写,最后再吼一下懒猫的口号:
每天进步一点点,开心多一点^_^
用户377235 2013-12-16 00:05
LPC1114 PWM能调300ns左右的方波吗?