STM32F103C8T6的内部Flash以及实例

〇、EEPROM与Flash(知识储备)

什么是EEPROM?

EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。
再次强调:它是一种掉电后数据不丢失的存储芯片!
换句话就是说,如果你这次使用断电后,下次使用时,上一次储存的代码依然存在!

在开发项目的时候,总会有需要掉电存储一些配置信息的时候。不过,ST公司为了节约成本,没有加入 EEPROM,但是许多场合下我们需要用EEPROM,怎么办呢?
有一种方法是利用FLASH模拟EEPROM

什么是Flash?

Flash 是存储芯片的一种,通过特定的程序可以修改里面的数据。Flash 存储器又称闪存,它结合了ROM 和RAM 的长处,不仅具备电子可擦除可编程(EEPROM)的性能——不会断电丢失数据,同时可以快速读取数据(NVRAM 的优势)。
再次重申:Flash的巨大特点就是:不会断电丢失数据、快速读取数据!!
那么我们可以基于Flash的这两大优点进行利用。

一、STM32F103内部

补充完EEPROM和Flash的基础知识,下面我们来说说STM32F103的内部结构

  • STM32F103内部结构图
    在这里插入图片描述
    通过结果图我们可以看到,右上角的就是Flash接口和Flash设备了,除此之外我们还需要注意一个地方,就是在Flash下方的SRAM。

什么是SRAM?

SRAM,全名Static Random-Access Memory,译为静态随机存取存储器,是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。与之相对应的是DRAM,也就是动态随机存取存储器,其里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据是会消失的。

下面我们总结对比一下RAM和Flash:

FlashRAM
地址flash地址起始于0x0800 0000,结束地址是0x0800 0000+芯片实际的flash大小,不同的芯片flash大小不同RAM起始地址是0x2000 0000,结束地址是0x2000 0000+芯片的RAM大小。不同的芯片RAM也不同
作用一般用来存储代码和一些定义为const的数据,断电不丢失可以理解为内存,用来存储代码运行时的数据,变量等等。掉电数据丢失

相对之下,Flash不会断电丢失数据的特性就被无限放大。

二、SD卡的读写

1. 说明

将64K数据分250次,每次256字节,写入SD卡,测试速度
具体操作,如:硬件连接,协议分析介绍等,可以参考博主前面的博客:SD卡协议原理并用STM32F103 完成对SD卡的数据读取(FAT文件模式)

2.实验过程

在这里插入图片描述
总共用了13分钟,共写入了64K字节

  • 查看hello.txt文档
    在这里插入图片描述
    一共有250行数据

3.从SD卡里读出数据

利用FATS从SD卡读出数据,并且串口输出

3.1 代码修改

  • 因为要进行读取,所以将写入部分的函数改为读出函数
    在这里插入图片描述
  • 声明读出函数,定义双字节数据类型s,用来保存地址(或者存放指针),再定义字节类型格式的变量和一个存储读取的数组
    在这里插入图片描述
  • ① 修改f_open函数的第三个参数设置为打开状态为FA_READ模式。②文件指针移至相应位置,否则无输出。③指针加地址④使用FATS的read函数,第一个参数是指针,第二个是存储数组,第三个是数组大小,第四个是强制转换br为UINT格式。⑤输出
    在这里插入图片描述

3.2 结果显示

在这里插入图片描述

三、将内容写入flash

源码链接:
链接:https://pan.baidu.com/s/1jJ6_YlAI9W81w7h6c7FVBw
提取码:qwer

1.CubeMX设置

  • 将定时器设置成Sys Tick
    在这里插入图片描述
  • 将引脚PC13配置为输出模式,并使能该引脚
    在这里插入图片描述
    在这里插入图片描述
  • 时钟配置
    在这里插入图片描述
  • 设置堆栈大小
    在这里插入图片描述

2.代码部分

生成工程文件后,进入MDK,进入代码部分,对代码做如下修改

  • 在main.c中加入如下代码
    在这里插入图片描述

  • 修改数据内容( 将数组中写入要存储的数据)
    在这里插入图片描述
    在这里插入图片描述

3.硬件连接以及环境配置

  • STM32与ST-link连接方式
