智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5037|回复: 13
打印 上一主题 下一主题

拉普兰德例程问题

[复制链接]

6

主题

126

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4049
威望
1562
贡献
1013
兑换币
989
注册时间
2012-9-23
在线时间
737 小时
跳转到指定楼层
1#
发表于 2013-10-28 18:33:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
红色部分,求教···
/*
* --------------"拉普兰德K60底层库"示例工程-----------------
*
* 测试硬件平台:  LPLD_K60 Card
* 版权所有:      北京拉普兰德电子技术有限公司
* 网络销售:      http://laplenden.taobao.com
* 公司门户:      http://www.lpld.cn
*
* 说明:    本工程基于"拉普兰德K60底层库"开发,
*          所有开源驱动代码均在"LPLD"文件夹下,调用说明见文档[#LPLD-003-N]
*
* 文件名:                LPLD_GPIO_DMA.c
* 用途:                增强型DMA与GPIO模块综合例程,用于数字摄像头采集
*                      OV系列数字摄像头均可使用
*
* LPLD_K60 Card 硬件配置说明:
*                      摄像头位数据位 - PortD0~7
*                      PCLK - PortC0
*                      行中断 - PortB0
*                      场中断 - PortB3
*                      图像数据输出 - K60串口5,波特率115200,每幅图帧头发0x01
*
*/

#include "common.h"
#include "HAL_eDMA.h"
#include "HAL_GPIO.h"
#include "uart.h"

#define H 200
#define V 150
#define PHOTO_SIZE H*V

void portb_isr(void);
void GPIO_Init(void);
void dma1_isr(void);

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

LPLD_eDMA_Cfg_t User_Def_DMA_Init;  //声明DMA初始化结构体
uint8_t Pix_Data[PHOTO_SIZE];       //采集150行 200列的图像数据
uint8_t V_Cnt;                      //行采集计数
uint8_t Field_Over;                 //场采集完成标志
uint8_t Is_SendPhoto;               //图像发送标志


void main (void)
{
  int i;
  DisableInterrupts;

  //变量初始化
  for(i=0;i<PHOTO_SIZE;i++)
  {
    Pix_Data=0;  
  }
  V_Cnt=0;          //行计数
  Field_Over=1;     //场开始标志位
  Is_SendPhoto=1;   //从串口发送图像

  //IO口初始化
  GPIO_Init();

  //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;                     //采集结束触发中断
  User_Def_DMA_Init.isr_func          =dma1_isr;              //自定义通道1中断服务子程序
  //初始化DMA模块
  LPLD_DMA_Init(&User_Def_DMA_Init);

  EnableInterrupts;

  enable_irq (88); //PORTB 中断 PB3产生场中断和PB0产生行中断

  while(1)            
  {
    if(Is_SendPhoto)
    {  
      //先发送一场图像的帧头0x01
      uart_putchar(UART5_BASE_PTR,0x01); 这个什么意思?为什么要先发送0x01
      for(i=0;i<PHOTO_SIZE;i++)
      {
        if(Pix_Data==0x01)Pix_Data++;
        uart_putchar(UART5_BASE_PTR,Pix_Data);
      }
    }
  }

}

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

