活动介绍
file-type

C++成员函数中的const和volatile关键字

PPT文件

下载需积分: 15 | 8.66MB | 更新于2024-08-24 | 13 浏览量 | 1 下载量 举报 收藏
download 立即下载
C++中的const和volatile成员函数 在C++编程中,const和volatile关键字在成员函数中扮演着重要的角色。const成员函数是指在成员函数的参数表之后、函数体之前加上const关键字,表示该函数返回一个常量,且其值不可改变。 const成员函数的语义是指明该函数的this指针所指向的对象是一个常量,即规定了const成员函数不能修改对象的数据成员。在函数体内只能调用const成员函数,不能调用其它的成员函数。 例如,以下是一个const成员函数的示例: ```cpp class MyClass { public: int FuncName(int arg) const; }; ``` 在上面的示例中,FuncName函数是const成员函数,因为它在参数表之后加上了const关键字。这意味着FuncName函数返回一个常量,且不能修改对象的数据成员。 volatile成员函数是指在成员函数的参数表之后、函数体之前加上volatile关键字,表示该函数返回一个易失性对象,且其值可能会被其他线程或进程修改。 volatile成员函数的语义是指明该函数的this指针所指向的对象是一个易失性对象,即该对象的值可能会被其他线程或进程修改。在函数体内需要特别小心地处理该对象,以避免数据竞争和不一致的问题。 例如,以下是一个volatile成员函数的示例: ```cpp class MyClass { public: int FuncName(int arg) volatile; }; ``` 在上面的示例中,FuncName函数是volatile成员函数,因为它在参数表之后加上了volatile关键字。这意味着FuncName函数返回一个易失性对象,且需要特别小心地处理该对象,以避免数据竞争和不一致的问题。 const和volatile成员函数在C++编程中扮演着重要的角色,用于规定成员函数的行为和语义,从而确保程序的正确性和可靠性。 此外,C++语言的发展历史也对我们的编程思想和实践产生了深远的影响。C++语言是在C语言的基础上发展和完善的,而C语言是一种结构化的程序设计语言,具有简洁、灵活、可移植性好等特点。C语言的主要特点包括: * 结构化的程序设计语言 * 高级语言和汇编语言的特点 * 丰富的运算符和数据结构 * 可移植性好 * 语法结构不够严密,程序设计的自由度大 这些特点使得C++语言成为一种强大且灵活的编程语言,广泛应用于各个领域。

相关推荐

filetype

