|
stm32g0 只有hal库实现了flash的读写,ll库是没有的
下面的代码可以在LL库中使用,测试已经通过。主要用于iap编程。
stm32g系列和F系列 在flash编程上最大的区别是 g0一次写入必须是8个字节。而F系列没有这个限制。
void FLASH_Unlock(void)
{
WRITE_REG(FLASH->KEYR, FLASH_KEY1);
WRITE_REG(FLASH->KEYR, FLASH_KEY2);
}
void FLASH_Lock(void)
{
SET_BIT(FLASH->CR, FLASH_CR_LOCK);
}
void FLASH_Program_DoubleWord(uint32_t Address, uint8_t *Data)
{
uint32_t d1;
while ((FLASH->SR & FLASH_SR_BSY1) != 0x00U)
{
}
SET_BIT(FLASH->CR, FLASH_CR_PG);
d1 = *(uint32_t *)Data;
*(uint32_t *)Address = d1;
__ISB();
Data += 4;
d1 = *(uint32_t *)Data;
*(uint32_t *)(Address + 4U) = d1;
while ((FLASH->SR & FLASH_SR_BSY1) != 0x00U)
{
}
CLEAR_BIT(FLASH->CR, FLASH_CR_PG);
}
int flashWrite(uint32_t addr,uint16_t size,uint8_t *pdat)
{
int i;
uint8_t tab[8]={0};
FLASH_Unlock();
if( (addr % 8) != 0 )
return -1;
while( size >= 8 )
{
FLASH_Program_DoubleWord(addr,pdat);
addr += 8;
pdat += 8;
size -= 8;
}
if( size > 0 )
{
for( i=0; i<size; i++ )
{
tab[i] = *pdat;
pdat++;
}
FLASH_Program_DoubleWord(addr,tab);
}
FLASH_Lock();
return 0;
}
void EarseSector(int sector)
{
uint32_t tmp;
FLASH_Unlock();
//判断flash 是否忙碌
while ((FLASH->SR & FLASH_SR_BSY1) != 0x00U)
{
}
tmp = (FLASH->CR & ~FLASH_CR_PNB);
FLASH->CR = (tmp | (FLASH_CR_STRT | (sector << FLASH_CR_PNB_Pos) | FLASH_CR_PER));
while ((FLASH->SR & FLASH_SR_BSY1) != 0x00U)
{
}
CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
FLASH_Lock();
}
|
|