STM32F103写入Flash
本次实验主要内容:Flash地址空间的数据读取。stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),将数据写入Flash
文章目录
- 一、创建STM32CubeMX工程
- 二、修改工程
- 三、验证
- 四、总结
- 五、参考资料
一、创建STM32CubeMX工程
首先打开STM32CubeMX软件,选择芯片为STM32F103C8T6
图 1-1
这里选择PC13引脚为GPIO口,可以使实验效果更明显。创建STM32CubeMX工程文件可以参考博客:
STM32CubeMX的安装与简单应用_江南烟浓雨的博客-CSDN博客
然后生成工程文件。
二、修改工程
在创建好的工程中添加flash.c
和flash.h
文件,修改main.c
中的代码,如下:
main.c
/* USER CODE BEGIN Header */
/********************************************************************************* @file : main.c* @brief : Main program body******************************************************************************** This notice applies to any and all portions of this file* that are not between comment pairs USER CODE BEGIN and* USER CODE END. Other portions of this file, whether * inserted by the user or by software development tools* are owned by their respective copyright owners.** COPYRIGHT(c) 2019 STMicroelectronics** Redistribution and use in source and binary forms, with or without modification,* are permitted provided that the following conditions are met:* 1. Redistributions of source code must retain the above copyright notice,* this list of conditions and the following disclaimer.* 2. Redistributions in binary form must reproduce the above copyright notice,* this list of conditions and the following disclaimer in the documentation* and/or other materials provided with the distribution.* 3. Neither the name of STMicroelectronics nor the names of its contributors* may be used to endorse or promote products derived from this software* without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.********************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "flash.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t FlashWBuff [255];
uint8_t FlashRBuff [255];
/* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */uint8_t i;uint8_t FlashTest[] = "Hello This is Jiangnanyanlongyu Flash Test DEMO";/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit */FlashWriteBuff( DEVICE_INFO_ADDRESS, FlashTest,sizeof(FlashTest) ); // 写入数据到Flashfor(i=0;i<255;i++)FlashWBuff[i] = i;FlashWriteBuff( DEVICE_INFO_ADDRESS + sizeof(FlashTest), FlashWBuff,255 ); // 写入数据到FlashFlashReadBuff( DEVICE_INFO_ADDRESS + sizeof(FlashTest),FlashRBuff,255 ); // 从Flash中读取数/* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/**Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/**Initializes the CPU, AHB and APB busses clocks */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state *//* USER CODE END Error_Handler_Debug */
}#ifdef USE_FULL_ASSERT
/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{ /* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
三、验证
连接STLink,可以在项目配置
中Debug
选项卡中选择ST-Link Debugger
,然后下载后点击调试按钮,进入到下面的页面
图 3-1
然后打开Memory1
窗口
图 3-2
打开watch1
窗口
图 3-3
勾选Periodic Windows Update
图 3-4
在Memory1
地址栏输入0x0800C000
,便可以得到下图
图 3-5
在Memory1
窗口中便可以看到我们写入的数据
四、总结
本次实验实现了flash的写入,通过flash.h
和flash.c
中的一些函数来实现写入操作。实验代码如下:
链接:https://pan.baidu.com/s/1kVZdhfqPfmUjs6mRjgJrIw
提取码:1234
五、参考资料
STM32之flash的读写_m0_58414679的博客-CSDN博客
STM32F103写入Flash相关推荐
- MicroBlaze程序融合fpga的bit并烧写入Flash方法
1.在 Settings->Bitstream 中选中 -bin-file 2.在约束文件中添加 1)SPI的约束如下: set_property BITSTREAM.GENERAL.COMPR ...
- STM32G0 按照8位16位的方式写入flash HAL库
由于STM32G0只能按照64位的方式写入flash,所以有时候需要保存8位或者16位的数组就不是很方便,所以我做了一个将8位或者16位的数组先拼接成64位再写入flash的函数. 我在将数据写入fl ...
- IAP 15 数据写入 flash
当有上位机参与时,有些东西我们不能每次都抱着代码修改,将数据写入flash,方便通过上位机进行修改 #include "15W4KxxS4.H" #include "fl ...
- STM32F103的FLASH代码
在这边就不仔细介绍FALSH这个东西了,简而言之就是个存储数据的地方,比如每次完成一个任务,或者计数,就存储一下.但是在突然断电的时候可能会存不了(个人感觉只要每隔多久存一下,突然掉电也问题不大) 话 ...
- STM32F103 SPI flash操作注意事项
之前一直使用的W25Q16 spi flash都没问题,换了一款W25Q80后发现工作不正常,经过测试,初步定位到问题在于初始化SPI后是否将CS拉高.于是又去查看了一下原厂代码: 发现原厂的代码初始 ...
- STM32f103 —— 内部flash读写
#ifndef _MCU_FLASH_H_ #define _MCU_FLASH_H_#include <stdint.h>// STM32f103C8T6 64KB FLASH,20KB ...
- STM32F103之FLASH组织
- STM32F103 读写内部FLASH—学习笔记(野火)
STM32F103的Flash类型是NOR Flash 烧录过程:调试器→STM32的SRAM→运行→Flash 内部Flash比外部Flash更高效,原因是使用了内部总线,且工作频率是72MHz 2 ...
- STM32F103标准库开发:内部Flash的读写
本文章技术信息均出自:STM32F103系列超详细参考手册-中文版 STM32F103标准库开发-目录 一.STM32存储器介绍 STM32存储器分为以下两种: 1. 随机存储器-RAM RAM是与C ...
最新文章
- c是编译语言吗,将语言编译为C是一个好主意吗?
- 无损卡尔曼滤波UKF与多传感器融合
- ffmpeg 源码学习
- click quickstart
- EFCore 迁移
- win7 32位操作系统 ie8浏览器问题解决办法
- .NET后台如何获取前台HMTL控件的值
- 相克军_Oracle体系_随堂笔记011-事物
- 文件的创建、删除、移动和查找
- Android 应用程序模块: 应用, 任务, 进程, 和线程
- OneNote for win10防止英文自动切换字体工具
- Unity3D数字孪生笔记——Unity脚本篇
- 06-图3 六度空间
- html怎么把图片左移_css如何向左移动图片
- 逻辑回归实现鸢尾花分类
- 耗时8个小时用纯HTML和CSS写成的学成在线
- C++ 模版类和模板函数介绍及使用
- 全媒体运营师胡耀文教你:拆解电商运营万能公式
- Android案例手册 - 定位点圆形水波纹和椭圆水波纹
- 【洛谷】p5707上学迟到 C语言
热门文章
- 【电力电子技术DC-AC】单相方波逆变电路 Simulink仿真
- 工具分享:目录生成器
- 中国紫外线传感器市场深度研究分析报告
- 鸿蒙系统微波炉,华为新系统来了!鸿蒙OS+EMUI 11,设备协同无缝连接
- 命令行提示: DNS 服务器对区域没有权威
- 华三交换机检查命令行
- Tiva C 系列微处理器使用注意事项
- MySQL 系统表损坏导致xtrabackup备份失败Cannot open filepath
- Vehicle Re-Identification 调研 and数据集(未)
- Computer Vision: A Modern Approach - 计算机视觉书籍阅读笔记 -第六章 - 纹理