网站首页 > 资源文章 正文
STM32F103程序存储为Flash,支持在线读写以及擦除。Flash写的特性为:先要按照页擦除,擦除之后每个字节的数值为0xFF,然后才能对Flash进行写操作。读的特性倒是没有特殊的要求,可以直接读。
STM32的HAL库里面有Flash的写操作以及擦除操作的,这就为我们Firmware Update提供了便利。
STM32(HAL库)BootLoader实现(BootLoader跳转到Application)
STM32(HAL库)BootLoader实现2(Application跳转到BootLoader)
上面两篇文章详细叙述了如何为了Firmware升级建立BootLoader(如果没有思路的,可以看看我的这两篇文章)。BootLoader和Application的相互可以通过上述方式实现,那么具体的Firmware的操作(即Flash的擦除与写操作)是怎么弄的呢?
首先是Flash的擦除,见下面代码:
#define APP_FLASH_ADDR_START_INDEX (0x8008000)
#define APP_FLASH_ADDR_END_INDEX (0x8080000)
#define FLASH_PAGE_SIZE_USER (0x800)
USBD_StatusTypeDef USB_Erese_Flash() //USB 接口调用的擦除Flash,返回值为USB状态
{
FLASH_EraseInitTypeDef pEraseInit; // HAL 库定义的擦除句柄
uint32_t PageError = 0;
pEraseInit.NbPages = (APP_FLASH_ADDR_END_INDEX-APP_FLASH_ADDR_START_INDEX)/FLASH_PAGE_SIZE_USER;//定义要擦除的页数,每页为2K Bytes
pEraseInit.PageAddress = APP_FLASH_ADDR_START_INDEX; //定义开始地址
pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;//定义擦除类型为页擦除
if(HAL_FLASHEx_Erase(&pEraseInit, &PageError)!=HAL_OK) //直接调用Flash 擦除库函数
{
return USBD_FAIL;
}
return USBD_OK;
}
写操作的代码如下:(仍然有库函数作为基本的调用)
//*src Flash数据的来源数组,addr 要更新的地址,Length 数据长度(byte长度)
USBD_StatusTypeDef USB_Write_Flash(uint8_t *src,uint32_t addr,uint32_t length)
{
uint32_t index;
for(index=0;index<length;index=index+4)
{
//4个Byte一起更新,因为STM32为32位单片机,32位的操作是默认的。
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr+index, *(uint32_t*)(src+index))==HAL_OK)
{
//可以增加读取然后比较的函数,这样就可以确定Flash上的数据时对的。
//我的应用场景中会在最后对Flash进行CRC校验,因此这一步会省掉,后面文章会详细叙述
}
else
{
return USBD_FAIL;
}
}
return USBD_OK;
}
这样只需要调用上面的两个函数就可以对Flash进行基本的更新操作了。
另外需要提醒一下,STM32的Flash擦除和写操作的时候需要对其进行解锁,如下面代码:
USBD_StatusTypeDef USB_Init_Flash()
{
HAL_FLASH_Unlock();//Flash操作的解锁
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP|FLASH_FLAG_WRPERR|FLASH_FLAG_PGERR);//清除相关标志位
return (USBD_OK);
}
最后再说明一点,Flash的解锁,写和擦除操作上面代码都已经有叙述,那么读操作呢?
如下:
#define Flash_Addr 0x8008000
uint32_t device_flash_data= *(__IO uint32_t *)(Flash_Addr);//直接对该地址数据进行读取
这就是所有对Flash的操作,加上我上文提到的实现BootLoader以及之前文章中分享的USB HID接口实现,其实,现在已经可以实现STM32 Flash的自定义升级了。我后面的文章就将其总结完善,敬请期待。
猜你喜欢
- 2024-10-04 播放FLV文件2-C#进阶学习(flc文件怎么播放)
- 2024-10-04 Win7系统提示无法注册Flash解决教程
- 2024-10-04 铠侠第八代BiCS FLASH,高密度存储的新起点
- 2024-10-04 Karsa回归Flash 8ball1&Recation完成使命
- 2024-10-04 驰为VX8 3G Win8刷安卓系统固件教程发布
- 2024-10-04 (STM32F103)神操作——如何快速读写内部flash?
- 2024-10-04 win8内置的flash坏掉了修复(win10内置flash用不了)
- 2024-10-04 flashtool强刷教程(用flashtool强制刷机教程)
- 2024-10-04 Win8系统电脑浏览器不能加载Flash插件的解决方法
- 2024-10-04 PPT实用工具介绍上篇:1-5(ppt的制作工具)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)