Stm32旧版库函数5——ov2640通过nrf24l01发送图像

news2024/11/17 7:20:06

 

 视频采集端:

/*******************************************************************************
//
// 使用单片机STM32F100C8T6     8
// 晶振:8.00M
// 编译环境 Keil uVision4
// 在3.3V的供电环境下,就能运行
// 波特率 115200
// 使用:STM32F100C8T6串口1连接电脑

*******************************************************************************/
#include "stm32f10x_lib.h"
#include "usart.h"
#include "delay.h"
#include "sys_config.h"
#include "dcmi_ov2640.h"
#include "nrf.h"

#define   uchar unsigned char
#define   uint unsigned int    

unsigned char TxBuf[32]=
{
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0
};
extern u8 TX_ADDRESS[TX_ADR_WIDTH];    //调用外部变量,必须声明!!!!!!!
extern u8 RX_ADDRESS[RX_ADR_WIDTH];

extern u32 JpegDataCnt;
extern u8 JpegBuffer[5120];
extern u8 VsyncActive;
OV2640_IDTypeDef OV2640_Camera_ID;

  /*
********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
** 输    入    : 无
** 输    出    : 无
** 返    回    : 无
********************************************************************************
*/
int main(void)
{
    u32 i=0;        
    //u8 m=0;
    RCC_Configuration();         //配置RCC
    USART1_Configuration();     //配置串口1
    Delay_Init(72);
    SPI_NRF_Init();
    NRF_Check();
    NRF_TX_Mode();
    OV2640_HW_Init();                    //IIC初始化
    OV2640_ReadID(&OV2640_Camera_ID);    //读取OV2640ID,测试硬件,依次为:0x7F,0xA2,0x26,0x42
    OV2640_JPEGConfig(JPEG_160x120);    //配置OV2640输出320*240像素的JPG图片

    OV2640_BrightnessConfig(0x20);
    OV2640_AutoExposure(2);

    OV2640_CaptureGpioInit();                //数据采集引脚初始化
    EXTI->IMR &= ~EXTI_Line8;                //关闭场同步中断
    EXTI->EMR &= ~EXTI_Line8;    
    
    EXTI->IMR &= ~EXTI_Line12;                //关闭像素同步中断
    EXTI->EMR &= ~EXTI_Line12;    
    
    Delay_nMS(10);                            //等待图像输出稳定
    EXTI->IMR |= EXTI_Line8;                //使能场同步中断,准备下次采集
    EXTI->EMR |= EXTI_Line8;
        
    while(1)
    {
        if(VsyncActive == 2)
        {
            //封帧格式为:0xAA CMD 0x55    
          while(JpegBuffer[JpegDataCnt]==0)     //将后边的无用的0去掉
            JpegDataCnt--;
          if(JpegBuffer[0]==0xff && JpegBuffer[1]==0xd8 && JpegBuffer[JpegDataCnt-1]==0xff && JpegBuffer[JpegDataCnt]==0xd9)
          {
            //n=JpegDataCnt/32+1;        //数据以32个为一组,进行分组            
            JpegDataCnt++;
            TxBuf[0]=JpegDataCnt>>8;
            TxBuf[1]=JpegDataCnt;
            NRF_Tx_Dat(TxBuf);
            Delay_nMS(10);
            //JpegDataCnt=JpegDataCnt+32;                      
            for(i = 0; i < JpegDataCnt; i=i+32)
               NRF_Tx_Dat(&JpegBuffer[i]);                    
              //Delay_nMS(5);
          }    
          else JpegDataCnt++ ;
          for(i=1;i<JpegDataCnt;i++)   //手动清除数组(在不加nrf24l01时,JpegBuffer[0]可以赋值为0,但是此时不能,待解决)
            JpegBuffer[i]=0;

            JpegDataCnt = 0;                        //JPEG计数器清零
            //Delay_nMS(5);
            EXTI->IMR |= EXTI_Line8;                //使能场同步中断,准备下次采集
            EXTI->EMR |= EXTI_Line8;            
            //VsyncCnt = 0;                //开始下一帧数据采集                
        }
    }   
}

接收端:

#include "stm32f10x_lib.h"
#include "sys_config.h"
#include "usart.h"
#include "nrf.h"
#include "delay.h"
#include "wdg.h"

extern u8 TX_ADDRESS[TX_ADR_WIDTH];    //调用外部变量,必须声明!!!!!!!
extern u8 RX_ADDRESS[RX_ADR_WIDTH];

extern u8 flag_usart;

#define   uchar unsigned char
#define   uint unsigned int    