ST-LINKSTM32
SWCLK/TCKSWCLK/TCK
SWDIO/TMSSWDIO/TMS
GNDGND
VCCVCC

在这里插入图片描述

  • 设置debug为st-link debugger
    在这里插入图片描述

  • 点进去后可以看到要检测出SWDIO有信息即可烧录
    在这里插入图片描述

4.调试程序

  • 编译工程无错误后,点击download下载程序
    在这里插入图片描述
    注意,download后,要将STM32调整至工作模式,并按下复位键

  • 进行程序调试,全速运行
    在这里插入图片描述

  • View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800c000,观察将要修改的flash区间区容
    在这里插入图片描述

  • 在Memory 1窗口中可以看到在FLASH地址0x0800C000区成功写入对应内容
    在这里插入图片描述

  • View->Watch windows->Watch 1打开一个变量观察窗口,将变量FlashWBuff 和 FlashRBuff加入到 Watch 1 观察窗口
    在这里插入图片描述

  • 全速运行程序,可以看到数组FlashRBuff中内容与数组FlashWBuff中内容一样了
    在这里插入图片描述

四、实例——基于片内Flash的提示音播放程序

1.音频准备

  • 安装音频处理软件

百度安装网盘:
链接:https://pan.baidu.com/s/1FgJ8f_XZflNWyB_T2SX3sA
提取码:qwer

2.录制“您好欢迎光临 ”

  • 点击录制按钮选择录音时间为2s
    注意:如果没打开麦克风权限,会开始失败!
    在这里插入图片描述
  • 录音波形如图
    在这里插入图片描述

3.生成wav文件

  • 打开后一直点着拖动可以选取截取音频范围,然后点击修剪
    在这里插入图片描述
  • 点击效果->重取样,将采样频率改成8000HZ
    在这里插入图片描述
  • 点击文件→保存转换→编辑预设→选择8bit 单→设置名称
    在这里插入图片描述
    在这里插入图片描述
  • 点击文件->保存转换->Wave->8*8
    在这里插入图片描述
  • 将修建好的音频以.wav格式保存
    在这里插入图片描述

4.将.wav文件转换成十六进制

用ultraEdit打开刚刚生成的.wav文件
在这里插入图片描述

  • CTRL+A,接着鼠标右键,选择 十六进制复制选定视图,将内容粘贴到一个新建文件中
    在这里插入图片描述
  • 全选后,右键选择范围,选中十六进制的范围
    在这里插入图片描述
  • 将复制的数据粘贴到notePad++中
    在这里插入图片描述
  • 采用列编辑,在每一列前面加上0x
    在这里插入图片描述
    在这里插入图片描述

5.将生成的音频十六进制写入FLASH

使用野火例程代码
链接:https://pan.baidu.com/s/1n6D4TDhnKX2DxjeOgsxBqQ
提取码:qwer

  • 将生成的音频十六进制放入到Sine12bit中
    在这里插入图片描述
    将代码烧入到STM32芯片中,再通过PCM模块,接到一个蜂鸣器上即可听到声音。

总结

本篇博客介绍了Flash的特点,并通过实例初步讲解了如何合理的使用它,写入Flash的过程并不复杂,但是将音频文件写入Flash的过程确实繁多,因为首先在写入Flash时,要先将音频转成16进制。注意一点,在数据写不进Flash时,有可能是因为你的芯片没有设置成工作模式。

参考资料

