智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 8153|回复: 14
打印 上一主题 下一主题

k60—ov7620采样问题求解??

[复制链接]

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
跳转到指定楼层
1#
发表于 2012-6-7 17:59:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
K60采样时候,用DMA中断,可是为什么把pclk 连接到c0 ,程序就死在dma里了,看了一下pclk大致的周期是74ns !!DMA怎么采样啊??求高手解决!!

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
2#
 楼主| 发表于 2012-6-7 20:05:50 | 只看该作者
自己顶起!!!!
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
383
威望
227
贡献
86
兑换币
6
注册时间
2012-4-27
在线时间
35 小时
毕业学校
万里学院
3#
发表于 2012-6-8 11:06:29 | 只看该作者
很可能是dma内有配置完整。你dma死在哪里,貌似dma就只有在中断了才能看到传输是否完成,你怎么知道它死了,你dma的完成中断标志位有没有清掉。
回复 支持 反对

使用道具 举报

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
4#
 楼主| 发表于 2012-6-12 00:25:24 | 只看该作者
//DMA初始化结构体赋值
  User_Def_DMA_Init.Channelx          =DMA_CH1;               //设置为通道1
  User_Def_DMA_Init.Peri_DmaReq       =PORTC_DMAREQ;          //IO C 产生DMA请求
  User_Def_DMA_Init.Minor_loop_Length =H;                     //主循环次数
  User_Def_DMA_Init.Source_Addr       =(uint32_t)&GPIOD_PDIR; //设置源地址
  User_Def_DMA_Init.Dest_Addr         =(uint32_t)Pix_Data;    //目的地址为Pix_Data的首地址
  User_Def_DMA_Init.Dma_irqc          =1;                     //采集结束触发中断
                                                               //Dma中断选择  
                                                              //00 关闭中断  
                                                               //01 主循环计数器计数减到一半,产生中断
                                                                //02 主循环计数器计数减到零时,产生中断
  User_Def_DMA_Init.isr_func          =dma1_isr;               //自定义通道1中断服务子程序
  //初始化DMA模块
  LPLD_DMA_Init(&User_Def_DMA_Init);

/*************************/


初始化
回复 支持 反对

使用道具 举报

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
5#
 楼主| 发表于 2012-6-12 00:25:41 | 只看该作者
enable_irq (88); //PORTB 中断 PB3产生场中断和PB0产生行中断
/********************/
回复 支持 反对

使用道具 举报

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
6#
 楼主| 发表于 2012-6-12 00:26:03 | 只看该作者
void PORTB_IRQHandler()
{
  /****************************/
  u8  n=0;      //引脚号
  /********************行中断********************/
   
    n=0;                           //行中断
    if(PORTB_ISFR & (1<<n))           //PTB0触发中断
    {
        PORTB_ISFR  |= (1<<n);          //写1清中断标志位
        gpio_turn (PORTB,5);
        /*********************/
        LPLD_DMA_Start(1,1);         //使能通道1 DMA 请求
         V_Cnt++;
    }
  /********************场中断********************/
   
    n=3;                               //场中断
    if(PORTB_ISFR & (1<<n))           //PTB3触发中断
    {
        PORTB_ISFR  |= (1<<n);          //写1清中断标志位
        gpio_turn (PORTB,6);
        /********************/
        LPLD_DMA_Init(&User_Def_DMA_Init); //初始化DMA模块
        V_Cnt=0;                          //行采集计数清零
        Field_Over=0;                     //场采集完成清零
         /******************/
    }
/******************************/
}
回复 支持 反对

使用道具 举报

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
7#
 楼主| 发表于 2012-6-12 00:26:20 | 只看该作者
/*************************************************************************
*                             野火嵌入式开发工作室
*
*  函数名称:dma1_isr
*  功能说明:Pclk——ptc0端口中断服务函数
*  参数说明:无
*  函数返回:无
*  修改时间:2012-1-25    已测试
*  备    注:引脚号需要根据自己初始化来修改
*************************************************************************/
void dma1_isr(void)
{
  
  if(V_Cnt==V)
  {
    Field_Over=1; //场采集完成置位
  }
  
}
/*************************************************************************/
回复 支持 反对

使用道具 举报

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
8#
 楼主| 发表于 2012-6-12 00:27:10 | 只看该作者
