搜索
bottom↓
回复: 7

STM32G0 LL库 flash编程 分享

[复制链接]

出0入131汤圆

发表于 2022-3-21 13:55:03 | 显示全部楼层 |阅读模式
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();
}

出0入0汤圆

发表于 2022-3-22 09:25:52 | 显示全部楼层
G是便宜,就是不知道的坑太多,还不敢用,谢谢分享

出0入0汤圆

发表于 2022-3-22 10:32:08 | 显示全部楼层
G0 好用,谢谢!!!

出0入0汤圆

发表于 2022-4-8 12:41:29 | 显示全部楼层
G0 好用,谢谢!!!

出0入0汤圆

发表于 2022-4-8 23:00:34 | 显示全部楼层
G0 几年后,怕是价格也飞上天~

出0入0汤圆

发表于 2022-5-24 12:09:59 | 显示全部楼层
G0 好用,谢谢!!!

出0入45汤圆

发表于 2022-7-4 19:49:27 | 显示全部楼层

G0 好用,谢谢!!!

出0入0汤圆

发表于 2022-7-6 11:37:38 | 显示全部楼层
G0  LL库读保护怎么搞的呢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 19:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表