ARM报告PWM和SPI流水灯.docx
《ARM报告PWM和SPI流水灯.docx》由会员分享,可在线阅读,更多相关《ARM报告PWM和SPI流水灯.docx(20页珍藏版)》请在冰豆网上搜索。
ARM报告PWM和SPI流水灯
龙岩学院
实验报告
班级07电本一班学号2007050326姓名刘桂银同组人
实验日期2010.5.12室温大气压成绩
实验题目:
PWM音乐输出、数码显示和LED显示
一、实验目的
1、复习GPIO的管脚功能及蜂鸣器电路蜂鸣的工作原理。
2、复习SPI引脚、结构和工作原理
3、熟悉7段数码管真值表的由来。
4、掌握PWM模块的基本原理及应用。
5、了解简谱和频率的关系
6、锻炼学生自己的设计、创造和综合性。
二、实验仪器
微型电子计算机(含软件H-JTAGV0.3.1和ADSv1_2)、EasyARM2131开发板、UART0接口线、USB接口电源线和JTAG接口线以及部分跳线。
三、实验原理
1、
(1)蜂鸣器控制电路
在EasyARM2131开发板上,接有一个蜂鸣器,由P0.7控制,通过跳线JP11选择连接。
蜂鸣器控制电路如图一所示。
图一蜂鸣器控制电路
电路说明:
如果跳线JP11选择蜂鸣器,当P0.7输出低电平时,蜂鸣器鸣叫,当P0.7输出高电平则停止鸣叫。
实验利用P0.7的输出功能,控制蜂鸣器鸣叫。
程序设置PINSEL0使P0.7连接GPIO,并通过IO0DIR将其设置为输出状态,然后通过IO0CLR和IO0SET清零和置位P0.7口,控制蜂鸣器。
LPC2131中,具有I2C总线功能的I/O口(P0.2-SCL、P0.3-SDA0;P0.11-SCL1、P0.14-SDA1)为开漏输出,在用作I2C总线以及其它功能时,需要加1K~10KΩ的上拉电阻。
则此电路图在JP11前,加R22=10K的上拉电阻。
(2)七段数码管
在显示方面,EasyARM2131开发板采用了一片74HC595驱动一位静态共阳LED数码管,
如图(a)所示,其时钟(SCK)、数据(SI)分别接到LPC2131的SPI接口的SCLK0、MOSI0,
这样就可以发送数据到74HC595;片选(RCK,即74HC595输出触发端)与P0.29口连接,
由P0.29控制74HC595数据锁存输出;而最高位输出(SQH)连接到LPC2131的SPI接口的
MISO0,可用来读回数据。
这样连接就可以进行SPI接口控制实验,并能把74HC595的移位
输出读回来(由MISO0读回)。
这一部份电路通过JP10跳线器来选择连接。
在使用硬件SPI接口主方式时,要把SPI0/1的4个I/O口均设置为SPI功能,如P0.4、
P0.5、P0.6、P0.7,而且SSEL0/1引脚不能为低电平,一般要接一个10KΩ的上拉电阻。
图(a)
(3)EasyARM2131开发板上的8路LED(LED8~LED1)分别可选择P1[25:
18]进行控制,电路如图下所示
当跳线JP12全部选择LED8~LED1后,P1.25~P1.18分别控制这8路LED,就可以进
行流水灯实验。
流水灯显示花样可以通过数组人为定义,亦可通过一定的算法计算,程序清
单4.6所示为采用人为定义数组控制显示花样的实验程序,流程图如图4.13所示。
(4)SPI的描述
(a)SPI概述
LPC2131具有一个硬件SPI(SPI,SerialPeripheralInterface)接口,它是一个同步、
全双工串行接口,最大数据位速率为时钟速率的1/8,可以配置为主机或者从机。
在同一总线上可以有多个主机或者从机,但同一时刻只能有一个主机和一个从机能够进
行通信,在一次数据传输过程中,主机向从机发送一字节数据,从机也向主机返回一字节数
据。
SPI可应用于:
z串行存储器,如DataFlash、三线EEPROM等;
z串行外设,如ADC、DAC、LCD控制器、CAN控制器、传感器等;
z外部协处理器。
(b)管脚如下表所示。
管脚连接设置
当进行如下设置时将P0.4、P0.5、P0.6和P0.7选择SPI功能:
PINSEL0=0x55<<8;//可能影响其它管脚功能
PINSEL0=(PINSEL0&(~(0xFF<<8)))|(0x55<<8);//不会影响其它管脚功能
(C)SPI结构
(d)SPI控制寄存器-SPIControlRegister(S0SPCR-0xE0020000)
SPCR寄存器根据每个配置位的设定来控制SPI的操作。
SPI控制寄存器的位功能描述见
2、概述
LPC2131的脉宽调制器PWM建立在标准定时器0/1之上。
应用在PWM和匹配功能当中进行选择。
PWM基于标准的定时器模块并具有其所有特性;PWM可独立控制上升沿和下降沿的的位置,这样是它能够应用于更多的领域;2个匹配寄存器可用于单边沿控制PWM输出。
3个匹配寄存器共同控制一个双边沿PWM输出。
3、特性
脉宽调制器的特性如下:
(1)7个匹配寄存器,可实现6个单边沿控制或3个双边沿控制PWM输出,或这两种类型的混合输出:
--连续操作,可选择在匹配时产生中断;
--匹配时停止定时器,可选择产生中断;
--匹配时复位定时器,可选择产生中断。
(2)每个匹配寄存器对应一个外部输出,具有下列特性:
--匹配时设置为低电平;
--匹配时设置为高电平;
--匹配时翻转;
--匹配时无动作。
(3)支持单边沿控制和/或双边沿控制的PWM输出。
(4)脉冲周期和宽度可以是任何的定时器计数值。
(5)双边沿控制的PWM输出可编程位正脉冲或负脉冲。
(6)匹配寄存器更新与脉冲输出同步,防止产生错误的脉冲。
软件必须在心的匹配值生效之前将它们释放。
(7)如果不能使能PWM模式,可作为一个标准定时器。
(8)带可编程32位预分频器的32位定时器/计数器。
(9)当输入信号跳变时,4个捕获寄存器可取得定时器的瞬时值,也可以选择是捕获事件产生中断。
4、结构
图(A)所示为PWM的方框图。
在标准定时器模块上增加的部分位于图的右边和顶端。
图(A)的PWM输出逻辑允许通过PWMSELn(在PWM控制寄存器PWMPCR中)位选择单边沿或者双边沿控制的PWM输出。
图(A)PWM方框图
5、寄存器描述
外部中断具有4个相关的寄存器,如表
(一)所示。
EXTINT寄存器包含中断标志,
EXTWAKEUP寄存器包含使能唤醒位,可使能独立的外部中断输入将处理器从掉电模式唤
醒,EXTMODE和EXTPOLAR寄存器用来指定管脚使用电平或边沿激活方式。
表
(一)外部中断寄存器
(1)、外部中断标志寄存器-ExternalInterruptFlagRegister(EXTINT-0xE01FC140)
当一个管脚选择使用外部中断功能时,对应在EXTPOLAR和EXTMODE寄存器中的
位选择的电平或边沿将置位EXTINT寄存器中的中断标志,向VIC提出中断请求,如果管
脚中断使能,将会产生中断。
向EXTINT寄存器的位EINT0~位EINT3写入1可清除相应的外部中断标志。
在电平
激活方式下,只有在该管脚处于无效状态时才能清除相应的中断标志。
一旦EINT0~EINT3中的一位被置位并开始执行相应的代码(处理唤醒和/或外部中
断),必须将该位清零,否则以后该EINT管脚所触发的事件将不能再被识别。
例如,如果外部中断0管脚的低电平将系统从掉电模式唤醒,为了将来还能进入掉电模
式,唤醒后的程序必须将EINT0位复位。
如果EINT0位仍保持置位状态,后来的唤醒掉电
模式的任何操作都将失败,外部中断也不例外。
外部中断标志寄存器的位功能描述见表
(二)。
表
(二)外部中断标志寄存器
(2)、外部中断方式寄存器-ExternalInterruptModeRegister
(EXTMODE-0xE01FC148)
EXTMODE寄存器中的位用来选择每个EINT脚是电平触发还是边沿触发。
只有选择用
作EINT功能(通过管脚连接模块)并已通过VICIntEnable(向量中断使能寄存器)使能的管
脚才能产生外部中断(当然,如果管脚选择用作其它功能,则可能产生其它功能的中断)。
外部中断方式寄存器的位功能描述见表(三)。
注:
当某个中断在VICIntEnable中被禁能时,软件应该只改变EXTMODE寄存器中相
应位的值。
中断重新使能前,软件向EXTINT写入1来清除EXTINT位,EXTINT位可通
过改变激活方式来置位。
表(三)外部中断方式寄存器
6、基本操作
LPC2131微控制器的PWM功能是建立在标准的定时器之上的,它同样拥有32位定时器及预分频控制电路和7个匹配寄存器,可实现6个单边沿PWM或3个双边PWM输出,也可采用者两种类型的混合输出。
它具有匹配中断,匹配PWMTC复位和匹配PWMTC停止功能,如果不使能PWM模式,可作为一个标准的定时器。
PWM的基本寄存器功能框图如图4.103所示。
如图4.103所示,32位定时器计数器PWMTC的计数频率由pclk经过PWMPR进行预分频控制得到,而定时器的启动/停止、计数复位由PWMTCR控制。
当有比较匹配事件发生时,PWMIR会设置相关中断标志(因为不是定时器溢出而产生中断,所以上图采用虚线连接)。
若已打开中断允许(VIC),则会产生中断。
当然,预分频寄存器PWMPR只是控制分频数,而其对应的预分频计数器是PWMPC,但用户不需要操作PWMPC。
四、实验程序
1.实验程序
#include"config.h"
#include"music.h"
#defineBEEP1<<7/*P0.7控制蜂鸣器*/
#defineHC595_CS(1<<29)//P0.29口为74HC595的片选
constuint32LEDS8=(0xFF<<18);//P1[25:
18]控制LED8~LED1,低电平点亮
/*歌曲曲谱-欢乐颂*/
constuint32HCMM[]=
{
_MI,_MI,_FA,_SO,_SO,_FA,
_MI,_RE,_DO,_DO,
_RE,_MI,_MI,_RE,_RE,_MI,
_MI,_FA,_SO,_SO,
_FA,_MI,_RE,_DO,_DO,_RE,_MI,
_RE,_DO,_DO,_RE,
_RE,_MI,_DO,_RE,_MI,
_FA,_MI,_DO,_RE,_MI,_FA,_MI,_RE,_DO,_RE,_SO,_MI,_MI,_MI,
_FA,_SO,_SO,_FA,_MI,_RE,_DO,_DO,_RE,_RE,_DO,_DO,
};
constuint32HCMM_L[]=
{
_4,_4,_4,_4,_4,_4,
_4,_4,_4,_4,
_4,_4,_2,_8,_2,_4,
_4,_4,_4,_4,
_4,_4,_4,_4,_4,_4,_4,
_2,_8,_2,_4,
_4,_4,_4,_4,_8,
_8,_4,_4,_4,
_8,_8,_4,_4,_8,
_8,_4,_8,_8,
_4,_4,_4,_4,_4,
_8,_8,_4,_4,_4,_4,_2,_8,_2,
};
/*歌曲曲谱-好听歌曲*/
constuint32HCMM1[]=
{
_LA,_SO,_MI,_LA,_SO,_MI,
_LA,_LA,_SO,_LA,
_LA,_SO,_MI,_LA,_SO,_MI,
_RE,_RE,_DO,_RE,
_MI,_MI,_SO,_LA,_DO1,_LA,_SO,
_MI,_MI,_SO,_DO,
_MI,_MI,_MI,_MI,_MI,
_1LA,_1LA,_1SO,_1LA,
};
constuint32HCMM_L1[]=
{
_4,_8,_8,_4,_8,_8,
_8,_4,_8,_2,
_4,_8,_8,_4,_8,_8,
_8,_4,_8,_2,
_4,_8,_8,_8,_8,_8,_8,
_8,_4,_8,_2,
_4,_4,_4,_8,_8,
_8,_4,_8,_2,
};
/********************************************************************************************************
**函数名称:
Delay()
**函数功能:
长软件延时
**入口参数:
dly延时参数,值越大,延时越久
**出口参数:
无
********************************************************************************************************/
voidDelay(uint8dly)
{
uint32i;
for(;dly>0;dly--)
for(i=0;i<0x50000;i++);//nsaFFFF
}
//音乐函数1
voidMUSIC_1(uint32cnt)
{uint32j;
PINSEL0=0x02<<14;//P0.7选择PWM2功能
/*PWM初始化*/
PWMPR=0x00;//不分频,计数频率为Fpclk
PWMMCR=0x02;//设置PWMMR0匹配时复位PWMTC
PWMPCR=0x0400;//允许PWM2输出,单边PWM
PWMMR0=Fpclk/1000;
PWMMR2=PWMMR0/2;//50%占空比
PWMLER=0x05;//PWM0和PWM2匹配锁存
PWMTCR=0x02;//复位PWMTC
PWMTCR=0x09;/*启动PWM输出*/
for(j=0;j{
PWMMR0=Fpclk/HCMM[j];//设置输出频率
PWMLER=0x05;//更新匹配值后,必须锁存
Delay(HCMM_L[j]);//延时,控制播放速度
}
PINSEL0=0x00;
IO0DIR=1<<7;
IO0SET=1<<7;
}
//音乐函数2
voidMUSIC_2(uint32cnt)
{uint32j;
PINSEL0=0x02<<14;//P0.7选择PWM2功能
/*PWM初始化*/
PWMPR=0x00;//不分频,计数频率为Fpclk
PWMMCR=0x02;//设置PWMMR0匹配时复位PWMTC
PWMPCR=0x0400;//允许PWM2输出,单边PWM
PWMMR0=Fpclk/1000;
PWMMR2=PWMMR0/2;//50%占空比
PWMLER=0x05;//PWM0和PWM2匹配锁存
PWMTCR=0x02;//复位PWMTC
PWMTCR=0x09;/*启动PWM输出*/
for(j=0;j{
PWMMR0=Fpclk/HCMM1[j];//设置输出频率
PWMLER=0x05;//更新匹配值后,必须锁存
Delay(HCMM_L1[j]);//延时,控制播放速度
}
PINSEL0=0x00;
IO0DIR=1<<7;
IO0SET=1<<7;
}
/********************************************************************************************************
**函数名称:
DelayNS()
**函数功能:
长软件延时
**入口参数:
dly延时参数,值越大,延时越久
**出口参数:
无
********************************************************************************************************/
voidDelayNS(uint32dly)
{
uint32i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
/********************************************************************************************************
**函数名称:
MSPI_Init()
**函数功能:
初始化SPI接口,设置为主机。
**入口参数:
无
**出口参数:
无
*********************************************************************************************************/
voidMSPI_Init(void)
{
//PINSEL0=(PINSEL0&0xFFFF00FF)|0x00005500;//设置管脚连接SPI
PINSEL0=(PINSEL0&(~(0xFF<<8)))|(0x55<<8);
SPCCR=0x52;//设置SPI时钟分频
SPCR=(0<<3)|//CPHA=0,数据在SCK的第一个时钟沿采样
(1<<4)|//CPOL=1,SCK为低有效
(1<<5)|//MSTR=1,SPI处于主模式
(0<<6)|//LSBF=0,SPI数据传输MSB(位7)在先
(0<<7);//SPIE=0,SPI中断被禁止
}
/**********************************************************************函数名称:
IRQ_Eint0()
**函数功能:
外部中断0EINT0服务程序口。
**入口参数:
无。
**出口擦数:
无。
********************************************************************/
void__irqIRQ_Eint0(void)
{
MUSIC_1(15);//播放歌曲
/*等待外部中断信号恢复为高电平
若信号保持为低电平,中断标志会一直置位。
*/
while((EXTINT&0x01)!
=0)
{
EXTINT=0x01;/*清除EINT0中断标志*/
}
VICVectAddr=0;/*向量中断结束*/
}
/**********************************************************************函数名称:
IRQ_Eint1()
**函数功能:
外部中断1EINT1服务程序口。
**入口参数:
无。
**出口擦数:
无。
********************************************************************/
void__irqIRQ_Eint3(void)
{
MUSIC_2(20);//播放歌曲
/*等待外部中断信号恢复为高电平
若信号保持为低电平,中断标志会一直置位。
*/
while((EXTINT&0x08)!
=0)
{
EXTINT=0x08;/*清除EINT3中断标志*/
}
VICVectAddr=0;/*向量中断结束*/
}
/********************************************************************************************************
**函数名称:
MSPI_SendData()
**函数功能:
向SPI总线发送数据。
**入口参数:
data待发送的数据
**出口参数:
返回值为读取的数据
********************************************************************************************************/
uint8MSPI_SendData(uint8data)
{
IOCLR=HC595_CS;//片选74HC595
SPI_SPDR=data;
while(0==(SPI_SPSR&0x80));//等待SPIF置位,即等待数据发送完毕
IOSET=HC595_CS;
return(SPI_SPDR);
}
/*此表为LED0~F以及L、P的字模*/
uint8constDISP_TAB[19]={
//2007050328
0xA4,0xC0,0xC0,0xF8,0xC0,0x92,0xC0,0xB0,0xF9,0x80,
//LUJIAn
0xC7,0xC1,0XF1,0Xf9,0x88,0xc8,
//r0ng
0x88,0xC0,0xC8,0x90,};
/*
*********************************************************************************************************
**函数名称:
main()
**函数功能:
流水灯显示实验。
**调试说明:
连接跳线JP12至LED8~LED1。
*********************************************************************************************************
*/
/*流水灯花样,低电平点亮,注意调用时候用了取反