请选择 进入手机版 | 继续访问电脑版
快捷导航
56 338

机器人玩转别踩白块

alsk0017 于 2017-12-24 16:32 发表在 [开源项目] [复制链接]
   项目名:机器人玩转别踩白块


小组成员:alsk0017、#何进、wangchenchen、cao1147、stars、钟治强123


  基础功能说明
           1、摄像头:采集图片,并将所采集的图片传到处理器上
           2、处理器:处理图片,并发出指令
           3、机械臂:接受处理器所发出的指令,做出相应的动作

设备
     摄像头:ov7670摄像头
     处理器:开发板
     机械臂:电磁铁、电容笔

整体框架:                  


资金说明
        集资购买:摄像头、机械臂
                      实验室已有:开发板

   工期:2017.12.25——2018.1.14




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

赞同: 5.0
anymsg 赞同: 5
  发表于 2018-1-11 09:13
Connecting & Messaging from Any.

共 56 个关于本帖的回复 最后回复于 2018-1-11 20:15

alsk0017 注册会员 发表于 2017-12-24 16:33:48 | 显示全部楼层
本帖最后由 alsk0017 于 2018-1-6 17:27 编辑

沙发用以通知通知:每周周末将自己在这一周所做的事情在论坛上发出来。和当日的帖子分开发。

Connecting & Messaging from Any.
举报 使用道具
alsk0017 注册会员 发表于 2018-1-11 20:15:31 | 显示全部楼层
今天,整合项目,将图像处理和分析的代码进行了封装并加上了变量控制。
明天,接着整合项目。
Connecting & Messaging from Any.
举报 使用道具
alsk0017 注册会员 发表于 2018-1-9 22:38:03 | 显示全部楼层
今天,编写了与机械臂部分联合的代码,进行了M7开发板上的引脚配置。
明天,整合图像采集和图像处理和分析部分。
2018/1/9
Connecting & Messaging from Any.
举报 使用道具
stars 注册会员 发表于 2018-1-9 20:36:10 | 显示全部楼层
2018/01/09
开始通电后,电容笔与电磁铁会产生一些斥力。它俩就没法相吸,按复位键后,相吸,松开,向下移动,就回不去了。后来发现是弹簧的原因。弹簧没有安置好,就会出现问题,很难达到点击效果。
Connecting & Messaging from Any.
举报 使用道具
#何进 注册会员 发表于 2018-1-9 20:13:12 | 显示全部楼层

今天:终于将摄像头配置好了,能够显示图像了,今天遇到了好几个问题
1.图像显示不出来,一直黑屏
2.图像显示为花屏,如下图所示
C:\Users\Administrator\Desktop\上传图片\index.png
可以看到物体很清晰的棱廓,但是颜色很乱
如果花屏的具体表现是图像不断变换,没有规律,通常有可能是数据接收的触发边沿有误,导致没有正确的接收数据

解决方案:
问题一:dcmi的时钟极性配置错误,导致数据未接受,如下,是我的寄存器配置与dcmi配置
1.
  1. const u8 ov7670_init_reg_tbl[][2]=
  2. {         
  3.          {0x3a, 0x0C},
  4.         {0x40, 0xd0},
  5.         {0x12, 0x14}, //COM7
  6.         {0x32, 0x80},
  7.         {0x17, 0x16},
  8.         {0x18, 0x04},
  9.         {0x19, 0x02},
  10.         {0x1a, 0x7a},//0x7a,
  11.         {0x03, 0x05},//0x0a,                
  12.         {0x0c, 0x00},
  13.         {0x3e, 0x00},//
  14.         {0x70, 0x00},
  15.         {0x71, 0x01},
  16.         {0x72, 0x11},
  17.         {0x73, 0x00},//
  18.         {0xa2, 0x02},
  19.         {0x11, 0x81},
  20.         {0x7a, 0x20},
  21.         {0x7b, 0x1c},
  22.         {0x7c, 0x28},
  23.         {0x7d, 0x3c},
  24.         {0x7e, 0x55},
  25.         {0x7f, 0x68},
  26.         {0x80, 0x76},
  27.         {0x81, 0x80},
  28.         {0x82, 0x88},
  29.         {0x83, 0x8f},
  30.         {0x84, 0x96},
  31.         {0x85, 0xa3},
  32.         {0x86, 0xaf},
  33.         {0x87, 0xc4},
  34.         {0x88, 0xd7},
  35.         {0x89, 0xe8},
  36.         {0x13, 0xe0},
  37.         {0x00, 0x00},//AGC
  38.         {0x10, 0x00},
  39.         {0x0d, 0x00},
  40.         {0x14, 0x28},//0x38, limit the max gain
  41.         {0xa5, 0x05},
  42.         {0xab, 0x07},
  43.         {0x24, 0x75},
  44.         {0x25, 0x63},
  45.         {0x26, 0xA5},
  46.         {0x9f, 0x78},
  47.         {0xa0, 0x68},
  48.         {0xa1, 0x03},//0x0b,
  49.         {0xa6, 0xdf},//0xd8,
  50.         {0xa7, 0xdf},//0xd8,
  51.         {0xa8, 0xf0},
  52.         {0xa9, 0x90},
  53.         {0xaa, 0x94},
  54.         {0x13, 0xe5},
  55.         {0x0e, 0x61},
  56.         {0x0f, 0x4b},
  57.         {0x16, 0x02},
  58.         {0x1e, 0x07},//0x07,
  59.         {0x21, 0x02},
  60.         {0x22, 0x91},
  61.         {0x29, 0x07},
  62.         {0x33, 0x0b},
  63.         {0x35, 0x0b},
  64.         {0x37, 0x1d},
  65.         {0x38, 0x71},
  66.         {0x39, 0x2a},
  67.         {0x3c, 0x78},
  68.         {0x4d, 0x40},
  69.         {0x4e, 0x20},
  70.         {0x69, 0x55},
  71.         {0x6b, 0x40},//PLL ÖØÒª²ÎÊý
  72.         {0x74, 0x19},
  73.         {0x8d, 0x4f},
  74.         {0x8e, 0x00},
  75.         {0x8f, 0x00},
  76.         {0x90, 0x00},
  77.         {0x91, 0x00},
  78.         {0x92, 0x00},//0x19,//0x66
  79.         {0x96, 0x00},
  80.         {0x9a, 0x80},
  81.         {0xb0, 0x84},
  82.         {0xb1, 0x0c},
  83.         {0xb2, 0x0e},
  84.         {0xb3, 0x82},
  85.         {0xb8, 0x0a},
  86.         {0x43, 0x14},
  87.         {0x44, 0xf0},
  88.         {0x45, 0x34},
  89.         {0x46, 0x58},
  90.         {0x47, 0x28},
  91.         {0x48, 0x3a},
  92.         {0x59, 0x88},
  93.         {0x5a, 0x88},
  94.         {0x5b, 0x44},
  95.         {0x5c, 0x67},
  96.         {0x5d, 0x49},
  97.         {0x5e, 0x0e},
  98.         {0x64, 0x04},
  99.         {0x65, 0x20},
  100.         {0x66, 0x05},
  101.         {0x94, 0x04},
  102.         {0x95, 0x08},
  103.         {0x6c, 0x0a},
  104.         {0x6d, 0x55},
  105.         {0x6e, 0x11},
  106.         {0x6f, 0x9f},//0x9e for advance AWB
  107.         {0x6a, 0x40},
  108.         {0x01, 0x40},
  109.         {0x02, 0x40},
  110.         {0x13, 0xe7},
  111.         {0x15, 0x08}, //ÖØÒª²ÎÊý
  112.         {0x4f, 0x80},
  113.         {0x50, 0x80},
  114.         {0x51, 0x00},
  115.         {0x52, 0x22},
  116.         {0x53, 0x5e},
  117.         {0x54, 0x80},
  118.         {0x55, 0x0A},//ÁÁ¶È
  119.         {0x56, 0x4f},//¶Ô±È¶È
  120.         {0x58, 0x9e},       
  121.         {0x41, 0x08},
  122.         {0x3f, 0x05},//±ßÔµÔöÇ¿µ÷Õû
  123.         {0x75, 0x05},
  124.         {0x76, 0xe1},
  125.         {0x4c, 0x0F},//ÔëÉùÒÖÖÆÇ¿¶È
  126.         {0x77, 0x0a},
  127.         {0x3d, 0xc2},//0xc0,
  128.         {0x4b, 0x09},
  129.         {0xc9, 0x60},
  130.         {0x41, 0x38},
  131.         {0x34, 0x11},
  132.         {0x3b, 0x02},//0x00,//0x02,
  133.         {0xa4, 0x89},//0x88,
  134.         {0x96, 0x00},
  135.         {0x97, 0x30},
  136.         {0x98, 0x20},
  137.         {0x99, 0x30},
  138.         {0x9a, 0x84},
  139.         {0x9b, 0x29},
  140.         {0x9c, 0x03},
  141.         {0x9d, 0x4c},
  142.         {0x9e, 0x3f},
  143.         {0x78, 0x04},       
  144.         {0x79, 0x01},
  145.         {0xc8, 0xf0},
  146.         {0x79, 0x0f},
  147.         {0xc8, 0x00},
  148.         {0x79, 0x10},
  149.         {0xc8, 0x7e},
  150.         {0x79, 0x0a},
  151.         {0xc8, 0x80},
  152.         {0x79, 0x0b},
  153.         {0xc8, 0x01},
  154.         {0x79, 0x0c},
  155.         {0xc8, 0x0f},
  156.         {0x79, 0x0d},
  157.         {0xc8, 0x20},
  158.         {0x79, 0x09},
  159.         {0xc8, 0x80},
  160.         {0x79, 0x02},
  161.         {0xc8, 0xc0},
  162.         {0x79, 0x03},
  163.         {0xc8, 0x40},
  164.         {0x79, 0x05},
  165.         {0xc8, 0x30},
  166.         {0x79, 0x26},
  167.         {0x09, 0x02},
  168.         {0x3b, 0x42},//0x82,//0xc0,//0xc2,        //night mode
  169. };
