GD32写FLASH写不进去 如何关掉写保护

[复制链接]
680|4
 楼主 | 2018-9-21 09:57 | 显示全部楼层 |阅读模式
保存一些数据到FLASH里面,实验得到是写保护开了,写不进去
如何把GD32的写保护关掉

                FMC_OB_Unlock();
                FMC_OB_EnableWRP(WRP_SECTOR0);        // 0块 写保护,其它地方不保护
                FMC_OB_Lock();
               
我是这样操作的,不成功.数据还是写不进去
| 2018-9-21 16:04 | 显示全部楼层
本帖最后由 高IAI阳 于 2018-9-21 16:37 编辑

可选字节块解锁属于二次解锁,解锁之前需要先进行一次解锁。具体还要看芯片种类,另外对flash较低的地址写保护,会导致程序无法下载到flash的情形。                                          
上图是307的FMC保护和擦除操作,去除编程保护需要擦除选项字节,同时需要系统复位才能生效。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-9-27 21:14 | 显示全部楼层
参考你所选器件的 EXAMPLE  里面基本都会有的!
 楼主 | 2018-10-1 19:19 | 显示全部楼层
lvben5d 发表于 2018-9-27 21:14
参考你所选器件的 EXAMPLE  里面基本都会有的!

EXAMPLE 不知道哪里找
 楼主 | 2018-10-1 21:00 | 显示全部楼层
lvben5d 发表于 2018-9-27 21:14
参考你所选器件的 EXAMPLE  里面基本都会有的!

按你说的,找到了。非常感谢提醒

/**
  ******************************************************************************
  * @brief   Main program body
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "gd32f1x0.h"
#include "gd32f1x0_gpio.h"
#include "gd32f1x0_eval.h"

/* Private typedef -----------------------------------------------------------*/
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;

/* Private define ------------------------------------------------------------*/
#define BufferSize                   2048

#define FMC_PAGE_SIZE                ((uint16_t)0x400)
#define FMC_PAGES_PROTECTED          (WRP_SECTOR4)

#define BANK1_WRITE_START_ADDR       ((uint32_t)0x08004000)
#define BANK1_WRITE_END_ADDR         ((uint32_t)0x08004800)


/* Private function prototypes -----------------------------------------------*/
void LED_config(void);

/* Private variables ---------------------------------------------------------*/
uint32_t m2m = 0,m2u =0;
__IO TestStatus TransferStatus = FAILED;

uint32_t *ptrd;
uint32_t WriteProtected_Value = 0xFFFFFFFF, ProtectedPages = 0x0;
uint32_t EraseCounter = 0x00, Address = 0x00;
uint32_t Data = 0x1234ABCD;
__IO uint32_t NbrOfPage = 0x00;
volatile FMC_State FMCStatus = FMC_READY;
volatile TestStatus MemoryProgramStatus = PASSED;

/* Uncomment this line to program the Falsh pages */
#define FMC_PAGE_PROGRAM

/* Private functions ---------------------------------------------------------*/
/**
  * @brief  Main program
  * @param  None
  * @retval None
  */
int main(void)
{
    uint32_t i;
    TransferStatus = PASSED;
   
    GD_EVAL_LEDInit(LED1);
    GD_EVAL_LEDInit(LED2);
    GD_EVAL_LEDInit(LED3);
    GD_EVAL_LEDInit(LED4);

    /* Unlock the Flash Bank1 Program Erase controller */
    FMC_Unlock();
   
    FMC_OB_Unlock();
   
    /* Clear All pending flags */
    FMC_ClearBitState(FMC_FLAG_EOP | FMC_FLAG_WERR | FMC_FLAG_PERR );      
   
    /* Get status of pages write protection */
    WriteProtected_Value = FMC_OB_GetWRP();
   
#ifdef WRITE_PROTECTION_DISABLE
  
    /* Get write protected pages */
    ProtectedPages = ~(WriteProtected_Value | FMC_PAGES_PROTECTED);
   
    /* Check whether the specified pages is write protected  */
    if((WriteProtected_Value | (~FMC_PAGES_PROTECTED)) != 0xFFFFFFFF)
    {
        /* Erase all the option Bytes */
        FMCStatus = FMC_OB_Erase();
   
        /* Check if other pages write protected */
        if(ProtectedPages != 0x0)
        {
            /* Restore other pages write protected */
            FMCStatus = FMC_OB_EnableWRP(ProtectedPages);
        }
        /* Generate a system reset to reload the option byte */      
        FMC_OB_Reset();
    }

#elif defined WRITE_PROTECTION_ENABLE
    /* Get already write protected pages and the new specified pages to be protected */
    ProtectedPages =  (~WriteProtected_Value) | FMC_PAGES_PROTECTED;
   
    /* Check whether the specified pages is write protected */
    if(((~WriteProtected_Value) & FMC_PAGES_PROTECTED )!= FMC_PAGES_PROTECTED)
    {
        FMCStatus = FMC_OB_Erase();
        
        /* Enable the pages write protection */
        FMCStatus = FMC_OB_EnableWRP(ProtectedPages);
        
        /* Generate a system reset to reload the option byte */
        FMC_OB_Reset();
    }  
#endif

#ifdef FMC_PAGE_PROGRAM  

    /* Define the number of page to be erased */
    NbrOfPage = (BANK1_WRITE_END_ADDR - BANK1_WRITE_START_ADDR) / FMC_PAGE_SIZE;
   
    /* Erase the FLASH pages */
    for(EraseCounter = 0; EraseCounter < NbrOfPage; EraseCounter++)
    {
        FMCStatus = FMC_ErasePage(BANK1_WRITE_START_ADDR + (FMC_PAGE_SIZE * EraseCounter));
        FMC_ClearBitState(FMC_FLAG_EOP | FMC_FLAG_WERR | FMC_FLAG_PERR );
    }
   
    FMC_Lock();
   
    ptrd = (uint32_t*)BANK1_WRITE_START_ADDR;

    for(i = 0; i < 512; i++)
    {
        if(*ptrd != 0xFFFFFFFF)
        {
            TransferStatus = FAILED;
            break;
        }
        else
        {
            ptrd++;
        }
    }

    /* Unlock the Flash Bank1 Program Erase controller */
    FMC_Unlock();

    /* Program Flash Bank1 */
    Address = BANK1_WRITE_START_ADDR;

    while(Address < BANK1_WRITE_END_ADDR)
    {
        FMCStatus = FMC_ProgramWord(Address, Data);
        Address = Address + 4;
        FMC_ClearBitState(FMC_FLAG_EOP | FMC_FLAG_WERR | FMC_FLAG_PERR );   
    }
   
    FMC_Lock();
   
    ptrd = (uint32_t*)BANK1_WRITE_START_ADDR;

    for(i = 0; i < 512; i++)
    {
        if(*ptrd == 0xFFFFFFFF)
        {
            TransferStatus = FAILED;
            break;
        }
        else
        {
            ptrd++;
        }
    }
   
    if(TransferStatus == FAILED)
    {
        GD_EVAL_LEDOn(LED1);
        GD_EVAL_LEDOff(LED2);
        GD_EVAL_LEDOn(LED3);
        GD_EVAL_LEDOff(LED4);
    }
    else
    {
        GD_EVAL_LEDOff(LED1);
        GD_EVAL_LEDOn(LED2);
        GD_EVAL_LEDOff(LED3);
        GD_EVAL_LEDOn(LED4);
    }
#endif
    while(1)
    {
    }
}
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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