EEPROM——百度百科
STM32F103C8T6使用内部Flash的第63页保存参数
STM32 进阶教程 13 – FLASH的读写操作
STM32F103的DAC——输出声音效果

  • 11
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,它具有丰富的外设和强大的性能。LCD1602是一种常见的字符型液晶显示器,它可以显示两行16个字符。在STM32F103C8T6上使用LCD1602可以实现简单的字符显示功能。 实现步骤如下: 1. 确定STM32F103C8T6的引脚连接方式,将LCD1602的VSS、VDD、V0、RS、RW、E、D0~D7引脚连接到STM32F103C8T6的相应引脚上。 2. 初始化GPIO口,将LCD1602的控制引脚和数据引脚设置为输出模式。 3. 初始化LCD1602,发送初始化命令,包括清屏、设置光标位置等。 4. 编写字符显示函数,将要显示的字符写入LCD1602的数据寄存器中。 5. 调用字符显示函数,将字符显示在LCD1602上。 以上就是STM32F103C8T6和LCD1602的简单实例。需要注意的是,具体的实现细节还需要根据具体的硬件和软件环境进行调整。 ### 回答2: STM32F103C8T6是一款高性能的32位微控制器,拥有大量的外设和丰富的功能。LCD1602是一款16*2字符型液晶模块,可以显示16个字符,每行2个字符。本例程将STM32F103C8T6和LCD1602结合起来,实现字符的显示。 首先需要准备好硬件环境,包括STM32F103C8T6开发板、LCD1602模块和杜邦线。将LCD1602的VSS、VDD和VO引脚分别连接到STM32F103C8T6的GND、3.3V和PA3引脚。将LCD1602的RS、RW和E引脚分别连接到STM32F103C8T6的PA1、PA2和PA0引脚,将LCD1602的D0-D7引脚分别连接到STM32F103C8T6的PB0-PB7引脚。 接下来是编写代码。使用STM32CubeMX创建工程,选择STM32F103C8系列,在Pinout一栏中设置引脚连接方式。在配置PA0、PA1和PA2引脚为GPIO输出模式后,将PA0和PA1引脚设置为高电平,PA2引脚设置为低电平,即可使LCD1602进入工作模式。在配置PB0-PB7引脚为GPIO输出模式后,即可通过对这些引脚的输出来控制LCD1602的显示内容。 代码主要分为初始化函数和显示函数两部分。初始化函数负责将LCD1602设置为工作模式,并设置显示模式、光标和光标移动模式等参数。显示函数负责将需要显示的数据通过对PB0-PB7引脚的输出,显示到LCD1602上。 最后需要注意,在写入数据之前,需要等待一定的时间,以保证LCD1602可以接受到数据。此外,还需要注意在每次写入数据之后,需要等待一定的时间,以保证LCD1602完成显示。这些时间可以通过延时函数来实现。 综上所述,本例程将STM32F103C8T6和LCD1602进行了结合,实现了字符显示的功能。学习这个例程可以让用户更好地理解STM32F103C8T6的基础原理和LCD1602的显示原理,提升对嵌入式系统的理解和应用。 ### 回答3: STM32F103C8T6是一款非常常用的开发板,它掌握了很多的先进技术,因此在很多领域都有广泛的应用。而在此基础上,如果想显示信息,那么可以通过连接 LCD1602 模块,在开发板上显示信息。因此,本篇文章将为大家介绍 STM32F103C8T6 + LCD1602 实例。 首先,我们需要准备 STM32F103C8T6 开发板和 LCD1602 模块。然后将 STM32F103C8T6 开发板和 LCD1602 模块相连,可以通过跳线连接。接下来,我们需要给 LCD1602 提供电流,可以将 VSS 连接到 GND,VDD 连接到 5V,VO 连接到电位变器调节器中。 接下来,我们可以通过编写程序来实现 STM32F103C8T6 和 LCD1602 模块之间的通信。在编程时,我们需要用到 Keil C51 编译器和 STC-ISP 烧录软件。通过 Keil C51 编译器,我们可以在电脑上编程,然后通过 STC-ISP 烧录软件将编写好的程序烧录到 STM32F103C8T6 开发板上。 在编写程序时,我们需要定义一些常量和变量。例如,我们需要定义串行时钟、数据线和状态寄存器的端口及端口号,将其关联到开发板的对应 GPIO 端口上。然后,通过编写程序来实现显示信息,并定义数据和命令传输的函数。 在整个实例中,我们首先需要初始化 LCD1602 的显示并将其清楚,设置光标显示和光标闪烁模式,然后通过调用传输数据或命令的函数来实现显示信息。在编写程序时,还需要考虑到一些延时的设置,比如等待 LCD1602 的响应时间,或者等待一些状态的改变。 总之,STM32F103C8T6 和 LCD1602 模块之间的通信是一种非常强大的技术,可以应用在各种领域中。在实际应用中,还需要根据具体情况进行调整和改进,以实现最佳的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值