博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Feescale K60开发笔记16: k60 bootloader应用程序的配置
阅读量:2041 次
发布时间:2019-04-28

本文共 3476 字,大约阅读时间需要 11 分钟。

    本日志介绍K60 bootlader应用程序的配置方法。
    
A bootloader is a small piece of software that allows the user 
to download/update either code or data into flash memory.
The communication layer between the MCU and the host, 
which contains the new application binary, might differ 
depending on the use case. This communication interface 
could be SPI I2C, Ethernet, and USB, etc. For this scenario,
use an Ethernet communication interface. The bootloader 
provided will work as a TFTP client and the DHCP feature 
will be used.(大意:bootloader是一段用户用于上传/下载代码和数据到flash中的程序,在主句与单片机之间的通讯层,可以根据不同的应用,传递不同的应用程序映像。通讯接口可以是SPI、I2C、以太网、USB或其它
。本bootloader基于以太网,具备DHCP特性,可和TFTP client通讯。
 
    K60的bootloader占用片内48KB的空间,应用bootloader后,其存储器分布如下图所示。
图片 
    
    0x00000000-0x0000BFFF用于存储bootlaoder代码,0x0000C000-0x00003FFF用于存储中断向量(在ROM中),0x0000C400-0x0007EFFF用于存储用户的应用程序(也就是说,我们需要通过bootloader下载到flash中的应用程序存储在这里),0x0007F000-0x0007FFFF用于存储bootloader的参数信息(这些信息application也可以更改)。0x1FFF0000-0x1FFF0410是RAM中的中断向量,bootlaoder本身会使用ROM中的中断向量,所以application必须将自身ROM中的中断向量拷贝到RAM中才可以使用,后面的RAM可以直接供应用程序使用。
    将应用程序改为可通过bootloader下载的application,需经过以下步骤:
    (1)对application进行严格测试。
    (2)下载bootloader到芯片中。
    (3)更改application的发散文件,主要是防止重叠发生,预留出前48KB空间供bootloader使用,后2K空间存储bootloader的参数。对于RAM需要预留出
0x1FFF0000-0x1FFF0410空间,用以存储中断向量。
#! armcc -E
#define INTFLASH_END_ADDR       0x00080000
#define INTFLASH_BASE_ADDR      0x00000000
#define INTFLASH_SIZE           (INTFLASH_END_ADDR - INTFLASH_BASE_ADDR)
#define FLASHX_SECT_SIZE        (0x800)
#define MY_ALIGN(address, alignment) ((address + (alignment-1)) AND ~(alignment-1))
LOAD_REGION_INTFLASH INTFLASH_BASE_ADDR INTFLASH_SIZE
{
    VECTORS INTFLASH_BASE_ADDR
    {
        vectors.o (.vectors_rom,+FIRST)
        vectors.o (.cfmconfig)
    }
    CODE +0
    {
        * (InRoot$$Sections)      ; All library sections for example, __main.o,
                                  ; __scatter*.o, __dc*.o, and * Region$$Table
        * (KERNEL)
        * (TEXT)
        * (+RO)
    }
    USEDFLASH_END MY_ALIGN(ImageLimit(CODE), FLASHX_SECT_SIZE) EMPTY 0x4
    {
    }
    RAM_VECTORS 0x1FFF0000 ; For ram vector table. Used when  MQX_ROM_VECTORS is set to zero.
    {
        vectors.o (.vectors_ram)
    }
    
    NOUSER +0
    {
        * (.nouser)
    }
    ROUSER MY_ALIGN(ImageLimit(NOUSER), 32)
    {
        * (.rouser)
    }
    RWUSER MY_ALIGN(ImageLimit(ROUSER), 32)
    {
        * (.rwuser)
    }
    DATA MY_ALIGN(ImageLimit(RWUSER), 32)
    {
        * (+RW)
        * (+ZI)
    }
    USB_BDT MY_ALIGN(ImageLimit(DATA), 512)
    {
        * (.usb_bdt)
    }
    KERNEL_DATA_START MY_ALIGN(ImageLimit(USB_BDT), 0x10)
    {
        * (KERNEL_DATA_START)     ; start of kernel data
    }
    KERNEL_DATA_END 0x2000FFF0      ; RAM_END
    {
        * (KERNEL_DATA_END)     ; end of kernel data
    }
    ; mem_init writes a storeblock_struct at the end of kernel data,
    ; max size 32 bytes, so use 0x100 offset
    BOOT_STACK_ADDR 0x2000FEF0
    {
        * (BOOT_STACK)
    }
}
 
    (4)在应用程序的起始代码中,将ROM中的中断向量拷贝到RAM中,这点比较难,涉及底层的程序,我也是在这里浪费了大量的时间,并且差点就要放弃,好在功夫不负有心人,最终还是调试出来了。拷贝ROM中的中断向量到RAM中的程序,要在main函数的调用前完成,可以用汇编完成,也可以用C完成,下面给出一段写好的示例程序,这段程序感觉上还可以读懂,需要注意的是,复制完成后,需要更改中断向量偏移寄存器。当然也可在这个示例程序上,完成应用程序的设计,这样就相对比较简单了。
    uint32 n;
    
    /* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */  
    extern uint32 __vector_table[];
    /* Copy the vector table to RAM */
    if ((uint32 *)FNET_CFG_CPU_VECTOR_TABLE != __vector_table)
    {
        uint32 *vector_ram = (uint32 *)FNET_CFG_CPU_VECTOR_TABLE;
        for (n = 0; n < 0x410; n++)
        {
            *vector_ram++= __vector_table[n];
        }
    }
    /* Point the VTOR to the new copy of the vector table */
    write_vtor((uint32)FNET_CFG_CPU_VECTOR_TABLE);
    我的项目应用,是在MQX操作系统上完成的,原本认为会很麻烦,而且很少有文档加以介绍,后来偶然发现了MQX中有这样一个宏:MQX_ROM_VECTORS,将其设为1,中断向量在ROM中,将其设为0,中断向量在RAM中,非常简单,现在可以再回去查看一下,发散文件的RAM起始点,相信大家就明白了。更改了
MQX_ROM_VECTORS宏后,需要对BSP和PSP重新编译,才能正常使用。
原创性文章,转载请注明出处 
 
CSDN:
 
你可能感兴趣的文章
5月11日-健身4-背部
查看>>
女性面试杂谈
查看>>
5月4日-健身1-下肢
查看>>
5月9日-健身3-下肢
查看>>
5月13日-健身5-胸部
查看>>
《一问一世界》
查看>>
6月15日-健身16
查看>>
6月24日-健身20
查看>>
6月28日-健身21
查看>>
7月4日-健身23
查看>>
7月18日-自己健身1
查看>>
会心一笑和喋喋不休
查看>>
超级英雄
查看>>
夏洛很幸福
查看>>
成长背后的惨痛代价
查看>>
一段永远无法磨灭的记忆
查看>>
2017年4月28日lab talk
查看>>
面试前有用的突击
查看>>
6月13日-健身15
查看>>
6月17日-健身17
查看>>