OpenEdv-开源电子网

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

stm32f7通信实验问题

[复制链接]

12

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1825
金钱
1825
注册时间
2017-9-7
在线时间
501 小时
发表于 2017-9-18 15:57:53 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 亦辰 于 2017-9-18 22:43 编辑

就是想参考摄像头实验  测下网口通信速率  在不用到摄像头模块的前提下  想请大佬指教下代码从哪方面改 (我c比较菜)

最佳答案

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

源代码主要是这个 //设置任务优先级 #define NETCAMERA_TASK_PRIO 2 //设置任务堆栈大小 #define NETCAMERA_STK_SIZE 1500 //任务堆栈 OS_STK NETCAMERA_TASK_STK[NETCAMERA_STK_SIZE]; //任务函数 void netcamera_task(void *pdata); struct netconn *newconn=0; //NET CAM TCP网络连接结构体指针 u32 *netcam_line_buf0; ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1825
金钱
1825
注册时间
2017-9-7
在线时间
501 小时
 楼主| 发表于 2017-9-18 15:57:54 | 显示全部楼层
源代码主要是这个


//设置任务优先级



#define NETCAMERA_TASK_PRIO                          2
//设置任务堆栈大小
#define NETCAMERA_STK_SIZE                              1500
//任务堆栈       
OS_STK NETCAMERA_TASK_STK[NETCAMERA_STK_SIZE];       
//任务函数
void netcamera_task(void *pdata);

                                       
struct netconn *newconn=0;                            //NET CAM TCP网络连接结构体指针
u32 *netcam_line_buf0;                                            //定义行缓存0  
u32 *netcam_line_buf1;                                            //定义行缓存1   

//NET CAM FIFO
vu16 netcamfifordpos=0;                                            //FIFO读位置
vu16 netcamfifowrpos=0;                                            //FIFO写位置
u32 *netcamfifobuf[NETCAM_FIFO_NUM];            //定义NETCAM_FIFO_SIZE个接收FIFO                       

//读取FIFO
//buf:数据缓存区首地址
//返回值:0,没有数据可读;
//      1,读到了1个数据块
u8 netcam_fifo_read(u32 **buf)
{
        if(netcamfifordpos==netcamfifowrpos)return 0;
        netcamfifordpos++;                //读位置加1
        if(netcamfifordpos>=NETCAM_FIFO_NUM)netcamfifordpos=0;//归零
        *buf=netcamfifobuf[netcamfifordpos];
        return 1;
}
//写一个FIFO
//buf:数据缓存区首地址
//返回值:0,写入成功;
//      1,写入失败
u8 netcam_fifo_write(u32 *buf)
{
        u16 i;
        u16 temp=netcamfifowrpos;        //记录当前写位置
        netcamfifowrpos++;                        //写位置加1
        if(netcamfifowrpos>=NETCAM_FIFO_NUM)netcamfifowrpos=0;//归零  
        if(netcamfifordpos==netcamfifowrpos)
        {
                netcamfifowrpos=temp;        //还原原来的写位置,此次写入失败
                //printf("shit:%d\r\n",temp);
                return 1;       
        }
        for(i=0;i<NETCAM_LINE_SIZE;i++)netcamfifobuf[netcamfifowrpos][i]=buf[i];//拷贝数据
        return 0;
}   


//相应变量的内存申请
//返回值:0 成功;其他 失败
u8 netmem_malloc(void)
{
    u16 t=0;
    netcam_line_buf0=mymalloc(SRAMIN,NETCAM_LINE_SIZE*4);
        netcam_line_buf1=mymalloc(SRAMIN,NETCAM_LINE_SIZE*4);

    //给FIFO申请内存
    for(t=0;t<NETCAM_FIFO_NUM;t++)
        {
                netcamfifobuf[t]=mymalloc(SRAMEX,NETCAM_LINE_SIZE*4);
        }  
    if(!netcamfifobuf[NETCAM_FIFO_NUM-1]||!netcam_line_buf1||!netcam_line_buf0)//内存申请失败  
    {
        netmem_free();//释放内存
        return 1;
    }
    return 0;
}

//相应变量的内存释放
void netmem_free(void)
{
    u16 t=0;
    myfree(SRAMIN,netcam_line_buf0);
    myfree(SRAMIN,netcam_line_buf1);
    //释放FIFO的内存
    for(t=0;t<NETCAM_FIFO_NUM;t++)
        {
        myfree(SRAMEX,netcamfifobuf[t]);
        }  
}

//设置网络摄像头分辨率
//resol: 0,320*240
//      1,640*480
//      3,1024*768
//      4,1280*800
void netcam_resolu_set(u8 resol)
{
    switch(resol)
    {
        case 0:
            OV5640_OutSize_Set(16,4,320,240);       
            break;
        case 1:
            OV5640_OutSize_Set(16,4,640,480);       
            break;
        case 2:
            OV5640_OutSize_Set(16,4,1024,768);       
            break;
        case 3:
            OV5640_OutSize_Set(16,4,1280,800);       
            break;
        default:
            OV5640_OutSize_Set(16,4,1280,800);        //默认为1280*800
            break;               
    }
}   
   
