| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #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;
- }
|