msp430fr2155 在线升级(一)

news2024/10/6 20:37:17

前言:由于单片机如果不支持USB等方式在线升级,每次升级会设计拆机升级单片机,这对于一个成熟的产品是很鸡肋的。所以记录一下本次研发升级功能的过程以及所需要的问题。

一、升级程序设计

在这里插入图片描述

二、内存重新分配

1.芯片原有内存分配

原有内存分配主要关心FRAM到中断结束,从0x8000~0xFFFF

/******************************************************************************
*
* Copyright (C) 2012 - 2021 Texas Instruments Incorporated - http://www.ti.com/
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
*  Redistributions of source code must retain the above copyright
*  notice, this list of conditions and the following disclaimer.
*
*  Redistributions in binary form must reproduce the above copyright
*  notice, this list of conditions and the following disclaimer in the
*  documentation and/or other materials provided with the
*  distribution.
*
*  Neither the name of Texas Instruments Incorporated nor the names of
*  its contributors may be used to endorse or promote products derived
*  from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Default linker command file for Texas Instruments MSP430FR2155
*
*****************************************************************************/

/******************************************************************************/
/*                                                                            */
/*   Usage:  lnk430 <obj files...>    -o <out file> -m <map file> lnk.cmd     */
/*           cl430  <src files...> -z -o <out file> -m <map file> lnk.cmd     */
/*                                                                            */
/*----------------------------------------------------------------------------*/
/* These linker options are for command line linking only.  For IDE linking,  */
/* you should set your linker options in Project Properties                   */
/* -c                                               LINK USING C CONVENTIONS  */
/* -stack  0x0100                                   SOFTWARE STACK SIZE       */
/* -heap   0x0100                                   HEAP AREA SIZE            */
/*                                                                            */
/*----------------------------------------------------------------------------*/
/* 1.213 */
/*----------------------------------------------------------------------------*/

/****************************************************************************/
/* SPECIFY THE SYSTEM MEMORY MAP                                            */
/****************************************************************************/

MEMORY
{
    TINYRAM                 : origin = 0x6, length = 0x1A
    BSL0                    : origin = 0x1000, length = 0x800
    INFO                    : origin = 0x1800, length = 0x200
    TLVMEM                  : origin = 0x1A00, length = 0x200
    BOOTCODE                : origin = 0x1C00, length = 0x400
    RAM                     : origin = 0x2000, length = 0x1000
    FRAM                    : origin = 0x8000, length = 0x7F80
    ROMLIB                  : origin = 0xFAC00, length = 0x5000
    BSL1                    : origin = 0xFFC00, length = 0x400
    JTAGSIGNATURE           : origin = 0xFF80, length = 0x0004, fill = 0xFFFF
    BSLSIGNATURE            : origin = 0xFF84, length = 0x0004, fill = 0xFFFF
    BSLCONFIGURATIONSIGNATURE: origin = 0xFF88, length = 0x0002, fill = 0xFFFF
    BSLCONFIGURATION        : origin = 0xFF8A, length = 0x0002, fill = 0xFFFF
    BSLI2CADDRESS           : origin = 0xFFA0, length = 0x0002, fill = 0xFFFF
    INT00                   : origin = 0xFFA2, length = 0x0002
    INT01                   : origin = 0xFFA4, length = 0x0002
    INT02                   : origin = 0xFFA6, length = 0x0002
    INT03                   : origin = 0xFFA8, length = 0x0002
    INT04                   : origin = 0xFFAA, length = 0x0002
    INT05                   : origin = 0xFFAC, length = 0x0002
    INT06                   : origin = 0xFFAE, length = 0x0002
    INT07                   : origin = 0xFFB0, length = 0x0002
    INT08                   : origin = 0xFFB2, length = 0x0002
    INT09                   : origin = 0xFFB4, length = 0x0002
    INT10                   : origin = 0xFFB6, length = 0x0002
    INT11                   : origin = 0xFFB8, length = 0x0002
    INT12                   : origin = 0xFFBA, length = 0x0002
    INT13                   : origin = 0xFFBC, length = 0x0002
    INT14                   : origin = 0xFFBE, length = 0x0002
    INT15                   : origin = 0xFFC0, length = 0x0002
    INT16                   : origin = 0xFFC2, length = 0x0002
    INT17                   : origin = 0xFFC4, length = 0x0002
    INT18                   : origin = 0xFFC6, length = 0x0002
    INT19                   : origin = 0xFFC8, length = 0x0002
    INT20                   : origin = 0xFFCA, length = 0x0002
    INT21                   : origin = 0xFFCC, length = 0x0002
    INT22                   : origin = 0xFFCE, length = 0x0002
    INT23                   : origin = 0xFFD0, length = 0x0002
    INT24                   : origin = 0xFFD2, length = 0x0002
    INT25                   : origin = 0xFFD4, length = 0x0002
    INT26                   : origin = 0xFFD6, length = 0x0002
    INT27                   : origin = 0xFFD8, length = 0x0002
    INT28                   : origin = 0xFFDA, length = 0x0002
    INT29                   : origin = 0xFFDC, length = 0x0002
    INT30                   : origin = 0xFFDE, length = 0x0002
    INT31                   : origin = 0xFFE0, length = 0x0002
    INT32                   : origin = 0xFFE2, length = 0x0002
    INT33                   : origin = 0xFFE4, length = 0x0002
    INT34                   : origin = 0xFFE6, length = 0x0002
    INT35                   : origin = 0xFFE8, length = 0x0002
    INT36                   : origin = 0xFFEA, length = 0x0002
    INT37                   : origin = 0xFFEC, length = 0x0002
    INT38                   : origin = 0xFFEE, length = 0x0002
    INT39                   : origin = 0xFFF0, length = 0x0002
    INT40                   : origin = 0xFFF2, length = 0x0002
    INT41                   : origin = 0xFFF4, length = 0x0002
    INT42                   : origin = 0xFFF6, length = 0x0002
    INT43                   : origin = 0xFFF8, length = 0x0002
    INT44                   : origin = 0xFFFA, length = 0x0002
    INT45                   : origin = 0xFFFC, length = 0x0002
    RESET                   : origin = 0xFFFE, length = 0x0002
}

