OpenEdv-开源电子网

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

STM32F767 + MT9V034 摄像头 不进DMA传输完成中断求助

[复制链接]

11

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2014-11-23
在线时间
192 小时
发表于 2018-3-27 16:39:22 | 显示全部楼层 |阅读模式
10金钱
不进DCMI DMA传输完成中断
检查出现了传输错误中断,哪位大神帮忙分析下!!!

//DCMI DMA配置
//mem0addr:存储器地址0  将要存储摄像头数据的内存地址(也可以是外设地址)
//mem1addr:存储器地址1  当只使用mem0addr的时候,该值必须为0
//memblen:存储器位宽,可以为MA_MDATAALIGN_BYTE/DMA_MDATAALIGN_HALFWORD/DMA_MDATAALIGN_WORD
//meminc:存储器增长方式,可以为MA_MINC_ENABLE/DMA_MINC_DISABLE
void DCMI_DMA_Init(u32 mem0addr,u32 mem1addr,u16 memsize,u32 memblen,u32 meminc)
{
    __HAL_RCC_DMA2_CLK_ENABLE();                                    //使能DMA2时钟
    __HAL_LINKDMA(&DCMI_Handler,DMA_Handle,DMADMCI_Handler);        //将DMA与DCMI联系起来
       
    __HAL_DMA_DISABLE_IT(&DMADMCI_Handler,DMA_IT_TC);                            //先关闭DMA传输完成中断(否则在使用MCU屏的时候会出现花屏的情况)

    DMADMCI_Handler.Instance=DMA2_Stream1;                          //DMA2数据流1                     
    DMADMCI_Handler.Init.Channel=DMA_CHANNEL_1;                     //通道1
    DMADMCI_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY;            //外设到存储器
    DMADMCI_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                //外设非增量模式
    DMADMCI_Handler.Init.MemInc=DMA_MINC_ENABLE;                    //存储器增量模式
    DMADMCI_Handler.Init.PeriphDataAlignment=DMA_MDATAALIGN_WORD;   //外设数据长度:32位
    DMADMCI_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;      //存储器数据长度:8/16/32位
    DMADMCI_Handler.Init.Mode=DMA_CIRCULAR;                         //使用循环模式
    DMADMCI_Handler.Init.Priority=DMA_PRIORITY_HIGH;                //高优先级
    DMADMCI_Handler.Init.FIFOMode=DMA_FIFOMODE_ENABLE;              //使能FIFO
    DMADMCI_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_HALFFULL; //使用1/2的FIFO
    DMADMCI_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                //存储器突发传输
    DMADMCI_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;             //外设突发单次传输
    HAL_DMA_DeInit(&DMADMCI_Handler);                               //先清除以前的设置
    HAL_DMA_Init(&DMADMCI_Handler);                                        //初始化DMA

    //在开启DMA之前先使用__HAL_UNLOCK()解锁一次DMA,因为HAL_DMA_Statrt()HAL_DMAEx_MultiBufferStart()
    //这两个函数一开始要先使用__HAL_LOCK()锁定DMA,而函数__HAL_LOCK()会判断当前的DMA状态是否为锁定状态,如果是
    //锁定状态的话就直接返回HAL_BUSY,这样会导致函数HAL_DMA_Statrt()和HAL_DMAEx_MultiBufferStart()后续的DMA配置
    //程序直接被跳过!DMA也就不能正常工作,为了避免这种现象,所以在启动DMA之前先调用__HAL_UNLOC()先解锁一次DMA。
    __HAL_UNLOCK(&DMADMCI_Handler);
    if(mem1addr==0)    //开启DMA,不使用双缓冲
    {
        HAL_DMA_Start(&DMADMCI_Handler,(u32)&DCMI->DR,mem0addr,memsize);
    }
    else                //使用双缓冲
    {
        HAL_DMAEx_MultiBufferStart(&DMADMCI_Handler,(u32)&DCMI->DR,mem0addr,mem1addr,memsize);//开启双缓冲
        __HAL_DMA_ENABLE_IT(&DMADMCI_Handler,DMA_IT_TC);    //开启传输完成中断
        HAL_NVIC_SetPriority(DMA2_Stream1_IRQn,0,0);        //DMA中断优先级
        HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
    }   
}

