c - 在FLASH存储器底部放一个bootloader程序

标签 c bootloader stm32 linker-scripts

我尝试为 STM32L1 系列卡创建自定义引导加载程序,我需要将引导加载程序代码放在闪存底部。然后我可以正确地闪现我的内存。 我知道它可以在链接脚本中指定,但我不知道该怎么做。 我这样声明我的引导加载程序部分:

  .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;
}

关于c - 在FLASH存储器底部放一个bootloader程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30780099/

相关文章:

c++ - while 循环有两个参数吗?

c - 需要递归函数的解决方案

c - 来自 fgets() 的段错误

计算整数 C 中 1 的数量

assembly - 使用 int13h 从软盘加载段

assembly - 字符串打印机不打印换行符

c - 编译器是否在作用域中使用堆栈变量的相对地址?

c - "multiple definition of first defined here"。 STM32、AC6工作室

c - USART 到 4MBps!如何? STM32L151xx

assembly - 为什么要清除方向标志