你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 18965|回复: 91

[STM32F429] 分享个用STM32F429做的网络摄像头

  [复制链接]
回帖奖励 6 ST金币 回复本帖可获得 2 ST金币奖励! 每人限 1 次

25

主题

455

回帖

63

蝴蝶豆

金牌会员

最后登录
2020-9-21
发表于 2016-12-12 19:11:27 | 显示全部楼层 |阅读模式
本帖最后由 shanji 于 2019-3-11 09:30 编辑

先来看看硬件资源:   
       主控是STM32F429IG,1MB flash,256KB RAM;外扩32MB SDRAM,用于暂存camera 输出的JPEG数据和LCD显存,摄像头这块使用DCMI传输数据。

简单实现原理:
       以太网使用lwip,netconn API编程,这种编程方式相比RAW 比较简单,只是需要OS的支持;然后,板子当服务器,PC当客户端,当建立连接后,服务器将采集到的摄像头数据发送到客户端显示。

162027lncmumfkoqu72cub.jpg

关键代码:

     系统(ucos_ii)中建立了两个任务,task1用来处理服务器的一些周期性任务,task2用来发送JPEG数据流。

/**
  * @brief  TCP服务器任务
  * @param  
  * @retval None
  */
void TCP_Server_task(void *arg)
{
        err_t err=0;
        err_t recv_err;
        struct netconn *server_coon; //服务器连接

        struct netbuf *recvbuf;             //接收数据netbuf指针        
        struct pbuf *bufptr;         //pbuf数据缓冲区指针
        
        server_coon = netconn_new(NETCONN_TCP);                 //创建一个TCP链接
        netconn_bind(server_coon,IP_ADDR_ANY,TCP_SERVER_PORT);  //绑定端口
        netconn_listen(server_coon);                            //进入监听模式
        server_coon->recv_timeout = 10;                         //禁止阻塞线程 等待10ms
         
        while (1)   
        {
                  err = netconn_accept(server_coon,&client_conn);        //接收连接请求
                  //printf("\r\nerr=0x%x\r\n",err);
                if (err == ERR_OK)                                     //正确说明有客户端联入
                  {                                                
                          while(1)
                                {                                
                                        if((recv_err = netconn_recv(client_conn,&recvbuf)) == ERR_OK)          //接收到数据且正确
                                        {               
                                                bufptr=recvbuf->p;                                  //得到数据指针
                                                memcpy(Data_buff,bufptr->payload,bufptr->tot_len);  //拷贝数据                                       
                                                Data_buff[bufptr->tot_len]='\0';                        //加入结束符
                                                
                                                if(!memcmp(Data_buff,Video_Start,9))               //开始采集
                                                {                     
                                                        Video_flag=1;                                   //标志位值1
                                                        CamFrame=0;                                   //帧率清零
                                                        cam_start();                                   //开始采集
                                                        RTC_ITConfig(RTC_IT_WUT,ENABLE);
                                                }
                                                else if(!memcmp(Data_buff,Video_Stop,8))            //关闭采集
                                                {                     
                                                        Video_flag=0;                                     //标志位值0,自动采集完最后一帧,自动停止
                                                        RTC_ITConfig(RTC_IT_WUT,DISABLE);
                                                }
                                                
                                                netbuf_delete(recvbuf);                             //清除缓冲netbuf
                                        }
                                        else if(recv_err == ERR_CLSD)       //关闭连接
                                        {
                                                netconn_close(client_conn);     //关闭连接
                                                netconn_delete(client_conn);    //删除连接
                                                break;
                                        }
                                }
                                
                  }
        }
}

/*********************分割线*************************/

/**
  * @brief  发送数据任务
  * @param  
  * @retval None
  */
