赞
踩
首先使用cubmx生成代码,
就是配置时钟和debug口,还有串口信息
/* USER CODE BEGIN PV */
#include "stdio.h"
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
return ch;
}
/* USER CODE END PV */
这里配置了地址的申明文件,和flash操作的结构体
需要注意的是,每个芯片都有最大的flash空间,以及代码空间,所以建议在配置地址的时候尽量到地址空间的后面,这样可以防止擦写到代码的空间。
/* USER CODE BEGIN 0 */
//debug 查看对应地址,是否正确,如果显示的是问号,则无此位置
//C6T6 32k 最大地址 0x08007FF0
//C8T6 64k 最大地址 0x0800FFE0
#define FLASH_SAVE_ADDR 0x08007000
static FLASH_EraseInitTypeDef EraseInitStruct = {
.TypeErase = FLASH_TYPEERASE_PAGES, //页擦除
.PageAddress = FLASH_SAVE_ADDR, //擦除地址
.NbPages = 1 //擦除页数
};
/* USER CODE END 0 */
下面就是main函数的配置,
流程就是 擦除->写入数据->读出数据
int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while (1) { HAL_FLASH_Unlock(); uint32_t PageError = 0; __disable_irq(); //擦除前关闭中断 if (HAL_FLASHEx_Erase(&EraseInitStruct,&PageError) == HAL_OK) { printf("擦除 成功\r\n"); } __enable_irq(); //擦除后打开中断 uint32_t writeFlashData = 0x55555555; //待写入的值 uint32_t addr = FLASH_SAVE_ADDR; //写入的地址 HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,addr, writeFlashData); printf("at address:0x%x, read value:0x%x\r\n", addr, *(__IO uint32_t*)addr); HAL_FLASH_Lock(); while(1); } /* USER CODE END 3 */ }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。