void (*dcmi_rx_callback)(void);//DCMI DMA接收回调函数
//DMA2数据流1中断服务函数
void DMA2_Stream1_IRQHandler(void)
{

    if(__HAL_DMA_GET_FLAG(&DMADMCI_Handler,DMA_FLAG_TCIF1_5)!=RESET)//DMA传输完成
    {
        __HAL_DMA_CLEAR_FLAG(&DMADMCI_Handler,DMA_FLAG_TCIF1_5);//清除DMA传输完成中断标志位
        printf("DMA中断传输完成\r\n");
        dcmi_rx_callback();        //执行摄像头接收回调函数,读取数据等操作在这里面处理
        SCB_CleanInvalidateDCache();        //清除无效的D-Cache
    }
    if(__HAL_DMA_GET_FLAG(&DMADMCI_Handler,DMA_FLAG_DMEIF1_5))
    {
        __HAL_DMA_CLEAR_FLAG(&DMADMCI_Handler,DMA_FLAG_DMEIF1_5);//清除DMA传输完成中断标志位
        printf("DMA中断 DMA_FLAG_DMEIF1_5\r\n");
    }
    if(__HAL_DMA_GET_FLAG(&DMADMCI_Handler,DMA_FLAG_FEIF1_5))
    {
        __HAL_DMA_CLEAR_FLAG(&DMADMCI_Handler,DMA_FLAG_FEIF1_5);//清除DMA传输完成中断标志位
        printf("DMA中断 DMA_FLAG_FEIF1_5\r\n");
    }
        if(__HAL_DMA_GET_FLAG(&DMADMCI_Handler,DMA_FLAG_TEIF1_5))//传输错误中断
    {
        __HAL_DMA_CLEAR_FLAG(&DMADMCI_Handler,DMA_FLAG_TEIF1_5);//清除DMA中断标志位
        printf("DMA中断 DMA_FLAG_TEIF1_5\r\n");
    }
}
Main函数中配置
DCMI_DMA_Init((u32)dcmi_line_buf[0],(u32)dcmi_line_buf[1],IMAGE_WIDTH_CONTEXT_A,DMA_MINC_ENABLE);//DCMI DMA配置      

DCMI_Start();                                         //启动传输         


最佳答案

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

这个问题解决了,DMA_MDATAALIGN_WORD 是内存数据宽度设置 DMA_PDATAALIGN_WORD是外设的宽度设置,搞混了
菜鸟不可怕,就怕菜鸟不愿飞 | | | -===+=====_/(T)\_=====+===- | |/.\| | `-|\_/|-'
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2014-11-23
在线时间
192 小时
 楼主| 发表于 2018-3-27 16:39:23 | 显示全部楼层
这个问题解决了,DMA_MDATAALIGN_WORD 是内存数据宽度设置  DMA_PDATAALIGN_WORD是外设的宽度设置,搞混了
菜鸟不可怕,就怕菜鸟不愿飞 | | | -===+=====_/(T)\_=====+===- | |/.\| | `-|\_/|-'
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-3-28 01:19:04 | 显示全部楼层
帮顶
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-3-29 01:40:09 | 显示全部楼层
hxyqq87 发表于 2018-3-27 16:39
这个问题解决了,DMA_MDATAALIGN_WORD 是内存数据宽度设置  DMA_PDATAALIGN_WORD是外设的宽度设置,搞混了

谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-5-6
在线时间
1 小时
发表于 2018-5-6 17:49:23 | 显示全部楼层
hxyqq87 发表于 2018-3-27 16:39
这个问题解决了,DMA_MDATAALIGN_WORD 是内存数据宽度设置  DMA_PDATAALIGN_WORD是外设的宽度设置,搞混了

最近买了一个mt9v034摄像头,楼主可不可以给一下STM32驱动文件/,改了好久都不出图像.。。。。。。。。。。。
回复

使用道具 举报

11

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2014-11-23
在线时间
192 小时
 楼主| 发表于 2018-5-10 14:36:33 | 显示全部楼层
