单片机解密stm32使用内部flash替代eepram
单片机解密#ifndef __FLASHD_H
单片机解密#define __FLASHD_H
单片机解密#include <stdbool.h>
单片机解密#include "stm32f10x.h" // 替换为您的设备头文件
extern uint32_t RMnum ; //保存读写次数 索引
uint32_t MyFLASH_ReadWord(uint32_t Address);
uint16_t MyFLASH_ReadHalfWord(uint32_t Address);
uint8_t MyFLASH_ReadByte(uint32_t Address);
void MyFLASH_EraseAllPages(void);
void MyFLASH_ErasePage(uint32_t PageAddress);
void MyFLASH_ProgramWord(uint32_t Address, uint32_t Data);
void MyFLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);
// 读取区块
void ReadBlock(uint16_t block_index, uint16_t *block);
// 写入区块
void WriteBlock(uint16_t block_index, uint16_t *block);
// 查找具有最大RMnum的区块
uint16_t FindMaxRMnumBlock(void);
// 初始化函数
extern void FlashInit(unsigned short *Dat_16);
// 读取存档
extern bool FlashInit_Dat(unsigned short *Dat_16);
// 保存数据函数
extern void SaveData(unsigned short *Dat_16);
// 擦除存储区所有页
extern void Store_Clear(void);
#endif
#include "stm32f10x.h" // 设备头文件
#include "FLASHD.h" //
//适用与STM32F103RCT6
#define FLASH_BASE_ADDRESS 0x08030000 // Flash存储器的基地址32F103RCT6(192K地址)剩余64K
#define FLASH_PAGE_SIZE 2048 // 每页的大小(字节)
#define FLASH_BLOCK_SIZE 256 // 每个区块的大小(字节)每个页存8个区
#define FLASH_BLOCK_COUNT 200 // 区块数量必须小于剩余块数,要求1页块数的倍数 当前剩余最多512
#define DATA_COUNT 80 // 定义Dat16内保存参数的数量必须<=(FLASH_BLOCK_SIZE-4)/2 当前最大126
/* 适用与STM32F103C8T6
#define FLASH_BASE_ADDRESS 0x0800D000 // Flash存储器的基地址(52K地址)剩余12K
#define FLASH_PAGE_SIZE 1024 // 每页的大小(字节)
#define FLASH_BLOCK_SIZE 128 // 每个区块的大小(字节)每个页存8个区
#define FLASH_BLOCK_COUNT 96 // 区块数量必须小于剩余块数,最好8的倍数最大96
#define DATA_COUNT 50 // 定义Dat16内保存参数的数量必须<=(FLASH_BLOCK_SIZE-4)/2 根据区块最大60
*/
uint16_t max_index=0; //操作区块序号
uint16_t next_index=0;
uint32_t RMnum =0; //保存读写次数 索引
/**
* 函 数:FLASH读取一个32位的字
* 参 数:Address 要读取数据的字地址
* 返 回 值:指定地址下的数据
*/
uint32_t MyFLASH_ReadWord(uint32_t Address)
{
return *((__IO uint32_t *)(Address)); //使用指针访问指定地址下的数据并返回
}
/**
* 函 数:FLASH读取一个16位的半字
* 参 数:Address 要读取数据的半字地址
* 返 回 值:指定地址下的数据
*/
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)
{
return *((__IO uint16_t *)(Address)); //使用指针访问指定地址下的数据并返回
}
/**
* 函 数:FLASH读取一个8位的字节
* 参 数:Address 要读取数据的字节地址
* 返 回 值:指定地址下的数据
*/
uint8_t MyFLASH_ReadByte(uint32_t Address)
{
return *((__IO uint8_t *)(Address)); //使用指针访问指定地址下的数据并返回
}
/**
* 函 数:FLASH全擦除
* 参 数:无
* 返 回 值:无
* 说 明:调用此函数后,FLASH的所有页都会被擦除,包括程序文件本身,擦除后,程序将不复存在
*/
void MyFLASH_EraseAllPages(void)
{
FLASH_Unlock(); //解锁
FLASH_EraseAllPages(); //全擦除
FLASH_Lock(); //加锁
}

芯片解密