//摄像头jpeg数据接收回调函数
static void netcam_dcmi_rx_callback(void)
{   
        if(DMA2_Stream1->CR&(1<<19))netcam_fifo_write(netcam_line_buf0);        //netcam_line_buf0写入FIFO
        else netcam_fifo_write(netcam_line_buf1);                                                        //netcam_line_buf1写入FIFO
}


//网络摄像头初始化
u8 camera_init(void)
{
    u8 rval=0;
   
    netmem_malloc();//申请内存
    //配置OV5640
    if(OV5640_Init())            //初始化OV5640
        {
                printf("ov5640 error\r\n");
                delay_ms(500);  
        rval=1;
        }  
    if(rval==0)
    {
        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_rx_callback=netcam_dcmi_rx_callback;//JPEG接收数据回调函数
        DCMI_DMA_Init((u32)netcam_line_buf0,(u32)netcam_line_buf1,NETCAM_LINE_SIZE,DMA_MDATAALIGN_WORD,DMA_MINC_ENABLE);  
        OV5640_JPEG_Mode();                //JPEG模式
        //改为15帧
//        OV5640_WR_Reg(0X3035,0X11);
//        OV5640_WR_Reg(0x3824,0X04);
//        OV5640_ImageWin_Set(0,0,1280,800);

        OV5640_OutSize_Set(16,4,1280,800);                //设置输出尺寸(1280*800)  
        printf("开启DCMI\r\n");
        DCMI_Start();                 //启动传输         
        delay_ms(100);
        printf("初始化完成\r\n");
    }
    return rval;
}

//网络摄像头复位
void camera_deinit(void)
{
    netmem_free();      //释放内存
    netcamfifordpos=0;  //读位置清零
    netcamfifowrpos=0;  //写位置清零
    DCMI_Stop();        //关闭传输
    HAL_DCMI_DeInit(&DCMI_Handler); //复位DCMI
    HAL_DMA_DeInit(&DMADMCI_Handler);//复位DMA
}
   
//网络摄像头任务
void netcamera_task(void *arg)
{
        err_t err;
        struct netconn *conn;
    static ip_addr_t ipaddr;
    u8 remot_addr[4];
        static u16_t port;
   
    u8 res=0;
        u32 *tbuf;
   
        LWIP_UNUSED_ARG(arg);

        conn = netconn_new(NETCONN_TCP);  //创建一个TCP链接
        netconn_bind(conn,IP_ADDR_ANY,8088);  //绑定端口 8088号端口
        netconn_listen(conn);                  //进入监听模式
    while(1)    //等待连接
    {
        err=netconn_accept(conn,&newconn);  //接收连接请求
        if(err==ERR_OK) //成功检测到连接
        {
            netconn_getaddr(newconn,&ipaddr,&port,0); //获取远端IP地址和端口号
            remot_addr[3]=(uint8_t)(ipaddr.addr>>24);
            remot_addr[2]=(uint8_t)(ipaddr.addr>>16);
            remot_addr[1]=(uint8_t)(ipaddr.addr>>8);
            remot_addr[0]=(uint8_t)(ipaddr.addr);
            printf("主机%d.%d.%d.%d连接上网络摄像头服务器,主机端口号为:%d\r\n",\
                    remot_addr[0],remot_addr[1],remot_addr[2],remot_addr[3],port);
            camera_init();
            delay_ms(1000); //此延时一定要加!!
            while(1)        //开始视频传输
            {
                res=netcam_fifo_read(&tbuf);    //读取FIFO中的数据
                if(res)     //有数据要发送
                {
                    err=netconn_write(newconn,tbuf,NETCAM_LINE_SIZE*4,NETCONN_COPY);//发送数据
                    if((err==ERR_CLSD)||(err==ERR_RST))//关闭连接,或者重启网络
                    {
                        camera_deinit();//复位网络摄像头
                        netconn_close(newconn);
                        netconn_delete(newconn);
                        printf("主机:%d.%d.%d.%d断开与视频服务器的连接\r\n",\
                            remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3]);
                        break;
                    }                            
                }else
                {
                    OSTimeDlyHMSM(0,0,0,2);//延时2ms
                }       
            }
        }
    }
   
}

//创建网络摄像头线程
//返回值:0 创建成功
//                其他 创建失败
INT8U netcamera_init(void)
{
        INT8U res;
        OS_CPU_SR cpu_sr;

        OS_ENTER_CRITICAL();        //关中断
        res = OSTaskCreate(netcamera_task,(void*)0,(OS_STK*)&NETCAMERA_TASK_STK[NETCAMERA_STK_SIZE-1],NETCAMERA_TASK_PRIO); //创建网络摄像头线程
        OS_EXIT_CRITICAL();                //开中断
       
        return res;
}
回复

使用道具 举报

35

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
331
金钱
331
注册时间
2016-10-12
在线时间
53 小时
发表于 2017-9-18 18:57:06 | 显示全部楼层
居然没有内容,也是醉了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-18 10:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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