|
bool FLASH_Unlock(void)
{
if((FLASH->CR & FLASH_CR_LOCK) != 0x00U)
{
FLASH->CR = FLASH_KEY1;
FLASH->CR = FLASH_KEY2;
if((FLASH->CR & FLASH_CR_LOCK) != 0x00U)
{
return false;
}
}
return true;
}
bool FLASH_Lock(void)
{
FLASH->CR |= FLASH_CR_LOCK;
if((FLASH->CR & FLASH_CR_LOCK) != 0x00U)
{
return true;
}
return true;
}
/*
* typeErase 擦除方式
* SectorNumber 扇区编号 0-11
*/
bool FLASHEx_Erase(uint8_t typeErase, uint8_t SectorNumber)
{
FLASH_Unlock();
FLASH->CR |= FLASH_CR_PSIZE_1; //x32编程大小
if(!(FLASH->CR & FLASH_CR_MER && FLASH->CR & FLASH_CR_SER) || (FLASH->CR & FLASH_CR_MER && FLASH->CR & FLASH_CR_SER))
{
if(!(FLASH->SR & FLASH_SR_BSY)) //未执行Flash操作
{
if(typeErase == FLASH_TYPEERASE_BATCH) /* 批量方式擦除 */
{
FLASH->CR |= FLASH_CR_MER;// | FLASH_CR_MER1; //批量擦除12-23扇区 擦除块 1 里的所有扇区
FLASH->CR |= FLASH_CR_STRT;
while(FLASH->CR & FLASH_SR_BSY);
}
else if(typeErase == FLASH_TYPEERASE_SECTORS)
{
FLASH->CR |= FLASH_CR_SER;
FLASH->CR |= (SectorNumber << FLASH_CR_SNB_Pos);
FLASH->CR |= FLASH_CR_STRT;
while(FLASH->CR & FLASH_SR_BSY);
}
}
FLASH->CR &= (~(FLASH_CR_SER | FLASH_CR_SNB)); //
}
FLASH_Unlock();
return true;
}
/*
* Flash从1写0时无需执行擦除操作.反之
* 默认x32一个字
* Flash地址要32字节对齐
* 第3个参数是32字节的整数倍
*/
bool FLASHEx_Write(uint32_t FlashAddress, uint32_t Data)
{
__IO uint32_t* dest_addr = (__IO uint32_t*)FlashAddress;
FLASH->CR |= FLASH_CR_PSIZE_1; //x32编程大小
__set_PRIMASK(1);
FLASH_Unlock();
if(!(FLASH->SR & FLASH_SR_BSY)) //未执行Flash操作
{
FLASH->CR |= FLASH_CR_PG;
*dest_addr = Data;
while(FLASH->CR & FLASH_SR_BSY);
FLASH->CR &= (~FLASH_CR_PG);
}
/* Flash 加锁,禁止写Flash控制寄存器 */
FLASH_Lock();
__set_PRIMASK(0); /* 开中断 */
return false;
}
uint32_t FlashAddress = 0x08040000 ; //扇区2
uint32_t pData = 0x12345678;
uint32_t *read_pointer = NULL;
//main调用
void test(void)
{
int8_t i = 1;
while(i--)
{
FLASHEx_Erase(FLASH_TYPEERASE_SECTORS, 2); //扇区擦除模式;擦除扇区2
FLASHEx_Write(FlashAddress,pData); //写一个字
mSDelay(100);
// readFlash(buf_to_get, 100, FlashAddress);
read_pointer = (uint32_t *)FlashAddress;
mSDelay(100);
Uart_Send((uint8_t*)read_pointer);
}
}
|
|