#include "McuTaskFlash.h" #include "McuTaskBlueTooth.h" #include "ZthyToolDataTypeSwitch.h" #include "McuW25Q64JvssiqDrv.h" #include "McuBspRtc.h" #include "McuBspSpi.h" #include "McuTaskLowPower.h" #include "BeiDouHtyDrv.h" #include #define MCU_TASK_FLASH_SEND_BUFLEN 80 /* 程序1的保存地址 */ #define MCU_TASK_PROGRAM1_START_ADDR 0x000000 #define MCU_TASK_PROGRAM1_END_ADDR 0x07ffff #define MCU_TASK_PROGRAM1_MAX 0x080000 /* 程序2的保存地址 */ #define MCU_TASK_PROGRAM2_START_ADDR 0x080000 #define MCU_TASK_PROGRAM2_END_ADDR 0x0fffff #define MCU_TASK_PROGRAM2_MAX 0x080000 /* 位置传感器数据保存地址 */ #define MCU_TASK_POSITION_START_ADDR 0x100000 #define MCU_TASK_POSITION_END_ADDR 0x127fff #define MCU_TASK_POSITION_MAX 0x28000 #define MCU_TASK_POSITION_MAXCOUNT 10240 #define MCU_TASK_POSITION_SEND_COUNT_MAX (MCU_TASK_POSITION_MAX / MCU_TASK_FLASH_SEND_BUFLEN) /* 姿态传感器数据保存地址 */ #define MCU_TASK_IMU_START_ADDR 0x128000 #define MCU_TASK_IMU_END_ADDR 0x195fff #define MCU_TASK_IMU_MAX 0x06e000 #define MCU_TASK_IMU_MAXCOUNT 10240 #define MCU_TASK_IMU_SEND_COUNT_MAX (MCU_TASK_IMU_MAX / MCU_TASK_FLASH_SEND_BUFLEN) /* 多参数传感器数据保存地址 */ #define MCU_TASK_MANY_PARA_START_ADDR 0x196000 #define MCU_TASK_MANY_PARA_END_ADDR 0x1E5fff #define MCU_TASK_MANY_PARA_MAX 0x050000 #define MCU_TASK_MANY_PARA_MAXCOUNT 10240 #define MCU_TASK_MANY_PARA_SEND_COUNT_MAX (MCU_TASK_MANY_PARA_MAX / MCU_TASK_FLASH_SEND_BUFLEN) /* 内部环境参数数据保存地址 */ #define MCU_TASK_IN_PARA_START_ADDR 0x1E6000 #define MCU_TASK_IN_PARA_END_ADDR 0x22Bfff #define MCU_TASK_IN_PARA_MAX 0x046000 #define MCU_TASK_IN_PARA_MAXCOUNT 10240 #define MCU_TASK_IN_PARA_SEND_COUNT_MAX (MCU_TASK_IN_PARA_MAX / MCU_TASK_FLASH_SEND_BUFLEN) /* 程序配置保存地址 */ #define MCU_TASK_CONF_START_ADDR 0x22C000 #define MCU_TASK_CONF_END_ADDR 0x2fffff #define MCU_TASK_CONF_MAX 0x0D4000 /* 操作记录保存地址 */ #define MCU_TASK_OPERATION_START_ADDR 0x300000 #define MCU_TASK_OPERATION_END_ADDR 0x7fffff #define MCU_TASK_OPERATION_MAX 0x500000 #define MCU_TASK_OPERATION_BUF_MAXLEN 64 // 每条操作记录的最大值 #define MCU_TASK_OPERATION_BUF_MAXCOUNT 81920 // 最大条数 #define MCU_TASK_OPERATION_SEND_COUNT_MAX (MCU_TASK_OPERATION_MAX / MCU_TASK_FLASH_SEND_BUFLEN) /* 关于升级的部分定义 */ #define MCU_TASK_FLASH_UPDATTE_FLAG_ADDRESS 0x222000 // 升级标志位存储空间 #define MCU_TASK_FLASH_UPDATTE_SIZE_ADDRESS 0x222004 // 升级文件大小存储空间 static uint32_t gMcuTaskFlashUpdateProgramFlag = 0; // 升级标志位 static uint64_t gMcuTaskFlashUpdateProgramSize = 0; // 升级文件大小 static uint32_t gMcuTaskFlashUpdateLocalCount = 0; /* 关于位置传感器的存储 */ #define MCU_TASK_POSITION_COUNT_SAVE_ADDRESS 0x22C000 // 存储位置传感器数据存储的位置 /* 关于姿态传感器的存储 */ #define MCU_TASK_IMU_COUNT_SAVE_ADDRESS 0x22D000 // 存储姿态传感器数据存储的位置 /* 关于内部数据的存储 */ #define MCU_TASK_INPARA_COUNT_SAVE_ADDRESS 0x22E000 // 存储内部传感器数据存储的位置 /* 关于多参数数据的存储 */ #define MCU_TASK_MANYPARA_COUNT_SAVE_ADDRESS 0x22F000 // 存储多参数传感器数据存储的位置 /* 关于操作记录的存储 */ #define MCU_TASK_OPERATION_COUNT_SAVE_ADDRESS 0x230000 // 存储操作记录数据存储的位置 /* 关于自毁模式的状态存储 */ #define MCU_TASK_SELF_DESTRUCTION_MODE_STATUS_SAVE_ADDRESS 0x231000 // 存储自毁模式的状态存储 /* 关乎北斗重发次数的存储 */ #define MCU_TASK_BEIDOU_RETRY_COUNT_SAVE_ADDRESS 0x232000 // 存储北斗重发的次数的状态存储 /* 关于睡眠唤醒的周期模式的存储地址 */ #define MCU_TASK_LOWERPOWER_WAKEUP_PERIOD_SAVE_ADDRESS 0x233000 // 存储睡眠唤醒周期的存储 /*************************************************************************/ static W25Q64JVSSIQ_OBJ gFlashObj = {0}; static MCU_BSP_CLOCK gClock = {0}; static unsigned int gMcuTaskFlashPositionCount = 0; static unsigned int gMcuTaskFlashImuCount = 0; static unsigned int gMcuTaskFlashManyParaCount = 0; static unsigned int gMcuTaskFlashInParaCount = 0; static unsigned int gMcuTaskFlashOptCount = 0; static unsigned int gMcuTaskFlashPositionReadCount = 0; static unsigned int gMcuTaskFlashImuReadCount = 0; static unsigned int gMcuTaskFlashManyParaReadCount = 0; static unsigned int gMcuTaskFlashInParaReadCount = 0; static unsigned int gMcuTaskFlashOptReadCount = 0; static unsigned char gMcuTaskFlashAsk = 0; // 用于判断需要获取那个数据 static unsigned short gMcuTaskFlashSerial = 0; static unsigned char gMcuTaskFlashPosition[16] = {0}; static unsigned char gMcuTaskFlashImu[44] = {0}; static unsigned char gMcuTaskFlashManyPara[32] = {0}; static unsigned char gMcuTaskFlashInPara[28] = {0}; static unsigned char gMcuTaskFlashOpt[64] = {0}; static unsigned char gMcuTaskFlashSendBuf[MCU_TASK_FLASH_SEND_BUFLEN + 5] = {0}; static unsigned char gMcuTaskFlashSendFlag = 0; static void McuTaskFlashSpiCs(uint8_t flag); static unsigned char McuTaskFlashReadWrite(uint8_t Data); static void McuTaskFlashDelayUs(uint32_t period); /* 初始化FLASH */ int McuTaskFlashInit(void) { int rt; McuBspSpiInit(MCU_BSP_SPI3_ID); gFlashObj.SpiCs = McuTaskFlashSpiCs; gFlashObj.SpiWriteReadByte = McuTaskFlashReadWrite; gFlashObj.DelayUs = McuTaskFlashDelayUs; rt = W25Q64_Init(&gFlashObj); if (rt < 0) { return -1; } /* 获取FLASH */ W25Q64_ReadBytes(&gFlashObj, MCU_TASK_POSITION_COUNT_SAVE_ADDRESS, (uint8_t *)(&gMcuTaskFlashPositionCount), sizeof(gMcuTaskFlashPositionCount)); W25Q64_ReadBytes(&gFlashObj, MCU_TASK_IMU_COUNT_SAVE_ADDRESS, (uint8_t *)(&gMcuTaskFlashImuCount), sizeof(gMcuTaskFlashImuCount)); W25Q64_ReadBytes(&gFlashObj, MCU_TASK_MANYPARA_COUNT_SAVE_ADDRESS, (uint8_t *)(&gMcuTaskFlashManyParaCount), sizeof(gMcuTaskFlashManyParaCount)); W25Q64_ReadBytes(&gFlashObj, MCU_TASK_INPARA_COUNT_SAVE_ADDRESS, (uint8_t *)(&gMcuTaskFlashInParaCount), sizeof(gMcuTaskFlashInParaCount)); W25Q64_ReadBytes(&gFlashObj, MCU_TASK_OPERATION_COUNT_SAVE_ADDRESS, (uint8_t *)(&gMcuTaskFlashOptCount), sizeof(gMcuTaskFlashOptCount)); if (gMcuTaskFlashPositionCount >= MCU_TASK_POSITION_SEND_COUNT_MAX) { gMcuTaskFlashPositionCount = 0; } if (gMcuTaskFlashImuCount >= MCU_TASK_IMU_SEND_COUNT_MAX) { gMcuTaskFlashImuCount = 0; } if (gMcuTaskFlashManyParaCount >= MCU_TASK_MANY_PARA_SEND_COUNT_MAX) { gMcuTaskFlashManyParaCount = 0; } if (gMcuTaskFlashInParaCount >= MCU_TASK_IN_PARA_SEND_COUNT_MAX) { gMcuTaskFlashInParaCount = 0; } if (gMcuTaskFlashOptCount >= MCU_TASK_OPERATION_SEND_COUNT_MAX) { gMcuTaskFlashOptCount = 0; } /* 设置北斗重发次数 */ rt = McuTaskFlashGetBeiDouRetryTime(); McuDrvBeiDouHtySetRetryCount((uint8_t)rt); /* 设置低功耗唤醒周期 */ rt = McuTaskFlashGetWakeUpPeriod(); McuTaskLowPowerSetPeriod(rt); return 0; } /* 文件传输任务 */ int McuTaskFlash(void *arg) { if (gMcuTaskFlashSendFlag == 1) { gMcuTaskFlashSendFlag = 0; switch (gMcuTaskFlashAsk) { case 1: W25Q64_ReadBytes(&gFlashObj, MCU_TASK_POSITION_START_ADDR + gMcuTaskFlashPositionReadCount * MCU_TASK_FLASH_SEND_BUFLEN, &gMcuTaskFlashSendBuf[5], MCU_TASK_FLASH_SEND_BUFLEN); gMcuTaskFlashSendBuf[0] = MCU_TASK_FLASH_POSITION; gMcuTaskFlashSendBuf[1] = (uint8_t)((MCU_TASK_POSITION_SEND_COUNT_MAX & 0xff00) >> 8); gMcuTaskFlashSendBuf[2] = (uint8_t)(MCU_TASK_POSITION_SEND_COUNT_MAX & 0x00ff); gMcuTaskFlashSendBuf[3] = (((gMcuTaskFlashPositionReadCount + 1) & 0xff00) >> 8); gMcuTaskFlashSendBuf[4] = (uint8_t)((gMcuTaskFlashPositionReadCount + 1) & 0x00ff); /* 进行发送数据 */ TaskBlueToothSendMessage(MCU_TASK_FLASH_SEND_MESSAGE_ID, &gMcuTaskFlashSerial, gMcuTaskFlashSendBuf, sizeof(gMcuTaskFlashSendBuf)); gMcuTaskFlashPositionReadCount++; if (gMcuTaskFlashPositionReadCount >= MCU_TASK_POSITION_SEND_COUNT_MAX) { gMcuTaskFlashPositionReadCount = 0; gMcuTaskFlashAsk = 0; } break; case 2: W25Q64_ReadBytes(&gFlashObj, MCU_TASK_IMU_START_ADDR + gMcuTaskFlashImuReadCount * MCU_TASK_FLASH_SEND_BUFLEN, &gMcuTaskFlashSendBuf[5], MCU_TASK_FLASH_SEND_BUFLEN); gMcuTaskFlashSendBuf[0] = MCU_TASK_FLASH_IMU; gMcuTaskFlashSendBuf[1] = (uint8_t)((MCU_TASK_IMU_SEND_COUNT_MAX & 0xff00) >> 8); gMcuTaskFlashSendBuf[2] = (uint8_t)(MCU_TASK_IMU_SEND_COUNT_MAX & 0x00ff); gMcuTaskFlashSendBuf[3] = (((gMcuTaskFlashImuReadCount + 1) & 0xff00) >> 8); gMcuTaskFlashSendBuf[4] = (uint8_t)((gMcuTaskFlashImuReadCount + 1) & 0x00ff); /* 进行发送数据 */ TaskBlueToothSendMessage(MCU_TASK_FLASH_SEND_MESSAGE_ID, &gMcuTaskFlashSerial, gMcuTaskFlashSendBuf, sizeof(gMcuTaskFlashSendBuf)); gMcuTaskFlashImuReadCount++; if (gMcuTaskFlashImuReadCount >= MCU_TASK_IMU_SEND_COUNT_MAX) { gMcuTaskFlashImuReadCount = 0; gMcuTaskFlashAsk = 0; } break; case 3: W25Q64_ReadBytes(&gFlashObj, MCU_TASK_MANY_PARA_START_ADDR + gMcuTaskFlashManyParaReadCount * MCU_TASK_FLASH_SEND_BUFLEN, &gMcuTaskFlashSendBuf[5], MCU_TASK_FLASH_SEND_BUFLEN); gMcuTaskFlashSendBuf[0] = MCU_TASK_FLASH_MANYPARA; gMcuTaskFlashSendBuf[1] = (uint8_t)((MCU_TASK_MANY_PARA_SEND_COUNT_MAX & 0xff00) >> 8); gMcuTaskFlashSendBuf[2] = (uint8_t)(MCU_TASK_MANY_PARA_SEND_COUNT_MAX & 0x00ff); gMcuTaskFlashSendBuf[3] = (((gMcuTaskFlashManyParaReadCount + 1) & 0xff00) >> 8); gMcuTaskFlashSendBuf[4] = (uint8_t)((gMcuTaskFlashManyParaReadCount + 1) & 0x00ff); /* 进行发送数据 */ TaskBlueToothSendMessage(MCU_TASK_FLASH_SEND_MESSAGE_ID, &gMcuTaskFlashSerial, gMcuTaskFlashSendBuf, sizeof(gMcuTaskFlashSendBuf)); gMcuTaskFlashManyParaReadCount++; if (gMcuTaskFlashManyParaReadCount >= MCU_TASK_MANY_PARA_SEND_COUNT_MAX) { gMcuTaskFlashManyParaReadCount = 0; gMcuTaskFlashAsk = 0; } break; case 4: W25Q64_ReadBytes(&gFlashObj, MCU_TASK_IN_PARA_START_ADDR + gMcuTaskFlashInParaReadCount * MCU_TASK_FLASH_SEND_BUFLEN, &gMcuTaskFlashSendBuf[5], MCU_TASK_FLASH_SEND_BUFLEN); gMcuTaskFlashSendBuf[0] = MCU_TASK_FLASH_INPARA; gMcuTaskFlashSendBuf[1] = (uint8_t)((MCU_TASK_IN_PARA_SEND_COUNT_MAX & 0xff00) >> 8); gMcuTaskFlashSendBuf[2] = (uint8_t)(MCU_TASK_IN_PARA_SEND_COUNT_MAX & 0x00ff); gMcuTaskFlashSendBuf[3] = (((gMcuTaskFlashInParaReadCount + 1) & 0xff00) >> 8); gMcuTaskFlashSendBuf[4] = (uint8_t)((gMcuTaskFlashInParaReadCount + 1) & 0x00ff); /* 进行发送数据 */ TaskBlueToothSendMessage(MCU_TASK_FLASH_SEND_MESSAGE_ID, &gMcuTaskFlashSerial, gMcuTaskFlashSendBuf, sizeof(gMcuTaskFlashSendBuf)); gMcuTaskFlashInParaReadCount++; if (gMcuTaskFlashInParaReadCount >= MCU_TASK_IN_PARA_SEND_COUNT_MAX) { gMcuTaskFlashInParaReadCount = 0; gMcuTaskFlashAsk = 0; } break; case 5: W25Q64_ReadBytes(&gFlashObj, MCU_TASK_OPERATION_START_ADDR + gMcuTaskFlashOptReadCount * MCU_TASK_FLASH_SEND_BUFLEN, &gMcuTaskFlashSendBuf[5], MCU_TASK_FLASH_SEND_BUFLEN); gMcuTaskFlashSendBuf[0] = MCU_TASK_FLASH_OPT; gMcuTaskFlashSendBuf[1] = (uint8_t)((MCU_TASK_OPERATION_SEND_COUNT_MAX & 0xff00) >> 8); gMcuTaskFlashSendBuf[2] = (uint8_t)(MCU_TASK_OPERATION_SEND_COUNT_MAX & 0x00ff); gMcuTaskFlashSendBuf[3] = (((gMcuTaskFlashOptReadCount + 1) & 0xff00) >> 8); gMcuTaskFlashSendBuf[4] = (uint8_t)((gMcuTaskFlashOptReadCount + 1) & 0x00ff); /* 进行发送数据 */ TaskBlueToothSendMessage(MCU_TASK_FLASH_SEND_MESSAGE_ID, &gMcuTaskFlashSerial, gMcuTaskFlashSendBuf, sizeof(gMcuTaskFlashSendBuf)); gMcuTaskFlashOptReadCount++; if (gMcuTaskFlashOptReadCount >= MCU_TASK_OPERATION_SEND_COUNT_MAX) { gMcuTaskFlashOptReadCount = 0; gMcuTaskFlashAsk = 0; } break; default: break; } } else { return -1; } return 0; } /* 回复确认 */ int McuTaskFlashAckOk(uint16_t Serial) { if (gMcuTaskFlashSerial == Serial) { gMcuTaskFlashSerial++; gMcuTaskFlashSendFlag = 1; return 0; } return -1; } /* 清除 */ void McuTaskFlashClearAsk(void) { gMcuTaskFlashAsk = 0; gMcuTaskFlashPositionReadCount = 0; gMcuTaskFlashImuReadCount = 0; gMcuTaskFlashManyParaReadCount = 0; gMcuTaskFlashInParaReadCount = 0; gMcuTaskFlashOptReadCount = 0; } /* 确认发送是否被置位 */ unsigned char McuTaskFlashGetSendFlag(void) { return gMcuTaskFlashSendFlag; } /* 写入远程升级程序 */ int McuTaskFlashUpdateProgram(uint32_t LocalCount, uint32_t AllCount, uint8_t *buf, uint16_t BufLen) { uint32_t flag = 1; if (buf == NULL || BufLen == 0 || BufLen > 80 || gMcuTaskFlashUpdateProgramFlag != 1) { return -1; } if ((gMcuTaskFlashUpdateLocalCount + 1) == LocalCount) { W25Q64_WriteBytes(&gFlashObj, MCU_TASK_PROGRAM1_START_ADDR + (gMcuTaskFlashUpdateLocalCount * 80), buf, BufLen); gMcuTaskFlashUpdateLocalCount++; gMcuTaskFlashUpdateProgramSize += BufLen; } else { gMcuTaskFlashUpdateLocalCount = 0; gMcuTaskFlashUpdateProgramSize = 0; return -1; } if (gMcuTaskFlashUpdateLocalCount == AllCount) { W25Q64_WriteBytes(&gFlashObj, MCU_TASK_FLASH_UPDATTE_FLAG_ADDRESS, (uint8_t *)(&flag), 4); W25Q64_WriteBytes(&gFlashObj, MCU_TASK_FLASH_UPDATTE_FLAG_ADDRESS, (uint8_t *)(&gMcuTaskFlashUpdateProgramSize), 8); gMcuTaskFlashUpdateLocalCount = 0; gMcuTaskFlashUpdateProgramSize = 0; } else if (gMcuTaskFlashUpdateLocalCount > AllCount) { gMcuTaskFlashUpdateLocalCount = 0; gMcuTaskFlashUpdateProgramSize = 0; return -1; } return 0; } /* 请求远程升级指令 */ void McuTaskFlashAskUpdate(unsigned char Ask) { if (Ask > 0) { gMcuTaskFlashUpdateProgramFlag = 1; } } /* 请求Flash数据标志位 */ int McuTaskFlashSetAsk(unsigned char Ask) { if (gMcuTaskFlashAsk == 0) { gMcuTaskFlashAsk = Ask; if (Ask != 0) { gMcuTaskFlashSendFlag = 1; } return 0; } return -1; } /* 获取Flash数据标志位 */ unsigned char McuTaskFlashGetAsk(void) { return gMcuTaskFlashAsk; } /* 位置传感器数据写入 */ int McuTaskFlashWritePosition(float Lat, float Lon) { uint64_t Time; uint32_t Lat32; uint32_t Lon32; McuBspRtcGetTime(&gClock); Time = gClock.Year * 10000000000 + gClock.Month * 100000000 + gClock.Date * 1000000 + gClock.Hours * 10000 + gClock.Minutes * 100 + gClock.Seconds; ZthyToolFloatToUint32(Lat, &Lat32); ZthyToolFloatToUint32(Lon, &Lon32); gMcuTaskFlashPosition[0] = (Time >> 56) & 0xff; gMcuTaskFlashPosition[1] = (Time >> 48) & 0xff; gMcuTaskFlashPosition[2] = (Time >> 40) & 0xff; gMcuTaskFlashPosition[3] = (Time >> 32) & 0xff; gMcuTaskFlashPosition[4] = (Time >> 24) & 0xff; gMcuTaskFlashPosition[5] = (Time >> 16) & 0xff; gMcuTaskFlashPosition[6] = (Time >> 8) & 0xff; gMcuTaskFlashPosition[7] = Time & 0xff; gMcuTaskFlashPosition[8] = (Lat32 >> 24) & 0xff; gMcuTaskFlashPosition[9] = (Lat32 >> 16) & 0xff; gMcuTaskFlashPosition[10] = (Lat32 >> 8) & 0xff; gMcuTaskFlashPosition[11] = Lat32 & 0xff; gMcuTaskFlashPosition[12] = (Lon32 >> 24) & 0xff; gMcuTaskFlashPosition[13] = (Lon32 >> 16) & 0xff; gMcuTaskFlashPosition[14] = (Lon32 >> 8) & 0xff; gMcuTaskFlashPosition[15] = Lon32 & 0xff; W25Q64_WriteBytes(&gFlashObj, MCU_TASK_POSITION_START_ADDR + gMcuTaskFlashPositionCount * 16, gMcuTaskFlashPosition, sizeof(gMcuTaskFlashPosition)); gMcuTaskFlashPositionCount++; gMcuTaskFlashPositionCount = gMcuTaskFlashPositionCount % MCU_TASK_POSITION_MAXCOUNT; W25Q64_WriteBytes(&gFlashObj, MCU_TASK_POSITION_COUNT_SAVE_ADDRESS, (uint8_t *)(&gMcuTaskFlashPositionCount), sizeof(gMcuTaskFlashPositionCount)); return 0; } /* 姿态传感器数据写入 */ int McuTaskFlashWriteImu(float Ax, float Ay, float Az, float Wx, float Wy, float Wz, float Roll, float Pitch, float Yaw) { uint64_t Time; uint32_t Ax32; uint32_t Ay32; uint32_t Az32; uint32_t Wx32; uint32_t Wy32; uint32_t Wz32; uint32_t Roll32; uint32_t Pitch32; uint32_t Yaw32; McuBspRtcGetTime(&gClock); Time = gClock.Year * 10000000000 + gClock.Month * 100000000 + gClock.Date * 1000000 + gClock.Hours * 10000 + gClock.Minutes * 100 + gClock.Seconds; ZthyToolFloatToUint32(Ax, &Ax32); ZthyToolFloatToUint32(Ay, &Ay32); ZthyToolFloatToUint32(Az, &Az32); ZthyToolFloatToUint32(Wx, &Wx32); ZthyToolFloatToUint32(Wy, &Wy32); ZthyToolFloatToUint32(Wz, &Wz32); ZthyToolFloatToUint32(Roll, &Roll32); ZthyToolFloatToUint32(Pitch, &Pitch32); ZthyToolFloatToUint32(Yaw, &Yaw32); gMcuTaskFlashImu[0] = (Time >> 56) & 0xff; gMcuTaskFlashImu[1] = (Time >> 48) & 0xff; gMcuTaskFlashImu[2] = (Time >> 40) & 0xff; gMcuTaskFlashImu[3] = (Time >> 32) & 0xff; gMcuTaskFlashImu[4] = (Time >> 24) & 0xff; gMcuTaskFlashImu[5] = (Time >> 16) & 0xff; gMcuTaskFlashImu[6] = (Time >> 8) & 0xff; gMcuTaskFlashImu[7] = Time & 0xff; gMcuTaskFlashImu[8] = (Ax32 >> 24) & 0xff; gMcuTaskFlashImu[9] = (Ax32 >> 16) & 0xff; gMcuTaskFlashImu[10] = (Ax32 >> 8) & 0xff; gMcuTaskFlashImu[11] = Ax32 & 0xff; gMcuTaskFlashImu[12] = (Ay32 >> 24) & 0xff; gMcuTaskFlashImu[13] = (Ay32 >> 16) & 0xff; gMcuTaskFlashImu[14] = (Ay32 >> 8) & 0xff; gMcuTaskFlashImu[15] = Ay32 & 0xff; gMcuTaskFlashImu[16] = (Az32 >> 24) & 0xff; gMcuTaskFlashImu[17] = (Az32 >> 16) & 0xff; gMcuTaskFlashImu[18] = (Az32 >> 8) & 0xff; gMcuTaskFlashImu[19] = Az32 & 0xff; gMcuTaskFlashImu[20] = (Wx32 >> 24) & 0xff; gMcuTaskFlashImu[21] = (Wx32 >> 16) & 0xff; gMcuTaskFlashImu[22] = (Wx32 >> 8) & 0xff; gMcuTaskFlashImu[23] = Wx32 & 0xff; gMcuTaskFlashImu[24] = (Wy32 >> 24) & 0xff; gMcuTaskFlashImu[25] = (Wy32 >> 16) & 0xff; gMcuTaskFlashImu[26] = (Wy32 >> 8) & 0xff; gMcuTaskFlashImu[27] = Wy32 & 0xff; gMcuTaskFlashImu[28] = (Wz32 >> 24) & 0xff; gMcuTaskFlashImu[29] = (Wz32 >> 16) & 0xff; gMcuTaskFlashImu[30] = (Wz32 >> 8) & 0xff; gMcuTaskFlashImu[31] = Wz32 & 0xff; gMcuTaskFlashImu[32] = (Roll32 >> 24) & 0xff; gMcuTaskFlashImu[33] = (Roll32 >> 16) & 0xff; gMcuTaskFlashImu[34] = (Roll32 >> 8) & 0xff; gMcuTaskFlashImu[35] = Roll32 & 0xff; gMcuTaskFlashImu[36] = (Pitch32 >> 24) & 0xff; gMcuTaskFlashImu[37] = (Pitch32 >> 16) & 0xff; gMcuTaskFlashImu[38] = (Pitch32 >> 8) & 0xff; gMcuTaskFlashImu[39] = Pitch32 & 0xff; gMcuTaskFlashImu[40] = (Yaw32 >> 24) & 0xff; gMcuTaskFlashImu[41] = (Yaw32 >> 16) & 0xff; gMcuTaskFlashImu[42] = (Yaw32 >> 8) & 0xff; gMcuTaskFlashImu[43] = Yaw32 & 0xff; W25Q64_WriteBytes(&gFlashObj, MCU_TASK_IMU_START_ADDR + gMcuTaskFlashImuCount * 44, gMcuTaskFlashImu, sizeof(gMcuTaskFlashImu)); gMcuTaskFlashImuCount++; gMcuTaskFlashImuCount = gMcuTaskFlashImuCount % MCU_TASK_IMU_MAXCOUNT; W25Q64_WriteBytes(&gFlashObj, MCU_TASK_IMU_COUNT_SAVE_ADDRESS, (uint8_t *)(&gMcuTaskFlashImuCount), sizeof(gMcuTaskFlashImuCount)); return 0; } /* 多参数数据写入 */ int McuTaskFlashWriteManyPara(float Temp, float Ph, float Cond, float Do, float Oiw, float Nhn) { uint64_t Time; uint32_t Temp32; uint32_t Ph32; uint32_t Cond32; uint32_t Do32; uint32_t Oiw32; uint32_t Nhn32; McuBspRtcGetTime(&gClock); Time = gClock.Year * 10000000000 + gClock.Month * 100000000 + gClock.Date * 1000000 + gClock.Hours * 10000 + gClock.Minutes * 100 + gClock.Seconds; ZthyToolFloatToUint32(Temp, &Temp32); ZthyToolFloatToUint32(Ph, &Ph32); ZthyToolFloatToUint32(Cond, &Cond32); ZthyToolFloatToUint32(Do, &Do32); ZthyToolFloatToUint32(Oiw, &Oiw32); ZthyToolFloatToUint32(Nhn, &Nhn32); gMcuTaskFlashManyPara[0] = (Time >> 56) & 0xff; gMcuTaskFlashManyPara[1] = (Time >> 48) & 0xff; gMcuTaskFlashManyPara[2] = (Time >> 40) & 0xff; gMcuTaskFlashManyPara[3] = (Time >> 32) & 0xff; gMcuTaskFlashManyPara[4] = (Time >> 24) & 0xff; gMcuTaskFlashManyPara[5] = (Time >> 16) & 0xff; gMcuTaskFlashManyPara[6] = (Time >> 8) & 0xff; gMcuTaskFlashManyPara[7] = Time & 0xff; gMcuTaskFlashManyPara[8] = (Temp32 >> 24) & 0xff; gMcuTaskFlashManyPara[9] = (Temp32 >> 16) & 0xff; gMcuTaskFlashManyPara[10] = (Temp32 >> 8) & 0xff; gMcuTaskFlashManyPara[11] = Temp32 & 0xff; gMcuTaskFlashManyPara[12] = (Ph32 >> 24) & 0xff; gMcuTaskFlashManyPara[13] = (Ph32 >> 16) & 0xff; gMcuTaskFlashManyPara[14] = (Ph32 >> 8) & 0xff; gMcuTaskFlashManyPara[15] = Ph32 & 0xff; gMcuTaskFlashManyPara[16] = (Cond32 >> 24) & 0xff; gMcuTaskFlashManyPara[17] = (Cond32 >> 16) & 0xff; gMcuTaskFlashManyPara[18] = (Cond32 >> 8) & 0xff; gMcuTaskFlashManyPara[19] = Cond32 & 0xff; gMcuTaskFlashManyPara[20] = (Do32 >> 24) & 0xff; gMcuTaskFlashManyPara[21] = (Do32 >> 16) & 0xff; gMcuTaskFlashManyPara[22] = (Do32 >> 8) & 0xff; gMcuTaskFlashManyPara[23] = Do32 & 0xff; gMcuTaskFlashManyPara[24] = (Oiw32 >> 24) & 0xff; gMcuTaskFlashManyPara[25] = (Oiw32 >> 16) & 0xff; gMcuTaskFlashManyPara[26] = (Oiw32 >> 8) & 0xff; gMcuTaskFlashManyPara[27] = Oiw32 & 0xff; gMcuTaskFlashManyPara[28] = (Nhn32 >> 24) & 0xff; gMcuTaskFlashManyPara[29] = (Nhn32 >> 16) & 0xff; gMcuTaskFlashManyPara[30] = (Nhn32 >> 8) & 0xff; gMcuTaskFlashManyPara[31] = Nhn32 & 0xff; W25Q64_WriteBytes(&gFlashObj, MCU_TASK_MANY_PARA_START_ADDR + gMcuTaskFlashManyParaCount * 32, gMcuTaskFlashManyPara, sizeof(gMcuTaskFlashManyPara)); gMcuTaskFlashManyParaCount++; gMcuTaskFlashManyParaCount = gMcuTaskFlashManyParaCount % MCU_TASK_MANY_PARA_MAXCOUNT; W25Q64_WriteBytes(&gFlashObj, MCU_TASK_MANYPARA_COUNT_SAVE_ADDRESS, (uint8_t *)(&gMcuTaskFlashManyParaCount), sizeof(gMcuTaskFlashManyParaCount)); return 0; } /* 内部环境参数 */ int McuTaskFlashWriteInPara(float Temp, float Humi, float Press, float Battery, uint32_t SelfDestructionMode) { uint64_t Time; uint32_t Temp32; uint32_t Humi32; uint32_t Press32; uint32_t Battery32; McuBspRtcGetTime(&gClock); Time = gClock.Year * 10000000000 + gClock.Month * 100000000 + gClock.Date * 1000000 + gClock.Hours * 10000 + gClock.Minutes * 100 + gClock.Seconds; ZthyToolFloatToUint32(Temp, &Temp32); ZthyToolFloatToUint32(Humi, &Humi32); ZthyToolFloatToUint32(Press, &Press32); ZthyToolFloatToUint32(Battery, &Battery32); gMcuTaskFlashInPara[0] = (Time >> 56) & 0xff; gMcuTaskFlashInPara[1] = (Time >> 48) & 0xff; gMcuTaskFlashInPara[2] = (Time >> 40) & 0xff; gMcuTaskFlashInPara[3] = (Time >> 32) & 0xff; gMcuTaskFlashInPara[4] = (Time >> 24) & 0xff; gMcuTaskFlashInPara[5] = (Time >> 16) & 0xff; gMcuTaskFlashInPara[6] = (Time >> 8) & 0xff; gMcuTaskFlashInPara[7] = Time & 0xff; gMcuTaskFlashInPara[8] = (Temp32 >> 24) & 0xff; gMcuTaskFlashInPara[9] = (Temp32 >> 16) & 0xff; gMcuTaskFlashInPara[10] = (Temp32 >> 8) & 0xff; gMcuTaskFlashInPara[11] = Temp32 & 0xff; gMcuTaskFlashInPara[12] = (Humi32 >> 24) & 0xff; gMcuTaskFlashInPara[13] = (Humi32 >> 16) & 0xff; gMcuTaskFlashInPara[14] = (Humi32 >> 8) & 0xff; gMcuTaskFlashInPara[15] = Humi32 & 0xff; gMcuTaskFlashInPara[16] = (Press32 >> 24) & 0xff; gMcuTaskFlashInPara[17] = (Press32 >> 16) & 0xff; gMcuTaskFlashInPara[18] = (Press32 >> 8) & 0xff; gMcuTaskFlashInPara[19] = Press32 & 0xff; gMcuTaskFlashInPara[20] = (Battery32 >> 24) & 0xff; gMcuTaskFlashInPara[21] = (Battery32 >> 16) & 0xff; gMcuTaskFlashInPara[22] = (Battery32 >> 8) & 0xff; gMcuTaskFlashInPara[23] = Battery32 & 0xff; gMcuTaskFlashInPara[24] = (SelfDestructionMode >> 24) & 0xff; gMcuTaskFlashInPara[25] = (SelfDestructionMode >> 16) & 0xff; gMcuTaskFlashInPara[26] = (SelfDestructionMode >> 8) & 0xff; gMcuTaskFlashInPara[27] = SelfDestructionMode & 0xff; W25Q64_WriteBytes(&gFlashObj, MCU_TASK_IN_PARA_START_ADDR + gMcuTaskFlashInParaCount * 28, gMcuTaskFlashInPara, sizeof(gMcuTaskFlashInPara)); gMcuTaskFlashInParaCount++; gMcuTaskFlashInParaCount = gMcuTaskFlashInParaCount % MCU_TASK_IN_PARA_MAXCOUNT; W25Q64_WriteBytes(&gFlashObj, MCU_TASK_INPARA_COUNT_SAVE_ADDRESS, (uint8_t *)(&gMcuTaskFlashInParaCount), sizeof(gMcuTaskFlashInParaCount)); return 0; } /* 操作记录设计 */ int McuTaskFlashWriteOpt(char *Buf, uint16_t BufLen) { uint64_t Time; if (BufLen >= MCU_TASK_OPERATION_BUF_MAXLEN) { BufLen = MCU_TASK_OPERATION_BUF_MAXLEN - 1; } memset(gMcuTaskFlashOpt, 0, sizeof(gMcuTaskFlashOpt)); McuBspRtcGetTime(&gClock); Time = gClock.Year * 10000000000 + gClock.Month * 100000000 + gClock.Date * 1000000 + gClock.Hours * 10000 + gClock.Minutes * 100 + gClock.Seconds; gMcuTaskFlashOpt[0] = (Time >> 56) & 0xff; gMcuTaskFlashOpt[1] = (Time >> 48) & 0xff; gMcuTaskFlashOpt[2] = (Time >> 40) & 0xff; gMcuTaskFlashOpt[3] = (Time >> 32) & 0xff; gMcuTaskFlashOpt[4] = (Time >> 24) & 0xff; gMcuTaskFlashOpt[5] = (Time >> 16) & 0xff; gMcuTaskFlashOpt[6] = (Time >> 8) & 0xff; gMcuTaskFlashOpt[7] = Time & 0xff; memcpy(gMcuTaskFlashOpt + 8, Buf, BufLen - 1); W25Q64_WriteBytes(&gFlashObj, MCU_TASK_OPERATION_START_ADDR + gMcuTaskFlashOptCount * 24, gMcuTaskFlashOpt, sizeof(gMcuTaskFlashOpt)); gMcuTaskFlashOptCount++; gMcuTaskFlashOptCount = gMcuTaskFlashOptCount % MCU_TASK_OPERATION_BUF_MAXCOUNT; W25Q64_WriteBytes(&gFlashObj, MCU_TASK_OPERATION_COUNT_SAVE_ADDRESS, (uint8_t *)(&gMcuTaskFlashOptCount), sizeof(gMcuTaskFlashOptCount)); return 0; } /* 获取当前的自毁模式记录 */ int McuTaskFlashGetSelfDestruction(void) { /* 读取FLASH里的数据 */ uint32_t Mode = 0; W25Q64_ReadBytes(&gFlashObj, MCU_TASK_SELF_DESTRUCTION_MODE_STATUS_SAVE_ADDRESS, (uint8_t *)(&Mode), sizeof(Mode)); if (Mode > 1) { return -1; } return Mode; } /* 修改当前的自毁模式记录 */ int McuTaskFlashSetSelfDestruction(int mode) { if (mode < 0) { return -1; } if (mode > 1) { mode = 1; } W25Q64_WriteBytes(&gFlashObj, MCU_TASK_SELF_DESTRUCTION_MODE_STATUS_SAVE_ADDRESS, (uint8_t *)(&mode), sizeof(mode)); return 0; } /* 获取当前的北斗重发次数 */ int McuTaskFlashGetBeiDouRetryTime(void) { uint32_t RetryTime = 0; W25Q64_ReadBytes(&gFlashObj, MCU_TASK_BEIDOU_RETRY_COUNT_SAVE_ADDRESS, (uint8_t *)(&RetryTime), sizeof(RetryTime)); if (RetryTime > 3) { return -1; } return RetryTime; } /* 修改当前的北斗重发次数 */ int McuTaskFlashSetBeiDouRetryTime(int RetryTime) { if (RetryTime < 0) { return -1; } if (RetryTime > 3) { RetryTime = 1; } W25Q64_WriteBytes(&gFlashObj, MCU_TASK_BEIDOU_RETRY_COUNT_SAVE_ADDRESS, (uint8_t *)(&RetryTime), sizeof(RetryTime)); return 0; } /* 获取当前的低功耗唤醒周期 */ int McuTaskFlashGetWakeUpPeriod(void) { uint32_t WakeUpPeriod = 0; W25Q64_ReadBytes(&gFlashObj, MCU_TASK_LOWERPOWER_WAKEUP_PERIOD_SAVE_ADDRESS, (uint8_t *)(&WakeUpPeriod), sizeof(WakeUpPeriod)); if (WakeUpPeriod != 0) { if ((24 % WakeUpPeriod) != 0) { return -1; } } return WakeUpPeriod; } /* 修改当前的低功耗唤醒周期 */ int McuTaskFlashSetWakeUpPeriod(int Period) { if (Period < 0 || Period > 24) { return -1; } if (Period != 0) { if ((24 % Period) != 0) { return -1; } } W25Q64_WriteBytes(&gFlashObj, MCU_TASK_LOWERPOWER_WAKEUP_PERIOD_SAVE_ADDRESS, (uint8_t *)(&Period), sizeof(Period)); return 0; } static void McuTaskFlashSpiCs(uint8_t flag) { McuBspSpiCs(MCU_BSP_SPI3_ID, flag); } /* Flash发送 */ static unsigned char McuTaskFlashReadWrite(uint8_t Data) { return McuBspSpiReadWriteByte(MCU_BSP_SPI3_ID, Data); } static void McuTaskFlashDelayUs(uint32_t period) { uint32_t i = 35; // 35 = 72 / 2 -1; while (period) { while (i) { i--; } period--; i = 35; } }