UART实验.docx
- 文档编号:11174322
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:21
- 大小:31.90KB
UART实验.docx
《UART实验.docx》由会员分享,可在线阅读,更多相关《UART实验.docx(21页珍藏版)》请在冰豆网上搜索。
UART实验
UART数据传送实验
本实验利用ADSPBF533-EZ-KIT评估板的硬件资源,通过UART口进行数据传送实验。
UART口用查询和中断两种方式数据传送是否完成。
实验结果可以通过主机上的串口调试软件可以看到传送的数据。
1.测试程序简介
1)本实验使用的程序包括main.asm、Startup.asm、和Uartlib.asm3个模块,以及常数和宏定义、全局变量定义部分。
其中main.asm函数完成程序的控制,Uartlib.asm完成对UART的初始化以及对子程序的定义,Startup.asm完成程序的启动设置。
2)程序工作流程:
main.asm首先初始化UART(设置各个控制寄存器),初始化UART_GCTL寄存器始能UART时钟,然后对UART_LCR寄存器进行初始化将UART设置成8位数据位、1位停止位、无奇偶校验位,从UART_DLL、UART_DLH中读出Divisor的值并计算出周期。
调用设置UART的波特率函数uart_autobaud,波特率设成自动波特率。
程序进入以查询和中断方式传送数据。
本实验的程序位于…\UART子目录,打开工程文件UART.DPJ,可以看到演示软件主程序模块:
main.asm
#include
#include"uartlib.h"
#include"sicnames.h"
/*****************************************************************************
*
*Examplerequiresasimplehello-worldstring.
*Initializeon-chipSRAMatboottimeaccordingly.
*
****************************************************************************/
.sectiondata1;
.bytesHead[]=13,10,'-------------------------------',
13,10,'ADSP-BF533Blackfinisspeaking',
13,10,'(DL=',0;
.bytesTail[]=')',
13,10,'-------------------------------',
13,10,0;
.bytesEcho[]='Typeanycharacter.TheBlackfinUART',
13,10,'returnstheecho>',0;
.align4;
.varaEchoFifo[16];
/*****************************************************************************
*
*Mainprogramstartshere!
*
****************************************************************************/
.sectionL1_code;
.global_main;
_main:
[--sp]=rets;
/*****************************************************************************
*
*Firstofall,initializep0toUART_GCTLregisteraddress.
*p0mustnotbechangedwithinthisexample
*
****************************************************************************/
p0.l=lo(UART_GCTL);
p0.h=hi(UART_GCTL);
calluart_autobaud;
/*****************************************************************************
*
*r0holdsthetimerperiodvalue,now.
*ApplyformulaDL=PERIOD/(16x8bits)andcalluart_initthatwrites
*theresulttothetwo8-bitDLregisters(DLH:
DLL).
*
****************************************************************************/
r0>>=7;
calluart_init;
/*****************************************************************************
*
*TransmitaHelloWorldstringandthecontentoftheDLregisters.
*
****************************************************************************/
p1.l=sHead;
p1.h=sHead;
calluart_puts;
/*****************************************************************************
*
*Notethatr0stillcontainstheDLH:
DLLvalue
*
****************************************************************************/
calluart_putreg;
p1.l=sTail;
p1.h=sTail;
calluart_puts;
/*****************************************************************************
*
*Waituntiloperationhasfinishedcompletely.Thisisoptional.
*
****************************************************************************/
calluart_wait4temt;
/*****************************************************************************
*
*Transmitanotherstring,butuseinterruptmode,thistime.
*FirstTXinterruptchannelmustbeassignedandenabled.
*AssigntoEVT9.
*
*p3pointstotheNULL-terminatedstring.
*
*Important:
ifyouenableallthreeUARTinterruptschannels,itis
*recommendedtokeepthisorderofpriorities:
*PRIORITY(Error)>=PRIORITY(RX)>=PRIORITY(TX)
*
****************************************************************************/
p1.l=lo(IMASK);
p1.h=hi(IMASK);
p3.l=sEcho;
p3.h=sEcho;
/*****************************************************************************
*
*RegisterTXserviceroutineatEVT9.
*
****************************************************************************/
r0.l=isr_uart_tx;
r0.h=isr_uart_tx;
[p1+EVT9-IMASK]=r0;
/*****************************************************************************
*
*UnmaskEVT9interrupt.
*
****************************************************************************/
r0=[p1+IMASK-IMASK];
bitset(r0,bitpos(EVT_IVG9));
[p1+IMASK-IMASK]=r0;
/*****************************************************************************
*
*EnableUARTTXinterruptandassignittoEVT9.
*Constantsusedbelowaredefinedin"sicnames.h"header.
*
****************************************************************************/
p1.l=lo(SIC_IMASK);
p1.h=hi(SIC_IMASK);
r0.l=lo(IVG_SPT0_ERROR(15)|IVG_PPI_ERROR(15)|IVG_DMA_ERROR(15)|IVG_PLL_WAKEUP(15));
r0.h=hi(IVG_RTC(15)|IVG_UART_ERROR(15)|IVG_SPT1_ERROR(15)|IVG_SPI_ERROR(15));
[p1+SIC_IAR0-SIC_IMASK]=r0;
r0.l=lo(IVG_SPT1_RX(15)|IVG_SPT0_TX(15)|IVG_SPT0_RX(15)|IVG_PPI(15));
r0.h=hi(IVG_UART_TX(9)|IVG_UART_RX(16)|IVG_SPI(15)|IVG_SPT1_TX(15));
[p1+SIC_IAR1-SIC_IMASK]=r0;
r0.l=lo(IVG_PFA(15)|IVG_TIMER2(15)|IVG_TIMER1(15)|IVG_TIMER0(15));
r0.h=hi(IVG_SWDT(15)|IVG_MEMDMA1(15)|IVG_MEMDMA0(15)|IVG_PFB(15));
[p1+SIC_IAR2-SIC_IMASK]=r0;
r0.l=lo(IRQ_UART_TX);
r0.h=hi(IRQ_UART_TX);
[p1+SIC_IMASK-SIC_IMASK]=r0;
/*****************************************************************************
*
*EnableInterruptNesting.
*
****************************************************************************/
[--sp]=reti;
/*****************************************************************************
*
*FinallyenableinterruptsinsideUARTmodule,bysettingproperbits
*intheIERregister.Itisgoodprogrammingstyletoclearpotential
*UARTinterruptlatchesinadvance,byreadingRBR,LSRandIIR.
*
*SettingtheETBEIbitautomaticallyfiresaTXinterruptrequest.
*
****************************************************************************/
r0=w[p0+UART_RBR-UART_GCTL](z);
r0=w[p0+UART_LSR-UART_GCTL](z);
r0=w[p0+UART_IIR-UART_GCTL](z);
r0=ETBEI;
w[p0+UART_IER-UART_GCTL]=r0;
/*****************************************************************************
*
*Waituntiloperationhasfinishedcompletely.Again,thisisoptional.
*
****************************************************************************/
calluart_wait4temt;
/*****************************************************************************
*
*DisableUARTTXinterruptagain,andenableUARTRXinterruptandUART
*LineErrorInterrupt.
*SimplyechoallreceivedcharactersbacktoTX.
*
*Disablenestingduringthesetup.
*
****************************************************************************/
reti=[sp++];
p1.l=lo(IMASK);
p1.h=hi(IMASK);
/*****************************************************************************
*
*i0andi1areusedtoimplementalittleFIFO
*
****************************************************************************/
i0.l=aEchoFifo;
i0.h=aEchoFifo;
i1=i0;
b0=i0;
b1=i0;
l0=length(aEchoFifo);
l1=l0;
/*****************************************************************************
*
*RegisterRXserviceroutineatEVT8anderrorroutinetoEVT7.
*
****************************************************************************/
r0.l=isr_uart_error;
r0.h=isr_uart_error;
[p1+EVT7-IMASK]=r0;
r0.l=isr_uart_rx;
r0.h=isr_uart_rx;
[p1+EVT8-IMASK]=r0;
/*****************************************************************************
*
*MaskEVT9interruptandunmaskEVT7andEVT8.
*
****************************************************************************/
r0=[p1+IMASK-IMASK];
bitclr(r0,bitpos(EVT_IVG9));
bitset(r0,bitpos(EVT_IVG7));
bitset(r0,bitpos(EVT_IVG8));
[p1+IMASK-IMASK]=r0;
/*****************************************************************************
*
*Enableandassigninterrupts.
*
****************************************************************************/
p1.l=lo(SIC_IMASK);
p1.h=hi(SIC_IMASK);
r0.l=lo(IVG_SPT0_ERROR(15)|IVG_PPI_ERROR(15)|IVG_DMA_ERROR(15)|IVG_PLL_WAKEUP(15));
r0.h=hi(IVG_RTC(15)|IVG_UART_ERROR(7)|IVG_SPT1_ERROR(15)|IVG_SPI_ERROR(15));
[p1+SIC_IAR0-SIC_IMASK]=r0;
r0.l=lo(IVG_SPT1_RX(15)|IVG_SPT0_TX(15)|IVG_SPT0_RX(15)|IVG_PPI(15));
r0.h=hi(IVG_UART_TX(15)|IVG_UART_RX(8)|IVG_SPI(15)|IVG_SPT1_TX(15));
[p1+SIC_IAR1-SIC_IMASK]=r0;
r0.l=lo(IVG_PFA(15)|IVG_TIMER2(15)|IVG_TIMER1(15)|IVG_TIMER0(15));
r0.h=hi(IVG_SWDT(15)|IVG_MEMDMA1(15)|IVG_MEMDMA0(15)|IVG_PFB(15));
[p1+SIC_IAR2-SIC_IMASK]=r0;
r0.l=lo(IRQ_UART_RX|IRQ_UART_ERROR);
r0.h=hi(IRQ_UART_RX|IRQ_UART_ERROR);
[p1+SIC_IMASK-SIC_IMASK]=r0;
/*****************************************************************************
*
*EnableInterruptNesting.
*
****************************************************************************/
[--sp]=reti;
/*****************************************************************************
*
*FinallyenableinterruptsinsideUARTmodule,bysettingproperbits
*intheIERregister.Itisgoodprogrammingstyletoclearpotential
*UARTinterruptlatchesinadvance,byreadingRBR,LSRandIIR.
*
****************************************************************************/
r0=w[p0+UART_RBR-UART_GCTL](z);
r0=w[p0+UART_LSR-UART_GCTL](z);
r0=w[p0+UART_IIR-UART_GCTL](z);
r0=ELSI|ERBFI;
w[p0+UART_IER-UART_GCTL]=r0;
/*****************************************************************************
*
*ThefollowingendlesslooptestswhetherdataisreadyintheaEchoFifo
*and
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UART 实验