123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- #include "soft_flash.h"
- #include <string.h>
- #include "main.h"
- #include "soft_flow.h"
- #include "soft_p_2_c.h"
- #include "config.h"
- #include "soft_version.h"
- bool write_vol_information = false;
- bool read_vol_information = false;
- bool write_serial_information = false;
- bool read_serial_information = false;
- bool write_uav_information = false;
- bool read_uav_information = false;
- bool write_aboutage_information = false;
- bool read_aboutage_information = false;
- short set_cali_voltage = 0;
- uint32_t set_pmu_serail = 0;
- /**
- * @file ReadFlashNBtye
- * @brief 读flash
- * @param none
- * @details
- * @author Zhang Sir
- **/
- void ReadFlashNBtye(uint32_t addr, uint8_t *pdata, uint16_t size)
- {
- if(addr + size >= FLSH_MAX_SIZE)
- {
- return;
- }
-
- 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 103c8t6 1页1kb 1024字节
- 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
- **/
- struct date_vol volinf;
- struct uav_type uavinf;
- struct pmu_serial serial;
- short reset_reason_temp = 0;
- void flash_read_funcktion( void )
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- ReadFlashNBtye( FLASH_SERIAL_IFO, ( uint8_t * )&serial, sizeof( serial ) );
-
- if(serial._flag != ( int16_t )0xA48A)
- {
- serial._flag = ( int16_t )0xA48A;
- serial.num = PMU_SERIAL;
- WriteFlashNBtye( FLASH_SERIAL_IFO, ( uint8_t * )&serial, sizeof( serial ) );
- }
- ReadFlashNBtye( FLASH_VOL_IFO, ( uint8_t * )&volinf, sizeof( volinf ) );
- if ( volinf._vol_flag != ( int16_t )0xA48A )
- {
- volinf._vol_flag = ( int16_t )0xA48A;
-
- volinf.cal_vol = 0;
- WriteFlashNBtye( FLASH_VOL_IFO, ( uint8_t * )&volinf, sizeof( volinf ) );
- }
- ReadFlashNBtye( FLASH_UAV_IFO, ( uint8_t * )&uavinf, sizeof( uavinf ) );
- if ( uavinf._uavtype_flag != ( int16_t )0xA48A )
- {
- uavinf._uavtype_flag = ( int16_t )0xA48A;
-
- uavinf.uavtype = 0;
- uavinf.abnormal_outage_flag = 0;
-
- uavinf.reset_reason = 0;
- WriteFlashNBtye( FLASH_UAV_IFO, ( uint8_t * )&uavinf, sizeof( uavinf ) );
- }
- reset_reason_temp = uavinf.reset_reason;
- if(uavinf.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 read_flash_function
- * @brief 读flash功能
- * @param none
- * @details
- * @author Zhang Sir
- **/
- int write_flash_time = 0;
- void read_flash_function(void)
- {
- if(HAL_GetTick() - write_flash_time < 500)
- {
- return;
- }
- if(read_serial_information == true)
- {
- ReadFlashNBtye( FLASH_SERIAL_IFO, ( uint8_t * )&serial, sizeof( serial ) );
- Int2String(serial.num,dev_pmu.sn,9);
- read_serial_information = false;
- }
- if(read_vol_information == true)
- {
- ReadFlashNBtye( FLASH_VOL_IFO, ( uint8_t * )&volinf, sizeof( volinf ) );
- read_vol_information = false;
- }
- if(read_uav_information == true)
- {
- ReadFlashNBtye( FLASH_UAV_IFO, ( uint8_t * )&uavinf, sizeof( uavinf ) );
- read_uav_information = false;
- }
- }
- /**
- * @file write_flash_function
- * @brief 把参数写入内存
- * @param none
- * @details
- * @author Zhang Sir
- **/
- void write_flash_function(void)
- {
- if(write_serial_information == true)
- {
- serial.num = set_pmu_serail;
- if(HAL_OK == WriteFlashNBtye( FLASH_SERIAL_IFO, ( uint8_t * )&serial, sizeof( serial ) ))
- {
- write_flash_time = HAL_GetTick();
- read_serial_information = true;
- write_serial_information = false;
- }
- }
- if(write_vol_information == true)
- {
- volinf.cal_vol = check_flash_par_normal(set_cali_voltage,-50,50,0);
- if(HAL_OK == WriteFlashNBtye(FLASH_VOL_IFO, (uint8_t *)&volinf, sizeof(volinf)))
- {
- write_flash_time = HAL_GetTick();
- read_vol_information = true;
- write_vol_information = false;
- }
- }
- if(write_uav_information == true)
- {
- if(planep.UAV_type != uavinf.uavtype || uavinf.abnormal_outage_flag != 0 || uavinf.reset_reason != reset_reason_temp)
- {
- uavinf.uavtype = check_flash_par_normal(planep.UAV_type,0,50,0);
- reset_reason_temp = uavinf.reset_reason;
- if(HAL_OK == WriteFlashNBtye(FLASH_UAV_IFO, (uint8_t *)&uavinf, sizeof(uavinf)))
- {
- write_flash_time = HAL_GetTick();
- read_uav_information = true;
- write_uav_information = false;
- }
- }
- }
- }
|