有用过stm32L15系列内部eeprom的吗,主函数里加入eeprom功能后不论如何修改代码,仿真的时候程序都会跳到HardFault_Handler里,
贴上代码大家帮忙看一下
[mw_shl_code=c,true]/***********************************************************************
?????????EEPROM.C
?? ????????eeprom??????×÷????
±à???±????2015-08-21
±à ?? ????
×? ????
***********************************************************************/
#include "main.h"
/*------------------------------------------------------------
Func: EEPROM????°?×???????
Note:
------------------------------------------------------------*/
void EEPROM_ReadBytes(u16 Addr,u8 *Buffer,u16 Length)
{
u8 *wAddr;
wAddr=(u8 *)(EEPROM_BASE_ADDR+Addr);
while(Length--){
*Buffer++=*wAddr++;
}
}
/*------------------------------------------------------------
Func: EEPROM????????
Note:
-------------------------------------------------------------*/
void EEPROM_ReadWords(u16 Addr,u16 *Buffer,u16 Length)
{
u32 *wAddr;
wAddr=(u32 *)(EEPROM_BASE_ADDR+Addr);
while(Length--){
*Buffer++=*wAddr++;
}
}
/*------------------------------------------------------------
Func: EEPROM????°?×???????
Note:
-------------------------------------------------------------*/
void EEPROM_WriteBytes(u16 Addr,u8 *Buffer,u16 Length)
{
u8 *wAddr;
wAddr=(u8 *)(EEPROM_BASE_ADDR+Addr);
DIS_INT
FLASH->  EKEYR=PEKEY1; //unlock
FLASH->  EKEYR=PEKEY2;
while(FLASH->  ECR&FLASH_PECR_PELOCK);
FLASH->  ECR|=FLASH_PECR_FTDW; //not fast write
while(Length--){
*wAddr++=*Buffer++;
while(FLASH->SR&FLASH_SR_BSY);
}
FLASH->  ECR|=FLASH_PECR_PELOCK;
EN_INT
}
/*------------------------------------------------------------
Func: EEPROM????°?×?????
Note: ×??±°?×???
-------------------------------------------------------------*/
void EEPROM_WriteWords(u16 Addr,u16 *Buffer,u16 Length)
{
u32 *wAddr;
wAddr=(u32 *)(EEPROM_BASE_ADDR+Addr);
DIS_INT
FLASH->  EKEYR=PEKEY1; //unlock
FLASH->  EKEYR=PEKEY2;
while(FLASH->  ECR&FLASH_PECR_PELOCK);
FLASH->  ECR|=FLASH_PECR_FTDW; //not fast write
while(Length--){
*wAddr++=*Buffer++;
while(FLASH->SR&FLASH_SR_BSY);
}
FLASH->  ECR|=FLASH_PECR_PELOCK;
EN_INT
}
void EEPROM_Init(void)
{
DIS_INT
FLASH->PEKEYR=PEKEY1; //unlock
FLASH->PEKEYR=PEKEY2; [/mw_shl_code]
[mw_shl_code=c,true] 主函数[/mw_shl_code]
int main(void)
{
unsigned int i;
u16 buf[EEPROM_BYTE_SIZE],buf2[EEPROM_BYTE_SIZE];
EEPROM_Init();
LED_Configuration();
_Delay(0xfff);
LED1_ON;
_Delay(0xfff);
while(1)
{
LED1_ON;
_Delay(0xfff);
EEPROM_ReadWords((u16)0,buf2,EEPROM_BYTE_SIZE);
LED1_OFF;
_Delay(0xfff);
}
}
|