701 lines
29 KiB
C
701 lines
29 KiB
C
#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 <string.h>
|
|
|
|
#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;
|
|
}
|
|
}
|