Hi
Try
unsigned char buffer[16];
(const void *)flash_add = 0x4000;
memcpy(buffer, flash_add, 16);
// Now we have the 16 bytes form flash address 0x4000 in buffer
Or generally
unsigned char flash_data = *(unsigned char *)0x4000;
To read any byte from flash.
Only the program once area requires special operation to read. The rest is simply memory-mapped.
Regards
Mark