原创 二 Cortex_M0 的PWM测试

2011-4-28 11:34 7621 8 9 分类: MCU/ 嵌入式

    attachment download(工程文件)


       昨晚去打羽毛球了,回到家已十点多,洗刷了一下已十一点多,本来想把Cortex M0的学习情况总结一下,可是一不小心在QQ上遇到了高中时一很铁的哥们,这哥们在我印象中非常理性,以前懒猫一有什么想不通的就会找他聊聊,也不知道他是怎么呼悠我的,反正一经他点拨,懒猫就豁然开朗,如醍醐灌顶……可是自从上大学以后我们就聚少离多,很少再见面,毕业后懒猫在外面东奔西闯,最后懒猫把自己埋在了代码堆,而那哥们当了教师,开始了他春风沐人的生涯,懒猫也认为他这样的人适合当教师,肯定能教出好学生……可是人是有感情的动物,昨晚这小子给我吐苦水,原来感情生活上有了点问题,哎,谁让他是我兄弟呢,懒猫就拿出当年他呼悠懒猫的功夫,使劲的安慰他,结果一聊聊到了凌晨1点多,懒猫虽然是猫,可不是夜猫,聊完之后实在困的要命,就只想睡,于是躺在床上就睡,直到今天早上被闹钟吵醒,懒猫才发现电脑还开着,灯也没熄,哎,看来懒猫真的是才老了,竟这么不能熬了……


好了,扯远了,现在开始正题,这次试验主要是就熟悉一下Cortex M0的IO口及PWM波。说一下这次测试电路,两个按键分别接在P2.6/P2.7用来控制LED灯与调节PWM波,P1.1接的是一个Buzzer用来测试PWM波。好了下面给出电路图:


4c5d0feb-eff0-4857-ae65-788187225d8f.jpg


图1-1 PWM控制三极管驱动蜂鸣器


a022ab72-e4e6-4a3b-9e6b-992e9b6b1516.jpg


图1-2  LED灯电路(懒猫只用了前三个)


9810abcf-1e99-4966-a30d-c424b23bd5c4.jpg


图1-3 按键电路(本次试验只用到两个)


电路都是最基本的电路,没有什么好说的了,下面简单说一下软件;


ebfb91d0-0b31-4d46-bffb-153a7a22f69d.jpg


图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也出来了,据说里面加了好多东东,具体代码不知道会是什么样,改天懒猫找到了也玩玩去,嘻嘻……


好了,先总结这些,改天接着写,最后再吼一下懒猫的口号:


每天进步一点点,开心多一点^_^

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2013-12-16 00:05

LPC1114 PWM能调300ns左右的方波吗?

相关推荐阅读
xucun915_925777961 2013-04-28 11:31
毕业后的五年拉开大家差距的原因在哪里?【转】
  有人工作,有人继续上学,大家千万不要错过这篇文章,能看到这篇文章也是一种幸运,真的受益匪浅,对我有很大启迪,这篇文章将会改变我的一生,真的太好了,希望与有缘人分享,也希望对有缘人有所帮助!...
xucun915_925777961 2013-03-31 20:28
职场大牛精彩总结:职场上,如何做人做事做管理【转】(文/张子阳)
      大道至简,越是根源和基本的问题,道理实际上越简单。关于如何做人、做事、做管理的书很多,我看得不多,但是我觉得这些书更多是侧重技术和实现细节上的,而很少从人的思想和观念去讲。实际...
xucun915_925777961 2013-03-28 14:03
介绍几种优秀的UML工具
统一建模语言(UML是 Unified Modeling Language的缩写)是用来对软件密集系统进行可视化建模的一种语言。UML为面向对象开发系统的产品进行说明、可视化、和编制文档的一种标准语言...
xucun915_925777961 2013-03-27 18:05
IAR EW FOR 8051 修改工程名称的方法
        近段时间一直在搞蓝牙4.0的开发任务,所以用到了IAR编译器,话说IAR编译器用途蛮广,可以编译MSP430,ARM,还有TI的51核芯片,当然,这要不同的版本,我现在用的是for...
xucun915_925777961 2013-03-26 16:40
Cortex-M3学习日志(八)-- TFT实验Part(a)
    自己用的LPC1768的开板带有一块2.4寸的TFT彩色液晶屏,虽然自己工作中还用不过显示屏,但是晚上闲着也是闲着,于是继续玩咱的LPC1768吧。 我的开发板上的液晶屏的用的是SPI接口,当...
xucun915_925777961 2013-03-25 20:48
说说那几款查看源代码的工具
说说那几款查看代码的工具 今天给大家介绍几款单片机工程师所喜欢的几款查看源代码的工具,这几款工具在懒猫的日常工作中可是帮了不少忙。 一、 Source Insight     Source Insig...
EE直播间
更多
我要评论
1
8
关闭 站长推荐上一条 /1 下一条