hal库相关代码
进程结构体
typedef struct
{
__IO FLASH_ProcedureTypeDef ProcedureOnGoing; /*表示闪存操作过程中的不同状态或过程类型*/
__IO uint32_t DataRemaining; /*记录尚未完成的页数或者半字数*/
__IO uint32_t Address; /*地址*/
__IO uint64_t Data; /*数据*/
HAL_LockTypeDef Lock; /*闪存锁存对象*/
__IO uint32_t ErrorCode; /*错误对象*/
} FLASH_ProcessTypeDef;
对flash编程函数
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);
HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data);
擦除结构体在flash_ex文件里
typedef struct
{
uint32_t TypeErase; /*!擦除类型*/
uint32_t Banks; /*启用批量擦除功能时,请选择要擦除的存储体*/
uint32_t PageAddress; /*擦除的页地址*/
uint32_t NbPages; /*擦除的页地址数量*/
} FLASH_EraseInitTypeDef;
擦除函数
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError);
HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit);
读写flash
我们把江科大的代码转换成我们自己的代码就行了,
首先就是对flash的读取函数,是直接对地址进行读取的,所以代码是一样的,不需要额外处理
uint32_t MyFLASH_ReadWord(uint32_t Address)
{
return *((__IO uint32_t *)(Address)); //使用指针访问指定地址下的数据并返回
}
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)
{
return *((__IO uint16_t *)(Address)); //使用指针访问指定地址下的数据并返回
}
uint8_t MyFLASH_ReadByte(uint32_t Address)
{
return *((__IO uint8_t *)(Address)); //使用指针访问指定地址下的数据并返回
}
擦除函数,hal库直接把所有的擦除函数定义在了一起,通过结构体来判断擦除模式是全擦除还是页擦除,结构体里设置页擦除地址,擦除数量,一个函数包揽了标准库多个函数的活。
uint32_t PageError;
void MyFLASH_EraseAllPages(void)
{
FLASH_EraseInitTypeDef Flash_EraseStruct = {0};
Flash_EraseStruct.TypeErase = FLASH_TYPEERASE_MASSERASE;
HAL_FLASH_Unlock(); //解锁
//FLASH_EraseAllPages(); //全擦除
HAL_FLASHEx_Erase(&Flash_EraseStruct,&PageError);
HAL_FLASH_Lock(); //加锁
}
/**
* 函 数:FLASH页擦除
* 参 数:PageAddress 要擦除页的页地址
* 返 回 值:无
*/
void MyFLASH_ErasePage(uint32_t PageAddress)
{
FLASH_EraseInitTypeDef Flash_EraseStruct;
Flash_EraseStruct.TypeErase = FLASH_TYPEERASE_PAGES;
Flash_EraseStruct.Banks = FLASH_BANK_1;
Flash_EraseStruct.PageAddress = PageAddress;
Flash_EraseStruct.NbPages = 1;
HAL_FLASH_Unlock(); //解锁
//FLASH_ErasePage(PageAddress); //页擦除
HAL_FLASHEx_Erase(&Flash_EraseStruct,&PageError);
HAL_FLASH_Lock(); //加锁
}
编程函数,hal库的编程函数也是一个函数包揽了全部的活,参数里面选择编程模式,地址数据也作为参数写入。
/**
* 函 数:FLASH编程字
* 参 数:Address 要写入数据的字地址
* 参 数:Data 要写入的32位数据
* 返 回 值:无
*/
void MyFLASH_ProgramWord(uint32_t Address, uint32_t Data)
{
HAL_FLASH_Unlock(); //解锁
//FLASH_ProgramWord(Address, Data); //编程字
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,Address,Data);
HAL_FLASH_Lock(); //加锁
}
/**
* 函 数:FLASH编程半字
* 参 数:Address 要写入数据的半字地址
* 参 数:Data 要写入的16位数据
* 返 回 值:无
*/
void MyFLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{
HAL_FLASH_Unlock(); //解锁
//FLASH_ProgramHalfWord(Address, Data); //编程半字
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Address,Data);
HAL_FLASH_Lock(); //加锁
}
其余关于store的代码是基于读写flash函数的,直接cv过来就行,不需要修改。
这样就完成了江科大的读写flash代码。
也是把江科大的大致hal复现了,代码打包上传了。