资源简介
stm32f030 IAP在线升级参考代码,原创
代码片段和文件信息
#include “stmflash.h“
//用户根据自己的需要设置
#define STM32_FLASH_SIZE 32 //所选STM32的FLASH容量大小(单位为K)
#define STM32_FLASH_WREN 1
static uint16 iHAL_STMFLASH_ReadHalfWord(uint32 faddr);
static void iHAL_STMFLASH_Write_NoCheck(uint32 WriteAddr const uint16 *pBuffer uint16 NumToWrite);
//读取指定地址的半字(16位数据)
//faddr:读地址(此地址必须为2的倍数!!)
//返回值:对应数据.
static uint16 iHAL_STMFLASH_ReadHalfWord(uint32 faddr)
{
return *(vu16*)faddr;
}
#if STM32_FLASH_WREN //如果使能了写
//不检查的写入
//WriteAddr:起始地址
//pBuffer:数据指针
//NumToWrite:半字(16位)数
static void iHAL_STMFLASH_Write_NoCheck(uint32 WriteAddr const uint16 *pBuffer uint16 NumToWrite)
{
uint16 i;
for(i = 0; i < NumToWrite; i++)
{
FLASH_ProgramHalfWord(WriteAddr pBuffer[i]);
WriteAddr += 2; //地址增加2.
}
}
#if STM32_FLASH_SIZE<256
#define STM_SECTOR_SIZE 1024 //字节
#else
#define STM_SECTOR_SIZE 2048
#endif
//uint16 STMFLASH_BUF[STM_SECTOR_SIZE / 2]; //最多是2K字节
uint8 STMFLASH_BUF[STM_SECTOR_SIZE];
#warning “没有掉电保护机制,如果该page内有代码,就会出问题!“
//从指定地址开始写入指定长度的数据
//WriteAddr:起始地址(此地址必须为2的倍数!!)
//pBuffer:数据指针
//NumToWrite:半字(16位)数(就是要写入的16位数据的个数.)
void JTHAL_STMFLASH_Write(uint32 WriteAddr const uint16 *pBuffer uint16 NumToWrite)
{
uint32 secpos; //扇区地址
uint16 secoff; //扇区内偏移地址(16位字计算)
uint16 secremain; //扇区内剩余地址(16位字计算)
uint16 i;
uint32 offaddr; //去掉0X08000000后的地址
uint16 *pBuff = (uint16 *)STMFLASH_BUF;
if(WriteAddr < JTSTM32_FLASH_base || (WriteAddr >= (JTSTM32_FLASH_base + 1024 * STM32_FLASH_SIZE)))
return; //非法地址
FLASH_Unlock(); //解锁
offaddr = WriteAddr - JTSTM32_FLASH_base; //实际偏移地址.
secpos = offaddr / STM_SECTOR_SIZE; //扇区地址 0~127 for STM32F103RBT6
secoff = (offaddr % STM_SECTOR_SIZE) / 2; //在扇区内的偏移(2个字节为基本单位.)
secremain = STM_SECTOR_SIZE / 2 - secoff; //扇区剩余空间大小
if(NumToWrite <= secremain)
secremain = NumToWrite; //不大于该扇区范围
while(1)
{
JTHAL_STMFLASH_Read(secpos * STM_SECTOR_SIZE + JTSTM32_FLASH_base pBuff STM_SECTOR_SIZE / 2); //读出整个扇区的内容
for(i = 0; i < secremain; i++) //校验数据
{
if(pBuff[secoff + i] != 0XFFFF)break; //需要擦除
}
if(i < secremain) //需要擦除
{
FLASH_ErasePage(secpos * STM_SECTOR_SIZE + JTSTM32_FLASH_base); //擦除这个扇区
for(i = 0; i < secremain; i++) //复制
{
pBuff[i + secoff] = pBuffer[i];
}
iHAL_STMFLASH_Write_NoCheck(secpos * STM_SECTOR_SIZE + JTSTM32_FLASH_base pBuff STM_SECTOR_SIZE / 2); //写入整个扇区
}
else
iHAL_STMFLASH_Write_NoCheck(WriteAddr pBuffer secremain); //写已经擦除了的直接写入扇区剩余区间.
if(NumToWrite == secremain)
break; //写入结束了
else//写入未结束
{
secpos++; //扇区地址增1
secoff = 0; //偏移位置为0
pBuffer +=
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1120 2017-02-12 19:11 IAP_STM32F030\CORE\arm_common_tables.h
文件 240326 2017-02-12 19:11 IAP_STM32F030\CORE\arm_math.h
文件 31948 2017-02-12 19:11 IAP_STM32F030\CORE\core_cm0.h
文件 15691 2017-02-12 19:11 IAP_STM32F030\CORE\core_cmFunc.h
文件 16108 2017-02-12 19:11 IAP_STM32F030\CORE\core_cmInstr.h
文件 10644 2017-02-12 19:11 IAP_STM32F030\CORE\startup_stm32f0xx.s
文件 1067 2017-04-20 22:11 IAP_STM32F030\HAL\jt_typedef.h
文件 4078 2017-04-20 10:31 IAP_STM32F030\HAL\stmflash.c
文件 750 2017-04-20 10:31 IAP_STM32F030\HAL\stmflash.h
....... 139562 2017-04-20 22:12 IAP_STM32F030\Project\IAP_Stm32f030.uvguix.Administrator
....... 18075 2017-04-20 22:10 IAP_STM32F030\Project\IAP_Stm32f030.uvoptx
....... 17983 2017-04-20 22:12 IAP_STM32F030\Project\IAP_Stm32f030.uvprojx
文件 31035 2017-04-20 22:12 IAP_STM32F030\Project\startup_stm32f0xx.lst
文件 38887 2017-04-20 22:12 IAP_STM32F030\Project\STM32F030.map
文件 19520 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_adc.h
文件 12353 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_cec.h
文件 10385 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_comp.h
文件 3680 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_crc.h
文件 7138 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_dac.h
文件 3892 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_dbgmcu.h
文件 14207 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_dma.h
文件 8617 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_exti.h
文件 10957 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_flash.h
文件 13174 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_gpio.h
文件 18136 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_i2c.h
文件 4531 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_iwdg.h
文件 4413 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_misc.h
文件 5909 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_pwr.h
文件 20615 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_rcc.h
文件 35039 2017-02-12 19:11 IAP_STM32F030\STM32F03x_FWLib\inc\stm32f0xx_rtc.h
............此处省略124个文件信息
相关资源
- 组态王驱动开发包3.0.0.7(中文)
- 用python编写的移动彩信的发送程序
- SSM+Shiro+redis实现单点登陆
- WPE三件套(WPE+CCP+E2G)冰枫修改版
- TCL-S1916 ,1924交换机管理程序
- 飞思卡尔单片机MC9S12XS12G128驱动(硬件
- VNCX
- 多窗口后台鼠标连点器
- jstl-api-1.2和jstl-impl-1.2
- 精美千年登陆器(自动更新).rar
- Crystal Impact Match!2.1.3 试用延长
- CASS9.1最新S4数据及驱动+ET199数据及驱
- 使用选择性重传协议实现UDP可靠通信
- 一个超简单的企业管理系统(带ACCE
- 实现小波变换例子 upcoef 函数
- 类pascal语言编译器(编译原理实验)
- DELPHI与西门子200PLC的串口通信实例
- mybatis连接oracle实例
- 单片机和adc0809数字电压表
- 信号估计DOAmusicespritcapon
- PIC单片机完成的电子密码锁
- B/S 网上订餐系统
- BCG帮助手册,完整版_修正
- Labview与CH372CH375的通信测试
- 基于MFC扩展CListCtrl子项显示图片并叠
- VMware65_SLP_DeLLSLIC2.1
- 单片机、ADC0808809设计简易数字电压表
- 基于MIPS指令集的32位CPU设计与Verilog语
- 28335CAN调试程序
- NE555电路应用原理图及PCB
评论
共有 条评论