智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 986|回复: 3
打印 上一主题 下一主题

K60-OV762无法进入DMA中断

[复制链接]

7

主题

47

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1714
威望
876
贡献
516
兑换币
549
注册时间
2014-11-14
在线时间
161 小时
跳转到指定楼层
1#
发表于 2015-4-10 23:26:43 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

本帖子中包含更多资源

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

x
回复

使用道具 举报

0

主题

4

帖子

0

精华

高级会员

Rank: 4

积分
607
威望
294
贡献
185
兑换币
192
注册时间
2015-1-26
在线时间
64 小时
毕业学校
qfnu
4#
发表于 2015-4-11 15:30:09 | 只看该作者
能共享下你的工程吗?谢谢
singsongs@foxmail.com
回复 支持 反对

使用道具 举报

7

主题

47

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1714
威望
876
贡献
516
兑换币
549
注册时间
2014-11-14
在线时间
161 小时
3#
 楼主| 发表于 2015-4-10 23:28:01 | 只看该作者
void DMA_CH4_Handler(void)
{
    PORTA_ISFR = ~0; //写1清中断标志位(必须的,不然回导致一开中断就马上触发中断)
    enable_irq(87);     //采集了一行,便又使能PORTB行中断  
    DMA_IRQ_CLEAN(DMA_CH4);                                 //清除通道传输中断标志位    (这样才能再次进入中断)
    DMA_IRQ_DIS(DMA_CH4);                                       //采集完H个数据后进入这个DMA中断,停止DMA传输。行中断中打开DMA传输
    /********************/
    //串口调试用到
    if(V_Cnt ==240)  //行计数达到240
    {
     Is_SendPhoto = 1;
    }
    /*******************/
}

/************************************************************************/
//晓克添加
//行中断处理函数
void PORTA_IRQHandler()
{
    if((PORTA_ISFR & (1<<29)))                              //PTB9触发中断,行中断
    {
      DMA_IRQ_DIS(DMA_CH4);                                       //采集完H个数据后进入这个DMA中断,停止DMA传输。行中断中打开DMA传输
      PORTA_ISFR |= (1<<29);                                //写1清中断标志位
      /**************用户任务**************************************************/
      if((++V_Cnt)%4 == 0)                                  //判断该行数据是否需要,根据自己需要的行数自己设定判别条件
      {
        disable_irq(87);
        DMA_IRQ_EN(DMA_CH4);                                //使能DMA4通道的传输完成中断
        DMA_EN(DMA_CH4);                                    //使能通道CHn 硬件请求
      }
                           //可以在这里判断需要的数据是否已经采集完,可以设置一个标志位
      /****************
      *这里也可以进行数据处理
      *****************/
      /************************************************************************/
    }
}

//场中断处理函数
void PORTB_IRQHandler()
{
   
    if(PORTB_ISFR & (1<<0))                                 //PTA29触发中断,场中断
    {
      PORTB_ISFR |= (1<<0);                                 //写1清中断标志位   
      Is_SendPhoto = 0;                                   //发送图像标志,串口调试要用
      /**************用户任务**************************************************/
      //奇偶场判别
      /*
      FieldCounter++;                        
      if(FieldCounter>= 2)
      {
        FieldCounter = 0;
      }
      */
      //奇场      采集图像
      
     
      
     // if(FieldCounter == 0)
     // {
        DMA_PORTx2BUFF_Init (DMA_CH4, (void *)&PTD_BYTE0_IN, Pix_Data, PTC0, DMA_BYTE1, H, DMA_rising_keepon);
        //DMA通道4初始化,PTB8上升沿触发DMA传输,源地址为PTD_BYTE0_IN,目的地址为:Pix_Data ,每次传输1Byte,传输H次后停止传输,目的地址保持不变,关闭通道CHn 硬件请求
        DMA_IRQ_CLEAN(DMA_CH4);                                 //清除通道传输中断标志位    (这样才能再次进入中断)
        DMA_IRQ_EN(DMA_CH4);                                    //使能通道CHn 硬件请求
        //disable_irq(88);
        enable_irq(87);                                     //使能PORTB中断,即开启行中断,PORTB的ISR中断号为88
        V_Cnt=0;                                            //行采集计数清零
        Is_SendPhoto =0;                                   //发送图像标志
回复 支持 反对

使用道具 举报

7

主题

47

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1714
威望
876
贡献
516
兑换币
549
注册时间
2014-11-14
在线时间
161 小时
2#
 楼主| 发表于 2015-4-10 23:27:22 | 只看该作者
#include "common.h"
#include "include.h"
#include "isr.h"

void  main(void)
{
    int i=0,j=0;
    DisableInterrupts;
    //变量初始化
   
    V_Cnt=0;                                    //行计数
    Is_SendPhoto=0;                             //从串口发送图像
  
    gpio_init(PORTA,14,GPO,0);
    gpio_init(PORTA,15,GPO,0);
    gpio_init(PORTA,16,GPO,1);
    gpio_init(PORTA,17,GPO,1);
    /*********************************************************************************/
    exti_init(PORTA,29,rising_down);            //行中断,PORTA29 端口外部中断初始化 ,上升沿触发中断,内部下拉
    disable_irq(87);                            //行中断关闭
    exti_init(PORTB,0,falling_down);            //场中断,PORTB0 端口外部中断初始化 ,下降沿触发中断,内部下拉
    uart_init(UART5,115200);
    /*********************************************************************************/
   DELAY_MS(1000);//延时1秒钟
    EnableInterrupts;
    for(;;)
    {
      GPIO_TURN(PORTA,17);
  #ifdef TIAOSHI  //串口调试
     
      if(1==Is_SendPhoto)
      {
      /*************************************************************************/
      //直接发送灰度数据,上位机软件会把图像信息显示出来
       disable_irq(88);                  //关闭PORTB中断,即关闭场中断,防止串口发送图像数据进程被打乱
        disable_irq(87);
   
      //以下四句话是固定格式,是串口和上位机软件之间的协议
     uart_putchar(UART5,0XFF);
      for(i=0;i<V;i++)
      {
        for(j=0;j<H;j++)
        {
          if(Pix_Data[i][j]<255)
          {
            uart_putchar(UART5,Pix_Data[i][j]);
          }
          else
          {
            uart_putchar(UART5,254);
          }
        }
      }
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 15:04 , Processed in 0.079860 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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