void GPIO_Init(void)
{
  //选择IO D0~D7作为数据口
  //输入、内部下拉、禁用中断
  LPLD_GPIO_Init(PTD, 0, DIR_INPUT, INPUT_PDOWN, IRQC_DIS);
  LPLD_GPIO_Init(PTD, 1, DIR_INPUT, INPUT_PDOWN, IRQC_DIS);
  LPLD_GPIO_Init(PTD, 2, DIR_INPUT, INPUT_PDOWN, IRQC_DIS);
  LPLD_GPIO_Init(PTD, 3, DIR_INPUT, INPUT_PDOWN, IRQC_DIS);
  LPLD_GPIO_Init(PTD, 4, DIR_INPUT, INPUT_PDOWN, IRQC_DIS);
  LPLD_GPIO_Init(PTD, 5, DIR_INPUT, INPUT_PDOWN, IRQC_DIS);
  LPLD_GPIO_Init(PTD, 6, DIR_INPUT, INPUT_PDOWN, IRQC_DIS);
  LPLD_GPIO_Init(PTD, 7, DIR_INPUT, INPUT_PDOWN, IRQC_DIS);

  // 选择PTC0作为触发端
  // 配置成输入下拉电阻的模式
  // 上升沿触发DMA
  LPLD_GPIO_Init(PTC, 0, DIR_INPUT, INPUT_PDOWN, IRQC_DMARI);

  // 选择PTB0作为行中断
  // 配置成输入下拉电阻的模式
  // IO上升沿中断
  LPLD_GPIO_Init(PTB, 0, DIR_INPUT, INPUT_PDOWN, IRQC_RI);  

  // 选择PTB1作为场中断
  // 配置成输入下拉电阻的模式
  // IO上升沿中断
  LPLD_GPIO_Init(PTB, 3, DIR_INPUT, INPUT_PDOWN, IRQC_RI);     

  //设置PortB口的自定义中断服务子程序  
  LPLD_GPIO_SetIsr(PTB, portb_isr);
}                                          

/********************************************************************
函数名称:portb_isr
函数描述:IOB双边沿触发产生的中断请求

产中断产生采集信号开始信号
      ___
  ___|   |_________________________________________________________
          用于采集摄像头的行中断,HREF 信号如下
            ________________________
   ________|                        |_______________________________
           |->有效数据,启动DMA,    |->一行数据采集完毕,
函数输入量:无
函数输入量:无
********************************************************************/
void portb_isr(void)
{

  if((PORTB_ISFR & 0x00000001) && !Field_Over)//引脚中断状态寄存器(PORTB_ISFR)
  {                   ? 0x00000001代表什么?
    LPLD_DMA_EnableReq(1,1);         //使能通道1 DMA 请求
    V_Cnt++;
  }
  else if(PORTB_ISFR & 0x00000008)
  {                             0x00000008代表什么?  
    LPLD_DMA_Init(&User_Def_DMA_Init); //初始化DMA模块
    V_Cnt=0;                          //行采集计数清零
    Field_Over=0;                     //场采集完成清零
  }

}

void dma1_isr(void)
{

  if(V_Cnt==V)
  {
    Field_Over=1; //场采集完成置位
  }

}


59

主题

1029

帖子

0

精华

版主

有什么需帮助的?

Rank: 9Rank: 9Rank: 9

积分
15127

热心会员奖章论坛元老奖章优秀会员奖章在线王奖章

威望
11058
贡献
1409
兑换币
1728
注册时间
2011-12-18
在线时间
1330 小时
2#
发表于 2013-10-28 19:38:38 | 只看该作者
这个是旧版本的库,建议你用最新的V3库及例程包。
http://www.znczz.com/thread-207411-1-1.html

还是给你解释下吧:
uart_putchar(UART5_BASE_PTR,0x01); 这个什么意思?为什么要先发送0x01
不知道你为什么不先看看前面那行的注释,这个是根据你的上位机软件定的,01代表告诉上位机软件开发发送一幅新图像。


PORTB_ISFR & 0x00000001
0x00000001代表PTB0的标志位掩码,同理0x8代表PTB3的标志位掩码,原理是1<<n,n代表端口号。

回复 支持 反对

使用道具 举报

25

主题

1474

帖子

0

精华

常驻嘉宾

freefly

Rank: 8Rank: 8

积分
5459

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

QQ
威望
2762
贡献
1277
兑换币
1323
注册时间
2013-4-28
在线时间
710 小时
3#
发表于 2013-10-28 20:05:10 | 只看该作者
洋葱圈 发表于 2013-10-28 19:38
这个是旧版本的库,建议你用最新的V3库及例程包。
http://www.znczz.com/thread-207411-1-1.html

dma_init_struct.DMA_SourceAddr = (uint32)&PTD->PDIR+1;        //源地址:PTD8~15
红色的部分有点没有看懂,好像是取((PTD->PDIR)+1)的地址,但是怎么和注释里的PTD8~15连接起来呢,从哪里对应8~15引脚实在没有搞明白,
回复 支持 反对

使用道具 举报

6

主题

