OEBS云计算-云背景音乐,订阅,定期自动更换的背景音乐-修订版V1.4.0

[list]
[*]
[/list].[顶] 订阅,定期自动更换的背景音乐-修订版V1.4.0 2011-12-20 17:51阅读
(84).赞(1)赞(1)赞(1)赞(1)转载(5)分享(1)
原文:http://user.qzone.qq.com/150939/blog/1324374681
v1.5.2 20120623 rm trance01
v1.5.0 20120619 增加自设计ddns
v.1.4.0 20120601 增加背景音乐发布方法,增加trance流媒体调用
v1.3.0 增加动态dns支持 ebs.fuqit.net
v1.2.0 更换动态域名 oebs.3322.org
----

#20120623 v1.5.2

最近在更新qq背景音乐时发现 trance01背景音乐被播放了个莫名奇妙的歌曲,非服务器发布的音乐,经过反复测试修改发现 只要把背景音乐链接修改为http://ebs.fuqit.net:9001/resource/public/topmusic/trance2011-top1.mp3 就会自动被更换为腾讯服务器自己的链接.删除了重新上传也是如此. 我猜测这是tx故意恶搞.将此链接写入程序自动替换为抵制开放的流媒体背景音乐.实在可笑.封闭只能自取灭亡.新技术革命从来不是一帆风顺的.这是腾讯打击竞争的一贯手法.为了遏制竞争对手,各种卑劣行径无所不用其极. 从qq弹窗 如果是新浪的博客就不会显示链接方式打开;如果是新浪的邮件发到tx的qq邮箱直接进了垃圾箱. 各位可自己测试.

我只是一个小小的自由技术爱好者.开发的云技术供好友们免费使用.腾讯你就敢动用你的垄断资源来阻止.有本事你qq免费音乐全关掉.看有几个人用你的空间.


tx,送你个忠告. 玩火者zf. 别忘记你是怎么起来的. 谁能载舟,亦能覆舟.

作为公司的IT系统管理者,凡是tx的soso, 安全保护产品 一律封杀. 在公司是被禁止的.qq游戏,端口全部被禁止.

因为tx 把01给禁止掉了 .要解决的方法很简单 直接删除空间背景音乐01即可,保留3首也可轮循 . 当然这是暂时解决方案.日后相信tx会继续其他干扰.

----
#20120619 v1.5.0
发布最新版本ddns dns永久有效 ;之前版本的ddns 由于使用免费的非常不稳定导致网络经常中断,加上难以维护.将会失效.请认准最新版本ddns
ebs.fuqit.net ,该ddns为自主开发架设的ddns;有效解决断网自动重连,ip变更自动重新更新,ddns服务器自动加载等功能.超过国内90%ddns 服务商.让花生米,三三俩俩们陆续见鬼去吧!.

http://ebs.fuqit.net:9001/resource/public/topmusic/trance2011-top0.mp3
http://ebs.fuqit.net:9001/resource/public/topmusic/trance2011-top1.mp3
http://ebs.fuqit.net:9001/resource/public/topmusic/trance2011-top2.mp3
http://ebs.fuqit.net:9001/resource/public/topmusic/trance2011-top3.mp3



-----
#20120601 v1.4.0
想订阅本人空间的背景音乐的方法:
先删除自己qq空间的背景音乐
然后依次进入资源库,增加网络音乐依次输入下列网址:
http://ebs.fuqit.net:9001/resource/public/topmusic/trance2011-top0.mp3
http://ebs.fuqit.net:9001/resource/public/topmusic/trance2011-top1.mp3
http://ebs.fuqit.net:9001/resource/public/topmusic/trance2011-top2.mp3
http://ebs.fuqit.net:9001/resource/public/topmusic/trance2011-top3.mp3

然后进入背景音乐依次按顺序倒序将上面4个音乐设为背景音乐即可,此背景音乐每隔一段时间再打开是自动更换的.

------
经典trance trance流媒体,现在还不能设为背景音乐,主要原因是qq空间播放器不支持流媒体 想听的朋友,只有通过windows自带的win Media Player播放.
开始->运行 windows 7 :
"%ProgramFiles(x86)%\Windows Media Player\wmplayer.exe" http://ebs.fuqit.net:9001/resource/public/topmusic/trance.asx
windows xp/2003:
"%ProgramFiles%\Windows Media Player\wmplayer.exe" http://ebs.fuqit.net:9001/resource/public/topmusic/trance.asx

----
##v1.3.0
保存下列文件为xebs.3322.org-wstop.wpl
然后用winmedia player打开 oebs.3322.org-wstop.wpl 享受音乐吧
请打开这个网址 http://ebs.fuqit.net:9001/resource/public/topmusic/xebs.3322.org-topls.wpl 目前每10分钟自动更新一次。
 下列4个src文件加到qq空间,享受免费无限的背景音乐吧。

