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

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();
}
	}  

} 

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

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值