This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Programming algorithm(load FW to sysRAM) for DA14531

There is no programming algorithm for DA14531,vendor has provided the tools to develop app based on their platform & hardware.

I don't know others how to develop it without algorithm, it looks like you should upload FW with SmartSnippets and start to run & debug,

that means you'd shift between Keil and SmartSnippets.

I developed a PCBA with DA14531, I hope to programme & debug in Keil only,I need to create a algorithm to load FW to RAM and 

execute it.

This is the simple code(FlashPrg.c):

/***********************************************************************/
/*  This file is part of the ARM Toolchain package                     */
/*  Copyright KEIL ELEKTRONIK GmbH 2003 - 2010                         */
/***********************************************************************/
/*                                                                     */
/*  FlashDev.C:  Flash Programming Functions adapted                   */
/*               for DA14531 sysRAM               */
/*                                                                     */
/***********************************************************************/

#include "..\FlashOS.h"        // FlashOS Structures


typedef volatile unsigned char  vu8;
typedef volatile unsigned long  vu32;
typedef volatile unsigned short vu16;

#define M8(adr)  (*((vu8  *) (adr)))
#define M16(adr) (*((vu16 *) (adr)))
#define M32(adr) (*((vu32 *) (adr)))

unsigned long base_adr;


extern struct FlashDevice const FlashDevice; 

/*
 *  Initialize Flash Programming Functions
 *    Parameter:      adr:  Device Base Address
 *                    clk:  Clock Frequency (Hz)
 *                    fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)
 *    Return Value:   0 - OK,  1 - Failed
 */


int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {

  base_adr = adr ;          // Align to Size Boundary

  return (0);
}




/*
 *  De-Initialize Flash Programming Functions
 *    Parameter:      fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)
 *    Return Value:   0 - OK,  1 - Failed
 */


int UnInit (unsigned long fnc) {

  return (0);
}




/*
 *  Erase Sector in Flash Memory
 *    Parameter:      adr:  Sector Address
 *    Return Value:   0 - OK,  1 - Failed
 */


int EraseSector (unsigned long adr) {
  int i;
  for(i=0;i<1024/sizeof(unsigned long);i++){
      M32(adr) = 0;
      adr += sizeof(unsigned long);
  }
    
  return (0);                                   // Done
}






/*
 *  Program Page in Flash Memory
 *    Parameter:      adr:  Page Start Address
 *                    sz:   Page Size
 *                    buf:  Page Data
 *    Return Value:   0 - OK,  1 - Failed
 */


int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {

    sz = (sz + 1) & ~3;                           // Adjust size for Words

    while (sz) {

        M32(adr) = *((unsigned long *)buf);      // Program  Word

        // Check for Errors
        if ( M32(adr) != (*((unsigned long *)buf)) ) {
            return (1);                             // Failed
        }

        // Go to next Word
        adr += sizeof(unsigned long);
        buf += sizeof(unsigned long);
        sz  -= sizeof(unsigned long);
    }


    return (0);                                   // Done
}



FlashDev.c:

/***********************************************************************/
/*  This file is part of the ARM Toolchain package                     */
/*  Copyright KEIL ELEKTRONIK GmbH 2003 - 2010                         */
/***********************************************************************/
/*                                                                     */
/*  FlashDev.C:  Device Description for DA14531 sysRAM                 */
/*                                                                     */
/***********************************************************************/

#include "..\FlashOS.h"        // FlashOS Structures


struct FlashDevice const FlashDevice  =  {
   FLASH_DRV_VERS,             // Driver Version, do not modify!
   "DA14531 48K sysRAM",       // Device Name (128kB/64kB/32kB)
   ONCHIP,                     // Device Type
   0x07FC0000,                 // Device Start Address
   0xAC00,                     // Device Size in Bytes (43K = 48K - 5K, 5K for algorithm)
   1024,                       // Programming Page Size
   0,                          // Reserved, must be 0
   0x00,                       // Initial Content of Erased Memory
   100,                        // Program Page Timeout 100 mSec
   500,                        // Erase Sector Timeout 500 mSec

   // Specify Size and Address of Sectors
   4096, 0x07FC0000,           //sysRAM1 16K, Sector Size 4kB (4 Sectors)
   4096, 0x07FC4000,           //sysRAM2 12K, Sector Size 4kB (3 Sectors)
   5120, 0x07FC7000,           //sysRAM3 15K, Sector Size 5kB (3 Sectors),reserve 5K for programming algorithm code
   
   SECTOR_END
};

RAM map of DA14531:

System RAM
48 kB. Contains application code, data for the application, stack, and heap.
SysRAM1 (16 kB): 0x07FC0000 to 0x07FC3FFF
SysRAM2 (12 kB): 0x07FC4000 to 0x07FC6FFF
SysRAM3 (20 kB): 0x07FC7000 to 0x07FCBFFF

My plan to allocate them: 43K(lower part) for FW,5K(higher part) for algorithm.

Size of sysRAM3 is 20K,reserved 5K(highest part) for this algorithm,so
we need to set "RAM for algorithm"(option-debug-settings-Flash download) :

Start: 0x7FCAC00(0x07FCBFFF + 1 - 0x1400) Size:0x1400 (5120/5K)

and "Programming algorithm":

Start: 0x07FC0000 Size: 0xAC00 (43K)

I use blinky(from DA14531 SDK) to test:

Compile & upload,I got this error:

log info:

Flash Load finished at 13:25:59
Load "D:\\DA14531\\Multirole_SDKs\\6.0.20.1338_multirole\\projects\\target_apps\\peripheral_examples\\blinky\\blinky\\Keil_5\\out_DA14531\\Objects\\blinky_531.axf" 
Erase Failed!
Error: Flash Download failed  -  "Cortex-M0+"
Flash Load finished at 13:29:36

I can't find the explanation for "Address not Zero!", it looks like Sector(0) address should not be Zero, but it is not Zero indeed in my case.

And there is a big problem: I don't know the SWD function of PCBA is OK or not, but I checked the Crystal oscillator, there is voltage existed ,though very low.

Any advice is welcome.

Thank you.