/****************************************************************************/
/* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY                              */
/****************************************************************************/

SECTIONS
{
    GROUP(ALL_FRAM)
    {
        GROUP(READ_WRITE_MEMORY)
        {
            .TI.persistent : {}              /* For #pragma persistent            */
            .cio           : {}              /* C I/O Buffer                      */
            .sysmem        : {}              /* Dynamic memory allocation area    */
        } PALIGN(0x0400), RUN_START(fram_rw_start) RUN_END(fram_rx_start)

        GROUP(READ_ONLY_MEMORY)
        {
            .cinit      : {}                   /* Initialization tables             */
            .pinit      : {}                   /* C++ constructor tables            */
            .binit      : {}                   /* Boot-time Initialization tables   */
            .init_array : {}                   /* C++ constructor tables            */
            .mspabi.exidx : {}                 /* C++ constructor tables            */
            .mspabi.extab : {}                 /* C++ constructor tables            */
            .const      : {}                   /* Constant data                     */
        }

        GROUP(EXECUTABLE_MEMORY)
        {
            .text       : {}                   /* Code                              */
            .text:_isr  : {}                   /* Code ISRs                         */
        }
    } > FRAM

    #ifdef __TI_COMPILER_VERSION__
        #if __TI_COMPILER_VERSION__ >= 15009000
            .TI.ramfunc : {} load=FRAM, run=RAM, table(BINIT)
        #endif
    #endif

    .jtagsignature      : {} > JTAGSIGNATURE
    .bslsignature       : {} > BSLSIGNATURE
    .bslconfigsignature : {} > BSLCONFIGURATIONSIGNATURE
    .bslconfig          : {} > BSLCONFIGURATION
    .bsli2caddress      : {} > BSLI2CADDRESS

    .bss        : {} > RAM                  /* Global & static vars              */
    .data       : {} > RAM                  /* Global & static vars              */
    .TI.noinit  : {} > RAM                  /* For #pragma noinit                */
    .stack      : {} > RAM (HIGH)           /* Software system stack             */

    .tinyram    : {} > TINYRAM              /* Tiny RAM                          */

    /* MSP430 INFO memory segments */
    .info : type = NOINIT{} > INFO


    /* MSP430 interrupt vectors */

    .int00       : {}               > INT00
    .int01       : {}               > INT01
    .int02       : {}               > INT02
    .int03       : {}               > INT03
    .int04       : {}               > INT04
    .int05       : {}               > INT05
    .int06       : {}               > INT06
    .int07       : {}               > INT07
    .int08       : {}               > INT08
    .int09       : {}               > INT09
    .int10       : {}               > INT10
    .int11       : {}               > INT11
    .int12       : {}               > INT12
    .int13       : {}               > INT13
    .int14       : {}               > INT14
    .int15       : {}               > INT15
    .int16       : {}               > INT16
    .int17       : {}               > INT17
    .int18       : {}               > INT18
    .int19       : {}               > INT19
    .int20       : {}               > INT20
    .int21       : {}               > INT21
    PORT4        : { * ( .int22 ) } > INT22 type = VECT_INIT
    PORT3        : { * ( .int23 ) } > INT23 type = VECT_INIT
    PORT2        : { * ( .int24 ) } > INT24 type = VECT_INIT
    PORT1        : { * ( .int25 ) } > INT25 type = VECT_INIT
    .int26       : {}               > INT26
    .int27       : {}               > INT27
    ECOMP0_ECOMP1: { * ( .int28 ) } > INT28 type = VECT_INIT
    ADC          : { * ( .int29 ) } > INT29 type = VECT_INIT
    EUSCI_B1     : { * ( .int30 ) } > INT30 type = VECT_INIT
    EUSCI_B0     : { * ( .int31 ) } > INT31 type = VECT_INIT
    EUSCI_A1     : { * ( .int32 ) } > INT32 type = VECT_INIT
    EUSCI_A0     : { * ( .int33 ) } > INT33 type = VECT_INIT
    WDT          : { * ( .int34 ) } > INT34 type = VECT_INIT
    RTC          : { * ( .int35 ) } > INT35 type = VECT_INIT
    TIMER3_B1    : { * ( .int36 ) } > INT36 type = VECT_INIT
    TIMER3_B0    : { * ( .int37 ) } > INT37 type = VECT_INIT
    TIMER2_B1    : { * ( .int38 ) } > INT38 type = VECT_INIT
    TIMER2_B0    : { * ( .int39 ) } > INT39 type = VECT_INIT
    TIMER1_B1    : { * ( .int40 ) } > INT40 type = VECT_INIT
    TIMER1_B0    : { * ( .int41 ) } > INT41 type = VECT_INIT
    TIMER0_B1    : { * ( .int42 ) } > INT42 type = VECT_INIT
    TIMER0_B0    : { * ( .int43 ) } > INT43 type = VECT_INIT
    UNMI         : { * ( .int44 ) } > INT44 type = VECT_INIT
    SYSNMI       : { * ( .int45 ) } > INT45 type = VECT_INIT
    .reset       : {}               > RESET  /* MSP430 reset vector         */

}
/****************************************************************************/
/* FRAM WRITE PROTECTION SEGMENT DEFINITONS                                 */
/****************************************************************************/

