CDK支持Flash烧写功能,为了能够适配不同的Flash器件的编程逻辑,CDK允许开发人员通过Flash算法文件的适配,实现Flash器件的编程,从而实现对某个芯片平台的Flash烧写。
关于Flash算法文件的内容,可以参考《Flash算法的开发和使用》视频教程进行详细了解。
2.1 配置算法初始信息
要在CDK中制作一个特定芯片的方案,需要通过New SOC Project创建一个Flash类型的CDK工程。
此时Project Type选为Flash,并在RAM1中填写SmartL的RAM区域。CPU和对应SDK的CPU要完全一致。
完成工程创建以后,工程视图显示内容如下:
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文件用来实现算法逻辑,针对具体的硬件信息,实现对应的接口。
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 ,然后再次编译算法工程。
双击工程视图的算法工程节点,设置为active project,然后点击调试按钮,启动调试,运行到main函数以后,全速运行,发现算法文件停止在__bkpt_label函数处。
然后,我们这里根据调试需求,设置相应的全局变量,进行验证。
例如,这里我们调试flashProgram接口的正确性,首先在CDK Watch界面将g_func设置为1,g_dstAddress设置为要进行编程的Flash区域的地址,g_length设置为要烧写的数据长度,g_rwBuffer设置为具体的烧写数据内容,一般来说,对于调试,g_length数据量不需要太长。
这里我们设置向Flash区域0x0—0x8区域烧写0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8特征数据,来验证算法文件的正确性。CDK中设置好这些变量以后,把PC的值设置为当前lr(r15)的值,然后点击单步运行,
点击单步运行,程序运行在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作为算法文件。
【情况2】
对于没有使用芯片组件或者使用旧版本的组件的情况,则需要将SmartL_Flash.elf拷贝到my_solution工程根路径下(与my_solution.ckdproj文件同目录),然后在工程配置的Flash Tab的算法选择中,选择该组件即可。