20230731_XiaoFuZi_emb/ZheDaXiaoFuZi/Src/Usr/Task/McuTaskFlash.c
Rjh913828050 a8560d741e 类型:重构
内容:重新整理项目文件分类
人员:任家豪
2023-10-08 16:10:23 +08:00

739 lines
30 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 0x32ffff
#define MCU_TASK_OPERATION_MAX 0x30000
#define MCU_TASK_OPERATION_BUF_MAXLEN 64 // 每条操作记录的最大值
#define MCU_TASK_OPERATION_BUF_MAXCOUNT 3072 // 最大条数
#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 // 存储睡眠唤醒周期的存储
/* 关于工作模式切换的存储地址 */
#define MCU_TASK_APPMODE_SAVE_ADDRESS 0x234000 // 工作模式切换的存储地址
/*************************************************************************/
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 int gMcuTaskFlashAppMode = 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;
}
/******************************获取工作模式**************************************/
W25Q64_ReadBytes(&gFlashObj, MCU_TASK_APPMODE_SAVE_ADDRESS, (uint8_t *)(&gMcuTaskFlashAppMode), sizeof(gMcuTaskFlashAppMode));
if (gMcuTaskFlashAppMode > 2) {
gMcuTaskFlashAppMode = 0;
}
return 0;
}
int McuTaskFlashConfInit(void)
{
int rt;
/* 获取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_SIZE_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;
}
/********************************设置保存的APPMODE**********************************/
void McuTaskFlashSetAppMode(unsigned char Mode)
{
gMcuTaskFlashAppMode = Mode;
W25Q64_WriteBytes(&gFlashObj, MCU_TASK_APPMODE_SAVE_ADDRESS, (uint8_t *)(&gMcuTaskFlashAppMode), 4);
}
unsigned int McuTaskFlashGetAppMode(void)
{
return gMcuTaskFlashAppMode;
}
/* 获取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;
}
/* 操作记录设计,最多只能有50个字节 */
int McuTaskFlashWriteOpt(char *Buf, uint16_t BufLen)
{
uint64_t Time;
if (BufLen > MCU_TASK_OPERATION_BUF_MAXLEN - 9) {
BufLen = MCU_TASK_OPERATION_BUF_MAXLEN - 9;
}
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);
W25Q64_WriteBytes(&gFlashObj, MCU_TASK_OPERATION_START_ADDR + gMcuTaskFlashOptCount * 64,
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;
}
/* 模块进入低功耗 */
void McuTaskFlashJoinLowerPow(void)
{
W25Q64_PowerDown(&gFlashObj);
}
void McuTaskFlashJoinUperPow(void)
{
W25Q64_WakeUp(&gFlashObj);
}
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;
}
}