OpenEdv-开源电子网

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

STM32F407VE OV2640 DMA进入HardFault_Handler

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-26
在线时间
2 小时
发表于 2015-12-23 11:27:41 | 显示全部楼层 |阅读模式
5金钱
        公司要做摄像头视频采集,恰好看到正点原子的探索者开发有这么个例子。就没了探索者开发板,然后照着例子完成了初步试验。
        完全正点原子的硬件平台,STM32F4采集OV2640摄像头的数据后通过UDP发送给PC端,PC端显示出来,效果大概是每秒10帧图片。DCMI的配置完全就是例子,连续采样模式,DMA的配置也是例子。
        但公司其他项目有用到STM32F4,但用的是STM32F407VET6,网卡是DP83848.然后我就重新改版做测试,然后就遇到了如题的问题。贴几个关键代码和思路。
[mw_shl_code=c,true]void OV2640_JPEG_Init(void) { u8 size = 4; while(OV2640_Init()) { delay_ms(200); } OV2640_JPEG_Mode(); My_DCMI_Init(); DCMI_DMA_Init((u32)jpeg_buf,JPEG_BUF_SIZE,DMA_MemoryDataSize_Word,DMA_MemoryInc_Enable); OV2640_OutSize_Set(jpeg_img_size_tbl[size][0],jpeg_img_size_tbl[size][1]); DMA2_Stream1->CR |= 0x00000001; DCMI->CR |= (uint32_t)DCMI_CR_CAPTURE; }[/mw_shl_code]
      一看就知道这个原子哥得代码,也没得什么说的。就是我把图片大小设置为了640*480.
[mw_shl_code=c,true] DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_SnapShot; DCMI_InitStructure.DCMI_CaptureRate=DCMI_CaptureRate_All_Frame; DCMI_InitStructure.DCMI_ExtendedDataMode= DCMI_ExtendedDataMode_8b; DCMI_InitStructure.DCMI_HSPolarity= DCMI_HSPolarity_Low; DCMI_InitStructure.DCMI_PCKPolarity= DCMI_PCKPolarity_Rising; DCMI_InitStructure.DCMI_SynchroMode= DCMI_SynchroMode_Hardware; DCMI_InitStructure.DCMI_VSPolarity=DCMI_VSPolarity_Low; DCMI_Init(&DCMI_InitStructure);[/mw_shl_code]
    我将DCMI连续输出模式改成了快照模式。
[mw_shl_code=c,true]void jpeg_data_process(void) { u8 *p; unsigned int cnt=0; unsigned int sum = 0;     p=(u8*)jpeg_buf; DMA2_Stream1->CR &= ~(1<<0); while(DMA2_Stream1->CR &(1<<0)); jpeg_data_len=JPEG_BUF_SIZE - DMA2_Stream1->NDTR;     sprintf((char*)tmpBuf,"%ld",4*jpeg_data_len);     udp_demo_senddata(tmpBuf,6); delay_ms(1);     p=(u8*)jpeg_buf;     cnt = 0;     sum = 4*jpeg_data_len;     while(cnt < sum)     { if(cnt + SEND_SIZE <= sum) { udp_demo_senddata((p+cnt),SEND_SIZE); cnt += SEND_SIZE; } else { udp_demo_senddata((p+cnt),sum - cnt); break; } while(d_cnt < 100) { d_cnt ++; LwIP_Periodic_Handle(LocalTime); } d_cnt = 0; } while(DMA2_Stream1->CR&0X01); DMA2_Stream1->AR=(u32)&DCMI->DR; DMA2_Stream1->M0AR=(u32)jpeg_buf; DMA2_Stream1->NDTR=JPEG_BUF_SIZE; DMA2_Stream1->CR |= 0x00000001; DCMI->CR |= (uint32_t)DCMI_CR_CAPTURE; }[/mw_shl_code]
      因为是快照模式,所以进入这个函数以后DCMI->CR中的DCMI_CR_CAPTURE已经被清零了,然后就是暂停DMA传输,获取一帧图片的大小,UDP先传输这帧图片大小,再传输这帧图片的数据。再调整DMA的计数值,开DMA,开DCMI捕获。

     试验现象:在原子哥的平台上完全通过,在自己的平台STM32F407VET6上,能够获得图片,有时程序跑了十几秒(采集了几十帧图片,图片在PC上显示正常),有时程序只跑了一秒(采集了几帧图片,图片显示正常),然后程序就跑到了HardFault_Handler里面去了。


     然后自己测试了下,想找到怎么进入到HardFault里去的。
    1、屏蔽了OV2640的初始化代码,只运行LWIP内核,程序不出错。
   2、开OV2640的初始化代码,但关掉DMA2_Stream1->CR |= 0x00000001;这句话,就是不使能DMA功能,程序也不会出错。
   3、开OV2640,也打开DMA功能(也就是上面描述的),程序就会进入到HardFault_Handler里去。

