查看: 3287|回复: 12

[分享] mkl14 ftfa保护区域的设置

[复制链接]

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
发表于 2015-3-16 14:44:28 | 显示全部楼层 |阅读模式
大家好,对MKL14的FTFA保护区域的设置,我有一个不太清楚的地方。从手册上看,FTFA的保护区域可以通过Program Flash Protection Registers来设置,
但是,看手册好像一旦设置了保护区之后,不能取消保护?


我目前想实现这么一个功能,划分一个flash区域,在正常情况下,该区域需要保护起来,不能被擦写,但是,需要提供手段,能够取消该区域的保护,然后对该区域擦写之后,重新将该区域保护起来,不知道有什么方法可以实现?
回复

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-16 15:01:49 | 显示全部楼层
那么要看你保护的区域在什么地方。
其实负责保护的值是放在Flash Configuration Field的0X408到0X40b的。
你说的FTFA_FPOTn寄存器,是单向的,只能是从未保护改到保护。
如果要改为未保护,那么就需要改Flash Configuration Field的0X408到0X40b值,通过flash command擦写形式。
但是如果你把Flash configuration field也保护了, 那就不能修改了。
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-3-16 15:33:10 | 显示全部楼层
Configuration Field不需要保护,只需要保护其他区域。
你所说的flash command指定是FlashProgram命令,还是有其他的特殊命令。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-16 15:48:35 | 显示全部楼层
cjpx84 发表于 2015-3-16 15:33
Configuration Field不需要保护,只需要保护其他区域。
你所说的flash command指定是FlashProgram命令,还 ...

就是flash program的命令。
不保护configuration field就能修改后面的flash保护情况了。
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-3-16 16:11:21 | 显示全部楼层
我的flash大小为64k,我想保护32k以上的flash空间。看手册只要将fprot2,fprot3这两个寄存器设置成0,就可以保护高32k的flash空间。但是,我设置完成之后,去擦除该flash空间之后,发现该flash区域还是被擦除了,没有达到保护的目的。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-16 16:36:53 | 显示全部楼层
cjpx84 发表于 2015-3-16 16:11
我的flash大小为64k,我想保护32k以上的flash空间。看手册只要将fprot2,fprot3这两个寄存器设置成0,就可以 ...

设置完之后,有没有读出来看看是否真的写进去。
另外,如果写进去还不行,软件复位下试试。
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-3-16 16:49:34 | 显示全部楼层
本帖最后由 cjpx84 于 2015-3-16 16:51 编辑

刚刚写反了寄存器,我验证了下,直接写寄存器能保护flash区域。但是,我用flash program去写 configure filed,发现寄存器读取出来的值还是全FF。我想是因为我用仿真器调试的时候,configure filed被擦除了,导致我之前写的值无效,而fport寄存器是在reset的时候从configure filed 载入值的,这样就导致了fport寄存器中的值还是FF,也就是没有保护。

能不能做到保存configure filed的值呢?感觉写完configure filed值写的太晚了,寄存器的值已经被读成FFFF了。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-16 17:14:43 | 显示全部楼层
本帖最后由 FSL_TICS_ZJJ 于 2015-3-16 17:16 编辑
cjpx84 发表于 2015-3-16 16:49
刚刚写反了寄存器,我验证了下,直接写寄存器能保护flash区域。但是,我用flash program去写 configure fil ...

你在主程序中先擦除program configuration field,然后编写它。
因为之前里面有值,不擦就写是不正确的。另外,你可以用串口打印出来看。
因为如果擦除掉锁位之后,芯片的SWD口会被锁掉,所以还是用串口读出来看。
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

90

帖子

0

中级会员

Rank: 3Rank: 3

积分
357
最后登录
2015-12-1
 楼主| 发表于 2015-3-16 17:20:18 | 显示全部楼层
擦除每次要擦一个扇区大小吗? 我先擦在写,总是会报错?

int flash_mem_erase(uint32_t address, uint32_t length)
{
    uint32_t ret;
        uint32_t dest_temp;
    uint32_t end;
        uint32_t size;
        uint32_t number;
        uint32_t i;
    uint32_t alignedLength;
       
        dest_temp =address;
        alignedLength =ALIGN_UP(length,FTFx_PSECTOR_SIZE);
        end = address +alignedLength;
    lock_acquire();

       
                while ((dest_temp + BYTE2WORD(FTFx_PSECTOR_SIZE)) <= end)
                {
                        size = FTFx_PSECTOR_SIZE;
                        ret = FlashEraseSector(&flashConfig, dest_temp, size, g_FlashLaunchCommand);
                        if (FTFx_OK != ret)
                        {
                                ErrorTrap(ret);
                        }
       
                        /* Verify section for several sector of PFLASH */
                        number = FTFx_PSECTOR_SIZE / PRD1SEC_ALIGN_SIZE;
                        for(i = 0x0U; i < 0x2U; i++)
                        {
                                ret = FlashVerifySection(&flashConfig, dest_temp, number, i, g_FlashLaunchCommand);
                                if (FTFx_OK != ret)
                                {
                                        ErrorTrap(ret);
                                }
                        }
                        dest_temp += BYTE2WORD(size);
                }
                lock_release();


    return ret;
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-3-16 17:27:20 | 显示全部楼层
cjpx84 发表于 2015-3-16 17:20
擦除每次要擦一个扇区大小吗? 我先擦在写,总是会报错?

int flash_mem_erase(uint32_t address, uint32_ ...

对了,操作flash的函数代码,你要放到RAM中运行。
你是擦除出错还是擦完写出错?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-22 21:20 , Processed in 0.100713 second(s), 28 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表