打印
[DSP编程]

28335完成串口的DMA数据发送与接收

[复制链接]
4897|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
py12354|  楼主 | 2014-7-31 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近才拿到的开发板,要求如下:
发送过程中,dsp准备好数据 dma启动发送;接收过程中dma接收数据,并自动缓存在指定空间,并可产生中断,  让dsp取走数据。
因为小弟是新手,只看了一些例子,对于DMA如何启动串口来接收数据还搞不懂,希望各位大神指点!学习思路也好,代码也好,谢谢大家帮助!

相关帖子

沙发
zhangmangui| | 2014-7-31 22:09 | 只看该作者
看看ADC的DMA   
TI提供的SPR530(C2833x/C2823x C/C++ 头文件和外设示例)使我们非常方便的使用2833X和2823X的外设。下面就它定义的函数加一个说明。
// $TI Release: DSP2833x Header Files V1.10 $
// $Release Date: February 15, 2008 $
//**************在DSP2833x_Adc.c中定义的,共1个函数**************************//
void InitAdc(void);//在DSP2833x_Adc.c中定义,初始化ADC,使能ADCCLK,调入ADC的出厂刻度数据,上电。
//**************在DSP2833x_DMA.c中定义的,共37个函数**************************//
void DMAInitialize(void);//执行DMA硬件复位,设置DMA不受仿真器的影响。。
// DMA Channel 1
void DMACH1AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source);
//设置DMA的源和目标
void DMACH1BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep);
//设置每次Burst的字节数、源地址增量、目标地址增量。注意对于28335,BYTE和WORD是一样的,都是16BIT。
void DMACH1TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep);
//设置每次传送包含多少个Burst、传送完毕发中断,源地址增量、目标地址增量
void DMACH1WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep);
//设置传送完毕的源地址和目标地址
void DMACH1ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte);
//设置DMA工作模式,包括触发源、是否使能触发源、是否使能oneshot模式、是否使能Continuous模式、是否使能外围设备同步、选择同步模式、溢出中断等。)
参数说明:
persel--选择触发源,值为下列选项
    DMA_SEQ1INT--------ADC
    DMA_SEQ2INT--------ADC
    DMA_XINT1  --------外部中断
    DMA_XINT2  --------外部中断
    DMA_XINT3  --------外部中断
    DMA_XINT4  --------外部中断
    DMA_XINT5  --------外部中断
    DMA_XINT6  --------外部中断
    DMA_XINT7  --------外部中断
    DMA_XINT13 --------外部中断
    DMA_TINT0  --------CPU时钟
    DMA_TINT1  --------CPU时钟
    DMA_TINT2  --------CPU时钟
    DMA_MXEVTA  --------McBSP-A
    DMA_MREVTA  --------McBSP-A
    DMA_MXREVTB --------McBSP-B
    DMA_MREVTB  --------McBSP-B
