ARM报告PWM和SPI流水灯Word文档格式.docx
《ARM报告PWM和SPI流水灯Word文档格式.docx》由会员分享,可在线阅读,更多相关《ARM报告PWM和SPI流水灯Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
而最高位输出(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,
_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,
_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,_8,_8,_8,_8,
_4,_4,_4,_8,_8,
/********************************************************************************************************
**函数名称:
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<
cnt;
j++)
{
PWMMR0=Fpclk/HCMM[j];
//设置输出频率
//更新匹配值后,必须锁存
Delay(HCMM_L[j]);
//延时,控制播放速度
}
PINSEL0=0x00;
IO0DIR=1<
7;
IO0SET=1<
//音乐函数2
voidMUSIC_2(uint32cnt)
for(j=0;
PWMMR0=Fpclk/HCMM1[j];
Delay(HCMM_L1[j]);
DelayNS()
voidDelayNS(uint32dly)
{
dly>
0;
dly--)
for(i=0;
i<
50000;
MSPI_Init()
初始化SPI接口,设置为主机。
*********************************************************************************************************/
voidMSPI_Init(void)
//PINSEL0=(PINSEL0&
0xFFFF00FF)|0x00005500;
//设置管脚连接SPI
PINSEL0=(PINSEL0&
8);
SPCCR=0x52;
//设置SPI时钟分频
SPCR=(0<
3)|//CPHA=0,数据在SCK的第一个时钟沿采样
(1<
4)|//CPOL=1,SCK为低有效
5)|//MSTR=1,SPI处于主模式
(0<
6)|//LSBF=0,SPI数据传输MSB(位7)在先
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);
0x08)!
EXTINT=0x08;
/*清除EINT3中断标志*/
}
/********************************************************************************************************
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。
/*流水灯花样,低电平点亮,注意调用时候用了取反