<?wpl version="1.0"?>
<smil>
<head>
<meta name="Generator" content="Microsoft Windows Media Player -- 12.0.7600.16667"/>
<meta name="ItemCount" content="1"/>
<title>ebs.fuqit.net-topls</title>
</head>
<body>
<seq>
<media src="http://ebs.fuqit.net:9001/resource/public/topmusic/trance2011-top0.mp3"/>
<media src="http://ebs.fuqit.net:9001/resource/public/topmusic/trance2011-top1.mp3"/>
<media src="http://ebs.fuqit.net:9001/resource/public/topmusic/trance2011-top2.mp3"/>
<media src="http://ebs.fuqit.net:9001/resource/public/topmusic/trance2011-top3.mp3"/>
</seq>
</body>
</smil>
#include "dcmi_ov2640.h" #include "dcmi_ov2640_cfg.h" DCMI_HandleTypeDef hdcmi; // DCMI&frac34;ä±ú DMA_HandleTypeDef DMA_Handle_dcmi; // DMA&frac34;ä±ú volatile uint8_t DCMI_FrameState = 0; // DCMI״̬±êÖ&frac34;£¬µ±Êý&frac34;ÝÖ¡´«ÊäÍê³Éʱ£¬»á±» HAL_DCMI_FrameEventCallback() Öжϻص÷º¯ÊýÖà 1 volatile uint8_t OV2640_FPS ; // Ö¡ÂÊ /************************************************************************************************* * º¯ Êý Ãû: HAL_DCMI_MspInit * Èë¿Ú²ÎÊý: hdcmi - DCMI_HandleTypeDef¶¨ÒåµÄ±äÁ¿£¬&frac14;´±íÊ&frac34;¶¨ÒåµÄ DCMI &frac34;ä±ú * ·µ »Ø Öµ: ÎÞ * º¯Êý&sup1;¦ÄÜ: ³õÊ&frac14;»¯ DCMI Òý&frac12;Å * ˵ Ã÷: ÎÞ *************************************************************************************************/ void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(hdcmi->Instance==DCMI) { __HAL_RCC_DCMI_CLK_ENABLE(); // Ê&sup1;ÄÜ DCMI ÍâÉèʱÖÓ __HAL_RCC_GPIOE_CLK_ENABLE(); // Ê&sup1;ÄÜÏàÓ¦µÄGPIOʱÖÓ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); GPIO_OV2640_PWDN_CLK_ENABLE; // Ê&sup1;ÄÜPWDN Òý&frac12;ÅµÄ GPIO ʱÖÓ /**************************************************************************** Êý&frac34;ÝÒý&frac12;ŠʱÖÓºÍͬ²&frac12;Òý&frac12;Å PH9 ------> DCMI_D0 PG9 ------> DCMI_VSYNC PH10 ------> DCMI_D1 PH8 ------> DCMI_HSYNC PH11 ------> DCMI_D2 PA6 ------> DCMI_PIXCLK PH12 ------> DCMI_D3 PH14 ------> DCMI_D4 SCCB ¿ØÖÆÒý&frac12;Å£¬³õÊ&frac14;»¯ÔÚ camera_sccb.c ÎÄ&frac14;þ PD3 ------> DCMI_D5 PH7 ------> SCCB_SCL PE5 ------> DCMI_D6 PH13 ------> SCCB_SDA PE6 ------> DCMI_D7 µôµç¿ØÖÆÒý&frac12;Å PH15 ------> PWDN ******************************************************************************/ GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); // ³õÊ&frac14;»¯ PWDN Òý&frac12;Å OV2640_PWDN_ON; // ¸ßµçÆ&frac12;£¬&frac12;øÈëµôµçÄ£Ê&frac12;£¬ÉãÏñÍ·Í£Ö&sup1;&sup1;¤×÷£¬´Ëʱ&sup1;¦ºÄ&frac12;µµ&frac12;×îµÍ GPIO_InitStruct.Pin = OV2640_PWDN_PIN; // PWDN Òý&frac12;Å GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // ÍÆÍìÊä³öÄ£Ê&frac12; GPIO_InitStruct.Pull = GPIO_PULLUP; // ÉÏÀ­ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // ËٶȵÈ&frac14;¶µÍ HAL_GPIO_Init(OV2640_PWDN_PORT, &GPIO_InitStruct); // ³õÊ&frac14;»¯ } } /*************************************************************************************************************************************** * º¯ Êý Ãû: MX_DCMI_Init * * º¯Êý&sup1;¦ÄÜ: ÅäÖÃDCMIÏà&sup1;زÎÊý * * ˵ Ã÷: 8λÊý&frac34;ÝÄ£Ê&frac12;£¬È«Êý&frac34;Ý¡¢È«Ö¡²¶×&frac12;£¬¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ void MX_DCMI_Init(void) { hdcmi.Instance = DCMI; hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; // Ó²&frac14;þͬ²&frac12;Ä£Ê&frac12;£¬&frac14;´Ê&sup1;ÓÃÍⲿµÄVS¡¢HSÐźÅ&frac12;øÐÐͬ²&frac12; hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; // ÏñËØÊ±ÖÓÉÏÉýÑØÓÐЧ hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW; // VSµÍµçÆ&frac12;ÓÐЧ hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW; // HSµÍµçÆ&frac12;ÓÐЧ hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME; // ²¶»ñµÈ&frac14;¶£¬ÉèÖÃÿһ֡¶&frac14;&frac12;øÐв¶»ñ hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; // 8λÊý&frac34;ÝÄ£Ê&frac12; hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE; // ²»Ê&sup1;ÓÃDCMIµÄJPEGÄ£Ê&frac12; hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL; // DCMI&frac12;Ó¿Ú²¶×&frac12;ËùÓÐÊý&frac34;Ý hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD; // Ñ¡Ôñ¿ªÊ&frac14;×Ö&frac12;Ú£¬´Ó Ö¡/ÐÐ µÄµÚÒ»¸öÊý&frac34;Ý¿ªÊ&frac14;²¶»ñ hdcmi.Init.LineSelectMode = DCMI_LSM_ALL; // ²¶»ñËùÓÐÐÐ hdcmi.Init.LineSelectStart = DCMI_OELS_ODD; // Ñ¡Ôñ¿ªÊ&frac14;ÐÐ,ÔÚÖ¡¿ªÊ&frac14;ºó²¶»ñµÚÒ»ÐÐ HAL_DCMI_Init(&hdcmi) ; HAL_NVIC_SetPriority(DCMI_IRQn, 0 ,5); // ÉèÖÃÖжÏÓÅÏÈ&frac14;¶ HAL_NVIC_EnableIRQ(DCMI_IRQn); // ¿ªÆôDCMIÖÐ¶Ï //// ÔÚJPGÄ£Ê&frac12;Ï£¬Ò»¶¨Òªµ¥¶ÀÊ&sup1;ÄܸÃÖÐ¶Ï // __HAL_DCMI_ENABLE_IT(&hdcmi, DCMI_IT_FRAME); // Ê&sup1;ÄÜ FRAME ÖÐ¶Ï } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Init * * º¯Êý&sup1;¦ÄÜ: ÅäÖà DMA Ïà&sup1;زÎÊý * * ˵ Ã÷: Ê&sup1;ÓõÄÊÇDMA2£¬ÍâÉèµ&frac12;´æ´¢Æ÷Ä£Ê&frac12;¡¢Êý&frac34;Ýλ¿í32bit¡¢²¢¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ void OV2640_DMA_Init(void) { __HAL_RCC_DMA2_CLK_ENABLE(); // Ê&sup1;ÄÜDMA2ʱÖÓ DMA_Handle_dcmi.Instance = DMA2_Stream7; // DMA2Êý&frac34;ÝÁ÷7 DMA_Handle_dcmi.Init.Request = DMA_REQUEST_DCMI; // DMAÇëÇóÀ´×ÔDCMI DMA_Handle_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY; // ÍâÉèµ&frac12;´æ´¢Æ÷Ä£Ê&frac12; DMA_Handle_dcmi.Init.PeriphInc = DMA_PINC_DISABLE; // ÍâÉèµØÖ·&frac12;ûÖ&sup1;×ÔÔö DMA_Handle_dcmi.Init.MemInc = DMA_MINC_ENABLE; // ´æ´¢Æ÷µØÖ·×ÔÔö DMA_Handle_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; // DCMIÊý&frac34;Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; // ´æ´¢Æ÷Êý&frac34;Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR; // Ñ­»·Ä£Ê&frac12; DMA_Handle_dcmi.Init.Priority = DMA_PRIORITY_LOW; // ÓÅÏÈ&frac14;¶µÍ DMA_Handle_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE; // Ê&sup1;ÄÜfifo DMA_Handle_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; // È«fifoÄ£Ê&frac12;£¬4*32bit´óС DMA_Handle_dcmi.Init.MemBurst = DMA_MBURST_SINGLE; // µ¥´Î´«Êä DMA_Handle_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE; // µ¥´Î´«Êä HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA __HAL_LINKDMA(&hdcmi, DMA_Handle, DMA_Handle_dcmi); // &sup1;ØÁªDCMI&frac34;ä±ú HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 0); // ÉèÖÃÖжÏÓÅÏÈ&frac14;¶ HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); // Ê&sup1;ÄÜÖÐ¶Ï } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Delay * Èë¿Ú²ÎÊý: Delay - ÑÓʱʱ&frac14;䣬µ¥Î» ms * º¯Êý&sup1;¦ÄÜ: &frac14;òµ¥ÑÓʱº¯Êý£¬²»ÊǺÜ&frac34;«È· * ˵ Ã÷: ΪÁËÒÆÖ²µÄ&frac14;ò±ãÐÔ,´Ë´¦²ÉÓÃÈí&frac14;þÑÓʱ£¬Êµ&frac14;ÊÏîÄ¿ÖпÉÒÔÌæ»»³ÉRTOSµÄÑÓʱ»òÕßHAL¿âµÄÑÓʱ *****************************************************************************************************************************************/ void OV2640_Delay(volatile uint32_t Delay) { volatile uint16_t i; while (Delay --) { for (i = 0; i < 20000; i++); } // HAL_Delay(Delay); // ¿ÉÊ&sup1;ÓÃHAL¿âµÄÑÓʱ } /*************************************************************************************************************************************** * º¯ Êý Ãû: DCMI_OV2640_Init * * º¯Êý&sup1;¦ÄÜ: ³õÊ&frac14;SCCB¡¢DCMI¡¢DMAÒÔ&frac14;°ÅäÖÃOV2640 * *****************************************************************************************************************************************/ int8_t DCMI_OV2640_Init(void) { uint16_t Device_ID; // ¶¨Òå±äÁ¿´æ´¢Æ÷&frac14;þID SCCB_GPIO_Config(); // SCCBÒý&frac12;ųõÊ&frac14;»¯ MX_DCMI_Init(); // ³õÊ&frac14;»¯DCMIÅäÖÃÒý&frac12;Å OV2640_DMA_Init(); // ³õÊ&frac14;»¯DMAÅäÖà OV2640_Reset(); // Ö´ÐÐÈí&frac14;þ¸´Î» Device_ID = OV2640_ReadID(); // ¶ÁÈ¡Æ÷&frac14;þID if( (Device_ID == 0x2640) || (Device_ID == 0x2642) ) // &frac12;øÐÐÆ¥Å䣬ʵ&frac14;ÊµÄÆ÷&frac14;þID¿ÉÄÜÊÇ 0x2640 »òÕß 0x2642 { printf ("OV2640 OK,ID:0x%X\r\n",Device_ID); // Æ¥Åäͨ&sup1;ý OV2640_Config( OV2640_SVGA_Config ); // ÅäÖà SVGAÄ£Ê&frac12; ------> 800*600£¬ ×î´óÖ¡ÂÊ30Ö¡ // OV2640_Config( OV2640_UXGA_Config ); // ÅäÖà UXGAÄ£Ê&frac12; ------> 1600*1200£¬×î´óÖ¡ÂÊ15Ö¡ OV2640_Set_Framesize(OV2640_Width,OV2640_Height); // ÉèÖÃOV2640Êä³öµÄÍ&frac14;Ïñ´óС OV2640_DCMI_Crop(Display_Width, Display_Height, OV2640_Width, OV2640_Height ); // &frac12;«OV2640Êä³öÍ&frac14;Ïñ²Ã&frac14;ô³ÉÊÊÓ¦ÆÁÄ»µÄ´óС return OV2640_Success; // ·µ»Ø³É&sup1;¦±êÖ&frac34; } else { printf ("OV2640 ERROR!!!!! ID:%X\r\n",Device_ID); // ¶ÁÈ¡ID´íÎó return OV2640_Error; // ·µ»Ø´íÎó±êÖ&frac34; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Continuous * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA&frac12;«Òª´«ÊäµÄµØÖ·£¬&frac14;´ÓÃÓÚ´æ´¢ÉãÏñÍ·Êý&frac34;ÝµÄ´æ´¢ÇøµØÖ· * DMA_BufferSize - ´«ÊäµÄÊý&frac34;Ý´óС£¬32λ¿í * * º¯Êý&sup1;¦ÄÜ: Æô¶¯DMA´«Ê䣬Á¬ÐøÄ£Ê&frac12; * * ˵ Ã÷: 1. ¿ªÆôÁ¬ÐøÄ£Ê&frac12;Ö®ºó£¬»áÒ»Ö±&frac12;øÐд«Ê䣬³ý·Ç&sup1;ÒÆð»òÕßÍ£Ö&sup1;DCMI * 2. OV2640Ê&sup1;ÓÃRGB565Ä£Ê&frac12;ʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö&frac12;ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý&frac34;ÝΪ32λ¿í£¬&frac14;ÆËã DMA_BufferSize ʱ£¬ÐèÒª³ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ¡ 240*240·Ö±æÂÊ µÄÍ&frac14;Ïñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö&frac12;ÚµÄÊý&frac34;Ý£¬ * Ôò DMA_BufferSize = 115200 / 4 = 28800 ¡£ *LXB *****************************************************************************************************************************************/ void OV2640_DMA_Transmit_Continuous(uint32_t DMA_Buffer,uint32_t DMA_BufferSize) { DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR; // Ñ­»·Ä£Ê&frac12; HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA // Ê&sup1;ÄÜDCMI²É&frac14;¯Êý&frac34;Ý,Á¬Ðø²É&frac14;¯Ä£Ê&frac12; HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)DMA_Buffer,DMA_BufferSize); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Snapshot * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA&frac12;«Òª´«ÊäµÄµØÖ·£¬&frac14;´ÓÃÓÚ´æ´¢ÉãÏñÍ·Êý&frac34;ÝµÄ´æ´¢ÇøµØÖ· * DMA_BufferSize - ´«ÊäµÄÊý&frac34;Ý´óС£¬32λ¿í * * º¯Êý&sup1;¦ÄÜ: Æô¶¯DMA´«Ê䣬¿ìÕÕÄ£Ê&frac12;£¬´«ÊäÒ»Ö¡Í&frac14;ÏñºóÍ£Ö&sup1; * * ˵ Ã÷: 1. ¿ìÕÕÄ£Ê&frac12;£¬Ö»´«ÊäÒ»Ö¡µÄÊý&frac34;Ý * 2. OV2640Ê&sup1;ÓÃRGB565Ä£Ê&frac12;ʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö&frac12;ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý&frac34;ÝΪ32λ¿í£¬&frac14;ÆËã DMA_BufferSize ʱ£¬ÐèÒª³ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ¡ 240*240·Ö±æÂÊ µÄÍ&frac14;Ïñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö&frac12;ÚµÄÊý&frac34;Ý£¬ * Ôò DMA_BufferSize = 115200 / 4 = 28800 ¡£ * 4. Ê&sup1;ÓøÃÄ£Ê&frac12;´«ÊäÍê³ÉÖ®ºó£¬DCMI»á±»&sup1;ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ÐèÒªµ÷Óà OV2640_DCMI_Resume() »Ö¸´DCMI * *****************************************************************************************************************************************/ void OV2640_DMA_Transmit_Snapshot(uint32_t DMA_Buffer,uint32_t DMA_BufferSize) { DMA_Handle_dcmi.Init.Mode = DMA_NORMAL; // Õý³£Ä£Ê&frac12; HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, (uint32_t)DMA_Buffer,DMA_BufferSize); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Suspend * * º¯Êý&sup1;¦ÄÜ: &sup1;ÒÆðDCMI£¬Í£Ö&sup1;²¶»ñÊý&frac34;Ý * * ˵ Ã÷: 1. ¿ªÆôÁ¬ÐøÄ£Ê&frac12;Ö®ºó£¬ÔÙµ÷Óøú¯Êý£¬»áÍ£Ö&sup1;²¶»ñDCMIµÄÊý&frac34;Ý * 2. ¿ÉÒÔµ÷Óà OV2640_DCMI_Resume() »Ö¸´DCMI * 3. ÐèҪעÒâµÄ£¬&sup1;ÒÆðDCMIÆÚ&frac14;䣬DMAÊÇûÓÐÍ£Ö&sup1;&sup1;¤×÷µÄ *LXB *****************************************************************************************************************************************/ void OV2640_DCMI_Suspend(void) { HAL_DCMI_Suspend(&hdcmi); // &sup1;ÒÆðDCMI } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Resume * * º¯Êý&sup1;¦ÄÜ: »Ö¸´DCMI£¬¿ªÊ&frac14;²¶»ñÊý&frac34;Ý * * ˵ Ã÷: 1. µ±DCMI±»&sup1;ÒÆðʱ£¬¿ÉÒÔµ÷Óøú¯Êý»Ö¸´ * 2. Ê&sup1;Óà OV2640_DMA_Transmit_Snapshot() ¿ìÕÕÄ£Ê&frac12;£¬´«ÊäÍê³ÉÖ®ºó£¬DCMIÒ²»á±»&sup1;ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ * ÐèÒªµ÷Óñ&frac34;º¯Êý»Ö¸´DCMI²¶»ñ * *****************************************************************************************************************************************/ void OV2640_DCMI_Resume(void) { (&hdcmi)->State = HAL_DCMI_STATE_BUSY; // ±ä¸üDCMI±êÖ&frac34; (&hdcmi)->Instance->CR |= DCMI_CR_CAPTURE; // ¿ªÆôDCMI²¶»ñ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Stop * * º¯Êý&sup1;¦ÄÜ: &frac12;ûÖ&sup1;DCMIµÄDMAÇëÇó£¬Í£Ö&sup1;DCMI²¶»ñ£¬&frac12;ûÖ&sup1;DCMIÍâÉè * *****************************************************************************************************************************************/ void OV2640_DCMI_Stop(void) { HAL_DCMI_Stop(&hdcmi); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Crop * * Èë¿Ú²ÎÊý: Displey_XSize ¡¢Displey_YSize - ÏÔÊ&frac34;Æ÷µÄ³¤¿í * Sensor_XSize¡¢Sensor_YSize - ÉãÏñÍ·´«¸ÐÆ÷Êä³öÍ&frac14;ÏñµÄ³¤¿í * * º¯Êý&sup1;¦ÄÜ: Ê&sup1;ÓÃDCMIµÄ²Ã&frac14;ô&sup1;¦ÄÜ£¬&frac12;«´«¸ÐÆ÷Êä³öµÄÍ&frac14;Ïñ²Ã&frac14;ô³ÉÊÊÓ¦ÆÁÄ»µÄ´óС * * ˵ Ã÷: 1. ÒòΪÉãÏñÍ·Êä³öµÄ»­Ãæ±ÈÀý&sup1;̶¨Îª4:3£¬²»Ò»¶¨Æ¥ÅäÏÔÊ&frac34;Æ÷ * 2. ÐèҪעÒâµÄÊÇ£¬ÉãÏñÍ·Êä³öµÄÍ&frac14;Ïñ³¤¡¢¿í±ØÐëÒªÄܱ»4Õû³ý£¡£¨ Ê&sup1;ÓÃOV2640_Set_Framesizeº¯Êý&frac12;øÐÐÉèÖà £© * 3. DCMIµÄË®Æ&frac12;ÓÐЧÏñËØÒ²±ØÐëÒªÄܱ»4Õû³ý£¡ * 4. º¯Êý»á&frac14;ÆËãË®Æ&frac12;ºÍ´&sup1;Ö±Æ«ÒÆ£¬&frac34;¡Á¿Èû­Ãæ&frac34;ÓÖвÃ&frac14;ô *****************************************************************************************************************************************/ int8_t OV2640_DCMI_Crop(uint16_t Displey_XSize,uint16_t Displey_YSize,uint16_t Sensor_XSize,uint16_t Sensor_YSize ) { uint16_t DCMI_X_Offset,DCMI_Y_Offset; // Ë®Æ&frac12;ºÍ´&sup1;Ö±Æ«ÒÆ£¬´&sup1;Ö±´ú±íµÄÊÇÐÐÊý£¬Ë®Æ&frac12;´ú±íµÄÊÇÏñËØÊ±ÖÓÊý£¨PCLKÖÜÆÚÊý£© uint16_t DCMI_CAPCNT; // Ë®Æ&frac12;ÓÐЧÏñËØ£¬´ú±íµÄÊÇÏñËØÊ±ÖÓÊý£¨PCLKÖÜÆÚÊý£© uint16_t DCMI_VLINE; // ´&sup1;Ö±ÓÐЧÐÐÊý if( (Displey_XSize>=Sensor_XSize)|| (Displey_YSize>=Sensor_YSize) ) { // printf("ʵ&frac14;ÊÏÔÊ&frac34;µÄ³ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ·Êä³öµÄ³ß´ç£¬Í˳öDCMI²Ã&frac14;ô\r\n"); return OV2640_Error; //Èç&sup1;ûʵ&frac14;ÊÏÔÊ&frac34;µÄ³ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ·Êä³öµÄ³ß´ç£¬ÔòÍ˳öµ±Ç°º¯Êý£¬²»&frac12;øÐвÃ&frac14;ô } // ÔÚÉèÖÃΪRGB565¸ñÊ&frac12;ʱ£¬Ë®Æ&frac12;Æ«ÒÆ£¬±ØÐëÊÇÆæÊý£¬·ñÔò»­ÃæÉ«²Ê²»ÕýÈ·£¬ // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö&frac12;Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔ±ØÐë´ÓÆæÊýλ¿ªÊ&frac14;£¬²»È»Êý&frac34;Ý»á´íÂÒ£¬ // ÐèҪעÒâµÄÊÇ£¬&frac14;Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ&frac14;ËãÆðµÄ £¡ DCMI_X_Offset = Sensor_XSize - Displey_XSize; // ʵ&frac14;Ê&frac14;ÆËã&sup1;ý³ÌΪ£¨Sensor_XSize - LCD_XSize£©/2*2 // &frac14;ÆËã´&sup1;Ö±Æ«ÒÆ£¬&frac34;¡Á¿Èû­Ãæ&frac34;ÓÖвÃ&frac14;ô£¬¸ÃÖµ´ú±íµÄÊÇÐÐÊý£¬ DCMI_Y_Offset = (Sensor_YSize - Displey_YSize)/2-1; // &frac14;Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ&frac14;ËãÆðµÄ£¬ËùÒÔÒª-1 // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö&frac12;Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔÒª³Ë2 // ×îÖյõ&frac12;µÄ&frac14;Ä´æÆ÷Öµ£¬±ØÐëÒªÄܱ»4Õû³ý£¡ DCMI_CAPCNT = Displey_XSize*2-1; // &frac14;Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ&frac14;ËãÆðµÄ£¬ËùÒÔÒª-1 DCMI_VLINE = Displey_YSize-1; // ´&sup1;Ö±ÓÐЧÐÐÊý // printf("%d %d %d %d\r\n",DCMI_X_Offset,DCMI_Y_Offset,DCMI_CAPCNT,DCMI_VLINE); HAL_DCMI_ConfigCrop (&hdcmi,DCMI_X_Offset,DCMI_Y_Offset,DCMI_CAPCNT,DCMI_VLINE);// ÉèÖòÃ&frac14;ô´°¿Ú HAL_DCMI_EnableCrop(&hdcmi); // Ê&sup1;ÄܲÃ&frac14;ô return OV2640_Success; } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Reset * * º¯Êý&sup1;¦ÄÜ: Ö´ÐÐÈí&frac14;þ¸´Î» * * ˵ Ã÷: ÔÚÅäÖÃOV2640֮ǰ£¬ÐèÒªÖ´ÐÐÒ»´ÎÈí&frac14;þ¸´Î» * *****************************************************************************************************************************************/ void OV2640_Reset(void) { OV2640_Delay(5); // µÈ´ýÄ£¿éÉϵçÎȶ¨£¬×îÉÙ5ms£¬È»ºóÀ­µÍPWDN OV2640_PWDN_OFF; // PWDN Òý&frac12;ÅÊä³öµÍµçÆ&frac12;£¬²»¿ªÆôµôµçÄ£Ê&frac12;£¬ÉãÏñÍ·Õý³£&sup1;¤×÷£¬´ËʱÉãÏñÍ·Ä£¿éµÄ°×É«LED»áµãÁÁ // ¸ù&frac34;ÝOV2640µÄÉϵçʱÐò£¬Ó²&frac14;þ¸´Î»µÄ³ÖÐøÊ±&frac14;äÒª>=3ms£¬Â&sup1;С°àµÄOV2640²ÉÓÃÓ²&frac14;þRC¸´Î»£¬³ÖÐøÊ±&frac14;ä´ó¸ÅÔÚ6ms×óÓÒ // Òò´Ë&frac14;ÓÈëÑÓʱ£¬µÈ´ýÓ²&frac14;þ¸´Î»Íê³É²¢Îȶ¨ÏÂÀ´ OV2640_Delay(5); SCCB_WriteReg( OV2640_SEL_Registers, OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR &frac14;Ä´æÆ÷×é SCCB_WriteReg( OV2640_SENSOR_COM7, 0x80); // Æô¶¯Èí&frac14;þ¸´Î» // ¸ù&frac34;ÝOV2640µÄÈí&frac14;þ¸´Î»Ê±Ðò£¬Èí&frac14;þ¸´Î»Ö´Ðкó£¬Òª>=2ms·&frac12;¿ÉÖ´ÐÐSCCBÅäÖ㬴˴¦²ÉÓñ£ÊØÒ»µãµÄ²ÎÊý£¬ÑÓʱ10ms OV2640_Delay(10); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_ReadID * * º¯Êý&sup1;¦ÄÜ: ¶ÁÈ¡ OV2640 µÄÆ÷&frac14;þID * * ˵ Ã÷: ʵ&frac14;ÊµÄÆ÷&frac14;þID¿ÉÄÜÊÇ 0x2640 »òÕß 0x2642£¬Åú´Î²»Í¬ID¿ÉÄܻ᲻һÑù * *****************************************************************************************************************************************/ uint16_t OV2640_ReadID(void) { uint8_t PID_H,PID_L; // ID±äÁ¿ SCCB_WriteReg( OV2640_SEL_Registers, OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR &frac14;Ä´æÆ÷×é PID_H = SCCB_ReadReg(OV2640_SENSOR_PIDH); // ¶ÁÈ¡ID¸ß×Ö&frac12;Ú PID_L = SCCB_ReadReg(OV2640_SENSOR_PIDL); // ¶ÁÈ¡IDµÍ×Ö&frac12;Ú return(PID_H<<8)|PID_L; // ·µ»ØÍêÕûµÄÆ÷&frac14;þID } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Config * * Èë¿Ú²ÎÊý: (*ConfigData)[2] - ÒªÅäÖõIJÎÊý£¬¿ÉÅäÖÃΪ OV2640_SVGA_Config »ò OV2640_UXGA_Config * * º¯Êý&sup1;¦ÄÜ: ÅäÖà OV2640 ´«¸ÐÆ÷ºÍDSP²ÎÊý * * ˵ Ã÷: 1. ¿ÉÅäÖÃΪ SVGA »òÕß UXGAÄ£Ê&frac12; * 2. SVGA ·Ö±æÂÊΪ800*600£¬×î¸ßÖ§³Ö30Ö¡ * 3. UXGA ·Ö±æÂÊΪ1600*1200£¬×î¸ßÖ§³Ö15Ö¡ * 4. ²ÎÊý¶¨ÒåÔÚ dcmi_ov2640_cfg.h * *****************************************************************************************************************************************/ void OV2640_Config( const uint8_t (*ConfigData)[2] ) { uint32_t i; // &frac14;ÆÊý±äÁ¿ for( i=0; ConfigData[i][0]; i++) { SCCB_WriteReg( ConfigData[i][0], ConfigData[i][1]); // &frac12;øÐвÎÊýÅäÖà } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Framesize * * Èë¿Ú²ÎÊý: pixformat - ÏñËØ¸ñÊ&frac12;£¬¿ÉÑ¡Ôñ Pixformat_RGB565¡¢Pixformat_JPEG * * º¯Êý&sup1;¦ÄÜ: ÉèÖÃÊä³öµÄÏñËØ¸ñÊ&frac12; * *****************************************************************************************************************************************/ void OV2640_Set_Pixformat(uint8_t pixformat) { const uint8_t (*ConfigData)[2]; uint32_t i; // &frac14;ÆÊý±äÁ¿ switch (pixformat) { case Pixformat_RGB565: ConfigData = OV2640_RGB565_Config; break; case Pixformat_JPEG: ConfigData = OV2640_JPEG_Config; break; default: break; } for( i=0; ConfigData[i][0]; i++) { SCCB_WriteReg( ConfigData[i][0], ConfigData[i][1]); // &frac12;øÐвÎÊýÅäÖà } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Framesize * * Èë¿Ú²ÎÊý: width - ʵ&frac14;ÊÊä³öÍ&frac14;ÏñµÄ³¤¶È£¬height - ʵ&frac14;ÊÊä³öÍ&frac14;ÏñµÄ¿í¶È * * º¯Êý&sup1;¦ÄÜ: ÉèÖÃʵ&frac14;ÊÊä³öµÄÍ&frac14;Ïñ´óС * * ˵ Ã÷: 1. OV2640ÉèÖÃΪ SVGA£¨800*600£© »òÕß UXGA£¨1600*1200£©Ä£Ê&frac12;£¬Í&frac14;Ïñ´óСͨ³£Óëʵ&frac14;ÊÓÃµÄÆÁÄ»·Ö±æÂʲ»Ò»Ñù£¬ * Òò´Ë¿ÉÒÔµ÷Óôκ¯Êý£¬ÉèÖÃʵ&frac14;ÊÊä³öµÄÍ&frac14;Ïñ´óС * 2. ÐèҪעÒâµÄÊÇ£¬ÒªÉèÖõÄÍ&frac14;Ïñ³¤¡¢¿í±ØÐëÄܱ»4Õû³ý£¡ * 3. ²¢²»ÊÇÉèÖÃÊä³öµÄÍ&frac14;Ïñ·Ö±æÂÊÔ&frac12;С֡ÂÊ&frac34;ÍÔ&frac12;¸ß£¬Ö¡ÂÊÖ»ºÍÅäÖõÄÄ£Ê&frac12;ÓÐ&sup1;Ø£¬ÀýÈçÅäÖÃΪSVGA×î¸ßÖ»ÄÜÖ§³Ö30Ö¡ * *****************************************************************************************************************************************/ int8_t OV2640_Set_Framesize(uint16_t width,uint16_t height) { if( (width%4)||(height%4) ) // Êä³öÍ&frac14;ÏñµÄ´óСһ¶¨ÒªÄܱ»4Õû³ý { return OV2640_Error; // ·µ»Ø´íÎó±êÖ&frac34; } SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP&frac14;Ä´æÆ÷×é SCCB_WriteReg(0X5A, width/4 &0XFF); // ʵ&frac14;ÊÍ&frac14;ÏñÊä³öµÄ¿í¶È£¨OUTW£©£¬7~0 bit£¬&frac14;Ä´æÆ÷µÄÖµµÈÓÚʵ&frac14;ÊÖµ/4 SCCB_WriteReg(0X5B, height/4 &0XFF); // ʵ&frac14;ÊÍ&frac14;ÏñÊä³öµÄ¸ß¶È£¨OUTH£©£¬7~0 bit£¬&frac14;Ä´æÆ÷µÄÖµµÈÓÚʵ&frac14;ÊÖµ/4 SCCB_WriteReg(0X5C, (width/4>>8&0X03)|(height/4>>6&0x04) ); // ÉèÖÃZMHHµÄBit[2:0]£¬Ò²&frac34;ÍÊÇOUTH µÄµÚ 8 bit£¬OUTW µÄµÚ 9~8 bit£¬ SCCB_WriteReg(OV2640_DSP_RESET,0X00); // ¸´Î» return OV2640_Success; // ³É&sup1;¦ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Horizontal_Mirror * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í&frac14;Ïñ»áË®Æ&frac12;&frac34;µÏñ£¬ÖÃ0ʱ»Ö¸´Õý³£ * * º¯Êý&sup1;¦ÄÜ: ÓÃÓÚÉèÖÃÊä³öµÄÍ&frac14;ÏñÊÇ·ñ&frac12;øÐÐË®Æ&frac12;&frac34;µÏñ * *****************************************************************************************************************************************/ int8_t OV2640_Set_Horizontal_Mirror( int8_t ConfigState ) { uint8_t OV2640_Reg; // &frac14;Ä´æÆ÷µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR &frac14;Ä´æÆ÷×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ¡ 0x04 µÄ&frac14;Ä´æÆ÷Öµ // REG04,&frac14;Ä´æÆ÷×é4£¬&frac14;Ä´æÆ÷µØÖ·Îª 0x04£¬¸Ã&frac14;Ä´æÆ÷µÄBit[7]£¬ÓÃÓÚÉèÖÃË®Æ&frac12;ÊÇ·ñ&frac34;µÏñ if ( ConfigState == OV2640_Enable ) // Èç&sup1;ûÊ&sup1;ÄÜ&frac34;µÏñ { OV2640_Reg |= 0X80; // Bit[7]ÖÃ1Ôò&frac34;µÏñ } else // È¡Ïû&frac34;µÏñ { OV2640_Reg &= ~0X80; // Bit[7]ÖÃ0ÔòÊÇÕý³£Ä£Ê&frac12; } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë&frac14;Ä´æÆ÷ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Vertical_Flip * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í&frac14;Ïñ»á´&sup1;Ö±·­×ª£¬ÖÃ0ʱ»Ö¸´Õý³£ * * º¯Êý&sup1;¦ÄÜ: ÓÃÓÚÉèÖÃÊä³öµÄÍ&frac14;ÏñÊÇ·ñ&frac12;øÐд&sup1;Ö±·­×ª * *****************************************************************************************************************************************/ int8_t OV2640_Set_Vertical_Flip( int8_t ConfigState ) { uint8_t OV2640_Reg; // &frac14;Ä´æÆ÷µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR &frac14;Ä´æÆ÷×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ¡ 0x04 µÄ&frac14;Ä´æÆ÷Öµ // REG04,&frac14;Ä´æÆ÷×é4£¬&frac14;Ä´æÆ÷µØÖ·Îª 0x04£¬¸Ã&frac14;Ä´æÆ÷µÄµÚBit[6]£¬ÓÃÓÚÉèÖÃË®Æ&frac12;ÊÇ´&sup1;Ö±·­×ª if ( ConfigState == OV2640_Enable ) { // ´Ë´¦ÉèÖòο&frac14;OpenMVµÄÇý¶¯ // Bit[4]&frac34;ßÌåµÄ×÷ÓÃÊÇʲôÊÖ²áûÓÐ˵£¬Èç&sup1;û´&sup1;Ö±·­×ªÖ®ºó£¬¸Ãλ²»ÖÃ1µÄ»°£¬ÑÕÉ«»á²»¶Ô OV2640_Reg |= 0X40|0x10 ; // Bit[6]ÖÃ1ʱ£¬Í&frac14;Ïñ»á´&sup1;Ö±·­×ª } else // È¡Ïû·­×ª { OV2640_Reg &= ~(0X40|0x10 ); // &frac12;«Bit[6]ºÍBit[4]¶&frac14;д0 } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë&frac14;Ä´æÆ÷ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Saturation * * Èë¿Ú²ÎÊý: Saturation - ±¥ºÍ¶È£¬¿ÉÉèÖÃΪ5¸öµÈ&frac14;¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö&frac14;Ä´æÆ÷ÈçºÎÊ&sup1;Óã¬Òò´ËÕâÀïÖ±&frac12;ÓÊ&sup1;ÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2.±¥ºÍ¶ÈÔ&frac12;¸ß£¬É«²Ê&frac34;ÍÔ&frac12;ÏÊÑÞ£¬µ«µ±ÏàÓ¦µÄÇåÎú¶È»áÏÂ&frac12;µ£¬Ôëµã±ä¶à * *****************************************************************************************************************************************/ void OV2640_Set_Saturation(int8_t Saturation) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP&frac14;Ä´æÆ÷×é switch (Saturation) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x68); SCCB_WriteReg(OV2640_DSP_BPDATA,0x68); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x48); SCCB_WriteReg(OV2640_DSP_BPDATA,0x48); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x38); SCCB_WriteReg(OV2640_DSP_BPDATA,0x38); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x02); SCCB_WriteReg(OV2640_DSP_BPADDR,0x03); SCCB_WriteReg(OV2640_DSP_BPDATA,0x28); SCCB_WriteReg(OV2640_DSP_BPDATA,0x28); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Brightness * * Èë¿Ú²ÎÊý: Brightness - ÁÁ¶È£¬¿ÉÉèÖÃΪ5¸öµÈ&frac14;¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö&frac14;Ä´æÆ÷ÈçºÎÊ&sup1;Óã¬Òò´ËÕâÀïÖ±&frac12;ÓÊ&sup1;ÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2. ÁÁ¶ÈÔ&frac12;¸ß£¬»­Ãæ&frac34;ÍÔ&frac12;Ã÷ÁÁ£¬µ«ÊÇ»á±äÄ£ºýһЩ * *****************************************************************************************************************************************/ void OV2640_Set_Brightness(int8_t Brightness) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP&frac14;Ä´æÆ÷×é switch (Brightness) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x40); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x30); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x10); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x09); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Contrast * * Èë¿Ú²ÎÊý: Contrast - ¶Ô±È¶È£¬¿ÉÉèÖÃΪ5¸öµÈ&frac14;¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö&frac14;Ä´æÆ÷ÈçºÎÊ&sup1;Óã¬Òò´ËÕâÀïÖ±&frac12;ÓÊ&sup1;ÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2. ¶Ô±È¶ÈÔ&frac12;¸ß£¬»­ÃæÔ&frac12;ÇåÎú£¬ºÚ°×Ô&frac12;&frac14;Ó·ÖÃ÷ * *****************************************************************************************************************************************/ void OV2640_Set_Contrast(int8_t Contrast) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP&frac14;Ä´æÆ÷×é switch (Contrast) { case 2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x28); SCCB_WriteReg(OV2640_DSP_BPDATA,0x0c); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case 1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x24); SCCB_WriteReg(OV2640_DSP_BPDATA,0x16); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case 0: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case -1: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x1c); SCCB_WriteReg(OV2640_DSP_BPDATA,0x2a); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; case -2: SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x04); SCCB_WriteReg(OV2640_DSP_BPADDR,0x07); SCCB_WriteReg(OV2640_DSP_BPDATA,0x20); SCCB_WriteReg(OV2640_DSP_BPADDR,0x18); SCCB_WriteReg(OV2640_DSP_BPDATA,0x34); SCCB_WriteReg(OV2640_DSP_BPDATA,0x06); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Effect * * Èë¿Ú²ÎÊý: effect_Mode - ÌØÐ§Ä£Ê&frac12;£¬¿ÉÑ¡Ôñ²ÎÊý OV2640_Effect_Normal¡¢OV2640_Effect_Negative¡¢ * OV2640_Effect_BW¡¢OV2640_Effect_BW_Negative * * º¯Êý&sup1;¦ÄÜ: ÓÃÓÚÉèÖÃOV2640µÄÌØÐ§£¬Õý³£¡¢¸ºÆ¬¡¢ºÚ°×¡¢ºÚ°×+¸ºÆ¬µÈÄ£Ê&frac12; * * ˵ Ã÷: ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö&frac14;Ä´æÆ÷ÈçºÎÊ&sup1;Óã¬Òò´ËÕâÀïÖ±&frac12;ÓÊ&sup1;ÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * *****************************************************************************************************************************************/ void OV2640_Set_Effect(uint8_t effect_Mode) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP&frac14;Ä´æÆ÷×é switch (effect_Mode) { case OV2640_Effect_Normal: // Õý³£Ä£Ê&frac12; SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x00); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_Negative: // ¸ºÆ¬Ä£Ê&frac12;£¬Ò²&frac34;ÍÊÇÑÕɫȫ²¿È¡·´ SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x40); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_BW: // ºÚ°×Ä£Ê&frac12; SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x18); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; case OV2640_Effect_BW_Negative: // ºÚ°×+¸ºÆ¬Ä£Ê&frac12; SCCB_WriteReg(OV2640_DSP_BPADDR,0x00); SCCB_WriteReg(OV2640_DSP_BPDATA,0x58); SCCB_WriteReg(OV2640_DSP_BPADDR,0x05); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); SCCB_WriteReg(OV2640_DSP_BPDATA,0x80); break; default: break; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: HAL_DCMI_FrameEventCallback * * º¯Êý&sup1;¦ÄÜ: Ö¡»Øµ÷º¯Êý£¬Ã¿´«ÊäÒ»Ö¡Êý&frac34;Ý£¬»á&frac12;øÈë¸ÃÖжϷþÎñº¯Êý * * ˵ Ã÷: ÿ´Î´«ÊäÍêÒ»Ö¡£¬¶ÔÏàÓ¦µÄ±êÖ&frac34;λ&frac12;øÐвÙ×÷£¬²¢&frac14;ÆËãÖ¡ÂÊ *****************************************************************************************************************************************/ void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) { static uint32_t DCMI_Tick = 0; // ÓÃÓÚ±£´æµ±Ç°µÄʱ&frac14;ä&frac14;ÆÊýÖµ static uint8_t DCMI_Frame_Count = 0; // Ö¡Êý&frac14;ÆÊý if(HAL_GetTick() - DCMI_Tick >= 1000) // ÿ¸ô 1s &frac14;ÆËãÒ»´ÎÖ¡ÂÊ { DCMI_Tick = HAL_GetTick(); // ÖØÐ»ñÈ¡µ±Ç°Ê±&frac14;ä&frac14;ÆÊýÖµ OV2640_FPS = DCMI_Frame_Count; // »ñµÃfps DCMI_Frame_Count = 0; // &frac14;ÆÊýÇå0 } DCMI_Frame_Count ++; // û&frac12;øÈëÒ»´ÎÖжϣ¨Ã¿´Î´«ÊäÍêÒ»Ö¡Êý&frac34;Ý£©£¬&frac14;ÆÊýÖµ+1 DCMI_FrameState = 1; // ´«ÊäÍê³É±êÖ&frac34;λÖÃ1 } /*************************************************************************************************************************************** * º¯ Êý Ãû: HAL_DCMI_ErrorCallback * * º¯Êý&sup1;¦ÄÜ: ´íÎ󻨵÷º¯Êý * * ˵ Ã÷: µ±·¢ÉúDMA´«Êä´íÎó»òÕßFIFOÒç³ö´íÎó&frac34;Í»á&frac12;øÈë *****************************************************************************************************************************************/ void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi) { // if( HAL_DCMI_GetError(hdcmi) == HAL_DCMI_ERROR_OVR) // { // printf("FIFOÒç³ö´íÎ󣡣¡£¡\r\n"); // } printf("error:0x%x£¡£¡£¡\r\n",HAL_DCMI_GetError(hdcmi)); } /*********************************************************************************************************************************************************************************************************************************************LXB*************/ // Â&sup1;С°à 对代码进行分析
05-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值