中级会员
 
- 积分
- 466
- 金钱
- 466
- 注册时间
- 2018-4-26
- 在线时间
- 78 小时
|
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)
{
}
}
|
|