126

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4049
威望
1562
贡献
1013
兑换币
989
注册时间
2012-9-23
在线时间
737 小时
4#
 楼主| 发表于 2013-10-28 20:08:49 | 只看该作者
洋葱圈 发表于 2013-10-28 19:38
这个是旧版本的库,建议你用最新的V3库及例程包。
http://www.znczz.com/thread-207411-1-1.html

懂了~~谢谢还有顺便问下,为什么我的电脑装了iar6.4之后再连接下载器之后就识别不出来了····逼得我使用2.2的库
回复 支持 反对

使用道具 举报

59

主题

1029

帖子

0

精华

版主

有什么需帮助的?

Rank: 9Rank: 9Rank: 9

积分
15127

热心会员奖章论坛元老奖章优秀会员奖章在线王奖章

威望
11058
贡献
1409
兑换币
1728
注册时间
2011-12-18
在线时间
1330 小时
5#
发表于 2013-10-28 20:14:01 | 只看该作者
loveme06 发表于 2013-10-28 20:05
dma_init_struct.DMA_SourceAddr = (uint32)&PTD->PDIR+1;        //源地址:PTD8~15
红色的部分有点没有 ...

PTD->PDIR是GPIOD的输入数据寄存器,K60的寄存器地址是8位对齐的,加&代表取地址,+1代表地址向高8位偏移,所以0+8=8,该地址代表D口的8~15位的8位端口地址。以此类推,+2代表0+2*8=16,代表D口的16~23位端口地址。
回复 支持 反对

使用道具 举报

59

主题

1029

帖子

0

精华

版主

有什么需帮助的?

Rank: 9Rank: 9Rank: 9

积分
15127

热心会员奖章论坛元老奖章优秀会员奖章在线王奖章

威望
11058
贡献
1409
兑换币
1728
注册时间
2011-12-18
在线时间
1330 小时
6#
发表于 2013-10-28 20:14:48 | 只看该作者
逍逍遥游 发表于 2013-10-28 20:08
懂了~~谢谢还有顺便问下,为什么我的电脑装了iar6.4之后再连接下载器之后就识别不出来了····逼得我使 ...

重新装一遍驱动吧。

回复 支持 反对

使用道具 举报

25

主题

1474

帖子

0

精华

常驻嘉宾

freefly

Rank: 8Rank: 8

积分
5459

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

QQ
威望
2762
贡献
1277
兑换币
1323
注册时间
2013-4-28
在线时间
710 小时
7#
发表于 2013-10-28 20:16:51 | 只看该作者
洋葱圈 发表于 2013-10-28 20:14
PTD->PDIR是GPIOD的输入数据寄存器,K60的寄存器地址是8位对齐的,加&代表取地址,+1代表地址向高8位偏移 ...

谢谢
回复 支持 反对

使用道具 举报

6

主题

126

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4049
威望
1562
贡献
1013
兑换币
989
注册时间
2012-9-23
在线时间
737 小时
8#
 楼主| 发表于 2013-10-29 18:46:37 | 只看该作者
洋葱圈 发表于 2013-10-28 20:14
重新装一遍驱动吧。


求教···怎么弄啊

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

59

主题

1029

帖子

0

精华

版主

有什么需帮助的?

Rank: 9Rank: 9Rank: 9

积分
15127

热心会员奖章论坛元老奖章优秀会员奖章在线王奖章

威望
11058
贡献
1409
兑换币
1728
注册时间
2011-12-18
在线时间
1330 小时
9#
发表于 2013-10-29 18:49:28 | 只看该作者
逍逍遥游 发表于 2013-10-29 18:46
求教···怎么弄啊

联系你的购买厂家
回复 支持 反对

使用道具 举报

6

主题

126

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4049
威望
1562
贡献
1013
兑换币
989
注册时间
2012-9-23
在线时间
737 小时
10#
 楼主| 发表于 2013-10-29 20:57:15 | 只看该作者
洋葱圈 发表于 2013-10-29 18:49
联系你的购买厂家

······他们说都问了板子的设计者了,问题无法解决,说我这是第一次遇到这种情况

悲剧····只能用2.2的库了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-17 14:17 , Processed in 0.055695 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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