#include "common.h"
#include "HAL_eDMA.h"

DMA_ISR_CALLBACK DMA_ISR[16];

/*
* LPLD_DMA_Init
* DMA模块通用初始化函数--用于源地址到目的地址之间的数据直接传输(不用通过CPU)
* 详细参数在LPLD_eDMA_Cfg_t 结构体中定义(在HAL_eDMA.h)头文件中定义
*/
uint8_t LPLD_DMA_Init(LPLD_eDMA_Cfg_t *DMA_Config)
{
    //如果用户没有设置 每一次传输字节的个数 默认为每次传输一个字节
    if(DMA_Config->Trans_bytesNum  == NULL)
    {
       DMA_Config->Trans_bytesNum =1;
    }
   
    //如果用户没有设置 源地址增加 默认为执行一次DMA请求后源地址不增加
    if(DMA_Config->Source_Addr_inc == NULL)
    {
       DMA_Config->Source_Addr_inc  =ADDR_HOLD;       //源地址不增加
    }
    //如果用户没有设置 源数据长度 默认为8位数据长度
    if(DMA_Config->Source_Size ==NULL)
    {
       DMA_Config->Source_Size       =DMA_SRC_8BIT;    //源数据宽度8bit 一个字节
    }
    //如果用户没有设置 主循环计数器完成以后 源地址是否调整 默认为设置为源地址不调整
    if(DMA_Config->Source_Adj_Addr ==NULL)
    {
        DMA_Config->Source_Adj_Addr  =0;   
    }
   
    //如果用户没有设置 目的地址增加 默认为执行一次DMA请求后目的地址加一
    if(DMA_Config->Dest_Addr_inc ==NULL)
    {
        DMA_Config->Dest_Addr_inc     =ADDR_INCREASE;    //针对目的地址的操作执行完毕后加1
    }
    //如果用户没有设置 源数据长度 默认为8位数据长度
    if(DMA_Config->Dest_Size ==NULL)
    {
        DMA_Config->Dest_Size         =DMA_DST_8BIT;     //目的数据宽度8bit 一个字节
    }
    //如果用户没有设置 主循环计数器完成以后 目的地址是否调整 默认为设置为目的地址不调整
    if(DMA_Config->Dest_Adj_Addr ==NULL)
    {
        DMA_Config->Dest_Adj_Addr     =0;   
    }
    //如果用户没有设置 中断模式 默认关闭中断
    if(DMA_Config->Dma_irqc ==NULL)
    {
       DMA_Config->Dma_irqc          =0;                //关闭中断
    }
    //如果用户没有设置 DMA自动关闭方式 默认开启主循环计数器减为0自动关闭DMA功能
    if(DMA_Config->Dma_AutoClose ==NULL)
    {
       DMA_Config->Dma_AutoClose     =0;                //开启主循环计数器减为0自动关闭DMA功能
    }
   
    if(DMA_Config->isr_func!=NULL)
    {
        DMA_ISR[DMA_Config->Channelx] = DMA_Config->isr_func;
        //在NVIC中使能DMA中断
        enable_irq(DMA_Config->Channelx);
    }
    //配置DMA寄存器
    return LPLD_eDMA_Config(DMA_Config);
}