复制代码


dcmi:
  1. DCMI_Handle.Instance              = DCMI;   
  2.         DCMI_Handle.Init.SynchroMode      = DCMI_MODE_CONTINUOUS;
  3.         DCMI_Handle.Init.SynchroMode      = DCMI_SYNCHRO_HARDWARE;
  4.         DCMI_Handle.Init.PCKPolarity      = DCMI_PCKPOLARITY_RISING;//ÏñËØʱÖÓÔÚÉÏÉýÑز¶»ñ£¬Õâ¸öÅäÖò»ÕýÈ·£¬Äò»µ½ÓÐЧÊý¾Ý£¬»á»¨ÆÁ
  5.         DCMI_Handle.Init.VSPolarity       = DCMI_VSPOLARITY_HIGH;//Õâ¸öÅäÖò»ÕýÈ·£¬ÎÞ·¨½øÈëÖжϣ¬ÎÞ·¨ÓÃdma½øÐд«Êý¾Ý
  6.         DCMI_Handle.Init.HSPolarity       = DCMI_HSPOLARITY_LOW;//Õâ¸öÅäÖò»ÕýÈ·£¬Äò»µ½Êý¾Ý£¬»áÒ»Ö±ºÚÆÁ£¬¿ÉÒÔ½øÈëdmaÖжÏ
  7.         DCMI_Handle.Init.CaptureRate      = DCMI_CR_ALL_FRAME;
  8.         DCMI_Handle.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
复制代码


问题二:
花屏有多种原因:
显示的数据是完全的花屏,或者可以看出物体大致轮廓,但颜色完全不对,例如一片绿色。这种情况往往是因为图像数据格式不匹配,例如没有处理YUV2RGB,YUV的各个分量采样顺序与软件计算的取值顺序不匹配等
    如果花屏的具体表现是图像不断变换,没有规律,通常有可能是数据接收的触发边沿有误,导致没有正确的接收数据。
很明显十六位的RGB数据高8位和低8位反了。出现这个现象有两个原因:
读取IO口数据的时候读反了

上传一张显示图像
C:\Users\Administrator\Desktop\上传图片\QQ图片20180109200759.jpg


Connecting & Messaging from Any.
举报 使用道具
wangchenchen 注册会员 发表于 2018-1-9 08:14:23 | 显示全部楼层
2018/1/8
今天看了如何在LCD上显示帧率的部分,使用基本定时器 TIM6 来统计帧率,也就是 1 秒钟中断一次,打印 ov_frame
的值, ov_frame 用于统计 LCD 帧率。
Connecting & Messaging from Any.
举报 使用道具
alsk0017 注册会员 发表于 2018-1-8 22:55:23 | 显示全部楼层
今天,编写STM32F7开发板的LCD_CLK时钟配置和LCD屏幕按坐标点上色的代码。
明天,继续配置LCD屏幕代码。
2018/1/8
Connecting & Messaging from Any.
举报 使用道具
#何进 注册会员 发表于 2018-1-8 21:13:45 | 显示全部楼层
#何进 发表于 2018-1-8 21:11
2018.1.6:配置摄像头的时钟,xclk连接pa8引脚,pa8可以输出mco1时钟,所以只需要配置mco1即可,明天上传 ...
  1. DCMI_Handle.Instance              = DCMI;   
  2.         //DCMI_Handle.Init.SynchroMode      = DCMI_MODE_CONTINUOUS;
  3.         DCMI_Handle.Init.SynchroMode      = DCMI_SYNCHRO_HARDWARE;
  4.         DCMI_Handle.Init.PCKPolarity      = DCMI_PCKPOLARITY_FALLING;//下降沿
  5.         DCMI_Handle.Init.VSPolarity       = DCMI_VSPOLARITY_HIGH;//高
  6.         DCMI_Handle.Init.HSPolarity       = DCMI_HSPOLARITY_HIGH;//高
  7.         DCMI_Handle.Init.CaptureRate      = DCMI_CR_ALL_FRAME;
  8.         DCMI_Handle.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
  9.         HAL_DCMI_Init(&DCMI_Handle);
复制代码
Connecting & Messaging from Any.
举报 使用道具
#何进 注册会员 发表于 2018-1-8 21:11:30 | 显示全部楼层
#何进 发表于 2018-1-3 21:17
今天;完成了I2c的配置,配置好了sccb协议,可以读取到摄像头的ID,是之可以使用
明天:完成摄像头数据到LC ...