#ifdef _FRWP_ENABLE
    __mpu_enable=1;
    start_protection_offset_address = (fram_rx_start - fram_rw_start) >> 10;
    program_fram_protection = 0x1;
    #ifdef _INFO_FRWP_ENABLE
        info_fram_protection = 0x1;
    #else
        info_fram_protection = 0x0;
    #endif
#endif

/****************************************************************************/
/* INCLUDE PERIPHERALS MEMORY MAP                                           */
/****************************************************************************/

-l msp430fr2155.cmd
2. APP和BOOT 内存重新分配

APP和BOOT的内存分配如下图所示。
在这里插入图片描述

三、中断映射

如果内存中同时存在APP和BOOT的中断程序,那么在进入APP后,触发APP的中断实际上触发的BOOT的中断处理函数(这里可能是因为BOOT使用的是默认的寄存器关系,没有去深究,在查阅大量资料后,大家的处理方式都是将BOOT中的中断转发到APP中断对应的寄存器地址)。所以需要将BOOT中的中断转发到APP中,并在程序进入BOOT后关闭中断。

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A1_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(USCI_A1_VECTOR)))
#endif
void USCI_A1_ISR (void)
{
    // 根据app端对应的中断地址进行转发
    asm("   br &0xDFE2;");
}

将BOOT端的中断禁用了,那么BOOT端只有在主循环中使用寄存器的方式进行数据的接受和处理了。

// 主循环接受数据
void receiveData(void)
{
    uint8_t readData;
    uint8_t resData;
    uint8_t flag2;

    flag2= UCA1IFG; 
    if (flag2& UCRXIFG) 
    {
        readData = UCA1RXBUF;
        // spi_packetLogic 为数据处理,这里就不贴对应的代码了
        // 各位老铁自行编写吧
        resData = spi_packetLogic(readData);
        UCA1TXBUF = resData;
    } 
}

