哈工大威海大四通信课设Word格式.docx

上传人:b****6 文档编号:18371070 上传时间:2022-12-15 格式:DOCX 页数:85 大小:3.19MB
下载 相关 举报
哈工大威海大四通信课设Word格式.docx_第1页
第1页 / 共85页
哈工大威海大四通信课设Word格式.docx_第2页
第2页 / 共85页
哈工大威海大四通信课设Word格式.docx_第3页
第3页 / 共85页
哈工大威海大四通信课设Word格式.docx_第4页
第4页 / 共85页
哈工大威海大四通信课设Word格式.docx_第5页
第5页 / 共85页
点击查看更多>>
下载资源
资源描述

哈工大威海大四通信课设Word格式.docx

《哈工大威海大四通信课设Word格式.docx》由会员分享,可在线阅读,更多相关《哈工大威海大四通信课设Word格式.docx(85页珍藏版)》请在冰豆网上搜索。

哈工大威海大四通信课设Word格式.docx

每个GPIO端口可通过软件分别配置成输入或输出。

5509芯片提供了8个通用输入/输出引脚,即GPIO0−GPIO7。

每个引脚可以通过IODIR寄存器被独立的设置为输入或输出引脚。

IODATA寄存器用来监控输入引脚的状态,控制输出引脚的状态。

(二)相关寄存器

1)IODIR寄存器

IOXDIR为输入/输出控制位。

当IOXDIR=0,IOX引脚为输入引脚,当IOXDIR=1,IOX引脚为输出引脚。

1)IODATA寄存器

第0到7位IOXD为IOX数据位。

当IOX为输入引脚,IOXD=0说明在IOX引脚上的信号为低电平,IOXD=1说明在IOX引脚上的信号为高电平。

当IOX为输出引脚,IOXD=0说明驱动IOX引脚上的信号为低电平,IOXD=1说明驱动IOX引脚上的信号为高电平。

(三)PLL锁相环输出频率的计算

输出频率计算公式:

将输入时钟频率乘以CLKMD中PLL_MULT的值,再除以PLL_DIV的值。

PLL_MULT的取值范围是2-31。

PLL_DIV是从0(除以1)到3(除以4)。

输出频率=(PLL_MULT/(PLL_DIV+1))*输入时钟频率

例如:

(24/(1+1))*12M=144M

(四)源码及注释

#include<

csl.h>

csl_pll.h>

csl_chip.h>

csl_gpio.h>

voiddelay();

/*锁相环的设置*/

PLL_ConfigmyConfig={

0,//IAI:

thePLLlocksusingthesameprocessthatwasunderway

//beforetheidlemodewasentered

1,//IOB:

IfthePLLindicatesabreakinthephaselock,

//itswitchestoitsbypassmodeandrestartsthePLLphase-locking

//sequence

24,//PLLmultiplyvalue;

multiply24times

1//Divideby2PLLdividevalue;

itcanbeeitherPLLdividevalue

//(whenPLLisenabled),orBypass-modedividevalue

//(PLLinbypassmode,ifPLLmultiplyvalueissetto1)

};

/*输出频率=(PLL_MULT/(PLL_DIV+1))*输入时钟频率=12M*24/(1+1)=144M*/

main()

{

inti=0;

/*初始化CSL库*/

CSL_init();

/*设置系统的运行速度为144MHz*/

PLL_config(&

myConfig);

/*时钟配置/

/*确定方向为输出*/

GPIO_RSET(IODIR,0xFF);

/每个端口通过软件配置为输入或输出,1为输出*/

for(i=0;

i<

0x0a;

i++)

{

/*全亮*/

GPIO_RSET(IODATA,0xff);

//设置IODATA寄存器

delay();

//延时

/*全灭*/

GPIO_RSET(IODATA,0x0);

}

/*循环闪烁*/

for(;

;

GPIO_RSET(IODATA,0x1);

GPIO_RSET(IODATA,0x2);

GPIO_RSET(IODATA,0x4);

GPIO_RSET(IODATA,0x8);

GPIO_RSET(IODATA,0x10);

GPIO_RSET(IODATA,0x40);

GPIO_RSET(IODATA,0x80);

}

}

voiddelay()

Uint32j=0,k=0;

for(j=0;

j<

0x0c;

j++)

for(k=0;

k<

0xffff;

k++)

{}

(五)实验现象

板上LED先闪亮一次后循环点亮,每个LED灯点亮时间和熄灭时间均约1s。

二、中断的软件编程——外部中断实验

(一)外部中断简介

VC5509一共有5个外部中断,为INT[0-4],中断时序如下:

关于中断的处理方法,VC5509通过以下的寄存器来管理中断。

其中:

IVPD与IVPH是中断入口的定位寄存器,也就是说VC5509的中断向量也是可以重新定位的。

IFR0、IFR1是中断状态寄存器。

IER0、IER1是中断使能寄存器。

DBIER0、DBIER1是用来确定在调试时是否将可屏蔽的中断作为事件敏感的中断处理。

在设置与修改中断向量表时应注意:

在修改中断向量表寄存器IVPD与IVPH之前,设置INTM为1,阻止外来的中断使程序跑飞。

