OpenEdv-开源电子网

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

stm32l1xx的flash操作不正确

[复制链接]

17

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-4-26
在线时间
78 小时
发表于 2018-5-4 09:32:24 | 显示全部楼层 |阅读模式
3金钱
我在操作STM32L1XX的flash的时候,仿照103的代码,修改之后没有报错,但是flash的读写操作进行不了。DEBUG之后发现程序死在了一个地方,麻烦大神帮我看一下,或者有操作过的帮我看一下。
[mw_shl_code=applescript,true]//êμÏÖflashμĶáD′2á3y2ù×÷

#include "flash.h"


//uint16_t STMFLASH_BUF[STM_SECTOR_SIZE/2];//???2K??
uint16_t STMFLASH_BUF[10];//???2K??



  
//?????????(16???)
//faddr:???(??????2???!!)
//???:????.
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
        return *(vu16*)faddr;
}
#if STM32_FLASH_WREN        //??????   
//??????
//WriteAddr:????
//pBuffer:????
//NumToWrite:??(16?)?   
void STMFLASH_Write_NoCheck(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite)   
{                                           
        uint16_t i;
        for(i=0;i<NumToWrite;i++)
        {
                FLASH_FastProgramWord(WriteAddr,pBuffer);
            WriteAddr+=2;//????2.
        }  
}


void STMFLASH_Write(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite)       
{
        uint32_t secpos;           //????
//         uint16_t i;   
        uint32_t offaddr;   //??0X08000000????
        //__disable_interrupt();
        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

                        FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//??????

                        STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE,pBuffer,STM_SECTOR_SIZE/2);//??????  
        FLASH_Lock();//??
        //__enable_interrupt();
}

void STMFLASH_Erase(uint32_t Addr)       
{
        uint32_t secpos;           //????
//        uint16_t i;   
        uint32_t offaddr;   //??0X08000000????
        //__disable_interrupt();
        if(Addr<STM32_FLASH_BASE||(Addr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//????
        FLASH_Unlock();                                                //??
        offaddr=Addr-STM32_FLASH_BASE;                //??????.
        secpos=offaddr/STM_SECTOR_SIZE;                        //????  0~127 for STM32F103RBT6

        FLASH_ErasePage(secpos*STM_SECTOR_SIZE+STM32_FLASH_BASE);//??????

        FLASH_Lock();//??
        //__enable_interrupt();
}


#endif

//????????????????
//ReadAddr:????
//pBuffer:????
//NumToWrite:??(16?)?
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)          
{
        uint16_t i;
        for(i=0;i<NumToRead;i++)
        {
                pBuffer=STMFLASH_ReadHalfWord(ReadAddr);//??2???.
                ReadAddr+=2;//??2???.       
        }
}

//////////////////////////////////////////////////////////////////////////////////////////////////////
//WriteAddr:????
//WriteData:??????
void Test_Write(uint32_t WriteAddr,uint16_t WriteData)          
{
        STMFLASH_Write(WriteAddr,&WriteData,1);//?????
}



[/mw_shl_code]

[mw_shl_code=applescript,true]#ifndef __STMFLASH_H__
#define __STMFLASH_H__
#include "stm32l1xx.h"
#include "stm32l1xx_flash.h"
#include "sys.h"

//////////////////////////////////////////////////////////////////////////////////////////////////////
//???????????
#define STM32_FLASH_SIZE 128*1024                          //??STM32?FLASH????(???K)
#define STM32_FLASH_WREN 1              //??FLASH??(0,???;1,??)
//////////////////////////////////////////////////////////////////////////////////////////////////////
#if STM32_FLASH_SIZE<256*1024
#define STM_SECTOR_SIZE 1024 //??
#else
#define STM_SECTOR_SIZE        2048
#endif       
//FLASH????
#define STM32_FLASH_BASE 0x08000000         //STM32 FLASH?????
#define FLASH_END STM32_FLASH_BASE+STM32_FLASH_SIZE
//FLASH????
/* Flash Control Register bits */
#define CR_PG_Set                ((uint32_t)0x00000001)
#define CR_PG_Reset              ((uint32_t)0x00001FFE)
#define CR_PER_Set               ((uint32_t)0x00000002)
#define CR_PER_Reset             ((uint32_t)0x00001FFD)
#define CR_MER_Set               ((uint32_t)0x00000004)
#define CR_MER_Reset             ((uint32_t)0x00001FFB)
#define CR_OPTPG_Set             ((uint32_t)0x00000010)
#define CR_OPTPG_Reset           ((uint32_t)0x00001FEF)
#define CR_OPTER_Set             ((uint32_t)0x00000020)
#define CR_OPTER_Reset           ((uint32_t)0x00001FDF)
#define CR_STRT_Set              ((uint32_t)0x00000040)
#define CR_LOCK_Set              ((uint32_t)0x00000080)

/* FLASH Keys */
#define RDP_Key                  ((uint16_t)0x00A5)
#define FLASH_KEY1               ((uint32_t)0x45670123)
#define FLASH_KEY2               ((uint32_t)0xCDEF89AB)
/* Delay definition */   
#define EraseTimeout          ((uint32_t)0x000B0000)
#define ProgramTimeout        ((uint32_t)0x00002000)





u16 STMFLASH_ReadHalfWord(u32 faddr);
void STMFLASH_Write_NoCheck(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite);
void STMFLASH_Write(uint32_t WriteAddr,uint16_t *pBuffer,uint16_t NumToWrite);
void STMFLASH_Erase(uint32_t Addr);
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead);
void Test_Write(uint32_t WriteAddr,uint16_t WriteData);
//FLASH_ProgramHalfWord(WriteAddr,pBuffer);
//????
void Test_Write(uint32_t WriteAddr,uint16_t WriteData);                                                                  
#endif














[/mw_shl_code]


debug的时候就死在了这个函数里
/**
  * @brief  This function handles Hard Fault exception.
  * @param  None
  * @retval None
  */
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

最佳答案

查看完整内容[请看2#楼]

已经解决了,擦除的地址写的不正确
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
466
金钱
466
注册时间
2018-4-26
在线时间
78 小时
 楼主| 发表于 2018-5-4 09:32:25 | 显示全部楼层
已经解决了,擦除的地址写的不正确
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-5-5 01:41:06 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2019-7-6
在线时间
29 小时
发表于 2020-6-12 17:23:21 | 显示全部楼层
你好,请问一下STMFLASH_Write_NoCheck函数中的FLASH_FastProgramWord,原型是FLASH_Status FLASH_FastProgramWord(uint32_t Address, uint32_t Data),数据一次写入是32位的,这样没问题吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 04:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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