myflash.c 4.9 KB
#include "myflash.h"
// #include "FreeRTOS.h"
// #include "task.h"
// #include "flash_if.h"
// #include "dji_logger.h"

/*
扇区 0 16KB 存放bootloader文件(bootloader 文件需小于 16KB)
扇区 1 16KB 存放行程值和序列号以及设备激活状态	(不常变)
扇区 2 16KB 存放升级存储状态标志
扇区 3 16KB 存放用户设置参数值(如灯光亮度,警灯状态等,常变)
扇区 4~7    应用程序存储
扇区 8~11   升级存储区域
*/

extern uint8_t widget_color[14];

void jz_Flash_Write(int32_t *buff,uint8_t len)
{
    Write_Flash(MY_DATA_WriteFlashAddress,buff,len);
}

void jz_Flash_Read(int32_t *buff,uint8_t len)
{
	Read_Flash(MY_DATA_WriteFlashAddress,buff,len);
//	for(uint8_t i = 0;i<len;i++)
//	{
//		USER_LOG_INFO("Flash_Read:%d\r\n",buff[i]);
//	}
}
#if 1
//写舵机转动范围值测试
void Flash_Write_Test(void)
{    
	int32_t in_data_1[2]={390,66};
// 	uint8_t in_data_2[16] = "T30CNF16AFE8C850";

    Write_Flash(0x0800C000,in_data_1,2);
//    Flash_Write_Char(SNADDRESS,in_data_2,16);
}

void Flash_Read_Test(void)
{
	int i = 0;
	int32_t out_data[2];//读存放
	Read_Flash(0x0800C000,out_data,2);
	for(i=0;i<2;i++)
	{
		printf ("____________out_data[ %d ] = %d\r\n",i,out_data[i]);
	}
}
#endif

uint8_t Write_Flash(uint32_t addr, int32_t *buff, uint8_t len)
{    
    volatile HAL_StatusTypeDef FLASHStatus;
	
    uint8_t k=0;
    uint32_t Address;
	uint32_t SectorError;
	FLASH_EraseInitTypeDef EraseInitStruct; 
	uint32_t PageError = 0;  
		
//	FLASH_If_Erase(ADDR_FLASH_SECTOR_3,ADDR_FLASH_SECTOR_4-1);
    Address = addr;
    HAL_FLASH_Unlock();//解锁
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
                           FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);//清除所有标志

	 // 擦除指定的Flash页  
    EraseInitStruct.TypeErase   = FLASH_TYPEERASE_SECTORS;  //擦除类型:扇区擦除
    EraseInitStruct.Sector      = FLASH_SECTOR_3; //要擦除的扇区
	EraseInitStruct.NbSectors   =1;//要擦除的扇区数目
	EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;//设备工作电压范围2.7~3.6V
	
    if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)//擦除扇区
    {
    }  

	for(k=0;k<len;k++)
	{
	   HAL_FLASH_Program(TYPEPROGRAM_WORD,Address, buff[k]);//写入一个字(32位)的数据入指定地址
		Address = Address + 4;//地址偏移4个字节
//		printf("________________write  %d   word  ok\r\n",k);
	}        
	HAL_FLASH_Lock();//重新上锁,防止误写入
}


void Read_Flash(uint32_t addr,int32_t *buff, uint8_t len)
{
    uint8_t k;
    uint32_t Address;
    
    Address = addr;
	__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
                           FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);//清除所有标志
    for(k=0;k<len;k++)
    {
        buff[k] =  (*(__IO uint32_t*) Address);//读指定地址的一个字的数据
        Address += 4;//地址偏移4个字节        
    }
}

//获取一个字的数据
void Read_Flash_Byte(int32_t *buff, uint32_t address)
{
    uint32_t Address;
    
    Address = address;
	__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
                           FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);//清除所有标志
 
    *buff =  (*(__IO int32_t*) Address);		//读指定地址的一个字的数据
}

void Read_Flash_Float(float *buff, uint32_t address)
{
    uint32_t Address;
    
    Address = address;
	__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
                           FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);//清除所有标志
 
    *buff =  (*(__IO float*) Address);		//读指定地址的一个字的数据
}

void Flash_Write_Char(uint32_t addr, uint8_t *buff, uint8_t len)
{
	volatile HAL_StatusTypeDef FLASHStatus;
	
    uint8_t k=0;
    uint32_t Address;
	uint32_t SectorError;
    Address = addr;
		
    HAL_FLASH_Unlock();//解锁
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
                           FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);//清除所有标志

	for(k=0;k<len;k++)
	{
		HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, buff[k]);//写入一个字节(8位)的数据入指定地址
		Address =  Address + 1;//地址偏移1个字节
	}        
	HAL_FLASH_Lock();//重新上锁,防止误写入
	
}

void Flash_Read_Char(uint32_t addr, uint8_t *buff, uint8_t len)
{
    uint8_t k;
    uint32_t Address;
    
    Address = addr;
	__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
                           FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);//清除所有标志
    for(k=0;k<len;k++)
    {
        buff[k] =  (*(__IO uint8_t*) Address);//读指定地址的一个字的数据
        Address += 1;//地址偏移1个字节        
    }
}