MSP430以一款TI出品的16位超低功耗、具有精简指令集(RISC)的混合信号处理器,优点就是低功耗,运算快。在公司内用在一款开发中的低功耗传感器上,主要开发人员出国旅游一段时间,暂时给我代码熟悉一下,方便在旅游期间仪器暴露出来的问题帮忙解决。
第一个要搞明白的就是msp芯片的IAP,方便远程升级的功能。
参考资料:http://www.ti.com.cn/cn/lit/ug/slau056l/slau056l.pdf
开发使用TI官方出品的开发环境Code Composer Studio (CCS) 集成开发环境 。

IAP几个比较重要的点
1.APP和bootloader地址分配
2.APP程序FLASH写入
3.bootloader和app的相互跳转
4.Bootloader和app中断向量表重映射

程序地址分配

CCS IDE 修改CMD文件即可,0FFFFh to 01100h为代码区,0FFFFh to 0FFE0h为中断向量表,这里我将bootloader地址设置为0xF000h to 0xFFFFH,app地址0x11000h to 0xF000h,具体如下:
app

MEMORY
{SFR                     : origin = 0x0000, length = 0x0010PERIPHERALS_8BIT        : origin = 0x0010, length = 0x00F0PERIPHERALS_16BIT       : origin = 0x0100, length = 0x0100RAM                     : origin = 0x0200, length = 0x0800INFOA                   : origin = 0x10C0, length = 0x0040INFOB                   : origin = 0x1080, length = 0x0040INFOC                   : origin = 0x1040, length = 0x0040INFOD                   : origin = 0x1000, length = 0x0040FLASH                   : origin = 0x1100, length = 0xDEE0INT00                   : origin = 0xEFE0, length = 0x0002INT01                   : origin = 0xEFE2, length = 0x0002INT02                   : origin = 0xEFE4, length = 0x0002INT03                   : origin = 0xEFE6, length = 0x0002INT04                   : origin = 0xEFE8, length = 0x0002INT05                   : origin = 0xEFEA, length = 0x0002INT06                   : origin = 0xEFEC, length = 0x0002INT07                   : origin = 0xEFEE, length = 0x0002INT08                   : origin = 0xEFF0, length = 0x0002INT09                   : origin = 0xEFF2, length = 0x0002INT10                   : origin = 0xEFF4, length = 0x0002INT11                   : origin = 0xEFF6, length = 0x0002INT12                   : origin = 0xEFF8, length = 0x0002INT13                   : origin = 0xEFFA, length = 0x0002INT14                   : origin = 0xEFFC, length = 0x0002RESET                   : origin = 0xEFFE, length = 0x0002
}

bootloader

MEMORY
{SFR                     : origin = 0x0000, length = 0x0010PERIPHERALS_8BIT        : origin = 0x0010, length = 0x00F0PERIPHERALS_16BIT       : origin = 0x0100, length = 0x0100RAM                     : origin = 0x0200, length = 0x0800INFOA                   : origin = 0x10C0, length = 0x0040INFOB                   : origin = 0x1080, length = 0x0040INFOC                   : origin = 0x1040, length = 0x0040INFOD                   : origin = 0x1000, length = 0x0040FLASH                   : origin = 0xF000, length = 0x0FE0INT00                   : origin = 0xFFE0, length = 0x0002INT01                   : origin = 0xFFE2, length = 0x0002INT02                   : origin = 0xFFE4, length = 0x0002INT03                   : origin = 0xFFE6, length = 0x0002INT04                   : origin = 0xFFE8, length = 0x0002INT05                   : origin = 0xFFEA, length = 0x0002INT06                   : origin = 0xFFEC, length = 0x0002INT07                   : origin = 0xFFEE, length = 0x0002INT08                   : origin = 0xFFF0, length = 0x0002INT09                   : origin = 0xFFF2, length = 0x0002INT10                   : origin = 0xFFF4, length = 0x0002INT11                   : origin = 0xFFF6, length = 0x0002INT12                   : origin = 0xFFF8, length = 0x0002INT13                   : origin = 0xFFFA, length = 0x0002INT14                   : origin = 0xFFFC, length = 0x0002RESET                   : origin = 0xFFFE, length = 0x0002
}