对于不可屏蔽的中断,应有新旧两个中断向量表,来保证在修改期间,不会执行错误的指令使程序跑飞。

中断向量表的安排如下表:

(一)源码及注释

csl_irq.h>

csl_emif.h>

stdio.h>

CSLBoolb;

Uint16eventId0;

intold_intm;

interruptvoidint1(void);

//---------Functionprototypes---------

/*Referencestartofinterruptvectortable*/

/*Thissymbolisdefinedinfile,vectors_IP.s55*/

externvoidVECSTART(void);

//itswitchestoitsbypassmodeandrestartsthePLLphase-locking

12,//PLLmultiplyvalue;

multiply12times

itcanbeeitherPLLdividevalue

/***************5509A终端设置,使能INT1中断***********************/

/*参考资料TMS320C55xChipSupportLibraryAPIReferenceGuide(Rev.J)

TMS320VC5509ADataSheet

HX-5509A开发板使用手册*/

voidINTconfig()

/*Temporarilydisableallmaskableinterrupts*/

IRQ_setVecs((Uint32)(&

VECSTART));

old_intm=IRQ_globalDisable();

/*GetEventIdassociatedwithExternalINT1(8019),forusewith*/

eventId0=IRQ_EVT_INT0;

/*ClearanypendingINT1interrupts*/

IRQ_clear(eventId0);

/*Placeinterruptserviceroutineaddressat*/

/*associatedvectorlocation*/

IRQ_plug(eventId0,&

int1);

/*EnableINT1(8019)interrupt*/

IRQ_enable(eventId0);

/*Enableallmaskableinterrupts*/

IRQ_globalEnable();

/*EMIF为全EMIF接口*/

CHIP_RSET(XBSR,0x0a01);

/*设置系统的运行速度144MHz*/

//设置并使能5509A芯片的INT0中断(EXINT中断)

INTconfig();

while

(1);

//ExternalINT0(EXINT)中断处理函数

interruptvoidint1()

inti,j;

printf("

EXINToccurs\n"

);

for(i=0;

i<

0xfff;

i++)

for(j=0;

j<

j++)

;

(一)实验现象及分析

当按下中断的按键时,打印出EXINToccurs。

注意程序的最后一段:

for(i=0;

这段程序是作延时消按键抖动之用的,实际情况下可合理设置到几十毫秒左右。

如果不加这一段程序,按键抖动可能导致打印出几行EXINToccurs而不是一行,产生错误。

三、通用计时器的使用——timer实验

(一)通用定时器Timer简介

通用定时器包括一个4位的预定标计数器(PSC)和一个16位的主计数器(TIM),从而提供20位的动态范围。

它还包含两个周期寄存器,即TDDR和PRD。

Timer的结构如下图:

在Timer初始化过程中,周期寄存器中的内容加载给计数器,其中TDDR加载到PSC,PRD加载到TIM中,开始工作。

Timer控制寄存器TCR控制并监控Timer的操作及其引脚(TIN/TOUT)。

PSC由CPU输入时钟或者外部时钟驱动,计数器工作,开始计数。

计时器发出信号的速率

(一)相关寄存器

2个计数寄存器和2个周期寄存器

PSC预定标计数器

TIM主计数寄存器

TDDR预定标周期寄存器

PRD主周期计数器

计时器控制寄存器TCR

TCR可以实现Timer的配置、工作、停止、加载、重新加载等。

1)IDLEEN:

Timer的空闲使能位。

IDLEEN=0,Timer不能置于空闲状态;

IDLEEN=1,当PERIPH域为空闲状态,Timer终止在低功耗状态。

2)FUNC:

可以将定时器引脚配置为:

通用输出(10b);

计时器输出(01b);

一个时钟输入(11b)或高阻状态(00b)。

3)TLB:

Timer加载位。

当TLB=0,TIM与PSC不被加载;

直到TLB=1,PRD加载到TIM,TDDR加载到PSC。

4)SOFT:

Soft终止位。

SOFT=0,硬终止,Timer直接终止;

SOFT=1,软终止,当main中的TIM计数到0时终止。

5)FREE:

自由运行位。

FREE=0,Timer如受SOFT位一样被影响;

FREE=1,Timer继续运行。

6)PWID:

定时器输出的脉冲宽度位。

1个CPU时钟周期(00b);

2个CPU时钟周期(01b);

4个CPU时钟周期(10b);

8个(11b)。

7)ARB:

自动重新装入位。

ARB=1,主计数器(TIM)一旦减少为0,计数寄存器自动从周期寄存器重新装入。

8)TSS:

Timer停止状态位。

TSS=0,启动Timer;

TSS=1,终止Timer;

9)CP:

时钟模式/脉冲模式位。

CP=0,脉冲模式;

CP=1,时钟模式。

10)DATOUT:

数据输出位。

DATOUT=0,驱动Timer引脚信号为低;

DATOUT=1,驱动Timer引脚信号为高。

11)源码及注释

csl_timer.h>

csl_chiphal.h>

#defineTIMER_CTRLTIMER_TCR_RMK(\

