keil stm32 hal 读写保护代码 用中文注释
时间: 2023-09-14 17:08:44 浏览: 168
以下是使用Keil和STM32 HAL库实现读写保护的代码,附有中文注释:
```c
#include "stm32f1xx_hal.h"
// 定义FLASH起始地址
#define FLASH_START_ADDR ((uint32_t)0x08000000)
// 定义FLASH结束地址
#define FLASH_END_ADDR ((uint32_t)0x080FFFFF)
// 定义FLASH页大小
#define FLASH_PAGE_SIZE ((uint32_t)0x400)
// 定义要保护的FLASH页范围
#define FLASH_PAGE_TO_PROTECT FLASH_BANK_1, FLASH_PAGE_127
// 定义读写保护区域的起始地址
#define RDP_ADDRESS ((uint32_t)0x1FFFF800)
// 定义读写保护字节的值
#define RDP_VALUE ((uint8_t)0xAA)
// 定义错误代码
#define ERROR_PROTECTION_FAILED ((uint32_t)0xFFFFFFFF)
// 函数原型
static uint32_t GetPage(uint32_t Address);
static uint32_t GetBank(uint32_t Address);
int main(void)
{
HAL_Init();
// 解锁FLASH
HAL_FLASH_Unlock();
// 获取要保护的FLASH页的起始地址和结束地址
uint32_t start_page = GetPage(FLASH_START_ADDR);
uint32_t end_page = GetPage(FLASH_END_ADDR);
// 遍历要保护的FLASH页,进行写保护
for (uint32_t i = start_page; i <= end_page; i += FLASH_PAGE_SIZE)
{
// 判断当前FLASH页是否在保护范围内
if (FLASH_PageInBank(i, FLASH_PAGE_TO_PROTECT) != RESET)
{
// 使能FLASH写保护
if (HAL_FLASH_OB_Unlock() == HAL_OK)
{
FLASH_OBProgramInitTypeDef OBInit;
OBInit.OptionType = OPTIONBYTE_WRP;
OBInit.WRPArea = OB_WRPAREA_BANK1_AREAA;
OBInit.Banks = GetBank(i);
OBInit.WRPStartOffset = i - FLASH_START_ADDR;
OBInit.WRPEndOffset = i - FLASH_START_ADDR + FLASH_PAGE_SIZE - 1;
if (HAL_FLASHEx_OBProgram(&OBInit) != HAL_OK)
{
// 写保护失败
while (1)
{
// 发生错误,进入死循环
}
}
// 锁定FLASH
HAL_FLASH_OB_Lock();
}
else
{
// 解锁FLASH失败
while (1)
{
// 发生错误,进入死循环
}
}
}
}
// 写入读写保护字节
if (HAL_FLASHEx_OBProgram(&OBInit) != HAL_OK)
{
// 写入读写保护字节失败
while (1)
{
// 发生错误,进入死循环
}
}
// 锁定FLASH
HAL_FLASH_Lock();
return 0;
}
// 获取指定地址所在的FLASH页的起始地址
static uint32_t GetPage(uint32_t Address)
{
uint32_t page = 0;
if (Address >= FLASH_START_ADDR && Address <= FLASH_END_ADDR)
{
page = (Address - FLASH_START_ADDR) / FLASH_PAGE_SIZE;
page = FLASH_START_ADDR + (page * FLASH_PAGE_SIZE);
}
return page;
}
// 获取指定地址所在的FLASH块的编号
static uint32_t GetBank(uint32_t Address)
{
uint32_t bank = 0;
if (Address >= FLASH_START_ADDR && Address <= FLASH_END_ADDR)
{
if (Address < (FLASH_START_ADDR + 0x10000))
{
bank = FLASH_BANK_1;
}
else
{
bank = FLASH_BANK_2;
}
}
return bank;
}
```
以上代码实现了对指定FLASH页范围进行写保护,以及写入读写保护字节的功能。在使用时,只需要修改宏定义中的相应数值即可。
阅读全文