u8 MT9V034_Init(void)/* MT9V034 初始化*/
{
    u8 rtn = 0;
    u16 version;            //MT9V034版本号
    PCF8574_Init();                        //初始化PCF8574
    MT9V034_PWDN_Set(0);    //MT9V034上电
    SCCB_Init();                //初始化SCCB 的IO口       
   
    version = mt9v034_ReadReg16(MTV_CHIP_VERSION_REG);
   
    if(version == 0x1324)
    {        
        mt9v034_WriteReg16(MTV_SOFT_RESET_REG,0x0001);// R0x0C 复位MT9V034
        delay_ms(100);
        mt9v034_WriteReg16(MTV_SOFT_RESET_REG,0x0000);// R0x0C 取消复位
        delay_ms(100);
        mt9v034_WriteReg16(MTV_LED_OUT, 0x0002);      // R0x1B LED_OUT
        
        mt9v034_WriteReg16(MTV_READ_MODE_REG_A, 0x0330);    // R0x0D Read out rows from bottom to top (upside down).   Read out columns from right to left (mirrored). Context A
        mt9v034_WriteReg16(MTV_COLUMN_START_REG_A,(MAX_IMAGE_WIDTH - IMAGE_WIDTH_CONTEXT_A)/2 + MINIMUM_COLUMN_START);//R0x01 列开始 Context A
        mt9v034_WriteReg16(MTV_ROW_START_REG_A,(MAX_IMAGE_HEIGHT - IMAGE_HEIGHT_CONTEXT_A)/2 + MINIMUM_ROW_START); //R0x02 行开始 Context A
        mt9v034_WriteReg16(MTV_WINDOW_WIDTH_REG_A,IMAGE_WIDTH_CONTEXT_A);  //R0x03 开窗宽度 Context A
        mt9v034_WriteReg16(MTV_WINDOW_HEIGHT_REG_A,IMAGE_HEIGHT_CONTEXT_A); //R0x04 开窗高度 Context A
        
        mt9v034_WriteReg16(MTV_HOR_BLANKING_REG_A, MAX_IMAGE_WIDTH - IMAGE_WIDTH_CONTEXT_A + MINIMUM_HORIZONTAL_BLANKING);//R0x05 水平消隐 Context A
                mt9v034_WriteReg16(MTV_VER_BLANKING_REG_A, 500);//R0x06 垂直消隐 Context A
        
        /* Chip Control
        *
        * bits           | 15 | ... | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
        * -------------------------------------------------------------------
        * current values | 0  | ... | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
        *
        * (0:2) Scan Mode (Progressive scan)
        * (3:4) Sensor Operation Mode (Master mode)
        * (5) Stereoscopy Mode (Disable)
        * (6) Stereoscopic Master/Slave mode (not used)
        * (7) Parallel Output Enable (1 Enable)
        * (8) Simultaneous/Sequential Mode ( 1 Simultaneous mode)
        * (9) Reserved                     ( default 1)
        *
        * (15)Context A (0) / Context B (1) (0-A MODE / 1-B MODE)
        *
        */
        mt9v034_WriteReg16(MTV_CHIP_CONTROL_REG, 0x0188);    // R0x07 Chip Control A MODE
        mt9v034_WriteReg16(MTV_HDR_ENABLE_REG, 0x10);        // R0x0F High Dynamic on both contexts -- 高动态
        mt9v034_WriteReg16(0x2C, 0x0006);// R0x2C VREF_ADC Control default(0x04 - 1.5V) This set 0x06-1.6V
        
        mt9v034_WriteReg16(MTV_V1_CTRL_REG_A, 0x001F);  // R0x31 V1_control:default(0X1D)-2.375V  0X1F-2.5V
        mt9v034_WriteReg16(MTV_V2_CTRL_REG_A, 0x001A);  // R0x32 V2_control:default(0X18)-2.0625V 0X1A-2.1875V
        mt9v034_WriteReg16(MTV_V3_CTRL_REG_A, 0x0012);  // R0x33 V3_control:default(0X15)-1.875V   0X12-1.6875V
        mt9v034_WriteReg16(MTV_V4_CTRL_REG_A, 0x0003);  // R0x34 V4_control:default(0X03) 0to5  *200mV + 0.2V. 6to63  *23.5mV + 1.62V.
        mt9v034_WriteReg16(MTV_ANALOG_GAIN_CTRL_REG_A, 0x0010);//R0x35 Analog Gain:default(0X10)-gainX1  0X20-gainX2 0X30-gainX3
        
        mt9v034_WriteReg16(0x70, 0x0004);//0x0014
        mt9v034_WriteReg16(MTV_ROW_NOISE_CORR_CTRL_REG, 0x0000);// R0x70 行噪修正
        
        mt9v034_WriteReg16(MTV_AEC_AGC_ENABLE_REG,0x0003);      // R0xAF AEC_AGC ENABLE  Context A
        mt9v034_WriteReg16(MTV_MIN_EXPOSURE_REG, 0X20);   //Min Exposure   白天 0X100   晚上 0X400
                mt9v034_WriteReg16(MTV_MAX_EXPOSURE_REG, 0X40);   //Max Exposure   白天 0X400   晚上 0XA00
                mt9v034_WriteReg16(MTV_MAX_GAIN_REG, 0x40);//default AGC 0x40
        
        printf("MT9V034初始化成功!\r\n");
        return 0;
    }
    else
    {
        printf("MT9V034初始化失败,读到的version为:%d\r\n",version);
        return 1;
    }
}
菜鸟不可怕,就怕菜鸟不愿飞 | | | -===+=====_/(T)\_=====+===- | |/.\| | `-|\_/|-'
回复

使用道具 举报

8

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2018-3-22
在线时间
32 小时
发表于 2019-1-4 19:43:36 | 显示全部楼层
谢谢分享
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2016-1-16
在线时间
22 小时
发表于 2019-1-6 18:45:04 | 显示全部楼层
楼主,能不能分享一下STM32F767 + MT9V034 摄像头工程源码或者关于摄像头这一块的,谢了。
回复

使用道具 举报

4

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2020-2-26
在线时间
30 小时
发表于 2022-1-20 10:51:26 | 显示全部楼层
可以请教一个问题不
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-6 10:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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