打印
[STM32F1]

测试STM32F103 内部flash的情况

[复制链接]
1946|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
東南博士|  楼主 | 2018-5-24 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关键的代码列出:
        key=KEY_Scan(0);

u8 KEY_Scan(u8 mode)
{         
        static u8 key_up=1;//按键按松开标志
        if(mode)key_up=1;  //支持连按                  
        if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
        {
                delay_ms(10);//去抖动
                key_up=0;
                if(KEY0==0)return KEY0_PRES;
                else if(KEY1==0)return KEY1_PRES;
                else if(KEY2==0)return KEY2_PRES;
                else if(WK_UP==1)return WKUP_PRES;
        }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;             
        return 0;// 无按键按下
}

沙发
東南博士|  楼主 | 2018-5-24 15:54 | 只看该作者
        if(key==KEY1_PRES)        //KEY1按下,写入STM32 FLASH
        {
            STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
        }

使用特权

评论回复
板凳
東南博士|  楼主 | 2018-5-24 15:55 | 只看该作者
        if(key==KEY0_PRES)        //KEY0按下,读取字符串并显示
        {
            STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);
        }

使用特权

评论回复
地板
東南博士|  楼主 | 2018-5-24 16:38 | 只看该作者
void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
{
    u32 secpos;           //扇区地址
    u16 secoff;           //扇区内偏移地址(16位字计算)
    u16 secremain; //扇区内剩余地址(16位字计算)
    u16 i;
    u32 offaddr;   //去掉0X08000000后的地址
    if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址
    FLASH_Unlock();                                                //解锁
    offaddr=WriteAddr-STM32_FLASH_BASE;                //实际偏移地址.
    secpos=offaddr/STM_SECTOR_SIZE;                        //扇区地址  0~127 for STM32F103RBT6
    secoff=(offaddr%STM_SECTOR_SIZE)/2;                //在扇区内的偏移(2个字节为基本单位.)
    secremain=STM_SECTOR_SIZE/2-secoff;                //扇区剩余空间大小
    if(NumToWrite<=secremain)secremain=NumToWrite;//不大于该扇区范围
    while(1)
    {
        STMFLASH_Read(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//读出整个扇区的内容
        for(i=0; i<secremain; i++) //校验数据
        {
            if(STMFLASH_BUF[secoff+i]!=0XFFFF)break;//需要擦除
        }
        if(i<secremain)//需要擦除
        {
            FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//擦除这个扇区
            for(i=0; i<secremain; i++) //复制
            {
                STMFLASH_BUF[i+secoff]=pBuffer[i];
            }
            STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,STMFLASH_BUF,STM_SECTOR_SIZE/2);//写入整个扇区
        } else STMFLASH_Write_NoCheck(WriteAddr,pBuffer,secremain);//写已经擦除了的,直接写入扇区剩余区间.
        if(NumToWrite==secremain)break;//写入结束了
        else//写入未结束
        {
            secpos++;                                //扇区地址增1
            secoff=0;                                //偏移位置为0
            pBuffer+=secremain;          //指针偏移
            WriteAddr+=secremain;        //写地址偏移
            NumToWrite-=secremain;        //字节(16位)数递减
            if(NumToWrite>(STM_SECTOR_SIZE/2))secremain=STM_SECTOR_SIZE/2;//下一个扇区还是写不完
            else secremain=NumToWrite;//下一个扇区可以写完了
        }
    };
    FLASH_Lock();//上锁
}

使用特权

评论回复
5
東南博士|  楼主 | 2018-5-24 16:39 | 只看该作者
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)
{
    u16 i;
    for(i=0; i<NumToRead; i++)
    {
        pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.
        ReadAddr+=2;//偏移2个字节.
    }
}

使用特权

评论回复
6
東南博士|  楼主 | 2018-5-24 16:44 | 只看该作者
//WriteAddr:起始地址
//WriteData:要写入的数据
void Test_Write(u32 WriteAddr,u16 WriteData)
{
    STMFLASH_Write(WriteAddr,&WriteData,1);//写入一个字
}

使用特权

评论回复
7
xuanhuanzi| | 2018-5-24 19:00 | 只看该作者
多谢分享,内部的闪存可以存储数据,作为EEPROM呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

382

主题

6081

帖子

34

粉丝