智能车制作

 找回密码
 注册

扫一扫,访问微社区

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

k60—ov7620采样问题求解??

[复制链接]

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
跳转到指定楼层
#
发表于 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 小时
14#
 楼主| 发表于 2012-6-18 23:34:11 | 只看该作者
笨鹅 发表于 2012-6-17 09:05
你设置的c口为dma触发源,具体是第几个口呀pc几,代码里怎么看不出来,比如dma0用pb11怎么设置?

我用的是C0作为触发的口,B0为行中断,B3为场中断,可是不知道怎么写,求前辈给指点啊!!特别是DMA!!先行谢过!!!
回复 支持 反对

使用道具 举报

21

主题

60

帖子

0

精华

高级会员

Rank: 4

积分
714
威望
482
贡献
128
兑换币
2
注册时间
2012-2-9
在线时间
52 小时
毕业学校
河北工业大学
13#
发表于 2012-6-17 09:05:23 | 只看该作者
马精明123 发表于 2012-6-12 00:25
//DMA初始化结构体赋值
  User_Def_DMA_Init.Channelx          =DMA_CH1;               //设置为通道1
...

你设置的c口为dma触发源,具体是第几个口呀pc几,代码里怎么看不出来,比如dma0用pb11怎么设置?
回复 支持 反对

使用道具 举报

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
12#
 楼主| 发表于 2012-6-12 00:29:24 | 只看该作者
帮我看看,我不知道错在哪里,就是踩不到!!谢谢了
回复 支持 反对

使用道具 举报

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
11#
 楼主| 发表于 2012-6-12 00:28:26 | 只看该作者
#ifndef __ISR_H
#define __ISR_H 1

#include  "include.h"

/*                          重新定义中断向量表
*  先取消默认的中断向量元素宏定义       #undef  VECTOR_xxx
*  在重新定义到自己编写的中断函数       #define VECTOR_xxx    xxx_IRQHandler
*  例如:
*       #undef  VECTOR_003
*       #define VECTOR_003    HardFault_Handler    重新定义硬件上访中断服务函数
*/
#undef  VECTOR_014
#undef  VECTOR_015
#if     USOC_EN > 0u    //如果定义了用ucos系统  用ucos的滴答定时器中断服务函数
  #define VECTOR_014    OS_CPU_PendSVHandler
  #define VECTOR_015    OS_CPU_SysTickHandler
#else
  #define VECTOR_014    PendSV_Handler
  #define VECTOR_015    SysTick_Handler   //滴答定时器  OS用得到
#endif

#undef  VECTOR_003
#define VECTOR_003    HardFault_Handler   //发生硬件上访 (就是程序跑飞了)     推荐调试程序时,用个LED显示来指示程序跑飞了

#undef  VECTOR_063                        //要先取消了,因为在vectors.h里默认是定义为 default_isr
#define VECTOR_063    USART1_IRQHandler   //重新定义63号中断的ISR:UART1:Single interrupt vector for UART status sources

#undef VECTOR_084
#define VECTOR_084 PIT0_IRQHandler //重新定义84号中断为PIT0_IRQHandler中断

#undef  VECTOR_103
#define VECTOR_103    PORTA_IRQHandler    //PORTA中断

#undef  VECTOR_104
#define VECTOR_104    PORTB_IRQHandler    //PORTB中断

#undef  VECTOR_017
#define VECTOR_017    LPLD_DMA_Isr        //DMA中断函数

//#undef  VECTOR_105
//#define VECTOR_105    PORTC_IRQHandler    //PORC中断

extern void PendSV_Handler(void);         //可悬起的系统调用中断服务函数
extern void HardFault_Handler(void);      //发生硬件上访(程序跑飞)
extern void SysTick_Handler(void);        //滴答时钟(os 用到)
extern void USART1_IRQHandler();          //串口1 中断接收函数
extern void PIT0_IRQHandler();            //PIT0 定时中断服务函数
extern void PORTA_IRQHandler();           //PORTA中断服务函数
extern void PORTB_IRQHandler();           //PORTB中断服务函数
//extern void PORTC_IRQHandler();           //PORTC中断服务函数
extern void LPLD_DMA_Isr(void);           //DMA中断函数
//DMA模块中断服务定义
#undef  VECTOR_016
#define VECTOR_016 LPLD_DMA_Isr
#undef  VECTOR_017
#define VECTOR_017 LPLD_DMA_Isr
#undef  VECTOR_018
#define VECTOR_018 LPLD_DMA_Isr
#undef  VECTOR_019
#define VECTOR_019 LPLD_DMA_Isr
#undef  VECTOR_020
#define VECTOR_020 LPLD_DMA_Isr
#undef  VECTOR_021
#define VECTOR_021 LPLD_DMA_Isr
#undef  VECTOR_022
#define VECTOR_022 LPLD_DMA_Isr
#undef  VECTOR_023
#define VECTOR_023 LPLD_DMA_Isr
#undef  VECTOR_024
#define VECTOR_024 LPLD_DMA_Isr
#undef  VECTOR_025
#define VECTOR_025 LPLD_DMA_Isr
#undef  VECTOR_026
#define VECTOR_026 LPLD_DMA_Isr
#undef  VECTOR_027
#define VECTOR_027 LPLD_DMA_Isr
#undef  VECTOR_028
#define VECTOR_028 LPLD_DMA_Isr
#undef  VECTOR_029
#define VECTOR_029 LPLD_DMA_Isr
#undef  VECTOR_030
#define VECTOR_030 LPLD_DMA_Isr
#undef  VECTOR_031
#define VECTOR_031 LPLD_DMA_Isr
#undef  VECTOR_032
#define VECTOR_032 LPLD_DMA_Isr
//以下函数在LPLD_Kinetis底层包,不必修改
extern void LPLD_DMA_Isr(void);

