OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2804|回复: 1

STM32F030 flash程序

[复制链接]

9

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2018-7-10
在线时间
16 小时
发表于 2018-7-18 08:40:20 | 显示全部楼层 |阅读模式
2金钱
STM32F030 flash程序和STM32F103 flash程序一样么,我按照103的程序下进去,存不了


#include "stm32f0xx_flash.h"
#include "stmflash.h"
#include "common.h"


//¶Áȡָ¶¨µØÖ·µÄ°ë×Ö(16λÊý¾Ý)
//faddr:¶ÁµØÖ·(´ËµØÖ·±ØÐëΪ2µÄ±¶Êý!!)
//·µ»ØÖµ:¶ÔÓ¦Êý¾Ý.
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
    return *( uint16_t*)faddr;
}
#if STM32_FLASH_WREN                                        //Èç¹ûʹÄÜÁËд   
//²»¼ì²éµÄдÈë
//WriteAddr:ÆðʼµØÖ·
//pBuffer:Êý¾ÝÖ¸Õë
//NumToWrite:°ë×Ö(16λ)Êý   
void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)   
{                       
    u16 i;
    for(i=0;i<NumToWrite;i++)
    {
        FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);
        WriteAddr+=2;                                        //&#181;&#216;&#214;·&#212;&#246;&#188;&#211;2.
    }  
}
//&#180;&#211;&#214;&#184;&#182;¨&#181;&#216;&#214;·&#191;&#170;&#202;&#188;&#208;&#180;&#200;&#235;&#214;&#184;&#182;¨&#179;¤&#182;&#200;&#181;&#196;&#202;&#253;&#190;&#221;
//WriteAddr:&#198;&#240;&#202;&#188;&#181;&#216;&#214;·(&#180;&#203;&#181;&#216;&#214;·±&#216;&#208;&#235;&#206;&#170;2&#181;&#196;±&#182;&#202;&#253;!!)
//pBuffer:&#202;&#253;&#190;&#221;&#214;&#184;&#213;&#235;
//NumToWrite:°&#235;×&#214;(16&#206;&#187;)&#202;&#253;(&#190;&#205;&#202;&#199;&#210;&#170;&#208;&#180;&#200;&#235;&#181;&#196;16&#206;&#187;&#202;&#253;&#190;&#221;&#181;&#196;&#184;&#246;&#202;&#253;.)
#if STM32_FLASH_SIZE<256
#define STM_SECTOR_SIZE 1024                                 //×&#214;&#189;&#218;
#else
#define STM_SECTOR_SIZE    2048
#endif         
u16 STMFLASH_BUF[STM_SECTOR_SIZE/2];                        //×&#238;&#182;à&#202;&#199;2K×&#214;&#189;&#218;
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)   
{
    u32 secpos;                                                   //&#201;&#200;&#199;&#248;&#181;&#216;&#214;·
    u16 secoff;                                                   //&#201;&#200;&#199;&#248;&#196;&#218;&#198;&#171;&#210;&#198;&#181;&#216;&#214;·(16&#206;&#187;×&#214;&#188;&#198;&#203;&#227;)
    u16 secremain;                                             //&#201;&#200;&#199;&#248;&#196;&#218;&#202;&#163;&#211;à&#181;&#216;&#214;·(16&#206;&#187;×&#214;&#188;&#198;&#203;&#227;)      
     u16 i;   
    u32 offaddr;                                               //&#200;&#165;&#181;&#244;0X08000000&#186;ó&#181;&#196;&#181;&#216;&#214;·
    if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;    //·&#199;·¨&#181;&#216;&#214;·
    FLASH_Unlock();                                            //&#189;&#226;&#203;&#248;
    offaddr=WriteAddr-STM32_FLASH_BASE;                        //&#202;&#181;&#188;&#202;&#198;&#171;&#210;&#198;&#181;&#216;&#214;·.
    secpos=offaddr/STM_SECTOR_SIZE;                            //&#201;&#200;&#199;&#248;&#181;&#216;&#214;·  0~127 for STM32F103RBT6
    secoff=(offaddr%STM_SECTOR_SIZE)/2;                        //&#212;&#218;&#201;&#200;&#199;&#248;&#196;&#218;&#181;&#196;&#198;&#171;&#210;&#198;(2&#184;&#246;×&#214;&#189;&#218;&#206;&#170;&#187;ù±&#190;&#181;&#165;&#206;&#187;.)
    secremain=STM_SECTOR_SIZE/2-secoff;                        //&#201;&#200;&#199;&#248;&#202;&#163;&#211;à&#191;&#213;&#188;&#228;&#180;ó&#208;&#161;   
    if(NumToWrite<=secremain)secremain=NumToWrite;            //&#178;&#187;&#180;ó&#211;&#218;&#184;&#195;&#201;&#200;&#199;&#248;·&#182;&#206;§
    while(1)
    {   
        STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);        //&#182;&#193;&#179;&#246;&#213;&#251;&#184;&#246;&#201;&#200;&#199;&#248;&#181;&#196;&#196;&#218;&#200;&#221;
        for(i=0;i<secremain;i++)                            //&#208;&#163;&#209;é&#202;&#253;&#190;&#221;
        {
            if(STMFLASH_BUF[secoff+i]!=0XFFFF)
                break;                                        //&#208;è&#210;&#170;&#178;&#193;&#179;&#253;        
        }
        if(i<secremain)                                        //&#208;è&#210;&#170;&#178;&#193;&#179;&#253;
        {
            FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);                                //&#178;&#193;&#179;&#253;&#213;&#226;&#184;&#246;&#201;&#200;&#199;&#248;
            for(i=0;i<secremain;i++)                        //&#184;&#180;&#214;&#198;
            {
                STMFLASH_BUF[i+secoff]=pBuffer[i];      
            }
            STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);    //&#208;&#180;&#200;&#235;&#213;&#251;&#184;&#246;&#201;&#200;&#199;&#248;  
        }
        else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);                                    //&#208;&#180;&#210;&#209;&#190;&#173;&#178;&#193;&#179;&#253;&#193;&#203;&#181;&#196;,&#214;±&#189;&#211;&#208;&#180;&#200;&#235;&#201;&#200;&#199;&#248;&#202;&#163;&#211;à&#199;&#248;&#188;&#228;.                    
        if(NumToWrite==secremain)
            break;                                            //&#208;&#180;&#200;&#235;&#189;á&#202;&#248;&#193;&#203;
        else                                                //&#208;&#180;&#200;&#235;&#206;&#180;&#189;á&#202;&#248;
        {
            secpos++;                                        //&#201;&#200;&#199;&#248;&#181;&#216;&#214;·&#212;&#246;1
            secoff=0;                                        //&#198;&#171;&#210;&#198;&#206;&#187;&#214;&#195;&#206;&#170;0      
               pBuffer+=secremain;                              //&#214;&#184;&#213;&#235;&#198;&#171;&#210;&#198;
            WriteAddr+=secremain;                            //&#208;&#180;&#181;&#216;&#214;·&#198;&#171;&#210;&#198;      
               NumToWrite-=secremain;                            //×&#214;&#189;&#218;(16&#206;&#187;)&#202;&#253;&#181;&#221;&#188;&#245;
            if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;                            //&#207;&#194;&#210;&#187;&#184;&#246;&#201;&#200;&#199;&#248;&#187;&#185;&#202;&#199;&#208;&#180;&#178;&#187;&#205;ê
            else secremain=NumToWrite;                        //&#207;&#194;&#210;&#187;&#184;&#246;&#201;&#200;&#199;&#248;&#191;&#201;&#210;&#212;&#208;&#180;&#205;ê&#193;&#203;
        }     
    };   
    FLASH_Lock();                                            //&#201;&#207;&#203;&#248;
}
#endif