uint8_t LPLD_eDMA_Config(LPLD_eDMA_Cfg_t *DMA_Config)
{
    //=====配置eDMA模块时钟===========
    SIM_SCGC6|=SIM_SCGC6_DMAMUX_MASK; //打开DMA通道多路复用器时钟
        
    SIM_SCGC7|=SIM_SCGC7_DMA_MASK;    //打开DMA模块时钟
    //================================
    if(DMA_Config->Channelx>15)
    {
        return 0;
    }
    else
    {
        //选择 通道x 配置外设的DMA source requestNumber
        DMAMUX_BASE_PTR->CHCFG[DMA_Config->Channelx]=DMAMUX_CHCFG_SOURCE(DMA_Config->Peri_DmaReq);
    }
    /*设置源地址信息*/
    //设置源地址   
    DMA_BASE_PTR->TCD[DMA_Config->Channelx].SADDR=DMA_Config->Source_Addr;
    //在执行完针对源地址的操作之后,是否在原地址的基础上累加
    DMA_BASE_PTR->TCD[DMA_Config->Channelx].SOFF =DMA_Config->Source_Addr_inc;
    //先清零数据长度寄存器
    DMA_BASE_PTR->TCD[DMA_Config->Channelx].ATTR=0;
    //设置源地址的传输宽度
    DMA_BASE_PTR->TCD[DMA_Config->Channelx].ATTR |=DMA_Config->Source_Size;
    //主的计数次数(major iteration count)达到后,是否重新更改源地址
    DMA_BASE_PTR->TCD[DMA_Config->Channelx].SLAST =DMA_Config->Source_Adj_Addr;
   
    /*设置目的地址信息*/
    //设置目的地址
    DMA_BASE_PTR->TCD[DMA_Config->Channelx].DADDR=DMA_Config->Dest_Addr;
    //在执行完针对目的地址的操作之后,是否在原地址的基础上累加
    DMA_BASE_PTR->TCD[DMA_Config->Channelx].DOFF =DMA_Config->Dest_Addr_inc;
    //设置源地址的传输宽度
    DMA_BASE_PTR->TCD[DMA_Config->Channelx].ATTR |=DMA_Config->Dest_Size;
    //主的计数次数(major iteration count)达到后,是否重新更改目的地址
    DMA_BASE_PTR->TCD[DMA_Config->Channelx].DLAST_SGA =DMA_Config->Dest_Adj_Addr;
   
    if(DMA_Config->Minor_loop_Length>32767) //主循环计数器的次数在0---32767之间
    {
        return 0;
    }
    else
    {
        //===============设置主计数器长度,循环次数====================================
        //设置数据长度,长度每次递减。也可以称为 当前主循环计数器 current major loop count
        DMA_BASE_PTR->TCD[DMA_Config->Channelx].CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(DMA_Config->Minor_loop_Length);
        //起始循环计数器,当主循环计数器为零的时候,将装载起始循环计数器的值
        DMA_BASE_PTR->TCD[DMA_Config->Channelx].BITER_ELINKNO=DMA_CITER_ELINKNO_CITER(DMA_Config->Minor_loop_Length);
        //设置每一次传输字节的个数,个数达到上限时,DMA便将数据存入memory
        DMA_BASE_PTR->TCD[DMA_Config->Channelx].NBYTES_MLNO=DMA_NBYTES_MLNO_NBYTES(DMA_Config->Trans_bytesNum);
    }
   
    //============设置DMA TCD控制寄存器==========================//  
    DMA_BASE_PTR->TCD[DMA_Config->Channelx].CSR =0;     //清空CSR的设置                  
    //===========设置DMA中断===================================//
    if(!DMA_Config->Dma_irqc)
    {
       DMA_INT &=~(1<<DMA_Config->Channelx); //关闭相应通道的中断请求  
    }
    else if(DMA_Config->Dma_irqc==1)
    {
       DMA_INT |=(1<<DMA_Config->Channelx); //开启相应通道的中断请求
       DMA_BASE_PTR->TCD[DMA_Config->Channelx].CSR  |=DMA_CSR_INTHALF_MASK;//使能DMA 主循环计数器减到一半 中断
    }
    else if(DMA_Config->Dma_irqc==2)
    {
       DMA_INT |=(1<<DMA_Config->Channelx); //开启相应通道的中断请求
       DMA_BASE_PTR->TCD[DMA_Config->Channelx].CSR  |=DMA_CSR_INTMAJOR_MASK;//使能DMA 主循环计数器减到零 中断
    }
   
    if(!DMA_Config->Dma_AutoClose)
    {
       DMA_BASE_PTR->TCD[DMA_Config->Channelx].CSR  |=DMA_CSR_DREQ_MASK; //主循环计数器等于零后,自动关闭DMA
    }
    else
    {
       DMA_BASE_PTR->TCD[DMA_Config->Channelx].CSR  &=(~DMA_CSR_DREQ_MASK); //主循环计数器等于零后,不关闭DMA
    }
    //注:使能此寄存器DMA开始工作
    //关闭通道x硬件DMA请求
    DMA_ERQ&=~(1<<DMA_Config->Channelx);
    //DMA通道使能
    DMAMUX_BASE_PTR->CHCFG[DMA_Config->Channelx]|=DMAMUX_CHCFG_ENBL_MASK;
   
    return 1;
}


