bsp.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "bsp.h"
  2. #include "includes.h"
  3. device_public_info_t device_public_info;
  4. device_mcu_info_t device_mcu_info;
  5. MqttIdPort mqttidport;
  6. uint32_t Reset_cnt = 0;
  7. void RCC_Configuration(void)
  8. {
  9. //使能备份寄存器
  10. /* enable PMU and BKPI clocks */
  11. rcu_periph_clock_enable(RCU_BKPI);
  12. rcu_periph_clock_enable(RCU_PMU);
  13. /* allow access to BKP domain */
  14. pmu_backup_write_enable();
  15. }
  16. //函数功能:设置看门狗复位周期为4.8秒
  17. void IWDG_Config(void)
  18. {
  19. rcu_osci_on(RCU_IRC40K);//启动"内部40KHz振荡器"
  20. while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K))
  21. {//等待"内部40KHz振荡器稳定"
  22. }
  23. fwdgt_write_enable();//允许访问FWDGT_RLD(看门狗重装载寄存器)和FWDGT_PSC(看门狗预分频器寄存器)
  24. fwdgt_config((3000-1), FWDGT_PSC_DIV64);
  25. //设置IWDG重装载值为2999,重装载寄存器IWDG_RLR有12位值,设置IWDG预分频值为64
  26. //独立看门狗的分频器输出周期为:64/40KHz=1.6ms
  27. //独立看门狗的复位周期为:3000*64/40KHz=4800ms
  28. fwdgt_counter_reload(); //喂狗,按照IWDG重装载寄存器FWDGT_RLR的值重装载IWDG计数器
  29. fwdgt_enable(); //使能IWDG
  30. }
  31. //读取eeprom中的设备产测信息
  32. void device_info_get(void)
  33. {
  34. uint8_t read[64];
  35. memset(&device_public_info,0,sizeof(device_public_info_t));
  36. AT24CXX_Read(DEVICE_PUBLIC_INFO_ADDR,read,sizeof(device_public_info_t)*2);
  37. //解码
  38. HM_decode(read,(uint8_t *)&device_public_info,sizeof(device_public_info_t)*2);
  39. }
  40. //eeprom上电初始化处理
  41. void eeprom_init_handle(void)
  42. {
  43. AT24CXX_Read(DEVICE_PUBLIC_INFO_ADDR,(uint8_t *)&device_public_info,sizeof(device_public_info_t));
  44. AT24CXX_Read(DEVICE_VERSION_INFO_ADDR,(uint8_t *)&device_mcu_info,sizeof(device_mcu_info_t));
  45. AT24CXX_Read(DEVICE_RESET_ADDR,(uint8_t *)&Reset_cnt,4);
  46. }
  47. extern uint8_t updata_flag;
  48. //更新eeprom信息
  49. void eeprom_info_updata(void)
  50. {
  51. Reset_cnt++;
  52. AT24CXX_Write(DEVICE_RESET_ADDR,(uint8_t *)&Reset_cnt,4);
  53. //如果bt版本不对,写bt版本
  54. if(device_mcu_info.bootloader_ver != SOFTWARE_VERSION_BOOT)
  55. {
  56. device_mcu_info.bootloader_ver = SOFTWARE_VERSION_BOOT;
  57. AT24CXX_Write(DEVICE_VERSION_INFO_ADDR,(uint8_t *)&device_mcu_info.bootloader_ver,4);
  58. }
  59. //如果执行过升级或回退,写app1、2、3版本
  60. if(updata_flag)
  61. {
  62. updata_flag = 0;
  63. // HM_encode((uint8_t *)&device_mcu_info.app1_ver,code_buf,12);
  64. AT24CXX_Write(DEVICE_VERSION_INFO_ADDR+4,(uint8_t *)&device_mcu_info.pt_ver,12);
  65. }
  66. }
  67. //设置标记高位取反
  68. //将一个数设置为高八位是第八位的取反
  69. uint16_t set_flag_not(uint16_t data)
  70. {
  71. uint16_t temp_data,ret_data = 0;
  72. uint16_t temp_h,temp_l;
  73. temp_data = data;
  74. temp_h = ((~temp_data)<<8)&0xff00;
  75. temp_l = temp_data&0x00ff;
  76. ret_data = temp_h | temp_l;
  77. return ret_data;
  78. }
  79. //标记高位取反判断
  80. uint8_t flag_not_cmp(uint16_t data)
  81. {
  82. uint8_t ret = 0;
  83. uint16_t temp_data;
  84. uint8_t temp_h,temp_l;
  85. temp_data = data;
  86. temp_h = (uint8_t)((temp_data&0xff00)>>8);
  87. temp_l = (uint8_t)(temp_data&0x00ff);
  88. if((temp_h^temp_l) == 0xff)
  89. {
  90. ret = 1;
  91. }
  92. return ret;
  93. }
  94. /*
  95. 对app进行校验
  96. 参数:addr:app首地址
  97. len: app长度
  98. checkdata:计算的crc值
  99. 返回:0:校验正确,1:校验失败
  100. */
  101. uint8_t app_check(uint32_t addr, uint32_t len, uint32_t *checkdata)
  102. {
  103. uint8_t ret = 0;
  104. uint32_t datalen,read_crc,get_crc;
  105. datalen = Flash_DatalenRead(addr,len);
  106. read_crc = *(uint32_t*)(addr + datalen-4); //CRC校验
  107. rcu_periph_clock_enable(RCU_CRC);//打开crc时钟
  108. crc_data_register_reset();//复位crc数据寄存器
  109. get_crc = crc_block_data_calculate((uint32_t*)addr,(datalen -4)/4);//计算crc数值
  110. rcu_periph_clock_disable(RCU_CRC);//关闭crc时钟
  111. *checkdata = get_crc;
  112. if(read_crc != get_crc)
  113. {
  114. ret = 1;
  115. }
  116. return ret;
  117. }