Loading...
 

SW4STM32 and SW4Linux fully supports the STM32MP1 asymmetric multicore Cortex/A7+M4 MPUs

   With System Workbench for Linux, Embedded Linux on the STM32MP1 family of MPUs from ST was never as simple to build and maintain, even for newcomers in the Linux world.
And, if you install System Workbench for Linux in System Workbench for STM32 you can seamlessly develop and debug asymmetric applications running partly on Linux, partly on the Cortex-M4.
You can get more information from the ac6-tools website and download two short videos (registration required) highlighting:

System Workbench for STM32


How to reprogram STM32 when the flash is corrupted

Hello everyone,

I am a new to the STM32 environment and I am trying to change the BOR level of STM32L452. I think I have corrupted the flash while trying to do this. And now when I try to reprogram the device it fails and gives the following error:

Open On-Chip Debugger 0.10.0+dev-00021-g524e8c8 (2019-04-12-08:48)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
srst_only separate srst_nogate srst_open_drain connect_assert_srst
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
padded zone erase set to 1
adapter speed: 8000 kHz
adapter_nsrst_delay: 100
Info : clock speed 8000 kHz
Info : STLINK v2 JTAG v36 API v2 SWIM v7 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.201051
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Stlink adapter speed set to 4000 kHz
Info : STM32L452RETx.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x08003340 msp: 0x20028000
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Stlink adapter speed set to 4000 kHz
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
adapter speed: 4000 kHz

    • Programming Started **

auto erase enabled
Info : Device id = 0x20016462
Info : STM32L4xx flash size is 512kb, base address is 0x8000000
Info : Erase the padded zone before the write
Error: Whole bank access must start at beginning of bank.
Error: corrupted fifo read pointer 0xffffffff
Error: timed out while waiting for target halted
target halted due to debug-request, current mode: Handler HardFault
xPSR: 0x61000003 pc: 0x08003406 msp: 0x20027fa8
Error: error waiting for target flash write algorithm
Error: block write failed
Error: error writing to flash at address 0x08000000 at offset 0x00000000
embedded:startup.tcl:476: Error: ** Programming Failed **
in procedure ‘program’
in procedure ‘program_error’ called at file “embedded:startup.tcl”, line 535
at file “embedded:startup.tcl”, line 476



And below is my code which caused the issue:

Call from Main.c

if(BOR_Set(BOR_Level_4) == BOR_Result_Ok)
{
HAL_GPIO_WritePin( LED1_PORT, LED1_G_PIN, GPIO_PIN_SET ); // Turn off
HAL_GPIO_WritePin( LED1_PORT, LED1_B_PIN, GPIO_PIN_RESET ); // Turn On
HAL_Delay( pdMS_TO_TICKS( 500 ) );
HAL_GPIO_WritePin( LED1_PORT, LED1_B_PIN, GPIO_PIN_SET ); // Turn off
HAL_GPIO_WritePin( LED1_PORT, LED1_G_PIN, GPIO_PIN_RESET ); // Turn On
}

//-----------------------------------------------

  1. include “stm32l4xx.h”


/**
* @brief Brown-out levels available
*/
typedef enum {
BOR_Level_0 = OB_BOR_LEVEL_0, /*!< Disable brown-out detection */
BOR_Level_1 = OB_BOR_LEVEL_1, /*!< Set brown out detection level 1 */
BOR_Level_2 = OB_BOR_LEVEL_2, /*!< Set brown out detection level 2 */
BOR_Level_3 = OB_BOR_LEVEL_3, /*!< Set brown out detection level 3 */
BOR_Level_4 = OB_BOR_LEVEL_4
} BOR_Level_t;


BOR_Result_t BOR_Set(BOR_Level_t BORValue)
{
HAL_StatusTypeDef status;
FLASH_OBProgramInitTypeDef FLASH_Handle;

/* Check current BOR value */
if ((BOR_Get() & 0x0F00) != BORValue) // Bit 8 to bit 10 for BOR value.
{
/* Set new value */

/* Select the desired V(BOR) Level */
FLASH_Handle.OptionType = OPTIONBYTE_USER;
FLASH_Handle.USERConfig = FLASH_Handle.USERConfig | (uint32_t)BORValue;
//FLASH_Handle.USERType = OB_USER_BOR_LEV;

HAL_FLASH_Unlock();

/* Unlocks the option bytes block access */
HAL_FLASH_OB_Unlock();

/* Set value */
HAL_FLASHEx_OBProgram(&FLASH_Handle);

/* Launch the option byte loading */
status = HAL_FLASH_OB_Launch();

/* Lock access to registers */
HAL_FLASH_OB_Lock();

HAL_FLASH_Lock();

/* Check success */
if (status != HAL_OK)
{
/* Return error */
return BOR_Result_Error;
}
}

/* Return OK */
return BOR_Result_Ok;
}


Please if someone could point out where I am going wrong in the code as well as how I can reprogram the chip as currently its not responding and its not working. I have ST-LINK/V2 for programming and debugging the device and I am using Ac6 STM32 system workbench with Eclipse IDE.

I solved the reprogramming problem by using ST link utility software. I was able to connect the chip, read the option bytes through the software and set the corrupted fields accordingly. After that I erased the complete chip and reprogrammed the chip with the help of “.bin” generated by Eclipse. Once done I checked the same with Eclipse IDE if I could program or debug the chip and yes I could.