找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1037|回复: 0
收起左侧

对于stm32与ov7670上位机交互程序

[复制链接]
ID:1052992 发表于 2022-11-22 10:27 | 显示全部楼层 |阅读模式
使用正点原子的stm32 Mini板实现  ov7670与电脑上位机进行通讯。
从而实现电脑上位机上看到ov7670的传输图片,然后进行其他的算法处理。

单片机源程序如下:
  1. #include "sys.h"
  2. #include "usart.h"
  3. #include "delay.h"
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "usmart.h"
  7. #include "ov7670.h"
  8. #include "exti.h"
  9. #include "timer.h"

  10. int freq_mul = 15;
  11. extern u8 ov_sta;
  12. extern u32 ov_frame;
  13. u8 CanSend = 0;

  14. void pixels()
  15. {
  16.         u16 count = 0;
  17.         u16 color;
  18.         __asm
  19.         {
  20.                 mov  r6, #320
  21.                 mov  r7, #240
  22.                 mul  r7, r6
  23.                 mov  r3, 0
  24.                 mov  r5, 1
  25.                 mov  r1, #0x0c00
  26.                 movt r1, #0x4001
  27.                 mov  r2, #0x0184
  28.                 movt r2, #0x4221
  29.                 mov  r8, #0x1010
  30.                 movt r8, #0x4001
  31.                 mov  r9,  #0x88888888
  32.                 mov  r10, #0x33333333
  33.                 mov  r11, #0x100
  34.                 mov  r12, #0x200
  35.                 mov  r0, #0x280
  36.                 mov  r6, 0
  37.                 again:
  38.                 str  r9, [r1]                   //GPIOB->CRL=0X88888888;
  39.                 str  r3, [r2]                   // OV7670->RCK = 0;
  40.                 ldrb r4, [r1, 0x8]              // r4 = GPIOB->IDR;
  41.                 str  r5, [r2]                   // OV7670->RCK = 1;
  42.                 str  r3, [r2]                   // OV7670->RCK = 0;
  43.                 ldrb r6, [r1, 0x8]              // r6 = GPIOB->IDR;
  44.                 str  r5, [r2]                   // OV7670->RCK = 1;
  45.                 str  r10, [r1]                  //GPIOB->CRL=0X33333333;
  46.                 add  r6, r4, LSL #8             // r6+=(r4<<8)
  47.                 mov color,r6
  48.         }

  49.         USART1->DR = color>>8;
  50.         while((USART1->SR&0X40)==0);
  51.         USART1->DR = (color&0x00ff);
  52.         while((USART1->SR&0X40)==0);        //发送数据
  53. //        if(count < 320) count++;   
  54. //        else
  55. //        {
  56. //                count = 0;
  57. //                printf("\r\n");
  58. //        }
  59.         __asm
  60.         {
  61.                 mov  r6,color
  62.                 str  r11, [r8]                  // LCD_RS_SET
  63.                 str  r12, [r8, 4]               // LCD_CS_CLR
  64.                 str  r6, [r1, 0xc]              // GPIOB->ODR = data
  65.                 mov  r4, #0x080
  66.                 str  r4, [r8, 4]                // LCD_WR_CLR
  67.                 str  r0, [r8]                   // LCD_WR_SET, LCD_CS_SET
  68.                 sub  r7, r7, 1                  // count down
  69.                 cmp  r7, r3
  70.                 bne  again;
  71.         }
  72. }

  73. void camera_refresh(void)
  74. {

  75.         if(ov_sta >= 0)
  76.         {
  77.                 LCD_Scan_Dir(U2D_L2R);                    //从上到下,从左到右
  78.                 LCD_SetCursor(0x00,0x0000);            //设置光标位置
  79.                 LCD_WriteRAM_Prepare();         //开始写入GRAM
  80.                 OV7670_CS=0;
  81.                 OV7670_RRST=0;                                    //开始复位读指针
  82.                 OV7670_RCK=0;
  83.                 OV7670_RCK=1;
  84.                 OV7670_RCK=0;
  85.                 OV7670_RRST=1;                                    //复位读指针结束
  86.                 OV7670_RCK=1;

  87.                 pixels();
  88.                 OV7670_CS=1;
  89.                 OV7670_RCK=0;
  90.                 OV7670_RCK=1;
  91.                 EXTI->PR=1<<15;                         //清除LINE8上的中断标志位
  92.                 ov_sta=0;                                            //开始下一次采集
  93.                 ov_frame++;
  94.                 LCD_Scan_Dir(DFT_SCAN_DIR);            //恢复默认扫描方向
  95.         }
  96. }
  97. int main(void)
  98. {
  99.         u8 i;

  100.         Stm32_Clock_Init(freq_mul);                //系统时钟设置

  101.         uart_init(72,345600 * 9 / freq_mul);//串口初始化为9600

  102.         delay_init(72);                                        //延时初始化
  103.         LED_Init();                                              //初始化与LED连接的硬件接口
  104.         LCD_Init();                                               //初始化LCD
  105.         POINT_COLOR=RED;                    //设置字体为红色
  106.         LCD_ShowString(0,0,200,200,16,"OV7670 Init...");
  107.         while(OV7670_Init())                //初始化OV7670
  108.         {
  109.                 LCD_ShowString(0,0,200,200,16,"OV7670 Error!!");
  110.                 delay_ms(200);
  111.                 LCD_Fill(60,150,239,166,WHITE);
  112.                 delay_ms(200);
  113.         }
  114.         LCD_ShowString(0,0,200,200,16,"OV7670 Init OK");
  115.         delay_ms(1500);
  116.         TIM3_Int_Init(10000,7199);                        //TIM3,10Khz计数频率,1秒钟中断
  117.         EXTI15_Init();                                                //使能定时器捕获
  118.         OV7670_Window_Set(10,174,240,320);        //设置窗口
  119.         OV7670_CS=0;

  120.         while(1)
  121.         {
  122.         while(!CanSend)
  123.         {
  124.             delay_ms(100);
  125.             LCD_ShowString(0,0,200,200,16,"Pleas send 0x00 to me");
  126.         }
  127. //                printf("new pic\r\n");
  128.                 camera_refresh();                    //更新显示
  129. //                printf("end pic\r\n");
  130.         
  131.         CanSend = 0;
  132.         
  133.                 if(i!=ov_frame)                            //DS0闪烁.
  134.                 {
  135.                         i=ov_frame;
  136.                         LED0=!LED0;
  137.                 }
  138.         }
  139. }


复制代码
下载(此代码年代久远,采用的老版本的库和老版本Keil编写的):
(2017.09.16)串口图像上位机.7z (178.9 KB, 下载次数: 17)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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