新手上路
- 积分
- 21
- 金钱
- 21
- 注册时间
- 2020-2-20
- 在线时间
- 8 小时
|
6金钱
用的STM32H743,串口显示图片出现以下问题,求助
双缓存,代码如下:
#define jpeg_buf_size 31*1024 //定义JPEG数据缓存jpeg_buf的大小(*4字节)
/*用做DMA的双缓冲 buf*/
#define RGB_buf_SIZE 1024
__align(4) u32 RGB_buf1[RGB_buf_SIZE];
__align(4) u32 RGB_buf2[RGB_buf_SIZE];
__align(4) u32 RGB_BUF[jpeg_buf_size];//JPEG数据缓存buf,定义在LCD帧缓存之后
volatile u32 ImageDateLenght=0;/*图像数据大小 单位u32*/
volatile u8 buf_sta=0; /*0 图像还没有采集完成,1 采集完成 2 处理完成*/
#define OV7725_WINDOW_WIDTH 120 // <=320
#define OV7725_WINDOW_HEIGHT 120 // <=240
#define Buf7725_Size OV7725_WINDOW_WIDTH*OV7725_WINDOW_HEIGHT*2 //一帧传输的数据长度大小
//处理JPEG数据
//当采集完一帧JPEG数据后,调用此函数,切换JPEG BUF.开始下一帧采集.
void jpeg_data_process(void)
{
u16 i;
u16 rlen; //剩余数据长度
u32 *pbuf;
if(buf_sta==0) //jpeg数据还未采集完?
{
// __HAL_DMA_DISABLE(&DMADMCI_Handler);//关闭DMA
DMA1_Stream1->CR&=~(1<<0); //停止当前传输
while(DMA1_Stream1->CR&0X01); //等待DMA2_Stream1可配置
// rlen=jpeg_line_size-__HAL_DMA_GET_COUNTER(&DMADMCI_Handler);//得到剩余数据长度
rlen=RGB_buf_SIZE-DMA1_Stream1->NDTR;//得到剩余数据长度
pbuf=RGB_BUF+ImageDateLenght;//偏移到有效数据末尾,继续添加
if(DMA1_Stream1->CR&(1<<19))for(i=0;i<rlen;i++)pbuf[i]=RGB_buf2[i];//读取buf1里面的剩余数据
else for(i=0;i<rlen;i++)pbuf[i]=RGB_buf1[i];//读取buf0里面的剩余数据
ImageDateLenght+=rlen; //加上剩余长度
buf_sta=1; //标记JPEG数据采集完按成,等待其他函数处理
}
if(buf_sta==2) //上一次的jpeg数据已经被处理了
{
DMA1_Stream1->NDTR=RGB_buf_SIZE;//传输长度为jpeg_buf_size*4字节
DMA1_Stream1->CR|=1<<0; //重新传输
buf_sta=0; //标记数据未采集
ImageDateLenght=0; //数据重新开始
}
// }
}
void RGB_dcmi_rx_callback(void)
{
u16 i;
u32 *pbuf;
pbuf=RGB_BUF+ImageDateLenght;//偏移到有效数据末尾
if(DMA1_Stream1->CR&(1<<19))//buf0已满,正常处理buf1
{
for(i=0;i<RGB_buf_SIZE;i++)pbuf[i]=RGB_buf1[i];//读取buf1里面的数据
ImageDateLenght+=RGB_buf_SIZE;//偏移
}else //buf1已满,正常处理buf0
{
for(i=0;i<RGB_buf_SIZE;i++)pbuf[i]=RGB_buf2[i];//读取buf2里面的数据
ImageDateLenght+=RGB_buf_SIZE;//偏移
}
SCB_CleanInvalidateDCache(); //清除无效化DCache
}
/**
* @brief OV7725相机拍摄设置,尺寸:120,120,黑白特效
* @param 无
* @retval 无
*/
void OV7725_Test(void)
{
u32 i = 0;
u8 *p;
OV7725_Contrast(3); //对比度设置
OV7725_Color_Saturation(3);//色彩饱和度0
OV7725_Special_Effects(0);
OV7725_Light_Mode(0);
dcmi_rx_callback=RGB_dcmi_rx_callback;//RGB屏接收数据回调函数
DCMI_Init(); //DCMI配置
DCMI_DMA_Init((u32)RGB_buf1,(u32)RGB_buf2,RGB_buf_SIZE,DMA_MDATAALIGN_WORD,DMA_MINC_ENABLE);
OV7725_Window_Set(OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT,0);//QVGA模式输出
DCMI_Start(); //启动传输
delay_ms(10);
while(1){
if(buf_sta == 1) //已经采集完一帧图像了
{
p=(u8*)RGB_BUF;
USART1->TDR=0x01;
while((USART1->ISR&0X40)==0); //循环发送,直到发送完毕
USART1->TDR=0XFE;
while((USART1->ISR&0X40)==0); //循环发送,直到发送完毕
for(i=0;i< Buf7725_Size; i++) //发送图像
{
USART1->TDR=p[i];
while((USART1->ISR&0X40)==0); //循环发送,直到发送完毕
}
USART1->TDR=0xFE;
while((USART1->ISR&0X40)==0); //循环发送,直到发送完毕
USART1->TDR=0X01;
while((USART1->ISR&0X40)==0); //循环发送,直到发送完毕
buf_sta=2; //标记jpeg数据处理完了,可以让DMA去采集下一帧了.
}
}
}
int main(void)
{
Cache_Enable(); //打开L1-Cache
MPU_Memory_Protection(); //保护相关存储区域
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(160,5,2,4); //设置时钟,400Mhz
delay_init(400); //延时初始化
uart_init(256000); //串口初始化
usart2_init(256000); //初始化USART2
usmart_dev.init(200); //初始化USMART
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
SDRAM_Init(); //初始化SDRAM
TIM3_Init(10000-1,20000-1); //10Khz计数,1秒钟中断一次
if(!OV7725_Init())//OV7725初始化成功
{
printf("OV7725_Init success\n");
OV7725_Test();
}
while(1)
{
}
|
-
|