是通过TIM3CH1进行输入捕获来触发DMA的,在第一次DMA触发后将像素触发信号去掉后依旧在不断进入DMA完成中断。
求各位大神看看给个帮助
DMA程序
#include "sys.h"
#include "usart.h"
#include "dma.h"
#include "led.h"
u8 hdsj; //采集的行数目
u16 ov7620_Buf[28][120]; //第一数组
//u16 ov7620_fdg[28][120]; //第一数组
//DMA1的各通道配置
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHX MA通道CHX
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输器
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx)
{ u32 DR_Base;
RCC->AHBENR|=1<<0; //开启DMA1时钟
__nop(); //等待 DMA1 时钟稳定
__nop(); //经测试最少 2 个 nop
__nop();
DMA_CHx->CPAR=OV7620_DATA; //DMA1 外设地址
DMA_CHx->CMAR=(u32)ov7620_Buf[0]; //DMA1, 存储器地址
DMA_CHx->CNDTR=120; //DMA1,传输数据量
DMA_CHx->CCR=0X00000000; //复位
DMA_CHx->CCR|=0<<4; //从外设器件读数据
DMA_CHx->CCR|=0<<5; //普通模式
DMA_CHx->CCR|=0<<6; //外设地址非增量模式
DMA_CHx->CCR|=1<<7; //存储器增量模式
DMA_CHx->CCR|=1<<8; //外设数据宽度为16位
DMA_CHx->CCR|=1<<10; //存储器数据宽度16位
DMA_CHx->CCR|=1<<12; //中等优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式
DMA_CHx->CCR|=1<<1; //传输完成中断使能
MY_NVIC_Init(1,1,DMA1_Channel6_IRQn,1);//抢占1,子优先级1,组1
}
//DMA中断函数
void DMA1_Channel6_IRQHandler()
{
if(DMA1->ISR & DMA1_FLAG_TC6)
{
LED0=~LED0;
KAISHI(DMA1_Channel6);
DMA1->IFCR |=1<<22;// DMA1_FLAG_TC6; //清除完成传输中断
}
}
//开启一次DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
TIM3->DIER|=1<<9; //捕获比较1事件的DMA请求使能
DMA_CHx->CCR|=1<<0; //开启DMA传输
}
//从新设定目的寄存器
void KAISHI(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_CHx->CCR&=~(1<<0); //关闭DMA传输
hdsj++;
DMA_CHx->CNDTR=120 ; //DMA1,传输数据量
DMA_CHx->CMAR=(u32)ov7620_Buf[hdsj]; //DMA1, 存储器地址
}
开启DMA是在中断程序中
void EXTI1_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line1) != RESET)
{
HANGSHUJU++;
if(HANGSHUJU>=230)
{
EXTI->IMR&=~(1<<1); // 关闭line BIT1上的中断
EXTI->EMR&=~(1<<1); // 屏蔽line BIT1上的中断
CLHS_sj();
EXTI->IMR|=1<<12; // 开启line BIT12上的中断
EXTI->EMR|=1<<12; // 未屏蔽line BIT12上的中断
}
else
{
if(HANGSHUJU%8==0)
{
MYDMA_Enable(DMA1_Channel6);
}
}
EXTI-> R=1<<1;
}
}
|