如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章

CDK支持Flash烧写功能,为了能够适配不同的Flash器件的编程逻辑,CDK允许开发人员通过Flash算法文件的适配,实现Flash器件的编程,从而实现对某个芯片平台的Flash烧写。

关于Flash算法文件的内容,可以参考《Flash算法的开发和使用》视频教程进行详细了解。

2.1 配置算法初始信息

要在CDK中制作一个特定芯片的方案,需要通过New SOC Project创建一个Flash类型的CDK工程。

如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章

此时Project Type选为Flash,并在RAM1中填写SmartL的RAM区域。CPU和对应SDK的CPU要完全一致。
完成工程创建以后,工程视图显示内容如下:

如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章

FlashDev.c文件用来对算法基本信息进行描述。

/**
 * structure to describe flash device
 */
struct FlashDevice const FlashDevices  INDEVSECTION =  {
    6,                      // Reserved version description, do not modify!!!
    "SmartL_Flash",              // Flash name
    "ck802",              // CPU name, must in low case
    0x123456,               // Flash ID
    "NorFlash",             // type
    512*1024,               // Reserved
    1,                      // Access directly
    1,                      // RangeNumbers
    // {start address, the flash size, sector size}
    {{0x0, 0x80000, 0x200}}
};

将默认的内容修改为SmartL硬件信息相匹配即可。

2.2 实现算法接口

Driver.c文件用来实现算法逻辑,针对具体的硬件信息,实现对应的接口。

如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章
如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章
如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章

2.3 调试算法逻辑

main.c文件是算法工程的主控逻辑,main函数完成此功能。


it main() {
    // call nor flash drivers to program
    g_error = flashInit();
    // for debug flash driver
    flashTest();
    do {
        __bkpt_label();
        switch (g_func) {
        case 0:
            g_error = flashID(&g_flashID);
            break;
        case 1:
            g_error = flashProgram((char *) g_dstAddress, (char *) g_rwBuffer,
                    g_length);
            break;
        case 2:
            g_error = flashRead((char *) g_rwBuffer, (char *) g_dstAddress,
                    g_length);
            break;
        case 3:
            g_error = flashErase((char *) g_dstAddress, g_length);
            break;
        case 4:
            g_error = flashChipErase();
            break;
        case 5:
            g_error = flashUnInit();
            break;
        case 6:
            g_error = flashChecksum((char*)g_dstAddress, g_length, g_checksum);
            break;
        default:
            break;
        }
    } while (1);
}

CDK通过下载次算法工程到芯片RAM的g_rwBuffer[]数组中,然后通过控制g_func,g_dstAddress,g_length,g_checksum这些全局变量,实现对特定Flash器件的编程功能。这里需要调试算法文件,就是模拟整个烧写的过程,将每个函数调试通过即可。
为了能够更方便的调试算法文件,右击算法工程,在Compiler配置中,修改Optimization修改为 -O0 ,然后再次编译算法工程。

如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章

双击工程视图的算法工程节点,设置为active project,然后点击调试按钮,启动调试,运行到main函数以后,全速运行,发现算法文件停止在__bkpt_label函数处。

如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章

然后,我们这里根据调试需求,设置相应的全局变量,进行验证。
例如,这里我们调试flashProgram接口的正确性,首先在CDK Watch界面将g_func设置为1,g_dstAddress设置为要进行编程的Flash区域的地址,g_length设置为要烧写的数据长度,g_rwBuffer设置为具体的烧写数据内容,一般来说,对于调试,g_length数据量不需要太长。

如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章

这里我们设置向Flash区域0x0—0x8区域烧写0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8特征数据,来验证算法文件的正确性。CDK中设置好这些变量以后,把PC的值设置为当前lr(r15)的值,然后点击单步运行,

如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章

点击单步运行,程序运行在main.c文件的flashProgram入口,然后通过常规的调试手段,进入该函数内部,运行函数完成以后,验证是否正确烧写。
按照上诉手段,分别验证每个函数的正确性即可。

2.4 配置算法文件到SDK工程---

当完成整个算法文件调试以后,为了更好的提升算法文件的性能,这里我们将算法工程的Compiler编译选项由 -O0 修改为 -O2,然后重新编译,编译完成以后,将SmartL_Flash工程根路径下Obj/目录中生成的SmartL_Flash.elf算法文件copy到my_solution工程使用的SmartL_Chip组件的目录中去,CDK工程视图右击菜单Open Containing Folder选项,可以直接打开工程、组件所在的目录。
然后在工程视图SmartL_Chip组件节点的配置窗口中,配置SmartL_Flash.elf作为算法文件。

如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章

【情况2】
对于没有使用芯片组件或者使用旧版本的组件的情况,则需要将SmartL_Flash.elf拷贝到my_solution工程根路径下(与my_solution.ckdproj文件同目录),然后在工程配置的Flash Tab的算法选择中,选择该组件即可。

如何创建一个Flash算法文件 | 《平头哥剑池CDK快速上手指南》第三章

上一篇:如何修改初始SDK工程 | 《平头哥剑池CDK快速上手指南》第四章


下一篇:剑池CDK开发工具介绍 | 《平头哥剑池CDK快速上手指南》第一章