perinte--使能触发源,值为PERINT_DISABLE或PERINT_ENABLE
oneshot--使能oneshot模式,值为ONESHOT_DISABLE或ONESHOT_ENABLE。此模式下,一次触发完成全部burst。
cont--使能Continuous模式,值为CONT_DISABLE或CONT_ENABLE。此模式下,传送完毕后DMA重新被初始化,并等待触发源。
synce--使能外围设备同步,值为SYNC_DISABLE或SYNC_ENABLE。
syncsel--同步选择。值为SYNC_SRC或SYNC_DST。
ovrinte--使能溢出中断。值为OVRFLOW_DISABLE或OVEFLOW_ENABLE。
datasize--每次传送位数。值为SIXTEEN_BIT或THIRTYTWO_BIT。
chintmode--通道中断产生模式。CHINT_BEGIN:传送开始发中断。CHINT_END:传送结束发中断。
chinte--使能通道中断。值为CHINT_DISABLE或CHINT_ENABLE。
void StartDMACH1(void);
//启动DMACH1
//其它5个通道的DMA的函数功能含义是一样的
// DMA Channel 2
void DMACH2AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source);
void DMACH2BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep);
void DMACH2TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep);
void DMACH2WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep);
void DMACH2ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte);
void StartDMACH2(void);
// DMA Channel 3
void DMACH3AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source);
void DMACH3BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep);
void DMACH3TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep);
void DMACH3WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep);
void DMACH3ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte);
void StartDMACH3(void);
// DMA Channel 4
void DMACH4AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source);
void DMACH4BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep);
void DMACH4TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep);
void DMACH4WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep);
void DMACH4ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte);
void StartDMACH4(void);
// DMA Channel 5
void DMACH5AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source);
void DMACH5BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep);
void DMACH5TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep);
void DMACH5WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep);
void DMACH5ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte);
void StartDMACH5(void);
// DMA Channel 6
void DMACH6AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source);
void DMACH6BurstConfig(Uint16 bsize,Uint16 srcbstep, int16 desbstep);
void DMACH6TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep);
void DMACH6WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep);
void DMACH6ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte);
void StartDMACH6(void);

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
py12354 + 1 辛苦了
板凳
zhangmangui| | 2014-7-31 22:11 | 只看该作者
void DMACH1AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source)

源地址有两个,一个A为用于传输时(随每个字节递增),另一个B作为返回的备份(当一帧结束后,重新装载入A)

目的地址有两个,一个A为用于传输时(随每个字节递增),另一个B作为返回的备份(当一帧结束后,重新装载入A)

每次启动DMA相应通道,都会把B装载入A

void DMACH1BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep)

Bsize: 每一个脉冲传递的字的个数,实际脉冲数为bsize+1

Srcbstep:每传递一个字后,源地址A增量

Desbstep:每传递一个字后,目的地址A增量

void DMACH1TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep)

Tsize:每一帧的脉冲个数,脉冲递减到0时(即一帧传递完成,也是DMA传递完成),产生DMA中断。实际帧数为tsize+1

Srctstep:每个脉冲的最后一个字传递结束后,源地址A增量

Deststep:每个脉冲的最后一个字传递结束后,目的地址A增量

void DMACH1WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep)

Srcwsize:当已经传递的脉冲数为srcwsize+1的整数倍时,源地址(B)增加srcwstep(常为0),并装载入源地址A

Deswsize:当已经传递的脉冲数为deswsize+1的整数倍时,目的地址(B)增加deswstep(常为0),并装载入目的地址A

void DMACH1ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte)

Persel:选择触发DMA的外设中断源

Perinte:外设中断使能,

Oneshot:使能时,外设产生一次中断,就能够把一帧传递完。禁止,外设产生一次中断,只能传递一个脉冲

Cont:使能时,每次DMA结束后,需要再次启动DMA时,就不需要调用void StartDMACH1(void)。禁止时,重启DMA,需要调用void StartDMACH1(void)

Datasize:设置每个字是16位或者32位

Chintmode:设置DMA中断是在DMA启动或者结束时产生

Chinte:DMA相应通道的中断使能(外设级)。

注:Perinte和Chinte同时使能时,才能进入DMA通道中断

仅Perinte使能,可以传输数据,但是不进入通道的中断程序

void StartDMACH1(void)

首次启动DMA,若Cont为禁止,每次DMA结束后,需要再次启动DMA时需要调用

只开启相应用于触发的外设级中断,不开启PIE对应位,则能够触发DMA而不触发CPU的中断程序

经过DMACH1ModeConfig配置的中断,DMA会自动清除相应外设级的中断标志位,不用程序清除

使用特权

评论回复
地板
zhangmangui| | 2014-7-31 22:11 | 只看该作者
5
py12354|  楼主 | 2014-8-1 11:08 | 只看该作者
zhangmangui 发表于 2014-7-31 22:11
https://bbs.21ic.com/icview-147982-1-1.html

请问版主,中断源我该选择什么,选外部中断的话,我该怎么联系到串口通信那边去。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