u8 JpegBuffer[10240];

 void Delayms(vu32 m)
{
  u32 i;
  for(; m != 0; m--)    
       for (i=0; i<10000; i++);
}
u8 check_head(u8 *p)
{
  u8 i=2;
  while(p[i]==0)
  {
    if(i>30)
    {
      if(p[0]==0xff&&p[1]==0xd9)  return 0;
      else return 1;
    }
    else  i++;  
  }
  return 0;
}
int main(void)
{
  u8 rxbuf[32];
  u8 status,stat;
  u16 i,j, n,m;
  u8 first=1 ;

  RCC_Configuration();
  Delay_Init(72);
  USART1_Configuration();
  SPI_NRF_Init();
  status=NRF_Check();
  IWDG_Init(4,250);    //与分频数为64,重载值为250,溢出时间为0.4s

  status=0;
  NRF_RX_Mode();
  while(1)
  {
    while(stat!=1)
    {
      status=NRF_Rx_Dat(rxbuf);
      if(status==1)
      {
        if(check_head(rxbuf))
        {
          //不能用位移运算!m=rxbuf[0]<<8+rxbuf[1];
          m=rxbuf[0]*256+rxbuf[1];
          n=(m-1)/32 +1;        //分成n组数据
          stat=1;              
        }
      }
      //Delay_nUS(1);
    }
    stat=0;
    j=0;
    for(i=0;i<n;i++)
    {
      while(!NRF_Rx_Dat(&JpegBuffer[j])) ;
      j=j+32;
    }
    if(flag_usart==1||first==1)
    {
      for(i=0;i<m;i++)
         USART1_SendData(JpegBuffer[i]);      
      flag_usart=0;
      first=0;    
    }
    IWDG_Feed();//喂狗

  }
 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/82949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch(六)网络模型

文章目录Log一、现有网络模型的使用及修改1. VGG① ImageNet 数据集下载② 模型加载③ 模型改造a. 添加一个线性层b. 插入一个线性层c. 修改一个线性层二、网络模型的保存与读取① 网络模型的保存a. 保存方式一b. 保存方式二② 网络模型的读取a. 读取方式一b. 读取方式二三、完…

微信公众号服务号配置对接在线客服系统教程

如果只需要实现微信公众号的关注自动回复&#xff0c;关键词自动回复功能&#xff0c;普通订阅号就可以 当需要对接实现公众号的模板消息提醒&#xff0c;模板消息与客服端H5的对接&#xff0c;访客在微信点击或扫码时获取到微信的昵称头像&#xff0c;需要网页授权功能。这种是…

Spring(一):Spring核心与设计思想(IoC、DI)

目录一、Spring是什么1.1 容器是什么&#xff1f;1.2 什么是IoC&#xff1f;1.3 理解Spring IoC1.4 DI是什么一、Spring是什么 我们这里所说的Spring指的是SpringFrameWork&#xff0c;是一个开源框架。Spring支持广泛的应用场景&#xff0c;它可以让Java企业级的应用程序开发…

k8s编程operator实战之云编码平台——②controller初步实现

文章目录1、工作空间镜像制作2、controller实现2.1 使用kubebuilder创建工程2.2 代码实现2.2.1 引入grpc2.2.2 实现CloudIdeServiceStatusInformer的实现CloudSpaceService定义方法CreateSpaceAndWaitForRunning方法GetPodSpaceInfo方法DeleteSpace方法GetPodSpaceStatus2.2.3 …

人才盘点的工具与方法有哪些?怎样做好人才盘点?

人才盘点是对组织和人才进行系统管理的一种流程。在此过程中&#xff0c;对组织架构、人员配比、人才绩效、关键岗位的继任计划、关键人才发展、关键岗位的招聘及关键人才的晋升和激励进行深入讨论&#xff0c;并制定详细的组织行动计划&#xff0c;确保组织以更加优化的结构和…

非零基础自学计算机操作系统 第1章 操作系统概述 1.5 操作系统的硬件环境 1.5.1 定时装置 1.5.2 堆与栈 1.5.3 寄存器

非零基础自学计算机操作系统 文章目录非零基础自学计算机操作系统第1章 操作系统概述1.5 操作系统的硬件环境1.5.1 定时装置1.5.2 堆与栈1.5.3 寄存器第1章 操作系统概述 1.5 操作系统的硬件环境 构建一个高效、可靠的操作系统&#xff0c;硬件需要提供哪些支持&#xff1f; 1…

MySQL数据库基本使用(一)-------登录及查看基本信息

1.MySQL登录命令 格式如下&#xff1a; mysql -h 主机名 -P 端口号 -u 用户名 -p密码例如&#xff1a; mysql -h localhost -P 3306 -u root -pabc123 # 这里我设置的root用户的密码是abc123注意&#xff1a; -p与密码之间不能有空格&#xff0c;其他参数名与参数值之间可以…

Spring Boot启动原理源码

Spring Boot启动原理源码 注意:这个springboot启动源码和springboot自动配置原理的源码是十分重要的,面试的时候要是问springboot,一般都会问这两个。 源码&#xff1a; SpringBoot 事假监听器发布顺序&#xff1a; 1.ApplicationStartingEvent 2.ApplicationEnvironmentPrepa…

springboot+mybatis配置多数据源实战

1.背景说明 2.配置多数据源步骤 2.1 项目结构变更 2.2 添加配置类 2.3 修改配置文件数据连接配置信息 1.背景说明一般一个项目中只会连接一个数据库.但是随着需求变更,会要求同一个项目中连接多个数据库,本文就讲一下如何在一个项目中对多…

usaco training刷怪旅 第一层第二题 Greedy Gift Givers

usaco training 关注我持续创作training题解 翻译有点奇葩&#xff0c;我就上原题目了&#xff0c;各位自己翻译吧QwQ A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts of money. Each of these friends might or might not give some m…

一种基于PCI总线的反射内存卡设计

一种基于PCI总线的反射内存卡设计 摘要&#xff1a; 对实时传输&#xff0c; 传统的以太网络由于传输协议开销的不确定性&#xff0c; 很难满足实时网络的要求&#xff0c; 实时网络是一种应用于高实时性要求的专用网络通信技术&#xff0c; 一般采用基于高速网络的共享存储器…

Python爬虫实战,requests+openpyxl模块,爬取小说数据并保存txt文档(附源码)

前言 今天给大家介绍的是Python爬取小说数据并保存txt文档&#xff0c;在这里给需要的小伙伴们代码&#xff0c;并且给出一点小心得。 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫&#xff0c;基本的是加请求头&#xff0c;但是这样的纯文本数据爬取的人会很多…

web网页设计与开发:基于HTML+CSS+JavaScript简单的个人博客网页制作期末作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

怎么让文字转换成语音?一步一步让你学会

在日常的生活中&#xff0c;我们经常会需要将文字转换成语音的情况&#xff0c;例如广告词、给文本配音等等&#xff0c;当然我们就简单的方法就是自己手动进行配音&#xff0c;但是如果没有专业的设备和配音环境&#xff0c;是很难配出很好的效果的&#xff0c;这该怎么办呢&a…

飞链云智能机器人-基于ChatGPT的有趣问答

最近ChatGPT火起来了&#xff1b; 可玩性很高&#xff0c;不亚于之前AI绘画的视觉冲击&#xff1b;这次ChatGPT带来的是逻辑冲击&#xff1b;上下文逻辑远超现有市面上其他所有的AI对话机器人&#xff1b; 有人用技巧训练ChatGPT&#xff0c;ChatGPT机器人宣言要毁灭人类&…

备战2023蓝桥国赛-传纸条

题目描述&#xff1a; 解析&#xff1a; 这道题想了我好久&#xff0c;一开始我是想假如只走一条路线&#xff0c;从(1,1)走到&#xff08;m,n&#xff09;&#xff0c;这种问题该怎么解决呢&#xff1f;针对这种问题我是设了dp[k][i][j]表示走了k步到达(i,j)的好心程度之和的…

[附源码]JAVA毕业设计迎宾酒店管理系统录屏(系统+LW)

[附源码]JAVA毕业设计迎宾酒店管理系统录屏&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

R语言中使用多重聚合预测算法(MAPA)进行时间序列分析

最近我们被客户要求撰写关于时间序列分析的研究报告&#xff0c;包括一些图形和统计输出。这是一个简短的演示&#xff0c;可以使用该代码进行操作。使用MAPA生成预测。 > mapasimple(admissions)t1 t2 t3 t4 t5 t6 t7 t8 t9 t…

ElasticsearchRestTemplate 和ElasticsearchRepository 的使用

操作ElasticSearch的数据&#xff0c;有两种方式一种是 ElasticsearchRepository 接口&#xff0c;另一种是ElasticsearchTemplate接口 SpringData对ES的封装ElasticsearchRestTemplate类&#xff0c;可直接使用&#xff0c;此类在ElasticsearchRestTemplate基础上进行性一定程…

Kibana:使用 Maps 来显示分布式的团队

在我之前的文章 “Kibana&#xff1a;如何在 Maps 应用中显示图片提示” 里&#xff0c;我展示了如何在 Kibana 中使用图片来展示一个图片的提示。这个在很多情况下是非常有用的&#xff0c;比如在疫情发生期间&#xff0c;我可以通过点击地图上的点来查看发生疫情人员的详细情…