Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2003520
  • 博文数量: 356
  • 博客积分: 8284
  • 博客等级: 中将
  • 技术积分: 4580
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-15 20:25
个人简介

天行健,君子以自强不息

文章分类

全部博文(356)

文章存档

2018年(1)

2016年(4)

2015年(13)

2014年(14)

2013年(2)

2012年(25)

2011年(43)

2010年(65)

2009年(189)

分类: C/C++

2011-11-24 19:38:09

程序功能:将内存1的数据用DMA传到内存2,然后判断两处数据是否一致。
如果一致,蜂鸣器响两声;如果不一致,蜂鸣器不响。
程序如下:
#include "LPC17xx.h"                                                    /* LPC17xx外设寄存器            */
/*********************************************************************************************************
  变量与宏定义
*********************************************************************************************************/
#define BEEP       (1 << 11)                                            /* 蜂鸣器                       */
#define BEEPOFF()   LPC_GPIO0->FIODIR |= BEEP;LPC_GPIO0->FIOSET = BEEP  /* 蜂鸣器关                     */
#define BEEPON()    LPC_GPIO0->FIODIR |= BEEP;LPC_GPIO0->FIOCLR = BEEP  /* 蜂鸣器开                     */
                  
uint32_t GulSrcDat[50] = { 0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555,
                         0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555,
                         0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555,
                         0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555,
                         0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555,
                         0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555,
                         0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555,
                         0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555, 0x55555555,
       0x55555555 };                                  /* 存放源地址数据               */
uint32_t GulDesDat[50] = {0};                                             /* 存放目标地址数据             */
/*********************************************************************************************************
** Function name:       sysTimeDlay
** Descriptions:        延时函数
** input parameters:    ulTime:   延时时间
** Output parameters:   无
** Returned value:      无
*********************************************************************************************************/
 void sysTimeDlay(uint32_t ulTime)
{
    uint32_t i = 0;
    while(ulTime--) {
      for(i=0; i < 5000; i++);
    }
}
/*********************************************************************************************************
** Function name:       beepNumber
** Descriptions:        控制蜂鸣器鸣叫次数
** input parameters:    ulNum:   蜂鸣器鸣叫次数
** Output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void beepNumber (uint32_t ulNum)
{
    uint32_t i;
    for (i = ulNum; i > 0; i--) {
        BEEPON();                                                       /* 开启蜂鸣器                   */
        sysTimeDlay(2000);                                              /* 延时一段时间                 */
        BEEPOFF();                                                      /* 关闭蜂鸣器                   */
        sysTimeDlay(2000);
    }
}
/*********************************************************************************************************
** Function name:       dmaInit
** Descriptions:        DMA通道0初始化函数(存储器到存储器)
** input parameters:    puiSrc_Address:   存储区源地址
**                      puiDest_Address:  存储区目标地址
**                      uiDMA_Size:       传输字节个数
** Output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void dmaInit (uint32_t *pulSrc_Address,  uint32_t *pulDest_Address,  uint32_t ulDMA_Size)
{
   
 LPC_SC->PCONP  |= (1 << 29);                                        /* 使能GPDMA时钟                */
    LPC_GPDMA->DMACIntTCClear   |= 0x01;                                /* 清除终端计数中断的标志       */
    LPC_GPDMA->DMACIntErrClr    |= 0x01;                                /* 清除错误中断标志             */
                                                                        /* 初始化DMA传输流              */
    LPC_GPDMACH0->DMACCLLI = 0;                                         /* 下一个链表项无效,本次DMA传  */
                                                                        /* 输流使用连续存储空间         */
    LPC_GPDMACH0->DMACCControl    |=  ((ulDMA_Size/4)&0x0fff)
                     |   (0x04 << 12)                                   /* 指定源突发传输大小为32位     */
                     |   (0x04 << 15)                                   /* 指定目的突发传输大小为32位   */
                     |   (0x02 << 18)                                   /* 指定源传输数据宽度为32位     */
                     |   (0x02 << 21)                                   /* 指定目标传输数据宽度为32位   */
                     |   (1 << 26)                                      /* 指定源地址自动增加           */
                     |   (1 << 27)                                      /* 指定目标地址自动增加         */
                     |   (0x80000000);                                  /* 配置传输流的中断             */
                                                                        /* 使能通道0的终端计数中断      */ 
    LPC_GPDMACH0->DMACCSrcAddr = (uint32_t)pulSrc_Address;              /* 设置存储区源地址             */
    LPC_GPDMACH0->DMACCDestAddr= (uint32_t)pulDest_Address;             /* 设置存储区目标地址           */                                                                      
}
/*********************************************************************************************************
** Function name:       gpdmaEnabe
** Descriptions:        DMA及DMA通道0使能
** input parameters:    无
** Output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void gpdmaEnabe (void)
{
    LPC_GPDMA->DMACConfig    = 0x01;                                    /* 使能DMA,使能小端模式        */
    LPC_GPDMACH0->DMACCConfig |= 0x01;                                  /* 使能通道0                    */
}
/*********************************************************************************************************
** Function name:       main
** Descriptions:        GPDMA测试,LPC1700GPDMA可以访问所有SRAM,只需定义两个数组,经过DMA传输后,
**                      判断如果两个数组数据相等即证明GPDMA传输正确.测试时短接JP17,本例程实验现像为:
**                      如果GPDMA传输正确,蜂鸣器响两声;
**                      如果GPDMA传输错误,蜂鸣器不响。
** input parameters:    无
** Output parameters:   无
** Returned value:      无
*********************************************************************************************************/
int main (void)
{
    uint32_t i;
    uint32_t ulflag = 0;                                                /* 判断传输是否正确,1表示DMA   */
                                                                        /* 传输正确,0表示DMA传输错误   */
    SystemInit();                                                       /* 系统初始化,切勿删除         */
    BEEPOFF();
    dmaInit(GulSrcDat,GulDesDat,200);                                   /* GPDMA初始化                  */   
    gpdmaEnabe();                                                       /* DMA使能                      */
   
    /*
     *  比较源数组与目标数组是否相等,若相等则GPDMA传输正确,flag = 1
     */
    for (i = 0; i <50; i++) {
        if (GulDesDat[i] != GulSrcDat[i]) {
            ulflag = 0;
            break;
        } else {
            ulflag = 1;
        }
    }
    /*
     *  如果GPDMA传输正确,蜂鸣器响两声;如果GPDMA传输错误,蜂鸣器响一声
     */
    if (1 == ulflag)
 {                                               
        beepNumber(2);
    } else
 {
        //beepNumber(1);
    }
    while (1);
}
/*********************************************************************************************************
  End Of File
*********************************************************************************************************/
阅读(5290) | 评论(0) | 转发(0) |
0

上一篇:LPC1766之can总线

下一篇:LPC1766之systick

给主人留下些什么吧!~~