2018.1.6:配置摄像头的时钟,xclk连接pa8引脚,pa8可以输出mco1时钟,所以只需要配置mco1即可,明天上传配置文档
今天;今天发现两个问题
1.无法进入dcmi的中断
解决:我配置的是帧捕获结束中断,但是我的回调函数是帧同步中断回调函数,所以错误
  1. /**
  2.   * @brief  帧同步回调函数.
  3.   * @param  None
  4.   * @retval None
  5.   */
  6. void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi)
  7. {
  8.     fps++; //帧率计数
  9.     OV2640_DMA_Config(LCD_FB_START_ADDRESS,LCD_GetXSize()*LCD_GetYSize()/2);
  10. }
复制代码


  1. /**
  2.   * @brief  帧结束回调函数.
  3.   * @param  None
  4.   * @retval None
  5.   */
  6. void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
  7. {
  8.     fps++; //帧率计数
  9.         /*
  10.     __HAL_DMA_ENABLE(&DMA_Handle_dcmi); //使能DMA
  11.      __HAL_LINKDMA(&DCMI_Handle, DMA_Handle, DMA_Handle_dcmi);
  12.           __HAL_UNLOCK(&DMA_Handle_dcmi);
  13.      HAL_DMA_Start(&DMA_Handle_dcmi,(u32)&DCMI->DR,(u32)dcmi_line_buf[0],120);
  14.         */
  15.     //OV2640_DMA_Config(LCD_FB_START_ADDRESS,LCD_GetXSize()*LCD_GetYSize()/2);
  16.     //OV2640_DMA_Config((u32)dcmi_line_buf[0],(u32)dcmi_line_buf[1],120);
  17.     //重新使能帧中断,因为HAL_DCMI_IRQHandler()函数会关闭帧中断
  18.     __HAL_DCMI_ENABLE_IT(&DCMI_Handle,DCMI_IT_FRAME);
  19. }
复制代码




2.无法进入dma中断
解决:这个问题是我配置了dma的传输完成中断,但数据一直为结束,所以没有进入中断
,查资料得我的dcmi配置错误,所以无法从dcmi获得数据。
错误原因:时钟极性未配置正确(未认真看ov7670的数据手册,对时序一知半解,想当然了,配置直接拿别的代码的,所以错误)
这是我先前配置:
  1. DCMI_Handler.Instance=DCMI;
  2.     DCMI_Handler.Init.SynchroMode=DCMI_SYNCHRO_HARDWARE;    //硬件同步HSYNC,VSYNC
  3.     DCMI_Handler.Init.PCKPolarity=DCMI_PCKPOLARITY_RISING;  //PCLK 上升沿有效
  4.     DCMI_Handler.Init.VSPolarity=DCMI_VSPOLARITY_LOW;       //VSYNC 低电平有效
  5.     DCMI_Handler.Init.HSPolarity=DCMI_HSPOLARITY_LOW;       //HSYNC 低电平有效
  6.     DCMI_Handler.Init.CaptureRate=DCMI_CR_ALL_FRAME;        //全帧捕获
  7.     DCMI_Handler.Init.ExtendedDataMode=DCMI_EXTEND_DATA_8B; //8位数据格式
  8.     HAL_DCMI_Init(&DCMI_Handler);                           //初始化DCMI,此函数会开启帧中断  
复制代码

后面配置:
  1. DCMI_Handle.Instance              = DCMI;   
  2.         //DCMI_Handle.Init.SynchroMode      = DCMI_MODE_CONTINUOUS;
  3.         DCMI_Handle.Init.SynchroMode      = DCMI_SYNCHRO_HARDWARE;
  4.         DCMI_Handle.Init.PCKPolarity      = DCMI_PCKPOLARITY_FALLING;
  5.         DCMI_Handle.Init.VSPolarity       = DCMI_VSPOLARITY_HIGH;
  6.         DCMI_Handle.Init.HSPolarity       = DCMI_HSPOLARITY_HIGH;
  7.         DCMI_Handle.Init.CaptureRate      = DCMI_CR_ALL_FRAME;
  8.         DCMI_Handle.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
  9.         HAL_DCMI_Init(&DCMI_Handle);
复制代码

时钟极性出现巨大错误
Connecting & Messaging from Any.
举报 使用道具
stars 注册会员 发表于 2018-1-8 20:36:44 | 显示全部楼层
本帖最后由 stars 于 2018-1-8 21:22 编辑

2018/01/08
今天:
LTDC 单色填充函数: LTDC_Fill函数使用 DMA2D 操作,可加快填充速度。

Connecting & Messaging from Any.
举报 使用道具
wangchenchen 注册会员 发表于 2018-1-7 20:52:23 | 显示全部楼层
2018/1/7
今天看了摄像头OV7670的时钟模块,并对代码中的OV7670_Init 函数进行了分析。
首先初始化 OV7670 相关的 IO 口(包括 SCCB_Init)。
然后完成OV7670 的寄存器序列初始化。
Connecting & Messaging from Any.
举报 使用道具
stars 注册会员 发表于 2018-1-7 20:50:12 | 显示全部楼层
本帖最后由 stars 于 2018-1-7 20:52 编辑

今天:
对STM32F7HAL库进行了分析。
要LTDC驱动使用RGB接口的屏,需对LDTC进行一些配置:
使能 LTDC 时钟,并配置 LTDC 相关的 IO 及其时钟使能;
设置 LCD_CLK 时钟;
设置 RGBLCD 的相关参数,并使能 LTDC;
设置 LTDC 层参数;
设置 LTDC 层窗口,并使能层。
LTDC 的各种配置寄存器以及状态寄存器,用于控制整个 LTDC 的工作参数,
主要有:各信号的有效电平、垂直/水平同步时间参数、像素格式、数据使能等等。
明天:继续往下。
Connecting & Messaging from Any.
举报 使用道具
alsk0017 注册会员 发表于 2018-1-7 18:22:53 | 显示全部楼层
本周完善了像素的处理和分析代码,
代码如下:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. void zhuan(unsigned char gI[]);
  4. int main()
  5. {
  6.         //读取数组
  7.         //shu();
  8.         zhuan(gImage_123);
  9.         return 0;
  10.         exit(0);
  11. }

  12. void zhuan(unsigned char gI[])
  13. {
  14.         unsigned int xiangshu[76800];
  15.         int j = 0;
  16.         

  17.         for (int i = 0; i < 153600; i = i + 2)
  18.         {        
  19.                 xiangshu[j] = gI[i] * 0X0100 + gI[i + 1];
  20.                 //将两个两位16进制和为一个四位16进制
  21.                 if (j % 320 >= 159 && j % 320 < 240)//切割要判断的部分
  22.                 {
  23.                         if (xiangshu[j] < 0100)//二值化
  24.                         {
  25.                                 xiangshu[j] = 0X0000;
  26.                         }
  27.                         else
  28.                         {
  29.                                 xiangshu[j] = 0XFFFF;
  30.                         }
  31.                         if (xiangshu[j]==0X0000)//判断黑块所在的位置
  32.                         {
  33.                                 if (j < 19200)
  34.                                 {
  35.                                         printf("1 have black\n");//发出指令
  36.                                 }
  37.                                 if (19200<=j && j<38400)
  38.                                 {
  39.                                         printf("2 have black\n");//发出指令
  40.                                 }
  41.                                 if (38400<=j && j<57600)
  42.                                 {
  43.                                         printf("3 have black\n");//发出指令
  44.                                 }
  45.                                 if (57600 <= j && j < 76800)
  46.                                 {
  47.                                         printf("4 have black\n");//发出指令
  48.                                 }
  49.                         }
  50.                 }
  51.                 j++;
  52.         }
  53. }
