在KDS中使用C90TFS操作flash的问题讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在KDS中使用C90TFS操作flash的问题讲解
【经验分享】在KDS中使用C90TFS操作flash的问题讲解
一,问题描述
最近有个客户在使用C90TFS移植到K22 KDS KSDK工程中的时候,发现在操作flash sector 擦除之后,返回的FTFA_FSTAT 寄存器总是0X40,也就是ACCERR为1,访问flash 错误。
通过查看对应的K22 参考手册,可以知道:
产生ACCERR错误,通常有如上表格中的三种情况。
但是客户使用的命令是这样的:
FCCOB0=0X09
FCCOB1=0X07
FCCOB2=0XA0
FFCCOB3=0X00
也就是对地址0X07A000所在的sector执行擦除命令,所以命令,地址都没有错误。
那么到底是什么原因导致的呢?
首先想一下,和flash操作失败相关的因素一般有几点,1,操作flash之前没有关闭中断,这样flash操作时,产生中断,导致flash操作错误;2,发起flash操作命令没有放到RAM中;3,flash操作时钟超限或者时钟模式不对。
下面带着这几个排查点具体分析问题,测试平台TWR-K22F120M, FRDM-K22F120M。
二,问题排查与解答
1. 操作flash前中断关闭否
查看代码:
可以看到,操作flash之前,已经关闭了全局中断。
2. 发起flash命令代码未放到RAM
其实,如果flash操作的发起命令代码如果不是放在被操作的flash区域,应该也不会影响到flash的操作。
而在执行flash sector 之前,已经查看过,该sector并没有存放程序代码。
不过为了flash 的快速执行,通常还是把flash操作的发起命令代码放到RAM中执行。
从上图的代码中可以看到:
g_FlashLaunchCommand = (pFLASHCOMMANDSEQUENCE)RelocateFunction((uint32_t)ram Func , LAUNCH_CMD_SIZE ,(uint32_t)FlashCommandSequence);
该命令FlashCommandSequence已经放到了RAM中,所以肯定不会是这个因素影响的。
3. flash时钟越界或时钟模式不对
从reference manual 的时钟章节,可以看到:
Flash clock时钟最高只能到26.67Mhz.
下面查看代码时钟情况
可以看到,定义内核时钟为120Mhz,而OUT4为4,则按照时钟系统:
可以知道,这样算下来,flash 时钟=120M/5=24M,可以看到时钟还是符合要求,小于26.67Mhz.
但是从代码中,可以清晰的看到,编译的是:(CLOCK_INIT_CONFIG == CLOCK_HSRUN)从K22的功耗模式章节可以看到:
也就是flash的编程或者擦除是不能运行在HSRUN和VLPR模式下面的,所以这里可以知道是时钟模式不对导致的。
那么就需要把功耗模式换为RUN模式,具体配置在下图:
这里就有点奇怪,为何定义了CLOCK_RUN,在KDS中编译,还是编译的未定义
CLOCK_INT_CONFIG呢?可以看到,其实程序中需要的是CLOCK_INIT_CONFIG, 而客户把INIT写成了INT了,这就是为何功耗模式不对的原因,修改为CLOCK_INIT_CONFIG之后,可以看到flash就能够准确的操作擦除和编程了。
三总结
FLASH操作需要注意三大点:
1,操作flash之前关闭全局中断,flash操作完成后,可以重新开启中断
2,发起flash操作命令放到RAM中;
3,Flash编程和擦除操作不能放在高速运行HSRUN和VLPR模式下。