/*
* LPLD_DMA_Start
* 此函数根据isEnable的值,开启或关闭通道x的DMA请求,
* 一旦开启通道x的DMA请求,DMA模块就开始工作
*
* 参数:
*    ChxNum--DMA通道值  一共16个DMA通道
*      |__0  DMA_Channel_0
*      |__1  DMA_Channel_1
*      .....
*      |__15 DMA_Channel_15
*
*    isEnable--
*      |__0  关闭通道x的外设DMA请求
*      |__1  开启通道x的外设DMA请求     
*/

void LPLD_DMA_Start(uint8_t ChxNum,uint8_t isEnable)
{
    if(isEnable)
    {
        //开启通道x的外设DMA请求
        DMA_ERQ|=(1<<ChxNum);
    }
    else
    {
        //关闭通道x的外设DMA请求
        DMA_ERQ&=~(1<<ChxNum);
    }
}

/*
* LPLD_DMA_Reload
* 当完成一次DMA主循环之后,调用此函数可以调整目的地址,并重新设置主循环计数器的次数
* 调整之后 新的目的地址=原来目的地址+下一次主循环的次数
*
* 参数:
*    ChxNum--DMA通道值  一共16个DMA通道
*      |__0  DMA_Channel_0
*      |__1  DMA_Channel_1
*      .....
*      |__15 DMA_Channel_15
*
*    Dest_Base_Addr--  目的存储区的首地址,可以是数组的首地址,也可以是数据寄存器的地址
*      
*    Dest_Addr_Offset--目的地址的偏移量,一般情况下目的地址的偏移量等于主循环计数器的次数
*   
*    Minor_Loop_Length--主循环计数器的次数
*     
*/


void LPLD_DMA_Reload(uint8_t ChxNum,uint32_t Dest_Base_Addr,uint32_t Dest_Addr_Offset,uint16_t Minor_Loop_Length)
{
    //重新设置目的地址
    DMA_BASE_PTR->TCD[ChxNum].DADDR =(uint32_t)(Dest_Base_Addr+Dest_Addr_Offset);
    //设置数据长度,长度每次递减。也可以称为 当前主循环计数器 current major loop count
    DMA_BASE_PTR->TCD[ChxNum].CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(Minor_Loop_Length);
    //起始循环计数器,当主循环计数器为零的时候,将装载起始循环计数器的值
    DMA_BASE_PTR->TCD[ChxNum].BITER_ELINKNO=DMA_CITER_ELINKNO_CITER(Minor_Loop_Length);
}


/*
* LPLD_DMA_Isr
* dma_ch15中断底层入口函数
*
* 用户无需修改,程序自动进入对应通道中断函数
*/
void LPLD_DMA_Isr(void)
{
  #define DMA_VECTORNUM   (*(volatile uint8_t*)(0xE000ED04))
  uint8_t dma_ch = DMA_VECTORNUM - 16;
  
  //调用用户自定义中断服务
  DMA_ISR[dma_ch]();
  //清除中断标志位
  DMA_INT |= 0x1u<<dma_ch;
}
回复 支持 反对

使用道具 举报

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
9#
 楼主| 发表于 2012-6-12 00:27:32 | 只看该作者
/*
* 测试硬件平台PLD_K60 Card
* 版权所有:北京拉普兰德电子技术有限公司
* 网络销售:http://laplenden.taobao.com
* 公司门户:http://www.lpld.cn
*
* 文件名: HAL_eDAM.c
* 用途: eDMA底层模块相关函数
* 最后修改日期: 20120321
*
* 开发者使用协议:
*  本代码面向所有使用者开放源代码,开发者可以随意修改源代码。但本段及以上注释应
*  予以保留,不得更改或删除原版权所有者姓名。二次开发者可以加注二次版权所有者,
*  但应在遵守此协议的基础上,开放源代码、不得出售代码本身。
*/