FLASH擦写

该芯片可以从ram和flash执行写操作,但ram执行cpu不会被阻塞,因此必须判断busy标志位防止一些不可预知的错误。flash执行则会阻塞cpu。

Any erase cycle can be initiated from within flash memory or from RAM. When
a flash segment erase operation is initiated from within flash memory, all timing
is controlled by the flash controller, and the CPU is held while the erase cycle
completes. After the erase cycle completes, the CPU resumes code execution
with the instruction following the dummy write.

官网文档提供的汇编函数

MOV #WDTPW+WDTHOLD,&WDTCTL ; Disable WDT
MOV #FWKEY+FSSEL1+FN0,&FCTL2 ; SMCLK/2
MOV #FWKEY,&FCTL3 ; Clear LOCK
MOV #FWKEY+ERASE,&FCTL1 ; Enable segment erase
CLR &0FC10h ; Dummy write, erase S1
MOV #FWKEY+LOCK,&FCTL3 ; Done, set LOCK

另外提一下,flash写入会擦除,调用 FLASH_Write应当先把当前segment的其他数据读出来,根据规格书code memory一个segment512字节

void FLASH_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{char *Flash_ptr;                          // Flash pointerunsigned int i;Flash_ptr = (char *)WriteAddr;            // Initialize Flash pointerFCTL3 = FWKEY;                            // Clear Lock bitFCTL1 = FWKEY + ERASE;                    // Set Erase bit*Flash_ptr = 0;                           // Dummy write to erase Flash segFCTL1 = FWKEY + WRT;                      // Set WRT bit for write operationfor (i = 0; i < NumToWrite; i++){*Flash_ptr++ = pBuffer[i];                   // Write value to flash}FCTL1 = FWKEY;                            // Clear WRT bitFCTL3 = FWKEY + LOCK;                     // Set LOCK bit
}

bootloader和app跳转

类似stm32调用各自的reset中断向量就好了
就是第一部分中的
RESET : origin = 0xFFFE, length = 0x0002
RESET : origin = 0xEFFE, length = 0x0002
调用方法 asm(" br &0xEFFE;");asm(" br &0xFFFE;");
BR这个汇编命令等价于MOV dst,PC

bootloader和app中断向量表偏移

stm32中中断向量表偏移通过配置SCB->VTOR寄存器即可,如下systeminit函数中VECT_TAB_OFFSET宏定义控制偏移位置。

#ifdef VECT_TAB_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#elseSCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif

但所使用的这块芯片没有找到类似的配置寄存器,也就是说中断服务函数进的都是bootloader的中断,只能在bootloader里用asm(" br &0xXXXX;")命令跳转到APP实际的中断服务函数,例如
boot

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(WDT_VECTOR))) watchdog_timer (void)
#else
#error Compiler not supported!
#endif
{asm(" br &0xEFF4;"); //地址根据APP的cmd配置
}

app

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(WDT_VECTOR))) watchdog_timer (void)
#else
#error Compiler not supported!
#endif
{printf("watchdog_timer\r\n");//实际执行的中断
}

