|
用K60加OV7620仿照别人的程序写了个采集程序,就是采集回来发给上位机这点目的,但是始终没有图像,用的是野火新版的库,哪位大神帮我看看是哪里出错了吧,一下是程序,仅仅是采集和发送。其中PTA29接行中断,PTB0接场中断,PTC0为像素中断
#include "common.h"
#include "include.h"
#define H 260
#define V 60
unsigned char Pix_Data[V][H];
void PTA29_IRQHandler(void);
void PTB0_IRQHandler(void);
void DMA_CH4_Handler(void);
unsigned int Hang_Cnt; //行采集计数
unsigned char Is_SendPhoto; //图像发送标志
void main()
{
int i=0,j=0;
DisableInterrupts;
Hang_Cnt=0; //行计数
Is_SendPhoto=0; //从串口发送图像
port_init(PTA29,IRQ_RISING|PF|ALT1|PULLDOWN); //行中断,PORTA29 端口外部中断初始化 ,
//上升沿触发中断,内部下拉
disable_irq(PORTA_IRQn); //行中断关闭
port_init(PTB0,IRQ_FALLING|PF|ALT1|PULLDOWN); //场中断,PORTB0 端口外部中断初始化 ,
//下降沿触发中断,内部下拉
uart_init(UART1,256000);
set_vector_handler(PORTA_VECTORn,PTA29_IRQHandler); //设置行中断函数
set_vector_handler(PORTB_VECTORn,PTB0_IRQHandler); //设置场中断函数
set_vector_handler(DMA4_VECTORn,DMA_CH4_Handler);
enable_irq(PORTB_IRQn);
EnableInterrupts;
enable_irq(PORTB_IRQn);
while(1)
{
if(Is_SendPhoto)
{
disable_irq(PORTA_IRQn);
disable_irq(PORTB_IRQn); //关闭PORTB中断,即关闭场中断,防止串口发送图像数据进程被打乱
//以下四句话是固定格式,是串口和上位机软件之间的协议
uart_putchar(UART1,0);
uart_putchar(UART1,255);
uart_putchar(UART1,1);
uart_putchar(UART1,0);
for(i=0;i<V;i++)
{
for(j=0;j<H;j++)
{
uart_putchar(UART1,Pix_Data[i][j]);
}
}
enable_irq(PORTB_IRQn); //打开PORTB中断
enable_irq(PORTA_IRQn);
Is_SendPhoto=0;
}
}
}
void PTA29_IRQHandler(void)
{
if((PORTA_ISFR & (1<<29))) //PTA29触发中断,行中断
{
PORTA_ISFR |= (1<<29); //写1清中断标志位
if((++Hang_Cnt)%4 == 0) //判断该行数据是否需要,根据自己需要的行数自己设定判别条件
{
DMA_EN(DMA_CH4); //使能通道CHn 硬件请求
}
}
}
void PTB0_IRQHandler(void)
{
if(PORTB_ISFR & (1<<0)) //PTB0触发中断,场中断
{
PORTB_ISFR |= (1<<0); //写1清中断标志位
dma_portx2buff_init(DMA_CH4,(void *)&PTD_B0_IN,Pix_Data,PTC0,DMA_BYTE1,H,DADDR_KEEPON);
//DMA通道4初始化,PTC0上升沿触发DMA传输,源地址为PTD_BYTE0_IN,
//目的地址为:Pix_Data ,每次传输1Byte,传输H次后停止传输,
//目的地址保持不变,关闭通道CHn 硬件请求
enable_irq(PORTA_IRQn); //使能PORTA中断,即开启行中断,PORTA的ISR中断号为87
Hang_Cnt=0; //行采集计数清零
Is_SendPhoto = 0;
}
}
void DMA_CH4_Handler(void)
{
DMA_IRQ_CLEAN(DMA_CH4); //清除通道传输中断标志位 (这样才能再次进入中断)
DMA_DIS(DMA_CH4); //采集完H个数据后进入这个DMA中断,停止DMA传输。行中断中打开DMA传输
if(Hang_Cnt == 240)
Is_SendPhoto = 1;
}
|
|