#ifndef __HAL_EDMA_H__
#define __HAL_EDMA_H__
//=====================================
//      DMA request sources Number
//      外设的DMA请求号
//=====================================
#define UART0_REV_DMAREQ  2
#define UART0_TRAN_DMAREQ 3
#define UART1_REV_DMAREQ  4
#define UART1_TRAN_DMAREQ 5
#define UART2_REV_DMAREQ  6
#define UART2_TRAN_DMAREQ 7
#define UART3_REV_DMAREQ  8
#define UART3_TRAN_DMAREQ 9
#define UART4_REV_DMAREQ  10
#define UART4_TRAN_DMAREQ 11
#define UART5_REV_DMAREQ  12
#define UART5_TRAN_DMAREQ 13
#define I2S0_REV_DMAREQ   14
#define I2S0_TRAN_DMAREQ  15
#define SPI0_REV_DMAREQ   16
#define SPI0_TRAN_DMAREQ  17
#define SPI1_REV_DMAREQ   18
#define SPI1_TRAN_DMAREQ  19
#define I2C0_DMAREQ       22
#define I2C1_DMAREQ       23
#define FTM0_CH0_DMAREQ   24
#define FTM0_CH1_DMAREQ   25
#define FTM0_CH2_DMAREQ   26
#define FTM0_CH3_DMAREQ   27
#define FTM0_CH4_DMAREQ   28
#define FTM0_CH5_DMAREQ   29
#define FTM0_CH6_DMAREQ   30
#define FTM0_CH7_DMAREQ   31
#define FTM1_CH0_DMAREQ   32
#define FTM1_CH1_DMAREQ   33
#define FTM2_CH0_DMAREQ   34
#define FTM2_CH1_DMAREQ   35
#define FTM3_CH0_DMAREQ   36
#define FTM3_CH1_DMAREQ   37
#define FTM3_CH2_DMAREQ   38
#define FTM1_CH3_DMAREQ   39  
#define ADC0_DMAREQ       40
#define ADC1_DMAREQ       41
#define CMP0_DMAREQ       42
#define CMP1_DMAREQ       43
#define CMP2_DMAREQ       44
#define DAC0_DMAREQ       45
#define DAC1_DMAREQ       46
#define CMT_DMAREQ        47
#define PDB_DMAREQ        48
#define PORTA_DMAREQ      49
#define PORTB_DMAREQ      50
#define PORTC_DMAREQ      51
#define PORTD_DMAREQ      52
#define PORTE_DMAREQ      53
#define FTM3_CH4_DMAREQ   54
#define FTM3_CH5_DMAREQ   55
#define FTM3_CH6_DMAREQ   56
#define FTM3_CH7_DMAREQ   57
  
//===========================================
//      DMA 传输的数据长度
//      源地址数据长度分为:  8bit、16bit、32bit
//      目的地址数据长度分为:8bit、16bit、32bit
//===========================================
#define DMA_SRC_8BIT   DMA_ATTR_SSIZE(0)
#define DMA_SRC_16BIT  DMA_ATTR_SSIZE(1)
#define DMA_SRC_32BIT  DMA_ATTR_SSIZE(2)

#define DMA_DST_8BIT   DMA_ATTR_DSIZE(0)
#define DMA_DST_16BIT  DMA_ATTR_DSIZE(1)
#define DMA_DST_32BIT  DMA_ATTR_DSIZE(2)
//==========================================
//      执行完一次DMA操作以后,地址是否偏移
//      =1 地址加一
//      =0 地址不累加
//==========================================
#define ADDR_INCREASE  1
#define ADDR_HOLD      0

//==========================================
//      定义DMA通道号
//==========================================
#define  DMA_CH0 0
#define  DMA_CH1 1
#define  DMA_CH2 2
#define  DMA_CH3 3
#define  DMA_CH4 4
#define  DMA_CH5 5
#define  DMA_CH6 6
#define  DMA_CH7 7
#define  DMA_CH8 8
#define  DMA_CH9 9
#define  DMA_CH10 10
#define  DMA_CH11 11
#define  DMA_CH12 12
#define  DMA_CH13 13
#define  DMA_CH14 14
#define  DMA_CH15 15


typedef void (*DMA_ISR_CALLBACK)(void);