MSP430FG479芯片的 IAP相关推荐

  1. 基于STM32系列芯片的 IAP实现的探索

    基于STM32系列芯片的 IAP实现的探索 什么是IAP? 如何实现IAP? 第一步:学习官方源代码 第二步:了解STM32芯片基本硬件参数 第三步.搞清除STM32内置Flash 第四步. STM3 ...

  2. stm32f103c8t6芯片IAP升级填坑记

    由于产品设计到远程升级,于是就准备花点时间研究一下. 先熟悉了一下stm32f1系列芯片的IAP原理,然后从网上下载了多种版本的IAP bootloader程序,运行后发现下载程序功能都正常,但上传功 ...

  3. 【嵌入式】关于IAP+Xmodem从外部接收bin文件对芯片进行升级学习记录

    本文基于GD32F303CGT6芯片 使用软件: KEIL5 Tera Term 什么是IAP 对于芯片的程序烧录,一共三种方式: ICP ISP IAP ICP(in-circuit-program ...

  4. CRC校验原理及STM32 IAP在线升级程序

    CRC校验原理: 什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据 ...

  5. STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决

    IAP 是啥   IAP( In Application Programming)即在应用编程,也就是用户可以使用自己的程序对MCU的中的运行程序进行更新,而无需借助于外部烧写器.其实ST官网也给出了 ...

  6. ISP与IAP的区别

    ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程.IAP(In ...

  7. ISP 和IAP 原理与区别

    1  ISP和IAP的工作原理   ISP的实现相对要简单一些,一般通用做法是内部的存储器可以由上位机的软件通过串口来进行改写.对于单片机来讲可以通过SPI或其它的串行接口接收上位机传来的数据并写入存 ...

  8. 单片机ISP、IAP和ICP几种烧录方式的区别

    单片机ISP.IAP和ICP几种烧录方式的区别 玩单片机的都应该听说过这几个词.一直搞不太清楚他们之间的区别.今天查了资料后总结整理如下. ISP:In System Programing,在系统编程 ...

  9. 单片机三种烧录方式ISP、IAP和ICP有什么不同?

    关注+星标公众号,不错过精彩内容 编排 | strongerHuang 微信公众号 | 嵌入式专栏 学习单片机的同学,或多或少都听说过ISP.IAP和ICP,都是对单片机进行编程,下面简单来说下这几个 ...

最新文章

  1. “我太喜欢你了”——友情的表达方式?
  2. MySql UNIX_TIMESTAMP和FROM_UNIXTIME函数讲解
  3. 利用Traefik+Docker构建可弹性扩展的微服务或服务集群
  4. 使用apache FileUtils下载文件
  5. 【十】推荐系统遇到知识图谱RippleNet
  6. 汇总下最近没时间更新的机器学习,五一后更起来
  7. 小米手机安装证书(安卓)
  8. 设计抗100亿请求的春晚红包系统
  9. 首个windowsForm应用项目 1123
  10. 荐书送书丨《PostgreSQL实战》、《PostgreSQL修炼之道:从小工到专家(第2版)》...
  11. 30本数据分析的书籍送给你!
  12. Matlab之函数绘图函数ezplot
  13. 网络通信协议基础(ISIS)——入门
  14. SXLib3D -- 一款高效的点云和网格交互处理平台
  15. Ubuntu 14.04 解决 DNS 解析失败
  16. 网页设计常用色彩搭配表 - 配色表
  17. 建筑行业现行相关税收政策及优惠措施汇编
  18. Kappa(cappa)系数只需要看这一篇就够了,算法到python实现
  19. python手机触屏代码_使用python实现触摸?
  20. GluonCV跑代码经常碰到的问题

热门文章

  1. Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.tools.PointcutDesignatorHandler
  2. 第3单元 mvp架构,dagger2,butterknife的使用
  3. ArcGIS API for Javascript 中文文档 百度网盘链接
  4. Python+Vue计算机毕业设计web的个人分享博客的设计与实现1w530(源码+程序+LW+部署)
  5. JavaScript操作的DOM对象
  6. 如何从tomcat官网下载各个版本的tomcat?
  7. VUE父子组件之间的传值,以及兄弟组件之间的传值;
  8. vue祖孙组件间传值
  9. 【汇正财经】股票和债券的区别有哪些?哪个风险比较小?
  10. 以业务为中心的组织结构对企业的影响