CSSµÄclass¡¢id¡¢cssÎļþÃûµÄ³£ÓÃÃüÃû

常用CSS命名规范
本文介绍了一套常用的CSS命名规范,包括页面结构、导航、功能等元素的命名方式,并提供了多种样例,帮助开发者更好地组织CSS代码。

³£ÓõÄCSSÃüÃû¹æÔò

¡¡¡¡Í·£ºheader

¡¡¡¡ÄÚÈÝ£ºcontent/container

¡¡¡¡Î²£ºfooter

¡¡¡¡µ¼º½£ºnav

¡¡¡¡²àÀ¸£ºsidebar

¡¡¡¡À¸Ä¿£ºcolumn

¡¡¡¡Ò³ÃæÍâΧ¿ØÖÆÕûÌå²¼¾Ö¿í¶È£ºwrapper

¡¡¡¡×óÓÒÖУºleft right center

¡¡¡¡µÇ¼Ìõ£ºloginbar

¡¡¡¡±êÖ¾£ºlogo

¡¡¡¡¹ã¸æ£ºbanner

¡¡¡¡Ò³ÃæÖ÷Ì壺main

¡¡¡¡Èȵ㣺hot

¡¡¡¡ÐÂÎÅ£ºnews

¡¡¡¡ÏÂÔØ£ºdownload

¡¡¡¡×Óµ¼º½£ºsubnav

¡¡¡¡²Ëµ¥£ºmenu

¡¡¡¡×Ӳ˵¥£ºsubmenu

¡¡¡¡ËÑË÷£ºsearch

¡¡¡¡ÓÑÇéÁ´½Ó£ºfriendlink

¡¡¡¡Ò³½Å£ºfooter

¡¡¡¡°æÈ¨£ºcopyright

¡¡¡¡¹ö¶¯£ºscroll

¡¡¡¡ÄÚÈÝ£ºcontent

¡¡¡¡±êǩҳ£ºtab

¡¡¡¡ÎÄÕÂÁÐ±í£ºlist

¡¡¡¡ÌáʾÐÅÏ¢£ºmsg

¡¡¡¡Ð¡¼¼ÇÉ£ºtips

¡¡¡¡À¸Ä¿±êÌ⣺title

¡¡¡¡¼ÓÈ룺joinus

¡¡¡¡Ö¸ÄÏ£ºguild

¡¡¡¡·þÎñ£ºservice

¡¡¡¡×¢²á£ºregsiter

¡¡¡¡×´Ì¬£ºstatus

¡¡¡¡Í¶Æ±£ºvote

¡¡¡¡ºÏ×÷»ï°é£ºpartner

¡¡¡¡(¶þ)×¢Ê͵Äд·¨:

¡¡¡¡/* Footer */

¡¡¡¡ÄÚÈÝÇø

¡¡¡¡/* End Footer */

¡¡¡¡(Èý)idµÄÃüÃû:

¡¡¡¡(1)Ò³Ãæ½á¹¹

¡¡¡¡ÈÝÆ÷: container

¡¡¡¡Ò³Í·£ºheader

¡¡¡¡ÄÚÈÝ£ºcontent/container

¡¡¡¡Ò³ÃæÖ÷Ì壺main

¡¡¡¡Ò³Î²£ºfooter

¡¡¡¡µ¼º½£ºnav

¡¡¡¡²àÀ¸£ºsidebar

¡¡¡¡À¸Ä¿£ºcolumn

¡¡¡¡Ò³ÃæÍâΧ¿ØÖÆÕûÌå²¼¾Ö¿í¶È£ºwrapper

¡¡¡¡×óÓÒÖУºleft right center

¡¡¡¡(2)µ¼º½

¡¡¡¡µ¼º½£ºnav

¡¡¡¡Ö÷µ¼º½£ºmainbav

¡¡¡¡×Óµ¼º½£ºsubnav

¡¡¡¡¶¥µ¼º½£ºtopnav

¡¡¡¡±ßµ¼º½£ºsidebar

¡¡¡¡×󵼺½£ºleftsidebar

¡¡¡¡ÓÒµ¼º½£ºrightsidebar

¡¡¡¡²Ëµ¥£ºmenu

¡¡¡¡×Ӳ˵¥£ºsubmenu

¡¡¡¡±êÌâ: title

¡¡¡¡ÕªÒª: summary

¡¡¡¡(3)¹¦ÄÜ

¡¡¡¡±êÖ¾£ºlogo

¡¡¡¡¹ã¸æ£ºbanner

¡¡¡¡µÇ½£ºlogin

¡¡¡¡µÇ¼Ìõ£ºloginbar

¡¡¡¡×¢²á£ºregsiter

¡¡¡¡ËÑË÷£ºsearch

¡¡¡¡¹¦ÄÜÇø£ºshop

¡¡¡¡±êÌ⣺title

¡¡¡¡¼ÓÈ룺joinus

¡¡¡¡×´Ì¬£ºstatus

¡¡¡¡°´Å¥£ºbtn

¡¡¡¡¹ö¶¯£ºscroll

¡¡¡¡±êǩҳ£ºtab

¡¡¡¡ÎÄÕÂÁÐ±í£ºlist

¡¡¡¡ÌáʾÐÅÏ¢£ºmsg

¡¡¡¡µ±Ç°µÄ: current

¡¡¡¡Ð¡¼¼ÇÉ£ºtips

¡¡¡¡Í¼±ê: icon

¡¡¡¡×¢ÊÍ£ºnote

¡¡¡¡Ö¸ÄÏ£ºguild

¡¡¡¡·þÎñ£ºservice

¡¡¡¡Èȵ㣺hot

¡¡¡¡ÐÂÎÅ£ºnews

¡¡¡¡ÏÂÔØ£ºdownload

¡¡¡¡Í¶Æ±£ºvote

¡¡¡¡ºÏ×÷»ï°é£ºpartner

¡¡¡¡ÓÑÇéÁ´½Ó£ºlink

¡¡¡¡°æÈ¨£ºcopyright

¡¡¡¡(ËÄ)classµÄÃüÃû:

¡¡¡¡(1)ÑÕÉ«:ʹÓÃÑÕÉ«µÄÃû³Æ»òÕß16½øÖÆ´úÂë,Èç

¡¡¡¡.red { color: red; }

