懒猫爱飞

二Cortex_M0 的PWM测试

0
阅读(2389)

        昨晚去打羽毛球了,回到家已十点多,洗刷了一下已十一点多,本来想把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也出来了,据说里面加了好多东东,具体代码不知道会是什么样,改天懒猫找到了也玩玩去,嘻嘻……

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

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