typedef struct
{
    uint8_t  Channelx;           //通道编号
    uint8_t  Peri_DmaReq;        //外设的DMA请求号
    uint16_t Minor_loop_Length;  //设置数据长度
    uint32_t Trans_bytesNum;     //每一次DMA请求后,传输的字节个数
   
    uint32_t Source_Addr ;    //源地址
    uint8_t  Source_Size ;    //源数据的宽度 即每一次传输数据的宽度 8bit、16bit、32bit三种数据宽度
    uint8_t  Source_Addr_inc; //在执行完一个地址之后,地址是否累加 1:累加 0:不累加
    uint32_t Source_Adj_Addr; //当主的计数次数(major iteration count)达到后,是否重新更改源地址
   
    uint32_t Dest_Addr ;      //目的地址
    uint8_t  Dest_Size ;      //目的地址的宽度 即每一次传输数据的宽度 8bit、16bit、32bit三种数据宽度
    uint8_t  Dest_Addr_inc;   //在执行完一个地址之后,地址是否累加 1:累加 0:不累加
    uint32_t Dest_Adj_Addr;   //当主的计数次数(major iteration count)达到后,是否重新更改目的地址
   
    uint8_t  Dma_irqc;        //Dma中断选择  
                              //00 关闭中断  
                              //01 主循环计数器计数减到一半,产生中断
                              //02 主循环计数器计数减到零时,产生中断
      
    uint8_t  Dma_AutoClose;    //当主循环计数器减少到零的时候,是否关闭DMA
                               //00 开启自动关闭
                               //01 关闭自动关闭
    DMA_ISR_CALLBACK isr_func;  //定义回调函数
      
}LPLD_eDMA_Cfg_t;



uint8_t LPLD_DMA_Init(LPLD_eDMA_Cfg_t *DMA_Config);
void LPLD_DMA_Start(uint8_t ChxNum,uint8_t isEnable);
uint8_t LPLD_eDMA_Config(LPLD_eDMA_Cfg_t *DMA_Config);
void LPLD_DMA_Reload(uint8_t ChxNum,uint32_t Dest_Base_Addr,uint32_t Dest_Addr_Offset,uint16_t Minor_Loop_Length);
void LPLD_DMA_Isr(void);

#endif
回复 支持 反对

使用道具 举报

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
10#
 楼主| 发表于 2012-6-12 00:27:54 | 只看该作者
#ifndef __HAL_EDMA_H__
#define __HAL_EDMA_H__
//=====================================
//      DMA request sources Number
//      外设的DMA请求号
//=====================================
#define UART0_REV_DMAREQ  2
#define UART0_TRAN_DMAREQ 3
#define UART1_REV_DMAREQ  4
#define UART1_TRAN_DMAREQ 5
#define UART2_REV_DMAREQ  6
#define UART2_TRAN_DMAREQ 7
#define UART3_REV_DMAREQ  8
#define UART3_TRAN_DMAREQ 9
#define UART4_REV_DMAREQ  10
#define UART4_TRAN_DMAREQ 11
#define UART5_REV_DMAREQ  12
#define UART5_TRAN_DMAREQ 13
#define I2S0_REV_DMAREQ   14
#define I2S0_TRAN_DMAREQ  15
#define SPI0_REV_DMAREQ   16
#define SPI0_TRAN_DMAREQ  17
#define SPI1_REV_DMAREQ   18
#define SPI1_TRAN_DMAREQ  19
#define I2C0_DMAREQ       22
#define I2C1_DMAREQ       23
#define FTM0_CH0_DMAREQ   24
#define FTM0_CH1_DMAREQ   25
#define FTM0_CH2_DMAREQ   26
#define FTM0_CH3_DMAREQ   27
#define FTM0_CH4_DMAREQ   28
#define FTM0_CH5_DMAREQ   29
#define FTM0_CH6_DMAREQ   30
#define FTM0_CH7_DMAREQ   31
#define FTM1_CH0_DMAREQ   32
#define FTM1_CH1_DMAREQ   33
#define FTM2_CH0_DMAREQ   34
#define FTM2_CH1_DMAREQ   35
#define FTM3_CH0_DMAREQ   36
#define FTM3_CH1_DMAREQ   37
#define FTM3_CH2_DMAREQ   38
#define FTM1_CH3_DMAREQ   39  
#define ADC0_DMAREQ       40
#define ADC1_DMAREQ       41
#define CMP0_DMAREQ       42
#define CMP1_DMAREQ       43
#define CMP2_DMAREQ       44
#define DAC0_DMAREQ       45
#define DAC1_DMAREQ       46
#define CMT_DMAREQ        47
#define PDB_DMAREQ        48
#define PORTA_DMAREQ      49
#define PORTB_DMAREQ      50
#define PORTC_DMAREQ      51
#define PORTD_DMAREQ      52
#define PORTE_DMAREQ      53
#define FTM3_CH4_DMAREQ   54
#define FTM3_CH5_DMAREQ   55
#define FTM3_CH6_DMAREQ   56
#define FTM3_CH7_DMAREQ   57
  