void CAM_Send_task(void *arg)
{                 
        u16  len,i,temp;
        u8  *ptr;
        u8   flag;
        
        while(1)
        {                                

                if(Buf_DoutPtr!=Buf_DinPtr)
                {
                        len=(*Buf_DoutPtr);                        
                        ptr=(u8 *)(Buf_DoutPtr+1);                  //指向CAMbuf
                        flag=0;
                        
                        for(i=0;i<len;i++)
                        {
                                if((ptr==0xFF)&&(ptr[i+1]==0xD9))      //找数据尾
                                {
                                        ptr[i+2]='\r';
                                        ptr[i+3]='\n';
                                        temp=i+4;                               //有效数据长度
                                        flag=1;
                                        break;
                                }
                        }
                        if(flag)
                        {        
                                netconn_write(client_conn ,ptr,temp,NETCONN_COPY);  //发送数据
                                CamFrame++;                                       //帧率+1
                        }
                        
                          Buf_DoutPtr+=BUFF_SIZE;                        
                          if(Buf_DoutPtr==Buf_EndPtr)  Buf_DoutPtr=Buf_StartPtr;  //到最后一个了
                                                          //回到开头                        
            }

                OSTimeDly(1);
        }
}

现象:
UC截图20161209153253.png

OV5642


UC截图20161027163031.png

OV2640



如果关注的人多的话,我就收拾收拾上位机的代码,发给你们玩玩[PS:用的是labview,其实也没什么好玩的]。

【】红龙429_网络摄像头TCP.rar (1.64 MB, 下载次数: 592)

评分

参与人数 2ST金币 +30 收起 理由
wofei1314 + 10
zero99 + 20

查看全部评分

<
回复

使用道具 举报

25

主题

455

回帖

63

蝴蝶豆

金牌会员

最后登录
2020-9-21
 楼主| 发表于 2019-2-20 11:33:03 | 显示全部楼层
本帖最后由 shanji 于 2019-2-20 11:34 编辑

有没有人会搞在网页上显示摄像头画面的,输入ip就能显示,我现在只会显示静态的图像。


QQ截图20190220113028.jpg



回复 支持 反对

使用道具 举报

47

主题

3404

回帖

30

蝴蝶豆

版主

最后登录
2020-12-7
发表于 2016-12-12 19:20:47 | 显示全部楼层

回帖奖励 +1 ST金币

多谢分享。。学习了。。。
回复 支持 反对

使用道具 举报

10

主题

693

回帖

0

蝴蝶豆

金牌会员

最后登录
2018-6-15
发表于 2016-12-12 19:35:19 | 显示全部楼层

回帖奖励 +1 ST金币

谢谢分享                        
回复 支持 反对

使用道具 举报

64

主题

744

回帖

23

蝴蝶豆

实习版主

最后登录
2020-12-8
发表于 2016-12-12 19:35:33 | 显示全部楼层

回帖奖励 +1 ST金币


多谢分享。。学习了。。。
回复 支持 反对

使用道具 举报

6

主题

1026

回帖

7

蝴蝶豆

金牌会员

最后登录
2020-11-25
发表于 2016-12-12 19:43:22 | 显示全部楼层

回帖奖励 +1 ST金币

谢谢分享,学习
回复 支持 反对

使用道具 举报

29

主题

290

回帖

15

蝴蝶豆

论坛元老

最后登录
2020-12-3
发表于 2016-12-12 20:09:04 | 显示全部楼层

回帖奖励 +1 ST金币

谢谢分享,学习
回复 支持 反对

使用道具 举报

107

主题

812

回帖

5

蝴蝶豆

论坛元老

最后登录
2019-8-28
发表于 2016-12-12 21:29:51 | 显示全部楼层

回帖奖励 +1 ST金币

赞赞赞,32个赞
回复 支持 反对

使用道具 举报

59

主题

1666

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2016-12-13 08:23:56 | 显示全部楼层

回帖奖励 +1 ST金币

多谢分享。
回复 支持 反对

使用道具 举报

52

主题

3313

回帖

61

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2016-12-13 08:34:06 | 显示全部楼层

回帖奖励 +1 ST金币


赞赞赞,32个赞
回复 支持 反对

使用道具 举报

27

主题

1709

回帖

42

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-12-13 08:57:14 | 显示全部楼层

回帖奖励 +1 ST金币

多谢分享。。学习了。。。
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版