找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1658|回复: 0
打印 上一主题 下一主题
收起左侧

一个基于STM32网络摄像头视频推送显示的项目PCB源程序

[复制链接]
跳转到指定楼层
楼主
这是一个基于STM32F103ZET6芯片的视频推送项,该项目已经用在了舞台,视频监控等项目上,是一个完整的工程。可以把网络摄像头等实时视频推送给大屏、矩阵等高清大屏。

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include <main.h>
  2. /************************************************

  3. ************************************************/

  4. //任务优先级
  5. #define START_TASK_PRIO                                3
  6. //任务堆栈大小        
  7. #define START_STK_SIZE                                 128
  8. //任务控制块
  9. OS_TCB StartTaskTCB;
  10. //任务堆栈        
  11. CPU_STK START_TASK_STK[START_STK_SIZE];
  12. //任务函数
  13. void start_task(void *p_arg);

  14. //TOUCH任务
  15. //设置任务优先级
  16. #define TOUCH_TASK_PRIO                                6
  17. //任务堆栈大小
  18. #define TOUCH_STK_SIZE                                128
  19. //任务控制块
  20. OS_TCB TouchTaskTCB;
  21. //任务堆栈
  22. CPU_STK TOUCH_TASK_STK[TOUCH_STK_SIZE];
  23. //touch任务
  24. void touch_task(void *p_arg);

  25. //LED0任务
  26. //设置任务优先级
  27. #define LED0_TASK_PRIO                                 8
  28. //任务堆栈大小
  29. #define LED0_STK_SIZE                                128
  30. //任务控制块
  31. OS_TCB Led0TaskTCB;
  32. //任务堆栈
  33. CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
  34. //led0任务
  35. void led0_task(void *p_arg);

  36. //字库更新任务
  37. //设置任务优先级
  38. #define FONTUPDATA_TASK_PRIO                7
  39. //任务堆栈大小
  40. #define FONTUPDATA_STK_SIZE                        512
  41. //任务控制块
  42. OS_TCB FontupdataTaskTCB;
  43. //任务堆栈
  44. CPU_STK FONTUPDATA_TASK_STK[FONTUPDATA_STK_SIZE];
  45. //字库更新任务
  46. void fontupdata_task(void *p_arg);

  47. //EMWINDEMO任务
  48. //设置任务优先级
  49. #define EMWINDEMO_TASK_PRIO                        5
  50. //任务堆栈大小
  51. #define EMWINDEMO_STK_SIZE                        2048
  52. //任务控制块
  53. OS_TCB EmwindemoTaskTCB;
  54. //任务堆栈
  55. CPU_STK EMWINDEMO_TASK_STK[EMWINDEMO_STK_SIZE];
  56. //emwindemo_task任务
  57. void emwindemo_task(void *p_arg);

  58. ////////////////////////////////////////////////////////
  59. //看门狗任务
  60. //设置任务优先级
  61. #define DOG_TASK_PRIO                        4
  62. //任务堆栈大小
  63. #define DOG_STK_SIZE                        128
  64. //任务控制块
  65. OS_TCB DogTaskTCB;
  66. //任务堆栈
  67. CPU_STK DOG_TASK_STK[DOG_STK_SIZE];
  68. //DOG_task任务
  69. void dog_task(void *p_arg);

  70. ////////////////////////////////////////////////////////

  71. int main(void)
  72. {        
  73.         OS_ERR err;
  74.         CPU_SR_ALLOC();
  75.         
  76.         delay_init();                    //延时函数初始化         
  77.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  78.         uart_init(115200);                 //串口初始化为115200
  79.         USART2_Init(36,9600);        //初始化串口2为:9600,波特率.
  80.          LED_Init();                            //LED端口初始化
  81.         TFTLCD_Init();                        //LCD初始化        
  82.         KEY_Init();                                 //按键初始化
  83.         BEEP_Init();                        //初始化蜂鸣器
  84.         FSMC_SRAM_Init();                //初始化SRAM
  85.         my_mem_init(SRAMIN);         //初始化内部内存池
  86.         my_mem_init(SRAMEX);          //初始化外部内存池        
  87.         exfuns_init();                        //为fatfs文件系统分配内存
  88.         f_mount(fs[0],"0:",1);        //挂载SD卡
  89.         f_mount(fs[1],"1:",1);        //挂载FLASH
  90.    
  91.         while(font_init())                //初始化字库
  92.         {
  93.                 LCD_ShowString(30,70,200,16,16,"Font Error!");
  94.                 while(SD_Init())        //检测SD卡
  95.                 {
  96.                         LCD_ShowString(30,90,200,16,16,"SD Card Failed!");
  97.                         delay_ms(200);
  98.                         LCD_Fill(30,90,200+30,70+16,WHITE);
  99.                         delay_ms(200);                    
  100.                 }
  101.                 update_font(30,90,16,"0:");        //如果字库不存在就更新字库
  102.                 delay_ms(2000);
  103.                 LCD_Clear(WHITE);        //清屏
  104.                 break;
  105.         }
  106.         TP_Init();                                //触摸屏初始化        
  107.         //IWDG_Init(6,625);            //与分频数为256,重载值为625,溢出时间为4s        
  108.         IWDG_Init(5,625);            //与分频数为128,重载值为625,溢出时间为2s        
  109.         OSInit(&err);                        //初始化UCOSIII
  110.         OS_CRITICAL_ENTER();        //进入临界区
  111.         //创建开始任务
  112.         OSTaskCreate((OS_TCB         * )&StartTaskTCB,                //任务控制块
  113.                                        (CPU_CHAR        * )"start task",                 //任务名字
  114.                                                          (OS_TASK_PTR )start_task,                         //任务函数
  115.                                                          (void                * )0,                                        //传递给任务函数的参数
  116.                                                          (OS_PRIO          )START_TASK_PRIO,     //任务优先级
  117.                                                          (CPU_STK   * )&START_TASK_STK[0],        //任务堆栈基地址
  118.                                                          (CPU_STK_SIZE)START_STK_SIZE/10,        //任务堆栈深度限位
  119.                                                          (CPU_STK_SIZE)START_STK_SIZE,                //任务堆栈大小
  120.                                                          (OS_MSG_QTY  )0,                                        //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息, 要定义宏OS_CFG_TASK_Q_EN>0,才可以使用这个内部的消息队列
  121.                                                          (OS_TICK          )0,                                        //当使能时间片轮转时用来设置任务的时间片长度,为0时为默认长度,默认长度为时钟节拍除以10        使能时间片轮转调度需要将OS_CFG_SCHED_ROUND_ROBIN_EN定义为1
  122.                                                          (void           * )0,                                        //用户补充的存储区
  123.                                                          (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项   指定允许检测该任务的堆栈,指定清除该任务的堆栈
  124.                                                          (OS_ERR         * )&err);                                //存放该函数错误时的返回值
  125.         OS_CRITICAL_EXIT();        //退出临界区         
  126.         OSStart(&err);  //开启UCOSIII
  127.         while(1);
  128. }

  129. //开始任务函数
  130. void start_task(void *p_arg)
  131. {
  132.         OS_ERR err;
  133.         CPU_SR_ALLOC();
  134.         p_arg = p_arg;

  135.         CPU_Init();
  136. #if OS_CFG_STAT_TASK_EN > 0u
  137.    OSStatTaskCPUUsageInit(&err);          //统计任务               
  138. #endif
  139.         
  140. #ifdef CPU_CFG_INT_DIS_MEAS_EN                //如果使能了测量中断关闭时间
  141.     CPU_IntDisMeasMaxCurReset();        
  142. #endif

  143. #if        OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候
  144.          //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
  145.         OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
  146. #endif
  147.         OS_CRITICAL_ENTER();        //进入临界区
  148. //创建定时器1
  149.         OSTmrCreate((OS_TMR                *)&tmr1,                //定时器1
  150.                                                         (CPU_CHAR        *)"tmr1",                //定时器名字
  151.                                                         (OS_TICK         )8,                        //8*10=80ms  单次定时器的设置值
  152.                                                         (OS_TICK         ) 0,          //如果是单次定时器该值应该被设置为0
  153.                                                         (OS_OPT                 )OS_OPT_TMR_ONE_SHOT,         //单次定时器
  154.                                                         (OS_TMR_CALLBACK_PTR)tmr1_callback,//定时器1回调函数
  155.                                                         (void            *)0,                        //参数为0
  156.                                                         (OS_ERR            *)&err);                //返回的错误码
  157.         
  158.         
  159.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE);//开启CRC时钟
  160.         GUI_Init();                          //STemWin初始化
  161.         
  162.                 //STemWin Demo任务        
  163.         OSTaskCreate((OS_TCB*     )&EmwindemoTaskTCB,               
  164.                                  (CPU_CHAR*   )"Emwindemo task",                 
  165.                  (OS_TASK_PTR )emwindemo_task,                        
  166.                  (void*       )0,                                       
  167.                  (OS_PRIO          )EMWINDEMO_TASK_PRIO,     
  168.                  (CPU_STK*    )&EMWINDEMO_TASK_STK[0],        
  169.                  (CPU_STK_SIZE)EMWINDEMO_STK_SIZE/10,        
  170.                  (CPU_STK_SIZE)EMWINDEMO_STK_SIZE,               
  171.                  (OS_MSG_QTY  )TASK_Q_NUM,                //任务Msgdis_task需要使用内建消息队列,消息队列长度为2                                                
  172.                  (OS_TICK          )0,                                          
  173.                  (void*       )0,                                       
  174.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  175.                  (OS_ERR*     )&err);
  176.         //触摸屏任务
  177.         OSTaskCreate((OS_TCB*     )&TouchTaskTCB,               
  178.                                  (CPU_CHAR*   )"Touch task",                 
  179.                  (OS_TASK_PTR )touch_task,                        
  180.                  (void*       )0,                                       
  181.                  (OS_PRIO          )TOUCH_TASK_PRIO,     
  182.                  (CPU_STK*    )&TOUCH_TASK_STK[0],        
  183.                  (CPU_STK_SIZE)TOUCH_STK_SIZE/10,        
  184.                  (CPU_STK_SIZE)TOUCH_STK_SIZE,               
  185.                  (OS_MSG_QTY  )0,                                       
  186.                  (OS_TICK          )0,                                          
  187.                  (void*       )0,                                       
  188.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  189.                  (OS_ERR*     )&err);                        
  190.         //LED0任务
  191.         OSTaskCreate((OS_TCB*     )&Led0TaskTCB,               
  192.                                  (CPU_CHAR*   )"Led0 task",                 
  193.                  (OS_TASK_PTR )led0_task,                        
  194.                  (void*       )0,                                       
  195.                  (OS_PRIO          )LED0_TASK_PRIO,     
  196.                  (CPU_STK*    )&LED0_TASK_STK[0],        
  197.                  (CPU_STK_SIZE)LED0_STK_SIZE/10,        
  198.                  (CPU_STK_SIZE)LED0_STK_SIZE,               
  199.                  (OS_MSG_QTY  )0,                                       
  200.                  (OS_TICK          )0,                                          
  201.                  (void*       )0,                                       
  202.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  203.                  (OS_ERR*     )&err);
  204.         //字库更新任务
  205.         OSTaskCreate((OS_TCB*     )&FontupdataTaskTCB,               
  206.                                  (CPU_CHAR*   )"Fontupdata task",                 
  207.                  (OS_TASK_PTR )fontupdata_task,                        
  208.                  (void*       )0,                                       
  209.                  (OS_PRIO          )FONTUPDATA_TASK_PRIO,     
  210.                  (CPU_STK*    )&FONTUPDATA_TASK_STK[0],        
  211.                  (CPU_STK_SIZE)FONTUPDATA_STK_SIZE/10,        
  212.                  (CPU_STK_SIZE)FONTUPDATA_STK_SIZE,               
  213.                  (OS_MSG_QTY  )0,                                       
  214.                  (OS_TICK          )0,                                          
  215.                  (void*       )0,                                       
  216.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  217.                  (OS_ERR*     )&err);
  218.         //看门狗任务
  219.         OSTaskCreate((OS_TCB*     )&DogTaskTCB,               
  220.                                  (CPU_CHAR*   )"dog_task",                 
  221.                  (OS_TASK_PTR )dog_task,                        
  222.                  (void*       )0,                                       
  223.                  (OS_PRIO          )DOG_TASK_PRIO,     
  224.                  (CPU_STK*    )&DOG_TASK_STK[0],        
  225.                  (CPU_STK_SIZE)DOG_STK_SIZE/10,        
  226.                  (CPU_STK_SIZE)DOG_STK_SIZE,               
  227.                  (OS_MSG_QTY  )0,                                       
  228.                  (OS_TICK          )0,                                          
  229.                  (void*       )0,                                       
  230.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  231.                  (OS_ERR*     )&err);                                                         
  232.                                                                  
  233.         OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);                //挂起开始任务                        
  234.         OS_CRITICAL_EXIT();        //退出临界区
  235. }

  236. //EMWINDEMO任务
  237. void emwindemo_task(void *p_arg)
  238. {  
  239.         GUI_CURSOR_Show();
  240.         //更换皮肤
  241.         //BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX); //BUTTON不能换肤,换肤后按钮就不能再改变颜色了
  242.         CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
  243.         DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
  244.         FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
  245.         HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
  246.         MENU_SetDefaultSkin(MENU_SKIN_FLEX);
  247.         MULTIPAGE_SetDefaultSkin(MULTIPAGE_SKIN_FLEX);
  248.         PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
  249.         RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
  250.         SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
  251.         SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
  252.         SPINBOX_SetDefaultSkin(SPINBOX_SKIN_FLEX);
  253.                
  254.   WM_SetCreateFlags(WM_CF_MEMDEV);
  255.         windows();        
  256.         while(1)
  257.         {
  258.     GUI_Delay(10);  //GUI_Delay()是emwin自带的,移植的时候也是怼OSTimeDly的简单封装!但是GUI_Delay()不单单是延时,他也会重绘无效化区域!OSTimeDly是UCOS的延时,肯定是会引起任务调度的
  259.         }
  260. }

  261. //字库更新任务
  262. //KEY_UP键长按2s更新字库
  263. void fontupdata_task(void *pdata)
  264. {
  265.         OS_ERR err;
  266.         while(1)
  267.         {
  268.                 if(WK_UP == 1)                                //KEY_UP键按下
  269.                 {
  270.                         OSTimeDlyHMSM(0,0,2,0,OS_OPT_TIME_PERIODIC,&err);//延时2s
  271.                         if(WK_UP == 1)                        //还是KEY_UP键
  272.                         {
  273.                                 LCD_Clear(WHITE);
  274.                                 OSSchedLock(&err);                //调度器上锁
  275.                                 LCD_ShowString(10,50,250,30,16,"Font Updataing,Please Wait...");
  276.                                 update_font(10,70,16,"0:");//更新字库
  277.                                 LCD_Clear(WHITE);
  278.                                 POINT_COLOR = RED;
  279.                                 LCD_ShowString(10,50,280,30,16,"Font Updata finshed,Please Restart!");
  280.                                 OSSchedUnlock(&err);        //调度器解锁
  281.                         }
  282.                 }
  283.                 OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err);//延时10ms
  284. ……………………

  285. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
视频推送项目.7z (4.16 MB, 下载次数: 43)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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