本次实验主要内容:Flash地址空间的数据读取。stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),将数据写入Flash


文章目录

  • 一、创建STM32CubeMX工程
  • 二、修改工程
  • 三、验证
  • 四、总结
  • 五、参考资料

一、创建STM32CubeMX工程

首先打开STM32CubeMX软件,选择芯片为STM32F103C8T6

图 1-1

这里选择PC13引脚为GPIO口,可以使实验效果更明显。创建STM32CubeMX工程文件可以参考博客:

STM32CubeMX的安装与简单应用_江南烟浓雨的博客-CSDN博客

然后生成工程文件。

二、修改工程

在创建好的工程中添加flash.cflash.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.hflash.c中的一些函数来实现写入操作。实验代码如下:

链接:https://pan.baidu.com/s/1kVZdhfqPfmUjs6mRjgJrIw
提取码:1234

五、参考资料

STM32之flash的读写_m0_58414679的博客-CSDN博客

STM32F103写入Flash相关推荐

  1. MicroBlaze程序融合fpga的bit并烧写入Flash方法

    1.在 Settings->Bitstream 中选中 -bin-file 2.在约束文件中添加 1)SPI的约束如下: set_property BITSTREAM.GENERAL.COMPR ...

  2. STM32G0 按照8位16位的方式写入flash HAL库

    由于STM32G0只能按照64位的方式写入flash,所以有时候需要保存8位或者16位的数组就不是很方便,所以我做了一个将8位或者16位的数组先拼接成64位再写入flash的函数. 我在将数据写入fl ...

  3. IAP 15 数据写入 flash

    当有上位机参与时,有些东西我们不能每次都抱着代码修改,将数据写入flash,方便通过上位机进行修改 #include "15W4KxxS4.H" #include "fl ...

  4. STM32F103的FLASH代码

    在这边就不仔细介绍FALSH这个东西了,简而言之就是个存储数据的地方,比如每次完成一个任务,或者计数,就存储一下.但是在突然断电的时候可能会存不了(个人感觉只要每隔多久存一下,突然掉电也问题不大) 话 ...

  5. STM32F103 SPI flash操作注意事项

    之前一直使用的W25Q16 spi flash都没问题,换了一款W25Q80后发现工作不正常,经过测试,初步定位到问题在于初始化SPI后是否将CS拉高.于是又去查看了一下原厂代码: 发现原厂的代码初始 ...

  6. STM32f103 —— 内部flash读写

    #ifndef _MCU_FLASH_H_ #define _MCU_FLASH_H_#include <stdint.h>// STM32f103C8T6 64KB FLASH,20KB ...

  7. STM32F103之FLASH组织

  8. STM32F103 读写内部FLASH—学习笔记(野火)

    STM32F103的Flash类型是NOR Flash 烧录过程:调试器→STM32的SRAM→运行→Flash 内部Flash比外部Flash更高效,原因是使用了内部总线,且工作频率是72MHz 2 ...

  9. STM32F103标准库开发:内部Flash的读写

    本文章技术信息均出自:STM32F103系列超详细参考手册-中文版 STM32F103标准库开发-目录 一.STM32存储器介绍 STM32存储器分为以下两种: 1. 随机存储器-RAM RAM是与C ...

最新文章

  1. c是编译语言吗,将语言编译为C是一个好主意吗?
  2. 无损卡尔曼滤波UKF与多传感器融合
  3. ffmpeg 源码学习
  4. click quickstart
  5. EFCore 迁移
  6. win7 32位操作系统 ie8浏览器问题解决办法
  7. .NET后台如何获取前台HMTL控件的值
  8. 相克军_Oracle体系_随堂笔记011-事物
  9. 文件的创建、删除、移动和查找
  10. Android 应用程序模块: 应用, 任务, 进程, 和线程
  11. OneNote for win10防止英文自动切换字体工具
  12. Unity3D数字孪生笔记——Unity脚本篇
  13. 06-图3 六度空间
  14. html怎么把图片左移_css如何向左移动图片
  15. 逻辑回归实现鸢尾花分类
  16. 耗时8个小时用纯HTML和CSS写成的学成在线
  17. C++ 模版类和模板函数介绍及使用
  18. 全媒体运营师胡耀文教你:拆解电商运营万能公式
  19. Android案例手册 - 定位点圆形水波纹和椭圆水波纹
  20. 【洛谷】p5707上学迟到 C语言

热门文章

  1. 【电力电子技术DC-AC】单相方波逆变电路 Simulink仿真
  2. 工具分享:目录生成器
  3. 中国紫外线传感器市场深度研究分析报告
  4. 鸿蒙系统微波炉,华为新系统来了!鸿蒙OS+EMUI 11,设备协同无缝连接
  5. 命令行提示: DNS 服务器对区域没有权威
  6. 华三交换机检查命令行
  7. Tiva C 系列微处理器使用注意事项
  8. MySQL 系统表损坏导致xtrabackup备份失败Cannot open filepath
  9. Vehicle Re-Identification 调研 and数据集(未)
  10. Computer Vision: A Modern Approach - 计算机视觉书籍阅读笔记 -第六章 - 纹理