Falsh的写入函数

这里写自定义目录标题

Falsh的写入函数


/**
 * @Description: 
 * @param {unsigned int} address
 * @param {void} *pbuf
 * @param {int} NumByteToWrite
 * @return {*}
 */
int User_Read_flash(unsigned int address, void *pbuf, int NumByteToWrite)
{
    hal_flash_read(address,pbuf,NumByteToWrite);
    return MK_EOK;   
}

/**
 * @Description: 
 * @param {unsigned int} address
 * @param {void} *pbuf
 * @param {int} len
 * @return {*}
 */
int writer_flash(unsigned int address, void *pbuf, int len)
{   
    hal_flash_unlock();
    hal_flash_write(address,pbuf,len);
    hal_flash_lock();
    return MK_EOK;   
}
/**
 * @Description: 
 * @param {unsigned int} address
 * @param {void} *pbuf
 * @return {*}
 */
int User_Write_Page_Nocheck(unsigned int address,void *pbuf)
{
    writer_flash(address,pbuf,2048);
    return MK_EOK;   
}
/**
 * @Description: 
 * @param {unsigned int} address
 * @return {*}
 */
int User_Erase_Page(unsigned int address)   
{    
    hal_flash_unlock();
    if(hal_flash_erase(address,2048) == MK_EOK)
	{
		hal_flash_lock();
		return MK_EOK;
	}
    return MK_ERR;
}
/**
 * @Description: 
 * @param {unsigned int} address
 * @param {void} *pbuf
 * @param {int} NumByteToWrite
 * @return {*}
 */

int User_Write_Flash(unsigned int address, void *pbuf, int NumByteToWrite)
{
    uint8_t *buf = (uint8_t *)pbuf;
    uint32_t secpos;	
	uint16_t secoff;
    uint16_t secremain;
	uint16_t i;
	
    uint8_t *Buffer;
	Buffer = rt_malloc(2048);
	if (!Buffer)
    {
        LOG_E("%d[%s] malloc failed.", __func__, __LINE__);
        return MK_ERR;
    }

	secoff = address % 2048;  //Intra-sector offset
    secpos = address - secoff;  //Sector address  

    secremain=2048-secoff;  //Sector remaining size
    if(NumByteToWrite<=secremain)
        secremain=NumByteToWrite;
        
	User_Read_flash(secpos,Buffer,2048);
    while(1) 
	{	
		for(i = 0;i < secremain;i++)
		{
			if(Buffer[secoff+i]!=0XFF)
				break;  	  
		}
		if(i<secremain)
		{
			User_Erase_Page(secpos);
			for(i=0;i<secremain;i++)
			{
				Buffer[i+secoff] = buf[i];	  
			}
			User_Write_Page_Nocheck(secpos,Buffer);  
		}
        else 
            writer_flash(address,buf,secremain);

		if(NumByteToWrite==secremain)
            break;
		else
		{
			secpos++;
			secoff=0;	 
		   	buf+=secremain;  				
			address+=secremain;					   
		   	NumByteToWrite-=secremain;			
			if(NumByteToWrite>2048)secremain=2048;
			else secremain=NumByteToWrite;		
		}	 
	}	

	rt_free(Buffer);
    return  MK_EOK;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
stm32flash是一个用于在STM32单片机上进行固件编程的开源工具,它提供了一组读函数,用于操纵STM32内部的闪存存储器。 stm32flash函数包括以下几个主要函数: 1. `flash_identify()` 函数用于识别目标单片机的型号和闪存大小,它会发送读标识命令到目标单片机,并解析返回的信息。通过该函数,我们可以获取目标单片机的型号和闪存容量,以便后续的操作。 2. `flash_emit_bootloader()` 函数用于向目标单片机的闪存中编程bootloader程序。该函数会将bootloader的二进制文件读取到内存中,并通过发送编程命令将其写入目标单片机的闪存。 3. `flash_emit_firmware()` 函数用于向目标单片机的闪存中编程应用程序固件。该函数会将应用程序固件的二进制文件读取到内存中,并通过发送编程命令将其写入目标单片机的闪存。 4. `flash_read()` 函数用于从目标单片机的闪存中读取数据。该函数会发送读取命令到目标单片机,并接收返回的数据。我们可以指定要读取的地址和数据长度,以及接收数据的缓冲区。通过该函数,我们可以获取目标单片机闪存中指定地址的数据。 5. `flash_write()` 函数用于向目标单片机的闪存中写入数据。该函数会发送写入命令和要写入的数据到目标单片机。我们可以指定要写入的地址和数据长度,以及要写入的数据。通过该函数,我们可以往目标单片机闪存中指定地址写入数据。 这些函数都是通过与目标单片机进行通信,发送特定的命令来实现相应的功能。通过stm32flash函数,我们可以对STM32单片机的闪存进行编程和读取操作,实现固件的更新和数据的读
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值