221 lines
8.4 KiB
C
221 lines
8.4 KiB
C
#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;
|
|
}
|