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

本文介绍了一种基于STM32F100C8T6单片机的图像采集和传输系统。该系统通过OV2640摄像头模块捕获160x120分辨率的JPEG图像,并通过NRF24L01无线模块实现图像数据的无线传输。文章详细描述了硬件配置、软件流程及图像数据处理方法。

 

 视频采集端:

/*******************************************************************************
//
// 使用单片机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();//喂狗

  }
 
}

完整资料下载:

Stm32旧版库函数1-5合集-单片机文档类资源-CSDN下载

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fengyuzhe13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值