2009-05-21 10:21 PM
Flash write protection for STM32f103zc
2011-05-17 04:12 AM
Hello,
I want to store calibration constants on the Flash, and then write protect that page. I could store calibration constants using Flash Write routines using PDL ver2.0.3 sample code. But when i tried the sample code from PDL ver. 2.0.3 to ''write protect the flash'', it gave FLASHSTATUS = FLASH_ERROR_PG, during debug (& standalone also) The write protect the code did NOT work and write protect option byte was =0xFFFFFFFF. The code is as follows:..... //------------------------------------------------------------------------ myHardwareInit(); FLASHStatus = FLASH_COMPLETE; MemoryProgramStatus = PASSED; Data = 0x1753; EraseCounter = 0x0; /* Unlock the Flash Program Erase controller */ FLASH_Unlock(); /* Define the number of page to be erased */ NbrOfPage = (EndAddr - StartAddr) / FLASH_PAGE_SIZE; FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP|FLASH_FLAG_PGERR |FLASH_FLAG_WRPRTERR); /* Get pages write protection status */ WRPR_Value = FLASH_GetWriteProtectionOptionByte(); ProtectedPages = WRPR_Value & 0x000000C0; if (ProtectedPages != 0x00) {/* Pages not write protected */ /* Enable the pages write protection */ FLASHStatus = FLASH_EnableWriteProtection(FLASH_WRProt_Pages12to13 |FLASH_WRProt_Pages14to15); /* Generate System Reset to load the new option byte values */ NVIC_GenerateSystemReset(); } //------------------------------------------------------------------------ when executed it always resets the system. Can someone help????? Hemant.2011-05-17 04:12 AM
Hi Hemant,
You can check first that your HSI ( internal High Speed RC) is Enabled and not disabled else the Flash programming will fail. the Reset the system at the end is normal as you have issued a system reset :) by calling NVIC_GenerateSystemReset() routine. Cheers, STOne-32.2011-05-17 04:12 AM
Hello,
Meanwhile i tried Read protection for the device and landed up with more trouble. Now, i can NOT even program the flash. The worst part is that it shows that the flash is erased and NOT protected, still it does not program. Please refer to the dump produced in the Eclipse IDE.... Open On-Chip Debugger 0.1.0 (2009-01-21-21:15) Release BUGS? Readhttp://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS
$URL:https://svn.berlios.de/svnroot/repos/openocd/tags/openocd-0.1.0/src/openocd.c
$ 500 kHz 500 kHz Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (Manufacturer: 0x23b, Part: 0xba00, Version: 0x3) Info : JTAG Tap/device matched Info : JTAG tap: stm32.bs tap/device found: 0x06414041 (Manufacturer: 0x020, Part: 0x6414, Version: 0x0) Error: JTAG tap: stm32.bs got: 0x06414041 (mfg: 0x020, part: 0x6414, ver: 0x0) Error: JTAG tap: stm32.bs expected 1 of 1: 0x16410041 (mfg: 0x020, part: 0x6410, ver: 0x1) Error: trying to validate configured JTAG chain anyway... Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (Manufacturer: 0x23b, Part: 0xba00, Version: 0x3) Info : JTAG Tap/device matched Info : JTAG tap: stm32.bs tap/device found: 0x06414041 (Manufacturer: 0x020, Part: 0x6414, Version: 0x0) Error: JTAG tap: stm32.bs got: 0x06414041 (mfg: 0x020, part: 0x6414, ver: 0x0) Error: JTAG tap: stm32.bs expected 1 of 1: 0x16410041 (mfg: 0x020, part: 0x6410, ver: 0x1) Error: trying to validate configured JTAG chain anyway... target state: halted target halted due to debug-request, current mode: Handler HardFault xPSR: 0x01000003 pc: 0xfffffffe verify Capture-IR is disabled target state: halted target halted due to debug-request, current mode: Handler HardFault xPSR: 0x01000003 pc: 0xfffffffe Info : device id = 0x10016414 Error: SWJ-DP STICKY ERROR Error: dcb_dhcsr 0x30003, nvic_shcsr 0x20000, nvic_cfsr 0x1, nvic_bfar 0xe000edf8 Warn : STM32 flash size failed, probe inaccurate - assuming 512k flash Info : flash size = 512kbytes stm32x mass erase complete Error: SWJ-DP STICKY ERROR Error: dcb_dhcsr 0x30003, nvic_shcsr 0x20000, nvic_cfsr 0x1, nvic_bfar 0xe000edf8 Error: SWJ-DP STICKY ERROR Error: dcb_dhcsr 0x30003, nvic_shcsr 0x20000, nvic_cfsr 0x1, nvic_bfar 0xe000edf8 Warn : Block read error address 0x8000000, count 0x100 unknown error when checking erase state of flash bank #0 at 0x08000000 # 0: 0x00000000 (0x800 2kB) erased # 1: 0x00000800 (0x800 2kB) erased # 2: 0x00001000 (0x800 2kB) erased Note: the same message for sectors 3 to 252 are removed to save space #253: 0x0007e800 (0x800 2kB) erased #254: 0x0007f000 (0x800 2kB) erased #255: 0x0007f800 (0x800 2kB) erased successfully checked protect state #0: stm32x at 0x08000000, size 0x00080000, buswidth 0, chipwidth 0 # 0: 0x00000000 (0x800 2kB) not protected # 1: 0x00000800 (0x800 2kB) not protected # 2: 0x00001000 (0x800 2kB) not protected # 3: 0x00001800 (0x800 2kB) not protected Note: the same message for sectors 3 to 252 are removed to save space #253: 0x0007e800 (0x800 2kB) not protected #254: 0x0007f000 (0x800 2kB) not protected #255: 0x0007f800 (0x800 2kB) not protected stm32x (High Density) - Rev: Z Error: timed out while waiting for target halted Error: error executing stm32x flash write algorithm Error: flash writing failed with error code: 0xfffffc7a Error: error writing to flash at address 0x08000000 at offset 0x00000000 (-902) The program segments i used is attached herewith. Regards, Hemant.2011-05-17 04:12 AM
I got around this by adding a different programming algorithm (STM32F10x Flash Options) to the target options. (this is in uVision) Their seems to be a different algorhthm for the flash options bytes, adding this, together with the STM32F10xOPT.s file helped. I did have to remove the normal programming algorithm and run jst this one first before adding back in both to get it working.
hope this helps