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);
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快速编程修改文件