中级会员
- 积分
- 411
- 金钱
- 411
- 注册时间
- 2014-4-18
- 在线时间
- 94 小时
|
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]
|
|