STM32F103C8T6(HAL库函数 - 内部Flash操作)

简介

STM32F103C8T6 内部Flash 为 64KB,本次将对他多余空间进行读写。

介绍

数据手册下载

STM32F103x8/STM32F103xB 数据手册

包含Flash Memory Page分布

STM32F设备命名

设备容量类型

中容量类型

内部空间介绍

复制代码
64 KBytes大小

Flash Memory 从 0x0800 0000 ~ 0x0801 FFFF

页分布1K每页, STM32F103C8T6 只有64KByte, 那就是64页

代码

使用
controllerstech Flash Program Code

复制 FLASH_PAGE_F1.h 和 FLASH_PAGE_F1.c到项目中

FLASH_PAGE_F1.h 加入宏定义

c 复制代码
#define FLASH_START_ADDRESS (0x08000000 + FLASH_PAGE_SIZE * 20) //0~20页这20K用于存储你的程序
#define FLASH_MAX_PAGE_NUM (64-1-20) // 0 ~ (63-20) 是最大的页码

FLASH_PAGE_F1.c 修改

c 复制代码
static uint32_t GetPage(uint32_t Address)
{
  for (int indx=0; indx<(FLASH_MAX_PAGE_NUM+1); indx++)
  {
	  if((Address < (FLASH_START_ADDRESS + (FLASH_PAGE_SIZE *(indx+1))) ) && (Address >= (FLASH_START_ADDRESS + FLASH_PAGE_SIZE*indx)))
	  {
		  return (FLASH_START_ADDRESS + FLASH_PAGE_SIZE*indx);
	  }
  }

  return 0;
}

测试代码

main.c

c 复制代码
char *data = "hello FLASH from ControllerTech\
			  This is a test to see how many words can we work with";

uint32_t data2[] = {0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9};

uint32_t Rx_Data[30];

char string[100];

int number = 123;

float val = 123.456;

float RxVal;


int main()
{
...
printf("Hello World!\r\n");
	Flash_Write_Data(GetPageFromPageNum(0) , (uint32_t *)data2, 9);
	Flash_Read_Data(GetPageFromPageNum(0) , Rx_Data, 10);
	printf ("RxData: { ");
	for ( int i = 0; i < 9; ++i )
	{
		printf ("0x%X ", Rx_Data[i]);
	}
	printf ("};\r\n");
	
	int numofwords = (strlen(data)/4)+((strlen(data)%4)!=0);
  Flash_Write_Data(GetPageFromPageNum(1) , (uint32_t *)data, numofwords);
  Flash_Read_Data(GetPageFromPageNum(1) , Rx_Data, numofwords);
  Convert_To_Str(Rx_Data, string);
	printf ("String: %s\r\n", string);
	
	Flash_Write_NUM(GetPageFromPageNum(2), number);
  RxVal = Flash_Read_NUM(GetPageFromPageNum(2));
	printf ("Read Num_1: %f\r\n", RxVal);

  Flash_Write_NUM(GetPageFromPageNum(3), val);
  RxVal = Flash_Read_NUM(GetPageFromPageNum(3));
	printf ("Read Num_2: %f\r\n", RxVal);
...
}

设置烧录地址区域, 避免其他区域被覆盖

20K = 0x5000 即0 ~ 20页 这个区域用来存放程序

共赏

代码

不需要下载, 上面都提供了

参考

普中STM32-PZ6806L开发板(HAL库函数实现-USART1 printf+scanf/gets)

Note

  1. FLASH_BASE 就是 0x08000000这个地址, 所以可以用 FLASH_BASE取代0x08000000
相关推荐
笨笨饿1 天前
#58_万能函数的构造方法:ReLU函数
数据结构·人工智能·stm32·单片机·硬件工程·学习方法
FreakStudio1 天前
无硬件学LVGL:基于Web模拟器+MiroPython速通GUI开发—布局与空间管理篇
python·单片机·嵌入式·面向对象·并行计算·电子diy
三品吉他手会点灯1 天前
STM32F103 学习笔记-21-串口通信(第4节)—串口发送和接收代码讲解(中)
笔记·stm32·单片机·嵌入式硬件·学习
项目題供诗1 天前
STM32-LED闪烁&LED流水灯&蜂鸣器(四)
stm32·单片机·嵌入式硬件
xiangw@GZ1 天前
EMC原理:四大抗扰度测试原理
单片机·嵌入式硬件
QH139292318801 天前
KEYSIGHT E5071C 端网络分析仪
网络·功能测试·嵌入式硬件·物联网·单元测试·集成测试·模块测试
I_Am_Zou1 天前
STM32实战系列|智能摄像头巡检系统完整演示:第一讲
stm32·单片机·嵌入式硬件
发发就是发1 天前
USB系统架构概述:从一次诡异的枚举失败说起
驱动开发·单片机·嵌入式硬件·算法·fpga开发
发发就是发1 天前
TTY子系统与线路规程:那个让我深夜抓狂的串口“丢包”问题
linux·服务器·驱动开发·单片机·嵌入式硬件
RFCEO2 天前
Rust编程基础课 第1课时:Rust简介与环境搭建 STM32 RUST嵌入式编程实战
stm32·嵌入式硬件·rust·probe-rs·rust工具链·rustup、cargo·stm32 rust适配