首页 > 转:【小作品】STM32无线WIFI视频小车制作剖析(下)

转:【小作品】STM32无线WIFI视频小车制作剖析(下)

转载于:http://blog.csdn.net/u012819339/article/details/50654764

 

实体作品请参看优酷视频。 

若以上链接点击无效请把该链接地址复制到浏览器地址栏 http://v.youku.com/v_show/id_XODYzODczNzQ4.html



说明: 

该作品为arvik于2014年下半年在学校实验室做的一个国家级大学生科技创新项目,大概花了两个多月课余时间完成。 

其实博客早在几个月前就写好了,一共3篇,后来发现第一篇丢失。本想补起来,却没有时间,且实际作品早已拆开,保留在学校“博物馆”,没办法重新试验了,就不补了。


本篇主要是代码,不多赘述,直接贴关键代码,代码不详细解释了,稍微花点功夫应该能看懂。

软件部分直接贴代码讲解,main函数如下,创建起始任务

static OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE];        //定义栈int main(void)
{BSP_Init(); OSInit(); OSTaskCreate(Task_LED,(void *)0, &startup_task_stk[STARTUP_TASK_STK_SIZE-1], STARTUP_TASK_PRIO); OSStart(); return 0; }

 

 

在Task_LED任务中:

#include "includes.h"#include "err.h"  
#include "lwip/init.h"
#include "etharp.h"
#include "udp.h" #include "tcp.h" #include "httpd.h" #include "stm32f10x.h" #include "OV7725.h" #include "Imag_App.h" #include "usart1.h" #include "SCCB.h" #include "Imag_App.h" OS_STK task_led2_stk[TASK_LED2_STK_SIZE]; OS_STK task_led3_stk[TASK_LED3_STK_SIZE]; extern volatile u8 Frame_Count; extern int UDP_task(); extern struct netif enc28j60; void Task_LED(void *p_arg) { (void)p_arg; OSTaskCreate(Task_LED3,(void *)0, &task_led3_stk[TASK_LED3_STK_SIZE-1], TASK_LED3_PRIO); OSTaskCreate(Task_LED2,(void *)0, &task_led2_stk[TASK_LED2_STK_SIZE-1], TASK_LED2_PRIO); while (1) //TCP定时器 { LED1( ON ); OSTimeDlyHMSM(0, 0,0,250); LED1( OFF); tcp_tmr(); OSTimeDlyHMSM(0, 0,0,250); tcp_tmr(); //每250ms调用一次 } } void Task_LED2(void *p_arg) //arp任务 { (void)p_arg; while(1) { LED2(ON); OSTimeDlyHMSM(0,0,5,0); etharp_tmr(); //每5s调用一次 LED2(OFF); OSTimeDlyHMSM(0,0,5,0); etharp_tmr(); //每5s调用一次 } } extern struct udp_pcb *UdpPcb; extern struct pbuf *p; extern Data OVdata; void Task_LED3(void *p_arg) { (void)p_arg; //摄像头 SCCB_GPIO_Configuration(); FIFO_GPIO_Configuration(); while(Ov7725_Init() != SUCCESS); VSYNC_Init(); Ov7725_vsync = 0; //LWIP初始化 UDP_task(); OSTimeDlyHMSM(0,0,0,100); //等待其他任务初始化完毕 // p = pbuf_alloc(PBUF_RAW,sizeof(OVdata),PBUF_RAM); // p->payload = (void *)(&OVdata); while(1) { ethernetif_input(&enc28j60); //轮询是否接收到数据 if( Ov7725_vsync == 2 ) { FIFO_PREPARE; /*FIFO准备*/ Get_imag_and_discor(); /*采集并显示*/ Ov7725_vsync = 0; Frame_Count++; /*帧计数器加1*/ } LED3(ON); OSTimeDlyHMSM(0,0,0,4); LED3(OFF); } }

 


相关资料阅读: 

LWIP协议请参看网上老衲五木的 lwip协议详解 

摄像头部分代码请参看野火的PDF教程,毕竟摄像头是直接用的野火的代码,同鞋们也可以用正点原子的代码(开源电子网)或奋斗论坛的代码,可到相关论坛收集相关资料。 

ucos-ii操作系统网上论坛有不少资料,也可在我的博客(http://blog.csdn.net/u012819339)查找相关内容。

酱紫,就介绍到这儿了。

转载于:https://www.cnblogs.com/tureno/articles/7173647.html

更多相关:

  • 因为函数参数是按值传递的,所以要想改变变量,必须传递地址。 二级指针实际上就是指针变量的地址,如果传递二级指针,函数声明必须写**。 (void**)&必须是本质上就是指针变量的地址才可以做这样的转换,并不是说把一个一级指针也可以转换,void**的本质是标识一个二级指针。 &data就是(默认数据类型 **)&data,(void...

  • 文章目录1. 解决问题2. 应用场景3. 实现如下:C++实现C语言实现4. 缺点 1. 解决问题 在工厂方法模式中,我们卖衣服。此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建,裤子有一个工厂专门创建,T恤有一个工厂专门创建。这样的方式保证了代码设计的开闭原则(对扩展开发,对修改关闭),解决了简单工厂模式中暴露的...

  • - (void)viewDidLoad {[super viewDidLoad];NSLog(@"我在玩手机");NSLog(@"手机没电了");[self chargeMyIphone:^{NSLog(@"出门逛街");}];NSLog(@"我在看电视"); }-(void)chargeMyIphone:(void(^)(void...

  • http://stackoverflow.com/questions/150446/how-do-i-detect-when-someone-shakes-an-iphone 我的实现(基于Eran Talmor): 没必要application.applicationSupportsShakeToEdit = YES; Set th...

  • 关于点云的分割算是我想做的机械臂抓取中十分重要的俄一部分,所以首先学习如果使用点云库处理我用kinect获取的点云的数据,本例程也是我自己慢慢修改程序并结合官方API 的解说实现的,其中有很多细节如果直接更改源程序,可能会因为数据类型,或者头文件等各种原因编译不过,会导致我们比较难得找出其中的错误,首先我们看一下我自己设定的一个场景,...

  • /* 使用正态分布变换进行配准的实验 。其中room_scan1.pcd room_scan2.pcd这些点云包含同一房间360不同视角的扫描数据 */ #include #include #include #include

  • #include #include #include #include ...

  • #include #include #include #include #include #include...

  • #include #include #include #include int main (int argc,...

  • 文章目录描述函数成员及使用总结 我们上一篇描述关于C++多线程中的异步操作相关库( async和 promise),本节将分享c++标准库中最后一个多线程异步操作库 package_task的学习笔记。 描述 头文件 声明方式: template< class R, class ...Args > c...