一、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