硬汉嵌入式论坛

 找回密码
 立即注册
查看: 647|回复: 3
收起左侧

[有问必答] 内部FLASH读取,擦除失败,求大佬指正

[复制链接]

6

主题

32

回帖

50

积分

初级会员

积分
50
发表于 2022-5-17 10:30:41 | 显示全部楼层 |阅读模式
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);

    }

}


回复

使用道具 举报

6

主题

32

回帖

50

积分

初级会员

积分
50
 楼主| 发表于 2022-5-17 10:34:21 | 显示全部楼层
image.png
回复

使用道具 举报

6

主题

32

回帖

50

积分

初级会员

积分
50
 楼主| 发表于 2022-5-17 11:58:10 | 显示全部楼层
找到问题了,寄存器写错了一个
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2022-5-18 00:27:14 | 显示全部楼层
money7110 发表于 2022-5-17 11:58
找到问题了,寄存器写错了一个

好的,解决了就好。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 06:05 , Processed in 0.210418 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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