OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4588|回复: 2

OV5640在ucosIII+emwin的情况下无法进DMA中断

[复制链接]

27

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
411
金钱
411
注册时间
2014-4-18
在线时间
94 小时
发表于 2017-5-13 18:51:35 | 显示全部楼层 |阅读模式
10金钱
现在的问题是能进DCMI帧中断,但是DMA中断进不了
程序基本上都是用的例程里的,但是内存是在SDRAM里申请的内存。
设置的输出图像大小是480*320,行缓存大小是32

DMA初始化:
[mw_shl_code=c,true]void DCMI_DMA_Init(u32 mem0addr,u32 mem1addr,u16 memsize,u8 memblen,u8 meminc)
{
        u32 tempreg=0;
        RCC->AHB1ENR|=1<<22;                        //DMA2时钟使能
        //__HAL_RCC_DMA2_CLK_ENABLE();
        while(DMA2_Stream1->CR&0X01);        //等待DMA2_Stream1可配置
        DMA2->LIFCR|=0X3D<<6*1;                        //清空通道1上所有中断标志
        DMA2_Stream1->FCR=0X0000021;        //设置为默认值       
       
        DMA2_Stream1->AR=(u32)&DCMI->DR;//外设地址为CMI->DR
        DMA2_Stream1->M0AR=mem0addr;        //mem0addr作为目标地址0
        DMA2_Stream1->M1AR=mem1addr;        //mem1addr作为目标地址1
        DMA2_Stream1->NDTR=memsize;                //传输长度为memsize
        tempreg|=0<<6;                                        //外设到存储器模式
        tempreg|=1<<8;                                        //循环模式
        tempreg|=0<<9;                                        //外设非增量模式
        tempreg|=meminc<<10;                        //存储器增量模式
        tempreg|=2<<11;                                        //外设数据长度:32位
        tempreg|=memblen<<13;                        //存储器位宽,8/16/32bit
        tempreg|=2<<16;                                        //高优先级
        tempreg|=0<<21;                                        //外设突发单次传输
        tempreg|=0<<23;                                        //存储器突发单次传输
        tempreg|=1<<25;                                        //通道1 DCMI通道  
        tempreg|=1<<18;                                //双缓冲模式
        tempreg|=1<<4;                                //开启传输完成中断
        HAL_NVIC_SetPriority(DMA2_Stream1_IRQn,2,1);
        HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);                
        DMA2_Stream1->CR=tempreg;                //设置CR寄存器
}[/mw_shl_code]

DCMI初始化:
[mw_shl_code=c,true]//DCMI初始化
void DCMI_Init(void)
{
        u32 tempreg=0;
        GPIO_InitTypeDef GPIO_Initure;
        //设置IO
        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();
        __HAL_RCC_GPIOC_CLK_ENABLE();
        __HAL_RCC_GPIOD_CLK_ENABLE();
        __HAL_RCC_GPIOH_CLK_ENABLE();
        __HAL_RCC_DCMI_CLK_ENABLE();

        GPIO_Initure.Mode=GPIO_MODE_AF_PP;
        GPIO_Initure.Pull=GPIO_PULLUP;
        GPIO_Initure.Speed=GPIO_SPEED_HIGH;
       
        GPIO_Initure.Pin=GPIO_PIN_4|GPIO_PIN_6;
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);
       
        GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
        HAL_GPIO_Init(GPIOB,&GPIO_Initure);
       
        GPIO_Initure.Pin=GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_11;
        HAL_GPIO_Init(GPIOC,&GPIO_Initure);
       
        GPIO_Initure.Pin=GPIO_PIN_3;
        HAL_GPIO_Init(GPIOD,&GPIO_Initure);

        GPIO_Initure.Pin=GPIO_PIN_8;
        HAL_GPIO_Init(GPIOH,&GPIO_Initure);
       
        GPIO_AF_Set(GPIOH,8 ,13);        //PA4,AF13  DCMI_HSYNC H8 未接
        GPIO_AF_Set(GPIOA,6 ,13);        //PA6,AF13  DCMI_PCLK   
        GPIO_AF_Set(GPIOB,7 ,13);        //PB7,AF13  DCMI_VSYNC
        GPIO_AF_Set(GPIOC,6 ,13);        //PC6,AF13  DCMI_D0
        GPIO_AF_Set(GPIOC,7 ,13);        //PC7,AF13  DCMI_D1
        GPIO_AF_Set(GPIOC,8 ,13);        //PC8,AF13  DCMI_D2
        GPIO_AF_Set(GPIOC,9 ,13);        //PC9,AF13  DCMI_D3
        GPIO_AF_Set(GPIOC,11,13);        //PC11,AF13 DCMI_D4
        GPIO_AF_Set(GPIOD,3 ,13);        //PB6,AF13  DCMI_D5  D3
        GPIO_AF_Set(GPIOB,8 ,13);        //PE5,AF13  DCMI_D6  B8
        GPIO_AF_Set(GPIOB,9 ,13);        //PE6,AF13  DCMI_D7  B9
        //清除原来的设置
        DCMI->IER=0x0;
        DCMI->ICR=0x1F;
        DCMI->ESCR=0x0;
        DCMI->ESUR=0x0;
        DCMI->CWSTRTR=0x0;
        DCMI->CWSIZER=0x0;
       
        tempreg|=0<<1;                //连续模式
        tempreg|=0<<2;                //全帧捕获
        tempreg|=0<<4;                //硬件同步HSYNC,VSYNC
        tempreg|=1<<5;                //PCLK 上升沿有效
        tempreg|=0<<6;                //HSYNC 低电平有效
        tempreg|=0<<7;                //VSYNC 低电平有效
        tempreg|=0<<8;                //捕获所有的帧
        tempreg|=0<<10;         //8位数据格式  
        DCMI->IER|=1<<0;         //开启帧中断  
        tempreg|=1<<14;         //DCMI使能
        DCMI->CR=tempreg;        //设置CR寄存器
        HAL_NVIC_SetPriority(DCMI_IRQn,2,0);
        HAL_NVIC_EnableIRQ(DCMI_IRQn);
} [/mw_shl_code]