#include "dcmi_ov2640.h" #include "dcmi_ov2640_cfg.h" DCMI_HandleTypeDef hdcmi; // DCMI¾ä±ú DMA_HandleTypeDef DMA_Handle_dcmi; // DMA¾ä±ú volatile uint8_t DCMI_FrameState = 0; // DCMI״̬±êÖ¾£¬µ±Êý¾ÝÖ¡´«ÊäÍê³Éʱ£¬»á±» HAL_DCMI_FrameEventCallback() Öжϻص÷º¯ÊýÖà 1 volatile uint8_t OV2640_FPS ; // Ö¡ÂÊ /************************************************************************************************* * º¯ Êý Ãû: HAL_DCMI_MspInit * Èë¿Ú²ÎÊý: hdcmi - DCMI_HandleTypeDef¶¨ÒåµÄ±äÁ¿£¬¼´±íʾ¶¨ÒåµÄ DCMI ¾ä±ú * ·µ »Ø Öµ: ÎÞ * º¯Êý¹¦ÄÜ: ³õʼ»¯ DCMI Òý½Å * ˵ Ã÷: ÎÞ *************************************************************************************************/ 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 ʱÖÓ /**************************************************************************** Êý¾ÝÒý½Å ʱÖÓºÍͬ²½Òý½Å 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 ¿ØÖÆÒý½Å£¬³õʼ»¯ÔÚ 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); // ³õʼ»¯ PWDN Òý½Å OV2640_PWDN_ON; // ¸ßµçƽ£¬½øÈëµôµçģʽ£¬ÉãÏñÍ·Í£Ö¹¹¤×÷£¬´Ëʱ¹¦ºÄ½µµ½×îµÍ GPIO_InitStruct.Pin = OV2640_PWDN_PIN; // PWDN Òý½Å GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // ÍÆÍìÊä³öģʽ GPIO_InitStruct.Pull = GPIO_PULLUP; // ÉÏÀ­ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Ëٶȵȼ¶µÍ HAL_GPIO_Init(OV2640_PWDN_PORT, &GPIO_InitStruct); // ³õʼ»¯ } } /*************************************************************************************************************************************** * º¯ Êý Ãû: MX_DCMI_Init * * º¯Êý¹¦ÄÜ: ÅäÖÃDCMIÏà¹Ø²ÎÊý * * ˵ Ã÷: 8λÊý¾Ýģʽ£¬È«Êý¾Ý¡¢È«Ö¡²¶×½£¬¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ 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λÊý¾Ýģʽ hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE; // ²»Ê¹ÓÃDCMIµÄJPEGģʽ hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL; // DCMI½Ó¿Ú²¶×½ËùÓÐÊý¾Ý hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD; // Ñ¡Ôñ¿ªÊ¼×Ö½Ú£¬´Ó Ö¡/ÐÐ µÄµÚÒ»¸öÊý¾Ý¿ªÊ¼²¶»ñ 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 Ïà¹Ø²ÎÊý * * ˵ Ã÷: ʹÓõÄÊÇDMA2£¬ÍâÉèµ½´æ´¢Æ÷ģʽ¡¢Êý¾Ýλ¿í32bit¡¢²¢¿ªÆôÖÐ¶Ï * *****************************************************************************************************************************************/ void OV2640_DMA_Init(void) { __HAL_RCC_DMA2_CLK_ENABLE(); // ʹÄÜDMA2ʱÖÓ DMA_Handle_dcmi.Instance = DMA2_Stream7; // DMA2Êý¾ÝÁ÷7 DMA_Handle_dcmi.Init.Request = DMA_REQUEST_DCMI; // DMAÇëÇóÀ´×ÔDCMI DMA_Handle_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY; // ÍâÉèµ½´æ´¢Æ÷ģʽ DMA_Handle_dcmi.Init.PeriphInc = DMA_PINC_DISABLE; // ÍâÉèµØÖ·½ûÖ¹×ÔÔö DMA_Handle_dcmi.Init.MemInc = DMA_MINC_ENABLE; // ´æ´¢Æ÷µØÖ·×ÔÔö DMA_Handle_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; // DCMIÊý¾Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; // ´æ´¢Æ÷Êý¾Ýλ¿í£¬32λ DMA_Handle_dcmi.Init.Mode = DMA_CIRCULAR; // Ñ­»·Ä£Ê½ 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¾ä±ú HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 0); // ÉèÖÃÖжÏÓÅÏȼ¶ HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn); // ʹÄÜÖÐ¶Ï } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Delay * Èë¿Ú²ÎÊý: Delay - ÑÓʱʱ¼ä£¬µ¥Î» ms * º¯Êý¹¦ÄÜ: ¼òµ¥ÑÓʱº¯Êý£¬²»ÊǺܾ«È· * ˵ Ã÷: ΪÁËÒÆÖ²µÄ¼ò±ãÐÔ,´Ë´¦²ÉÓÃÈí¼þÑÓʱ£¬Êµ¼ÊÏîÄ¿ÖпÉÒÔÌæ»»³É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 * * º¯Êý¹¦ÄÜ: ³õʼSCCB¡¢DCMI¡¢DMAÒÔ¼°ÅäÖÃOV2640 * *****************************************************************************************************************************************/ int8_t DCMI_OV2640_Init(void) { uint16_t Device_ID; // ¶¨Òå±äÁ¿´æ´¢Æ÷¼þID SCCB_GPIO_Config(); // SCCBÒý½Å³õʼ»¯ MX_DCMI_Init(); // ³õʼ»¯DCMIÅäÖÃÒý½Å OV2640_DMA_Init(); // ³õʼ»¯DMAÅäÖà OV2640_Reset(); // Ö´ÐÐÈí¼þ¸´Î» Device_ID = OV2640_ReadID(); // ¶ÁÈ¡Æ÷¼þID if( (Device_ID == 0x2640) || (Device_ID == 0x2642) ) // ½øÐÐÆ¥Å䣬ʵ¼ÊµÄÆ÷¼þ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Êä³öµÄͼÏñ´óС OV2640_DCMI_Crop(Display_Width, Display_Height, OV2640_Width, OV2640_Height ); // ½«OV2640Êä³öͼÏñ²Ã¼ô³ÉÊÊÓ¦ÆÁÄ»µÄ´óС return OV2640_Success; // ·µ»Ø³É¹¦±êÖ¾ } else { printf ("OV2640 ERROR!!!!! ID:%X\r\n",Device_ID); // ¶ÁÈ¡ID´íÎó return OV2640_Error; // ·µ»Ø´íÎó±êÖ¾ } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Continuous * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA½«Òª´«ÊäµÄµØÖ·£¬¼´ÓÃÓÚ´æ´¢ÉãÏñÍ·Êý¾ÝµÄ´æ´¢ÇøµØÖ· * DMA_BufferSize - ´«ÊäµÄÊý¾Ý´óС£¬32λ¿í * * º¯Êý¹¦ÄÜ: Æô¶¯DMA´«Ê䣬Á¬ÐøÄ£Ê½ * * ˵ Ã÷: 1. ¿ªÆôÁ¬ÐøÄ£Ê½Ö®ºó£¬»áÒ»Ö±½øÐд«Ê䣬³ý·Ç¹ÒÆð»òÕßÍ£Ö¹DCMI * 2. OV2640ʹÓÃRGB565ģʽʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö½ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý¾ÝΪ32λ¿í£¬¼ÆËã DMA_BufferSize ʱ£¬ÐèÒª³ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ¡ 240*240·Ö±æÂÊ µÄͼÏñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö½ÚµÄÊý¾Ý£¬ * Ôò 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; // Ñ­»·Ä£Ê½ HAL_DMA_Init(&DMA_Handle_dcmi); // ÅäÖÃDMA // ʹÄÜDCMI²É¼¯Êý¾Ý,Á¬Ðø²É¼¯Ä£Ê½ HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)DMA_Buffer,DMA_BufferSize); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DMA_Transmit_Snapshot * * Èë¿Ú²ÎÊý: DMA_Buffer - DMA½«Òª´«ÊäµÄµØÖ·£¬¼´ÓÃÓÚ´æ´¢ÉãÏñÍ·Êý¾ÝµÄ´æ´¢ÇøµØÖ· * DMA_BufferSize - ´«ÊäµÄÊý¾Ý´óС£¬32λ¿í * * º¯Êý¹¦ÄÜ: Æô¶¯DMA´«Ê䣬¿ìÕÕģʽ£¬´«Êäһ֡ͼÏñºóÍ£Ö¹ * * ˵ Ã÷: 1. ¿ìÕÕģʽ£¬Ö»´«ÊäÒ»Ö¡µÄÊý¾Ý * 2. OV2640ʹÓÃRGB565ģʽʱ£¬1¸öÏñËØµãÐèÒª2¸ö×Ö½ÚÀ´´æ´¢ * 3. ÒòΪDMAÅäÖô«ÊäÊý¾ÝΪ32λ¿í£¬¼ÆËã DMA_BufferSize ʱ£¬ÐèÒª³ýÒÔ4£¬ÀýÈ磺 * Òª»ñÈ¡ 240*240·Ö±æÂÊ µÄͼÏñ£¬ÐèÒª´«Êä 240*240*2 = 115200 ×Ö½ÚµÄÊý¾Ý£¬ * Ôò DMA_BufferSize = 115200 / 4 = 28800 ¡£ * 4. ʹÓøÃģʽ´«ÊäÍê³ÉÖ®ºó£¬DCMI»á±»¹ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ÐèÒªµ÷Óà OV2640_DCMI_Resume() »Ö¸´DCMI * *****************************************************************************************************************************************/ void OV2640_DMA_Transmit_Snapshot(uint32_t DMA_Buffer,uint32_t DMA_BufferSize) { DMA_Handle_dcmi.Init.Mode = DMA_NORMAL; // Õý³£Ä£Ê½ 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£¬Í£Ö¹²¶»ñÊý¾Ý * * ˵ Ã÷: 1. ¿ªÆôÁ¬ÐøÄ£Ê½Ö®ºó£¬ÔÙµ÷Óøú¯Êý£¬»áÍ£Ö¹²¶»ñDCMIµÄÊý¾Ý * 2. ¿ÉÒÔµ÷Óà OV2640_DCMI_Resume() »Ö¸´DCMI * 3. ÐèҪעÒâµÄ£¬¹ÒÆðDCMIÆÚ¼ä£¬DMAÊÇûÓÐÍ£Ö¹¹¤×÷µÄ *LXB *****************************************************************************************************************************************/ void OV2640_DCMI_Suspend(void) { HAL_DCMI_Suspend(&hdcmi); // ¹ÒÆðDCMI } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_DCMI_Resume * * º¯Êý¹¦ÄÜ: »Ö¸´DCMI£¬¿ªÊ¼²¶»ñÊý¾Ý * * ˵ Ã÷: 1. µ±DCMI±»¹ÒÆðʱ£¬¿ÉÒÔµ÷Óøú¯Êý»Ö¸´ * 2. ʹÓà OV2640_DMA_Transmit_Snapshot() ¿ìÕÕģʽ£¬´«ÊäÍê³ÉÖ®ºó£¬DCMIÒ²»á±»¹ÒÆð£¬ÔÙ´ÎÆôÓô«Êä֮ǰ£¬ * ÐèÒªµ÷Óñ¾º¯Êý»Ö¸´DCMI²¶»ñ * *****************************************************************************************************************************************/ void OV2640_DCMI_Resume(void) { (&hdcmi)->State = HAL_DCMI_STATE_BUSY; // ±ä¸üDCMI±êÖ¾ (&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 - ÏÔʾÆ÷µÄ³¤¿í * Sensor_XSize¡¢Sensor_YSize - ÉãÏñÍ·´«¸ÐÆ÷Êä³öͼÏñµÄ³¤¿í * * º¯Êý¹¦ÄÜ: ʹÓÃDCMIµÄ²Ã¼ô¹¦ÄÜ£¬½«´«¸ÐÆ÷Êä³öµÄͼÏñ²Ã¼ô³ÉÊÊÓ¦ÆÁÄ»µÄ´óС * * ˵ Ã÷: 1. ÒòΪÉãÏñÍ·Êä³öµÄ»­Ãæ±ÈÀý¹Ì¶¨Îª4:3£¬²»Ò»¶¨Æ¥ÅäÏÔʾÆ÷ * 2. ÐèҪעÒâµÄÊÇ£¬ÉãÏñÍ·Êä³öµÄͼÏñ³¤¡¢¿í±ØÐëÒªÄܱ»4Õû³ý£¡£¨ ʹÓÃOV2640_Set_Framesizeº¯Êý½øÐÐÉèÖà £© * 3. DCMIµÄˮƽÓÐЧÏñËØÒ²±ØÐëÒªÄܱ»4Õû³ý£¡ * 4. º¯Êý»á¼ÆËãˮƽºÍ´¹Ö±Æ«ÒÆ£¬¾¡Á¿Èû­Ãæ¾ÓÖвüô *****************************************************************************************************************************************/ 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("ʵ¼ÊÏÔʾµÄ³ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ·Êä³öµÄ³ß´ç£¬Í˳öDCMI²Ã¼ô\r\n"); return OV2640_Error; //Èç¹ûʵ¼ÊÏÔʾµÄ³ß´ç´óÓÚ»òµÈÓÚÉãÏñÍ·Êä³öµÄ³ß´ç£¬ÔòÍ˳öµ±Ç°º¯Êý£¬²»½øÐвüô } // ÔÚÉèÖÃΪRGB565¸ñʽʱ£¬Ë®Æ½Æ«ÒÆ£¬±ØÐëÊÇÆæÊý£¬·ñÔò»­ÃæÉ«²Ê²»ÕýÈ·£¬ // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö½Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔ±ØÐë´ÓÆæÊýλ¿ªÊ¼£¬²»È»Êý¾Ý»á´íÂÒ£¬ // ÐèҪעÒâµÄÊÇ£¬¼Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ £¡ DCMI_X_Offset = Sensor_XSize - Displey_XSize; // ʵ¼Ê¼ÆËã¹ý³ÌΪ£¨Sensor_XSize - LCD_XSize£©/2*2 // ¼ÆËã´¹Ö±Æ«ÒÆ£¬¾¡Á¿Èû­Ãæ¾ÓÖвüô£¬¸ÃÖµ´ú±íµÄÊÇÐÐÊý£¬ DCMI_Y_Offset = (Sensor_YSize - Displey_YSize)/2-1; // ¼Ä´æÆ÷ÖµÊÇ´Ó0¿ªÊ¼ËãÆðµÄ£¬ËùÒÔÒª-1 // ÒòΪһ¸öÓÐЧÏñËØÊÇ2¸ö×Ö½Ú£¬ÐèÒª2¸öPCLKÖÜÆÚ£¬ËùÒÔÒª³Ë2 // ×îÖյõ½µÄ¼Ä´æÆ÷Öµ£¬±ØÐëÒªÄܱ»4Õû³ý£¡ DCMI_CAPCNT = Displey_XSize*2-1; // ¼Ä´æÆ÷ÖµÊÇ´Ó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 * * º¯Êý¹¦ÄÜ: Ö´ÐÐÈí¼þ¸´Î» * * ˵ Ã÷: ÔÚÅäÖÃOV2640֮ǰ£¬ÐèÒªÖ´ÐÐÒ»´ÎÈí¼þ¸´Î» * *****************************************************************************************************************************************/ void OV2640_Reset(void) { OV2640_Delay(5); // µÈ´ýÄ£¿éÉϵçÎȶ¨£¬×îÉÙ5ms£¬È»ºóÀ­µÍPWDN OV2640_PWDN_OFF; // PWDN Òý½ÅÊä³öµÍµçƽ£¬²»¿ªÆôµôµçģʽ£¬ÉãÏñÍ·Õý³£¹¤×÷£¬´ËʱÉãÏñÍ·Ä£¿éµÄ°×É«LED»áµãÁÁ // ¸ù¾ÝOV2640µÄÉϵçʱÐò£¬Ó²¼þ¸´Î»µÄ³ÖÐøÊ±¼äÒª>=3ms£¬Â¹Ð¡°àµÄOV2640²ÉÓÃÓ²¼þRC¸´Î»£¬³ÖÐøÊ±¼ä´ó¸ÅÔÚ6ms×óÓÒ // Òò´Ë¼ÓÈëÑÓʱ£¬µÈ´ýÓ²¼þ¸´Î»Íê³É²¢Îȶ¨ÏÂÀ´ OV2640_Delay(5); SCCB_WriteReg( OV2640_SEL_Registers, OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ÷×é SCCB_WriteReg( OV2640_SENSOR_COM7, 0x80); // Æô¶¯Èí¼þ¸´Î» // ¸ù¾ÝOV2640µÄÈí¼þ¸´Î»Ê±Ðò£¬Èí¼þ¸´Î»Ö´Ðкó£¬Òª>=2ms·½¿ÉÖ´ÐÐSCCBÅäÖ㬴˴¦²ÉÓñ£ÊØÒ»µãµÄ²ÎÊý£¬ÑÓʱ10ms OV2640_Delay(10); } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_ReadID * * º¯Êý¹¦ÄÜ: ¶ÁÈ¡ OV2640 µÄÆ÷¼þID * * ˵ Ã÷: ʵ¼ÊµÄÆ÷¼þ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 ¼Ä´æÆ÷×é PID_H = SCCB_ReadReg(OV2640_SENSOR_PIDH); // ¶ÁÈ¡ID¸ß×Ö½Ú PID_L = SCCB_ReadReg(OV2640_SENSOR_PIDL); // ¶ÁÈ¡IDµÍ×Ö½Ú return(PID_H<<8)|PID_L; // ·µ»ØÍêÕûµÄÆ÷¼þID } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Config * * Èë¿Ú²ÎÊý: (*ConfigData)[2] - ÒªÅäÖõIJÎÊý£¬¿ÉÅäÖÃΪ OV2640_SVGA_Config »ò OV2640_UXGA_Config * * º¯Êý¹¦ÄÜ: ÅäÖà OV2640 ´«¸ÐÆ÷ºÍDSP²ÎÊý * * ˵ Ã÷: 1. ¿ÉÅäÖÃΪ SVGA »òÕß UXGAģʽ * 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; // ¼ÆÊý±äÁ¿ for( i=0; ConfigData[i][0]; i++) { SCCB_WriteReg( ConfigData[i][0], ConfigData[i][1]); // ½øÐвÎÊýÅäÖà } } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Framesize * * Èë¿Ú²ÎÊý: pixformat - ÏñËØ¸ñʽ£¬¿ÉÑ¡Ôñ Pixformat_RGB565¡¢Pixformat_JPEG * * º¯Êý¹¦ÄÜ: ÉèÖÃÊä³öµÄÏñËØ¸ñʽ * *****************************************************************************************************************************************/ 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 - ʵ¼ÊÊä³öͼÏñµÄ³¤¶È£¬height - ʵ¼ÊÊä³öͼÏñµÄ¿í¶È * * º¯Êý¹¦ÄÜ: ÉèÖÃʵ¼ÊÊä³öµÄͼÏñ´óС * * ˵ Ã÷: 1. OV2640ÉèÖÃΪ SVGA£¨800*600£© »òÕß UXGA£¨1600*1200£©Ä£Ê½£¬Í¼Ïñ´óСͨ³£Óëʵ¼ÊÓÃµÄÆÁÄ»·Ö±æÂʲ»Ò»Ñù£¬ * Òò´Ë¿ÉÒÔµ÷Óôκ¯Êý£¬ÉèÖÃʵ¼ÊÊä³öµÄͼÏñ´óС * 2. ÐèҪעÒâµÄÊÇ£¬ÒªÉèÖõÄͼÏñ³¤¡¢¿í±ØÐëÄܱ»4Õû³ý£¡ * 3. ²¢²»ÊÇÉèÖÃÊä³öµÄͼÏñ·Ö±æÂÊԽС֡ÂʾÍÔ½¸ß£¬Ö¡ÂÊÖ»ºÍÅäÖõÄģʽÓйأ¬ÀýÈçÅäÖÃΪSVGA×î¸ßÖ»ÄÜÖ§³Ö30Ö¡ * *****************************************************************************************************************************************/ int8_t OV2640_Set_Framesize(uint16_t width,uint16_t height) { if( (width%4)||(height%4) ) // Êä³öͼÏñµÄ´óСһ¶¨ÒªÄܱ»4Õû³ý { return OV2640_Error; // ·µ»Ø´íÎó±êÖ¾ } SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é SCCB_WriteReg(0X5A, width/4 &0XFF); // ʵ¼ÊͼÏñÊä³öµÄ¿í¶È£¨OUTW£©£¬7~0 bit£¬¼Ä´æÆ÷µÄÖµµÈÓÚʵ¼ÊÖµ/4 SCCB_WriteReg(0X5B, height/4 &0XFF); // ʵ¼ÊͼÏñÊä³öµÄ¸ß¶È£¨OUTH£©£¬7~0 bit£¬¼Ä´æÆ÷µÄÖµµÈÓÚʵ¼ÊÖµ/4 SCCB_WriteReg(0X5C, (width/4>>8&0X03)|(height/4>>6&0x04) ); // ÉèÖÃZMHHµÄBit[2:0]£¬Ò²¾ÍÊÇOUTH µÄµÚ 8 bit£¬OUTW µÄµÚ 9~8 bit£¬ SCCB_WriteReg(OV2640_DSP_RESET,0X00); // ¸´Î» return OV2640_Success; // ³É¹¦ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Horizontal_Mirror * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í¼Ïñ»áˮƽ¾µÏñ£¬ÖÃ0ʱ»Ö¸´Õý³£ * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃÊä³öµÄͼÏñÊÇ·ñ½øÐÐˮƽ¾µÏñ * *****************************************************************************************************************************************/ int8_t OV2640_Set_Horizontal_Mirror( int8_t ConfigState ) { uint8_t OV2640_Reg; // ¼Ä´æÆ÷µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ÷×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ¡ 0x04 µÄ¼Ä´æÆ÷Öµ // REG04,¼Ä´æÆ÷×é4£¬¼Ä´æÆ÷µØÖ·Îª 0x04£¬¸Ã¼Ä´æÆ÷µÄBit[7]£¬ÓÃÓÚÉèÖÃˮƽÊÇ·ñ¾µÏñ if ( ConfigState == OV2640_Enable ) // Èç¹ûʹÄܾµÏñ { OV2640_Reg |= 0X80; // Bit[7]ÖÃ1Ôò¾µÏñ } else // È¡Ïû¾µÏñ { OV2640_Reg &= ~0X80; // Bit[7]ÖÃ0ÔòÊÇÕý³£Ä£Ê½ } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë¼Ä´æÆ÷ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Vertical_Flip * * Èë¿Ú²ÎÊý: ConfigState - ÖÃ1ʱ£¬Í¼Ïñ»á´¹Ö±·­×ª£¬ÖÃ0ʱ»Ö¸´Õý³£ * * º¯Êý¹¦ÄÜ: ÓÃÓÚÉèÖÃÊä³öµÄͼÏñÊÇ·ñ½øÐд¹Ö±·­×ª * *****************************************************************************************************************************************/ int8_t OV2640_Set_Vertical_Flip( int8_t ConfigState ) { uint8_t OV2640_Reg; // ¼Ä´æÆ÷µÄÖµ SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_SENSOR); // Ñ¡Ôñ SENSOR ¼Ä´æÆ÷×é OV2640_Reg = SCCB_ReadReg(OV2640_SENSOR_REG04); // ¶ÁÈ¡ 0x04 µÄ¼Ä´æÆ÷Öµ // REG04,¼Ä´æÆ÷×é4£¬¼Ä´æÆ÷µØÖ·Îª 0x04£¬¸Ã¼Ä´æÆ÷µÄµÚBit[6]£¬ÓÃÓÚÉèÖÃˮƽÊÇ´¹Ö±·­×ª if ( ConfigState == OV2640_Enable ) { // ´Ë´¦ÉèÖòο¼OpenMVµÄÇý¶¯ // Bit[4]¾ßÌåµÄ×÷ÓÃÊÇʲôÊÖ²áûÓÐ˵£¬Èç¹û´¹Ö±·­×ªÖ®ºó£¬¸Ãλ²»ÖÃ1µÄ»°£¬ÑÕÉ«»á²»¶Ô OV2640_Reg |= 0X40|0x10 ; // Bit[6]ÖÃ1ʱ£¬Í¼Ïñ»á´¹Ö±·­×ª } else // È¡Ïû·­×ª { OV2640_Reg &= ~(0X40|0x10 ); // ½«Bit[6]ºÍBit[4]¶¼Ð´0 } return SCCB_WriteReg(OV2640_SENSOR_REG04,OV2640_Reg); // дÈë¼Ä´æÆ÷ } /*************************************************************************************************************************************** * º¯ Êý Ãû: OV2640_Set_Saturation * * Èë¿Ú²ÎÊý: Saturation - ±¥ºÍ¶È£¬¿ÉÉèÖÃΪ5¸öµÈ¼¶£º2£¬1£¬0£¬-1£¬-2 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2.±¥ºÍ¶ÈÔ½¸ß£¬É«²Ê¾ÍÔ½ÏÊÑÞ£¬µ«µ±ÏàÓ¦µÄÇåÎú¶È»áϽµ£¬Ôëµã±ä¶à * *****************************************************************************************************************************************/ void OV2640_Set_Saturation(int8_t Saturation) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é 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 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2. ÁÁ¶ÈÔ½¸ß£¬»­Ãæ¾ÍÔ½Ã÷ÁÁ£¬µ«ÊÇ»á±äÄ£ºýһЩ * *****************************************************************************************************************************************/ void OV2640_Set_Brightness(int8_t Brightness) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é 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 * * ˵ Ã÷: 1. ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * 2. ¶Ô±È¶ÈÔ½¸ß£¬»­ÃæÔ½ÇåÎú£¬ºÚ°×Ô½¼Ó·ÖÃ÷ * *****************************************************************************************************************************************/ void OV2640_Set_Contrast(int8_t Contrast) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é 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µÄÌØÐ§£¬Õý³£¡¢¸ºÆ¬¡¢ºÚ°×¡¢ºÚ°×+¸ºÆ¬µÈģʽ * * ˵ Ã÷: ÊÖ²áÀïûÓÐ˵Ã÷ÅäÖÃÖеÄÄÇ2¸ö¼Ä´æÆ÷ÈçºÎʹÓã¬Òò´ËÕâÀïÖ±½ÓʹÓÃOV2640±à³ÌÊÖ²á¸ø³öµÄ´úÂë * *****************************************************************************************************************************************/ void OV2640_Set_Effect(uint8_t effect_Mode) { SCCB_WriteReg(OV2640_SEL_Registers,OV2640_SEL_DSP); // Ñ¡Ôñ DSP¼Ä´æÆ÷×é switch (effect_Mode) { case OV2640_Effect_Normal: // Õý³£Ä£Ê½ 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: // ¸ºÆ¬Ä£Ê½£¬Ò²¾ÍÊÇÑÕɫȫ²¿È¡·´ 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 * * º¯Êý¹¦ÄÜ: Ö¡»Øµ÷º¯Êý£¬Ã¿´«ÊäÒ»Ö¡Êý¾Ý£¬»á½øÈë¸ÃÖжϷþÎñº¯Êý * * ˵ Ã÷: ÿ´Î´«ÊäÍêÒ»Ö¡£¬¶ÔÏàÓ¦µÄ±ê־λ½øÐвÙ×÷£¬²¢¼ÆËãÖ¡ÂÊ *****************************************************************************************************************************************/ 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 ++; // û½øÈëÒ»´ÎÖжϣ¨Ã¿´Î´«ÊäÍêÒ»Ö¡Êý¾Ý£©£¬¼ÆÊýÖµ+1 DCMI_FrameState = 1; // ´«ÊäÍê³É±ê־λÖÃ1 } /*************************************************************************************************************************************** * º¯ Êý Ãû: HAL_DCMI_ErrorCallback * * º¯Êý¹¦ÄÜ: ´íÎ󻨵÷º¯Êý * * ˵ Ã÷: µ±·¢ÉúDMA´«Êä´íÎó»òÕßFIFOÒç³ö´íÎó¾Í»á½øÈë *****************************************************************************************************************************************/ 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*************/ // ¹С°à 代码分析

