#include "soft_flash.h" #include #include "main.h" #include "soft_flow.h" #include "soft_p_2_c.h" #include "config.h" #include "soft_version.h" bool write_aboutage_information = false; bool read_aboutage_information = false; short set_cali_voltage = 0; uint32_t set_pmu_serail = 0; _F_PMU_PAR flash_pmu_par; _C_PMU_PAR current_pmu_par; bool write_flash_flag = false; /** * @file ReadFlashNBtye * @brief 读flash * @param none * @details * @author Zhang Sir **/ void ReadFlashNBtye(uint32_t addr, uint8_t *pdata, uint16_t size) { for (size_t i = 0; i < size; i++) { *(pdata + i) = *((__IO uint8_t *)addr + i); } } /** * @file WriteFlashNBtye * @brief 写flash * @param none * @details * @author Zhang Sir **/ HAL_StatusTypeDef WriteFlashNBtye(uint32_t addr, uint8_t *pdata, uint16_t size) { HAL_StatusTypeDef write_status = HAL_OK; __disable_irq(); HAL_FLASH_Unlock(); //擦1页flash 1页2kb FLASH_EraseInitTypeDef f; f.TypeErase = FLASH_TYPEERASE_PAGES; f.PageAddress = addr; f.NbPages = 1; uint32_t PageError = 0; HAL_FLASHEx_Erase(&f, &PageError); //写flash 每次写2字节 uint16_t TempBuf = 0; for(uint16_t i = 0; i < (size % 2 == 0? size/2 : size/2 +1); i++ ) { TempBuf = *(pdata + 2 * i) + (*(pdata + 2 * i + 1) << 8); write_status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr + i * 2, TempBuf); } HAL_FLASH_Lock(); __enable_irq(); return write_status; } /** * @file check_flash_par_normal * @brief 检查flash参数是否合法 * @param none * @details * @author Zhang Sir **/ short check_flash_par_normal(short par, short min_par, short max_par ,uint8_t par_or_zero) { if(par >= max_par) { if(par_or_zero == 1) { return max_par; } else { return 0; } } else if(par <= min_par) { if(par_or_zero == 1) { return min_par; } else { return 0; } } else { return par; } } /** * @file flash_read_vol_funcktion * @brief 从flash中读取电压校准的系数 * @param none * @details 125kb地址0x801F800 * @author Zhang Sir **/ short reset_reason_temp = 0; void flash_read_funcktion( void ) { GPIO_InitTypeDef GPIO_InitStruct = {0}; ReadFlashNBtye( FLASH_PAR_INFO, ( uint8_t * )&flash_pmu_par, sizeof( _F_PMU_PAR ) ); if(flash_pmu_par.flag != 0xAA) parameter_assignment_default(); parameter_copy(); if(current_pmu_par.uavtype == VK_ALL_IN_ONE) { init_pwmout(VK_ALL_IN_ONE); init_gpio(VK_ALL_IN_ONE); } else { //先执行上电离心喷头会转 GPIO_InitStruct.Pin = EXIT_1T_Pin|EXIT_2T_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;//GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = EXIT_3T_Pin|EXIT_4T_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); } HAL_TIM_Base_Start_IT(&htim4); HAL_TIM_Base_Start(&htim4); } /** * @file parameter_assignment_default * @brief 设置默认参数 * @param none * @details * @author Zhang Sir **/ void parameter_assignment_default(void) { flash_pmu_par.flag = 0xAA; flash_pmu_par._cal_vol = 0; flash_pmu_par._uavtype = 0; flash_pmu_par._abnormal_outage_flag = false; flash_pmu_par._reset_reason = 0; flash_pmu_par._SN_L = PMU_SERIAL & 0xffff; flash_pmu_par._SN_H = (PMU_SERIAL >> 16) & 0xffff; flash_pmu_par._hardVersion_L = PMU_HARDVERSION & 0xffff; flash_pmu_par._hardVersion_H = (PMU_HARDVERSION >> 16) & 0xffff; WriteFlashNBtye(FLASH_PAR_INFO,(uint8_t *)&flash_pmu_par,sizeof(_F_PMU_PAR)); } /** * @file parameter_copy * @brief 参数赋值 * @param none * @details * @author Zhang Sir **/ void parameter_copy(void) { current_pmu_par.cal_vol = check_flash_par_normal(flash_pmu_par._cal_vol,-50,50,0); current_pmu_par.uavtype = flash_pmu_par._uavtype; current_pmu_par.abnormal_outage_flag = flash_pmu_par._abnormal_outage_flag; current_pmu_par.reset_reason = flash_pmu_par._reset_reason; current_pmu_par.SN = flash_pmu_par._SN_L + (flash_pmu_par._SN_H << 16); current_pmu_par.hardVersion = flash_pmu_par._hardVersion_L + (flash_pmu_par._hardVersion_H << 16); } /** * @file flash_write_pmu_par * @brief 写flash * @param none * @details * @author Zhang Sir **/ void flash_write_pmu_par(void) { if(write_flash_flag == true) { if(HAL_OK == WriteFlashNBtye(FLASH_PAR_INFO,(uint8_t *)&flash_pmu_par,sizeof(_F_PMU_PAR))) { write_flash_flag = false; parameter_copy(); } } }