复制代码
Connecting & Messaging from Any.
举报 使用道具
alsk0017 注册会员 发表于 2018-1-7 18:21:46 | 显示全部楼层
今天,分析了STM32F7中LTDC LCD(RGB 屏)的时钟配置和对像素的分析的代码进行了调整。
明天,配置LTDC LCD(RGB 屏)的代码。
2018/1/7
Connecting & Messaging from Any.
举报 使用道具
钟治强123 注册会员 发表于 2018-1-6 21:12:40 | 显示全部楼层
分析lcd显示屏代码,完成lcd配置,显示屏能够显示图像,但是图像比较模糊。查阅相关资料http://www.openedv.com/posts/list/0/59431.htm






Connecting & Messaging from Any.
举报 使用道具
wangchenchen 注册会员 发表于 2018-1-6 18:41:52 from Mobile | 显示全部楼层
本帖最后由 wangchenchen 于 2018-1-7 12:13 编辑

2018/1/5
大致看了组员之前发的帖子,了解项目当前的进度,目前,在看M7板子LCD屏的相关代码。
Connecting & Messaging from Any.
举报 使用道具
alsk0017 注册会员 发表于 2018-1-5 22:58:08 | 显示全部楼层
今天,辅助图像采集组配置LCD代码,并开始尝试在LCD显示屏上显示处理和分析后的像素数组。
明天,将对图像处理和分析的代码进行整理和对项目进行整合。
2018/1/5
Connecting & Messaging from Any.
举报 使用道具
stars 注册会员 发表于 2018-1-5 20:22:29 | 显示全部楼层
2018/01/05
今天:
电容笔固定在弹簧内时要在其上部留一部分弹簧,才能使得电容笔在连接电磁铁时有空隙,保证电磁铁对电容笔上磁铁的磁力能让电容笔向下移动,否则实现不了电容笔上下来回移动。

Connecting & Messaging from Any.
举报 使用道具
#何进 注册会员 发表于 2018-1-5 18:17:08 | 显示全部楼层
#何进 发表于 2018-1-5 18:16
2018.1.4:昨天配置好了DMA2D协议,使数据可以直接由RAM到显存。
2018.1.5:今天终于可以显示图像了,但 ...

明天工作:优化代码,提高帧率
Connecting & Messaging from Any.
举报 使用道具
#何进 注册会员 发表于 2018-1-5 18:16:40 | 显示全部楼层
#何进 发表于 2018-1-3 21:17
今天;完成了I2c的配置,配置好了sccb协议,可以读取到摄像头的ID,是之可以使用
明天:完成摄像头数据到LC ...

2018.1.4:昨天配置好了DMA2D协议,使数据可以直接由RAM到显存。
2018.1.5:今天终于可以显示图像了,但是只有两帧每秒,好慢,我是这么做的:
从八个i/o读到一个字节数据,就存到两位,两个字节组成一个像素写入数据,这个数据存一行像素点数据,存满后就用DMA2d写入显存。
这是我从i/o口读取一字节数据

d7=HAL_GPIO_ReadPin(GPIOI,GPIO_PIN_7);        //¶ÁÊý¾Ý
d6=HAL_GPIO_ReadPin(GPIOI,GPIO_PIN_6);        //¶ÁÊý¾Ý
d5=HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_3);        //¶ÁÊý¾Ý
d4=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_14);        //¶ÁÊý¾Ý
d3=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_12);        //¶ÁÊý¾Ý
d2=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_11);        //¶ÁÊý¾Ý
d1=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_10);        //¶ÁÊý¾Ý
d0=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_9);        //¶ÁÊý¾Ý

  1. uint32_t j;
  2.         uint32_t i;
  3.         uint16_t color;
  4.         uint16_t colbuff[320];
  5.         uint16_t d7,d6,d5,d4,d3,d2,d1,d0;
  6.         //LCD_DisplayStringLine_EN_CH(3,(uint8_t* )"camera_refresh");
  7.         if(ov_sta1==2)
  8.         {
  9.                 fps++;
  10.                 //OV7670_RRST=0;                                //¿ªÊ¼¸´Î»¶ÁÖ¸Õë
  11.                 HAL_GPIO_WritePin(GPIOG,GPIO_PIN_2,GPIO_PIN_RESET);
  12.                 //OV7670_RCK=0;
  13.                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
  14.                 //OV7670_RCK=1;
  15.                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
  16.                 //OV7670_RCK=0;
  17.                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
  18.                 //OV7670_RRST=1;                                //¸´Î»¶ÁÖ¸Õë½áÊø
  19.                 HAL_GPIO_WritePin(GPIOG,GPIO_PIN_2,GPIO_PIN_SET);
  20.                 //OV7670_RCK=1;
  21.                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
  22.                 for(i=0;i<240;i++)
  23.                 {
  24.                         for(j=0;j<320;j++)
  25.                         {
  26.                                 //OV7670_RCK=0;
  27.                                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
  28.                                 //gImage[j*2]=color;
  29.                                 d7=HAL_GPIO_ReadPin(GPIOI,GPIO_PIN_7);        //¶ÁÊý¾Ý
  30.                                 d6=HAL_GPIO_ReadPin(GPIOI,GPIO_PIN_6);        //¶ÁÊý¾Ý
  31.                                 d5=HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_3);        //¶ÁÊý¾Ý
  32.                                 d4=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_14);        //¶ÁÊý¾Ý
  33.                                 d3=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_12);        //¶ÁÊý¾Ý
  34.                                 d2=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_11);        //¶ÁÊý¾Ý
  35.                                 d1=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_10);        //¶ÁÊý¾Ý
  36.                                 d0=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_9);        //¶ÁÊý¾Ý
  37.                                 //OV7670_RCK=1;
  38.                                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
  39.                                 color=(d7<<15)+(d6<<14)+(d5<<13)+(d4<<12)+(d3<<11)+(d2<<10)+(d1<<9)+(d0<<8);
  40.                                 //OV7670_RCK=0;
  41.                                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
  42.                                 d7=HAL_GPIO_ReadPin(GPIOI,GPIO_PIN_7);        //¶ÁÊý¾Ý
  43.                                 d6=HAL_GPIO_ReadPin(GPIOI,GPIO_PIN_6);        //¶ÁÊý¾Ý
  44.                                 d5=HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_3);        //¶ÁÊý¾Ý
  45.                                 d4=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_14);        //¶ÁÊý¾Ý
  46.                                 d3=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_12);        //¶ÁÊý¾Ý
  47.                                 d2=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_11);        //¶ÁÊý¾Ý
  48.                                 d1=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_10);        //¶ÁÊý¾Ý
  49.                                 d0=HAL_GPIO_ReadPin(GPIOH,GPIO_PIN_9);        //¶ÁÊý¾Ý
  50.                                 //gImage[j*2+1]=color;
  51.                                 //OV7670_RCK=1;
  52.                                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
  53.                                 color=color+(d7<<7)+(d6<<6)+(d5<<5)+(d4<<4)+(d3<<3)+(d2<<2)+(d1<<1)+d0;
  54.                                 colbuff[j]=color;
  55.                                 //LCD_SetColors(LCD_COLOR_BLACK,TRANSPARENCY);
  56.                                 //sprintf((char*)dispBuf, "zijie:%d",color);
  57.                                 //HAL_Delay(10);
  58.                                 //LCD_ClearLine(2);
  59.          /*Êä³öÖ¡ÂÊ*/
  60.                          //LCD_DisplayStringLine_EN_CH(2,dispBuf);
  61.                                 //LCD->LCD_RAM=color;
  62.                         }
  63.                         LCD_Color_Fill(0,i,320,i,colbuff);//DM2DÌî³ä
  64.                 }
  65.                 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_5);
  66.                 //LL_FillBuffer(1,(uint32_t *)Xaddress, 240,240,50,color1);
  67.                 //LCD_refresh();
  68.                 //printf("frame:%dfps\r\n",ov_frame);
  69.                 //EXTI_ClearITPendingBit(EXTI_Line8);  //Çå³ýLINE8ÉϵÄÖжϱê־λ
  70.                 ov_sta1=0;                                        //¿ªÊ¼ÏÂÒ»´Î²É¼¯