#endif  //__ISR_H
回复 支持 反对

使用道具 举报

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
10#
 楼主| 发表于 2012-6-12 00:28:11 | 只看该作者
/******************** (C) COPYRIGHT 2011 野火嵌入式开发工作室 ********************
* 文件名       :isr.h
* 描述         :重新宏定义中断号,重映射中断向量表里的中断函数地址,
*                使其指向我们所定义的中断服务函数。声明中断服务函数
*                警告:只能在"vectors.c"包含,而且必须在"vectors.h"包含的后面!!!
*
* 实验平台     :野火kinetis开发板
* 库版本       :
* 嵌入系统     :
*
* 作者         :野火嵌入式开发工作室
* 淘宝店       :http://firestm32.taobao.com
* 技术支持论坛 :http://www.ourdev.cn/bbs/bbs_list.jsp?bbs_id=1008
**********************************************************************************/       



#ifndef __ISR_H
#define __ISR_H 1

#include  "include.h"

/*                          重新定义中断向量表
*  先取消默认的中断向量元素宏定义       #undef  VECTOR_xxx
*  在重新定义到自己编写的中断函数       #define VECTOR_xxx    xxx_IRQHandler
*  例如:
*       #undef  VECTOR_003
*       #define VECTOR_003    HardFault_Handler    重新定义硬件上访中断服务函数
*/
#undef  VECTOR_014
#undef  VECTOR_015
#if     USOC_EN > 0u    //如果定义了用ucos系统  用ucos的滴答定时器中断服务函数
  #define VECTOR_014    OS_CPU_PendSVHandler
  #define VECTOR_015    OS_CPU_SysTickHandler
#else
  #define VECTOR_014    PendSV_Handler
  #define VECTOR_015    SysTick_Handler   //滴答定时器  OS用得到
#endif

#undef  VECTOR_003
#define VECTOR_003    HardFault_Handler   //发生硬件上访 (就是程序跑飞了)     推荐调试程序时,用个LED显示来指示程序跑飞了

#undef  VECTOR_063                        //要先取消了,因为在vectors.h里默认是定义为 default_isr
#define VECTOR_063    USART1_IRQHandler   //重新定义63号中断的ISR:UART1:Single interrupt vector for UART status sources

#undef VECTOR_084
#define VECTOR_084 PIT0_IRQHandler //重新定义84号中断为PIT0_IRQHandler中断

#undef  VECTOR_103
#define VECTOR_103    PORTA_IRQHandler    //PORTA中断

#undef  VECTOR_104
#define VECTOR_104    PORTB_IRQHandler    //PORTB中断

#undef  VECTOR_017
#define VECTOR_017    LPLD_DMA_Isr        //DMA中断函数

//#undef  VECTOR_105
//#define VECTOR_105    PORTC_IRQHandler    //PORC中断

extern void PendSV_Handler(void);         //可悬起的系统调用中断服务函数
extern void HardFault_Handler(void);      //发生硬件上访(程序跑飞)
extern void SysTick_Handler(void);        //滴答时钟(os 用到)
extern void USART1_IRQHandler();          //串口1 中断接收函数
extern void PIT0_IRQHandler();            //PIT0 定时中断服务函数
extern void PORTA_IRQHandler();           //PORTA中断服务函数
extern void PORTB_IRQHandler();           //PORTB中断服务函数
//extern void PORTC_IRQHandler();           //PORTC中断服务函数
extern void LPLD_DMA_Isr(void);           //DMA中断函数
//DMA模块中断服务定义
#undef  VECTOR_016
#define VECTOR_016 LPLD_DMA_Isr
#undef  VECTOR_017
#define VECTOR_017 LPLD_DMA_Isr
#undef  VECTOR_018
#define VECTOR_018 LPLD_DMA_Isr
#undef  VECTOR_019
#define VECTOR_019 LPLD_DMA_Isr
#undef  VECTOR_020
#define VECTOR_020 LPLD_DMA_Isr
#undef  VECTOR_021
#define VECTOR_021 LPLD_DMA_Isr
#undef  VECTOR_022
#define VECTOR_022 LPLD_DMA_Isr
#undef  VECTOR_023
#define VECTOR_023 LPLD_DMA_Isr
#undef  VECTOR_024
#define VECTOR_024 LPLD_DMA_Isr
#undef  VECTOR_025
#define VECTOR_025 LPLD_DMA_Isr
#undef  VECTOR_026
#define VECTOR_026 LPLD_DMA_Isr
#undef  VECTOR_027
#define VECTOR_027 LPLD_DMA_Isr
#undef  VECTOR_028
#define VECTOR_028 LPLD_DMA_Isr
#undef  VECTOR_029
#define VECTOR_029 LPLD_DMA_Isr
#undef  VECTOR_030
#define VECTOR_030 LPLD_DMA_Isr
#undef  VECTOR_031
#define VECTOR_031 LPLD_DMA_Isr
#undef  VECTOR_032
#define VECTOR_032 LPLD_DMA_Isr
//以下函数在LPLD_Kinetis底层包,不必修改
extern void LPLD_DMA_Isr(void);

#endif  //__ISR_H

/* End of "isr.h" */
回复 支持 反对

使用道具 举报

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
9#
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

3

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
500
QQ
威望
391
贡献
79
兑换币
11
注册时间
2011-3-17
在线时间
15 小时
8#
 楼主| 发表于 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 小时
7#
 楼主| 发表于 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 小时
6#
 楼主| 发表于 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 小时
5#
 楼主| 发表于 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;                     //场采集完成清零
         /******************/
    }
/******************************/
}
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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