注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
lyzhangxiang的个人空间 https://home.eeworld.com.cn/space-uid-252424.html [收藏] [复制] [分享] [RSS]
日志

【MSP430 编译器使用经验】+将中断向量表置于RAM中

已有 4821 次阅读2014-8-12 09:35

相信用过cm3的朋友们有深刻的体会,可以设置中断向量表到RAM或者FLASH中去,搞搞IAP很方便啊。之前在msp430有个项目要485升级,研究了一下。没搞定,后面还是用传统的方法实现的,就是那些br啊,中断向量重置这种。

这里和大家分享一下如何把中断向量表放置在RAM中,我想应该是可以实现IAP的,可能是我的方式不正确,有兴趣的可以继续研究下。


直接贴出代码吧,主要是思路,看一下代码吧,注意那个寄存器 SYSCTL |= SYSRIVECT;

  1. #include "msp430f5438A.h"

  2. #ifndef __MSP430F5438A__
  3.     #error "This example code only works for MSP430F5438A"
  4. #endif


  5. /* RAM结束地址 */
  6. #define TOP_OF_RAM                      (0x5BFF)


  7. /* RAM中中断向量表起始地址 */
  8. #define INT_VECT_START_ADDR             (TOP_OF_RAM + 1 - sizeof(int_vect_t))


  9. /* TA1_CCR0_ISR */
  10. __interrupt void TIMER1_A0_ISR(void);



  11. /* 中断函数指针变量类型定义 */
  12. #if 0
  13.     typedef void (*isr_type_t)(void);
  14. #else
  15.     typedef unsigned int  isr_type_t;
  16. #endif

  17.    
  18. /* 中断向量表数据类型 */
  19. typedef struct
  20. {
  21.     isr_type_t reserved[41];
  22.     isr_type_t rtc_a;
  23.     isr_type_t io_p2;
  24.     isr_type_t usci_b3_rx_tx;
  25.     isr_type_t usci_a3_rx_tx;
  26.     isr_type_t usci_b1_rx_tx;
  27.     isr_type_t usci_a1_rx_tx;
  28.     isr_type_t io_p1;
  29.     isr_type_t ta1_ta1iv;
  30.     isr_type_t ta1_ccr0;
  31.     isr_type_t dma;
  32.     isr_type_t usci_b2_rx_tx;
  33.     isr_type_t usci_a2_rx_tx;
  34.     isr_type_t ta0_ta0iv;
  35.     isr_type_t ta0_ccr0;
  36.     isr_type_t adc12_a;
  37.     isr_type_t usci_b0_rx_tx;
  38.     isr_type_t usci_a0_rx_tx;
  39.     isr_type_t wdt;
  40.     isr_type_t tb_tbiv;
  41.     isr_type_t tb_ccr0;
  42.     isr_type_t unmi;
  43.     isr_type_t snmi;
  44.     isr_type_t reset;
  45. }int_vect_t;


  46. /* 指向RAM中向量表的起始地址 */
  47. int_vect_t * const ram_int_vect_p = (int_vect_t*) INT_VECT_START_ADDR;

  48. void main(void)
  49. {
  50.     P1DIR |= BIT0;
  51.    
  52.     /* 50ms中断 */
  53.     TA1CCTL0    = CCIE;
  54.     TA1CCR0     = 50000;
  55.     TA1CTL      = TASSEL__SMCLK + MC__UP + TACLR;
  56.    
  57.     /* 拷贝中断向量表中的ISR地址 */
  58.     ram_int_vect_p->ta1_ccr0 = (isr_type_t) &TIMER1_A0_ISR;
  59.    
  60.     /*
  61.      * 将中断向量表移动到RAM中
  62.      * 注意只有部分系列芯片才会有这个寄存器
  63.      */
  64.     SYSCTL |= SYSRIVECT;
  65.    
  66.     /* 使能中断进入LPM0模式 */
  67.     __bis_SR_register(LPM0_bits + GIE);
  68.    
  69.     __no_operation();                        
  70. }



  71. #pragma segment="ISR_CODE"
  72. __interrupt void TIMER1_A0_ISR(void)
  73. {
  74.     /* 闪灯操作 */
  75.     P1OUT ^= BIT0;
  76. }


  77. int __low_level_init(void)
  78. {
  79.     /* 关闭看门狗 */
  80.     WDTCTL = WDTPW + WDTHOLD;
  81.    
  82.     /* 初始化变量 */
  83.     return 1;
  84. }
复制代码



最后一点点相关的东西:

  1. /*
  2. ISR_CODE在XCL文件中的描述

  3. 片段一:
  4.     // segment         Usage
  5.     // -------         ---------------------------------------------
  6.     // INFO            Information memory
  7.     // INFOA           Information memory, bank A
  8.     // INFOB           Information memory, bank B
  9.     // INFOC           Information memory, bank C
  10.     // INFOD           Information memory, bank D
  11.     // CSTART          Program startup code
  12.     // CODE            Program code
  13.     // ISR_CODE        Program code for interrupt service routines
  14.     // DIFUNCT         Dynamic initialization vector used by C++
  15.     // CHECKSUM        Checksum byte(s) generated by the -J option
  16.     // INTVEC          Interrupt vectors
  17.     // RESET           The reset vector
  18.     // TLS16_ID        Thread-local initializers for main thread
  19.     //                 (require custom runtime library)
  20.     //
  21.     // Notes:
  22.     //
  23.     // * The segments CSTART, ISR_CODE, and DIFUNCT, as well as the segments in
  24.     //   the DATA16 and TLS16 segment groups must be placed in in the range
  25.     //   0000-FFFD.
  26.     //
  27.     // * The INFOx and INFO segments overlap, this allows data either to be
  28.     //   placed in a specific bank or anywhere in the info memory.
  29.     //
  30.     // * The INTVEC and RESET segments overlap. This allows an application to
  31.     //   either use the reset vector provided by the runtime library, or
  32.     //   provide a reset function by defining an interrupt function associated
  33.     //   with the reset vector.



  34. 片段二:
  35.     // ---------------------------
  36.     // Code
  37.     //

  38.     -Z(CODE)CSTART,ISR_CODE=5C00-FF7F



  39. XBOOT说明:
  40.     v2.10 --- 中断向量表放置到RAM中
  41.     1)为了简化BOOT的操作流程,将BOOT的中断向量表放置在RAM中,APP程序中断向量表采用通用的方式

  42.     2)具体划分如下:
  43.         --------|---------------|------>0x5C00
  44.              5K |      BOOT     |
  45.         --------|---------------|------>0x6FFF
  46.         --------|---------------|------>0x7000
  47.                 |               |
  48.                 |      APP      |
  49.                 |               |
  50.         --------|---------------|------>0xFF7F
  51.         --------|---------------|------>0xFF80
  52.                 |   APP_VECTOR  |
  53.         --------|---------------|------>0xFFFF
  54.         
  55.         
  56.         
  57.         --------|---------------|------>0x1C00
  58.                 |               |
  59.                 |      RAM      |
  60.                 |               |
  61.         --------|---------------|------>0x5B7F
  62.         --------|---------------|------>0x5B80
  63.                 |    BT_VECTOR  |
  64.         --------|---------------|------>0x5BFF

  65.     3)注意XCL文件中修改RAM区域为0x1C00-0x5B7F,注意应用程序和BOOT程序的复位地址问题
  66.     4)目前只能实现BOOT程序将中断向量表放置在RAM中,还不能实现APP程序通过升级执行

  67. */
复制代码


本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章