复制代码
Connecting & Messaging from Any.
举报 使用道具
cao1147 注册会员 发表于 2018-1-4 22:22:29 | 显示全部楼层
今天:找到了两个按键触发不灵敏的可能原因
一、使用四个铜柱做为支撑,可能对电容屏电流产生影响
二、使用贴膜
解决方法
使四个引脚绝缘。
分析lcd显示代码,
明天,使lcd显示想要的画面
Connecting & Messaging from Any.
举报 使用道具
stars 注册会员 发表于 2018-1-4 22:18:49 | 显示全部楼层
2018/01/04
OV7670模块初始化IO口,读取传感器ID,执行初始化序列,完成初始化。
图像采集:等待OV7670帧同步信号(VSYNC)->FIFO写指针复位接着进行写使能等第二个帧同步信号过来即代表上一帧数据采集完成,然后禁止FIFO写入。

上图为OV7670水平时序,
在HREF高时图像数据输出,当HREF变高后,每一个PCLK时钟输出一个字节数据。例如采用VGA时序,RGB565格式输出,每2个字节组成一个像素的颜色。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.
举报 使用道具
alsk0017 注册会员 发表于 2018-1-4 21:48:53 | 显示全部楼层
今天,对图像处理和分析代码中的一个 bug进行处理;
bug:在封装函数中导入数组时出现导入失败现象,原数组内个数和内容在导入时被改变。
处理方式:在数组导入之前,对数组进行格式转变,使导入的数组和封装函数中定义的数组格式相同。
明天:处理M7中的TFTLCD(MCU 屏)和LTDC LCD(RGB 屏)中的软件设计驱动。2018/1/4
Connecting & Messaging from Any.
举报 使用道具
钟治强123 注册会员 发表于 2018-1-4 21:40:38 | 显示全部楼层
查看M7开发指南TFTLCD实验,查看lcd显示屏的显示代码

