asj1989 发表于 2022-3-21 13:55:03

STM32G0 LL库 flash编程 分享

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={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 = *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();
}

maidilong2022 发表于 2022-3-22 09:25:52

G是便宜,就是不知道的坑太多,还不敢用,谢谢分享

lfgc 发表于 2022-3-22 10:32:08

G0 好用,谢谢!!!

TKZXJ 发表于 2022-4-8 12:41:29

G0 好用,谢谢!!!

lyg407 发表于 2022-4-8 23:00:34

G0 几年后,怕是价格也飞上天~{:lol:}

kissmybaby 发表于 2022-5-24 12:09:59

G0 好用,谢谢!!!

feibagezib 发表于 2022-7-4 19:49:27


G0 好用,谢谢!!!

tdchenke 发表于 2022-7-6 11:37:38

G0LL库读保护怎么搞的呢
页: [1]
查看完整版本: STM32G0 LL库 flash编程 分享