前面了解了一些Flash结构和中断重映射之后,现在我们来用MPLAB X IDE自带插件MCC生成Boot代码。
打开MPLAB X IDE开发环境,点击Tools->Embeded ->MPLAB Code Configurator,打开MCC插件,“System Module”设置系统时钟和仿真口,根据需求自行选择。在“Device Resources”下面的Libraries找到16-bit Bootloader,点击“16-bit Bootloader”前面的“+”,添加到"Project Resources"。
Bootloader Settings
(1)设置通信方式(UART1)
前面有提到过,目前暂时只提供UART通信,后续会提供I2C/CAN的通信方式,在这里我们选择UART1,点击它之后会自动的弹出UART1外设的设置,采用默认的波特率或者自己选择都可以。在这里我设置38400,配置完之后在"Pin Manager"里面配置TX和RX端口,将U1RX配置为input,U1TX配置为output。
(2)分配Flash空间和中断重映射表
下图是配置Bootloader地址界面。
Bootloader End Address
此字段允许用户定义引导加载程序的最大大小,包括地址0x0和0x100处的中断表,实际代码从地址0x200开始。 Bootloader程序的大小必须是DSC闪存页面大小的倍数,具体取决于DSC型号,通常为512或1024。 应用程序代码的开始将放置在Bootloader结束之后的位置。 有关确定Bootloader大小的更多信息,请参见前面篇章介绍的Flash内存空间结构。
例如这里给Bootloader分配2页,所以选择Bootloader结束地址为0x001800,在这里一定要是0x800的倍数,如果不是则会报错。
Application Section Range Addresses
这些字段显示用户应用程序代码的计算出的开始和结束地址,该地址将始终紧随引Bootloader结束地址之后,且两者之间没有空格。 结束地址将是物理闪存的倒数第二页。 最后一页包含设备配置字。 Bootloader将不会修改此页面。
那么Application的开始地址就是0x1800,由于最后一页是配置字,所以结束地址为0x2B7FE。
Remapped Interrupt Vector Address
此字段显示计算出的用户的地址重新映射中断向量表的起始地址。 这里选择中断向量表的重映射地址从0x1A00开始。
Enable/Disable Bootloader Command
MCC提供了在Bootloader中提供启用或禁用4个引导程序命令生成的功能。启用后,将添加基本代码以在引导程序中执行命令。禁用后,命令将被完全删除,如果尝试执行这些命令,将导致“命令不支持”响应。
Enable RESET command:允许bootloader命令发出设备重置信息。这样,Bootloader在下载完命令后即可重置设备。某些情况下可能不希望启用此操作,而只允许开机复位。
Enable READ command:允许Bootloader和外部Bootloader应用程序读取用户代码的内容。这可能会对某些用户造成安全风险。
Enable CHECKSUM command:允许Bootloader和外部Bootloader应用程序对用户代码执行校验和。这可能会对某些用户造成安全风险。
Bootloader Verification
选择用于验证应用程序二进制文件的方法,后续会对改部分内容进行单独说明,在这里我们选择Not Blank这一选项。
Interrupt Vetor Table Remapping
remap_to_application-将中断直接跳转至用户应用程序。 跳转的每个中断将在用户重映射表中需要2条GOTO指令,因此每条占用6个字节的程序存储器。 对于以硬件实现的所有中断,这是最安全的选择。但是这种成本高,需要的内存空间大。
keep_in_bootloader-此选项会将中断保留在引导程序中。 如果定义了中断功能,它将仅作用于该功能。 如果未定义,它将跳转到默认中断处理函数。
remap_to_application_default-将中断直接跳转到用户应用程序的默认中断处理程序,而不是指定的唯一中断向量。 该选项对于应用程序不希望使用的中断很有用。 由于通过remap_to_application选项跳转的每个中断都占用2个指令字,因此跳转所有可能的中断的成本可能很高。 使用此选项跳转的中断不会占用任何其他代码空间来进行跳转。 由于多个中断将被跳转到同一向量,因此用户代码必须检查触发了哪个中断以进行相应的处理。
作为示例,此处采用默认的配置,后续会针对不用的配置进行单独说明,比如在Boot区产生中断。
进行完上述的配置,点击“Generate”产生代码,如下:
为了验证Boot区的程序执行,增加一个LED闪烁的代码, 在main.c里面增加。
同时在boot_demo.c文件RunBootLoader()函数里面进行调用。
编译OK后将整个代码烧录到MCU里面,会发现LED再进行闪烁,说明程序运行成功。
在Bootloader程序中加入按键的操做,当MCU上电或者复位后如果按键有效,则会进入bootloader程序运行,否则会进入application程序运行。设置bootloader程序运行时的闪烁频率和application运行的不一致,以此来判断在哪个区间运行程序。
至此,采用MCC配置的Bootloader程序产生完成,接下来是进行Application的配置。