filetype

🔄 正在登录 http://nzaj5zn2dx.355328web33.top.355328.com/baidu/read.php?tid=926... ✅ 登录成功! 会话Cookies: {'4a2b9_ipstate': '1749563319', '4a2b9_lastpos': 'T926', '4a2b9_lastvisit': '0%091749563319%09%2Fbaidu%2Fread.php%3Ftid%3D926', '4a2b9_ol_offset': '1358', '4a2b9_readlog': '%2C926%2C', 'ZDEDebuggerPresent': 'php,phtml,php3'} ================================================== 📡 正在获取目标页面 http://nzaj5zn2dx.355328web33.top.355328.com/baidu/read.php?tid=926... ✅ 获取成功!内容长度:131391 字节 ================================================== 📄 HTML结构化内容 (前500字符): ================================================== <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <title> 161ÆÚ£º¡¾Ç°³ÌËÆ½õ¡¿¢Ó×é3ÖÐ3Îȶ¨ÏÂ×¢ </title> <meta content="7.3.2" name="generator"/> <meta content="161ÆÚ£º¡¾Ç°³ÌËÆ½õ¡¿¢Ó×é3ÖÐ3Îȶ¨ÏÂ×¢, ĬÈϰæ¿é " name="keywords"/> <meta content="[b][size=5][font=helvetica neue ]328ÆÚ: 🍎[b... ================================================== ================================================== 📄 纯文本内容 (前500字符): ================================================== 161ÆÚ£º¡¾Ç°³ÌËÆ½õ¡¿¢Ó×é3ÖÐ3Îȶ¨ÏÂ×¢ Ö÷Ìâ: 161ÆÚ£º¡¾Ç°³ÌËÆ½õ¡¿¢Ó×é3ÖÐ3Îȶ¨ÏÂ×¢ ÔĶÁ 100528 | ·µ»ØÊ×Ò³ | ¹Ø±Õ±¾Ò³ ¡¡ 0Â¥ u ÀúÊ·¼Ç¼ u »Ø¸´ u ±à¼­ u 328ÆÚ: 🍎 ¡ºÇ°³ÌËÆ½õ¡» 🍎 ¢Ó×é3ÖÐ3 🍎 ¡¾01-04-40¡¿¡¾02-04-39¡¿¡¾02-05-07¡¿ ¡¾03-16-46¡¿¡¾06-39-45¡¿¡¾07-25-49¡¿ ¡¾09-12-25¡¿¡¾10-12-19¡¿¡¾10-16-29¡¿ ¡¾12-20-49¡¿¡¾13-16-19¡¿¡¾18-41-49¡¿ ¡¾ 31-40-48 ¡¿¡¾28-34-42¡¿¡¾39-42-43¡¿ ¿ª: 48-05-44-27-40-31ÌØ:¼¦20 ×¼ 329ÆÚ: 🍎 ¡ºÇ°³ÌËÆ½õ¡» 🍎 ¢Ó×é3ÖÐ3 🍎 ¡¾01-04-32¡¿¡¾01-33-47¡¿¡¾ 01-02-17 ¡¿ ¡¾03-20-37¡¿¡¾03-20-4... ================================================== ================================================== 📄 脚本内容 (前500字符): ================================================== var agt = navigator.userAgent.toLowerCase(); var is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1)); var is_gecko= (navigator.product == "Gecko"); var imgpath = 'images'; var verifyhash = 'f9d1c7ab'; var modeimg = ''; var modeBase = ''; var winduid = ''; var windid = ''; var groupid = 'guest'; var gIsPost = true; if (location.href.indexOf('/simple/') != -1) { getObj('headbase').href = location.href.substr(0,location.href.indexOf('/simple/')+1); } ... ================================================== ================================================== 🕵️ 隐藏字段发现: ================================================== fid: 2 tid: 926 ================================================== ================================================== 🔐 加密数据扫描结果: ================================================== 🔍 发现 base64 格式数据: 1. 🔍 发现 var_encrypted 格式数据: 1. 926 2. f9d1c7ab 3. 2 4. guest 5. images =================================================扫描到加密数据了怎么过去