OV5640初始化:
[mw_shl_code=c,true]volatile u32 *dcmi_line_buf[2];//行缓存
//配置OV5640  RGB模式
void OV5640_Config(void)
{
        OV5640_RGB565_Mode();                                        //RGB565模式
        OV5640_Focus_Init();                                        //自动对焦初始化
        OV5640_Light_Mode(0);                                        //自动模式
        OV5640_Color_Saturation(3);                //色彩饱和度0
        OV5640_Brightness(4);                                        //亮度0
        OV5640_Contrast(3);                                                //对比度0
        OV5640_Sharpness(33);                                        //自动锐度
        OV5640_Focus_Constant();                        //启动持续对焦
        DCMI_Init();                                                                        //DCMI配置
        //DCMI DMA配置
        DCMI_DMA_Init((u32)dcmi_line_buf[0],(u32)dcmi_line_buf[1],jpeg_line_size,1,1);
        OV5640_WR_Reg(0x3035,0x21);                //配置帧率 45帧
        OV5640_OutSize_Set(4,0,LCD_WID_VAL,LCD_HIG_VAL);//设置输出尺寸
        DCMI_Start();
}

//初始化OV5640
//返回值:0,成功
//    其他,错误代码
u8 OV5640_Init(void)
{
        u16 i=0;
        u16 reg;
        //设置IO               
        GPIO_InitTypeDef GPIO_Initure;

        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();
        //GPIOA15,B6初始化设置
       
        GPIO_Initure.Pin=GPIO_PIN_15;
        GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
        GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
        GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);
       
        GPIO_Initure.Pin=GPIO_PIN_6;
        HAL_GPIO_Init(GPIOB,&GPIO_Initure);
       
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
        delay_ms(100);
        OV5640_RST=0;                        //必须先拉低OV5640的RST脚,再上电
        delay_ms(20);
        OV5640_PWDN=0;                //POWER ON
        delay_ms(5);  
        OV5640_RST=1;                        //结束复位
        delay_ms(20);      
        SCCB_Init();                        //初始化SCCB 的IO口
        delay_ms(5);
        reg=OV5640_RD_Reg(OV5640_CHIPIDH);        //读取ID 高八位
        reg<<=8;
        reg|=OV5640_RD_Reg(OV5640_CHIPIDL);        //读取ID 低八位
        if(reg!=OV5640_ID)
        {
                printf("ID:%d\r\n",reg);
                return 1;
        }  
        OV5640_WR_Reg(0x3103,0X11);        //system clock from pad, bit[1]
        OV5640_WR_Reg(0X3008,0X82);        //软复位
        delay_ms(10);
        //初始化 OV5640
        for(i=0;i<sizeof(ov5640_init_reg_tbl)/4;i++)
        {
                OV5640_WR_Reg(ov5640_init_reg_tbl[0],ov5640_init_reg_tbl[1]);
                delay_us(2);
        }   
        //检查闪光灯是否正常
        OV5640_Flash_Ctrl(1);//打开闪光灯
        delay_ms(50);
        OV5640_Flash_Ctrl(0);//关闭闪光灯
        delay_ms(200);
        //申请缓存内存
        dcmi_line_buf[0] = (u32 *)mymalloc(SRAMEX,jpeg_line_size*4);
        dcmi_line_buf[1] = (u32 *)mymalloc(SRAMEX,jpeg_line_size*4);
        OV5640_Config();//配置进入RGB565模式
        return 0x00;         //ok
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

找到问题所在了,tempreg|=0
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
411
金钱
411
注册时间
2014-4-18
在线时间
94 小时
 楼主| 发表于 2017-5-13 18:51:36 | 显示全部楼层
找到问题所在了,tempreg|=0<<7; 改成tempreg|=1<<7; 就可以进了。。。。现在的问题是颜色偏色非常严重。。。 9B1953A8FADB7C4E53038F997AF4B0CD.jpg
回复

使用道具 举报

27

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
411
金钱
411
注册时间
2014-4-18
在线时间
94 小时
 楼主| 发表于 2017-5-14 09:36:28 | 显示全部楼层
找到原因了-C6没有初始化
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-26 21:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表