void LCD_Init(void)
{
    RCC_PeriphCLKInitTypeDef  periph_clk_init_struct;  
    /* 使能LTDC时钟 */
    __HAL_RCC_LTDC_CLK_ENABLE();
    /* 使能DMA2D时钟 */
    __HAL_RCC_DMA2D_CLK_ENABLE();
    /* 初始化LCD引脚 */
    LCD_GPIO_Config();
    /* 初始化SDRAM 用作LCD 显存*/
    SDRAM_Init();
    /* 配置LTDC参数 */
    Ltdc_Handler.Instance = LTDC;  
    /* 配置行同步信号宽度(HSW-1) */
    Ltdc_Handler.Init.HorizontalSync =HSW-1;
    /* 配置垂直同步信号宽度(VSW-1) */
    Ltdc_Handler.Init.VerticalSync = VSW-1;
    /* 配置(HSW+HBP-1) */
    Ltdc_Handler.Init.AccumulatedHBP = HSW+HBP-1;
    /* 配置(VSW+VBP-1) */
    Ltdc_Handler.Init.AccumulatedVBP = VSW+VBP-1;
    /* 配置(HSW+HBP+有效像素宽度-1) */
    Ltdc_Handler.Init.AccumulatedActiveW = HSW+HBP+LCD_PIXEL_WI
    /* 配置(VSW+VBP+有效像素高度-1) */
    Ltdc_Handler.Init.AccumulatedActiveH = VSW+VBP+LCD_PIXEL_HE
    /* 配置总宽度(HSW+HBP+有效像素宽度+HFP-1) */
    Ltdc_Handler.Init.TotalWidth =HSW+ HBP+LCD_PIXEL_WIDTH + HF
    /* 配置总高度(VSW+VBP+有效像素高度+VFP-1) */
    Ltdc_Handler.Init.TotalHeigh =VSW+ VBP+LCD_PIXEL_HEIGHT + V
    /* 液晶屏时钟配置 */
    /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */
    /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz
    /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/5 = 38.4 Mhz
    /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_4 =
    periph_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK
    periph_clk_init_struct.PLLSAI.PLLSAIN = 192;
    periph_clk_init_struct.PLLSAI.PLLSAIR = 5;
    periph_clk_init_struct.PLLSAIDivR = RCC_PLLSAIDIVR_4;
    HAL_RCCEx_PeriphCLKConfig(&periph_clk_init_struct);
    /* 初始化LCD的像素宽度和高度 */
    Ltdc_Handler.LayerCfg->ImageWidth  = LCD_PIXEL_WIDTH;
    Ltdc_Handler.LayerCfg->ImageHeight = LCD_PIXEL_HEIGHT;
    /* 设置LCD背景层的颜色,默认黑色 */
    Ltdc_Handler.Init.Backcolor.Red = 0;
    Ltdc_Handler.Init.Backcolor.Green = 0;
    Ltdc_Handler.Init.Backcolor.Blue = 0;
    /* 极性配置 */
    /* 初始化行同步极性,低电平有效 */
    Ltdc_Handler.Init.HSPolarity = LTDC_HSPOLARITY_AL;
    /* 初始化场同步极性,低电平有效 */
    Ltdc_Handler.Init.VSPolarity = LTDC_VSPOLARITY_AL;
    /* 初始化数据有效极性,低电平有效 */
    Ltdc_Handler.Init.DEPolarity = LTDC_DEPOLARITY_AL;
    /* 初始化行像素时钟极性,同输入时钟 */
    Ltdc_Handler.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
    HAL_LTDC_Init(&Ltdc_Handler);


主要就是对显示屏参数的配置,高度,背景色。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.
举报 使用道具
钟治强123 注册会员 发表于 2018-1-4 08:30:10 | 显示全部楼层
安装kd5,学习STM32F7-HAL库版本DMA实验部分,利用 STM32F767 的 DMA来实现串口数据传送,并在 LCD 模块上显示当前的传送进度
Connecting & Messaging from Any.
举报 使用道具
chinmel 版主 发表于 2018-1-4 02:49:23 | 显示全部楼层
stars 发表于 2018-1-3 20:44
运行一个使LED灯亮的程序,使得灯的引脚为高电平,可连接电磁铁的“S”,给电磁铁高电平,
电磁铁的正负极 ...

查阅资料,了解一下电磁铁的工作原理,得出结论,电磁铁的“吸力”与哪些因素相关?请给出一篇单独的帖子,说明一下你的研究。
Connecting & Messaging from Any.
举报 使用道具
cao1147 注册会员 发表于 2018-1-3 21:30:00 | 显示全部楼层
今日:制作电磁铁触发模块问题:触控笔固定不稳,按键压力不足,手机屏幕无响应
解决方法:1,暂无;2,使用磁铁,使得电磁铁通电后得到相同磁极,产生更大斥力;3,给电容笔头加导线,产生固定电场。

明日:配置ov7670摄像头,等待磁铁到来。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.
举报 使用道具
#何进 注册会员 发表于 2018-1-3 21:17:08 | 显示全部楼层
本帖最后由 #何进 于 2018-1-3 21:18 编辑
#何进 发表于 2018-1-2 21:36
今天:继续配置M7的ov7670摄像头,不使用dcmi接口,直接用i/o接口来接受数据和配置中断,但是在dma地方卡 ...

今天;完成了I2c的配置,配置好了sccb协议,可以读取到摄像头的ID,是之可以使用
明天:完成摄像头数据到LCD显存,使摄像头可以显示
  1. #include "./i2c/bsp_i2c.h"

  2. //延时nus
  3. //nus为要延时的us数.        
  4. //注意:nus的值不要大于1000us
  5. static uint32_t fac_us=0;

  6. void SCCB_Delay(void)
  7. {
  8.         delay_us(5);
  9. }

  10. void delay_us(uint32_t nus)
  11. {               
  12.         uint32_t ticks;
  13.         uint32_t told,tnow,tcnt=0;
  14.         uint32_t reload=SysTick->LOAD;                                //LOAD的值                     
  15.         ticks=nus*fac_us;                                                 //需要的节拍数
  16.         told=SysTick->VAL;                                        //刚进入时的计数器值
  17.         while(1)
  18.         {
  19.                 tnow=SysTick->VAL;        
  20.                 if(tnow!=told)
  21.                 {            
  22.                         if(tnow<told)tcnt+=told-tnow;        //这里注意一下SYSTICK是一个递减的计数器就可以了.
  23.                         else tcnt+=reload-tnow+told;            
  24.                         told=tnow;
  25.                         if(tcnt>=ticks)break;                        //时间超过/等于要延迟的时间,则退出.
  26.                 }  
  27.         };
  28. }



  29. //初始化SCCB接口
  30. void SCCB_Init(void)
  31. {
  32.     GPIO_InitTypeDef GPIO_Initure;
  33.     __HAL_RCC_GPIOD_CLK_ENABLE();           //使能GPIOB时钟
  34.    
  35.     //PB3.4初始化设置
  36.     GPIO_Initure.Pin=GPIO_PIN_12|GPIO_PIN_13;
  37.     GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
  38.     GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
  39.     GPIO_Initure.Speed=GPIO_SPEED_FAST;     //快速
  40.     HAL_GPIO_Init(GPIOD,&GPIO_Initure);
  41. }

  42. //SCCB起始信号
  43. //当时钟为高的时候,数据线的高到低,为SCCB起始信号
  44. //在激活状态下,SDA和SCL均为低电平
  45. void SCCB_Start(void)
  46. {
  47.     SCCB_SDA(1);     //数据线高电平           
  48.     SCCB_SCL(1);            //在时钟线高的时候数据线由高至低
  49.     SCCB_Delay();  
  50.     SCCB_SDA(0);
  51.     SCCB_Delay();         
  52.     SCCB_SCL(0);            //数据线恢复低电平,单操作函数必要         
  53. }

  54. //SCCB停止信号
  55. //当时钟为高的时候,数据线的低到高,为SCCB停止信号
  56. //空闲状况下,SDA,SCL均为高电平
  57. void SCCB_Stop(void)
  58. {
  59.     SCCB_SDA(0);
  60.     SCCB_Delay();         
  61.     SCCB_SCL(1);        
  62.     SCCB_Delay();
  63.     SCCB_SDA(1);        
  64.     SCCB_Delay();
  65. }  
  66. //产生NA信号
  67. void SCCB_No_Ack(void)
  68. {
  69.         SCCB_Delay();
  70.         SCCB_SDA(1);        
  71.         SCCB_SCL(1);        
  72.         SCCB_Delay();
  73.         SCCB_SCL(0);        
  74.         SCCB_Delay();
  75.         SCCB_SDA(0);        
  76.         SCCB_Delay();
  77. }
  78. //SCCB,写入一个字节
  79. //返回值:0,成功;1,失败.
  80. u8 SCCB_WR_Byte(u8 dat)
  81. {
  82.         u8 j,res;         
  83.         for(j=0;j<8;j++) //循环8次发送数据
  84.         {
  85.                 if(dat&0x80)SCCB_SDA(1);        
  86.                 else SCCB_SDA(0);
  87.                 dat<<=1;
  88.                 SCCB_Delay();
  89.                 SCCB_SCL(1);        
  90.                 SCCB_Delay();
  91.                 SCCB_SCL(0);                  
  92.         }                        
  93.         SCCB_SDA_IN();                //设置SDA为输入
  94.         SCCB_Delay();
  95.         SCCB_SCL(1);                        //接收第九位,以判断是否发送成功
  96.         SCCB_Delay();
  97.         if(SCCB_READ_SDA)res=1;  //SDA=1发送失败,返回1
  98.         else res=0;         //SDA=0发送成功,返回0
  99.         SCCB_SCL(0);                 
  100.         SCCB_SDA_OUT();                //设置SDA为输出   
  101.         return res;  
  102. }         
  103. //SCCB 读取一个字节
  104. //在SCL的上升沿,数据锁存
  105. //返回值:读到的数据
  106. u8 SCCB_RD_Byte(void)
  107. {
  108.         u8 temp=0,j;   
  109.         SCCB_SDA_IN();                //设置SDA为输入  
  110.         for(j=8;j>0;j--)         //循环8次接收数据
  111.         {                              
  112.                 SCCB_Delay();
  113.                 SCCB_SCL(1);
  114.                 temp=temp<<1;
  115.                 if(SCCB_READ_SDA)temp++;   
  116.                 SCCB_Delay();
  117.                 SCCB_SCL(0);
  118.         }        
  119.         SCCB_SDA_OUT();                //设置SDA为输出   
  120.         return temp;
  121. }                                                            
  122. //写寄存器
  123. //返回值:0,成功;1,失败.
  124. u8 SCCB_WR_Reg(u8 reg,u8 data)
  125. {
  126.         u8 res=0;
  127.         SCCB_Start();                                         //启动SCCB传输
  128.         if(SCCB_WR_Byte(OV7670_id))res=1;        //写器件ID         
  129.         delay_us(100);
  130.           if(SCCB_WR_Byte(reg))res=1;                //写寄存器地址         
  131.         delay_us(100);
  132.           if(SCCB_WR_Byte(data))res=1;         //写数据         
  133.           SCCB_Stop();         
  134.           return        res;
  135. }                                                              
  136. //读寄存器
  137. //返回值:读到的寄存器值
  138. u8 SCCB_RD_Reg(u8 reg)
  139. {
  140.         u8 val=0;
  141.         SCCB_Start();                                 //启动SCCB传输
  142.         SCCB_WR_Byte(OV7670_id);                //写器件ID         
  143.         delay_us(100);         
  144.           SCCB_WR_Byte(reg);                        //写寄存器地址         
  145.         delay_us(100);         
  146.         SCCB_Stop();   
  147.         delay_us(100);           
  148.         //设置寄存器地址后,才是读
  149.         SCCB_Start();
  150.         SCCB_WR_Byte(OV7670_id|0X01);        //发送读命令         
  151.         delay_us(100);
  152.           val=SCCB_RD_Byte();                         //读取数据
  153.           SCCB_No_Ack();
  154.           SCCB_Stop();
  155.           return val;
  156. }
复制代码
Connecting & Messaging from Any.
举报 使用道具
alsk0017 注册会员 发表于 2018-1-3 21:10:50 | 显示全部楼层
今天,完成了RGB565像素的处理和分析代码。
明天,辅助图像采集模块配置驱动。
2018/1/3
Connecting & Messaging from Any.
举报 使用道具
stars 注册会员 发表于 2018-1-3 20:44:12 | 显示全部楼层
本帖最后由 stars 于 2018-1-4 18:51 编辑

2018/01/03
运行一个使LED灯亮的程序,使得灯的引脚为高电平,可连接电磁铁的“S”,给电磁铁高电平,
电磁铁的正负极也分别连上,让它对电容笔产生吸力的变换。
而买到的电磁铁吸力不够,导致达不到点击的效果。(猜想,有可能是电压不匹配)
Connecting & Messaging from Any.
举报 使用道具
cao1147 注册会员 发表于 2018-1-2 21:49:04 | 显示全部楼层
cao1147 发表于 2018-1-2 21:06
今日:分析m3 ov7670代码了解ov7670的使用方法
先配置 SYSCLK,HCLK,PCLK2和PCLK1

分析m7 ov2640代码了解ov2640的使用方式,分析与ov7670不同
ov7670需要外部时钟支持,要单独配置
明日:继续分析ov2640与ov7670的不同并尝试在m7上使用ov7670
Connecting & Messaging from Any.
举报 使用道具
#何进 注册会员 发表于 2018-1-2 21:36:27 | 显示全部楼层
#何进 发表于 2017-12-28 09:22
2017.12.27:完成详细文档中图像采集部分的编写,学习ov7670模块的原理图与查看数据手册
今天:在计算机中 ...

今天:继续配置M7的ov7670摄像头,不使用dcmi接口,直接用i/o接口来接受数据和配置中断,但是在dma地方卡住了,就是dma是以一个外设来作为,起始传送,我怎么将那八个gpio作为一个外设用dma传输
明天:继续配置驱动
Connecting & Messaging from Any.
举报 使用道具
cao1147 注册会员 发表于 2018-1-2 21:06:33 | 显示全部楼层
今日:分析m3 ov7670代码了解ov7670的使用方法
先配置 SYSCLK,HCLK,PCLK2和PCLK1
  1. void Demo_Init(void)
  2. {
  3.   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   
  4.   /* RCC system reset(for debug purpose) */
  5.   RCC_DeInit();

  6.   /* Enable HSE */
  7.   RCC_HSEConfig(RCC_HSE_ON);

  8.   /* Wait till HSE is ready */
  9.   HSEStartUpStatus = RCC_WaitForHSEStartUp();

  10.   if(HSEStartUpStatus == SUCCESS)
  11.   {
  12.     /* Enable Prefetch Buffer */
  13.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  14.     /* Flash 2 wait state */
  15.     FLASH_SetLatency(FLASH_Latency_2);
  16.    
  17.     /* HCLK = SYSCLK */
  18.     RCC_HCLKConfig(RCC_SYSCLK_Div1);
  19.   
  20.     /* PCLK2 = HCLK */
  21.     RCC_PCLK2Config(RCC_HCLK_Div1);

  22.     /* PCLK1 = HCLK/2 */
  23.     RCC_PCLK1Config(RCC_HCLK_Div2);

  24.     /* PLLCLK = 8MHz * 9 = 72 MHz */
  25.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_16);

  26.     /* Enable PLL */
  27.     RCC_PLLCmd(ENABLE);

  28.     /* Wait till PLL is ready */
  29.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  30.     {
  31.     }

  32.     /* Select PLL as system clock source */
  33.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  34.     /* Wait till PLL is used as system clock source */
  35.     while(RCC_GetSYSCLKSource() != 0x08)
  36.     {
  37.     }
  38.       /* Enable USART1 and GPIOA clock */
  39.      RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
  40.   }

  41.   /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
  42.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
  43.          | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG
  44.          | RCC_APB2Periph_AFIO, ENABLE);

  45. /*------------------- Resources Initialization -----------------------------*/
  46.      /* ADCCLK = PCLK2/8 */
  47.    RCC_ADCCLKConfig(RCC_PCLK2_Div8);
  48.    
  49.     /* Enable DMA clock */
  50.    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  51.    /* Enable ADC1 and GPIOC clock */
  52.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL, ENABLE);

  53.   /* If HSE is not detected at program startup */
  54.   if(HSEStartUpStatus == ERROR)
  55.   {
  56.     /* Generate NMI exception */
  57.     NVIC_SetSystemHandlerPendingBit(SystemHandler_NMI);
  58.   }  
  59.    

  60. }
