| | |
| | | //uint16_t FlashDatas[16];
|
| | |
|
| | | //uint32_t * pUID = (uint32_t *)(UID_BASE);
|
| | |
|
| | | const char VersionStr[] __attribute__((at(0X8001000)))
|
| | | const stKMInfoBlock KMInfoBlock =
|
| | | {
|
| | | 0x0008,
|
| | | 0x0100,
|
| | | 0x0100,
|
| | | 0x0100,
|
| | | 16,
|
| | | 16,
|
| | | 0,
|
| | | 0,
|
| | | 0,
|
| | | 0,
|
| | | 0,
|
| | | 0,
|
| | | };
|
| | | const char VersionStr[] __attribute__((at(FLASH_BASE + 0X1000))) //__attribute__((at(0X8001000)))
|
| | | = "3.00";
|
| | |
|
| | | const stKMSysCfg KMStoreSysCfg /*__attribute__((at(STORECFGBASE)))*/ =
|
| | |
| | |
|
| | | const stKMSysCfg KMStoreSysCfg2[7] /*__attribute__((at(STORECFGBASE+sizeof(stKMSysCfg))))*/;
|
| | |
|
| | | int ReadFlashMem(void * pBuf, void * pAddrFlash, int nSize)
|
| | | int ReadFlashMem(void * pBuf, void * pAddrFlash, int nByteSize)
|
| | | {
|
| | | // memcpy(pBuf,pAddrFlash,nSize);
|
| | | for (int i=0;i<nSize/4;i++)
|
| | | for (int i=0;i<nByteSize/4;i++)
|
| | | {
|
| | | ((uint32_t *)pBuf)[i] = ((uint32_t *)pAddrFlash)[i];
|
| | | }
|
| | | for (int i=nSize/4*2;i<nSize/2;i++)
|
| | | for (int i=nByteSize/4*2;i<nByteSize/2;i++)
|
| | | {
|
| | | ((uint16_t *)pBuf)[i] = ((uint16_t *)pAddrFlash)[i];
|
| | | }
|
| | | return nSize;
|
| | | return nByteSize;
|
| | | }
|
| | | int EraseFlashMem(void * pAddrFlash, unsigned int Pages)
|
| | | {
|
| | |
| | | res = HAL_FLASH_Lock();
|
| | | return res;
|
| | | }
|
| | | int WriteToFlashMemNoErase(void * pBuf, void * pAddrFlash, unsigned int nSize)
|
| | | int WriteToFlashMemNoErase(void * pBuf, void * pAddrFlash, unsigned int nByteSize)
|
| | | {
|
| | | HAL_StatusTypeDef res;
|
| | | res = HAL_FLASH_Unlock();
|
| | |
| | | }
|
| | | */
|
| | | ///*
|
| | | for (int i=0;i<nSize/4;i++)
|
| | | for (int i=0;i<nByteSize/4;i++)
|
| | | {
|
| | | res = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t)pAddrFlash + i*4, ((uint32_t *)pBuf)[i]);
|
| | | }
|
| | |
|
| | | for (int i = nSize/4 * 2 ; i < nSize/2 ; i++)
|
| | | for (int i = nByteSize/4 * 2 ; i < nByteSize/2 ; i++)
|
| | | {
|
| | | res = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, (uint32_t)pAddrFlash + i*2, ((uint16_t *)pBuf)[i]);
|
| | | }
|
| | |
| | |
|
| | | return res;
|
| | | }
|
| | | int EraseAndWriteToFlashMem(void * pBuf, void * pAddrFlash, unsigned int nSize)
|
| | | int EraseAndWriteToFlashMem(void * pBuf, void * pAddrFlash, unsigned int nByteSize)
|
| | | {
|
| | |
|
| | | HAL_StatusTypeDef res;
|
| | |
| | | erase1.TypeErase=FLASH_TYPEERASE_PAGES;
|
| | | res = HAL_FLASHEx_Erase(&erase1,&ErrNo);
|
| | |
|
| | | for (int i=0;i<nSize/2;i++)
|
| | | for (int i=0;i<nByteSize/2;i++)
|
| | | {
|
| | | res = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, (uint32_t)pAddrFlash + i*2, ((uint16_t *)pBuf)[i]);
|
| | | }
|
| | |
| | | res = HAL_FLASH_Lock();
|
| | |
|
| | | return res;
|
| | | }
|
| | |
|
| | | int ReadFactoryData(void * pDatabuf, int nByteCount)
|
| | | {
|
| | | memcpy(pDatabuf,(stFactoryData *)FACTORY_DATA_BASE,nByteCount);
|
| | | return 0;
|
| | | }
|
| | | int WriteFactoryData(void * pDataBuf, int nByteCount)
|
| | | {
|
| | | EraseAndWriteToFlashMem(pDataBuf, (stFactoryData *)FACTORY_DATA_BASE,nByteCount);
|
| | | return 0;
|
| | | }
|
| | |
|
| | | int ReadProgram(int nProgByteAddr, void *pBuf, int nByteSize, int nBank)
|
| | | {
|
| | | if (nBank==0) {
|
| | | ReadFlashMem(pBuf, (void *)(STORE_PRG_BASE+nProgByteAddr), nByteSize);
|
| | | }else if (nBank ==1) {
|
| | | ReadFlashMem(pBuf, (void *)(ALT_PRG_BASE+nProgByteAddr), nByteSize);
|
| | | }else if (KMRunStat.nBinProgBank==0) {
|
| | | ReadFlashMem(pBuf, (void *)(STORE_PRG_BASE+nProgByteAddr), nByteSize);
|
| | | } else {
|
| | | ReadFlashMem(pBuf, (void *)(ALT_PRG_BASE+nProgByteAddr), nByteSize);
|
| | | } |
| | | return 0;
|
| | | }
|
| | | int WriteProgram(int nProgAddress, void * pBuf, int nByteSize, int nBank)
|
| | | {
|
| | | // Program Save Address;//
|
| | | // Program 2 Save Address; //
|
| | | void * progByteAddr;
|
| | | if (nBank == 0) {
|
| | | progByteAddr=(void *)(STORE_PRG_BASE+nProgAddress);
|
| | | }else if (nBank==1) {
|
| | | progByteAddr=(void *)(ALT_PRG_BASE+nProgAddress);
|
| | | } else if (KMRunStat.nBinProgBank==0) {
|
| | | progByteAddr=(void *)(ALT_PRG_BASE+nProgAddress);
|
| | | }else{
|
| | | progByteAddr=(void *)(STORE_PRG_BASE+nProgAddress);
|
| | | }
|
| | | if (nProgAddress ==0) {
|
| | | EraseAndWriteToFlashMem(pBuf, progByteAddr, nByteSize);
|
| | | }else{
|
| | | WriteToFlashMemNoErase(pBuf, progByteAddr, nByteSize);
|
| | | }
|
| | | return 0;
|
| | | }
|
| | |
|
| | | int LoadDefaultSysCfg(pKMSysCfg theKMSysCfg)
|
| | |
| | |
|
| | | return 0;
|
| | | }
|
| | |
|
| | | inline void SetAddrBit(unsigned short * pW, unsigned char bitAddr)
|
| | | {
|
| | | (*pW)|=1<<(bitAddr&0xf);
|
| | | }
|
| | |
|
| | | inline void ResetBit(unsigned short * pW, unsigned char bitAddr)
|
| | | {
|
| | | (*pW)&=~(1<<(bitAddr&0xf));
|
| | | }
|
| | |
|
| | | static inline void SetBitValue(unsigned short * pW, unsigned char bitAddr, unsigned char Value)
|
| | | {
|
| | | if (Value) { SetAddrBit(pW, bitAddr);}
|
| | | else {ResetBit(pW, bitAddr);}
|
| | | }
|
| | |
|
| | | static inline unsigned char GetBitValue(unsigned short W, unsigned char bitAddr)
|
| | | {
|
| | | if (W&(1<<(bitAddr&0xf))) return 1;
|
| | | else return 0;
|
| | | }
|
| | |
|
| | |
|
| | | unsigned char GetCoilValue(unsigned char nCoilType, unsigned short nCoilAddr)
|
| | | {
|
| | | unsigned char thisValue=0;
|
| | | unsigned short nWordAddr=(nCoilAddr&0xff0)>>4;
|
| | | unsigned char nBitAddr=nCoilAddr&0xf;
|
| | | switch(nCoilType)
|
| | | {
|
| | | case KLCoilTypeX:
|
| | | if (nCoilAddr >= KLCoilXCount) return 0;
|
| | | thisValue = GetBitValue(KMem.WX[nWordAddr], nBitAddr);
|
| | | break;
|
| | | case KLCoilTypeY:
|
| | | if (nCoilAddr >= KLCoilYCount) return 0;
|
| | | thisValue = GetBitValue(KMem.WY[nWordAddr], nBitAddr);
|
| | | break;
|
| | | case KLCoilTypeR:
|
| | | if (nCoilAddr >= KLCoilRCount) return 0;
|
| | | thisValue = GetBitValue(KMem.WR[nWordAddr], nBitAddr);
|
| | | break;
|
| | | case KLCoilTypeLX:
|
| | | if (nCoilAddr >= KLCoilLXCount) return 0;
|
| | | thisValue = GetBitValue(KMem.WLX[nWordAddr], nBitAddr);
|
| | | break;
|
| | | case KLCoilTypeLY:
|
| | | if (nCoilAddr >= KLCoilLYCount) return 0;
|
| | | thisValue = GetBitValue(KMem.WLY[nWordAddr], nBitAddr);
|
| | | break;
|
| | | case KLCoilTypeT:
|
| | | if (nCoilAddr >= KLCoilTCount) return 0;
|
| | | thisValue = GetBitValue(KMem.WT[nWordAddr], nBitAddr);
|
| | | break;
|
| | | case KLCoilTypeC:
|
| | | if (nCoilAddr >= KLCoilCCount) return 0;
|
| | | thisValue = GetBitValue(KMem.WC[nWordAddr], nBitAddr);
|
| | | break;
|
| | | case KLCoilTypeLR:
|
| | | if (nCoilAddr >= KLCoilLRCount) return 0;
|
| | | thisValue = GetBitValue(KMem.WLR[nWordAddr], nBitAddr); |
| | | break;
|
| | | case KLCoilTypeSR:
|
| | | if (nCoilAddr >= KLCoilSRCount) return 0;
|
| | | thisValue = GetBitValue(KMem.WSR[nWordAddr], nBitAddr);
|
| | | break;
|
| | | default:
|
| | | break;
|
| | | } |
| | | return thisValue;
|
| | | }
|
| | | int SetCoilValue(unsigned char nCoilType, unsigned short nCoilAddr, unsigned char nCoilValue)
|
| | | {
|
| | | unsigned short nWordAddr=(nCoilAddr&0xff0)>>4;
|
| | | unsigned char nBitAddr=nCoilAddr&0xf;
|
| | | switch(nCoilType)
|
| | | {
|
| | | case KLCoilTypeX:
|
| | | if (nCoilAddr >= KLCoilXCount) return 0;
|
| | | SetBitValue(&KMem.WX[nWordAddr], nBitAddr, nCoilValue);
|
| | | break;
|
| | | case KLCoilTypeY:
|
| | | if (nCoilAddr >= KLCoilYCount) return 0;
|
| | | SetBitValue(&KMem.WY[nWordAddr], nBitAddr, nCoilValue);
|
| | | break;
|
| | | case KLCoilTypeR:
|
| | | if (nCoilAddr >= KLCoilRCount) return 0;
|
| | | SetBitValue(&KMem.WR[nWordAddr], nBitAddr, nCoilValue);
|
| | | break;
|
| | | case KLCoilTypeLX:
|
| | | if (nCoilAddr >= KLCoilLXCount) return 0;
|
| | | SetBitValue(&KMem.WLX[nWordAddr], nBitAddr, nCoilValue);
|
| | | break;
|
| | | case KLCoilTypeLY:
|
| | | if (nCoilAddr >= KLCoilLYCount) return 0;
|
| | | SetBitValue(&KMem.WLY[nWordAddr], nBitAddr, nCoilValue);
|
| | | break;
|
| | | case KLCoilTypeT:
|
| | | if (nCoilAddr >= KLCoilTCount) return 0;
|
| | | SetBitValue(&KMem.WT[nWordAddr], nBitAddr, nCoilValue);
|
| | | break;
|
| | | case KLCoilTypeC:
|
| | | if (nCoilAddr >= KLCoilCCount) return 0;
|
| | | SetBitValue(&KMem.WC[nWordAddr], nBitAddr, nCoilValue);
|
| | | break;
|
| | | case KLCoilTypeLR:
|
| | | if (nCoilAddr >= KLCoilLRCount) return 0;
|
| | | SetBitValue(&KMem.WLR[nWordAddr], nBitAddr, nCoilValue);
|
| | | break;
|
| | | case KLCoilTypeSR:
|
| | | if (nCoilAddr >= KLCoilSRCount) return 0;
|
| | | SetBitValue(&KMem.WSR[nWordAddr], nBitAddr, nCoilValue);
|
| | | break;
|
| | | default:
|
| | | break;
|
| | | } |
| | | return 0;
|
| | | }
|
| | |
|
| | | int GetVarData(int nDataType, int nDataAddr)
|
| | | {
|
| | | // TODO: ?????????.
|
| | | int thisValue = 0;
|
| | | |
| | | switch (nDataType)
|
| | | {
|
| | | case KLDataTypeDEC:
|
| | | case KLDataTypeHEX:
|
| | | thisValue = nDataAddr;
|
| | | break;
|
| | | case KLDataTypeWX:
|
| | | if (nDataAddr >= KLDataWXCount) return 0;
|
| | | thisValue = KMem.WX[nDataAddr];
|
| | | break;
|
| | | case KLDataTypeWY:
|
| | | if (nDataAddr >= KLDataWYCount) return 0;
|
| | | thisValue = KMem.WY[nDataAddr];
|
| | | break;
|
| | | case KLDataTypeWR:
|
| | | if (nDataAddr >= KLDataWRCount) return 0;
|
| | | thisValue = KMem.WR[nDataAddr];
|
| | | break;
|
| | | case KLDataTypeWLX:
|
| | | if (nDataAddr >= KLDataWLCount) return 0;
|
| | | thisValue = KMem.WLX[nDataAddr];
|
| | | break;
|
| | | case KLDataTypeWLY:
|
| | | if (nDataAddr >= KLDataWLCount) return 0;
|
| | | thisValue = KMem.WLY[nDataAddr];
|
| | | break;
|
| | | case KLDataTypeDT:
|
| | | if (nDataAddr >= KLDataDTCount) return 0;
|
| | | thisValue = (signed short)KMem.DT[nDataAddr];
|
| | | break;
|
| | | case KLDataTypeSDT:
|
| | | if (nDataAddr >= KLDataSDTCount) return 0;
|
| | | thisValue = KMem.SDT[nDataAddr];
|
| | | break;
|
| | | case KLDataTypeWSR:
|
| | | if (nDataAddr >= KLCoilLRCount) return 0;
|
| | | thisValue = KMem.WSR[nDataAddr];
|
| | | break;
|
| | | case KLDataTypeSV:
|
| | | if (nDataAddr >= KLDataSVCount) return 0;
|
| | | thisValue = KMem.SV[nDataAddr];
|
| | | break;
|
| | | case KLDataTypeEV:
|
| | | if (nDataAddr >= KLDataEVCount) return 0;
|
| | | thisValue = KMem.EV[nDataAddr];
|
| | | break;
|
| | | case KLDataTypeLD:
|
| | | if (nDataAddr >= KLDataLDCount) return 0;
|
| | | thisValue = KMem.DT[nDataAddr];
|
| | | break;
|
| | | case KLDataSysCfg:
|
| | | if (nDataAddr >= KLCoilSRCount) return 0;
|
| | | thisValue = KMem.SDT[nDataAddr];
|
| | | break;
|
| | | case KLDataTypeFlash:
|
| | | if (nDataAddr >= KLCoilSRCount) return 0;
|
| | | thisValue = KMem.SDT[nDataAddr];
|
| | | break;
|
| | | case KLDataTypeTest:
|
| | | if (nDataAddr >= KLCoilSRCount) return 0;
|
| | | thisValue = KMem.SDT[nDataAddr];
|
| | | break;
|
| | | }
|
| | | return thisValue;
|
| | | }
|
| | |
|
| | |
|
| | | int SetVarData(int nDataType, int nDataAddr, int nDataValue)
|
| | | {
|
| | | // TODO: ?????????.
|
| | | switch (nDataType)
|
| | | {
|
| | | // case KLDataTypeDEC:
|
| | | // case KLDataTypeHEX:
|
| | | // break;
|
| | | case KLDataTypeWX:
|
| | | if (nDataAddr >= KLDataWXCount) return 0;
|
| | | KMem.WX[nDataAddr] = nDataValue;
|
| | | break;
|
| | | case KLDataTypeWY:
|
| | | if (nDataAddr >= KLDataWYCount) return 0;
|
| | | KMem.WY[nDataAddr] = nDataValue;
|
| | | break;
|
| | | case KLDataTypeWR:
|
| | | if (nDataAddr >= KLDataWRCount) return 0;
|
| | | KMem.WR[nDataAddr] = nDataValue;
|
| | | break;
|
| | | case KLDataTypeWLX:
|
| | | if (nDataAddr >= KLDataWLCount) return 0;
|
| | | KMem.WLX[nDataAddr] = nDataValue;
|
| | | break;
|
| | | case KLDataTypeWLY:
|
| | | if (nDataAddr >= KLDataWLCount) return 0;
|
| | | KMem.WLY[nDataAddr] = nDataValue;
|
| | | break;
|
| | | case KLDataTypeDT:
|
| | | if (nDataAddr >= KLDataDTCount) return 0;
|
| | | KMem.DT[nDataAddr] = nDataValue;
|
| | | break;
|
| | | case KLDataTypeSDT:
|
| | | if (nDataAddr >= KLDataSDTCount) return 0;
|
| | | KMem.SDT[nDataAddr] = nDataValue;
|
| | | break;
|
| | | case KLDataTypeWSR:
|
| | | if (nDataAddr >= KLCoilLRCount) return 0;
|
| | | KMem.WSR[nDataAddr] = nDataValue;
|
| | | break;
|
| | | case KLDataTypeSV:
|
| | | if (nDataAddr >= KLDataSVCount) return 0;
|
| | | KMem.SV[nDataAddr] = nDataValue;
|
| | | break;
|
| | | case KLDataTypeEV:
|
| | | if (nDataAddr >= KLDataEVCount) return 0;
|
| | | KMem.EV[nDataAddr] = nDataValue;
|
| | | break;
|
| | | case KLDataTypeLD:
|
| | | if (nDataAddr >= KLDataLDCount) return 0;
|
| | | KMem.DT[nDataAddr] = nDataValue;
|
| | | break;
|
| | | case KLDataSysCfg:
|
| | | if (nDataAddr >= KLCoilSRCount) return 0;
|
| | | KMem.SDT[nDataAddr] = nDataValue;
|
| | | break;
|
| | | case KLDataTypeFlash:
|
| | | if (nDataAddr >= KLCoilSRCount) return 0;
|
| | | KMem.SDT[nDataAddr] = nDataValue;
|
| | | break;
|
| | | case KLDataTypeTest:
|
| | | if (nDataAddr >= KLCoilSRCount) return 0;
|
| | | KMem.SDT[nDataAddr] = nDataValue;
|
| | | break;
|
| | | }
|
| | |
|
| | | return 0;
|
| | | }
|
| | |
|