29 #define NVMHAL_FFFFFFFF 0xffffffffUL
46 static uint32_t readUnalignedWord(uint8_t *addr)
49 if (SCB->CCR & SCB_CCR_UNALIGN_TRP_Msk)
52 return (*(addr + 3) << 24) | (*(addr + 2) << 16) | (*(addr + 1) << 8) | *addr;
57 return *(uint32_t *)addr;
155 uint8_t *pObjectInt = (uint8_t*) pObject;
160 *pObjectInt = *pAddress;
199 uint8_t *pObjectInt = (uint8_t*)pObject;
205 padLen = (uint32_t) pAddress %
sizeof(tempWord);
210 tempWord = readUnalignedWord((uint8_t *)pObject);
213 tempWord = tempWord << 8 * padLen;
215 tempWord |= NVMHAL_FFFFFFFF >> (8 * (
sizeof(tempWord) - padLen));
218 if (len <
sizeof(tempWord) - padLen)
221 tempWord |= NVMHAL_FFFFFFFF << (8 * (padLen + len));
226 len -=
sizeof(tempWord) - padLen;
231 mscStatus =
MSC_WriteWord((uint32_t *) pAddress, &tempWord,
sizeof(tempWord));
233 pObjectInt +=
sizeof(tempWord) - padLen;
234 pAddress +=
sizeof(tempWord);
239 while ((len >=
sizeof(tempWord)) && (
mscReturnOk == mscStatus))
241 tempWord = readUnalignedWord((uint8_t *)pObjectInt);
242 mscStatus =
MSC_WriteWord((uint32_t *) pAddress, &tempWord,
sizeof(tempWord));
244 pAddress +=
sizeof(tempWord);
245 pObjectInt +=
sizeof(tempWord);
246 len -=
sizeof(tempWord);
253 tempWord = readUnalignedWord((uint8_t *)pObjectInt);
256 tempWord |= NVMHAL_FFFFFFFF << (8 * len);
257 mscStatus =
MSC_WriteWord((uint32_t *) pAddress, &tempWord,
sizeof(tempWord));
261 return returnTypeConvert(mscStatus);
281 return returnTypeConvert(
MSC_ErasePage((uint32_t *) pAddress));
310 uint8_t *pointer = (uint8_t *) pMemory;
311 uint16_t crc = *pChecksum;
315 crc = (crc >> 8) | (crc << 8);
317 crc ^= (crc & 0xf0) >> 4;
318 crc ^= (crc & 0x0f) << 12;
319 crc ^= (crc & 0xff) << 5;
void NVMHAL_Read(uint8_t *pAddress, void *pObject, uint16_t len)
Read data from NVM.
void NVMHAL_Init(void)
Initialize NVM driver.
Ecode_t NVMHAL_PageErase(uint8_t *pAddress)
Erase a page in the NVM.
void MSC_Init(void)
Enables the flash controller for writing.
void MSC_Deinit(void)
Disables the flash controller for writing.
Non-Volatile Memory Wear-Leveling driver API.
Flash controller module (MSC) peripheral API.
void NVMHAL_Checksum(uint16_t *pChecksum, void *pMemory, uint16_t len)
Calculate checksum according to CCITT CRC16.
MSC_FUNC_PREFIX MSC_Status_TypeDef MSC_ErasePage(uint32_t *startAddress) MSC_FUNC_POSTFIX
Erases a page in flash memory.
#define ECODE_EMDRV_NVM_ERROR
General error.
void NVMHAL_DeInit(void)
De-initialize NVM .
#define ECODE_EMDRV_NVM_ADDR_INVALID
Invalid address.
#define ECODE_EMDRV_NVM_OK
Success return value.
Non-Volatile Memory Wear-Leveling driver HAL.
#define ECODE_EMDRV_NVM_ALIGNMENT_INVALID
Invalid data alignment.
uint32_t Ecode_t
Typedef for API function errorcode return values.
MSC_FUNC_PREFIX MSC_Status_TypeDef MSC_WriteWord(uint32_t *address, void const *data, uint32_t numBytes) MSC_FUNC_POSTFIX
Writes data to flash memory. This function is interrupt safe, but slower than MSC_WriteWordFast(), which writes to flash with interrupts disabled. Write data must be aligned to words and contain a number of bytes that is divisable by four.
Ecode_t NVMHAL_Write(uint8_t *pAddress, void const *pObject, uint16_t len)
Write data to NVM.