复制代码

再配置摄像头的寄存器
  1. unsigned char OV7670_init(void)
  2. {
  3.         unsigned char temp;       
  4.         unsigned int i=0;

  5.         OV7670_GPIO_Init();
  6.         OV7670_GPIO_CONTRL_CONFIG();
  7.         SCCB_GPIO_Config(); // io init..

  8.     CLK_init_ON();
  9.         temp=0x80;
  10.         if(0==wrOV7670Reg(0x12, temp)) //Reset SCCB
  11.         {
  12.         return 0 ;
  13.         }
  14.         delay_ms(100);
  15.           set_OV7670reg();

  16.         OV7670_config_window(272,12,320,240);// set 240*320
  17.         return 0x01; //ok                          
  18. }
复制代码

然后打开外部时钟并拉高帧同步信号
  1. CLK_init_ON(); // OV7670 XCLK 开
  2.         while(value & 0x0800)    value = GPIOC->IDR;   // Vsync=H   
  3.         while((~value) & 0x0800) value = GPIOC->IDR;   // Vhync=L
  4.         
  5.         CLK_init_OFF(); //OV7670 XCLK 关
复制代码

最后读取像素点数据
  1. while(TimerCnt < 76800)
  2.         {
  3.                         XCLK_L;
  4.             XCLK_H;
  5.                         value = GPIOC->IDR;
  6.                         temp7670 ++;
  7.             
  8.                         if(value & 0x0100) // HREF = H ||(LCD_PCLK_STATE)
  9.             {       
  10.                                    //value = GPIOC->IDR;
  11.                                    //display[TimerCnt]=value;
  12.                           
  13.                            if((temp7670 == 1))// 高字节||(value & 0x0200) ||(LCD_PCLK_STATE)
  14.                 {
  15.                           val1=value& 0x00ff;

  16.                 }
  17.                 else // 低字节         if((temp7670 != 1)||(LCD_PCLK_STATE))  
  18.                 {
  19.                            val2= value<<8  ;          //
  20.                                         val =ili9320_BGR2RGB(val1 |val2);
  21.                     temp7670 = 0;
  22.                     LCD_WriteRAM(val); //TFT GRAM 数据
  23.                     TimerCnt ++;
  24.                 }
  25.             }
  26.                
  27.                                
  28.                 }
复制代码
Connecting & Messaging from Any.
举报 使用道具
alsk0017 注册会员 发表于 2018-1-2 20:56:33 | 显示全部楼层
今天进行将RGB565转换RGB888代码的除BUG,实现的对像素处理和分析后的直观效果。
明天根据计划要求编写RGB565的处理和分析代码,并进行精简以提高代码的运行速度。
2018/1/2
Connecting & Messaging from Any.
举报 使用道具
stars 注册会员 发表于 2018-1-2 15:20:47 | 显示全部楼层
本帖最后由 stars 于 2018-1-2 20:51 编辑