[mw_shl_code=c,true] 尝试着去更改DMA里面的配置,都没什么效果。求指导,给个思路。论坛里有人可出在进HardFault_Handler时,看sp的值然后加20就是出错点的位置,但我还不知道怎么操作。[/mw_shl_code]
[mw_shl_code=c,true]   [/mw_shl_code]


最佳答案

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

回复【8楼】kanite: --------------------------------- 在中断里面调用lwip函数发送数据这样不可靠啊,中断里面不要执行太耗时的操作,更不能阻塞。你在中断里发送数据的时候可能又会产生网卡的中断造成中断嵌套,这样容易出问题。你可以在外部的while(1)里轮询图像是否capture完成,然后发送
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

75

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2012-12-30
在线时间
41 小时
发表于 2015-12-23 11:27:42 | 显示全部楼层
回复【8楼】kanite:
---------------------------------
在中断里面调用lwip函数发送数据这样不可靠啊,中断里面不要执行太耗时的操作,更不能阻塞。你在中断里发送数据的时候可能又会产生网卡的中断造成中断嵌套,这样容易出问题。你可以在外部的while(1)里轮询图像是否capture完成,然后发送
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-26
在线时间
2 小时
 楼主| 发表于 2015-12-23 11:40:00 | 显示全部楼层
自己先定一个,下午来了继续干~
回复

使用道具 举报

7

主题

75

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2012-12-30
在线时间
41 小时
发表于 2015-12-23 20:47:46 | 显示全部楼层
默认的HardFault_Handler处理方法不是B .这样的死循环么?楼主将它改成BX LR直接返回的形式。然后在这条语句打个断点,一旦在断点中停下来,说明出错了,然后再返回,就可以返回到出错的位置的下一条语句那儿

__asm void wait()
{
      BX lr
}

void HardFault_Handler(void)
{
    /* Go to infinite loop when Hard Fault exception occurs */
       wait();
}

参考至http://blog.csdn.net/zyboy2000/article/details/7668331,可以作为一种调试方法
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-4-28
在线时间
0 小时
发表于 2015-12-23 21:23:53 | 显示全部楼层
回复【3楼】xijiele:
---------------------------------
请问可联系吗,本人在做楼主类似的,可以请教吗 我也在湖北
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-26
在线时间
2 小时
 楼主| 发表于 2015-12-24 08:31:49 | 显示全部楼层
      谢谢2楼的提醒。我试了下,结果是这样的。
     



      它停在了stm32f4x7_eth.c中的这一行上面。进了一步~~
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-26
在线时间
2 小时
 楼主| 发表于 2015-12-24 08:37:20 | 显示全部楼层
上面frame = struct {length = 0x0000003c,buffer = 0x0000000, descriptor = 0x0000000},但是后面的(DMA_RX_FRAME_info->FS_Rx_Desc)->Buffer1Addr不为0 位0xAC010045


这两个不相关的DMA为什么会有冲突呢,有了解的吗?
回复

使用道具 举报

7

主题

75

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2012-12-30
在线时间
41 小时
发表于 2015-12-24 14:34:39 | 显示全部楼层
你的jpeg_data_process()是在中断里面调用的吗?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-26
在线时间
2 小时
 楼主| 发表于 2015-12-24 16:12:03 | 显示全部楼层
回复【7楼】xijiele:
---------------------------------
是的哦。

下午又试了下,不用网络发送数据,把lwip的所有代码全部屏蔽掉,使用串口发送代替网络发送,使用原子哥得串口摄像头软件,显示0.6帧每秒数据。也就是不出任何错。

问题就在网络和摄像头同时存在时,网卡是DP83848,LWIP基本上用的ST官方例子。我得好好看看官方例子和原子哥得LWIP有什么不同了。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-26
在线时间
2 小时
 楼主| 发表于 2015-12-25 09:19:44 | 显示全部楼层
我试了下  还是不行。我直接把DCMI中断干掉了,在main里面轮训,一样进入到HardFault_Handler.
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-26
在线时间
2 小时
 楼主| 发表于 2015-12-29 11:13:41 | 显示全部楼层
谢谢 xijiele,以上代码没任何问题。我把中断取消了,改成了在while里处理。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-26
在线时间
2 小时
 楼主| 发表于 2015-12-29 11:18:20 | 显示全部楼层
怎么把帖子设置为已解决?
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2014-3-26
在线时间
4 小时
发表于 2016-1-26 20:20:36 | 显示全部楼层
http://www.openedv.com/forum.php?mod=redirect&goto=findpost&ptid=64960&pid=369296&fromuid=20420


你这边办法我用了,怎么不行。打了断点,程序也跑到这里,但是,返回不了。
捕获.PNG
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 03:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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