c – 将引导加载程序放在FLASH存储器的底部

我尝试为STM32L1系列卡创建一个自定义引导程序,我需要将我的引导程序代码放在我的闪存底部.然后我可以正确地闪烁我的记忆.

我知道它可以在链接器脚本中指定,但我不知道如何做到这一点.

我声明我的bootloader部分是这样的:

  .bootsection :
  {
    . = ALIGN(4);
    KEEP(*(.bootsection)) /* Bootloader code */
    . = ALIGN(4);
  } >FLASH

我的记忆设置如下:

MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 512K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 80K
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
}

有人对命令有所了解吗?

最佳答案 这是我的链接器脚本,我尝试了一些新的内存部分

 MEMORY
    {
      FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 510K
      MEM_BOOT (rx)   : ORIGIN = 0x0807CFFE, LENGTH = 2K
      RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 80K
      MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
    }

    /* Define output sections */
    SECTIONS
    {
      /* The startup code goes first into FLASH */
      .isr_vector :
      {
        . = ALIGN(4);
        KEEP(*(.isr_vector)) /* Startup code */
        . = ALIGN(4);
      } >FLASH


      .bootsection :
      {
        . = ALIGN(4);
        KEEP(*(.bootsection)) /* Bootloader code */
        . = ALIGN(4);
      } >MEM_BOOT

这是我的启动代码,我写了闪存程序,但擦除程序尚未编写.

#define MY_BL_FUNCTIONS __attribute__((section(".bootsection")))

void BootLoader(void) MY_BL_FUNCTIONS;
uint8_t Flash_Write ( uint32_t StartAddress, uint8_t *p, uint32_t Size ) MY_BL_FUNCTIONS;

void BootLoader(void) {
    char buffer[1000];
    int i = 0;
    /*test if we enter the bootloader , toggle the led and send a string to the usart */
    GPIO_ToggleBits(GPIOA, GPIO_Pin_5);
    do {
        buffer[i] = Uart2ReadChar();
        i++;
    } while (buffer[i] != '\0');

    SendString(buffer,USART2);
}

uint8_t Flash_Write ( uint32_t StartAddress, uint8_t *p, uint32_t Size )
{
      uint32_t idx;
      uint32_t Address;
      __IO FLASH_Status status = FLASH_COMPLETE;

      Address = StartAddress;

      /* Unlock the FLASH Program memory */
      FLASH_Unlock ( );

      /* Clear all pending flags */
      FLASH_ClearFlag ( FLASH_FLAG_EOP     |
                        FLASH_FLAG_WRPERR  |
                        FLASH_FLAG_PGAERR  |
                        FLASH_FLAG_SIZERR  |
                        FLASH_FLAG_OPTVERR );

      while  ( Address < StartAddress + Size )
      {
            status = FLASH_FastProgramWord ( Address,  *(uint32_t *)p );
            Address = Address + 4;
            p = p + 4;
            if ( status != FLASH_COMPLETE ) return status;
      }

      /* Lock the FLASH Program memory */
      FLASH_Lock ( );

      return (uint8_t)status;
}
点赞