//===========================================
//      DMA 传输的数据长度
//      源地址数据长度分为:  8bit、16bit、32bit
//      目的地址数据长度分为:8bit、16bit、32bit
//===========================================
#define DMA_SRC_8BIT   DMA_ATTR_SSIZE(0)
#define DMA_SRC_16BIT  DMA_ATTR_SSIZE(1)
#define DMA_SRC_32BIT  DMA_ATTR_SSIZE(2)

#define DMA_DST_8BIT   DMA_ATTR_DSIZE(0)
#define DMA_DST_16BIT  DMA_ATTR_DSIZE(1)
#define DMA_DST_32BIT  DMA_ATTR_DSIZE(2)
//==========================================
//      执行完一次DMA操作以后,地址是否偏移
//      =1 地址加一
//      =0 地址不累加
//==========================================
#define ADDR_INCREASE  1
#define ADDR_HOLD      0

//==========================================
//      定义DMA通道号
//==========================================
#define  DMA_CH0 0
#define  DMA_CH1 1
#define  DMA_CH2 2
#define  DMA_CH3 3
#define  DMA_CH4 4
#define  DMA_CH5 5
#define  DMA_CH6 6
#define  DMA_CH7 7
#define  DMA_CH8 8
#define  DMA_CH9 9
#define  DMA_CH10 10
#define  DMA_CH11 11
#define  DMA_CH12 12
#define  DMA_CH13 13
#define  DMA_CH14 14
#define  DMA_CH15 15


typedef void (*DMA_ISR_CALLBACK)(void);


typedef struct
{
    uint8_t  Channelx;           //通道编号
    uint8_t  Peri_DmaReq;        //外设的DMA请求号
    uint16_t Minor_loop_Length;  //设置数据长度
    uint32_t Trans_bytesNum;     //每一次DMA请求后,传输的字节个数
   
    uint32_t Source_Addr ;    //源地址
    uint8_t  Source_Size ;    //源数据的宽度 即每一次传输数据的宽度 8bit、16bit、32bit三种数据宽度
    uint8_t  Source_Addr_inc; //在执行完一个地址之后,地址是否累加 1:累加 0:不累加
    uint32_t Source_Adj_Addr; //当主的计数次数(major iteration count)达到后,是否重新更改源地址
   
    uint32_t Dest_Addr ;      //目的地址
    uint8_t  Dest_Size ;      //目的地址的宽度 即每一次传输数据的宽度 8bit、16bit、32bit三种数据宽度
    uint8_t  Dest_Addr_inc;   //在执行完一个地址之后,地址是否累加 1:累加 0:不累加
    uint32_t Dest_Adj_Addr;   //当主的计数次数(major iteration count)达到后,是否重新更改目的地址
   
    uint8_t  Dma_irqc;        //Dma中断选择  
                              //00 关闭中断  
                              //01 主循环计数器计数减到一半,产生中断
                              //02 主循环计数器计数减到零时,产生中断
      
    uint8_t  Dma_AutoClose;    //当主循环计数器减少到零的时候,是否关闭DMA
                               //00 开启自动关闭
                               //01 关闭自动关闭
    DMA_ISR_CALLBACK isr_func;  //定义回调函数
      
}LPLD_eDMA_Cfg_t;



uint8_t LPLD_DMA_Init(LPLD_eDMA_Cfg_t *DMA_Config);
void LPLD_DMA_Start(uint8_t ChxNum,uint8_t isEnable);
uint8_t LPLD_eDMA_Config(LPLD_eDMA_Cfg_t *DMA_Config);
void LPLD_DMA_Reload(uint8_t ChxNum,uint32_t Dest_Base_Addr,uint32_t Dest_Addr_Offset,uint16_t Minor_Loop_Length);
void LPLD_DMA_Isr(void);

#endif
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2025-1-10 02:03 , Processed in 0.058761 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表