ARM Cortex-M3嵌入式开发及应用教与学 课件 第7-9章 串口通信与声码器;存储器管理;LCD屏与温度传感器_第1页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第7-9章 串口通信与声码器;存储器管理;LCD屏与温度传感器_第2页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第7-9章 串口通信与声码器;存储器管理;LCD屏与温度传感器_第3页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第7-9章 串口通信与声码器;存储器管理;LCD屏与温度传感器_第4页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第7-9章 串口通信与声码器;存储器管理;LCD屏与温度传感器_第5页
已阅读5页,还剩143页未读 继续免费阅读

下载本文档

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

文档简介

ARMCortex-M3嵌入式控制技术

——基于STM32F103RCT6

STM32F103硬件系统与KEILMDK工程第七章

串口通信与声码器

TM32F103RCT6微控制器具有5个串口,其中USART1~3是带有同步串行通信能力的同步异步串行口,而UART4~5是标准的异步串行通信口。本章将以STM32F103RCT6微控制器的USART2为例,介绍其片内串口外设的工作原理,并借助实例详细介绍串口通信的程序设计方法,包括串口发送数据和基于串口中断服务函数接收数据的方法。1串口通信工作原理2STM32F103串口3

串口通信寄存器类型实例4串口通信库函数类型实例5声码器7.1串口通信工作原理串口通信是指数据的各位按串行的方式沿一根总线进行的通信方式,RS-232标准的UART串口通信是典型的异步双工串行通信,通信方式如左图所示。UART串口通信需要两个引脚,即TXD和RXD,TXD为串口数据发送端,RXD为串口数据接收端。STM32F103微控制器的串口与计算机的串口按图7-1的方式相连,串行数据传输没有同步时钟,需要双方按相同的位传输速率异步传输,这个速率称为波特率,常用的波特率有4800bps、9600bps和115200bps等。UART串口通信的数据包以帧为单位,常用的帧结构为:1位起始位+8位数据位+1位奇偶校验位(可选)+1位停止位,如右图所示。7.2STM32F103串口TM32F103RCT6微控制器共有5个串口,其中,USART1~3为带同步串行通信功能的通用同步异步串行口,UART4~5为标准的异步串行通信口。这里以USART2工作在标准的异步串行通信方式下为例,介绍STM32F103RCT6微控制器的串口工作原理。7.2STM32F103串口串口USART2的基地址为0x40004400,其各个寄存器的情况如下所述。(1)串口数据寄存器USART_DR(偏移地址0x04)

32位的串口数据寄存器USART_DR只有第[8:0]位有效,用于发送串口数据时记为TDR,用于接收串口数据时记为RDR,TDR和RDR是映射到同一个地址的两个物理寄存器,通过读、写指令来区分使用了哪个寄存器,即读USART_DR时自动识别为RDR,写USART_DR时自动识别为TDR。(2)波特率寄存器USART_BRR(偏移地址为0x08,复位值为0x0)

32位的波特率寄存器USART_BRR只有第[15:0]位域有效,其中,第[15:4]位域记为DIV_Mantissa[11:0],第[3:0]位域记为DIV_Fraction[3:0]。波特率的计算公式为:波特率=fck/(16×USART_DIV),而USART_DIV=DIV_Mantissa+DIV_Fraction/16,例如,对USART2而言,当fck=PCLK1=32MHz时,如果波特率设为9600bps,则可配置DIV_Mantissa=208,DIV_Fraction=5;如果波特率设为115200bps,则可配置DIV_Mantissa=17,DIV_Fraction=6,实际波特率为115108bps,误差为0.08%(可接收范围内)。

(3)串口状态寄存器USART_SR(偏移地址为0x0,复位值为0xC0)

32位的串口状态寄存器USART_SR只有第[9:0]位有效,如表所示。位号名称属性含义31:10

保留9CTS可读/可写CTS标志位。当nCTS线路输入跳变时,硬件置位,写入0清零8LBD可读/可写LIN中止检测标志位。LIN中止发生后硬件置位,写入0清零7TXE只读发送数据寄存器空标志位。TDR内容传给移位寄存器时硬件置1,写DR寄存器清06TC可读/可写发送完成标志位。发送完成硬件置1,写入0清零(写DR+读SR也可清0)5RXNE可读/可写接收数据没有就绪标志位。接收数据准备好时硬件置1,读DR或写0均可清零4IDLE只读空闲线路检测标志位。空闲时自动置1,读DR+读SR可清零3ORE只读溢出错误标志位。接收溢出时硬件置1,读DR+读SR清零2NE只读噪声错误标志位。接收的位在采样时出现噪声时则硬件置1,读DR+读SR可清零1FE只读帧错误标志位。帧错误发生时硬件置1,读DR+读SR可清零该位0PE只读校验位错误标志位。接收的数据校验错误时硬件置1,读DR+读SR可清零该位(4)串口控制寄存器USART_CR1(偏移地址为0x0C,复位值为0x0)

