STM32F103移植CH32F103C8T6内部FLASH速度慢问题解决办法

发布时间 2023-07-21 09:05:34作者: SymPny

STM32F103移植CH32F103C8T6内部FLASH速度慢问题解决办法

博主做项目一直采用STM32F103C8T6,近期因为元器件涨价博主决定换单片机,于是瞄上了江苏沁恒的CH32F103C8T6,这款单片机几乎不需要修改一个代码便能移植项目(PACK导入编译直接下载那种),而且代码执行速度略快于STM32F103C8T6,软件延时可能得稍微修改一下,但是在测试过程中发现不能远程更新固件,后来仿真得知,并不是不能,而是非常慢,37Kb的一个文件写入内部flash时间长达一分半,我以为是HSE没有起振,但是发现软件延时的蜂鸣器频率没问题,后来博主电话联系了江苏沁恒,技术给我解释道为了兼容STM32F103C8T6沿用了他们方法,但是速度慢,不过可以运用它们的快速编程模式,并且给我发送了一份相关操作文档。
原文档在此:CH32F103_FLASH快速编程移植说明.docx
文档写的很清楚。

主要操作流程:

1、先在STM32F10X.H内FLASH操作结构体当中增加快速操作写入密钥,。
2、在解锁函数内增加快速编程解锁密钥。
3、定义一下单片机flash大小,防止超出区域
4、定义一下快速操作的相关编程位
5、下来几步是重点,要修改FLASH_ErasePage()函数,在STM32F103C8T6中页大小是1K这个函数是擦除一个页,但是CH32F103擦除只能是128字节,如图修改后运行FLASH_ErasePage(0x8005000);
修改后运行FLASH_ErasePage(0x8005000);后一次只能擦除128字节。6、在stm32f10x_flash.c增加三个函数中增加FLASH_BufReset()函数、FLASH_BufLoad()函数以及快速编程函数FLASH_ProgramPage_Fast(),注意在.h中要声明一下。
之后所有的flash操作都要基于这三个函数完成并且官方给了一个操作例程。
在这里插入图片描述

写入flash操作步骤如下:

解锁->擦除->bufReset(这可能就是CH说的代码预存器)->把要写入的数据加载到预存区,一次可加载16个字节,最多可加载128字节->然后运行FLASH_ProgramPage_Fast()写入,最后上锁,经过博主测试,此方法一次最多只能128字节,可以少于128字节。

博主也测试了相关的写入速度:

1、STM32F103C8T6的FLASH写入模式32kb文件写入1秒以内。
2、CH32F103C8T6运用STM32的写入模式32kb写入速度一分15秒。
3、CH32F103C8T6运用快速写入方法32kb写入速度1.3秒。

最后附上我写的写入函数(注意解锁):

void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)   
{ 			
u32 buf1,buf2,buf3,buf4;	
	u16 i,b=0;
	u32 NWriteAddr=0;
	NWriteAddr=WriteAddr;
			FLASH_BufReset();
	for(i=0;i<NumToWrite;i+=8)
	{ b++;
		buf1=(pBuffer[i+1]<<16)+pBuffer[i];
		buf2=(pBuffer[i+3]<<16)+pBuffer[i+2];
		buf3=(pBuffer[i+5]<<16)+pBuffer[i+4];
		buf4=(pBuffer[i+7]<<16)+pBuffer[i+6];
		FLASH_BufLoad(WriteAddr,buf1,buf2,buf3,buf4);
	 // FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);
    WriteAddr+=16;//地址增加16.

if(b>7){b=0; //写入一次只能写入128个字节
FLASH_ProgramPage_Fast(NWriteAddr);
NWriteAddr=WriteAddr;
FLASH_ErasePage(WriteAddr);// 一次只能擦除128个字节
FLASH_BufReset();
}
}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

最后附上我移植后的STM32F1的库文件,复制直接替换:
CH32F103C8T6快速编程修改文件