TIMER_TCR_IDLEEN_DEFAULT,/*IDLEEN==0*/

TIMER_TCR_FUNC_OF(0),/*FUNC==0*/

TIMER_TCR_TLB_RESET,/*TLB==1*/

TIMER_TCR_SOFT_BRKPTNOW,/*SOFT==0*/

TIMER_TCR_FREE_WITHSOFT,/*FREE==0*/

TIMER_TCR_PWID_OF(0),/*PWID==0*/

TIMER_TCR_ARB_RESET,/*ARB==1*/

TIMER_TCR_TSS_START,/*TSS==0*/

TIMER_TCR_CP_PULSE,/*CP==0*/

TIMER_TCR_POLAR_LOW,/*POLAR==0*/

TIMER_TCR_DATOUT_0/*DATOUT==0*/

/*Timer寄存器配置,信号输出频率1Khz左右*/

TIMER_ConfigtimCfg0={

TIMER_CTRL,/*TCR0*/

0x3400u,/*PRD0*/

0x0000/*PRSC*/

/*CreateaTIMER_HandleobjectforusewithTIMER_open*/

TIMER_HandlemhTimer0;

volatileUint16timer0_cnt=0;

/*Function/ISRprototypes*/

interruptvoidtimer0Isr(void);

voidtaskFxn(void);

Uint16tim_val;

Uint16xfchange=0;

//控制输出方向/

voidmain(void)

/*CLS库的初始化,这是必需的*/

/*修改寄存器IVPH,IVPD重新定义中断向量表*/

/*禁止所有可屏蔽的中断源*/

/*打开定时器0,设置其为上电的默认值,并返回其句柄*/

mhTimer0=TIMER_open(TIMER_DEV0,TIMER_OPEN_RESET);

/*CSLinterruptenablefunctions.*/

/*获得定时器0的中断ID号*/

eventId0=TIMER_getEventId(mhTimer0);

/*清除定时器0的中断状态位*/

/*为定时器0设置中断服务程序*/

timer0Isr);

/*设置定时器0的控制与周期寄存器*/

TIMER_config(mhTimer0,&

timCfg0);

/*使能定时器的中断*/

/*设置寄存器ST1的INTM位,使能所有的中断*/

/*启动定时器0*/

TIMER_start(mhTimer0);

/*Waitforatleast10timerperiods*/

/*等待10个定时周期*/

if(xfchange==0)

/*点亮XF的LED*/

CHIP_FSET(ST1_55,XF,1);

else

/*关掉XF的LED*/

CHIP_FSET(ST1_55,XF,0);

}/*XF输出01010101…*/

/*RestoreoldvalueofINTM*/

/*恢复INTM旧的值*/

IRQ_globalRestore(old_intm);

/*Wearethroughwithtimer,socloseit*/

/*关掉定时器0*/

TIMER_close(mhTimer0);

/*定时器0的中断程序*/

interruptvoidtimer0Isr(void)

++timer0_cnt;

if(timer0_cnt==1000)

xfchange=1;

if(timer0_cnt==2000)

timer0_cnt=0;

xfchange=0;

(二)实验现象

板上LED灯闪亮,间隔时间约1s。

四、通用计时器的使用——看门狗wdt实验

(一)看门狗简介

1.概念

硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。

那么定时时间到后就会使单片机复位。

常用的WDT芯片MAX813,5045,IMP813等。

软件看门狗技术的原理和这差不多,只不过是用软件的方法实现,用DSP的片上外设资源定时器timer来对主程序的运行进行监控。

2.作用

监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。

那么定时时间到后就会使DSP复位。

即:

防止因为软件死循环而造成的系统死锁。

3.HX-5509看门狗的结构

WatchdogTimer包括一个16bit的预定标计数器和一个16bit的主计数器,从而提供一个32bit动态范围的计数器

当预定标计数器达到0时,就会被重新加载,并重新开始计数。

装入的值由WDTCR中TDDR位+WDTCR2中的预定标模式PREMD位来决定。

当PREMD位为0时,4位TDDR域的值直接加载到预定标计数器上,提供20位动态范围;

当PREMD位为1时,预定标计数器通过非直接的方式加载16位的TDDR,这种模式提供32位动态范围的看门狗计时器。

当主计时器减为0时,产生超时事件,引发以下的可编程事件:

00b,一个看门狗定时器中断

10b,DSP复位

01b,一个非屏蔽中断(NMI)

11b,不发生任何事件

所产生的超时事件,通过编程控制寄存器WDTCR中的WDOUT域来控制

WDTIM计数器寄存器

WDPRD周期寄存器

WDTCR控制寄存器

WDTCR2控制寄存器2

1.WDTCR:

看门狗控制寄存器

WDOUT:

用来控制超时引发的可编程事件

PSC:

当PREMD=0时,用来存放预定标计数器的值。

TDDR:

当PREMD=0时,若预定标计数器的值减为0,则将TDDR加载到预定标计数器中。

当PREMD=1时,若预定标计数器的值减为0,则通过TDDR中的值选择加载到预定标计数器中的数。

1.WDTCR2:

PREMD:

预定标寄存器模式选择位,0为直接模式,1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1