四、程序跳转

  1. BOOT->APP
    通过上面的内存分配,我们知道APP的RESET的地址是0xDFFE,所以直接跳转到该地址,触发一个reset事件,就让程序成功进入APP。
    这里补充一点,目前我知道的办法只有触发reset事件,便可以在APP和BOOT之间相互跳转,然后触发reset事件的方法有很多,比如函数指针、官方提供的函数(例:PMM_trigBOR();)、汇编等。我这里选择是汇编方式。
asm("   mov     &0xDFFE,PC;");
  1. APP->BOOT
    和上面的跳转方式一样,直接触发reset事件完成跳转
asm("   mov     &0xFFFE,PC;");

补充:上述能完成程序之间的跳转,但是有一个现象,在APP->BOOT中,触发了0xFFFE的reset。这里设备断电重启了,由于程序里面的flag已经被设置为BOOT的状态,所以重启后就在BOOT中运行了。不确定是不是正常的或者用户手册中有说明这个reset会做更多的事。希望有懂的大佬评论区指导指导。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

做电商服务软件(电商ERP),怎么实现与电商平台的数据交互?

电商领域是目前互联网最热门、最活跃的行业之一&#xff0c;随着消费需求的增长和普及化&#xff0c;用户对于商品种类和购物体验的要求也越来越高&#xff0c;精准、高效、快速成为谋求更大商品销量的共同目标。因此&#xff0c;电商服务软件的市场需求正不断增强。 想要开发一…

C++---虚函数(8)

多态 虚函数 虚函数就是在类的成员函数声明前加virtual&#xff0c;该成员函数就变成了虚函数。一旦一个类中有虚函数&#xff0c;编译器就会为该类生成虚函数表。 虚函数表中一个元素记录一个虚函数的地址&#xff0c;使用该类构造对象时&#xff0c;对象前4(8)个字节记录虚…

团队知识库的使用场景有哪些?如何搭建团队知识库?

团队知识库是一种用于共享和管理团队知识和信息的工具。它可以帮助团队成员更好地组织、存储、查找和分享信息&#xff0c;提高工作效率和准确性。以下是团队知识库的使用场景和搭建方法的详细介绍。 一、团队知识库的使用场景 项目管理 团队知识库可以帮助团队成员更好地管…

封神之后,又来超神?南卡OE骨传导开放式耳机有啥新本领

终于到了适合夜跑的温度&#xff0c;我的新跑鞋和专用陪跑运动耳机也都收到了&#xff0c;万事俱备却意外中招“二阳”了。虽然身体情况&#xff0c;短期是不能支持去跑步运动了&#xff0c;但每天戴着新耳机打打王者也还是一样很欢乐的。 反正现在时间很多很闲&#xff0c;我…

pyqt6安装与配置(基于vscode环境)

一、安装pyqt6和pyqt6-tools包 注意&#xff1a;pyqt6-tools目前仅支持python3.9版本&#xff0c;3.9版本后的安装部成功。&#xff08;截止2022.11.20&#xff09; 1.1 安装pyqt6和pyqt6-tools 安装pyqt和pyqt6-tools可以使用conda和pip进行安装 &#xff08;1&#xff09…

基于高通camera-帧率-曝光

前人种树&#xff0c;后人乘凉&#xff1b;创造不易&#xff0c;请勿迁移~ daisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 daisy.skye擅长嵌入式,Qt,Linux,等方面的知识 https://blog.csdn.net/qq_40715266?typelately ———————————————— 版权声明&…

计算机网络(谢希仁-第八版)第四章习题全解

4-01 网络层向上提供的服务有哪两种&#xff1f;试比较其优缺点&#xff1f; 虚电路服务和数据报服务。 虚电路 优点&#xff1a; 1.可以提供可靠的通信服务 2.因为数据是沿着建立的虚电路进行传输的&#xff0c;因此分组的首部不需要携带完整的目的主机 的地址&…

redis 的基本介绍以及 五种 数据类型

一、redis是什么&#xff1f; 一句话&#xff1a;redis 是一个开源的、使用C语言编写的、支持网络交互&#xff0c;基于内存也可持久化的 key-value &#xff08;非关系型&#xff09;数据库 redis作者博客&#xff0c;有兴趣的小伙伴可以去逛一逛&#xff1a;http://github.…

后台登录功能开发 -- 手把手教你做ssm+springboot入门后端项目黑马程序员瑞吉外卖(二)

文章目录 前言三、后台登录功能开发1. 需求分析2. 代码开发3. 功能测试&#xff08;简略&#xff09; 四、后台退出功能开发1. 需求分析2. 代码开发3. 功能测试&#xff08;简略&#xff09; 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客…

