cancel
Showing results for 
Search instead for 
Did you mean: 

place flash-related functions in the ram in st,32f030k6t6

jdo
Associate II

estoy utilizando flash para escribir y leer mientras tengo un bluetooth conectado por serial DMA, cuando intento escribir en flash en la consola de stm32cubeide aparece "Target is not responding, retrying..." mientras que mi serial de dma con el bluetooh sigue comunicando, pero aveces cuando usao otras funciones del bluetooh que tengo que escribir nuevamente en la flash se detiene todo. estoy desabilitando interrupciones antes de grabar y ayuda un poco, pero quiero pasar las funciones para RAM como dice algunas informaciones. solo que no tengo idea de como se hace, donde onsigo el enlazador? que informacion necesito para modificar el enlazador? que informacion necesito para modificar RAMfunc? estoy usando un stm32f030k6t6, ya lei la nota de aplicacion para escribir en flash sin interrupcion, pero no se ocmo modificar el enlazador ni como hacer RAMfunc. agradezco una sugerencia

6 REPLIES 6

"I am using flash to write and read while I have a bluetooth connected by serial DMA, when I try to write to flash in the stm32cubeide console it appears "Target is not responding, retrying..." while my dma serial with bluetooth continues to communicate, But sometimes when I use other bluetooth functions that I have to write again in the flash, everything stops. I am disabling interrupts before recording and it helps a bit, but I want to pass the functions to RAM as some information says. I just have no idea how to do it, where do I get the linker? What information do I need to modify the linker? What information do I need to modify RAMfunc? I'm using a stm32f030k6t6, I already read the application note to write to flash without interruption, but I don't know how to modify the linker or how to do RAMfunc. I appreciate a suggestion"

Ok, the Linker Script should be able to direct content into RAM, basically via attributes/sections related to the functions, you'd need code in startup.s to move them into RAM. Less work in Keil, as this is all mechanized via tables the linker builds for the scatter loader.

But, probably not a lot of code space available to do this with this chip, and there are ramifications about what other functions/libraries end up getting called, and interrupts, etc.

Generally it might be simpler to write small routines in assembler that you copy into RAM, and have much better control over in terms of what they do, and what else they call.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
jdo
Associate II

So, do I have to modify this file?

/**
  ******************************************************************************
  * @file      startup_stm32f030x6.s
  * @author    MCD Application Team
  * @brief     STM32F030x4/STM32F030x6 devices vector table for GCC toolchain.
  *            This module performs:
  *                - Set the initial SP
  *                - Set the initial PC == Reset_Handler,
  *                - Set the vector table entries with the exceptions ISR address
  *                - Branches to main in the C library (which eventually
  *                  calls main()).
  *            After Reset the Cortex-M0 processor is in Thread mode,
  *            priority is Privileged, and the Stack is set to Main.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
 
  .syntax unified
  .cpu cortex-m0
  .fpu softvfp
  .thumb
 
.global g_pfnVectors
.global Default_Handler
 
/* start address for the initialization values of the .data section.
defined in linker script */
.word _sidata
/* start address for the .data section. defined in linker script */
.word _sdata
/* end address for the .data section. defined in linker script */
.word _edata
/* start address for the .bss section. defined in linker script */
.word _sbss
/* end address for the .bss section. defined in linker script */
.word _ebss
 
  .section .text.Reset_Handler
  .weak Reset_Handler
  .type Reset_Handler, %function
Reset_Handler:
  ldr   r0, =_estack
  mov   sp, r0          /* set stack pointer */
 
/* Copy the data segment initializers from flash to SRAM */
  ldr r0, =_sdata
  ldr r1, =_edata
  ldr r2, =_sidata
  movs r3, #0
  b LoopCopyDataInit
 
CopyDataInit:
  ldr r4, [r2, r3]
  str r4, [r0, r3]
  adds r3, r3, #4
 
LoopCopyDataInit:
  adds r4, r0, r3
  cmp r4, r1
  bcc CopyDataInit
  
/* Zero fill the bss segment. */
  ldr r2, =_sbss
  ldr r4, =_ebss
  movs r3, #0
  b LoopFillZerobss
 
FillZerobss:
  str  r3, [r2]
  adds r2, r2, #4
 
LoopFillZerobss:
  cmp r2, r4
  bcc FillZerobss
 
/* Call the clock system intitialization function.*/
  bl  SystemInit
/* Call static constructors */
  bl __libc_init_array
/* Call the application's entry point.*/
  bl main
 
LoopForever:
    b LoopForever
 
 
.size Reset_Handler, .-Reset_Handler
 
/**
 * @brief  This is the code that gets called when the processor receives an
 *         unexpected interrupt.  This simply enters an infinite loop, preserving
 *         the system state for examination by a debugger.
 *
 * @param  None
 * @retval : None
*/
    .section .text.Default_Handler,"ax",%progbits
Default_Handler:
Infinite_Loop:
  b Infinite_Loop
  .size Default_Handler, .-Default_Handler
