This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于MSP430单片机内部FLASH写入固定数据的问题



各位高手:

        本人目前做一医疗电子项目,需要产生一些列的脉冲,脉冲的宽度,和这一些列脉冲的时间间隔已经转化为hex文件。整个hex文件有48KB左右,之前在IAR当中建立了一个cons型的结构体数组,但是数据量太大了,编译器报错了。后来就外挂了一片SPI接口的FLASH存储器,通过SPI口读取一步数据,产生一次波形,MCLK已经配置为16mHz了,但是毕竟是外设,数据的读取比脉冲的时间都长了。感觉实行性一点儿都不好,请教各位高手,有没有之类的上位机软件,通过JTAG口或者串口把数据写入单片机的FLASH当中,我直接从FLASH 当中读取数据,产生波形。毕竟从内部读取,时间会快很多,请各位高手不吝赐教。先谢过了!

  • 可以直接将数据写入FLASH中,但要注意430内部Flash的大小,还要有一部分flash装载程序,具体的程序代码可以参考如下

    #include <msp430.h>

    char  value;                                // 8-bit value to write to segment A

    // Function prototypes
    void write_SegC (char value);
    void copy_C2D (void);

    int main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
      if (CALBC1_1MHZ==0xFF)     // If calibration constant erased
      {           
        while(1);                               // do not load, trap CPU!! 
      }
      DCOCTL = 0;                               // Select lowest DCOx and MODx settings
      BCSCTL1 = CALBC1_1MHZ;                    // Set DCO to 1MHz
      DCOCTL = CALDCO_1MHZ;
      FCTL2 = FWKEY + FSSEL0 + FN1;             // MCLK/3 for Flash Timing Generator
      value = 0;                                // initialize value

      while(1)                                  // Repeat forever
      {
        write_SegC(value++);                    // Write segment C, increment value
        copy_C2D();                             // Copy segment C to D
        _NOP();                                 // SET BREAKPOINT HERE
      }
    }

    void write_SegC (char value)
    {
      char *Flash_ptr;                          // Flash pointer
      unsigned int i;

      Flash_ptr = (char *) 0x1040;              // Initialize Flash pointer
      FCTL1 = FWKEY + ERASE;                    // Set Erase bit
      FCTL3 = FWKEY;                            // Clear Lock bit
      *Flash_ptr = 0;                           // Dummy write to erase Flash segment

      FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation

      for (i=0; i<64; i++)
      {
        *Flash_ptr++ = value;                   // Write value to flash
      }

      FCTL1 = FWKEY;                            // Clear WRT bit
      FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
    }

    void copy_C2D (void)
    {
      char *Flash_ptrC;                         // Segment C pointer
      char *Flash_ptrD;                         // Segment D pointer
      unsigned int i;

      Flash_ptrC = (char *) 0x1040;             // Initialize Flash segment C pointer
      Flash_ptrD = (char *) 0x1000;             // Initialize Flash segment D pointer
      FCTL1 = FWKEY + ERASE;                    // Set Erase bit
      FCTL3 = FWKEY;                            // Clear Lock bit
      *Flash_ptrD = 0;                          // Dummy write to erase Flash segment D
      FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation

      for (i=0; i<64; i++)
      {
        *Flash_ptrD++ = *Flash_ptrC++;          // copy value segment C to segment D
      }

      FCTL1 = FWKEY;                            // Clear WRT bit
      FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
    }

  • 感谢,这样的话,我就需要对单片机烧写两次程序,我是想请教有没有这一类的上位机软件通过串口或者JTAG口把数据文件写入FLASH,不过仍然感谢回答。

  • 可以用上位机来写入参数存放到Flash中,具体可以这样做在主程序中初始化串口后调用一次你要写入的参数的函数比如 flashWrite()如果在1s内未接收到写入指令则自动从flashWrite()函数中退出,这样仅需要在出厂的时候写入一次,在宏观程序上仅仅延时了1s时间,看看这样能不能满足你的要求~

  • 谢谢你的回答,昨天晚上做了一下实验,用示波器测量了一下通过SPI接口从外部FLASH读取6个字节的数据包括从组需要的数据花了30uS时间,相对于两次时间间隔(从几百毫秒到一秒左右)而言已经很短了,用的是G2553单片机。从成本和实时性来折中,还是选用通过SPI口从FLASH中读取数据。感谢您的回答。