ARM Cortex-M3嵌入式开发及应用教与学 课件 第08章 存储器管理_第1页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第08章 存储器管理_第2页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第08章 存储器管理_第3页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第08章 存储器管理_第4页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第08章 存储器管理_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章

存储器管理目录SRAM存储器EEPROM存储器FLASH存储器本章小结通过网标USER_ADC0_CH7,PA0口连接到滑动变阻器的分压输出端。通过调节滑动变阻器VR1,其分压输出端可输出0~3.3V的电压,该模拟电压信号被送到STM32F103RCT6的ADC模块,进行模数转换后,得到电压值。8.1SRAM存储器23STM32F103RCT6微控制器内置了3个12-bit的ADC模块,最高采样速率为1MSPS,具有常规方式和注入方式等多种工作模式。在STM32F103RCT6学习板上,用10kΩ滑动变阻器输出0~3.3V模拟电压送给STM32F103RCT6微控制器的ADC通道0输入端,如图3-2和图3-10所示。ADC通道0复用了管脚PA0,需要将PA0配置为ADC123_IN0功能。ADC模块时钟最大可为14MHz,ADC模块时钟来自APB2总线(即PCLK2,16MHz),需配置时钟配置寄存器RCC_CFGR的第[15:14]位域为00b,表示对PCLK2二分频后的8MHz时钟信号供给ADC模块。ADC工作原理4ADC模块相关的寄存器列于下表中。ADC工作原理5下面介绍表中常用的寄存器的含义,其余寄存器请参考STM32F103RCT6用户手册。ADC控制寄存器CR1的各位含义如下表所示。ADC工作原理6ADC控制寄存器CR2的各位含义如下表所示。ADC工作原理7ADC工程实例在工程PRJ15的基础上新建工程PRJ19,保存在“D:\STM32F103RCT6PRJ\PRJ19”目录下,此时的工程PRJ19与PRJ15完全相同。然后,新建文件adc.c和adc.h,并修改includes.h、bsp.c、exti.c和tim2.c文件。其中,includes.h文件中需要添加对adc.h头文件的包括,即添加以下一条语句:#include"adc.h"文件bsp.c的MyBSPInit初始化函数中(函数内部末尾处,即在程序段7-4的第16行和第17行中间),插入以下一条语句:MyADCInit();即调用MyADCInit函数初始化模数转换器ADC。8ADC工程实例文件exti.c的EXTI9_5_IRQHandler中断服务函数中添加以下一条语句:MyADCStart();当按下按键S18时点亮LED灯D10且同时调用MyADCStart函数启动模数转换。在文件tim2.c中将下面的语句注释掉,即//if(i%6==0) //UART2PutString((Int08U*)"Running...\n");即不再通过串口2向上位机发送“Running…”的功能,其位置如下图所示。将文件adc.c添加到工程管理器的BSP分组下。9工程PRJ19实现的功能如下图所示,图中只展示了工程PRJ19在工程PRJ15基础上新添加的功能。ADC工程实例10在用户按键S18的中断服务函数EXTI9_5_IRQHandler中,添加了MyADCStart函数,当S18被按下时,将启动STM32F103RCT6微控制器的ADC1转换,当模数转换完成后,自动触发ADC1中断服务程序ADC1_2_IRQHandler,在其中读取模拟电压的数字信号量,保存在myadcv全局变量中,并进一步调用MyADCValDisp函数将数字电压通过串口2送到上位机(计算机)显示出来,其结果如右图所示。ADC工程实例11下面详细介绍文件myadc.c和myadc.h的内容,分别如下面的程序段所示。ADC工程实例12ADC工程实例13ADC工程实例14下面介绍库函数类型的ADC工程。在工程PRJ16的基础上新建工程PRJ20,保存在“D:\STM32F103RCT6PRJ\PRJ20”目录下,此时的工程PRJ20与PRJ16完全相同。然后,进行如下的工作:(1)修改文件includes.h、bsp.c、exti.c和tim2.c,其中includes.h和bsp.c与工程PRJ19中的同名文件相同,即在includes.h的末尾添加“#include"adc.h"”,在bsp.c文件中的BSPInit函数内部的末尾添加“MyADCInit();”。在exti.c文件的中断服务函数EXTI9_5_IRQHandler中添加语句“MyADCStart();”,右面的程序段仅列举了该中断服务函数的内容:ADC工程实例15(2)添加新文件adc.h和adc.c,其中adc.h与程序段8-2完全相同,文件adc.c如下面的程序段所示。ADC工程实例16ADC工程实例17(3)将adc.c文件添加到工程管理器的“BSP”分组下,将目录“D:\STM32F103RCT6PRJ\PRJ20\STM32F10x_FWLib\src”下的文件stm32f10x_adc.c添加到工程管理器的“LIB”分组下,编译链接并运行工程PRJ20,其运行结果与工程PRJ19相同。ADC工程实例8.2EEPROM存储器1819AT24C128内部ROM容量为131072b,即16384B,被分成256页,每页64B。因此,AT24C128的地址长度为14位(被称为字地址),其中,8位用于页寻址,6位用于页内寻址。AT24C128写入数据方式有两种,即整页写入数据和单个字节写入数据;其读出数据方式有三种:当前地址读出数据、随机地址读出数据和顺序地址读出数据。为了节省篇幅,这里仅介绍常用的单个字节写入数据和随机地址读出数据的编程方法,这两种方法可以实现对AT24C128整个ROM空间任一地址的读写操作。单个字节写入数据和随机地址读出数据的时序如下图所示。EEPROM存储器20STM32F103RCT6微控制器的I2C1接口模块支持通过I2C通信协议访问AT24C128芯片,此时,I2C1接口模块工作在主模式下,如下图所示。EEPROM存储器21下面将讨论上图中各个寄存器的含义,如下面的表所示,I2C1模块的基地址为0x40005400。EEPROM存储器22本小节介绍访问AT24C128存储器的寄存器类型实例,其建设步骤如下:(1)在工程15的基础上,新建工程“PRJ21”,保存在“D:\STM32F103RCT6PRJ\PRJ21”目录下。此时的工程PRJ21与工程PRJ15完全相同,然后,进行后续工作。(2)新建文件iic1.c和iic1.h,保存在目录“D:\STM32F103RCT6PRJ\PRJ21\BSP”下,其源代码如下面的程序段所示。访问EEPROM寄存器类型实例23访问EEPROM寄存器类型实例24访问EEPROM寄存器类型实例25访问EEPROM寄存器类型实例26访问EEPROM寄存器类型实例27访问EEPROM寄存器类型实例28访问EEPROM寄存器类型实例(3)修改includes.h文件,其源代码如右面的程序段所示。29访问EEPROM寄存器类型实例(4)修改bsp.c文件,其源代码如右面的程序段所示。30访问EEPROM寄存器类型实例(5)修改main.c文件,其源代码如右面的程序段所示。31访问EEPROM寄存器类型实例(6)将文件iic1.c添加到工程管理器的“BSP”分组下。完成后的工程PRJ21如下图所示。32访问EEPROM寄存器类型实例在上图中,编译链接并在线仿真工程PRJ21,在程序段的第26行设定断点,运行到断点处后,可以得到如下图所示的“Watch1”窗口结果。由图可知,写入AT24C128和读出AT24C128的操作均正确。33访问EEPROM库函数类型实例本小节介绍访问AT24C128的库函数类型的工程实例,其建设步骤如下:(1)在工程PRJ16的基础上,新建工程“PRJ22”,保存在目录“D:\STM32F103RCT6PRJ\PRJ22”下。此时的工程PRJ22与工程PRJ16完全相同,然后,进行后续工作。(2)新建文件iic1.c和iic1.h,保存在目录“D:\STM32F103RCT6PRJ\PRJ22\BSP”下。34访问EEPROM寄存器类型实例35访问EEPROM寄存器类型实例36访问EEPROM寄存器类型实例37访问EEPROM寄存器类型实例(3)修改includes.h文件。(4)修改bsp.c文件。(5)修改main.c文件。(6)将文件iic1.c添加到工程管理器的“BSP”分组下,将目录“D:\STM32F103RCT6PRJ\PRJ17\STM32F10x_FWLib\src”下的文件stm32f10x_i2c.c添加到工程管理器的“LIB”分组下。8.3FLASH存储器3839FLASH存储器STM32F103RCT6微控制器具有3个同步串行口,其中有2个复用了I2S协议接口。在STM32F103RCT6学习板上,SPI2口与FLASH存储器W25Q64相连接。本节将以SPI2口为例详细介绍SPI通信协议、工作时序和STM32F103RCT6微控制器通过SPI2口访问Flash存储器W25Q64的程序设计方法。40STM32F103同步串行口STM32F103RCT6微控制器的SPI2口具有4个功能引脚,其中STM32F103RCT6工作在主机模式,W25Q64为从机模式,各个功能引脚的定义如下表所示。41STM32F103同步串行口根据SPI2_SCK信号的时钟极性CPOL和相位CPHA,SPI工作协议有4种工作模式。这里,设定CPOL=1和CPHA=1,此时SPI的工作时序如下图所示(摘自STM32F103参考手册)。42STM32F103同步串行口STM32F103RCT6微控制器的SPI模块结构如下图所示。43STM32F103同步串行口下面详细介绍SPI模块的各个寄存器的情况。SPI2模块的基地址为0x40003800,与APB1外设总线(最高36MHz,这里为32MHz)相连接。44STM32F103同步串行口45W25Q64访问控制W25Q64为64Mb(即8MB)的串行接口FLASH存储芯片,工作电压为3.3V,与微控制器STM32F103RCT6的电路连接如图3-7和图3-2所示。当采用标准SPI模式访问W25Q64时,其各个引脚的含义为:CS表示片选输入信号(低有效),CLK表示串行时钟输入信号,DI为串行数据输入信号,DO为串行数据输出信号,WP表示写保护输入信号(低有效),VCC和GND分别表示电源和地。STM32F103RCT6通过PB12、PB13(SPI2_SCK)、PB15(SPI2_MOSI)和PB14(SPI2_MISO)四根线实现对W25Q64的读/写访问,指令、地址和数据在CLK上升沿通过DI线进入W25Q64,而在SCK下降沿从W25Q64的DO线中读出数据或状态字。46W25Q64访问控制W25Q64芯片容量为8MB,分为32768个页,每个页256B。向W25Q64芯片写入数据,仅能按页写入,即一次写入一页内容。在写入数据(称为编程)前,必须首先对该页擦除,然后才能向该页写入一整页的内容。对W25Q64的擦除操作可以基于扇区或块,每个扇区包括16个页,大小为4KB;每个块包括8个扇区,大小为32KB;甚至可以整片擦除。对W25Q64的读操作,可以读出任一地址的字节,或一次读出一个页的内容。W25Q64的编址分为页地址(16位)和字节地址(8位),通过指定一个24位的地址,可以读出该地址的字节内容。47W25Q64访问控制W25Q64具有2个8-bit的状态寄存器:状态寄存器1和状态寄存器2。状态寄存器1第0位为只读的BUSY位,当W25Q64为忙时,读出该位的值为1;当W25Q64空闲时,读出该位的值为0。状态寄存器1的第1位为只读WEL位,当可写入时WEL为1,当不可写入时WEL为0。状态寄存器1的第6:2位域均写入0,表示非写保护状态;第7位SRP0写入1,该位与状态寄存器2的第0位SRP1(该位写入0),组合在一起表示可写入模式。状态寄存器2的第7:2位保留,终始为0;第1位为QE位,写入0表示为标准SPI模式。因此,初始化W25Q64时,状态寄存器1和2应分别写入0x80和0x00。48W25Q64访问控制W25Q64具有27条操作指令,下面介绍常用的几条,如下表所示。表中读器件ID号指令读出的W25Q64的ID号为0xEF16。49W25Q64访问控制W25Q64整片擦除的工作流程如下图所示。50W25Q64访问控制W25Q64芯片4kB扇区擦除的工作流程如下图所示。51W25Q64访问控制W25Q64的页编程工作流程如下图所示。52访问FLASH存储器寄存器类型工程实例工程PRJ23的具体实现步骤如下:(1)在工程PRJ21的基础上,新建工程“PRJ23”,保存在目录“D:\STM32F103RCT6PRJ\PRJ23”下。此时的工程PRJ23与工程PRJ21完全相同,然后,进行后续步骤。(2)新建文件spiflash.c和spiflash.h文件,保存在“D:\STM32F103RCT6PRJ\PRJ18\BSP”目录下。53访问FLASH存储器寄存器类型工程实例54访问FLASH存储器寄存器类型工程实例55访问FLASH存储器寄存器类型工程实例56访问FLASH存储器寄存器类型工程实例57访问FLASH存储器寄存器类型工程实例58访问FLASH存储器寄存器类型工程实例59访问FLASH存储器寄存器类型工程实例60访问FLASH存储器寄存器类型工程实例(3)修改includes.h文件,如右面程序段所示。61访问FLASH存储器寄存器类型工程实例(4)修改bsp.c文件,如下面程序段所示。62访问FLASH存储器寄存器类型工程实例(5)修改main.c文件,如下面程序段所示。63访问FLASH存储器寄存器类型工程实例64访问FLASH存储器寄存器类型工程实例(6)将文件spiflash.c添加到工程管理器的“BSP”分组下。完成后的工程PRJ23如下图所示。65访问FLASH存储器寄存器类型工程实例(7)写入W25Q64中的数据,在系统掉电后仍然保存着,一般地,W25Q64能有效存储数据20年,存取次数可达10万次。现在将程序段中第27~32行全部注释掉,并将STM32F103RCT6学习板断开电源几分钟后再次上电,再次借助ULINK2在线仿真工程PRJ23,可以看到变量wdat和数组WDat2中的数据仍然是正确的,如右图中“Watch1”窗口所示。66访问FLASH存储器库函数类型工程实例本小节介绍读写W25Q64存储器的库函数类型工程实例,具体建设步骤如下:(1)在工程PRJ22的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论