|
|
View previous topic :: View next topic |
Author |
Message |
picerno Guest
|
write_program_memory and code protect |
Posted: Mon Oct 09, 2006 6:39 am |
|
|
Can I use the "write_program_memory" function to write a little area of memory when the fuse PROTECT is set? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Oct 11, 2006 12:45 am |
|
|
Quote: |
Can I use the "write_program_memory" function to write a little area of
memory when the fuse PROTECT is set ?
|
See the test program posted below. The PROTECT fuse will set all
the CPx configs bits = 0, which protects all the ROM except for the
"boot block"in the bottom 0x200 bytes. The CPB fuse must be added
to protect the boot block. The test program does that.
Here's the output of the program. First, 8 bytes of the flash memory
are erased, starting at address 0x4000. Then I read it and display it.
It's all FF's, so that proves that it was erased. Then I write some
data to it, and read it back. This proves that you can read and
write to flash memory which is code protected by using the CCS
read_program_memory() and write_program_memory() functions.
Quote: |
Flash write size = 8
Flash memory after being erased: FF FF FF FF FF FF FF FF
Flash memory after being written: 01 02 03 04 05 06 07 08
|
Here's what program memory looks like, when I use the ICD2
to try and read it, after the it's been programmed with the program
below (which has the PROTECT and CPB fuses enabled).
You can't read it. It's protected.
Code: |
0000 0000 NOP
0002 0000 NOP
0004 0000 NOP
0006 0000 NOP
0008 0000 NOP
000A 0000 NOP
000C 0000 NOP
000E 0000 NOP
0010 0000 NOP
etc.
|
Here's the test program.
Code: |
#include <18F452.h>
#fuses XT,NOWDT,PUT,BROWNOUT,NOLVP, PROTECT, CPB
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#define ROM_ADDR 0x4000
//====================================
void main(void)
{
int8 i;
int8 write_data[8] = {1,2,3,4,5,6,7,8};
int8 read_data[8] = {0,0,0,0,0,0,0,0};
printf("Flash write size = %u\n\r", getenv("FLASH_WRITE_SIZE"));
printf("\n\r");
// Erase flash memory.
erase_program_eeprom(ROM_ADDR);
// Read flash memory.
read_program_memory(ROM_ADDR, read_data, sizeof(read_data));
// Display it, to show it's erased.
printf("Flash memory after being erased: ");
for(i = 0; i < sizeof(read_data); i++)
printf("%X ", read_data[i]);
printf("\n\r");
printf("\n\r");
// Now write 8 bytes.
write_program_memory(ROM_ADDR, write_data, sizeof(write_data));
// Read them back.
read_program_memory(ROM_ADDR, read_data, sizeof(read_data));
// Display data read from Flash memory.
printf("Flash memory after being written: ");
for(i = 0; i < sizeof(read_data); i++)
printf("%X ", read_data[i]);
printf("\n\r");
printf("\n\r");
while(1);
}
|
I tested this with PCH vs. 3.249. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed Oct 11, 2006 1:54 am |
|
|
As an additional note: PICC C Manual, March 2006 wrote: | Some processors allow different levels for certain fuses. To access these levels, assign a value to the fuse. For example, on the 18F452, the fuse PROTECT=6 would place the value 6 into CONFIG5L, protecting code blocks 0 and 3. |
|
|
|
picerno Guest
|
|
Posted: Wed Oct 11, 2006 2:12 am |
|
|
Quote: |
See the test program posted below. The PROTECT fuse will set all
the CPx configs bits = 0, which protects all the ROM except for the
"boot block"in the bottom 0x200 bytes. The CPB fuse must be added
to protect the boot block. |
It's true, but it is possible on 18FXX only. Ok, if protected, it is impossible.
Thank you |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|