Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将引导加载程序放在闪存底部_C_Bootloader_Stm32_Linker Scripts - Fatal编程技术网

C 将引导加载程序放在闪存底部

C 将引导加载程序放在闪存底部,c,bootloader,stm32,linker-scripts,C,Bootloader,Stm32,Linker Scripts,我试图为STM32L1系列卡创建一个自定义引导加载程序,我需要将引导加载程序代码放在闪存的底部。然后我可以正确地闪现我的记忆。 我知道它可以在链接器纸条中指定,但我不知道如何做到这一点。 我这样声明了我的引导加载程序部分: .bootsection : { . = ALIGN(4); KEEP(*(.bootsection)) /* Bootloader code */ . = ALIGN(4); } >FLASH MEMORY { FLASH (

我试图为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
}
我的记忆是这样设置的:

  .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
这是我的启动代码,我编写了flash程序,但擦除程序还没有编写

#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;
}
#定义MY_BL_函数u属性u((.section(.bootssection)))
void引导加载程序(void)MY_BL_函数;
uint8_t Flash_Write(uint32_t StartAddress、uint8_t*p、uint32_t Size)我的BL_函数;
void引导加载程序(void){
字符缓冲区[1000];
int i=0;
/*测试是否进入引导加载程序,切换led并向usart发送字符串*/
GPIO_切换位(GPIOA、GPIO_引脚_5);
做{
缓冲区[i]=Uart2ReadChar();
i++;
}while(buffer[i]!='\0');
SendString(缓冲区,USART2);
}
uint8\u t闪存写入(uint32\u t起始地址、uint8\u t*p、uint32\u t大小)
{
uint32_t idx;
uint32地址;
__IO闪烁状态=闪烁完成;
地址=起始地址;
/*解锁闪存程序存储器*/
闪光解锁();
/*清除所有挂起的标志*/
闪动清除标志(闪动清除标志)|
闪光标志|
闪光标志|
闪光标志|
闪光信号灯(OPTVERR);
while(地址<起始地址+尺寸)
{
状态=闪存快速编程字(地址*(uint32\u t*)p);
地址=地址+4;
p=p+4;
如果(状态!=FLASH_COMPLETE)返回状态;
}
/*锁定闪存程序存储器*/
闪光锁();
返回(uint8_t)状态;
}

可能尝试将
>FLASH
更改为
>FLASH AT>FLASH
类似于>FLASH AT 0x0…?这不是正确的链接器脚本语法。。。我认为这样做会给你一个语法错误。而且,我觉得你的问题有点不清楚。你能解释一下为什么你当前的链接器脚本不起作用吗?还有,
内存是怎么回事?为什么长度为0?这个链接器脚本正在工作,我没有给你所有的脚本代码。我不知道这个内存是什么,我想我可以删除它。你的Flash\u Write()代码中似乎有一个bug。如果函数FLASH_FastProgramWord()返回不同的FLASH_COMPLETE值,则函数退出并保持闪存解锁。