filetype

#include "control.h" /************************************************************************** ×÷ÕߣºÆ½ºâС³µÖ®¼Ò ÎÒµÄÌÔ±¦Ð¡µê£ºhttp://shop114407458.taobao.com/ **************************************************************************/ #define T 0.156f #define L 0.1445f #define K 311.4f u8 Flag_Target; int Voltage_Temp,Voltage_Count,Voltage_All,sum; /************************************************************************** º¯Êý¹¦ÄÜ£ºÐ¡³µÔ˶¯ÊýѧģÐÍ Èë¿Ú²ÎÊý£ºËٶȺÍת½Ç ·µ»Ø Öµ£ºÎÞ **************************************************************************/ void Kinematic_Analysis(float velocity,float turn) { Target_A=(velocity+turn); Target_B=(velocity-turn); //ºóÂÖ²îËÙ } void SelfLocalization(void) //С³µ×Ô¶¨Î» { const double T_Sampling=0.005*2; //5ms*2 ²ÉÑùÖÜÆÚ const double Encoder_Round=390*4; //±àÂëÆ÷ÏßÊý*4±¶ÆµÏ¸·Ö const double R=0.032, B=0.155; //³µÂÖ°ë¾¶£¬Â־࣬m //Ö±½Ó¿ÉÓõÄÈ«¾Ö±äÁ¿ //extern int Encoder_Left,Encoder_Right; //×óÓÒ±àÂëÆ÷µÄÂö³å¼ÆÊý //extern float X_me,Y_me,theta_me; //С³µÎ»ÖúÍ×Ë̬ //extern float V_me,W_me; //С³µÏßËٶȺͽÇËÙ¶È-±àÂëÆ÷¹À¼ÆÖµ //²¹È«ÈçÏ´úÂ룬¼ÆËãС³µÏßËٶȺͽÇËÙ¶È£¬ÒÔ¼°Ð¡³µÎ»ÖúÍ×Ë̬ V_me=; W_me=?; X_me=?; Y_me=?; theta_me=; //¾­¹ý¼ÆËãµÄ½Ç¶ÈÒ»¶¨Òª¹æÕûµ½(-PI, PI] theta_me=£¿; } void PathPlanning(void) //·¾¶¹æ»® { static int Flag_Start=0; double X_des=3, Y_des=2, Angle_des=0; //Ä¿±êλÖúÍ×Ë̬ const double Kd=20,Ka=-7,Kb=0; double ds,da; if(Flag_Stop==1) { Flag_Start=0; Velocity=0,Turn=0; } else Flag_Start++; if(Flag_Start<3*1000/10) return; //µÈ´ý3sºóʵÑé×Ô¶¯¿ªÊ¼ //¸ù¾ÝÄ¿±êλÖ㨺Í×Ë̬£©£¬ÒÔ¼°µ±Ç°»úÆ÷È˵ÄλÖúÍ×Ë̬£¬¹æ»®³ö»úÆ÷ÈËÏÂһʱ¿ÌµÄÏßËٶȺͽÇËÙ¶È //Ö±½Ó¿ÉÓõÄÈ«¾Ö±äÁ¿ //extern float X_me,Y_me,theta_me; //С³µÎ»ÖúÍ×Ë̬ //extern float V_me,W_me; //С³µÏßËٶȺͽÇËÙ¶È-±àÂëÆ÷¹À¼ÆÖµ //extern float Velocity,Turn; //VelocityΪҪ¹æ»®³öµÄÏßËÙ¶È,TurnΪҪ¹æ»®³öµÄ½ÇËÙ¶È£¨ÊÜÓ²¼þʵÏÖµÄÒªÇó£¬Turn˳ʱÕëΪÕý£© //²¹È«ÈçÏ´úÂë // Velocity=£¿;

