#include "control.h" ProjectSettings_TypeDef PROJSET; uint32_t PageError = 0x00; uint8_t UpdateSettings = 0; void WriteSettingsToMem(void) { HAL_FLASH_Unlock(); CheckSettingsInFLASH(); if(CheckIsSettingsValid(&PROJSET)) // if new settings are invalid PROJSET = *PROJSET_MEM; // take the old settings from mem else // if new settings are valid SetFlagUpdateSettingsInMem(); // save the new settings in mem (set flag to do this) HAL_FLASH_Lock(); } void SetFlagUpdateSettingsInMem(void) { UpdateSettings = 0; // MODBUS settings if(PROJSET_MEM->MB_DEVICE_ID != PROJSET.MB_DEVICE_ID) UpdateSettings = 1; if(PROJSET_MEM->MB_SPEED != PROJSET.MB_SPEED) UpdateSettings = 1; if(PROJSET_MEM->MB_GPIOX != PROJSET.MB_GPIOX) UpdateSettings = 1; if(PROJSET_MEM->MB_GPIO_PIN_RX != PROJSET.MB_GPIO_PIN_RX) UpdateSettings = 1; if(PROJSET_MEM->MB_GPIO_PIN_RX != PROJSET.MB_GPIO_PIN_RX) UpdateSettings = 1; if(PROJSET_MEM->MB_MAX_TIMEOUT != PROJSET.MB_MAX_TIMEOUT) UpdateSettings = 1; // PWM settings if(PROJSET_MEM->TIM_PWM_TICKBASE != PROJSET.TIM_PWM_TICKBASE) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM_AHB_FREQ != PROJSET.TIM_PWM_AHB_FREQ) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM1_TIM_CHANNEL1 != PROJSET.TIM_PWM1_TIM_CHANNEL1) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM1_TIM_CHANNEL2 != PROJSET.TIM_PWM1_TIM_CHANNEL2) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM1_GPIOx != PROJSET.TIM_PWM1_GPIOx) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM1_GPIO_PIN_X1 != PROJSET.TIM_PWM1_GPIO_PIN_X1) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM1_GPIO_PIN_X2 != PROJSET.TIM_PWM1_GPIO_PIN_X2) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM2_INSTANCE != PROJSET.TIM_PWM2_INSTANCE) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM2_TIM_CHANNEL1 != PROJSET.TIM_PWM2_TIM_CHANNEL1) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM2_TIM_CHANNEL2 != PROJSET.TIM_PWM2_TIM_CHANNEL2) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM2_GPIOx != PROJSET.TIM_PWM2_GPIOx) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM2_GPIO_PIN_X1 != PROJSET.TIM_PWM2_GPIO_PIN_X1) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM2_GPIO_PIN_X2 != PROJSET.TIM_PWM2_GPIO_PIN_X2) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM3_INSTANCE != PROJSET.TIM_PWM3_INSTANCE) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM3_TIM_CHANNEL1 != PROJSET.TIM_PWM3_TIM_CHANNEL1) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM3_TIM_CHANNEL2 != PROJSET.TIM_PWM3_TIM_CHANNEL2) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM3_GPIOx != PROJSET.TIM_PWM3_GPIOx) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM3_GPIO_PIN_X1 != PROJSET.TIM_PWM3_GPIO_PIN_X1) UpdateSettings = 1; if(PROJSET_MEM->TIM_PWM3_GPIO_PIN_X2 != PROJSET.TIM_PWM3_GPIO_PIN_X2) UpdateSettings = 1; // CTRL settings if(PROJSET_MEM->TIM_CTRL_TICKBASE != PROJSET.TIM_CTRL_TICKBASE) UpdateSettings = 1; if(PROJSET_MEM->TIM_CTRL_AHB_FREQ != PROJSET.TIM_CTRL_AHB_FREQ) UpdateSettings = 1; } void UpdateSettingsInMem(void) { if(UpdateSettings) { FLASH_EraseInitTypeDef EraseInitStruct; PageError = 0x00; EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;// erase pages EraseInitStruct.Banks = FLASH_BANK_1; EraseInitStruct.Sector = FLASH_SECTOR_4; //first sector for erase EraseInitStruct.NbSectors = 1;// num of sector that need to be erased HAL_FLASH_Unlock(); HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); /* Wait for last operation to be completed */ if(FLASH_WaitForLastOperation((uint32_t)50000U) == HAL_OK) { /* If the previous operation is completed, proceed to program the new data */ CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); FLASH->CR |= FLASH_PSIZE_WORD; FLASH->CR |= FLASH_CR_PG; *PROJSET_MEM = PROJSET; // save the new settings in mem } HAL_FLASH_Lock(); UpdateSettings = 0; } } void FillSettingsWithDefines(void) { // rewrite all setting corresponding to defines FLASH_EraseInitTypeDef EraseInitStruct; PageError = 0x00; EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;// erase pages EraseInitStruct.Banks = FLASH_BANK_1; EraseInitStruct.Sector = FLASH_SECTOR_4; //first sector for erase EraseInitStruct.NbSectors = 1;// num of sector that need to be erased HAL_FLASH_Unlock(); HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); // MODBUS settings FLASH_WRITE_SETTING(PROJSET_MEM->MB_DEVICE_ID, MODBUS_DEVICE_ID); FLASH_WRITE_SETTING(PROJSET_MEM->MB_SPEED, MODBUS_SPEED); FLASH_WRITE_SETTING(PROJSET_MEM->MB_GPIOX, (uint32_t)MODBUS_GPIOX); FLASH_WRITE_SETTING(PROJSET_MEM->MB_GPIO_PIN_RX, MODBUS_GPIO_PIN_RX); FLASH_WRITE_SETTING(PROJSET_MEM->MB_GPIO_PIN_TX, MODBUS_GPIO_PIN_TX); FLASH_WRITE_SETTING(PROJSET_MEM->MB_MAX_TIMEOUT, MODBUS_MAX_TIMEOUT); FLASH_WRITE_SETTING(PROJSET_MEM->MB_TIM_AHB_FREQ, MODBUS_TIM_AHB_FREQ); // PWM settings FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM_TICKBASE, TIMER_PWM_TICKBASE); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM_AHB_FREQ, TIMER_PWM_AHB_FREQ); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_TIM_CHANNEL1, TIMER_PWM1_TIM_CHANNEL1); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_TIM_CHANNEL2, TIMER_PWM1_TIM_CHANNEL2); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_GPIOx, (uint32_t)TIMER_PWM1_GPIOx); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_GPIO_PIN_X1, TIMER_PWM1_GPIO_PIN_X1); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_GPIO_PIN_X2, TIMER_PWM1_GPIO_PIN_X2); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_INSTANCE, (uint32_t)TIMER_PWM2_INSTANCE); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_TIM_CHANNEL1, TIMER_PWM2_TIM_CHANNEL1); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_TIM_CHANNEL2, TIMER_PWM2_TIM_CHANNEL2); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_GPIOx, (uint32_t)TIMER_PWM2_GPIOx); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_GPIO_PIN_X1, TIMER_PWM2_GPIO_PIN_X1); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_GPIO_PIN_X2, TIMER_PWM2_GPIO_PIN_X2); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_INSTANCE, (uint32_t)TIMER_PWM3_INSTANCE); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_TIM_CHANNEL1, TIMER_PWM3_TIM_CHANNEL1); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_TIM_CHANNEL2, TIMER_PWM3_TIM_CHANNEL2); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_GPIOx, (uint32_t)TIMER_PWM3_GPIOx); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_GPIO_PIN_X1, TIMER_PWM3_GPIO_PIN_X1); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_GPIO_PIN_X2, TIMER_PWM3_GPIO_PIN_X2); // CTRL settings FLASH_WRITE_SETTING(PROJSET_MEM->TIM_CTRL_TICKBASE, TIMER_CTRL_TICKBASE); FLASH_WRITE_SETTING(PROJSET_MEM->TIM_CTRL_AHB_FREQ, TIMER_CTRL_AHB_FREQ); HAL_FLASH_Lock(); } void CheckSettingsInFLASH(void) { if(CheckIsSettingsValid(PROJSET_MEM)) FillSettingsWithDefines(); PROJSET = *PROJSET_MEM; } int CheckIsSettingsValid(ProjectSettings_TypeDef *set_struct) { // if some of setting are missing // chech MODBUS if((!IS_UART_BAUDRATE(set_struct->MB_SPEED) || (set_struct->MB_SPEED ) == 0) || (!IS_GPIO_ALL_INSTANCE((GPIO_TypeDef *)set_struct->MB_GPIOX)) || (!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->MB_GPIO_PIN_TX)) || (!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->MB_GPIO_PIN_RX)) || ((set_struct->MB_TIM_AHB_FREQ) == 0)) { return 1; } // chech control tim if((set_struct->TIM_CTRL_AHB_FREQ) == 0) { return 1; } // chech PWM tims if((set_struct->TIM_PWM_AHB_FREQ) == 0 || (!IS_GPIO_ALL_INSTANCE((GPIO_TypeDef *)set_struct->TIM_PWM1_GPIOx)) || (!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM1_GPIO_PIN_X1)) || (!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM1_GPIO_PIN_X2)) || (!IS_TIM_CHANNELS(set_struct->TIM_PWM1_TIM_CHANNEL1)) || (!IS_TIM_CHANNELS(set_struct->TIM_PWM1_TIM_CHANNEL2)) || (!IS_TIM_INSTANCE((TIM_TypeDef *)set_struct->TIM_PWM2_INSTANCE)) || (!IS_GPIO_ALL_INSTANCE((GPIO_TypeDef *)set_struct->TIM_PWM2_GPIOx)) || (!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM2_GPIO_PIN_X1)) || (!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM2_GPIO_PIN_X2)) || (!IS_TIM_CHANNELS(set_struct->TIM_PWM2_TIM_CHANNEL1)) || (!IS_TIM_CHANNELS(set_struct->TIM_PWM2_TIM_CHANNEL2)) || (!IS_TIM_INSTANCE((TIM_TypeDef *)set_struct->TIM_PWM3_INSTANCE)) || (!IS_GPIO_ALL_INSTANCE((GPIO_TypeDef *)set_struct->TIM_PWM3_GPIOx)) || (!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM3_GPIO_PIN_X1)) || (!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM3_GPIO_PIN_X2)) || (!IS_TIM_CHANNELS(set_struct->TIM_PWM3_TIM_CHANNEL1)) || (!IS_TIM_CHANNELS(set_struct->TIM_PWM3_TIM_CHANNEL2))) { return 1; } return 0; }