智能车制作

标题: K60-OV762无法进入DMA中断 [打印本页]

作者: °Destiny    时间: 2015-4-10 23:26
标题: K60-OV762无法进入DMA中断
[attach]76038[/attach][attach]76039[/attach]

作者: °Destiny    时间: 2015-4-10 23:27
#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);
          }
        }
      }
作者: °Destiny    时间: 2015-4-10 23:28
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;                                   //发送图像标志
作者: singsongs    时间: 2015-4-11 15:30
能共享下你的工程吗?谢谢
singsongs@foxmail.com




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2