//&#180;&#211;&#214;&#184;&#182;¨&#181;&#216;&#214;·&#191;&#170;&#202;&#188;&#182;&#193;&#179;&#246;&#214;&#184;&#182;¨&#179;¤&#182;&#200;&#181;&#196;&#202;&#253;&#190;&#221;
//ReadAddr:&#198;&#240;&#202;&#188;&#181;&#216;&#214;·
//pBuffer:&#202;&#253;&#190;&#221;&#214;&#184;&#213;&#235;
//NumToWrite:°&#235;×&#214;(16&#206;&#187;)&#202;&#253;
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)      
{
    u16 i;
    for(i=0;i<NumToRead;i++)
    {
        pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);            //&#182;&#193;&#200;&#161;2&#184;&#246;×&#214;&#189;&#218;.
        ReadAddr+=2;                                        //&#198;&#171;&#210;&#198;2&#184;&#246;×&#214;&#189;&#218;.   
    }
}

//////////////////////////////////////////////////////////////////////////////////////////////////////
//WriteAddr:&#198;&#240;&#202;&#188;&#181;&#216;&#214;·
//WriteData:&#210;&#170;&#208;&#180;&#200;&#235;&#181;&#196;&#202;&#253;&#190;&#221;
void Test_Write(u32 WriteAddr,u16 WriteData)      
{
    STMFLASH_Write(WriteAddr,&WriteData,1);                    //&#208;&#180;&#200;&#235;&#210;&#187;&#184;&#246;×&#214;
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2018-7-18 09:45:59 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-16 21:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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