/******************************************************************************
*
* The minimal vector table for a Cortex M0.  Note that the proper constructs
* must be placed on this to ensure that it ends up at physical address
* 0x0000.0000.
*
******************************************************************************/
   .section .isr_vector,"a",%progbits
  .type g_pfnVectors, %object
  .size g_pfnVectors, .-g_pfnVectors
 
 
g_pfnVectors:
  .word  _estack
  .word  Reset_Handler
  .word  NMI_Handler
  .word  HardFault_Handler
  .word  0
  .word  0
  .word  0
  .word  0
  .word  0
  .word  0
  .word  0
  .word  SVC_Handler
  .word  0
  .word  0
  .word  PendSV_Handler
  .word  SysTick_Handler
  .word  WWDG_IRQHandler                   /* Window WatchDog              */
  .word  0                                 /* Reserved                     */
  .word  RTC_IRQHandler                    /* RTC through the EXTI line    */
  .word  FLASH_IRQHandler                  /* FLASH                        */
  .word  RCC_IRQHandler                    /* RCC                          */
  .word  EXTI0_1_IRQHandler                /* EXTI Line 0 and 1            */
  .word  EXTI2_3_IRQHandler                /* EXTI Line 2 and 3            */
  .word  EXTI4_15_IRQHandler               /* EXTI Line 4 to 15            */
  .word  0                                 /* Reserved                     */
  .word  DMA1_Channel1_IRQHandler          /* DMA1 Channel 1               */
  .word  DMA1_Channel2_3_IRQHandler        /* DMA1 Channel 2 and Channel 3 */
  .word  DMA1_Channel4_5_IRQHandler        /* DMA1 Channel 4 and Channel 5 */
  .word  ADC1_IRQHandler                   /* ADC1                         */
  .word  TIM1_BRK_UP_TRG_COM_IRQHandler    /* TIM1 Break, Update, Trigger and Commutation */
  .word  TIM1_CC_IRQHandler                /* TIM1 Capture Compare         */
  .word  0                                 /* Reserved                     */
  .word  TIM3_IRQHandler                   /* TIM3                         */
  .word  0                                 /* Reserved                     */
  .word  0                                 /* Reserved                     */
  .word  TIM14_IRQHandler                  /* TIM14                        */
  .word  0                                 /* Reserved                     */
  .word  TIM16_IRQHandler                  /* TIM16                        */
  .word  TIM17_IRQHandler                  /* TIM17                        */
  .word  I2C1_IRQHandler                   /* I2C1                         */
  .word  0                                 /* Reserved                     */
  .word  SPI1_IRQHandler                   /* SPI1                         */
  .word  0                                 /* Reserved                     */
  .word  USART1_IRQHandler                 /* USART1                       */
  .word  0                                 /* Reserved                     */
  .word  0                                 /* Reserved                     */
  .word  0                                 /* Reserved                     */
  .word  0                                 /* Reserved                     */
 
/*******************************************************************************
*
* Provide weak aliases for each Exception handler to the Default_Handler.
* As they are weak aliases, any function with the same name will override
* this definition.
*
*******************************************************************************/
 
  .weak      NMI_Handler
  .thumb_set NMI_Handler,Default_Handler
 
  .weak      HardFault_Handler
  .thumb_set HardFault_Handler,Default_Handler
 
  .weak      SVC_Handler
  .thumb_set SVC_Handler,Default_Handler
 
  .weak      PendSV_Handler
  .thumb_set PendSV_Handler,Default_Handler
 
  .weak      SysTick_Handler
  .thumb_set SysTick_Handler,Default_Handler
 
  .weak      WWDG_IRQHandler
  .thumb_set WWDG_IRQHandler,Default_Handler
 
  .weak      RTC_IRQHandler
  .thumb_set RTC_IRQHandler,Default_Handler
 
  .weak      FLASH_IRQHandler
  .thumb_set FLASH_IRQHandler,Default_Handler
 
  .weak      RCC_IRQHandler
  .thumb_set RCC_IRQHandler,Default_Handler
 
  .weak      EXTI0_1_IRQHandler
  .thumb_set EXTI0_1_IRQHandler,Default_Handler
 
  .weak      EXTI2_3_IRQHandler
  .thumb_set EXTI2_3_IRQHandler,Default_Handler
 
  .weak      EXTI4_15_IRQHandler
  .thumb_set EXTI4_15_IRQHandler,Default_Handler
 
  .weak      DMA1_Channel1_IRQHandler
  .thumb_set DMA1_Channel1_IRQHandler,Default_Handler
 
  .weak      DMA1_Channel2_3_IRQHandler
  .thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler
 
  .weak      DMA1_Channel4_5_IRQHandler
  .thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler
 
  .weak      ADC1_IRQHandler
  .thumb_set ADC1_IRQHandler,Default_Handler
 
  .weak      TIM1_BRK_UP_TRG_COM_IRQHandler
  .thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler
 
  .weak      TIM1_CC_IRQHandler
  .thumb_set TIM1_CC_IRQHandler,Default_Handler
 
  .weak      TIM3_IRQHandler
  .thumb_set TIM3_IRQHandler,Default_Handler
 
  .weak      TIM14_IRQHandler
  .thumb_set TIM14_IRQHandler,Default_Handler
 
  .weak      TIM16_IRQHandler
  .thumb_set TIM16_IRQHandler,Default_Handler
 
  .weak      TIM17_IRQHandler
  .thumb_set TIM17_IRQHandler,Default_Handler
 
  .weak      I2C1_IRQHandler
  .thumb_set I2C1_IRQHandler,Default_Handler
 
  .weak      SPI1_IRQHandler
  .thumb_set SPI1_IRQHandler,Default_Handler
 
  .weak      USART1_IRQHandler
  .thumb_set USART1_IRQHandler,Default_Handler
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 

