求助:BF533板子上采集高帧率图像出现的问题,请大家帮助。先谢谢了
描述如下:
<code>
// 发起采集
void PPI_Capture_Frame(void)
{
*pPPI_FRAME = 240;
*pPPI_COUNT = 319;
*pPPI_DELAY = 0;
*pPPI_CONTROL = 0x01AC;
// 根据 frame_id 传入对应的内存地址
*pDMA0_START_ADDR = (frame_id == 1) ? src_buffer1 : src_buffer0;
*pDMA0_X_COUNT = 160;
*pDMA0_X_MODIFY = 0x2;
*pDMA0_Y_COUNT = 240;
*pDMA0_Y_MODIFY = 0x2;
*pDMA0_PERIPHERAL_MAP = 0x0;
*pDMA0_CONFIG = WNR | WDSIZE_16| DMA2D | RESTART | DI_EN;
*pDMA0_CONFIG |= DMAEN;
ssync();
*pPPI_CONTROL |= PORT_EN;
ssync();
}
<code />
<code>
// PPI 中断处理函数,简单使标志位置1
EX_INTERRUPT_HANDLER(DMA0_PPI_ISR)
{
*pDMA0_IRQ_STATUS = 0x1;
//*pPPI_CONTROL &= 0xfffe;
if(frame_id >= 0) {
frame_dirty[frame_id] = 1;
}
}
<code />
采集方法一:
顺序采集,图像采集正常,即 frame_dirty[frame_id] 赋0,发起采集后,等待 frame_dirty[frame_id] 为1再继续。
此方法图像正常。
代码如下:
<code>
// 采集到 0 缓存
frame_id = 0;
PPI_Capture_Frame();
// 等待采集完成
while(frame_dirty[0] == 0);
// 处理或显示图像
.......
frame_dirty[0] = 0;
<code />
采集方法二:
后来因更换的CMOS帧率较高,为了充分利用视频采集的时间间隔,我们想在发起采集之后,先处理上一帧保存的图像,结果发现采集到图像出现问题
<code>
// 遍历查找空闲的缓存 id
frame_id = -1;
for (i = 0; i < 2; i++) {
if(frame_dirty[i] == 0) {
frame_id = i;
break;
}
}
if(frame_id >= 0) {
// 发起采集
PPI_Capture_Frame();
// 利用空闲时间处理上一帧的缓存,
int id = 1 - frame_id;
if(frame_dirty[id] == 1) {
// 处理或显示图像
....
frame_dirty[id] = 0;
}
// 等待采集完成
while(frame_dirty[frame_id] == 0);
}
<code />
图像问题的具体表现:
1. 正常图像:
2. 移动样品后,采用第二种方式采集的图像
比较神奇的是,如果不移动样品,图像就不会发生错乱的现象。
「该帖子被 slackman 在 2017-07-11 10:06:55 编辑过」