#include "bsp.h" #include "includes.h" device_public_info_t device_public_info; device_mcu_info_t device_mcu_info; MqttIdPort mqttidport; uint32_t Reset_cnt = 0; void RCC_Configuration(void) { //使能备份寄存器 /* enable PMU and BKPI clocks */ rcu_periph_clock_enable(RCU_BKPI); rcu_periph_clock_enable(RCU_PMU); /* allow access to BKP domain */ pmu_backup_write_enable(); } //函数功能:设置看门狗复位周期为4.8秒 void IWDG_Config(void) { rcu_osci_on(RCU_IRC40K);//启动"内部40KHz振荡器" while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K)) {//等待"内部40KHz振荡器稳定" } fwdgt_write_enable();//允许访问FWDGT_RLD(看门狗重装载寄存器)和FWDGT_PSC(看门狗预分频器寄存器) fwdgt_config((3000-1), FWDGT_PSC_DIV64); //设置IWDG重装载值为2999,重装载寄存器IWDG_RLR有12位值,设置IWDG预分频值为64 //独立看门狗的分频器输出周期为:64/40KHz=1.6ms //独立看门狗的复位周期为:3000*64/40KHz=4800ms fwdgt_counter_reload(); //喂狗,按照IWDG重装载寄存器FWDGT_RLR的值重装载IWDG计数器 fwdgt_enable(); //使能IWDG } //读取eeprom中的设备产测信息 void device_info_get(void) { uint8_t read[64]; memset(&device_public_info,0,sizeof(device_public_info_t)); AT24CXX_Read(DEVICE_PUBLIC_INFO_ADDR,read,sizeof(device_public_info_t)*2); //解码 HM_decode(read,(uint8_t *)&device_public_info,sizeof(device_public_info_t)*2); } //eeprom上电初始化处理 void eeprom_init_handle(void) { AT24CXX_Read(DEVICE_PUBLIC_INFO_ADDR,(uint8_t *)&device_public_info,sizeof(device_public_info_t)); AT24CXX_Read(DEVICE_VERSION_INFO_ADDR,(uint8_t *)&device_mcu_info,sizeof(device_mcu_info_t)); AT24CXX_Read(DEVICE_RESET_ADDR,(uint8_t *)&Reset_cnt,4); } extern uint8_t updata_flag; //更新eeprom信息 void eeprom_info_updata(void) { Reset_cnt++; AT24CXX_Write(DEVICE_RESET_ADDR,(uint8_t *)&Reset_cnt,4); //如果bt版本不对,写bt版本 if(device_mcu_info.bootloader_ver != SOFTWARE_VERSION_BOOT) { device_mcu_info.bootloader_ver = SOFTWARE_VERSION_BOOT; AT24CXX_Write(DEVICE_VERSION_INFO_ADDR,(uint8_t *)&device_mcu_info.bootloader_ver,4); } //如果执行过升级或回退,写app1、2、3版本 if(updata_flag) { updata_flag = 0; // HM_encode((uint8_t *)&device_mcu_info.app1_ver,code_buf,12); AT24CXX_Write(DEVICE_VERSION_INFO_ADDR+4,(uint8_t *)&device_mcu_info.pt_ver,12); } } //设置标记高位取反 //将一个数设置为高八位是第八位的取反 uint16_t set_flag_not(uint16_t data) { uint16_t temp_data,ret_data = 0; uint16_t temp_h,temp_l; temp_data = data; temp_h = ((~temp_data)<<8)&0xff00; temp_l = temp_data&0x00ff; ret_data = temp_h | temp_l; return ret_data; } //标记高位取反判断 uint8_t flag_not_cmp(uint16_t data) { uint8_t ret = 0; uint16_t temp_data; uint8_t temp_h,temp_l; temp_data = data; temp_h = (uint8_t)((temp_data&0xff00)>>8); temp_l = (uint8_t)(temp_data&0x00ff); if((temp_h^temp_l) == 0xff) { ret = 1; } return ret; } /* 对app进行校验 参数:addr:app首地址 len: app长度 checkdata:计算的crc值 返回:0:校验正确,1:校验失败 */ uint8_t app_check(uint32_t addr, uint32_t len, uint32_t *checkdata) { uint8_t ret = 0; uint32_t datalen,read_crc,get_crc; datalen = Flash_DatalenRead(addr,len); read_crc = *(uint32_t*)(addr + datalen-4); //CRC校验 rcu_periph_clock_enable(RCU_CRC);//打开crc时钟 crc_data_register_reset();//复位crc数据寄存器 get_crc = crc_block_data_calculate((uint32_t*)addr,(datalen -4)/4);//计算crc数值 rcu_periph_clock_disable(RCU_CRC);//关闭crc时钟 *checkdata = get_crc; if(read_crc != get_crc) { ret = 1; } return ret; }