安装KEIL5->安装库文件->项目建立
(Keil MDK-ARM V5 和 V4安装的区别在于V5需要自己安装器件支持包,而V4就不需要安装。)

KEIL5安装与使用以及相关问题详解:
https://jingyan.baidu.com/article/3c48dd349be215e10be358c9.html









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.
举报 使用道具
stars 注册会员 发表于 2018-1-2 10:15:31 | 显示全部楼层
本帖最后由 stars 于 2018-1-2 17:32 编辑

2018/01/02
今日进展:
RB-02S122
电磁铁吸盘型号:LS-P20/15
电压DC6V 、吸力2.5KG
信号类型:数字信号
有三个引脚:“-”电源负极、 “+”电源正极、“S”信号
若接百为开发板,可以选择“-”接GND、 “+”接+5V、“S”接任意引脚时此引脚要设置为高电平

SKU:RB-02S122 电磁铁模块:
http://www.alsrobot.cn/wiki/index.php/SKU:RB-02S122_电磁铁模块

http://www.alsrobot.cn/goods-818.html


明日计划:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.
举报 使用道具
alsk0017 注册会员 发表于 2018-1-1 21:08:46 | 显示全部楼层
今天我完成了将RGB565像素数组转换为RGB888像素数组的代码编写。并将之前的代码进行了改进将RGB565像素数组的处理和分析函数改为RGB888像素数组的处理和分析函数,使像素数组可以转化为BMP图像。2018/1/1
Connecting & Messaging from Any.
举报 使用道具
stars 注册会员 发表于 2018-1-1 20:35:17 | 显示全部楼层
上周与组员共同的完成了需求与详细设计文档,在写的过程中对此项目的流程有了更深入的理解。
查了关于二值化的资料,弄懂了阈值的处理。还有就是所使用的OV7670摄像头的资料也研究了一部分。
关于电磁铁传感器也百度了以下,进行了了解。二维数组转换成图像的算法看了,不是很理解。好吧,就不太懂。
在下次电磁铁传感器到了后,应该就能做机械模块了。
Connecting & Messaging from Any.
举报 使用道具
#何进 注册会员 发表于 2017-12-30 19:41:36 | 显示全部楼层
#何进 发表于 2017-12-29 08:19
2017.12.28:在计算机中将图片转换为数组,然后再单片机中将这些像素点写入LCD中。继续ov7670模块的学习  ...

2017.12.30:今天正在查看资料,怎么将dcmi接口与带fifo的ov7670想连接起来,从网上得到资料,是用I/o组合方式来编写摄像头驱动,但我不太懂什么意思,是不是放弃dcmi,用其他的i/o引脚?
2017.12.31:明天准备查找M7的库的资料,可以从i/o引脚开始慢慢配ov7670的地层驱动
Connecting & Messaging from Any.
举报 使用道具
stars 注册会员 发表于 2017-12-29 22:57:46 | 显示全部楼层
2017/12/29
将二维数组转换成图像:输出二维数组的点,并显示、看看是不是要的图形
找了关于像素数组转换为BMP的算法,下为链接,
http://bbs.csdn.net/topics/390822913
Connecting & Messaging from Any.
举报 使用道具
钟治强123 注册会员 发表于 2017-12-29 22:46:22 from Mobile | 显示全部楼层
这几天一方面写了图像采集的详细设计,另一个就是学习ov7670一系列资料,看ov7670原理图,对配置ov7670摄像头实验代码进行研究,原本是在M3板上,现在在M7板上进行实验。
Connecting & Messaging from Any.
举报 使用道具
alsk0017 注册会员 发表于 2017-12-29 22:15:29 from Mobile | 显示全部楼层
今天:完成切割图片,取得一张图片的局域,判断这张图片是黑还是白
明天:写一个函数,尝试将一个位图数据转换为一张bmp格式图片
Connecting & Messaging from Any.
举报 使用道具
wangchenchen 注册会员 发表于 2017-12-29 15:32:55 from Mobile | 显示全部楼层
这个星期,和组员一起编写需求文档和详细设计文档,查找了一些处理图片的资料,如图片二值化,图片切割,看了部分代码,了解其原理,后续,查找了bmp图片转换成像素数组后的排列规律,以及像素数组如何转成bmp图片。
Connecting & Messaging from Any.
举报 使用道具
#何进 注册会员 发表于 2017-12-29 08:19:10 | 显示全部楼层
#何进 发表于 2017-12-28 09:22
2017.12.27:完成详细文档中图像采集部分的编写,学习ov7670模块的原理图与查看数据手册
今天:在计算机中 ...

2017.12.28:在计算机中将图片转换为数组,然后再单片机中将这些像素点写入LCD中。继续ov7670模块的学习
今天:开始M7开发板的摄像头驱动编写工作
Connecting & Messaging from Any.
举报 使用道具
stars 注册会员 发表于 2017-12-28 21:24:54 | 显示全部楼层
2017/12/28
查找一些资料,对OV7670的使用进行了了解,下面是摄像头OV7670模块资料
http://www.openedv.com/posts/list/9359.htm
我们用到的OV7670摄像头是带FIFO芯片的,FIFO 芯片的容量是 384K 字节。
下面是关于OV7670的配置说明:
http://blog.csdn.net/calcular/article/details/49817185
还有就是LCD的屏幕类型不需考虑
最后,就是希望购买的机器能快些到……

Connecting & Messaging from Any.
举报 使用道具
#何进 注册会员 发表于 2017-12-28 09:22:49 | 显示全部楼层
#何进 发表于 2017-12-26 21:15
今日工作进展:完成德菲来开发板的配置,驱动LCD
下一步工作计划:配置摄像头 ...

2017.12.27:完成详细文档中图像采集部分的编写,学习ov7670模块的原理图与查看数据手册
今天:在计算机中将图片转换为数组,然后再单片机中将这些像素点写入LCD中。继续ov7670模块的学习
Connecting & Messaging from Any.
举报 使用道具
钟治强123 注册会员 发表于 2017-12-26 21:54:43 from Mobile | 显示全部楼层
协助何进完成德飞莱开发板的配置,购买摄像头所需器材。
下一步,对摄像头进行配置。
Connecting & Messaging from Any.
举报 使用道具
cao1147 注册会员 发表于 2017-12-26 21:21:30 | 显示全部楼层
cao1147 发表于 2017-12-25 20:32
今日工作进展:搭建工作环境,修改项目需求说明

明日工作计划:在stm32上连接ov2640摄像头并进行调试 ...

今日工作进展:stm32调试摄像失败(ov2640排线定义未找到),ov7725在M4上调试成功,分析图片截取算法

明日工作计划:分析图片处理算法,做部分详细设计,设计按键机械结构
Connecting & Messaging from Any.
举报 使用道具
wangchenchen 注册会员 发表于 2017-12-26 21:16:49 | 显示全部楼层
                                                
Connecting & Messaging from Any.
举报 使用道具
#何进 注册会员 发表于 2017-12-26 21:15:36 | 显示全部楼层
#何进 发表于 2017-12-25 20:32
今日工作进展:完成需求文档,实现图像二值化处理
下一步工作计划:配置stm32f103开发板的摄像头 ...

今日工作进展:完成德菲来开发板的配置,驱动LCD
下一步工作计划:配置摄像头
Connecting & Messaging from Any.
举报 使用道具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2018-5-26 04:41