32位的串口控制寄存器USART_CR1只有第[13:0]位有效,如表所示位号名称属性含义31:14

保留13UE可读/可写USART有效位。写入1开启USART,写入0关闭12M可读/可写字长位。为0表示8位数据位;为1表示9位数据位11WAKE可读/可写USART唤醒方式位。为0表示空闲位唤醒;为1表示最后有效数据位唤醒10PCE可读/可写校验控制位。为0表示无校验;为1表示有校验9PS可读/可写校验选择位。为0表示偶校验;为1表示奇校验8PEIE可读/可写PE中断有效位。为1表示校验位出错触发中断,为0表示不触发7TXEIE可读/可写TXE中断有效位。为1表示发送数据进入移位寄存器后触发中断,为0表示不触发6TCIE可读/可写发送完成中断有效位。为1表示发送数据完成后触发中断,为0表示不触发5RXNEIE可读/可写RXNE中断有效位。为1表示接收数据就绪或溢出时触发中断,为0表示不触发4IDLEIE可读/可写空闲中断有效位。为1表示空闲将触发中断,为0表示不触发3TE可读/可写发送有效位。为0表示关闭发送单元;为1表示开启发送单元2RE可读/可写接收有效位。为0表示关闭接收单元;为1表示开启接收单元1RWU可读/可写接收唤醒位。为0表示接收处于活跃模式下;为1表示处于静默模式下0SBK可读/可写发送中止符位。为1表示中止符将被发送,为0表示不发送中止符综上所述,可知串口的操作主要有如下3种:(1)串口初始化串口初始化包括3个主要的操作,即配置串口通信的波特率、设置串口数据帧的格式以及开启串口接收中断等。对于STM32F103RCT6,还应通过寄存器USART_CR1打开接收单元和发送单元。(2)发送数据串口发送数据一般通过函数调用实现,发送数据前应先判断前一个发送的数据是否发送完成,即判断USART_SR寄存器的TC位是否为1,如果为1表示前一个数据发送完成,则可以启动本次数据发送。发送数据只需要将待发送的数据写入串口数据寄存器USART_DR中,发送单元会按拟定的波特率将数据串行发送出去。(3)接收数据串口接收数据一般通过串口接收中断实现,需要开启串口接收中断,当接收到新的数据就绪时,在串口中断服务函数中读取串口接收到的数据。7.3串口通信寄存器类型实例在STM32F103RCT6学习板上,PA2和PA3口通过网标TXD232和RXD232与串口电平芯片ST3232的T2IN和R2OUT管脚相连,参考第2章图3-2和图3-6。本节将讨论寄存器类型的串口USART2通信实例。具体实现步骤如下所示:(1)在工程PRJ13的基础上,新建工程“PRJ15”,保存在目录“D:\STM32F103RCT6PRJ\PRJ15”下。此时的工程PRJ15与PRJ13完全相同。(2)新建文件uart2.c和uart2.h,保存在目录“D:\STM32F103RCT6PRJ\PRJ15\BSP”下。代码:代码:代码:代码:添加文件uart2.c到工程管理器的“BSP”分组下编译链接和运行工程PRJ15,同时在计算机端打开串口调试助手,其显示结果如图所示。在图中,点击“手动发送”,即将“DEF”三个字符由计算机发送给STM32F103RCT6开发板,然后,开发板的STM32F103RCT6微控制器将这三个字符再回送给上位机(这里表示计算机)。工程PRJ15的运行流程7.4串口通信库函数类型实例本节介绍库函数类型的串口通信工程实例,与寄存器类型工程PRJ15实现相同的功能,具体建设步骤如下:(1)在工程PRJ14的基础上,新建工程“PRJ16”,保存在目录“D:\STM32F103RCT6PRJ\PRJ16”下。此时的工程PRJ16与工程PRJ14完全相同。(2)新建文件uart2.c和uart2.h,保存在目录“D:\STM32F103RCT6PRJ\PRJ16\BSP”下。代码:代码:代码:将文件uart2.c添加到工程管理器的“BSP”分组下,将目录“D:\STM32F103RCT6PRJ\PRJ16\STM32F10x_FWLib\src”下的文件stm32f10x_usart.c添加到工程管理器的“LIB”分组下。7.4声码器声码器SYN6288是一种中文语音合成芯片,通过硬件的形式实现了将中文文本转化为语音(TTS)。一般地,上位机(这里指ARM微控制器)通过串口将文本数据发送到SYN6288,然后,SYN6288通过文本(包括汉字、数字和字母等)的编码值,在语音库中查找其数字形式存储的发音,再通过片内的数模转换器(还集成了数字滤波器等)将数字形式的语音转换为模拟语音信号,并送出模拟语音信号。SYN6288可以直接驱动8欧姆0.5W的扬声器。7.4.1声码器工作原理借助于网标TXD_AUDIO和RXD_AUDIO,STM32F103RCT6微控制器的PA9和PA10管脚与SYN6288的RXD和TXD相连接。由于SYN6288的输入端RXD为与标准的串口信号反向,所以,需要借助于一个反相器(这里使用了三极管S8050)连接TXD_AUDIO和RXD。在STM32F103RCT6微控制器中,PA9和PA10复用了USART1_TX和USART1_RX功能,即PA9和PA10可作为串口USART1的TXD和RXD端口。声码器SYN6288只能工作在波特率为9600bps、19200bps和38400bps下,并且要求串口数据格式为“1位起始位、8位数据位、无校验位、1位停止位”。因此,可配置STM32F103RCT6微控制器串口USART1工作在9600bps波特率下,然后,借助于串口USART1按照SYN6288规定的数据包协议向其发送文本数据,实现文本数据的语音转换与输出。SYN6288的数据包格式包结构包头(1字节)数据区长度数据区命令字(1字节)命令参数(1字节)文本数据异或校验码(1字节)数据0xFD0x000x??0x??0x??0x??0x??...0x??0x??说明固定为0xFD0x??为数据区的字节数见下表长度必须小于等于200字节全部数据(不含校验码)的异或值包结构包头(1字节)数据区长度数据区包结构包头(1字节)数据区长度数据区命令字(1字节)命令参数(1字节)文本数据异或校验码(1字节)数据0xFD0x000x020x21无无0xDE查询SYN6288的工作状态“数据区”的控制命令格式数据区(长度小于等于203个字节)命令字(1字节)命令参数(1字节)文本(最多200字节)异或校验码(1字节)取值含义高5位含义低3位含义0x01播放文本可取值0,1,2,...,15中的任一值当取值为0时,无背景音乐;当取值为1至15中的某一数k时,播放编号为k的背景音乐0文本采用GB2312编码要转化为语音的文本全部数据(含包头、表示数据区长度的2个字节、命令字、命令参数和文本,不含异或校验码)的异或值1文本采用GBK编码2文本采用BIG5编码3文本采用UNICODE码0x31设置波特率00000b0设置波特率为9600bps无文本1设置波特率为19200bps2设置波特率为38400bps0x02停止播放无参数0x03暂停播放0x04继续播放SYN6288配置波特率数据包SYN6288播放控制的数据包波特率(bps)数据包96000xFD0x000x030x310x000xCF192000xFD0x000x030x310x010xCE384000xFD0x000x030x310x020xCD播放控制数据包停止播放0xFD0x000x020x20xFD暂停播放0xFD0x000x020x030xFC继续播放0xFD0x000x020x040xFB转义文本表序号转义文本含义1[v?]这里的“?”可取值为0至16,表示播放文本的音量大小,0为静音,16为最大音量,默认为“[v10]”2[m?]这里的“?”可取值为0至16,表示播放背景音乐的音量大小,0为静音,16为最大音量,默认为“[m4]”3[t?]这里的“?”可取值为0至5,表示语速,0为最慢,5为最快,默认为“[t4]”4[n?]数字的发音方式,这里的“?”可取值为0至2,为1表示数字单个发音(例如“12”发音为“一二”,为2表示相邻数字合成为数值发音(例如“12”发音为“十二”),为0表示自动识别,默认为“[n0]”5[y?]数字1的读法,“?”只能取值0或1,为0时,“1”读“幺”;为1时,“1”读“一”,默认为“[y0]”6[o?]文本朗读方式,“?”只能取值0或1,为0时,自然朗读;为1时,逐字发音,默认为“[o0]”7[r][r]后面紧跟的汉字按姓氏发音,用于多音字的情况8[2][2]后紧跟的两个汉字联合成一个词语发音,中间无停顿9[3][3]后紧跟的三个汉字联合成一个词语发音,中间无停顿声码器SYN6288支持4种文本编码体系,即GB2312、GBK、BIG5和Unicode。如果使用KeilMDK编程环境,建议使用GB2312或GBK(GBK包括了GB2312)。大多数情况下,GB2312已经能满足日常需求了,GB2312包括半角ASCII码(编码范围为0x00~0x7F)、全角符号(编码范围为0xA1A0~0xA3FE)和6768个汉字(编码范围为0xB0A1~0xF7FE)。程序员无需去查阅文本的编码值,KeilMDK自动将汉字转化为其编码形式存储。7.4.2声码器寄存器类型实例在工程PRJ15的基础上新建工程PRJ17,保存在“D:\STM32F103RCT6PRJ\PRJ17”目录下,此时的工程PRJ17与PRJ15完全相同。然后,编写程序文件syn6288.c和syn6288.h,并修改文件includes.h、bsp.c和tim2.c。接着,将文件syn6288.c添加到工程管理器的BSP分组下。代码:代码:工程PRJ17实现的功能框图7.4.3声码器库函数类型实例本小节介绍库函数类型的声码器驱动程序,与工程PRJ17实现相同的功能。具体建设步骤如下:(1)在工程PRJ16的基础上,新建工程PRJ18,保存在目录“D:\STM32F103RCT6PRJ\PRJ18”下。此时的工程PRJ18与工程PRJ16完全相同。(2)新建syn6288.c和syn6288.h文件,保存在“D:\STM32F103RCT6PRJ\PRJ18\BSP”目录下代码:代码:代码:thankyou第八章

存储器管理目录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的基础上,新建工程“PRJ24”,保存在目录“D:\STM32F103RCT6PRJ24\PRJ24”下。此时的工程PRJ24与工程PRJ22完全相同,然后进行下述工作。(2)新建文件spiflash.c和spiflash.h,保存在“D:\STM32F103RCT6PRJ\PRJ24\BSP”目录下。67访问FLASH存储器库函数类型工程实例68访问FLASH存储器库函数类型工程实例69访问FLASH存储器库函数类型工程实例70访问FLASH存储器库函数类型工程实例(3)修改文件includes.h。(4)修改文件bsp.c。(5)修改文件main.c。(6)将文件spiflash.c添加到工程管理器的“BSP”分组下,将目录“D:\STM32F103RCT6PRJ\PRJ24\STM32F10x_FWLib\src”下的文件stm32f10x_spi.c添加到工程管理器的“LIB”分组下,完成后的工程PRJ24如下图所示。8.4本章小结71本章详细介绍了STM32F103RCT6微控制器ADC模块、I2C模块和SPI模块的工作原理与程序设计方法。本章的工程实例阐述了访问ADC模块、EEPROM芯片AT24C128和FLASH芯片W25Q64的程序设计方法。AT24C128和W25Q64芯片是常用存储器芯片的代表,其访问操作方法具有通用性和指导意义。建议读者朋友在本章学习的基础上,编写将汉字库存入W25Q64芯片的工程,整个16*16点阵宋体汉字库约占300kB,建议将汉字库存储在W25Q64芯片中的首地址设为0x8000。thankyouARMCortex-M3嵌入式控制技术

——基于STM32F103RCT6

STM32F103硬件系统与KEILMDK工程第九章

LCD屏与温度传感器

LCD显示屏是嵌入式系统中最重要的输出设备之一,STM32F103RCT6学习板集成了一块3.2寸240×320像素分辨率的SSD1289驱动真彩色TFT型LCD屏,可工作在262k色彩下。本章将介绍STM32F103RCT6驱动LCD屏的显示技术和工程程序设计方法,并介绍温度传感器DS18B20的应用方法。

本章的学习目标:

了解LCD屏显示原理;

熟悉DS18B20温度传感器的工作原理;

掌握DS18B20温度读取方法;

熟练应用寄存器或库函数方法在LCD屏上输出字符、汉字和图像。1LCD屏显示原理2温度传感器3

LCD显示实例9.1LCD屏显示原理串口通信是指数据的各位按串行的方式沿一根总线进行的通信方式,RS-232标准的UART串口通信是典型的异步双工串行通信,通信方式如左图所示。UART串口通信需要两个引脚,即TXD和RXD,TXD为串口数据发送端,RXD为串口数据接收端。STM32F103微控制器的串口与计算机的串口按图7-1的方式相连,串行数据传输没有同步时钟,需要双方按相同的位传输速率异步传输,这个速

温馨提示

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

评论

0/150

提交评论