User Tools

Site Tools


manual:ports:armcm3_stm32

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
manual:ports:armcm3_stm32 [2011/11/26 11:18]
voorburg
manual:ports:armcm3_stm32 [2022/11/07 11:27] (current)
voorburg [Checksum location]
Line 1: Line 1:
-====== ARM Cortex-M3 for STM32 ======+====== ARM Cortex-M3 for STM32F1xx ​======
  
 ===== Vector table location ===== ===== Vector table location =====
 +
 The bootloader itself occupies the location where normally the user program'​s vector table is located. The vector table in the user program therefore needs to be relocated. The bootloader implementation is such that the user program'​s vector table must be located at address 0x08002000 instead of the standard 0x08000000. ​ The bootloader itself occupies the location where normally the user program'​s vector table is located. The vector table in the user program therefore needs to be relocated. The bootloader implementation is such that the user program'​s vector table must be located at address 0x08002000 instead of the standard 0x08000000. ​
  
 The vector table relocation can be achieved by changing the ROM start address in the linker descriptor file. Refer to the demo program for an example. The vector table relocation can be achieved by changing the ROM start address in the linker descriptor file. Refer to the demo program for an example.
  
-{{:​manual:​ports:​stm32_linker_script_prog.gif?​ |}}+{{:​manual:​ports:​stm32_linker_script_prog.gif?​|}} 
 + 
 +Note that the space needed by the bootloader could be different than 0x2000 (8 kbyte), depending on the selected communication interface and compiler. The demo programs are working examples that you can refer to, to determine the exact vector table relocation. 
 + 
 +Before the bootloader starts your firmware, it automatically reconfigured the start address of the interrupt vector table. Unfortunately,​ the default system initialization function SystemInit() from ST's driver library, overwrites this change. This function is implemented in source file system_stm32f1xx.c. To correct this you need to explicitly set the start address of the interrupt vector table as the first thing in function main(). Here is an example of how this can be done when using STM32CubeIDE:​ 
 + 
 +Add the following function to main.c: 
 + 
 +<code c> 
 +static void VectorBase_Config(void) 
 +
 +  /* The constant array with vectors of the vector table is declared externally in the 
 +   * c-startup code. 
 +   */ 
 +  extern const unsigned long g_pfnVectors[];​ 
 + 
 +  /* Remap the vector table to where the vector table is located for this program. */ 
 +  SCB->​VTOR = (unsigned long)&​g_pfnVectors[0];​ 
 +
 +</​code>​  
 + 
 +And call this newly added function at the start of main(): 
 + 
 +<code c> 
 +int main(void) 
 +
 +  /* Configure the vector table base address. */ 
 +  VectorBase_Config();​ 
 + 
 +  ... 
 + 
 +
 +</​code>​
  
 ===== Checksum location ===== ===== Checksum location =====
-A 32-bit checksum value if programmed by the bootloader at the end of a programming session. Upon startup, the bootloader verifies the correctness of this checksum to determine if a present user program is present and can be started. 
  
-The user program must reserve space for this 32-bit checksum value. The bootloader programs this value at the end of the interrupt ​vector table. To reserve this space, simply enter one extra dummy entry into the interrupt vector table. This reserves space for the checksum at memory address ​0x08000150. Refer to the demo program for an example.+32-bit checksum value is programmed by the bootloader at the end of a programming sessionUpon startup, the bootloader verifies the correctness of this checksum to determine if a valid user program is present and can be started. 
 + 
 +The bootloader programs this value at the end of the user program'​s ​vector table. Its exact location is configured by macro BOOT_FLASH_VECTOR_TABLE_CS_OFFSET in flash.c. The vector table size can vary based on the microcontroller derivative you are using. Please verify that the default value of BOOT_FLASH_VECTOR_TABLE_CS_OFFSET is correct. If not, you can simply override the value by adding the macro with the correct value to the blt_conf.h configuration header file. 
 + 
 +The user program must reserve space for this 32-bit checksum value. To reserve this space, simply enter one extra dummy entry into the interrupt vector table. This reserves space for the checksum at memory address: flash base address + flash reserved for bootloader ​ + FLASH_VECTOR_TABLE_CS_OFFSET. Refer to the demo program for an example.
  
 {{:​manual:​ports:​stm32_checksum_reservation.gif?​ |}} {{:​manual:​ports:​stm32_checksum_reservation.gif?​ |}}
-\\+
 ===== Stackpointer initialization ===== ===== Stackpointer initialization =====
 +
 On the ARM Cortex-M3 the first entry into the vector table holds the initialization value for the stackpointer,​ which is automatically loaded into the CPU's stackpointer register upon reset. On the ARM Cortex-M3 the first entry into the vector table holds the initialization value for the stackpointer,​ which is automatically loaded into the CPU's stackpointer register upon reset.
  
manual/ports/armcm3_stm32.1322302718.txt.gz · Last modified: 2019/09/24 22:14 (external edit)