¡¡¡¡.f60 { color: #f60; }

¡¡¡¡.ff8600 { color: #ff8600; }

¡¡¡¡(2)×ÖÌå´óС,Ö±½ÓʹÓÃ"font+×ÖÌå´óС"×÷ΪÃû³Æ,Èç

¡¡¡¡.font12px { font-size: 12px; }

¡¡¡¡.font9pt {font-size: 9pt; }

¡¡¡¡(3)¶ÔÆëÑùʽ,ʹÓÃ¶ÔÆëÄ¿±êµÄÓ¢ÎÄÃû³Æ,Èç

¡¡¡¡.left { float:left; }

¡¡¡¡.bottom { float:bottom; }

¡¡¡¡(4)±êÌâÀ¸Ñùʽ,ʹÓÃ"Àà±ð+¹¦ÄÜ"µÄ·½Ê½ÃüÃû,Èç

¡¡¡¡.barnews { }

¡¡¡¡.barproduct { }

¡¡¡¡×¢ÒâÊÂÏî::

¡¡¡¡1.Ò»ÂÉСд;

¡¡¡¡2.¾¡Á¿ÓÃÓ¢ÎÄ;

¡¡¡¡3.²»¼ÓÖиܺÍÏ»®Ïß;

¡¡¡¡4.¾¡Á¿²»Ëõд£¬³ý·ÇÒ»¿´¾ÍÃ÷°×µÄµ¥´Ê.

¡¡¡¡Ö÷ÒªµÄ master.css

¡¡¡¡Ä£¿é module.css

¡¡¡¡»ù±¾¹²ÓÃ base.css

¡¡¡¡²¼¾Ö£¬°æÃæ layout.css

¡¡¡¡Ö÷Ìâ themes.css

¡¡¡¡×¨À¸ columns.css

¡¡¡¡ÎÄ×Ö font.css

¡¡¡¡±íµ¥ forms.css

¡¡¡¡²¹¶¡ mend.css

¡¡¡¡´òÓ¡ print.css

#include "sys.h" #include "delay.h" #include "usart.h" #include "includes.h" #include "led.h" /************************************************ ALIENTEK ¾«Ó¢°æSTM32¿ª·¢°åUCOSʵÑé Àý6-1 UCOSIII ÈÎÎñ´´½¨ÓÚɾ³ý ¼¼ÊõÖ§³Ö£ºwww.openedv.com ÌÔ±¦µêÆÌ£ºhttp://eboard.taobao.com ¹Ø×¢Î¢ÐŹ«ÖÚÆ½Ì¨Î¢Ðźţº"ÕýµãÔ­×Ó"£¬Ãâ·Ñ»ñÈ¡STM32×ÊÁÏ¡£ ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ ×÷ÕߣºÕýµãÔ­×Ó @ALIENTEK ************************************************/ //UCOSIIIÖÐÒÔÏÂÓÅÏȼ¶Óû§³ÌÐò²»ÄÜʹÓã¬ALIENTEK //½«ÕâЩÓÅÏȼ¶·ÖÅ䏸ÁËUCOSIIIµÄ5¸öϵͳÄÚ²¿ÈÎÎñ //ÓÅÏȼ¶0£ºÖжϷþÎñ·þÎñ¹ÜÀíÈÎÎñ OS_IntQTask() //ÓÅÏȼ¶1£ºÊ±ÖÓ½ÚÅÄÈÎÎñ OS_TickTask() //ÓÅÏȼ¶2£º¶¨Ê±ÈÎÎñ OS_TmrTask() //ÓÅÏȼ¶OS_CFG_PRIO_MAX-2£ºÍ³¼ÆÈÎÎñ OS_StatTask() //ÓÅÏȼ¶OS_CFG_PRIO_MAX-1£º¿ÕÏÐÈÎÎñ OS_IdleTask() /* ΪÁËʵÏÖÁÙ½çÇøµÄ±£»¤£¬UCOSIIIÌṩÁËÁ½¸öºê£ºOS_CRITICAL_ENTER() ºÍOS_CRITICAL_EXIT()¡£ µ±Ò»¸öÈÎÎñ»òÖжϽøÈëÁÙ½çÇøÊ±£¬Ëü±ØÐëµ÷ÓÃOS_CRITICAL_ENTER()ºêÒÔ»ñµÃÁÙ½çÇøµÄ±£»¤¡£ Õâ¸öºê½«½ûÓÃÖжϣ¬ÒÔÈ·±£Ö´ÐÐÁÙ½çÇøµÄ´úÂë²»»á±»ÖжϻòÇÀÕ¼£¬´Ó¶ø±£Ö¤ÁËÁÙ½çÇøµÄÔ­×ÓÐÔ¡£ µ±´úÂëÖ´ÐÐÍê±Ïʱ£¬ÈÎÎñ»òÖжϱØÐëµ÷ÓÃOS_CRITICAL_EXIT()ºêÀ´»Ö¸´Öжϣ¬ÒÔ±ãÆäËûÈÎÎñºÍÖжϿÉÒÔ·ÃÎʹ²Ïí×ÊÔ´²¢Ö´ÐÐËüÃǵĴúÂë¡£ ʹÓÃOS_CRITICAL_ENTER()ºÍOS_CRITICAL_EXIT()ºêÀ´±£»¤ÁÙ½çÇø£¬ ÄÇôÔÚÈÎÎñT1Ö´ÐеÄÕû¸öʱ¼äÄÚ£¬ÖжϽ«±»½ûÓ㬠ÆäËûÈÎÎñ½«²»ÄÜ·ÃÎʹ²Ïí×ÊÔ´²¢ÇÒÁÙ½çÇøµÄ´úÂ뽫ÒÔÔ­×Ó·½Ê½Ö´ÐÐÍê±Ï¡£ ÕâÑù¿ÉÒÔÈ·±£ÁÙ½çÇø´úÂëµÄÕýÈ·ÐÔ£¬±ÜÃ⾺ÕùÌõ¼þºÍÆäËûͬ²½ÎÊÌâ¡£ */ /* ÔÚUCOS IIIÖУ¬ÈÎÎñµÄÖ´ÐÐ˳ÐòÊÇ»ùÓÚÓÅÏȼ¶µ÷¶ÈËã·¨¡£ ÿ¸öÈÎÎñ¶¼ÓÐÒ»¸öÓÅÏȼ¶£¨0µ½255£©£¬¾ßÓиü¸ßÓÅÏȼ¶µÄÈÎÎñ±ÈµÍÓÅÏȼ¶µÄÈÎÎñ¸ü¿ÉÄܵõ½µ÷¶È¡£ UCOS IIIʹÓÃÇÀռʽµ÷¶È£¬ÕâÒâζ×ŵ±ÓÐÒ»¸ö¸ßÓÅÏȼ¶µÄÈÎÎñ¾ÍÐ÷ʱ£¬µ±Ç°ÕýÔÚÖ´ÐеÄÈÎÎñ½«±»Öжϲ¢ÇÒ¸ßÓÅÏȼ¶ÈÎÎñ½«±»Ö´ÐС£ ÕâÈ·±£Á˾ßÓиü¸ßÓÅÏȼ¶µÄÈÎÎñ¿ÉÒÔ¼°Ê±»ñµÃÖ´ÐУ¬±ÜÃⳤʱ¼ä±»µÍÓÅÏȼ¶ÈÎÎñÕ¼Óô¦ÀíÆ÷µÄÇé¿ö·¢Éú¡£ UCOS IIIÈÎÎñµÄÖ´ÐÐÊÇͨ¹ýÉÏÏÂÎÄÇл»ÊµÏֵġ£ ÉÏÏÂÎÄÇл»ÊÇÖ¸½«´¦ÀíÆ÷µÄ״̬´ÓÒ»¸öÈÎÎñ±£´æµ½Äڴ棬Ȼºó½«ÁíÒ»¸öÈÎÎñµÄ×´Ì¬×°ÔØµ½´¦ÀíÆ÷ÖУ¬ÒÔÔÚ²»¼ä¶ÏµÄÇé¿öÏÂת»»ÈÎÎñÖ´ÐС£ µ±Ò»¸öÈÎÎñÐèÒª±»ÖÐֹʱ£¬¼´Ö´ÐÐOS_TaskSuspend()º¯Êýʱ£¬UCOS III´¦ÀíÆ÷»áÖ´ÐÐÒ»¸öÈÎÎñÇл»Öжϲ¢½«¿ØÖÆÈ¨×ªÒƵ½ÁíÒ»¸öÈÎÎñ¡£ ÈÎÎñÇл»Í¨³£·¢ÉúÔÚÒÔÏÂÇé¿öÏ£º µ±ÈÎÎñÖ÷¶¯µ÷ÓÃÁËÈÎÎñ¿ØÖƺ¯Êý£¨ÀýÈ磬OS_Delay()¡¢OS_EventWait()¡¢OS_TaskSuspend()µÈ£©²¢ÍËÈÃCPUʱ£» µ±Ä³¸öÖжϷþÎñ³ÌÐò(ISR)ÔڹؼüÈÎÎñÖ´ÐÐÆÚ¼äÖ´ÐУ¨¼´ÖжÏÓÅÏȼ¶¸ßÓڹؼüÈÎÎñµÄÓÅÏȼ¶£©¡£ */ //¿ªÊ¼ÈÎÎñ£¬´´½¨ÍêÈÎÎñ¶þºÍÈÎÎñÈý¾Íɾ³ý×Ô¼º //ÈÎÎñÓÅÏȼ¶ #define START_TASK_PRIO 3 //ÈÎÎñ¶ÑÕ»´óС #define START_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB StartTaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK START_TASK_STK[START_STK_SIZE]; //ÈÎÎñº¯Êý void start_task(void *p_arg); ///ÈÎÎñ¶þÁÁµÆ£¬²¢´òÓ¡³öÐÅÏ¢ //ÈÎÎñÓÅÏȼ¶ #define TASK1_TASK_PRIO 4 //ÈÎÎñ¶ÑÕ»´óС #define TASK1_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB Task1_TaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE]; void task1_task(void *p_arg); ///ÈÎÎñÈý£¬´òÓ¡ÈÎÎñÈýÖ´ÐÐÐÅÏ¢ //ÈÎÎñÓÅÏȼ¶ #define TASK2_TASK_PRIO 5 //ÈÎÎñ¶ÑÕ»´óС #define TASK2_STK_SIZE 128 //ÈÎÎñ¿ØÖÆ¿é OS_TCB Task2_TaskTCB; //ÈÎÎñ¶ÑÕ» CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE]; //ÈÎÎñº¯Êý void task2_task(void *p_arg); volatile u8 key_pressed = 0; volatile u8 current_task = 1; void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // ???? GPIO_Init(GPIOA, &GPIO_InitStructure); } void Key_Scan(void) { static u8 key_up = 1; if (key_up && GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { delay_ms(20); // ?? if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { key_up = 0; key_pressed = 1; // ?????? } } else if (!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { key_up = 1; } } //Ö÷º¯Êý int main(void) { OS_ERR err; CPU_SR_ALLOC(); SystemInit();//ÓÉÓÚ±¾¹¤³ÌÊÇÓÉstm32f103zet6ÒÆÖ²ËùÀ´£¬Òò´ËÕâÀïÒò¼ÓÈë±¾º¯ÊýÈ·±£delayº¯ÊýÕý³£Ê¹Óà delay_init(); //ʱÖÓ³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÖжϷÖ×éÅäÖà uart_init(115200); //´®¿Ú³õʼ»¯ LED_Init(); KEY_Init(); // ??????? OSInit(&err); //³õʼ»¯UCOSIII OS_CRITICAL_ENTER(); //½øÈëÁÙ½çÇø //´´½¨¿ªÊ¼ÈÎÎñ OSTaskCreate((OS_TCB * )&StartTaskTCB, //ÈÎÎñ¿ØÖÆ¿é (CPU_CHAR * )"start task", //ÈÎÎñÃû×Ö (OS_TASK_PTR )start_task, //ÈÎÎñº¯Êý (void * )0, //´«µÝ¸øÈÎÎñº¯ÊýµÄ²ÎÊý (OS_PRIO )START_TASK_PRIO, //ÈÎÎñÓÅÏȼ¶ (CPU_STK * )&START_TASK_STK[0], //ÈÎÎñ¶ÑÕ»»ùµØÖ· (CPU_STK_SIZE)START_STK_SIZE/10, //ÈÎÎñ¶ÑÕ»Éî¶ÈÏÞλ (CPU_STK_SIZE)START_STK_SIZE, //ÈÎÎñ¶ÑÕ»´óС (OS_MSG_QTY )0, //ÈÎÎñÄÚ²¿ÏûÏ¢¶ÓÁÐÄܹ»½ÓÊÕµÄ×î´óÏûÏ¢ÊýÄ¿,Ϊ0ʱ½ûÖ¹½ÓÊÕÏûÏ¢ (OS_TICK )0, //µ±Ê¹ÄÜʱ¼äƬÂÖתʱµÄʱ¼äƬ³¤¶È£¬Îª0ʱΪĬÈϳ¤¶È£¬ (void * )0, //Óû§²¹³äµÄ´æ´¢Çø (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //ÈÎÎñÑ¡Ïî (OS_ERR * )&err); //´æ·Å¸Ãº¯Êý´íÎóʱµÄ·µ»ØÖµ OS_CRITICAL_EXIT(); //Í˳öÁÙ½çÇø OSStart(&err); //¿ªÆôUCOSIII } //¿ªÊ¼ÈÎÎñÈÎÎñº¯Êý void start_task(void *p_arg) { OS_ERR err; CPU_SR_ALLOC(); p_arg = p_arg; CPU_Init(); #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); //ͳ¼ÆÈÎÎñ #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN //Èç¹ûʹÄÜÁ˲âÁ¿ÖжϹرÕʱ¼ä CPU_IntDisMeasMaxCurReset(); #endif #if OS_CFG_SCHED_ROUND_ROBIN_EN //µ±Ê¹ÓÃʱ¼äƬÂÖתµÄʱºò //ʹÄÜʱ¼äƬÂÖתµ÷¶È¹¦ÄÜ,ʱ¼äƬ³¤¶ÈΪ1¸öϵͳʱÖÓ½ÚÅÄ£¬¼È1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif OS_CRITICAL_ENTER(); //½øÈëÁÙ½çÇø //´´½¨TASK1ÈÎÎñ OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (CPU_STK_SIZE)TASK1_STK_SIZE/10, (CPU_STK_SIZE)TASK1_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //´´½¨TASK2ÈÎÎñ OSTaskCreate((OS_TCB * )&Task2_TaskTCB, (CPU_CHAR * )"task2 task", (OS_TASK_PTR )task2_task, (void * )0, (OS_PRIO )TASK2_TASK_PRIO, (CPU_STK * )&TASK2_TASK_STK[0], (CPU_STK_SIZE)TASK2_STK_SIZE/10, (CPU_STK_SIZE)TASK2_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); OS_CRITICAL_EXIT(); //Í˳öÁÙ½çÇø OSTaskDel((OS_TCB*)0,&err); //ɾ³ýstart_taskÈÎÎñ×ÔÉí } // ??1:??PB0(LED0) void task1_task(void *p_arg) { OS_ERR err; while (1) { Key_Scan(); if (key_pressed) { current_task = 2; // ?????2 key_pressed = 0; printf("Switch to Task2\n"); } else { // LED0?? GPIO_SetBits(GPIOB, GPIO_Pin_0); // LED0? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms GPIO_ResetBits(GPIOB, GPIO_Pin_0); // LED0? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms } } } void task2_task(void *p_arg) { OS_ERR err; while (1) { Key_Scan(); if (key_pressed) { current_task = 1; // ?????1 key_pressed = 0; printf("Switch back to Task1\n"); } else { // ????2??? // ??:LED1?? GPIO_SetBits(GPIOB, GPIO_Pin_1); // LED1? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms GPIO_ResetBits(GPIOB, GPIO_Pin_1); // LED1? OSTimeDlyHMSM(0, 0, 0, 5000, OS_OPT_TIME_HMSM_STRICT, &err); // 500ms } } }我现在需要刚开始时B0(任务一)LED闪烁,当按下按键后(A0)给予信息量,使得代码进入(任务二),再次摁下按键,两个任务均不执行
06-06
#include "KEY.h" #include "LCD1602.h" #include "HX711.h" sbit ZERO_BUTTON=P2^0; sbit TARE_BUTTON=P2^1; unsigned char DotPos=0;//СÊýµã±êÖ&frac34;¼°Î»Öà unsigned long Weight_Maopi = 0;//Ã«Æ¤ÖØÁ¿ float qupi=0;//ȥƤµÄÖØÁ¿ float Weight_Shiwu = 0;//ʵÎïµÄÖØÁ¿ unsigned int GapValue=350; void System_Init(void);//ϵÍ&sup3;&sup3;õʼ»¯,°üÀ¨Òº&frac34;§ÆÁ&sup3;õʼ»¯¡¢´®¿Ú&sup3;õʼ»¯¡¢Ð£ÕýϵÊý&sup3;õʼ»¯ void Get_Maopi();//¿ª»úºó,Ê×ÏÈ»ñÈ¡Ã«Æ¤ÖØÁ¿ void Get_Weight();//»ñȡʵÎïÖØÁ¿£¬¼ÆËãÎïÆ&middot;×ܼۣ¬Òº&frac34;§ÆÁÏÔÊ&frac34;ÇÒ´®¿Ú´òÓ¡Ïà¹ØÐÅÏ¢ void Display_Weight(void);//ÏÔÊ&frac34;ÖØÁ¿£¬µ¥Î»kg£¬Ò»Î»ÕûÊý£¬ÈýλСÊý void Key_Scan() ;//°´¼üÏìÓ¦&sup3;ÌÐò void delay(unsigned int ms) { unsigned int i, j; for(i = 0; i < ms; i++) for(j = 0; j < 123; j++); } void main() { System_Init();//&sup3;õʼ»¯Ïà¹ØÐÅÏ¢£¬²¥&middot;Å¿ª»úÓïÒô£¬»ñÈ¡Ã«Æ¤ÖØÁ¿µÈ¡£ while(1) { Get_Weight();//»ñÈ¡ÖØÁ¿²¢ÏÔÊ&frac34; if(TARE_BUTTON == 0) { delay(10); if(TARE_BUTTON == 0) { qupi= ReadHX711Value();; while(!TARE_BUTTON); } } if(ZERO_BUTTON == 0) { delay(10); if(ZERO_BUTTON == 0) { Weight_Shiwu = 0; while(!ZERO_BUTTON); } } } //ϵÍ&sup3;&sup3;õʼ»¯,°üÀ¨Òº&frac34;§ÆÁ&sup3;õʼ»¯¡¢´®¿Ú&sup3;õʼ»¯¡¢Ð£ÕýϵÊý&sup3;õʼ»¯ void System_Init(void) { LCD1602_Init();//LCD1602&sup3;õʼ»¯ Get_Maopi(); //&sup3;ÆÃ«Æ¤ÖØÁ¿ LcdShowStr(0,0,"We:00.000"); //¿ª»ú&sup3;õʼÏÔÊ&frac34;ÖØÁ¿ } //¿ª»úºó,Ê×ÏÈ»ñÈ¡Ã«Æ¤ÖØÁ¿ void Get_Maopi() { Weight_Maopi = ReadHX711Value(); } //»ñȡʵÎïÖØÁ¿£¬¼ÆËãÎïÆ&middot;×ܼۣ¬Òº&frac34;§ÆÁÏÔÊ&frac34;ÇÒ´®¿Ú´òÓ¡Ïà¹ØÐÅÏ¢ void Get_Weight() { Weight_Shiwu = ReadHX711Value(); //»ñÈ¡&frac34;»ÖØ£¬×¢ÒâÕâÀï»ñÈ¡µÄÖµÖ»ÊÇHX711¶ÁÈ¡µÄÖµ£¬²¢Î´×ª»»&sup3;ÉÏàÓ¦µÄÖØÁ¿Êý&frac34;Ý,Weight_MaopiÊÇϵÍ&sup3;&sup3;õʼ»¯ÖÐͨ¹ý //Weight_Maopi = HX711_Read()»ñÈ¡µÄÖµ Weight_Shiwu = Weight_Shiwu - Weight_Maopi; Weight_Shiwu = Weight_Shiwu/GapValue/1000-qupi; //¼ÆËãʵÎïµÄʵ¼ÊÖØÁ¿£¬µ¥Î»£ºKg //×¢ÒâÕâÀïµÄ¼¼ÇÉ£ºÇÉÃîÀûÓÃÊý&frac34;ÝÀàÐÍת»»£¬Ê¹µÃÖØÁ¿ÊýÖµ±£Áôµ½Ç§&middot;Ö루&frac34;«È&middot;µ½1g£© Weight_Shiwu = ((float)((unsigned long)(Weight_Shiwu*1000)))/1000; if(Weight_Shiwu > 10.0) //&sup3;¬ÖØ { LcdShowStr(3,0,"--.---"); } else { Display_Weight(); //Òº&frac34;§ÆÁÏÔÊ&frac34;ÖØÁ¿ } } //ÏÔÊ&frac34;ÖØÁ¿£¬µ¥Î»kg£¬Á½Î»ÕûÊý£¬ÈýλСÊý void Display_Weight(void) { unsigned char str[8]; str[0] = (unsigned long)Weight_Shiwu%100/10 + &#39;0&#39;;//&middot;ÖÀë&sup3;öÖØÁ¿µÄʮ룬¼Ó&#39;0&#39;£¬×ª»»Îª×Ö&middot;û str[1] = (unsigned long)Weight_Shiwu%10 + &#39;0&#39;;//&middot;ÖÀë&sup3;öÖØÁ¿µÄ¸ö룬¼Ó&#39;0&#39;£¬×ª»»Îª×Ö&middot;û str[2] = &#39;.&#39;; str[3] = (unsigned long)(Weight_Shiwu*10)%10 + &#39;0&#39;;//&middot;ÖÀë&sup3;öÖØÁ¿µÄÊ®&middot;Ö룬¼Ó&#39;0&#39;£¬×ª»»Îª×Ö&middot;û str[4] = (unsigned long)(Weight_Shiwu*100)%10 + &#39;0&#39;;//&middot;ÖÀë&sup3;öÖØÁ¿µÄ°Ù&middot;Ö룬¼Ó&#39;0&#39;£¬×ª»»Îª×Ö&middot;û str[5] = (unsigned long)(Weight_Shiwu*1000)%10 + &#39;0&#39;;//&middot;ÖÀë&sup3;öÖØÁ¿µÄǧ&middot;Ö룬¼Ó&#39;0&#39;£¬×ª»»Îª×Ö&middot;û str[6] = &#39;\0&#39;; LcdShowStr(3, 0, str); //ÔÚµÚ¶þÐеÄλÖÃ3´¦¿ªÊ¼ÏÔÊ&frac34;ÖØÁ¿£¨×ܹ²Õ¼5¸öλÖã© }
最新发布
06-27
#include "bsp_esp8266.h" #include "common.h" #include "stdio.h" #include "string.h" #include "stdbool.h" #include "bsp_SysTick.h" static void ESP8266_GPIO_Config ( void ); static void ESP8266_USART_Config ( void ); static void ESP8266_USART_NVIC_Configuration ( void ); struct STRUCT_USARTx_Fram strEsp8266_Fram_Record = { 0 }; /** * @brief ESP8266&sup3;õʼ»¯º¯Êý * @param ÎÞ * @retval ÎÞ */ void ESP8266_Init ( void ) { ESP8266_GPIO_Config (); ESP8266_USART_Config (); macESP8266_RST_HIGH_LEVEL(); macESP8266_CH_DISABLE(); } /** * @brief &sup3;õʼ»¯ESP8266Óõ½µÄGPIOÒý½Å * @param ÎÞ * @retval ÎÞ */ static void ESP8266_GPIO_Config ( void ) { /*¶¨ÒåÒ»¸öGPIO_InitTypeDefÀàÐ͵ĽṹÌå*/ GPIO_InitTypeDef GPIO_InitStructure; /* ÅäÖà CH_PD Òý½Å*/ macESP8266_CH_PD_APBxClock_FUN ( macESP8266_CH_PD_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macESP8266_CH_PD_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init ( macESP8266_CH_PD_PORT, & GPIO_InitStructure ); /* ÅäÖà RST Òý½Å*/ macESP8266_RST_APBxClock_FUN ( macESP8266_RST_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macESP8266_RST_PIN; GPIO_Init ( macESP8266_RST_PORT, & GPIO_InitStructure ); } /** * @brief &sup3;õʼ»¯ESP8266Óõ½µÄ USART * @param ÎÞ * @retval ÎÞ */ static void ESP8266_USART_Config ( void ) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* config USART clock */ macESP8266_USART_APBxClock_FUN ( macESP8266_USART_CLK, ENABLE ); macESP8266_USART_GPIO_APBxClock_FUN ( macESP8266_USART_GPIO_CLK, ENABLE ); /* USART GPIO config */ /* Configure USART Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = macESP8266_USART_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(macESP8266_USART_TX_PORT, &GPIO_InitStructure); /* Configure USART Rx as input floating */ GPIO_InitStructure.GPIO_Pin = macESP8266_USART_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(macESP8266_USART_RX_PORT, &GPIO_InitStructure); /* USART1 mode config */ USART_InitStructure.USART_BaudRate = macESP8266_USART_BAUD_RATE; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(macESP8266_USARTx, &USART_InitStructure); /* ÖжÏÅäÖà */ USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); //ʹÄÜ´®¿Ú½ÓÊÕÖÐ¶Ï USART_ITConfig ( macESP8266_USARTx, USART_IT_IDLE, ENABLE ); //ʹÄÜ´®¿Ú×ÜÏß¿ÕÏÐÖÐ¶Ï ESP8266_USART_NVIC_Configuration (); USART_Cmd(macESP8266_USARTx, ENABLE); } /** * @brief ÅäÖà ESP8266 USART µÄ NVIC ÖÐ¶Ï * @param ÎÞ * @retval ÎÞ */ static void ESP8266_USART_NVIC_Configuration ( void ) { NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig ( macNVIC_PriorityGroup_x ); /* Enable the USART2 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = macESP8266_USART_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /* * º¯ÊýÃû£ºESP8266_Rst * ÃèÊö £ºÖØÆôWF-ESP8266Ä£¿é * ÊäÈë £ºÎÞ * &middot;µ»Ø : ÎÞ * µ&divide;Óà £º±» ESP8266_AT_Test µ&divide;Óà */ void ESP8266_Rst ( void ) { #if 0 ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 ); #else macESP8266_RST_LOW_LEVEL(); Delay_ms ( 500 ); macESP8266_RST_HIGH_LEVEL(); #endif } /* * º¯ÊýÃû£ºESP8266_Cmd * ÃèÊö £º¶ÔWF-ESP8266Ä£¿é&middot;¢ËÍATÖ¸Áî * ÊäÈë £ºcmd£¬´ý&middot;¢Ë͵ÄÖ¸Áî * reply1£¬reply2£¬ÆÚ´ýµÄÏìÓ¦£¬ÎªNULL±í²»ÐèÏìÓ¦£¬Á½ÕßΪ»òÂß¼­¹ØÏµ * waittime£¬µÈ´ýÏìÓ¦µÄʱ¼ä * &middot;µ»Ø : 1£¬Ö¸Áî&middot;¢ËÍ&sup3;ɹ¦ * 0£¬Ö¸Áî&middot;¢ËÍʧ°Ü * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime ) { strEsp8266_Fram_Record .InfBit .FramLength = 0; //´ÓпªÊ¼½ÓÊÕеÄÊý&frac34;ݰü macESP8266_Usart ( "%s\r\n", cmd ); if ( ( reply1 == 0 ) && ( reply2 == 0 ) ) //²»ÐèÒª½ÓÊÕÊý&frac34;Ý return true; Delay_ms ( waittime ); //ÑÓʱ strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = &#39;\0&#39;; macPC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF ); if ( ( reply1 != 0 ) && ( reply2 != 0 ) ) return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) || ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) ); else if ( reply1 != 0 ) return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) ); else return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) ); } /* * º¯ÊýÃû£ºESP8266_AT_Test * ÃèÊö £º¶ÔWF-ESP8266Ä£¿é½øÐÐAT²âÊÔÆô¶¯ * ÊäÈë £ºÎÞ * &middot;µ»Ø : ÎÞ * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ //void ESP8266_AT_Test ( void ) //{ // macESP8266_RST_HIGH_LEVEL(); // // Delay_ms ( 1000 ); // // while ( ! ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) ESP8266_Rst (); //} void ESP8266_AT_Test ( void ) { char count=0; macESP8266_RST_HIGH_LEVEL(); Delay_ms ( 1000 ); while ( count < 10 ) { if( ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) return; ESP8266_Rst(); ++ count; } } /* * º¯ÊýÃû£ºESP8266_Net_Mode_Choose * ÃèÊö £ºÑ¡ÔñWF-ESP8266Ä£¿éµÄ¹¤×&divide;ģʽ * ÊäÈë £ºenumMode£¬¹¤×&divide;ģʽ * &middot;µ»Ø : 1£¬Ñ¡Ôñ&sup3;ɹ¦ * 0£¬Ñ¡Ôñʧ°Ü * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode ) { switch ( enumMode ) { case STA: return ESP8266_Cmd ( "AT+CWMODE=1", "OK", "no change", 2500 ); case AP: return ESP8266_Cmd ( "AT+CWMODE=2", "OK", "no change", 2500 ); case STA_AP: return ESP8266_Cmd ( "AT+CWMODE=3", "OK", "no change", 2500 ); default: return false; } } /* * º¯ÊýÃû£ºESP8266_JoinAP * ÃèÊö £ºWF-ESP8266Ä£¿éÁ¬½ÓÍⲿWiFi * ÊäÈë £ºpSSID£¬WiFiÃû&sup3;Æ×Ö&middot;û´® * £ºpPassWord£¬WiFiÃÜÂë×Ö&middot;û´® * &middot;µ»Ø : 1£¬Á¬½Ó&sup3;ɹ¦ * 0£¬Á¬½Óʧ°Ü * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ bool ESP8266_JoinAP ( char * pSSID, char * pPassWord ) { char cCmd [120]; sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord ); return ESP8266_Cmd ( cCmd, "OK", NULL, 5000 ); } /* * º¯ÊýÃû£ºESP8266_BuildAP * ÃèÊö £ºWF-ESP8266Ä£¿é´´½¨WiFiÈȵã * ÊäÈë £ºpSSID£¬WiFiÃû&sup3;Æ×Ö&middot;û´® * £ºpPassWord£¬WiFiÃÜÂë×Ö&middot;û´® * £ºenunPsdMode£¬WiFi¼ÓÃÜ&middot;½Ê½´úºÅ×Ö&middot;û´® * &middot;µ»Ø : 1£¬´´½¨&sup3;ɹ¦ * 0£¬´´½¨Ê§°Ü * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode ) { char cCmd [120]; sprintf ( cCmd, "AT+CWSAP=\"%s\",\"%s\",1,%d", pSSID, pPassWord, enunPsdMode ); return ESP8266_Cmd ( cCmd, "OK", 0, 1000 ); } /* * º¯ÊýÃû£ºESP8266_Enable_MultipleId * ÃèÊö £ºWF-ESP8266Ä£¿éÆô¶¯¶àÁ¬½Ó * ÊäÈë £ºenumEnUnvarnishTx£¬ÅäÖÃÊÇ&middot;ñ¶àÁ¬½Ó * &middot;µ»Ø : 1£¬ÅäÖÃ&sup3;ɹ¦ * 0£¬ÅäÖÃʧ°Ü * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx ) { char cStr [20]; sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) ); return ESP8266_Cmd ( cStr, "OK", 0, 500 ); } /* * º¯ÊýÃû£ºESP8266_Link_Server * ÃèÊö £ºWF-ESP8266Ä£¿éÁ¬½ÓÍⲿ&middot;þÎñÆ&divide; * ÊäÈë £ºenumE£¬ÍøÂçЭÒé * £ºip£¬&middot;þÎñÆ&divide;IP×Ö&middot;û´® * £ºComNum£¬&middot;þÎñÆ&divide;¶Ë¿Ú×Ö&middot;û´® * £ºid£¬Ä£¿éÁ¬½Ó&middot;þÎñÆ&divide;µÄID * &middot;µ»Ø : 1£¬Á¬½Ó&sup3;ɹ¦ * 0£¬Á¬½Óʧ°Ü * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id) { char cStr [100] = { 0 }, cCmd [120]; switch ( enumE ) { case enumTCP: sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum ); break; case enumUDP: sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum ); break; default: break; } if ( id < 5 ) sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr); else sprintf ( cCmd, "AT+CIPSTART=%s", cStr ); return ESP8266_Cmd ( cCmd, "OK", "ALREAY CONNECT", 4000 ); } /* * º¯ÊýÃû£ºESP8266_StartOrShutServer * ÃèÊö £ºWF-ESP8266Ä£¿é¿ªÆô»ò¹Ø±Õ&middot;þÎñÆ&divide;ģʽ * ÊäÈë £ºenumMode£¬¿ªÆô/¹Ø±Õ * £ºpPortNum£¬&middot;þÎñÆ&divide;¶Ë¿ÚºÅ×Ö&middot;û´® * £ºpTimeOver£¬&middot;þÎñÆ&divide;&sup3;¬Ê±Ê±¼ä×Ö&middot;û´®£¬µ¥Î»£ºÃë * &middot;µ»Ø : 1£¬²Ù×&divide;&sup3;ɹ¦ * 0£¬²Ù×&divide;ʧ°Ü * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver ) { char cCmd1 [120], cCmd2 [120]; if ( enumMode ) { sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum ); sprintf ( cCmd2, "AT+CIPSTO=%s", pTimeOver ); return ( ESP8266_Cmd ( cCmd1, "OK", 0, 500 ) && ESP8266_Cmd ( cCmd2, "OK", 0, 500 ) ); } else { sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum ); return ESP8266_Cmd ( cCmd1, "OK", 0, 500 ); } } /* * º¯ÊýÃû£ºESP8266_Get_LinkStatus * ÃèÊö £º»ñÈ¡ WF-ESP8266 µÄÁ¬½Ó״̬£¬½ÏÊʺϵ¥¶Ë¿ÚʱʹÓà * ÊäÈë £ºÎÞ * &middot;µ»Ø : 2£¬»ñµÃip * 3£¬½¨Á¢Á¬½Ó * 3£¬Ê§È¥Á¬½Ó * 0£¬»ñȡ״̬ʧ°Ü * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ uint8_t ESP8266_Get_LinkStatus ( void ) { if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) ) { if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:2\r\n" ) ) return 2; else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:3\r\n" ) ) return 3; else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:4\r\n" ) ) return 4; } return 0; } /* * º¯ÊýÃû£ºESP8266_Get_IdLinkStatus * ÃèÊö £º»ñÈ¡ WF-ESP8266 µÄ¶Ë¿Ú£¨Id£©Á¬½Ó״̬£¬½ÏÊʺ϶à¶Ë¿ÚʱʹÓà * ÊäÈë £ºÎÞ * &middot;µ»Ø : ¶Ë¿Ú£¨Id£©µÄÁ¬½Ó״̬£¬µÍ5λΪÓÐЧ룬&middot;Ö±ð¶ÔÓ¦Id5~0£¬Ä&sup3;λÈôÖÃ1±í¸ÃId½¨Á¢ÁËÁ¬½Ó£¬Èô±»Çå0±í¸ÃId佨Á¢Á¬½Ó * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ uint8_t ESP8266_Get_IdLinkStatus ( void ) { uint8_t ucIdLinkStatus = 0x00; if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) ) { if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:0," ) ) ucIdLinkStatus |= 0x01; else ucIdLinkStatus &= ~ 0x01; if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:1," ) ) ucIdLinkStatus |= 0x02; else ucIdLinkStatus &= ~ 0x02; if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:2," ) ) ucIdLinkStatus |= 0x04; else ucIdLinkStatus &= ~ 0x04; if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:3," ) ) ucIdLinkStatus |= 0x08; else ucIdLinkStatus &= ~ 0x08; if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:4," ) ) ucIdLinkStatus |= 0x10; else ucIdLinkStatus &= ~ 0x10; } return ucIdLinkStatus; } /* * º¯ÊýÃû£ºESP8266_Inquire_ApIp * ÃèÊö £º»ñÈ¡ F-ESP8266 µÄ AP IP * ÊäÈë £ºpApIp£¬´æ&middot;Å AP IP µÄÊý×éµÄÊ×µØÖ&middot; * ucArrayLength£¬´æ&middot;Å AP IP µÄÊý×éµÄ&sup3;¤¶È * &middot;µ»Ø : 0£¬»ñȡʧ°Ü * 1£¬»ñÈ¡&sup3;ɹ¦ * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ uint8_t ESP8266_Inquire_ApIp ( char * pApIp, uint8_t ucArrayLength ) { char uc; char * pCh; ESP8266_Cmd ( "AT+CIFSR", "OK", 0, 500 ); pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "APIP,\"" ); if ( pCh ) pCh += 6; else return 0; for ( uc = 0; uc < ucArrayLength; uc ++ ) { pApIp [ uc ] = * ( pCh + uc); if ( pApIp [ uc ] == &#39;\"&#39; ) { pApIp [ uc ] = &#39;\0&#39;; break; } } return 1; } /* * º¯ÊýÃû£ºESP8266_UnvarnishSend * ÃèÊö £ºÅäÖÃWF-ESP8266Ä£¿é½øÈë͸´«&middot;¢ËÍ * ÊäÈë £ºÎÞ * &middot;µ»Ø : 1£¬ÅäÖÃ&sup3;ɹ¦ * 0£¬ÅäÖÃʧ°Ü * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ bool ESP8266_UnvarnishSend ( void ) { if ( ! ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 ) ) return false; return ESP8266_Cmd ( "AT+CIPSEND", "OK", ">", 500 ); } /* * º¯ÊýÃû£ºESP8266_ExitUnvarnishSend * ÃèÊö £ºÅäÖÃWF-ESP8266Ä£¿éÍË&sup3;ö͸´«Ä£Ê½ * ÊäÈë £ºÎÞ * &middot;µ»Ø : ÎÞ * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ void ESP8266_ExitUnvarnishSend ( void ) { Delay_ms ( 1000 ); macESP8266_Usart ( "+++" ); Delay_ms ( 500 ); } /* * º¯ÊýÃû£ºESP8266_SendString * ÃèÊö £ºWF-ESP8266Ä£¿é&middot;¢ËÍ×Ö&middot;û´® * ÊäÈë £ºenumEnUnvarnishTx£¬ÉùÃ&divide;ÊÇ&middot;ñÒÑʹÄÜÁË͸´«Ä£Ê½ * £ºpStr£¬Òª&middot;¢Ë͵Ä×Ö&middot;û´® * £ºulStrLength£¬Òª&middot;¢Ë͵Ä×Ö&middot;û´®µÄ×Ö½ÚÊý * £ºucId£¬ÄĸöID&middot;¢Ë͵Ä×Ö&middot;û´® * &middot;µ»Ø : 1£¬&middot;¢ËÍ&sup3;ɹ¦ * 0£¬&middot;¢ËÍʧ°Ü * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ bool ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId ) { char cStr [20]; bool bRet = false; if ( enumEnUnvarnishTx ) { macESP8266_Usart ( "%s", pStr ); bRet = true; } else { if ( ucId < 5 ) sprintf ( cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2 ); else sprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 ); ESP8266_Cmd ( cStr, "> ", 0, 1000 ); bRet = ESP8266_Cmd ( pStr, "SEND OK", 0, 1000 ); } return bRet; } /* * º¯ÊýÃû£ºESP8266_ReceiveString * ÃèÊö £ºWF-ESP8266Ä£¿é½ÓÊÕ×Ö&middot;û´® * ÊäÈë £ºenumEnUnvarnishTx£¬ÉùÃ&divide;ÊÇ&middot;ñÒÑʹÄÜÁË͸´«Ä£Ê½ * &middot;µ»Ø : ½ÓÊÕµ½µÄ×Ö&middot;û´®Ê×µØÖ&middot; * µ&divide;Óà £º±»Íⲿµ&divide;Óà */ char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx ) { char * pRecStr = 0; strEsp8266_Fram_Record .InfBit .FramLength = 0; strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0; while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag ); strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = &#39;\0&#39;; if ( enumEnUnvarnishTx ) pRecStr = strEsp8266_Fram_Record .Data_RX_BUF; else { if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) ) pRecStr = strEsp8266_Fram_Record .Data_RX_BUF; } return pRecStr; } 对每一行加上注释
06-24
#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;ÝÖ¡´«ÊäÍê&sup3;Éʱ£¬»á±» HAL_DCMI_FrameEventCallback() Öжϻص&divide;º¯ÊýÖà 1 volatile uint8_t OV2640_FPS ; // Ö¡ÂÊ /************************************************************************************************* * º¯ Êý Ãû: HAL_DCMI_MspInit * Èë¿Ú²ÎÊý: hdcmi - DCMI_HandleTypeDef¶¨ÒåµÄ±äÁ¿£¬¼´±íÊ&frac34;¶¨ÒåµÄ DCMI &frac34;ä±ú * &middot;µ »Ø Öµ: ÎÞ * º¯Êý¹¦ÄÜ: &sup3;õʼ»¯ DCMI Òý½Å * ˵ Ã&divide;: ÎÞ *************************************************************************************************/ void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(hdcmi->Instance==DCMI) { __HAL_RCC_DCMI_CLK_ENABLE(); // ʹÄÜ DCMI ÍâÉèʱÖÓ __HAL_RCC_GPIOE_CLK_ENABLE(); // ʹÄÜÏàÓ¦µÄ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; // ʹÄÜPWDN Òý½ÅµÄ GPIO ʱÖÓ /**************************************************************************** Êý&frac34;ÝÒý½Å ʱÖÓºÍͬ²½Òý½Å 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 ¿ØÖÆÒý½Å£¬&sup3;õʼ»¯ÔÚ camera_sccb.c Îļþ PD3 ------> DCMI_D5 PH7 ------> SCCB_SCL PE5 ------> DCMI_D6 PH13 ------> SCCB_SDA PE6 ------> DCMI_D7 µôµç¿ØÖÆÒý½Å 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); // &sup3;õʼ»¯ PWDN Òý½Å OV2640_PWDN_ON; // ¸ßµçƽ£¬½øÈëµôµçģʽ£¬ÉãÏñÍ&middot;Í£Ö¹¹¤×&divide;£¬´Ëʱ¹¦ºÄ½µµ½×îµÍ GPIO_InitStruct.Pin = OV2640_PWDN_PIN; // PWDN Òý½Å GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // ÍÆÍìÊä&sup3;öģʽ GPIO_InitStruct.Pull = GPIO_PULLUP; // ÉÏÀ­ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Ëٶȵȼ¶µÍ HAL_GPIO_Init(OV2640_PWDN_PORT, &GPIO_InitStruct); // &sup3;õʼ»¯ } } /*************************************************************************************************************************************** * º¯ Êý Ãû: MX_DCMI_Init * * º¯Êý¹¦ÄÜ: ÅäÖÃDCMIÏà¹Ø²ÎÊý * * ˵ Ã&divide;: 8λÊý&frac34;Ýģʽ£¬È«Êý&frac34;Ý¡¢È«Ö¡²¶×½£¬¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ void MX_DCMI_Init(void) { hdcmi.Instance = DCMI; hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; // Ó²¼þͬ²½Ä£Ê½£¬¼´Ê¹ÓÃÍⲿµÄVS¡¢HSÐźŽøÐÐͬ²½ hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; // ÏñËØÊ±ÖÓÉÏÉýÑØÓÐЧ hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW; // VSµÍµçƽÓÐЧ hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW; // HSµÍµçƽÓÐЧ hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME; // ²¶»ñµÈ¼¶£¬ÉèÖÃÿһ֡¶¼½øÐв¶»ñ hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; // 8λÊý&frac34;Ýģʽ hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE; // ²»Ê¹ÓÃDCMIµÄJPEGģʽ hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL; // DCMI½Ó¿Ú²¶×½ËùÓÐÊý&frac34;Ý hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD; // Ñ¡Ôñ¿ªÊ¼×Ö½Ú£¬´Ó Ö¡/ÐÐ µÄµÚÒ»¸öÊý&frac34;Ý¿ªÊ¼²¶»ñ hdcmi.Init.LineSelectMode = DCMI_LSM_ALL; // ²¶»ñËùÓÐÐÐ hdcmi.Init.LineSelectStart = DCMI_OELS_ODD; // Ñ¡Ôñ¿ªÊ¼ÐÐ,ÔÚÖ¡¿ªÊ¼ºó²¶»ñµÚÒ»ÐÐ HAL_DCMI_Init(&hdcmi) ; HAL_NVIC_SetPriority(DCMI_IRQn, 0 ,5); // ÉèÖÃÖжÏÓÅÏȼ¶ HAL_NVIC_EnableIRQ(DCMI_IRQn); // ¿ªÆôDCMIÖÐ¶Ï //// ÔÚJPGģʽÏ£¬Ò»¶¨Òªµ¥¶ÀʹÄܸÃÖÐ¶Ï // __HAL_DCMI_ENABLE_IT(&hdcmi, DCMI_IT_FRAME); // ʹÄÜ FRAME ÖÐ¶Ï } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Init * * º¯Êý¹¦ÄÜ: ÅäÖà DMA Ïà¹Ø²ÎÊý * * ˵ Ã&divide;: ʹÓõÄÊÇDMA2£¬ÍâÉèµ½´æ´¢Æ&divide;ģʽ¡¢Êý&frac34;Ýλ¿í32bit¡¢²¢¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ void OV2640_DMA_Init(void) { __HAL_RCC_DMA2_CLK_ENABLE(); // ʹÄÜDMA2ʱÖÓ DMA_Handle_dcmi.Instance = DMA2_Stream7; // DMA2Êý&frac34;ÝÁ&divide;7 DMA_Handle_dcmi.Init.Request = DMA_REQUEST_DCMI; // DMAÇëÇóÀ´×ÔDCMI DMA_Handle_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY; // ÍâÉèµ½´æ´¢Æ&divide;ģʽ DMA_Handle_dcmi.Init.PeriphInc = DMA_PINC_DISABLE; // ÍâÉèµØÖ&middot;½ûÖ¹×ÔÔö DMA_Handle_dcmi.Init.MemInc = DMA_MINC_ENABLE; // ´æ´¢Æ&divide;µØÖ&middot;×ÔÔö DMA_Handle_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; // DCMIÊý&frac34;Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; // ´æ´¢Æ&divide;Êý&frac34;Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR; // Ñ­»&middot;ģʽ DMA_Handle_dcmi.Init.Priority = DMA_PRIORITY_LOW; // ÓÅÏȼ¶µÍ DMA_Handle_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE; // ʹÄÜfifo DMA_Handle_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; // È«fifoģʽ£¬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); // ¹ØÁªDCMI&frac34;ä±ú HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 0); // ÉèÖÃÖжÏÓÅÏȼ¶ HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); // ʹÄÜÖÐ¶Ï } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Delay * Èë¿Ú²ÎÊý: Delay - ÑÓʱʱ¼ä£¬µ¥Î» ms * º¯Êý¹¦ÄÜ: ¼òµ¥ÑÓʱº¯Êý£¬²»ÊǺÜ&frac34;«È&middot; * ˵ Ã&divide;: ΪÁËÒÆÖ²µÄ¼ò±ãÐÔ,´Ë´¦²ÉÓÃÈí¼þÑÓʱ£¬Êµ¼ÊÏîÄ¿ÖпÉÒÔÌæ»»&sup3;ÉRTOSµÄÑÓʱ»òÕßHAL¿âµÄÑÓʱ *****************************************************************************************************************************************/ void OV2640_Delay(volatile uint32_t Delay) { volatile uint16_t i; while (Delay --) { for (i = 0; i < 20000; i++); } // HAL_Delay(Delay); // ¿ÉʹÓÃHAL¿âµÄÑÓʱ } /*************************************************************************************************************************************** * º¯ Êý Ãû: DCMI_OV2640_Init * * º¯Êý¹¦ÄÜ: &sup3;õʼSCCB¡¢DCMI¡¢DMAÒÔ¼°ÅäÖÃOV2640 * *****************************************************************************************************************************************/ int8_t DCMI_OV2640_Init(void) { uint16_t Device_ID; // ¶¨Òå±äÁ¿´æ´¢Æ&divide;¼þID SCCB_GPIO_Config(); // SCCBÒý½Å&sup3;õʼ»¯ MX_DCMI_Init(); // &sup3;õʼ»¯DCMIÅäÖÃÒý½Å OV2640_DMA_Init(); // &sup3;õʼ»¯DMAÅäÖà OV2640_Reset(); // Ö´ÐÐÈí¼þ¸´Î» Device_ID = OV2640_ReadID(); // ¶ÁÈ¡Æ&divide;¼þID if( (Device_ID == 0x2640) || (Device_ID == 0x2642) ) // ½øÐÐÆ¥Å䣬ʵ¼ÊµÄÆ&divide;¼þID¿ÉÄÜÊÇ 0x2640 »òÕß 0x2642 { printf ("OV2640 OK,ID:0x%X\r\n",Device_ID); // Æ¥Åäͨ¹ý OV2640_Config( OV2640_SVGA_Config ); // ÅäÖà SVGAģʽ ------> 800*600£¬ ×î´óÖ¡ÂÊ30Ö¡ // OV2640_Config( OV2640_UXGA_Config ); // ÅäÖà UXGAģʽ ------> 1600*1200£¬×î´óÖ¡ÂÊ15Ö¡ OV2640_Set_Framesize(OV2640_Width,OV2640_Height); // ÉèÖÃOV2640Êä&sup3;öµÄͼÏñ´óС OV2640_DCMI_Crop(Display_Width, Display_Height, OV2640_Width, OV2640_Height ); // ½«OV2640Êä&sup3;öͼÏñ²Ã¼ô&sup3;ÉÊÊÓ¦ÆÁÄ»µÄ´óС return OV2640_Success; // &middot;µ»Ø&sup3;ɹ¦±êÖ&frac34; } else { printf ("OV2640 ERROR!!!!! ID:%X\r\n",Device_ID); // ¶ÁÈ¡ID´íÎó return OV2640_Error; // &middot;µ»Ø´íÎó±êÖ&frac34; } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Continuous * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA½«Òª´«ÊäµÄµØÖ&middot;£¬¼´ÓÃÓÚ´æ´¢ÉãÏñÍ&middot;Êý&frac34;ÝµÄ´æ´¢ÇøµØÖ&middot; * DMA_BufferSize - ´«ÊäµÄÊý&frac34;Ý´óС£¬32λ¿í * * º¯Êý¹¦ÄÜ: Æô¶¯DMA´«Ê䣬Á¬ÐøÄ£Ê½ * * ˵ Ã&divide;: 1. ¿ªÆôÁ¬ÐøÄ£Ê½Ö®ºó£¬»áÒ»Ö±½øÐд«Ê䣬&sup3;ý&middot;Ç¹ÒÆð»òÕßÍ£Ö¹DCMI * 2. OV2640ʹÓÃRGB565ģʽʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö½ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý&frac34;ÝΪ32λ¿í£¬¼ÆËã DMA_BufferSize ʱ£¬ÐèÒª&sup3;ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ¡ 240*240&middot;Ö±æÂÊ µÄͼÏñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö½ÚµÄÊý&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; // Ñ­»&middot;ģʽ HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA // ʹÄÜDCMI²É¼¯Êý&frac34;Ý,Á¬Ðø²É¼¯Ä£Ê½ HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)DMA_Buffer,DMA_BufferSize); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Snapshot * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA½«Òª´«ÊäµÄµØÖ&middot;£¬¼´ÓÃÓÚ´æ´¢ÉãÏñÍ&middot;Êý&frac34;ÝµÄ´æ´¢ÇøµØÖ&middot; * DMA_BufferSize - ´«ÊäµÄÊý&frac34;Ý´óС£¬32λ¿í * * º¯Êý¹¦ÄÜ: Æô¶¯DMA´«Ê䣬¿ìÕÕģʽ£¬´«Êäһ֡ͼÏñºóÍ£Ö¹ * * ˵ Ã&divide;: 1. ¿ìÕÕģʽ£¬Ö»´«ÊäÒ»Ö¡µÄÊý&frac34;Ý * 2. OV2640ʹÓÃRGB565ģʽʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö½ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý&frac34;ÝΪ32λ¿í£¬¼ÆËã DMA_BufferSize ʱ£¬ÐèÒª&sup3;ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ¡ 240*240&middot;Ö±æÂÊ µÄͼÏñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö½ÚµÄÊý&frac34;Ý£¬ * Ôò DMA_BufferSize = 115200 / 4 = 28800 ¡£ * 4. ʹÓøÃģʽ´«ÊäÍê&sup3;ÉÖ®ºó£¬DCMI»á±»¹ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ÐèÒªµ&divide;Óà OV2640_DCMI_Resume() »Ö¸´DCMI * *****************************************************************************************************************************************/ void OV2640_DMA_Transmit_Snapshot(uint32_t DMA_Buffer,uint32_t DMA_BufferSize) { DMA_Handle_dcmi.Init.Mode = DMA_NORMAL; // Õý&sup3;£Ä£Ê½ HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, (uint32_t)DMA_Buffer,DMA_BufferSize); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Suspend * * º¯Êý¹¦ÄÜ: ¹ÒÆðDCMI£¬Í£Ö¹²¶»ñÊý&frac34;Ý * * ˵ Ã&divide;: 1. ¿ªÆôÁ¬ÐøÄ£Ê½Ö®ºó£¬ÔÙµ&divide;Óøú¯Êý£¬»áÍ£Ö¹²¶»ñDCMIµÄÊý&frac34;Ý * 2. ¿ÉÒÔµ&divide;Óà OV2640_DCMI_Resume() »Ö¸´DCMI * 3. ÐèҪעÒâµÄ£¬¹ÒÆðDCMIÆÚ¼ä£¬DMAÊÇûÓÐÍ£Ö¹¹¤×&divide;µÄ *LXB *****************************************************************************************************************************************/ void OV2640_DCMI_Suspend(void) { HAL_DCMI_Suspend(&hdcmi); // ¹ÒÆðDCMI } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Resume * * º¯Êý¹¦ÄÜ: »Ö¸´DCMI£¬¿ªÊ¼²¶»ñÊý&frac34;Ý * * ˵ Ã&divide;: 1. µ±DCMI±»¹ÒÆðʱ£¬¿ÉÒÔµ&divide;Óøú¯Êý»Ö¸´ * 2. ʹÓà OV2640_DMA_Transmit_Snapshot() ¿ìÕÕģʽ£¬´«ÊäÍê&sup3;ÉÖ®ºó£¬DCMIÒ²»á±»¹ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ * ÐèÒªµ&divide;Óñ&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 * * º¯Êý¹¦ÄÜ: ½ûÖ¹DCMIµÄDMAÇëÇó£¬Í£Ö¹DCMI²¶»ñ£¬½ûÖ¹DCMIÍâÉè * *****************************************************************************************************************************************/ void OV2640_DCMI_Stop(void) { HAL_DCMI_Stop(&hdcmi); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Crop * * Èë¿Ú²ÎÊý: Displey_XSize ¡¢Displey_YSize - ÏÔÊ&frac34;Æ&divide;µÄ&sup3;¤¿í * Sensor_XSize¡¢Sensor_YSize - ÉãÏñÍ&middot;´«¸ÐÆ&divide;Êä&sup3;öͼÏñµÄ&sup3;¤¿í * * º¯Êý¹¦ÄÜ: ʹÓÃDCMIµÄ²Ã¼ô¹¦ÄÜ£¬½«´«¸ÐÆ&divide;Êä&sup3;öµÄͼÏñ²Ã¼ô&sup3;ÉÊÊÓ¦ÆÁÄ»µÄ´óС * * ˵ Ã&divide;: 1. ÒòΪÉãÏñÍ&middot;Êä&sup3;öµÄ»­Ãæ±ÈÀý¹Ì¶¨Îª4:3£¬²»Ò»¶¨Æ¥ÅäÏÔÊ&frac34;Æ&divide; * 2. ÐèҪעÒâµÄÊÇ£¬ÉãÏñÍ&middot;Êä&sup3;öµÄͼÏñ&sup3;¤¡¢¿í±ØÐëÒªÄܱ»4Õû&sup3;ý£¡£¨ ʹÓÃOV2640_Set_Framesizeº¯Êý½øÐÐÉèÖà £© * 3. DCMIµÄˮƽÓÐЧÏñËØÒ²±ØÐëÒªÄܱ»4Õû&sup3;ý£¡ * 4. º¯Êý»á¼ÆËãˮƽºÍ´¹Ö±Æ«ÒÆ£¬&frac34;¡Á¿Èû­Ãæ&frac34;ÓÖвüô *****************************************************************************************************************************************/ 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; // ˮƽºÍ´¹Ö±Æ«ÒÆ£¬´¹Ö±´ú±íµÄÊÇÐÐÊý£¬Ë®Æ½´ú±íµÄÊÇÏñËØÊ±ÖÓÊý£¨PCLKÖÜÆÚÊý£© uint16_t DCMI_CAPCNT; // ˮƽÓÐЧÏñËØ£¬´ú±íµÄÊÇÏñËØÊ±ÖÓÊý£¨PCLKÖÜÆÚÊý£© uint16_t DCMI_VLINE; // ´¹Ö±ÓÐЧÐÐÊý if( (Displey_XSize>=Sensor_XSize)|| (Displey_YSize>=Sensor_YSize) ) { // printf("ʵ¼ÊÏÔÊ&frac34;µÄ&sup3;ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ&middot;Êä&sup3;öµÄ&sup3;ߴ磬ÍË&sup3;öDCMI²Ã¼ô\r\n"); return OV2640_Error; //Èç¹ûʵ¼ÊÏÔÊ&frac34;µÄ&sup3;ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ&middot;Êä&sup3;öµÄ&sup3;ߴ磬ÔòÍË&sup3;öµ±Ç°º¯Êý£¬²»½øÐвüô } // ÔÚÉèÖÃΪRGB565¸ñʽʱ£¬Ë®Æ½Æ«ÒÆ£¬±ØÐëÊÇÆæÊý£¬&middot;ñÔò»­ÃæÉ«²Ê²»ÕýÈ&middot;£¬ // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö½Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔ±ØÐë´ÓÆæÊýλ¿ªÊ¼£¬²»È»Êý&frac34;Ý»á´íÂÒ£¬ // ÐèҪעÒâµÄÊÇ£¬¼Ä´æÆ&divide;ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ £¡ DCMI_X_Offset = Sensor_XSize - Displey_XSize; // ʵ¼Ê¼ÆËã¹ý&sup3;ÌΪ£¨Sensor_XSize - LCD_XSize£©/2*2 // ¼ÆËã´¹Ö±Æ«ÒÆ£¬&frac34;¡Á¿Èû­Ãæ&frac34;ÓÖвüô£¬¸ÃÖµ´ú±íµÄÊÇÐÐÊý£¬ DCMI_Y_Offset = (Sensor_YSize - Displey_YSize)/2-1; // ¼Ä´æÆ&divide;ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ£¬ËùÒÔÒª-1 // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö½Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔÒª&sup3;Ë2 // ×îÖյõ½µÄ¼Ä´æÆ&divide;Öµ£¬±ØÐëÒªÄܱ»4Õû&sup3;ý£¡ DCMI_CAPCNT = Displey_XSize*2-1; // ¼Ä´æÆ&divide;ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ£¬ËùÒÔÒª-1 DCMI_VLINE = Displey_YSize-1; // ´¹Ö±ÓÐЧÐÐÊý // 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);// ÉèÖòüô´°¿Ú HAL_DCMI_EnableCrop(&hdcmi); // ʹÄܲüô return OV2640_Success; } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Reset * * º¯Êý¹¦ÄÜ: Ö´ÐÐÈí¼þ¸´Î» * * ˵ Ã&divide;: ÔÚÅäÖÃOV2640֮ǰ£¬ÐèÒªÖ´ÐÐÒ»´ÎÈí¼þ¸´Î» * *****************************************************************************************************************************************/ void OV2640_Reset(void) { OV2640_Delay(5); // µÈ´ýÄ£¿éÉϵçÎȶ¨£¬×îÉÙ5ms£¬È»ºóÀ­µÍPWDN OV2640_PWDN_OFF; // PWDN Òý½ÅÊä&sup3;öµÍµçƽ£¬²»¿ªÆôµôµçģʽ£¬ÉãÏñÍ&middot;Õý&sup3;£¹¤×&divide;£¬´ËʱÉãÏñÍ&middot;Ä£¿éµÄ°×É«LED»áµãÁÁ // ¸ù&frac34;ÝOV2640µÄÉϵçʱÐò£¬Ó²¼þ¸´Î»µÄ&sup3;ÖÐøÊ±¼äÒª>=3ms£¬Â¹Ð¡°àµÄOV2640²ÉÓÃÓ²¼þRC¸´Î»£¬&sup3;ÖÐøÊ±¼ä´ó¸ÅÔÚ6ms×óÓÒ // Òò´Ë¼ÓÈëÑÓʱ£¬µÈ´ýÓ²¼þ¸´Î»Íê&sup3;ɲ¢Îȶ¨ÏÂÀ´ OV2640_Delay(5); SCCB_WriteReg( OV2640_SEL_Registers, OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ&divide;×é SCCB_WriteReg( OV2640_SENSOR_COM7, 0x80); // Æô¶¯Èí¼þ¸´Î» // ¸ù&frac34;ÝOV2640µÄÈí¼þ¸´Î»Ê±Ðò£¬Èí¼þ¸´Î»Ö´Ðкó£¬Òª>=2ms&middot;½¿ÉÖ´ÐÐSCCBÅäÖ㬴˴¦²ÉÓñ£ÊØÒ»µãµÄ²ÎÊý£¬ÑÓʱ10ms OV2640_Delay(10); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_ReadID * * º¯Êý¹¦ÄÜ: ¶ÁÈ¡ OV2640 µÄÆ&divide;¼þID * * ˵ Ã&divide;: ʵ¼ÊµÄÆ&divide;¼þ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 ¼Ä´æÆ&divide;×é PID_H = SCCB_ReadReg(OV2640_SENSOR_PIDH); // ¶ÁÈ¡ID¸ß×Ö½Ú PID_L = SCCB_ReadReg(OV2640_SENSOR_PIDL); // ¶ÁÈ¡IDµÍ×Ö½Ú return(PID_H<<8)|PID_L; // &middot;µ»ØÍêÕûµÄÆ&divide;¼þID } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Config * * Èë¿Ú²ÎÊý: (*ConfigData)[2] - ÒªÅäÖõIJÎÊý£¬¿ÉÅäÖÃΪ OV2640_SVGA_Config »ò OV2640_UXGA_Config * * º¯Êý¹¦ÄÜ: ÅäÖà OV2640 ´«¸ÐÆ&divide;ºÍDSP²ÎÊý * * ˵ Ã&divide;: 1. ¿ÉÅäÖÃΪ SVGA »òÕß UXGAģʽ * 2. SVGA &middot;Ö±æÂÊΪ800*600£¬×î¸ßÖ§&sup330Ö¡ * 3. UXGA &middot;Ö±æÂÊΪ1600*1200£¬×î¸ßÖ§&sup3;Ö15Ö¡ * 4. ²ÎÊý¶¨ÒåÔÚ dcmi_ov2640_cfg.h * *****************************************************************************************************************************************/ void OV2640_Config( const uint8_t (*ConfigData)[2] ) { uint32_t i; // ¼ÆÊý±äÁ¿ for( i=0; ConfigData[i][0]; i++) { SCCB_WriteReg( ConfigData[i][0], ConfigData[i][1]); // ½øÐвÎÊýÅäÖà } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Framesize * * Èë¿Ú²ÎÊý: pixformat - ÏñËØ¸ñʽ£¬¿ÉÑ¡Ôñ Pixformat_RGB565¡¢Pixformat_JPEG * * º¯Êý¹¦ÄÜ: ÉèÖÃÊä&sup3;öµÄÏñËØ¸ñʽ * *****************************************************************************************************************************************/ void OV2640_Set_Pixformat(uint8_t pixformat) { const uint8_t (*ConfigData)[2]; uint32_t i; // ¼ÆÊý±äÁ¿ 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]); // ½øÐвÎÊýÅäÖà } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Framesize * * Èë¿Ú²ÎÊý: width - ʵ¼ÊÊä&sup3;öͼÏñµÄ&sup3;¤¶È£¬height - ʵ¼ÊÊä&sup3;öͼÏñµÄ¿í¶È * * º¯Êý¹¦ÄÜ: ÉèÖÃʵ¼ÊÊä&sup3;öµÄͼÏñ´óС * * ˵ Ã&divide;: 1. OV2640ÉèÖÃΪ SVGA£¨800*600£© »òÕß UXGA£¨1600*1200£©Ä£Ê½£¬Í¼Ïñ´óСͨ&sup3;£Óëʵ¼ÊÓÃµÄÆÁÄ»&middot;Ö±æÂʲ»Ò»Ñù£¬ * Òò´Ë¿ÉÒÔµ&divide;Óôκ¯Êý£¬ÉèÖÃʵ¼ÊÊä&sup3;öµÄͼÏñ´óС * 2. ÐèҪעÒâµÄÊÇ£¬ÒªÉèÖõÄͼÏñ&sup3;¤¡¢¿í±ØÐëÄܱ»4Õû&sup3;ý£¡ * 3. ²¢²»ÊÇÉèÖÃÊä&sup3;öµÄͼÏñ&middot;Ö±æÂÊԽС֡ÂÊ&frac34;ÍÔ½¸ß£¬Ö¡ÂÊÖ»ºÍÅäÖõÄģʽÓйأ¬ÀýÈçÅäÖÃΪSVGA×î¸ßÖ»ÄÜÖ§&sup330Ö¡ * *****************************************************************************************************************************************/ int8_t OV2640_Set_Framesize(uint16_t width,uint16_t height) { if( (width%4)||(height%4) ) // Êä&sup3;öͼÏñµÄ´óСһ¶¨ÒªÄܱ»4Õû&sup3;ý { return OV2640_Error; // &middot;µ»Ø´íÎó±êÖ&frac34; } SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ&divide;×é SCCB_WriteReg(0X5A, width/4 &0XFF); // ʵ¼ÊͼÏñÊä&sup3;öµÄ¿í¶È£¨OUTW£©£¬7~0 bit£¬¼Ä´æÆ&divide;µÄÖµµÈÓÚʵ¼ÊÖµ/4 SCCB_WriteReg(0X5B, height/4 &0XFF); // ʵ¼ÊͼÏñÊä&sup3;öµÄ¸ß¶È£¨OUTH£©£¬7~0 bit£¬¼Ä´æÆ&divide;µÄÖµµÈÓÚʵ¼ÊÖµ/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; // &sup3;ɹ¦ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Horizontal_Mirror * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í¼Ïñ»áˮƽ&frac34;µÏñ£¬ÖÃ0ʱ»Ö¸´Õý&sup3;£ * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃÊä&sup3;öµÄͼÏñÊÇ&middot;ñ½øÐÐˮƽ&frac34;µÏñ * *****************************************************************************************************************************************/ int8_t OV2640_Set_Horizontal_Mirror( int8_t ConfigState ) { uint8_t OV2640_Reg; // ¼Ä´æÆ&divide;µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ&divide;×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ¡ 0x04 µÄ¼Ä´æÆ&divide;Öµ // REG04,¼Ä´æÆ&divide;×é4£¬¼Ä´æÆ&divide;µØÖ&middot;Ϊ 0x04£¬¸Ã¼Ä´æÆ&divide;µÄBit[7]£¬ÓÃÓÚÉèÖÃˮƽÊÇ&middot;ñ&frac34;µÏñ if ( ConfigState == OV2640_Enable ) // Èç¹ûʹÄÜ&frac34;µÏñ { OV2640_Reg |= 0X80; // Bit[7]ÖÃ1Ôò&frac34;µÏñ } else // È¡Ïû&frac34;µÏñ { OV2640_Reg &= ~0X80; // Bit[7]ÖÃ0ÔòÊÇÕý&sup3;£Ä£Ê½ } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë¼Ä´æÆ&divide; } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Vertical_Flip * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í¼Ïñ»á´¹Ö±&middot;­×ª£¬ÖÃ0ʱ»Ö¸´Õý&sup3;£ * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃÊä&sup3;öµÄͼÏñÊÇ&middot;ñ½øÐд¹Ö±&middot;­×ª * *****************************************************************************************************************************************/ int8_t OV2640_Set_Vertical_Flip( int8_t ConfigState ) { uint8_t OV2640_Reg; // ¼Ä´æÆ&divide;µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ&divide;×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ¡ 0x04 µÄ¼Ä´æÆ&divide;Öµ // REG04,¼Ä´æÆ&divide;×é4£¬¼Ä´æÆ&divide;µØÖ&middot;Ϊ 0x04£¬¸Ã¼Ä´æÆ&divide;µÄµÚBit[6]£¬ÓÃÓÚÉèÖÃˮƽÊÇ´¹Ö±&middot;­×ª if ( ConfigState == OV2640_Enable ) { // ´Ë´¦ÉèÖòο¼OpenMVµÄÇý¶¯ // Bit[4]&frac34;ßÌåµÄ×&divide;ÓÃÊÇʲôÊÖ²áûÓÐ˵£¬Èç¹û´¹Ö±&middot;­×ªÖ®ºó£¬¸Ãλ²»ÖÃ1µÄ»°£¬ÑÕÉ«»á²»¶Ô OV2640_Reg |= 0X40|0x10 ; // Bit[6]ÖÃ1ʱ£¬Í¼Ïñ»á´¹Ö±&middot;­×ª } else // È¡Ïû&middot;­×ª { OV2640_Reg &= ~(0X40|0x10 ); // ½«Bit[6]ºÍBit[4]¶¼Ð´0 } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë¼Ä´æÆ&divide; } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Saturation * * Èë¿Ú²ÎÊý: Saturation - ±¥ºÍ¶È£¬¿ÉÉèÖÃΪ5¸öµÈ¼¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã&divide;: 1. ÊÖ²áÀïûÓÐ˵Ã&divide;ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ&divide;ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à&sup3;ÌÊÖ²á¸ø&sup3;öµÄ´úÂë * 2.±¥ºÍ¶ÈÔ½¸ß£¬É«²Ê&frac34;ÍÔ½ÏÊÑÞ£¬µ«µ±ÏàÓ¦µÄÇåÎú¶È»áϽµ£¬Ôëµã±ä¶à * *****************************************************************************************************************************************/ void OV2640_Set_Saturation(int8_t Saturation) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ&divide;×é 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¸öµÈ¼¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã&divide;: 1. ÊÖ²áÀïûÓÐ˵Ã&divide;ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ&divide;ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à&sup3;ÌÊÖ²á¸ø&sup3;öµÄ´úÂë * 2. ÁÁ¶ÈÔ½¸ß£¬»­Ãæ&frac34;ÍÔ½Ã&divide;ÁÁ£¬µ«ÊÇ»á±äÄ£ºýһЩ * *****************************************************************************************************************************************/ void OV2640_Set_Brightness(int8_t Brightness) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ&divide;×é 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¸öµÈ¼¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã&divide;: 1. ÊÖ²áÀïûÓÐ˵Ã&divide;ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ&divide;ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à&sup3;ÌÊÖ²á¸ø&sup3;öµÄ´úÂë * 2. ¶Ô±È¶ÈÔ½¸ß£¬»­ÃæÔ½ÇåÎú£¬ºÚ°×Ô½¼Ó&middot;ÖÃ&divide; * *****************************************************************************************************************************************/ void OV2640_Set_Contrast(int8_t Contrast) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ&divide;×é 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 - ÌØÐ§Ä£Ê½£¬¿ÉÑ¡Ôñ²ÎÊý OV2640_Effect_Normal¡¢OV2640_Effect_Negative¡¢ * OV2640_Effect_BW¡¢OV2640_Effect_BW_Negative * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃOV2640µÄÌØÐ§£¬Õý&sup3;£¡¢¸ºÆ¬¡¢ºÚ°×¡¢ºÚ°×+¸ºÆ¬µÈģʽ * * ˵ Ã&divide;: ÊÖ²áÀïûÓÐ˵Ã&divide;ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ&divide;ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à&sup3;ÌÊÖ²á¸ø&sup3;öµÄ´úÂë * *****************************************************************************************************************************************/ void OV2640_Set_Effect(uint8_t effect_Mode) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ&divide;×é switch (effect_Mode) { case OV2640_Effect_Normal: // Õý&sup3;£Ä£Ê½ 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: // ¸ºÆ¬Ä£Ê½£¬Ò²&frac34;ÍÊÇÑÕɫȫ²¿È¡&middot;´ 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: // ºÚ°×ģʽ 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: // ºÚ°×+¸ºÆ¬Ä£Ê½ 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 * * º¯Êý¹¦ÄÜ: Ö¡»Øµ&divide;º¯Êý£¬Ã¿´«ÊäÒ»Ö¡Êý&frac34;Ý£¬»á½øÈë¸ÃÖжÏ&middot;þÎñº¯Êý * * ˵ Ã&divide;: ÿ´Î´«ÊäÍêÒ»Ö¡£¬¶ÔÏàÓ¦µÄ±êÖ&frac34;λ½øÐвÙ×&divide;£¬²¢¼ÆËãÖ¡ÂÊ *****************************************************************************************************************************************/ void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) { static uint32_t DCMI_Tick = 0; // ÓÃÓÚ±£´æµ±Ç°µÄʱ¼ä¼ÆÊýÖµ static uint8_t DCMI_Frame_Count = 0; // Ö¡Êý¼ÆÊý if(HAL_GetTick() - DCMI_Tick >= 1000) // ÿ¸ô 1s ¼ÆËãÒ»´ÎÖ¡ÂÊ { DCMI_Tick = HAL_GetTick(); // ÖØÐ»ñÈ¡µ±Ç°Ê±¼ä¼ÆÊýÖµ OV2640_FPS = DCMI_Frame_Count; // »ñµÃfps DCMI_Frame_Count = 0; // ¼ÆÊýÇå0 } DCMI_Frame_Count ++; // û½øÈëÒ»´ÎÖжϣ¨Ã¿´Î´«ÊäÍêÒ»Ö¡Êý&frac34;Ý£©£¬¼ÆÊýÖµ+1 DCMI_FrameState = 1; // ´«ÊäÍê&sup3;ɱêÖ&frac34;λÖÃ1 } /*************************************************************************************************************************************** * º¯ Êý Ãû: HAL_DCMI_ErrorCallback * * º¯Êý¹¦ÄÜ: ´íÎ󻨵&divide;º¯Êý * * ˵ Ã&divide;: µ±&middot;¢ÉúDMA´«Êä´íÎó»òÕßFIFOÒç&sup3;ö´íÎó&frac34;Í»á½øÈë *****************************************************************************************************************************************/ void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi) { // if( HAL_DCMI_GetError(hdcmi) == HAL_DCMI_ERROR_OVR) // { // printf("FIFOÒç&sup3;ö´íÎ󣡣¡£¡\r\n"); // } printf("error:0x%x£¡£¡£¡\r\n",HAL_DCMI_GetError(hdcmi)); } /*********************************************************************************************************************************************************************************************************************************************LXB*************/ // ¹С°à 代码分析
05-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值