filetype

int main(void) { const unsigned char *point; u16 i=0; delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃÖжÏÓÅÏȼ¶·Ö×éΪ×é2£º2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ // uart_init(115200); //´®¿Ú³õʼ»¯Îª115200 LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú // KEY_Init(); //°´¼ü³õʼ»¯ AT24CXX_Init(); //IIC³õʼ»¯ OLED_init(); point= &picture_tab[0]; TIM_OCInitTypeDef TIM_OCInitStructure; delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ uart_init(115200); //´®¿Ú³õʼ»¯Îª115200 LED_Init(); //LED¶Ë¿Ú³õʼ»¯ TIM3_Int_Init(4999,7199);//10KhzµÄ¼ÆÊýƵÂÊ£¬¼ÆÊýµ½5000Ϊ500ms TIM4_PWM_Init(10000-1,72-1); //72M/72=1MHz¼ÆÊýƵÂÊ,ÖØ×°ÔØÖµ while(1) { OLED_ShowString(0,30,"21221054",16); OLED_ShowString(0,15,"2023/5/18",16); OLED_ShowChinese(0,0,0,16,1); OLED_ShowChinese(16,0,1,16,1); OLED_ShowChinese(32,0,2,16,1); delay_ms(1000); OLED_Refresh_Gram(); //¸üÐÂÏÔʾµ½OLED if(++i > 3) { LED1=!LED1;//ÌáʾϵͳÕýÔÚÔËÐÐ i=0; } while(1) { u16 u16tmp; u16tmp += 500; if(u16tmp > 10000) u16tmp=0; //³õʼ»¯TIM4 Channe3 PWMģʽ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆÄ£Ê½2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß TIM_OCInitStructure.TIM_Pulse = u16tmp; TIM_OC3Init(TIM4, &TIM_OCInitStructure); //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM4 OC3 LED2=!LED2; //LED3=!LED3; delay_ms(300); } } }这段代码问题如下:declaration may not appear after executable statement inblock,TIM OCINITTYPEDEF TIM OCINITSTRUCTURE,请修改这个问题

filetype

#include "guix.h" #include "touch.h" #include "text.h" #include "icos.h" ////////////////////////////////////////////////////////////////////////////////// //±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾­×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ; //ALIENTEK STM32F407¿ª·¢°å //GUI-µ×²ãʵÏÖ ´úÂë //ÕýµãÔ­×Ó@ALIENTEK //¼¼ÊõÂÛ̳:www.openedv.com //ÐÞ¸ÄÈÕÆÚ:2014/2/18 //°æ±¾£ºV1.2 //°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£ //Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2009-2019 //All rights reserved //******************************************************************************* //V1.1 20140218 //ÐÂÔögui_draw_blineº¯Êý //V1.2 20140801 //1,ÐÞ¸Ägui_show_ptcharºÍgui_show_ptfontº¯Êý,Ö§³Ö24*24×ÖÌ壨Êý×ÖÓë#¡¢*£¬Ö§³Ö¸ü´óµÄ×ÖÌ壩 //2,ÐÞ¸Ägui_show_ptcharºÍgui_show_ptfontº¯ÊýµÄoffset²ÎÊýΪu16. ////////////////////////////////////////////////////////////////////////////////// //´Ë´¦±ØÐëÔÚÍⲿÉêÃ÷asc2_1206ºÍasc2_1608; //#include "font.h" extern const unsigned char asc2_1206[95][12]; extern const unsigned char asc2_1608[95][16]; extern const unsigned char asc2_2412[95][36]; extern u8* asc2_2814; //ÆÕͨ×ÖÌå28*14´ó×ÖÌåµãÕó¼¯ extern u8* asc2_3618; //ÆÕͨ×ÖÌå36*18´ó×ÖÌåµãÕó¼¯ extern u8* asc2_5427; //ÆÕͨ×ÖÌå54*27´ó×ÖÌåµãÕó¼¯ extern u8* asc2_s6030; //ÊýÂë¹Ü×ÖÌå60*30´ó×ÖÌåµãÕó¼¯ ////////////////////////////GUIͨÓÃ×Ö·û´®¼¯////////////////////////////// //È·ÈÏ u8*const GUI_OK_CAPTION_TBL[GUI_LANGUAGE_NUM]= { "È·¶¨","´_¶¨","OK", }; //Ñ¡Ïî u8*const GUI_OPTION_CAPTION_TBL[GUI_LANGUAGE_NUM]= { "Ñ¡Ïî","ßxí—","MENU", }; //·µ»Ø u8*const GUI_BACK_CAPTION_TBL[GUI_LANGUAGE_NUM]= { "·µ»Ø","·µ»Ø","BACK", }; //È¡Ïû u8*const GUI_CANCEL_CAPTION_TBL[GUI_LANGUAGE_NUM]= { "È¡Ïû","È¡Ïû","CANCEL", }; //Í˳ö u8*const GUI_QUIT_CAPTION_TBL[GUI_LANGUAGE_NUM]= { "Í˳ö","Í˳ö","QUIT", }; /////////////////////////////////////////////////////////////////////////// //ÊäÈë½Ó¿Ú _in_obj in_obj= { gui_get_key, //»ñÈ¡¼üÖµ²ÎÊý 0, //×ø±ê 0, 0, //°´¼ü¼üÖµ IN_TYPE_ERR, //ÊäÈëÀàÐÍ,ĬÈϾÍÊÇ´íÎóµÄ״̬ }; _gui_phy gui_phy; 在

filetype

/************************************************************ °æÈ¨£º2025CIMC Copyright¡£ Îļþ£ºFunction.c ×÷Õß: Lingyu Meng ƽ̨: 2025CIMC IHD-V04 °æ±¾: Lingyu Meng 2025/2/16 V0.01 original ************************************************************/ /************************* Í·Îļþ *************************/ #include “Function.h” #include “LED.h” #include “RTC.h” #include “USART0.h” #include “SPI_FLASH.h” #include “ff.h” #include “diskio.h” #include “sdcard.h” #include “sys_check.h” #include “oled.h” #include “conf_read.h” #include “ratio_set.h” #include “limit_set.h” #include “key.h” #include “adc.h” #include “RTC.h” /************************* ºê¶¨Òå *************************/ #define BUFFER_SIZE 256 #define TX_BUFFER_SIZE BUFFER_SIZE #define RX_BUFFER_SIZE BUFFER_SIZE #define FLASH_WRITE_ADDRESS 0x000000 #define FLASH_READ_ADDRESS FLASH_WRITE_ADDRESS // ²ÉÑùÖÜÆÚ³£Á¿¶¨Òå #define CYCLE_5S 1 #define CYCLE_10S 10 #define CYCLE_15S 15 // Flash´æ´¢µØÖ·¶¨Òå #define SAMPLE_CYCLE_ADDR 0x000100 /************************ ±äÁ¿¶¨Òå ************************/ uint8_t tx_buffer[TX_BUFFER_SIZE]; uint8_t rx_buffer[TX_BUFFER_SIZE]; uint16_t i = 0, count, result = 0; uint8_t is_successful = 0; //FIL fdst; UINT br, bw; BYTE buffer[128]; BYTE filebuffer[128]; typedef struct { int count; // µ±Ç°ÎļþÊý¾Ý¼ÆÊý // unsigned long datetime; // µ±Ç°ÎļþµÄʱ¼ä´Á FIL file; // µ±Ç°Îļþ¶ÔÏó } DataFileInfo; static DataFileInfo data_file_info = {0, {0}}; // È«¾Ö±äÁ¿ uint32_t sample_cycle = CYCLE_5S; // µ±Ç°²ÉÑùÖÜÆÚ£¬µ¥Î»Ãë /************************ º¯Êý¶¨Òå **********************/ ErrStatus memory_compare(uint8_t src,uint8_t dst,uint16_t length); void nvic_config(void); void write_file(void); /************************************************************ Function : System_Init Comment : ÓÃÓÚ³õʼ»¯MCU Parameter: null Return : null Author : Lingyu Meng Date : 2025-02-30 V0.1 original ************************************************************/ void System_Init(void) { systick_config(); // ʱÖÓÅäÖà nvic_config(); // ÅäÖÃÖжϿØÖÆÆ÷ KEY_Init(); // KEY³õʼ»¯ LED_Init(); USART0_Config(); // ´®¿Ú³õʼ»¯ nvic_irq_enable(USART0_IRQn, 0, 0); // ʹÄÜUSART0ÖÐ¶Ï usart_interrupt_enable(USART0, USART_INT_RBNE); // ½ÓÊÕÖжϴò¿ª ADC_port_init(); // ADC³õʼ»¯ OLED_Init(); TF_Init(); spi_flash_init(); // ³õʼ»¯SPI Flash RTC_Init(); // ´ÓFlash¶ÁÈ¡±£´æµÄ²ÉÑùÖÜÆÚ uint32_t saved_cycle; spi_flash_buffer_read((uint8_t*)&saved_cycle, SAMPLE_CYCLE_ADDR, sizeof(uint32_t)); // ÑéÖ¤¶ÁÈ¡µÄÖµÊÇ·ñÓÐЧ if (saved_cycle == CYCLE_5S || saved_cycle == CYCLE_10S || saved_cycle == CYCLE_15S) { sample_cycle = saved_cycle; printf("Loaded saved sample cycle: %d s\r\n", sample_cycle); } else { // ÎÞЧֵ£¬Ê¹ÓÃĬÈÏ5Ãë sample_cycle = CYCLE_5S; printf("Using default sample cycle: %d s\r\n", sample_cycle); // ±£´æÄ¬ÈÏÖµµ½Flash spi_flash_sector_erase(SAMPLE_CYCLE_ADDR); spi_flash_buffer_write((uint8_t*)&sample_cycle, SAMPLE_CYCLE_ADDR, sizeof(uint32_t)); } // ¶ÁÈ¡¶ÓÎé±àºÅ Team_num(); delay_1ms(10); } /************************************************************ Function : UsrFunction Comment : Óû§³ÌÐò¹¦ÄÜ Parameter: null Return : null Author : Liu Tao @ GigaDevice Date : 2025-05-10 V0.1 original ************************************************************/ void UsrFunction(void) { uint8_t sampling_enabled = 0; // ²ÉÑùʹÄܱêÖ¾ uint32_t last_sample_time = 0; // ÉϴβÉÑùʱ¼ä uint32_t last_led_toggle_time = 0; // LEDÇл»Ê±¼ä uint8_t led_state = 0; // LEDµ±Ç°×´Ì¬ // ¾²Ì¬±äÁ¿¼Ç¼°´¼üÉÏ´Î״̬£¨ÓÃÓÚ±ßÔµ¼ì²â£© static uint8_t last_key2 = 1, last_key3 = 1, last_key4 = 1; printf("====system init====\r\n"); Read_Team_num(); // ¶ÁÈ¡¶ÓÎé±àºÅ printf("\n\r====system ready====\r\n"); OLED_ShowString(0, 0, "system idle", 16); OLED_Refresh(); while (1) { uint32_t current_tick = systick_get_tick(); // ================ °´¼ü´¦Àí ================ // ¼ì²âKEY1°´ÏÂʼþ if (KEY_Stat(KEY_PORT, KEY1_PIN)) { // °´¼ü״̬·­×ª sampling_enabled = !sampling_enabled; if (sampling_enabled) { // Æô¶¯²ÉÑù printf("Output==> Periodic Sampling (Key Start)\r\n"); printf("Output==> sample cycle: %ds\r\n", sample_cycle); last_sample_time = current_tick; last_led_toggle_time = current_tick; led_state = 0; OLED_Clear(); OLED_ShowString(0, 0, "Sampling...", 16); OLED_Refresh(); } else { // Í£Ö¹²ÉÑù printf("Output==> Periodic Sampling STOP (Key Stop)\r\n"); gpio_bit_reset(GPIOA, GPIO_PIN_5); // ¹Ø±ÕLED1 OLED_Clear(); OLED_ShowString(0, 0, "system idle", 16); OLED_Refresh(); } // Ìí¼ÓÈ¥¶¶ÑÓʱ delay_1ms(50); } // ¼ì²âKEY2°´ÏÂʼþ£¨ÖÜÆÚÉèΪ5s£© uint8_t current_key2 = KEY_Stat(KEY_PORT, KEY2_PIN); if (current_key2 && !last_key2) { sample_cycle = CYCLE_5S; printf("Output==> sample cycle adjust: %ds\r\n", sample_cycle); // ±£´æµ½Flash spi_flash_sector_erase(SAMPLE_CYCLE_ADDR); spi_flash_buffer_write((uint8_t*)&sample_cycle, SAMPLE_CYCLE_ADDR, sizeof(uint32_t)); // Èç¹ûÕýÔÚ²ÉÑù£¬¸üвÉÑùʱ¼ä if (sampling_enabled) { last_sample_time = current_tick; } } last_key2 = current_key2; // ¼ì²âKEY3°´ÏÂʼþ£¨ÖÜÆÚÉèΪ10s£© uint8_t current_key3 = KEY_Stat(KEY_PORT, KEY3_PIN); if (current_key3 && !last_key3) { sample_cycle = CYCLE_10S; printf("Output==> sample cycle adjust: %ds\r\n", sample_cycle); // ±£´æµ½Flash spi_flash_sector_erase(SAMPLE_CYCLE_ADDR); spi_flash_buffer_write((uint8_t*)&sample_cycle, SAMPLE_CYCLE_ADDR, sizeof(uint32_t)); // Èç¹ûÕýÔÚ²ÉÑù£¬¸üвÉÑùʱ¼ä if (sampling_enabled) { last_sample_time = current_tick; } } last_key3 = current_key3; // ¼ì²âKEY4°´ÏÂʼþ£¨ÖÜÆÚÉèΪ15s£© uint8_t current_key4 = KEY_Stat(KEY_PORT, KEY4_PIN); if (current_key4 && !last_key4) { sample_cycle = CYCLE_15S; printf("Output==> sample cycle adjust: %ds\r\n", sample_cycle); // ±£´æµ½Flash spi_flash_sector_erase(SAMPLE_CYCLE_ADDR); spi_flash_buffer_write((uint8_t*)&sample_cycle, SAMPLE_CYCLE_ADDR, sizeof(uint32_t)); // Èç¹ûÕýÔÚ²ÉÑù£¬¸üвÉÑùʱ¼ä if (sampling_enabled) { last_sample_time = current_tick; } } last_key4 = current_key4; // ================ ´®¿ÚÃüÁî´¦Àí ================ if (cmd_ready) { cmd_ready = 0; int len = cmd_index; // ÇåÀíÃüÁîĩβµÄ¿Õ°××Ö·û while (len > 0 && (cmd_buffer[len - 1] == '\r' || cmd_buffer[len - 1] == '\n' || cmd_buffer[len - 1] == ' ')) { cmd_buffer[len - 1] = '\0'; len--; } // ²âÊÔÃüÁî if (strcmp((const char*)cmd_buffer, "test") == 0) { sys_check(); // ϵͳ×Ô¼ì } // RTCÅäÖÃÃüÁî else if (strcmp((const char*)cmd_buffer, "RTC Config") == 0) { printf("\r\nInput Datetime\r\n"); while (cmd_ready == 0) delay_1ms(10); char datetime_str[64]; strcpy(datetime_str, (const char*)cmd_buffer); cmd_ready = 0; rtc_settime(datetime_str); } // ÏÔʾµ±Ç°Ê±¼ä else if (strcmp((const char*)cmd_buffer, "RTC now") == 0) { rtc_show_time(); } // conf¼ì²â else if (strcmp((const char*)cmd_buffer, "conf") == 0) { conf(); } // ratio¼ì²â else if (strcmp((const char*)cmd_buffer, "ratio") == 0) { ratio_set(); } // limit¼ì²â else if (strcmp((const char*)cmd_buffer, "limit") == 0) { limit_set(); } // conf_read¼ì²â else if (strcmp((const char*)cmd_buffer, "conf_read") == 0) { printf("\r\nread parameters from flash\r\n"); conf_read(); } // conf_save¼ì²â else if (strcmp((const char*)cmd_buffer, "conf_save") == 0) { conf_save(); } // Æô¶¯²ÉÑùÃüÁî else if (strcmp((const char*)cmd_buffer, "start") == 0) { sampling_enabled = 1; printf("Output==> Periodic Sampling\r\n"); printf("Output==> sample cycle: %ds\r\n", sample_cycle); last_sample_time = current_tick; last_led_toggle_time = current_tick; led_state = 0; OLED_Clear(); OLED_ShowString(0, 0, "Sampling...", 16); OLED_Refresh(); } // Í£Ö¹²ÉÑùÃüÁî else if (strcmp((const char*)cmd_buffer, "stop") == 0) { if (sampling_enabled) { sampling_enabled = 0; printf("Output==> Periodic Sampling STOP\r\n"); gpio_bit_reset(GPIOA, GPIO_PIN_5); // ¹Ø±ÕLED1 OLED_Clear(); OLED_ShowString(0, 0, "system idle", 16); OLED_Refresh(); } } } // ================ ²ÉÑùÈÎÎñ ) ================ if (sampling_enabled) { // LEDÉÁ˸¿ØÖÆ£¨·Ç×èÈû·½Ê½£© if (current_tick - last_led_toggle_time >= 500) { last_led_toggle_time = current_tick; led_state = !led_state; if (led_state) { gpio_bit_set(GPIOA, GPIO_PIN_5); // LEDÁÁ } else { gpio_bit_reset(GPIOA, GPIO_PIN_5); // LEDÃð } } // ²ÉÑù¶¨Ê±£¨Ê¹Óõ±Ç°ÖÜÆÚ£© if (current_tick - last_sample_time >= sample_cycle * 1000) { // ¶ÁÈ¡RTCʱ¼ä // ¶ÁÈ¡ADCÖµ adc_flag_clear(ADC0, ADC_FLAG_EOC); while (SET != adc_flag_get(ADC0, ADC_FLAG_EOC)) {} // µÈ´ýת»»Íê³É uint16_t adc_value = ADC_RDATA(ADC0); float vol_value = adc_value * 3.3f / 4095.0f; rtc_current_time_get(&rtc_initpara); // ת»»Îª10½øÖÆ uint8_t hour = bcd_to_dec(rtc_initpara.hour); uint8_t minute = bcd_to_dec(rtc_initpara.minute); uint8_t second = bcd_to_dec(rtc_initpara.second); uint8_t year = bcd_to_dec(rtc_initpara.year); uint8_t month = bcd_to_dec(rtc_initpara.month); uint8_t day = bcd_to_dec(rtc_initpara.date); /**************** OLED?? ****************/ char time_str[16]; char volt_str[16]; sprintf(time_str, "%02u:%02u:%02u", hour, minute, second); sprintf(volt_str, "%.2f V", vol_value); OLED_Clear(); OLED_ShowString(0, 0, time_str, 16); OLED_ShowString(0, 16, volt_str, 16); OLED_Refresh(); /***************´®¿ÚÊä³ö****************/ printf("20%02u-%02u-%02u %02u:%02u:%02u %.2fV\r\n", year, month, day, hour, minute, second, vol_value); /*************** ´æ´¢Êý¾Ý *************** int count; // µ±Ç°ÎļþÊý¾Ý¼ÆÊý unsigned long datetime; // µ±Ç°ÎļþµÄʱ¼ä´Á FIL file; // µ±Ç°Îļþ¶ÔÏóDataFileInfo data_file_info = {0, 0, {0}};*/ FRESULT res; FATFS fs; char dir_path[] = "0:/sample"; // Ä¿±êĿ¼ char filename[64]; if (data_file_info.count == 0) { //³õʼ»¯´æ´¢É豸 DSTATUS status = disk_initialize(0); if (status != 0) { printf("Disk initialize failed. Status: 0x%02X\n", status); return; } //¹ÒÔØÎļþϵͳ res = f_mount(0, &fs); if (res != FR_OK) { printf("Mount failed=%d\n", res); return; } // ¹Ø±Õ֮ǰ´ò¿ªµÄÎļþ if (data_file_info.file.fs) { f_close(&data_file_info.file); } //È·±£Ä¿±êĿ¼´æÔÚ FILINFO fno; res = f_stat(dir_path, &fno); if (res == FR_NO_FILE) { // Ŀ¼²»´æÔÚ res = f_mkdir(dir_path); // ´´½¨Ä¿Â¼ if (res != FR_OK) { printf("Ŀ¼´´½¨Ê§°Ü %s: %d\n", dir_path, res); return; } } else if (res != FR_OK) { printf("Ŀ¼·ÃÎÊ´íÎó: %d\n", res); return; } // Éú³É´øÂ·¾¶µÄÎļþÃû snprintf(filename, sizeof(filename), "%s/sampleDeta20%02d%02d%02d%02d%02d%02d.txt", dir_path, year, month, day, hour, minute, second); // ´´½¨ÐÂÎļþ res = f_open(&data_file_info.file, filename, FA_CREATE_ALWAYS | FA_WRITE); if (res != FR_OK) { printf("Îļþ´´½¨Ê§°Ü %s: %d\n", filename, res); // return; }else{ printf(“Îļþ´´½¨³É¹¦”); f_open(&data_file_info.file, filename, FA_CREATE_ALWAYS | FA_WRITE); } } // дÈëÊý¾Ý char data_line[50]; snprintf(data_line, sizeof(data_line), "20%02d-%02d-%02d %02d:%02d:%02d %.2f V\r\n", year, month, day, hour, minute, second, vol_value); UINT bw; // f_open(&data_file_info.file, filename, FA_CREATE_ALWAYS | FA_WRITE); res = f_write(&data_file_info.file, data_line, strlen(data_line), &bw); // f_close(&data_file_info.file); // f_mount(0, NULL);//Ð¶ÔØÎļþϵͳ if (res != FR_OK || bw != strlen(data_line)) { printf(“Êý¾ÝдÈëʧ°Ü: %d\n”, res); } else { f_sync(&data_file_info.file); data_file_info.count++; // ´ïµ½10ÌõÊý¾ÝºóÖØÖà if (data_file_info.count >= 10) { data_file_info.count = 0; f_mount(0, NULL);//Ð¶ÔØÎļþϵͳ } } last_sample_time = current_tick; } } else { // ¿ÕÏÐ״̬ÏÂÌí¼ÓСÑÓʱ delay_1ms(10); } } } void nvic_config(void) { nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3); // ÉèÖÃÖжÏÓÅÏȼ¶·Ö×é nvic_irq_enable(SDIO_IRQn, 0, 0); // ʹÄÜSDIOÖжϣ¬ÓÅÏȼ¶Îª0 } /* ͨ¹ý´®¿ÚÊäÈëдÈëÎļþ */ void write_file(void) { printf(“Input data (press Enter to save):\r\n”); uint16_t index = 0; while(1){ if(usart_flag_get(USART0, USART_FLAG_RBNE) != RESET){ char ch = usart_data_receive(USART0); // Èç¹û½ÓÊÕ»º³åÇø·Ç¿Õ£¬´ÓUSART0½ÓÊÕÒ»¸ö×Ö·û if(ch == '\r'){ // ¼ì²é½ÓÊÕµ½µÄ×Ö·ûÊÇ·ñΪ»Ø³µ¼ü£¨'\r'£© filebuffer[index] = '\0'; // Èç¹ûÊǻسµ¼ü£¬ÔÚµ±Ç°Î»ÖÃÌí¼Ó×Ö·û´®½áÊø·û '\0' break; // Ìø³öÑ­»·£¬½áÊøÊý¾Ý½ÓÊÕ } filebuffer[index++] = ch; // ´æ´¢½ÓÊÕµ½µÄ×Ö·û if(index >= sizeof(filebuffer)-1) break; // Èç¹û»º³åÇøÂúÔò½áÊø½ÓÊÕ } } } /! \brief memory compare function \param[in] src: source data pointer \param[in] dst: destination data pointer \param[in] length: the compare data length \param[out] none \retval ErrStatus: ERROR or SUCCESS / ErrStatus memory_compare(uint8_t src, uint8_t dst, uint16_t length) { while(length --){ if(*src++ != *dst++) return ERROR; } return SUCCESS; } 把 int count; // µ±Ç°ÎļþÊý¾Ý¼ÆÊý unsigned long datetime; // µ±Ç°ÎļþµÄʱ¼ä´Á FIL file; // µ±Ç°Îļþ¶ÔÏóDataFileInfo data_file_info = {0, 0, {0}};*/ FRESULT res; FATFS fs; char dir_path[] = "0:/sample"; // Ä¿±êĿ¼ char filename[64]; if (data_file_info.count == 0) { //³õʼ»¯´æ´¢É豸 DSTATUS status = disk_initialize(0); if (status != 0) { printf("Disk initialize failed. Status: 0x%02X\n", status); return; } //¹ÒÔØÎļþϵͳ res = f_mount(0, &fs); if (res != FR_OK) { printf("Mount failed=%d\n", res); return; } // ¹Ø±Õ֮ǰ´ò¿ªµÄÎļþ if (data_file_info.file.fs) { f_close(&data_file_info.file); } //È·±£Ä¿±êĿ¼´æÔÚ FILINFO fno; res = f_stat(dir_path, &fno); if (res == FR_NO_FILE) { // Ŀ¼²»´æÔÚ res = f_mkdir(dir_path); // ´´½¨Ä¿Â¼ if (res != FR_OK) { printf("Ŀ¼´´½¨Ê§°Ü %s: %d\n", dir_path, res); return; } } else if (res != FR_OK) { printf("Ŀ¼·ÃÎÊ´íÎó: %d\n", res); return; } // Éú³É´øÂ·¾¶µÄÎļþÃû snprintf(filename, sizeof(filename), "%s/sampleDeta20%02d%02d%02d%02d%02d%02d.txt", dir_path, year, month, day, hour, minute, second); // ´´½¨ÐÂÎļþ res = f_open(&data_file_info.file, filename, FA_CREATE_ALWAYS | FA_WRITE); if (res != FR_OK) { printf("Îļþ´´½¨Ê§°Ü %s: %d\n", filename, res); // return; }else{ printf(“Îļþ´´½¨³É¹¦”); f_open(&data_file_info.file, filename, FA_CREATE_ALWAYS | FA_WRITE); } } // дÈëÊý¾Ý char data_line[50]; snprintf(data_line, sizeof(data_line), "20%02d-%02d-%02d %02d:%02d:%02d %.2f V\r\n", year, month, day, hour, minute, second, vol_value); UINT bw; // f_open(&data_file_info.file, filename, FA_CREATE_ALWAYS | FA_WRITE); res = f_write(&data_file_info.file, data_line, strlen(data_line), &bw); // f_close(&data_file_info.file); // f_mount(0, NULL);//Ð¶ÔØÎļþϵͳ if (res != FR_OK || bw != strlen(data_line)) { printf(“Êý¾ÝдÈëʧ°Ü: %d\n”, res); } else { f_sync(&data_file_info.file); data_file_info.count++; // ´ïµ½10ÌõÊý¾ÝºóÖØÖà if (data_file_info.count >= 10) { data_file_info.count = 0; f_mount(0, NULL);//Ð¶ÔØÎļþϵͳ } }封装起来,void write_data_to_file(const char* dir_path, int year, int month, int day, int hour, int minute, int second, float vol_value),只需要封装起来,不要改这里面的程序,一点也不要改,因为测试他没有错

黄宇韬
  • 粉丝: 27
上传资源 快速赚钱