参考原子STM32的程序,成功用niosii驱动OV7670并通过ILI9325显示,效果还不错
因为摄像头带FIFO,所以程序比较简单,调试时遇到些问题记录下,
整个程序主要就是通过一个外部中断接收VCLK信号,先在quartus里分配一个上升沿触发的输入引脚,在程序中初始化中断时,写代码如下:
int IRQ_initialize(void)
{
vclk->INTERRUPT_MASK = 1; //中断
vclk->EDGE_CAPTURE=1;
printf("finish\n");
return alt_irq_register(VCLK_IRQ,NULL,ISR_Href);
}
沿中断初始化需要加上vclk->EDGE_CAPTURE=1;这一句
数据手册对边沿捕获介绍时有这样一句话
Writing any value to edgecaptureclears all bits in the register.
刚开始没这句中断怎么都注册不成功,另外就是在中断服务函数里记得要清零中断标志位。
在中断这块耗时很久,主要是刚调试程序时,为了看清楚程序运行到里停了,就在程序很多地方加了printf函数,结果就造成大问题了,程序在中断里无法跳出,到处找资料,终于在百度里看到这一段:
【2】不能在ISR中调用C标准库的IO函数,因为这些函数将导致系统死锁。需要特别强调的是,不要在ISR中调用printf()函数,除非系统库属性中的stdout映射到工作于非中断模式的设备驱动上或者系统库使能了中断嵌套功能,否则printf()函数可能由于等待永远不可能发生的中断(因为ISR工作于中断背景下,此时的总中断是关闭的,所以在ISR中不可能相应任何中断),而导致系统死锁。可以通过系统库项目添加预处理器 ALTERA_AVALON_JTAG_UART_SMALL迫使JTAG_UART工作于查询模式,从而允许在ISR中调用printf()函数。但是通常不建议这么做,因为printf()函数的执行要消耗很多时间,这样会严重影响系统的中断相应性能。
中断正常后还是没图像出来,不断修改程序后发现问题了,在刷新液晶时使用程序如下
for(i=0;i<76800;i++)
{
rdclk->DATA=0;
rdclk->DATA=1;
LCD_data8->DATA=indata->DATA;
LCD_rw->DATA=0;
LCD_rw->DATA=1;
rdclk->DATA=0;
rdclk->DATA=1;
LCD_data8->DATA=indata->DATA;
LCD_rw->DATA=0;
LCD_rw->DATA=1;
}
变量i定义为了unsigned long int ,担心I的长度不够,就将i定义为unsigned long long int ,改正之后终于出图像了,可是用printf("%d",sizeof(int))查看长度就是为4,这是为什么呢????
话说nioii性能确实鸡肋,刷新速度才每秒5、6帧左右,上图吧