STM32CubeMX flash的使用

一、CubeMX配置

sys配置 调试模式

时钟配置

时钟树配置

配置板子自带的LED小灯

串口一配置 

生成工程

二、keil代码

Flash ROM 大小: STM32F103C8T6通常搭载64KB的Flash存储器。
页大小(PageSize): STM32F103C8T6的Flash存储器的一页通常是1KB。
Flash 起始地址: Flash存储器的起始地址通常为0x08000000。

 新建flash文件夹

 新建flash.c和flash.h文件

 添加路径并保存!!

添加文件到工程

STM32F103C8T6的Flash结束地址通常是0x08000000 + 64KB = 0x08010000。

flash.h

#ifndef __FLASH_H__
#define __FLASH_H__

#include "main.h"
extern uint32_t FlashData;
extern uint32_t Flashaddr;
void writeFlashTest(uint32_t writeFlashaddr,uint32_t writeFlashData);//FLASH写入数据
uint32_t readFlashTest(uint32_t writeFlashaddr);  //FLASH读取数据

#endif

flash.c

#include "flash.h"
uint32_t FlashData;
uint32_t Flashaddr = 0x0800FC00;
 
void writeFlashTest(uint32_t writeFlashaddr,uint32_t writeFlashData)//FLASH写入数据
{	
  HAL_FLASH_Unlock();   							//解锁FLASH
 
	FLASH_EraseInitTypeDef f;						//初始化FLASH_EraseInitTypeDef
	f.TypeErase = FLASH_TYPEERASE_PAGES;//标明Flash执行页面只做擦除操作
	f.PageAddress = Flashaddr;          //声明要擦除的地址
	f.NbPages = 1;	                    //说明要擦除的页数,此参数必须是Min_Data = 1和Max_Data =(最大页数-初始页的值)之间的值
																			//一些MCU一页是1KB,一些MCU一页是2KB
	uint32_t PageError = 0;  						//设置PageError,如果出现错误这个变量会被设置为出错的FLASH地址	
	HAL_FLASHEx_Erase(&f, &PageError);  //调用擦除函数	
	HAL_FLASH_Program(TYPEPROGRAM_WORD, Flashaddr, writeFlashData);//对FLASH烧写
  HAL_FLASH_Lock(); 									//锁住FLASH
}
uint32_t readFlashTest(uint32_t writeFlashaddr)  //FLASH读取数据
{
  uint32_t readFlashData = *(__IO uint32_t*)(writeFlashaddr); //*(__IO uint16_t *)是读取该地址的参数值,其值为16位数据,一次读取两个字节,*(__IO uint32_t *)就一次读4个字节	
	return readFlashData;
}



main.c

头文件和函数重定向

/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "flash.h"
int fputc(int ch,FILE *f)
{
    HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xFFFF);
    return ch;
/* USER CODE END Includes */
  /* USER CODE BEGIN 2 */
	HAL_Delay(2000);
	printf("The MCU powers on..............\r\n");
	FlashData=readFlashTest(Flashaddr);
	writeFlashTest(Flashaddr,FlashData); //往 Flashaddr 地址里写 FlashData
	readFlashTest(Flashaddr);//读Flashaddr 地址里的数据 readFlashData
	printf("addr:0x%x, data:0x%x\r\n", Flashaddr, readFlashTest(Flashaddr));
	FlashData++;
	HAL_Delay(1000);

  /* USER CODE END 2 */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
		HAL_Delay(1000);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

运行效果

链接: https://pan.baidu.com/s/1FVA0p9fbEC1GOUG2LeEfKg?pwd=xyhu 提取码: xyhu 

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chem4111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值