jdo
Associate II
  1. i find :
  2. __attribute__ ((section(".RamFunc")));

MM..1
Chief II

I perfectly dont understand your idea , but maybe try read AN2606 about system ROM bootloader, and UART from bluetooth for example as apk on Gplay StmDfuBlue - Apps on Google Play

jdo
Associate II

excuse me, i don´t know the linker, but i like put uart dma in RAM, because i have problem write flash and using uart serial with bluetooth. the bus tall when write in flash and serial uart disconnect.

/*
******************************************************************************
**
** @file        : LinkerScript.ld
**
** @author      : Auto-generated by STM32CubeIDE
**
** @brief       : Linker script for STM32F030K6Tx Device from STM32F0 series
**                      32Kbytes FLASH
**                      4Kbytes RAM
**
**                Set heap size, stack size and stack location according
**                to application requirements.
**
**                Set memory bank area and size if external memory is used
**
**  Target      : STMicroelectronics STM32
**
**  Distribution: The file is distributed as is, without any warranty
**                of any kind.
**
******************************************************************************
** @attention
**
** Copyright (c) 2022 STMicroelectronics.
** All rights reserved.
**
** This software is licensed under terms that can be found in the LICENSE file
** in the root directory of this software component.
** If no LICENSE file comes with this software, it is provided AS-IS.
**
******************************************************************************
*/
 
/* Entry Point */
ENTRY(Reset_Handler)
 
/* Highest address of the user mode stack */
_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */
 
_Min_Heap_Size = 0x200 ; /* required amount of heap */
_Min_Stack_Size = 0x400 ; /* required amount of stack */
 
/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 4K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 32K
}
 
/* Sections */
SECTIONS
{
  /* The startup code into "FLASH" Rom type memory */
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(4);
  } >FLASH
 
  /* The program code and other data into "FLASH" Rom type memory */
  .text :
  {
    . = ALIGN(4);
    *(.text)           /* .text sections (code) */
    *(.text*)          /* .text* sections (code) */
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    *(.eh_frame)
 
    KEEP (*(.init))
    KEEP (*(.fini))
 
    . = ALIGN(4);
    _etext = .;        /* define a global symbols at end of code */
  } >FLASH
 
  /* Constant data into "FLASH" Rom type memory */
  .rodata :
  {
    . = ALIGN(4);
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(4);
  } >FLASH
 
  .ARM.extab   : {
    . = ALIGN(4);
    *(.ARM.extab* .gnu.linkonce.armextab.*)
    . = ALIGN(4);
  } >FLASH
 
  .ARM : {
    . = ALIGN(4);
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
    . = ALIGN(4);
  } >FLASH
 
  .preinit_array     :
  {
    . = ALIGN(4);
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
    . = ALIGN(4);
  } >FLASH
 
  .init_array :
  {
    . = ALIGN(4);
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
    . = ALIGN(4);
  } >FLASH
 
  .fini_array :
  {
    . = ALIGN(4);
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
    . = ALIGN(4);
  } >FLASH
 
  /* Used by the startup to initialize data */
  _sidata = LOADADDR(.data);
 
  /* Initialized data sections into "RAM" Ram type memory */
  .data :
  {
    . = ALIGN(4);
    _sdata = .;        /* create a global symbol at data start */
    *(.data)           /* .data sections */
    *(.data*)          /* .data* sections */
    *(.RamFunc)        /* .RamFunc sections */
    *(.RamFunc*)       /* .RamFunc* sections */
 
    . = ALIGN(4);
    _edata = .;        /* define a global symbol at data end */
 
  } >RAM AT> FLASH
 
  /* Uninitialized data section into "RAM" Ram type memory */
  . = ALIGN(4);
  .bss :
  {
    /* This is used by the startup in order to initialize the .bss section */
    _sbss = .;         /* define a global symbol at bss start */
    __bss_start__ = _sbss;
    *(.bss)
    *(.bss*)
    *(COMMON)
 
    . = ALIGN(4);
    _ebss = .;         /* define a global symbol at bss end */
    __bss_end__ = _ebss;
  } >RAM
 
  /* User_heap_stack section, used to check that there is enough "RAM" Ram  type memory left */
  ._user_heap_stack :
  {
    . = ALIGN(8);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(8);
  } >RAM
 
  /* Remove information from the compiler libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }
 
  .ARM.attributes 0 : { *(.ARM.attributes) }
}

jdo
Associate II

i want put the uart dma in ram because i have flash write in real time, this is problem tall bus