写了一夜,把冷火的flash在线编程给开发出来了

从此,调参数再也不用一遍一遍下程序了,上代码

#ifndef FLASH_H_
#define FLASH_H_
#include "support_common.h" 
#define FLASH_PAGESIZE 4096
#define FLASH_PROG_OFFSET 0x44000000//地址偏移量

#define FLASH_PROGRAM 0x20  //写入命令
#define FLASH_PAGE_ERASE 0x40//页擦除命令

void FlashPageErase(uint8 page);//擦除指定的页
void FlashPageWrite(uint8 page,uint16 pstart,uint32 N);//写flash
uint32  FlashRead(uint8 page,uint16 pstart);//读flash

#endif

 

#include"flash.h"
void FlashPageErase(uint8 page)//page为要擦除的页(0=<page<=127),选第127页
{
        uint32*address;
        uint8 sector;
        address=(uint32*)(page*FLASH_PAGESIZE+FLASH_PROG_OFFSET);//1.算出页首地址
        sector=page/4;//对应的扇区
        
        MCF_CFM_CFMPROT&=~MCF_CFM_CFMPROT_PROTECT(sector);//2.解除对页所在扇区的保护
        
        MCF_CFM_CFMCLKD=MCF_CFM_CFMCLKD_DIV(30)
                       |MCF_CFM_CFMCLKD_PRDIV8;//3,设置flash的工作频率为161.3khz
                       
        while(!(MCF_CFM_CFMUSTAT&MCF_CFM_CFMUSTAT_CBEIF));//4等待命令缓冲区空
        
           MCF_CFM_CFMUSTAT|=MCF_CFM_CFMUSTAT_PVIOL;//清侵害保护标志位
        MCF_CFM_CFMUSTAT|=MCF_CFM_CFMUSTAT_ACCERR;//清访问出错标志位
         
    *address=0x0;//5向擦除页内任意地址写任意值,以定位要擦除的的页
    
    MCF_CFM_CFMCMD=MCF_CFM_CFMCMD_CMD(FLASH_PAGE_ERASE);//6页擦除命令
    MCF_CFM_CFMUSTAT|=MCF_CFM_CFMUSTAT_CBEIF;//7,启动命令执行
    
    while(!(MCF_CFM_CFMUSTAT&MCF_CFM_CFMUSTAT_CCIF));//8等待命令执行完成
                       
}
void FlashPageWrite(uint8 page,uint16 pstart,uint32 N)//page是页号,pstart是该页中的字号(0=<page<=127),(0=<pstart<=1023)
{
        uint32*address;
        uint8 sector;
        address=(uint32*)(page*FLASH_PAGESIZE+pstart*4+FLASH_PROG_OFFSET);//1.算出字首地址
        sector=page/4;//对应的扇区
        
        MCF_CFM_CFMPROT&=~MCF_CFM_CFMPROT_PROTECT(sector);//2.解除对页所在扇区的保护
        
    MCF_CFM_CFMCLKD=MCF_CFM_CFMCLKD_DIV(30)
                       |MCF_CFM_CFMCLKD_PRDIV8;//3,设置flash的工作频率为161.3khz
                       
    while(!(MCF_CFM_CFMUSTAT&MCF_CFM_CFMUSTAT_CBEIF));//4等待命令缓冲区空
    
        MCF_CFM_CFMUSTAT|=MCF_CFM_CFMUSTAT_PVIOL;//清侵害保护标志位
        MCF_CFM_CFMUSTAT|=MCF_CFM_CFMUSTAT_ACCERR;//清访问出错标志位
        
        *address=N;//5写入数据
        
        MCF_CFM_CFMCMD=MCF_CFM_CFMCMD_CMD(FLASH_PROGRAM);//6写入命令
        MCF_CFM_CFMUSTAT|=MCF_CFM_CFMUSTAT_CBEIF;//7,启动命令执行
        
    while(!(MCF_CFM_CFMUSTAT&MCF_CFM_CFMUSTAT_CCIF));//8等待命令执行完成
    
    MCF_CFM_CFMPROT|=MCF_CFM_CFMPROT_PROTECT(sector);//9.给所在页加保护
        
        
}
uint32  FlashRead(uint8 page,uint16 pstart)//page是页号,pstart是该页中的字号
{
        uint32*address;
        uint32 n;
        address=(uint32*)(page*FLASH_PAGESIZE+pstart*4);//1.算出字首地址
        n=*address;
        return n;
}

 

永不止步步 发表于11-14 09:51 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308217个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号