Servlet规范maven创建webapp项目

main目录下新建webapp pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

C++完成淄博烧烤节管理系统

背景&#xff1a; 这次我们结合今年淄博烧烤做一个餐厅管理系统&#xff0c;具体需求如下&#xff0c;我们选择的是餐饮商家信息管理 问题描述&#xff1a; 淄博烧烤今年大火&#xff0c;“进淄赶烤”是大家最想干的事情&#xff0c;淄博烧烤大火特火的原因&#xff0c;火的…

SSM海南省陵水县旅游网站-计算机毕设 附源码87145

SSM海南省陵水县旅游网站 摘 要 本系统的前端界面主要实现页面的美观和动态效果使之符合广大群众的审美观&#xff0c;后台主要使用的技术主要有Java编程语言&#xff0c;SSM框架&#xff0c;JSP技术、Ajax技术进行开发系统。海南省陵水县旅游网站解决了传统旅游方式中数据分析…

开发者聚焦 | 不容错过的开发者新专栏就要来啦!

掌握前沿技术动态、获得新产品与新应用的使用技巧、在开放专业的社区中与志同道合的朋友交流互动&#xff0c;这些对于开发者来说&#xff0c;都是提高工作效率与自我技能的利器。 为了与开发者互动&#xff0c;并在社区与开发者建立连接和影响&#xff0c;让亚马逊云科技更好…

Toyota Programming Contest 2023#3(AtCoder Beginner Contest 306) 6月17日比赛 第四题

题目地址&#xff1a;D - Poisonous Full-Course 题目大意 时间限制&#xff1a;2秒&#xff0c;空间限制&#xff1a;1024MB&#xff0c;分值&#xff1a;400分 问题描述 小明来到了一家餐厅&#xff0c;一共有道菜&#xff0c;第道菜具有以下属性&#xff1a; 若&#xf…

web前端框架JS学习之JavaScript类型转换

vascript有多种数据类型&#xff0c;如字符串、数字、布尔等&#xff0c;可以通过typeof语句来查看变量的数据类型。数据类型转换就是数据类型之间相互转换&#xff0c;比如把数字转成字符串、把布尔值转成字符串、把字符串转成数字等&#xff0c;这在工作也是经常碰到的。 本…

C++----继承,多重继承(7)

面向对象的三大特征 封装 继承 多态 封装 该隐藏的数据私有化&#xff0c;该公开的数据设计为公有的接口 private public 目的为了更好地分工合作&#xff0c;有助于数据的安全性和使用的方便性&#xff0c;也防止不必要的扩展。 继承(inherite) 作用 实现了代码的复用&a…

浅析餐饮油烟对环境空 气质量的影响与对策

摘 要&#xff1a;为进一步揭示餐饮油烟的空气污染特性&#xff0c;研究了达州市市政中心环境空气自动监测站周边某餐饮业餐饮油烟对该站点周边环境的影响。结果表明:1&#xff09;距离餐饮油烟排气口越近&#xff0c;餐饮油烟对颗粒物的影响越明显&#xff0c;反之亦然。同时&…

编译原理笔记10:语言与文法,正规式转CFG,正规式和CFG,文法、语言与自动机

目录 正规式&#xff0c;和 CFG正规式到 CFG 的转换&#xff1a;正规式和 CFG 的关系为毛不用 CFG 描述词法规则贯穿词法、语法分析始终的思想 上下文有关文法 CSG文法、语言与自动机0型文法&#xff1a;1型文法&#xff1a;2型文法&#xff1a;3型文法&#xff1a;为什么&…

从0到1基于ChatGLM-6B使用LoRA进行参数高效微调

之前尝试了基于LLaMA使用LoRA进行参数高效微调&#xff0c;有被惊艳到。相对于full finetuning&#xff0c;使用LaRA显著提升了训练的速度。 虽然 LLaMA 在英文上具有强大的零样本学习和迁移能力&#xff0c;但是由于在预训练阶段 LLaMA 几乎没有见过中文语料。因此&#xff0…

pdf上传文件过大怎么缩小?pdf在线压缩的简单方法

在日常使用中&#xff0c;我们经常会遇到需要共享或传输pdf文件但是文件过大无法传输的情况&#xff0c;需要使用压缩图的pdf压缩&#xff08;https://www.yasuotu.com/pdfyasuo&#xff09;功能来解决这个问题&#xff0c;利用这款pdf在线压缩工具可以快速将pdf文件压缩&#…