commit 286ff98b8ec180cdc39ebe9136d30131e51e1bce Author: guishenking Date: Fri Mar 20 21:09:48 2026 +0800 上传文件至 / diff --git a/lhl_flash.c b/lhl_flash.c new file mode 100644 index 0000000..eea00ff --- /dev/null +++ b/lhl_flash.c @@ -0,0 +1,217 @@ +#include "../main/SystemInclude.h" + +/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + +USER_PARAMS_ADDR ²ÎÊýÊý¾Ý±£´æÇø£¬¶ÔÓ¦EEPROMµÄ 0x10-0x6C0 Çø¼ä +²ÎÊýҳ˵Ã÷£º½« u16 MBReg[336]; u16 WordReg[128]; u32 DWordReg[64]; + ×ܹ² 1712bytes ÒÀ´ÎÁ¬Ðø´æ´¢µ½USER_PARAMS_ADDRΪÆðʼµØÖ·µÄÒ³; + +CORRECT_DATA_ADDR ĬÈÏУ׼ҳ±£´æÇø£¬¶ÔÓ¦EEPROMµÄ 0x1000-¼°ÒÔºó°´ÕÕÄÚÂëÁ¿Éè¼ÆµÄÇø¼ä + += = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/ +//д²ÎÊýÊý¾Ý±£´æÇø-ÁÙʱ»º³åÇø +u8 param_buffer[TOTAL_PARAM_SIZE] __attribute__((aligned(4))); //4×Ö½Ú¶ÔÆë + +void update_param_bufferFromFlash(void)// +{ + memcpy(param_buffer, (void*)USER_PARAMS_ADDR, TOTAL_PARAM_SIZE); +} + +//д²ÎÊýÊý¾Ý±£´æÇø-½«ÁÙʱ»º³åÇøparam_bufferÊý¾Ý´æÈëflash ------------------ +static void WriteAllParamToFlash(void) +{ + //²Á³ý Flash Ò³£¨USER_PARAMS_ADDR ÊÇÒ³Æðʼ£© + if(LHL_FLASH_Erase(USER_PARAMS_ADDR, USER_PARAMS_ADDR, LHL_LNG_TIMEOUT) != LHL_OK) + { + while(1); + } + //°´ 32-bit word дÈë ±ØÐë 4-byte ¶ÔÆë + u16 word_count = (TOTAL_PARAM_SIZE + 3)>>2; // ÏòÉÏÈ¡Õû ת»»Îª32λÊý¾ÝµÄ¸öÊý + + LHL_FLASH_Program( USER_PARAMS_ADDR, (uint32_t*)param_buffer, word_count, LHL_LNG_TIMEOUT ); +} + + +//д²ÎÊýÊý¾Ý±£´æÇø-Ë«×Ö½Ú±£´æÇø +u16 WriteShortParameterToFlash(u16 parameterAdr) +{ + //·ÃÎÊË«×Ö½ÚÊý¾Ý±£´æÇø------------------------------------------------------------------ +// if((parameterAdr >=REG_MEM_ADDR_START) && (parameterAdr < REG_INT_DWORD_MEM_ADDR_START)) +// {} + u8 *p = param_buffer; + + tempL.Byte[2] = CRC8(tempL.Byte, 2);//¼ÆËãÐÂֵУÑéÂë + + p += parameterAdr; + //¸üбäÁ¿ + p[0] = tempL.Byte[0]; + p[1] = tempL.Byte[1]; + p[2] = tempL.Byte[2]; + + //дparam_bufferµ½Flash + WriteAllParamToFlash(); + + tempL.Word[0] = ReadShortParameterFromFlash(parameterAdr,WordDefault[ADR_WORD_IDX(parameterAdr)][DEFAULT]); + tempL.Byte[2] = 0; + // ×¢Ò⣺´Ëʱ²»ÓøüРWordReg[index] + // ÒòΪÉϲã»áÓ÷µ»ØÖµÀ´¸üУº*WRSource = ·µ»ØÖµ; + return tempL.Word[0]; //Éϲã»áÓôËÖµ¸üРWordReg[I] +} + + +//д²ÎÊýÊý¾Ý±£´æÇø-ËÄ×Ö½Ú±£´æÇø +u32 WriteLongParameterToFlash(u16 parameterAdr) +{ +// if( (parameterAdr >=REG_INT_DWORD_MEM_ADDR_START)&& parameterAdr <= REG_INT_DWORD_MEM_ADDR_END) +// { } + tempDev.Byte[4] = CRC8(tempDev.Byte, 4);//¼ÆËãÐÂֵУÑéÂë + + //¸üбäÁ¿ + u8 *p = param_buffer; + p += (parameterAdr ); + p[0] = tempDev.Byte[0]; + p[1] = tempDev.Byte[1]; + p[2] = tempDev.Byte[2]; + p[3] = tempDev.Byte[3]; + p[4] = tempDev.Byte[4]; + + //дparam_bufferµ½Flash + WriteAllParamToFlash(); + + tempDev.DWord[0] = ReadLongParameterFromFlash(parameterAdr,WordDefault[ADR_DWORD_IDX(parameterAdr)][DEFAULT]); + tempDev.Byte[4] = 0; + + return tempDev.DWord[0]; +} + + + +//дУ׼ҳ±£´æÇø ,¶þ´ÎÐÞÕý±£´æÇø ,²»¶¨³¤²ÎÊýÊý¾Ý±£´æÇø--------------------------------------------------- +void WriteMultiByteToFlash(u16 address, u8 *wrtData, u16 dataLenth, u8 flashAdr) +{ + (void)flashAdr; // ûÓжà¸öFlash + //ĬÈÏУ׼ÇúÏß--------------------------------------------------------------- + if(address >= CALI_DATA1_ADDR)//ҪдÈëµÄµØÖ·ÎªÔ­eepromµÄÐ£×¼Çø + { + //0.ת»»³ÉFlashµØÖ· + u32 ADDR = (u32)(address - CALI_DATA1_ADDR); + ADDR = ADDR + CORRECT_DATA_ADDR; + //ÅжÏÊÇ·ñÐÂÒ»Ò³£¬²Á³ýÐÂÒ³×¼±¸Ð´Èë + if((ADDR&0x0FFF) == 0x000) LHL_FLASH_Erase(ADDR,ADDR,LHL_LNG_TIMEOUT);//ADDR¿çÒ³¼´ADDRΪҳÊ×µØÖ· + if(ADDR >(CORRECT_DATA_ADDR+ CALIB_STORED_SIZE) ) MBBuf.BusError = SLAVE_DEVICE_FAILURE;//Òç³ö + //дУ׼½øÈëFlash + LHL_FLASH_Program(ADDR,(u32 *)wrtData,dataLenth>>2 ,LHL_LNG_TIMEOUT); + } + //У׼ÇúÏß2--------------------------------------------------------------- + //CALI_DATA2_ADDR CORRECT_DATA2_ADDR CALIB_STORED_SIZE2 + //У׼ÇúÏß3--------------------------------------------------------------- + //CALI_DATA3_ADDR CORRECT_DATA3_ADDR CALIB_STORED_SIZE3 + //¶þ´ÎÐÞÕýÇø--------------------------------------------------------------- +// else if() +// { +// USER_DCOEF_TAG_ADDR +// } + //дÈë¶à¸öµ½²ÎÊýÊý¾Ý±£´æÇø------------------------------------------------------------------ + else if((address >=REG_MEMORY_ADDR) && (address <= REG_INT_DWORD_MEM_ADDR_END)) + { + + + + + wrtData[dataLenth] = CRC8(wrtData, dataLenth);//¼ÆËãÐÂֵУÑéÂë + //¸üбäÁ¿ + u8 *p = param_buffer; + p += address; + /*for(u8 i = 0 ; i < dataLenth+1 ; i ++) + { + p[i] = wrtData[i]; + }*/ + //ÿÁ½¸ö×Ö½Ú½»»» + for (int i = 0; i < dataLenth; i += 2) { + p[i] = wrtData[i + 1]; //µÍµØÖ· + p[i + 1] = wrtData[i]; //¸ßµØÖ· + } + p[dataLenth]= wrtData[dataLenth];//CRCÖ±½Ó¸´ÖÆ + + WriteAllParamToFlash(); + } + + +} + + + + + + + + + + + +//¶ÁË«×Ö½ÚÊý¾Ý±£´æÇø------------------------------------------------------------------ +u16 ReadShortParameterFromFlash(u16 parameterAdr , u16 parameterDefault) +{ +// if(parameterAdr >=REG_MEM_ADDR_START && parameterAdr < REG_INT_DWORD_MEM_ADDR_START) +// { } + u32 ADDR = ((u32)parameterAdr + USER_PARAMS_ADDR);// ½«EEPROM ²ÎÊýµØÖ·£¨Èç MEM_ADDR_REG_0X30 = 0x10£©×ªÎª Flash ÎïÀíµØÖ· + + tempL.Word[0] = 0; + memcpy(tempL.Byte,(const void*)ADDR, 3); + + if(tempL.Byte[2] != CRC8(tempL.Byte, 2)) + { + tempL.Word[0] = (u32)parameterDefault; + isReadParameterOK = 0; + } + else + { + tempL.Byte[2] = 0; + isReadParameterOK = 1; + } + + return tempL.Word[0]; + +} +//¶ÁËÄ×Ö½ÚÊý¾Ý±£´æÇø------------------------------------------------------------------ +u32 ReadLongParameterFromFlash(u16 parameterAdr , u16 parameterDefault) +{ +// if( (parameterAdr >=REG_INT_DWORD_MEM_ADDR_START)&& parameterAdr <= REG_INT_DWORD_MEM_ADDR_END) +// { } + u32 ADDR = (u32)(parameterAdr + USER_PARAMS_ADDR); + tempDev.DWord[0] = 0; + memcpy(tempDev.Byte,(const void*)ADDR, 5); + + if(tempDev.Byte[4] != CRC8(tempDev.Byte, 4)) + { + tempDev.DWord[0] = (u32)parameterDefault; + isReadParameterOK = 0; + } + else + { + isReadParameterOK = 1; + } + return tempDev.DWord[0]; + +} + +//¶ÁÊý¾Ý±£´æÇø,У׼Êý¾Ý±£´æÇø------------------------------------------------------------------ +void ReadMultiByteFromFlash(u16 address,u8 *wrtData, u16 dataLenth, u8 flashAdr) +{ + (void)flashAdr; // ûÓжà¸öFlash,±ÜÃâ±àÒëÆ÷ warning + u32 ADDR; + //¶ÁУ׼Êý¾Ý±£´æÇø-------------------------------------------------------- + //ÓÉÓÚУ׼Êý¾ÝµØÖ·»ù׼ΪeepromµÄµØÖ·£¬¶øËùÓеÄУ׼¶¼ÔڸõØÖ·ºó£¬Òò´ËÖ»ÐèÒªÅжÏÕâÒ»¸ö¼´¿É + if(address >=CALI_DATA1_ADDR) + { + ADDR =(u32)(address-CALI_DATA1_ADDR ); + ADDR += CORRECT_DATA_ADDR; //ת»»ÎªFlashµØÖ· + memcpy(wrtData,(const void*)ADDR, dataLenth); + } + //¶ÁÊý¾Ý±£´æÇø---------------------------------------------------------- + else if((address >=REG_MEMORY_ADDR) && (address <= REG_INT_DWORD_MEM_ADDR_END)) + { + ADDR =((u32)address + USER_PARAMS_ADDR); + memcpy(wrtData,(const void*)ADDR, dataLenth); //²»¶¨³¤²ÎÊýµÄУÑéλÊÇ´æÁ˵ģ¬ÈôÅжϵ«ÊÇĬÈÏÖµ=£¿Î´ÅÐ¶Ï + } +} diff --git a/lhl_lowpower.h b/lhl_lowpower.h new file mode 100644 index 0000000..335b70a --- /dev/null +++ b/lhl_lowpower.h @@ -0,0 +1,22 @@ +#ifndef __LOWPOWER_H__ +#define __LOWPOWER_H__ + +/*================================================*/ +void EnterLowPowerModeWFI(PWR_POWERMODE_t mode); + + +/*================================================*/ +typedef struct{ + PWR_POWERMODE_t lpm_mode; + u8 mcuModeSleeping ; +}__LPM_STA_TypeDef; + +extern __LPM_STA_TypeDef lpmState; + +void LowPowerModeProcess(void); +void SetupLowPowertoWakeupByHandwareTrigger(void); +void ExitLowPowerModeRecoverySysState(void); + + +#endif + diff --git a/lhl_systemclock.h b/lhl_systemclock.h new file mode 100644 index 0000000..49c4112 --- /dev/null +++ b/lhl_systemclock.h @@ -0,0 +1,31 @@ +#ifndef __SYSTEMCLOCK_H_ +#define __SYSTEMCLOCK_H_ + + +typedef enum { + clock_defaultconfig1,//SYSclock=16M AHBclock=16M APB1clock=16M APB2clock=16M + clock_defaultconfig2,//SYSclock=16M AHBclock=8M APB1clock=8M APB2clock=8M + clock_defaultconfig3,//SYSclock=16M AHBclock=8M APB1clock=4M APB2clock=4M + clock_defaultconfig4,//SYSclock=16M AHBclock=8M APB1clock=8M APB2clock=4M + clock_defaultconfig5,//SYSclock=16M AHBclock=8M APB1clock=4M APB2clock=8M + //......¸ü¶à×Ô¶¨ÒåÅäÖà +}clock_defaultconfig_t; + + +//ÅäÖýṹÌå +typedef struct { + + uint8_t clock_config;//this pram value can be : clock_defaultconfig_t + +} systemclock_config_t; + + +void System_MCO_Config(void); +void SystemClockConfiguration(void); +void disable_interrupts(void); +void enable_interrupts(void); +void ResetSystem(void); + + +void Enable_LSE(void); +#endif \ No newline at end of file diff --git a/lhl_watchdog.h b/lhl_watchdog.h new file mode 100644 index 0000000..da408b9 --- /dev/null +++ b/lhl_watchdog.h @@ -0,0 +1,10 @@ +#ifndef __LHL_WATCHDOG_H__ +#define __LHL_WATCHDOG_H__ + +void SystemIWDGInit(void); +void Stop_WDT(void); +void Clear_WDT(void); + +#endif + + diff --git a/main.c b/main.c new file mode 100644 index 0000000..9d3a20c --- /dev/null +++ b/main.c @@ -0,0 +1,26 @@ +#include "../main/SystemInclude.h" +/****************************************************************************/ +int main(void) +{ + Stop_WDT(); /* ½ûÓöÀÁ¢¿´ÃŹ·(IWDG) */ + SystemClockConfiguration(); /* ϵͳʱÖÓ³õʼ»¯ */ + SystemGPIOInit(); /* ³õʼ»¯GPIOĬÈÏ״̬ */ + StartLPTimer2(327); + lptimer_register_irq_callback(LPTIM2, My_Timer2_Callback); + Key_Power_Init(); + + EnterMainEntry(); // ½øÈë³ÌÐòÖ÷Èë¿Ú + /*----------Óû§ÏµÍ³³õʼ»¯----------*/ + systmeState = 0x00; // ϵͳ״̬³õʼ»¯ + SystemInitProcess(); // Ó²¼þ³õʼ»¯ + + OLED_Init(); + LED_PIN_OUT(); + while(1) + { + SystemPolling(); //ϵͳÂÖѯ + } + return 0; +} + +