打印
[RISC-V MCU 创新应用比赛]

第二部分:实现对CH32V103芯片内部Flash的控制

[复制链接]
3428|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一路向北lm|  楼主 | 2021-8-12 23:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
上锁与解锁,上锁就是操作FLASH->CTLR寄存器,赋值为CR_LOCK_Set,而解锁便是两次往FLASH->KEYR 写入FLASH_KEY1与FLASH_KEY2的值。需要注意的是每次操作内部FLASH都需要解锁,操作完成后再对内部FLASH上锁。
void FLASH_Lock(void)
{
  FLASH->CTLR |= CR_LOCK_Set;
}

void FLASH_Unlock(void)
{
  FLASH->KEYR = FLASH_KEY1;
  FLASH->KEYR = FLASH_KEY2;
}


使用特权

评论回复

相关帖子

沙发
一路向北lm|  楼主 | 2021-8-13 00:02 | 只看该作者
页擦除与全片擦除,一般在烧录前会对芯片进行部分擦除或者全片擦除,这个根据需求来调取函数,具体分析大家可以参考FLASH相关的寄存器。
FLASH_Status FLASH_ErasePage(uint32_t Page_Address)
{
  FLASH_Status status = FLASH_COMPLETE;
  status = FLASH_WaitForLastOperation(EraseTimeout);
  if(status == FLASH_COMPLETE)
  {
    FLASH->CTLR|= CR_PER_Set;
    FLASH->ADDR = Page_Address;
    FLASH->CTLR|= CR_STRT_Set;
status = FLASH_WaitForLastOperation(EraseTimeout);
    FLASH->CTLR &= CR_PER_Reset;
  }
  *(__IO uint32_t*)0x40022034 = *(__IO uint32_t*)((Page_Address & 0xFFFFFFFC) ^ 0x00001000);
  return status;
}

FLASH_Status FLASH_EraseAllPages(void)
{
  FLASH_Status status = FLASH_COMPLETE;
  status = FLASH_WaitForLastOperation(EraseTimeout);
  if(status == FLASH_COMPLETE)
  {
     FLASH->CTLR |= CR_MER_Set;
     FLASH->CTLR |= CR_STRT_Set;
    status = FLASH_WaitForLastOperation(EraseTimeout);
    FLASH->CTLR &= CR_MER_Reset;
  }
  return status;
}


使用特权

评论回复
板凳
一路向北lm|  楼主 | 2021-8-13 20:26 | 只看该作者
Falsh写字和半字操作,无论是写字和半字需要注意的是,写之前需要打开写保护。
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{
  FLASH_Status status = FLASH_COMPLETE;
  status = FLASH_WaitForLastOperation(ProgramTimeout);
  if(status == FLASH_COMPLETE)
  {
    FLASH->CTLR |= CR_PG_Set;
    *(__IO uint16_t*)Address = Data;
    status = FLASH_WaitForLastOperation(ProgramTimeout);
    FLASH->CTLR &= CR_PG_Reset;
  }
        *(__IO uint32_t*)0x40022034 = *(__IO uint32_t*)((Address & 0xFFFFFFFC) ^ 0x00001000);
  return status;
}

FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)
{
  FLASH_Status status = FLASH_COMPLETE;
  __IO uint32_t tmp = 0;
  status = FLASH_WaitForLastOperation(ProgramTimeout);
  if(status == FLASH_COMPLETE)
  {
    FLASH->CTLR |= CR_PG_Set;
    *(__IO uint16_t*)Address = (uint16_t)Data;
    status = FLASH_WaitForLastOperation(ProgramTimeout);
    if(status == FLASH_COMPLETE)
    {
      tmp = Address + 2;
      *(__IO uint16_t*) tmp = Data >> 16;
      status = FLASH_WaitForLastOperation(ProgramTimeout);
      FLASH->CTLR &= CR_PG_Reset;
    }
    else
    {
      FLASH->CTLR &= CR_PG_Reset;
    }
  }   
  *(__IO uint32_t*)0x40022034 = *(__IO uint32_t*)((Address & 0xFFFFFFFC) ^ 0x00001000);
  return status;
}


使用特权

评论回复
地板
一路向北lm|  楼主 | 2021-8-13 21:32 | 只看该作者
Falsh读操作就更加简单了,我们只需要定义一个指针,指向我们想要读取的Falsh地址就可以了,大致就如下所示:
#define  FLASH_READ_START_ADDR      ((uint32_t)0x08010000) 
uint32_t  ReadData =  *(__IO uint32_t*) FLASH_READ_START_ADDR;

使用特权

评论回复
5
yujielun| | 2022-10-10 17:38 | 只看该作者
内部flash不足怎么办?      

使用特权

评论回复
6
10299823| | 2022-10-10 17:59 | 只看该作者
jtag引脚如何与芯片相连               

使用特权

评论回复
7
uiint| | 2022-10-10 20:28 | 只看该作者
Jlink 可以读取 CH32V103芯片内的FLASH程序代码吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

257

主题

3643

帖子

73

粉丝