基于STM32的嵌入式系统设计实验实验指导书.docx
《基于STM32的嵌入式系统设计实验实验指导书.docx》由会员分享,可在线阅读,更多相关《基于STM32的嵌入式系统设计实验实验指导书.docx(31页珍藏版)》请在冰豆网上搜索。
基于STM32的嵌入式系统设计实验实验指导书
实验指导书
(实验)课程名称:
基于STM32的嵌入式系统设计实验
实验一电路板焊接与调试
一.实验简介
完成实验板上部分元件的焊接,焊接完成后进行基本测试。
二.实验目的及原理
掌握STM32F103实验板的基本原理,掌握焊接电路板的基本技能,掌握下载测试程序的基本方法。
原理:
详细内容参考教材《基于STM32的嵌入式系统原理与设计》
MCU和周边电路
如图为MCU及其周边电路。
图1MCU及其周边电路
1.
唤醒电路,高有效,不按时接220K电阻下拉。
2.复位电路,低有效。
带RC启动复位。
3.配置启动,用跳线选择BOOT1和BOOT0接高电平或低电平。
4.高速晶振电路,采用8M晶振,在STM32内部倍频为72M。
5.AD参考电路,采用LC滤波,可跳线选择直接接VCC或通过TL431稳压电路产生的参考电压。
6.后备电池。
可通过跳线选择直接接VCC或电池。
7.AD输入,可选择使用RC滤波,共8路。
8.低速晶振电路,选用32.768kHz晶振,为产生准确的串口波特率。
USB转串口电路
USB转串口电路可以方便没有串口的笔记本电脑用户通过USB接口下载代码到FLASH中,及进行RS232串行通信。
图2USB转串口接口电路
USB转串口芯片是CP2102,该芯片稳定性较好。
当其正常工作的时候,灯LED6亮。
该芯片DP/D+引脚连MINIUSB接口的脚3,DM/D-引脚连MINIUSB接口的脚2,为一对USB输入输出线。
TXD与RXD引脚接MCU的PA10(USART1_RX)和PA9(USART1_TX)。
I2C接口电路
本书选择的EEPROM是AT24C02是256字节的电可擦出PROM,通过I2C协议与STM32进行通信,连接十分简单。
EEPROM虽然容量只有256字节,但是读写比较方便,与MCU连线少,被广泛的使用在智能仪器、汽车电子、工业控制、家用电器等场合。
实例中使用AT24C02存储屏幕是否校准过及屏幕各个角的模拟值等。
图3I2C接口电路
A2、A1、A0为做级联时使用,这里只有1片24C02,接地即可。
WP为写保护,不保护的时候接地。
SCL为I2C时钟,SDA为I2C数据,因开漏输出,需外部接上拉电阻上拉。
三.实验内容
学习STM32F103实验板电路的原理图
焊接电路板上部分电阻电容
焊接LED和蜂鸣器
焊接ASM1117芯片IIC芯片AT24C02
下载测试代码到焊接好的STM32实验板,测试实验板是否工作正常。
实验原理根据教材。
四.实验设备
硬件部分:
PC计算机(宿主机)、STM32实验板、电烙铁
软件部分:
测试软件(源代码)、ISP下载软件
五.实验步骤
1.焊接电路板部分电阻电容
2.焊接LED和蜂鸣器
3.焊接ASM1117芯片IIC芯片AT24C02
4.焊接晶振
5.检查和清洁实验板。
注意需在测试前检查电源与地之间是否短路才能进入下一步。
6.下载测试代码到焊接好的电路板,测试焊接是否正确。
测试过程通过串口调试助手输出测试信息,依次测试串口、LED、按键、蜂鸣器、IIC和SPIFLSH的工作情况。
7.如测试不通过,根据现象检查电路,找到问题后进行修正,然后重新测试。
实验二流水灯和按键实验
一.实验简介
从无到有构建第一个STM32工程,并实现流水灯效果和按键响应。
二.实验目的及原理
掌握STM32开发环境,掌握从无到有的构建工程,学会GPIO基本操作。
原理:
详细内容参考教材《基于STM32的嵌入式系统原理与设计》
输入输出端口GPIO
GPIO是常规输入输出端口,STM32F103VE有PA、PB、PC、PD、PE共5个16位的GPIO。
STM32的GPIO都是可编程的,具有很多复用功能。
从图1.7.1可见,通过对输出控及肖特基触发器及各个开关的控制,可以选择使用GPIO功能或复用功能。
当听过编程,将输出控制设置为选择复用功能的时候,就从来自片上外设的复用功能输出端采集数据,反之采集输出数据寄存器上的数据。
在GPIO方式下也可以配置为很多种模式,这和51单片机是有明显的区别,功能性强了很多。
这些模式有:
输入浮空、输入上拉、输入下拉、模拟输入、开漏输入、推挽输出、推挽复用、开漏复用。
在默认的模式下为输入浮空。
每个I/O端口可以通过对GPIO寄存器写操作来编程成一种模式,GPIO寄存器包括端口配置低寄存器GPIOx_CRL、端口配置高寄存器GPIOx_CRH、端口输入寄存器GPIOx_IDR、端口输出寄存器GPIOx_ODR、端口位设置清除寄存器GPIOx_BSRR、端口为清除寄存器GPIOx_BRR、端口锁定寄存器GPIOx_LCKR。
所有x的范围为(A-E)。
80个GPIO分为5组,A-E就是分组号。
例如,GPIOB_CRL就是B组GPIO的端口配置低寄存器,GPIOC_CRL就是C组GPIO的端口配置低寄存器。
构建工程如图所示:
图1:
工程文件
固件库构建过程:
在D盘建立一个目录,在其下建立一个子目录firstpeoject作为工作目录。
然后,又在其下建立了一些子目录。
当然,使用的工具就是WINDOWS资源管理器。
这个目录可以放在任何一个盘或目录里,没有限制。
现在开始拷贝文件。
1)拷贝内核文件和驱动支持文件、启动文件
将固件库Libraries\CMSIS\CM3\CoreSupport目录下的两个文件core_cm3.c和core_cm3.h文件拷贝到刚刚创建的stm32lib\m3子目录中。
将固件库Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x目录下的stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h也拷贝到stm32lib\m3子目录中。
将Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下的启动代码也拷贝到application子目录中。
启动文件有好几个,笔者的STM32硬件芯片是STM32F103VET6,是属于高密度的芯片,因此应该拷贝startup_stm32f10x_hd.s。
启动开发,启动文件startup_stm32f10x_hd.s是程序开始的地方。
2)接下来拷贝设备驱动程序。
将Libraries\STM32F10x_StdPeriph_Driver\inc目录下的所有文件拷贝到stm32lib\inc目录下。
将Libraries\STM32F10x_StdPeriph_Driver\src目录下的所有文件拷贝到stm32lib\src目录下。
3)拷贝外设中断函数文件和固件库配置文件
拷贝固件库的Project\STM32F10x_StdPeriph_Templat目录下的文件stm32f10x_it.h、stm32f10x_it.c和stm32f10x_conf.h文件到application子目录中。
三.实验内容
熟悉MDKKEIL开发环境,构建基于固件库的工程,编写代码实现流水灯工程,按键后能改变流水灯速度。
通过ISP下载代码到实验板,查看运行结果。
使用JLINK下载代码到目标板,查看运行结果,使用JLINK在线调试。
实验原理根据教材。
四.实验设备
硬件部分:
PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:
PC机WINDOWS系统、MDKKEIL软件、ISP软件。
五.实验步骤
1.熟悉MDKKEIL开发环境
2.熟悉串口编程软件ISP
3.查看固件库结构和文件
4.建立工程目录,复制库文件
5.建立和配置工程
6.编写代码
7.编译代码
8.使用ISP下载到实验板
9.测试运行结果
10.使用JLINK下载到实验板
11.单步调试
12.记录实验过程,撰写实验报告
实验三串口发送和接收实验
一.实验简介
编写代码实现串口发送和接收,将通过串口发送来的数据回送回去。
二.实验目的
掌握STM32基本串口编程,进一步学习中断处理。
原理:
详细内容参考教材《基于STM32的嵌入式系统原理与设计》
STM32的同步异步收发器USART和传统的51单片机或PC即串行口UART稍有区别:
通用同步异步收发器(USART)提供了一种灵活的方法与使用异步串行数据格式的外部设备之间进行全双工数据交换。
USART利用分数波特率发生器提供宽范围的波特率选择。
另外,它还允许多处理器通信。
USART也可以使用DMA方式直接将接收的数据存储到内存或从内存中批量发送数据,也支持多种中断方式。
接口通过三个引脚与其他设备连接在一起。
接收数据输入(RX)和发送数据输出(TX)及地(GND)。
如果使用更复杂的功能,如硬件流控制的时候,需要更多的引脚。
RX:
接收数据串行输入。
TX:
发送数据输出。
串行异步通信USART库函数
串行通信库函数在"stm32f10x_usart.h"中声明,在"stm32f10x_usart.c"中实现。
外设库函数文件USART库函数如下表所示:
串行异步通信USART库函数一览
函数名
描述
USART_DeInit
将外设USARTx寄存器重设为缺省值
USART_Init
初始化外设USARTx寄存器
USART_StructInit
把USART_InitStruct中的每一个参数按缺省值填入
USART_Cmd
使能或者失能USART外设
USART_ITConfig
使能或者失能指定的USART中断
USART_DMACmd
使能或者失能指定USART的DMA请求
USART_SetAddress
设置USART节点的地址
USART_WakeUpConfig
选择USART的唤醒方式
USART_ReceiverWakeUpCmd
检查USART是否处于静默模式
USART_LINBreakDetectLengthConfig
设置USARTLIN中断检测长度
USART_LINCmd
使能或者失能USARTx的LIN模式
USART_SendData
通过外设USARTx发送单个数据
USART_ReceiveData
返回USARTx最近接收到的数据
USART_SendBreak
发送中断字
USART_SetGuardTime
设置指定的USART保护时间
USART_SetPrescaler
设置USART时钟预分频
USART_SmartCardCmd
使能或者失能指定USART的智能卡模式
USART_SmartCardNackCmd
使能或者失能NACK传输
USART_HalfDuplexCmd
使能或者失能USART半双工模式
USART_IrDAConfig
设置USARTIrDA模式
USART_IrDACmd
使能或者失能USARTIrDA模式
USART_GetFlagStatus
检查指定的USART标志位设置与否
USART_ClearFlag
清除USARTx的待处理标志位
USART_GetITStatus
检查指定的USART中断发生与否
USART_ClearITPendingBit
清除USARTx的中断待处理位
三.实验内容
编写主程序,初始化串口1,设置波特率为9600,无校验,数据位8位,停止位1位。
编写中断服务程序代码实现将发送过来的数据回送。
四.实验设备
硬件部分:
PC计算机(宿主机)、亮点STM32实验板、JLINK、示波器。
软件部分:
PC机WINDOWS系统、MDKKEIL软件、ISP软件、串口调试助手。
五.实验步骤
1编写串口初始化代码
2编写中断服务程序代码
3编译代码,使用JLINK或ISP下载到实验板
4记录实验过程,撰写实验报告
实验四串口DMA双缓冲实验
一.实验简介
使用双缓冲区,同时进行串口数据接收和数据处理。
二.实验目的及原理
进一步掌握串口编程,进一步学习DMA编程。
学习使用双缓冲兵乓操作,理解互斥资源。
进一步学习使用DMA和中断,提高编程能力。
原理:
详细内容参考教材《基于STM32的嵌入式系统原理与设计》
直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速的无需CPU干预的数据传输。
数据通过DMA快速地移动,例如从串口到内存,当在内存中收到一定数量的数据时才发出一个中断,CPU才放下手头的工作去处理,这就节省了CPU的资源来做其他操作。
STM32有两个DMA控制器,其中DMA1有7个通道,DMA2有5个通道,每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。
另外,还有一个仲裁器来协调各个DMA请求的优先权。
STM32在硬件上设计了这么多的DMA通道是煞费苦心的,用好DMA控制器,可以大大的提高系统的吞吐量。
在PC机上,将硬盘数据复制到内存,就采用DMA模式,把拷贝数据的任务交给DMA来执行,CPU就可以去做别的事情了。
在STM32下也是如此,在编程中不采用DMA模式,全靠CPU去辛苦劳作,是巨大的损失。
要使用好DMA控制器,首先要了解它。
DMA框图
STM32有一大堆的可以使用DMA与内存进行直接交互的外设,但是只有2个DMA控制器。
这就导致,当外设要进行DMA传输的时候,首先要获得批准。
当然,哪几个外设可以使用哪些通道,是预先就设计好了的,在使用哪个通道的问题上就不需要过多考虑,但是编程人员必须认真对待这个问题,否则DMA传输就用不起来。
DMA传输可以从内存到外设,也可以从外设到内存,另外,内存到内存的DMA传输也是允许的,这个很方便。
大部分的外设是APB外设,但是,也有两个AHB外设,以太网和USB可以参加,它们很需要高速的DMA传输!
DMA传输要申请,有申请就得成立一个总裁机构,于是,两个DMA控制器都设立了仲裁委员会。
获得了批准的设备就可以在DMA控制器的控制下,和内存进行数据交换,但是数据传输的方向在批准的时候就要填写进申请表,还有一些其他的参数也要仔细填写进去(如传输的数据量,是按字传输还是半字、字节传输等,传输完成后是否发中断等),批准后就严格按申请表的内容进行数据传输。
当然,和一般的协议一样,还有附加条款:
当主人CPU需要访问SRAM的时候,DMA请求会暂停CPU访问系统总线达若干个周期,总线仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。
另外,可编程的数据传输数目最大为65535。
三.实验内容
假设,有一个设备用RS232串行口以256000的波特率发送数据,并且大概每80毫秒发送8个字节的数据。
使用串口调试助手,仿真这个设备。
要求将该设备发送的数据求平均值后送回。
采用DMA方式接收数据,接收完成后发生中断,然后DMA通道使用另一个缓冲区继续接收数据。
而这时CPU可以处理数据,计算刚接收到数据的平均值。
然后送回。
这样,CPU和DMA并行工作。
四.实验设备
硬件部分:
PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:
PC机WINDOWS系统、MDKKEIL软件、ISP软件、串口调试助手。
五.实验步骤
1编写主程序代码,创建2个缓冲区,设置串口、DMA。
2编写中断服务程序代码
3编译代码,使用JLINK或ISP下载到实验板
4记录实验过程,撰写实验报告
实验五I2C实验
一.实验简介
编程实现对使用I2C接口的EPC02芯片进行写和读操作。
二.实验目的及原理
熟练掌握I2C编程,学会对EPC02的读写操作。
原理:
详细内容参考教材《基于STM32的嵌入式系统原理与设计》
24C02是电可擦除PROM,即EEPROM,其容量是256X8bit,,即2Kbits。
24C02接口方式为两线I2C接口。
其总线时序如图:
图124C02总线时序
由图可见,24C02的读写时序完全采用I2C方式,因此,既然已经实现了I2C驱动函数,就可以调用这些函数来实现24C02的驱动。
寻址24C02,它的地址应该是什么呢?
图224C02地址格式
因为在STM32实验板上,将A2\A1\A0接地,那么A2,A1,A0三位都为0。
最低位LSB为读写操作位,读为高电平,写为低电平。
因此,写地址为0XA0,读地址为0XA1。
如果有多个24C02,那么应该将A2A1A0连接到不同的电平,让它们的地址不同,这样就可以分别访问。
在写操作的时候,首先给出启动条件,然后向24C02发送器件地址,被寻址的24C02会应答。
在接收应答成功后,再发送8位的字地址。
24C02接收到这个地址后,会产生应答,接收到这个应答后可以发送8位的数据。
在接收到8位的数据后EEPROM又会应答,这时必须给出停止条件来结束。
在进行读操作的时候,流程基本相同,但需要在发送了器件地址和字地址,接收到应答后,开始读之前,发送一个启动条件再发送一个写地址给器件。
三.实验内容
编写I2C驱动程序,使用驱动程序初始化EPC02,判断设备正确性。
写256个0x5A到EPC02,读出并发送给串口,通过串口调试助手判别是否读到的都是0x5A.
四.实验设备
硬件部分:
PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:
PC机WINDOWS系统、MDKKEIL软件、ISP软件、串口调试助手。
五.实验步骤
1参考教材I2C部分,编写I2C驱动程序。
2编写主程序
3编译代码,使用JLINK或ISP下载到实验板
4记录实验过程,撰写实验报告
实验六SPIFLASH实验
一.实验简介
编程实现对SPI接口的W25Q64进行读写操作。
二.实验目的及原理
熟练掌握SPI编程,学会对的W25Q64读写操作。
原理:
详细内容参考教材《基于STM32的嵌入式系统原理与设计》
SPIFLASH基本结构
以SPI接口的FLASH芯片W25Q64为例来讲解这一节。
W25Q64有32K个可编程的页(Page)组成,每个页有256个字节。
可以计算一下:
32K*256=8M字节。
因此W25Q64有8Mbyte(64Mbit)的可读写存储空间,地址从0x0到0x7FFFFF。
对于SPIFLASH来说,页是一次写入的最小单位,编程中,一次可以对256字节的数据块进行写操作。
16个页组成一个扇区(Sector),所以一个扇区就是4K,4096字节。
在擦除操作的时候,可以一次擦除1个扇区(4K块)、8个扇区(32KB块)、16个扇区(64KB块)或整个芯片!
16个扇区可以组成一个64KB块(BLOCK)。
总结一下,在SPIFLASH中,一个块包含1个或多个扇区,一个扇区又包含多个页,而页是编程的最小单位,但是擦除操作是以块为单位的。
当读者使用不同的器件的时候,要阅读这些器件的数据手册。
控制和状态寄存器
要对SPIFLASH进行擦除、编程、设置等操作,就要编程读写其控制和状态寄存器。
对于W25Q64而言,控制和状态寄存器有SR1和SR2,其中SR2仅有最低位有效。
表3W25Q64控制和状态寄存器
寄存器
位
名称
功能描述
SR2
S8
SRP1
保护方法,与WEL组合可以配置为5种保护方式
SR1
S7
SRP0
S6
SEC
决定是以4KB块还是以64KB的块来进行保护。
SEC默认值是0,以64KB的块来进行保护。
S5
TB
顶部/底部块保护TB控制BP是从顶部开始还是底部开始。
TB=0,从顶部开始,TB=1从底部开始。
S4
BP2
写这些位可以进行相应的写保护控制,读这些位可以知道当前块保护的状态。
可以保护整个芯片或者一部分,或不保护。
默认不保护
S3
BP1
S2
BP0
S1
WEL
WEL位当执行完写使能的时候置1。
当芯片被写禁止的时候清0。
也就是标志着芯片是否可写。
S0
BUSY
忙标志
当要向SPIFLASH的指定地址写数据的时候,首先要选中该芯片,然后透过SPI接口向控制和状态寄存器中写写使能指令,接着通过SPI接口接收或发送数据。
当执行一个操作后,可以通过BUSY的状态判断SPIFLASH是否完成了这个操作。
例如,擦除整个芯片是个非常费时的操作,可以间隔一段时间读取BUSY位的状态来判断是否擦除完成。
三.实验内容
1.编写SPI驱动程序
2.初始化SPI接口
3.读取SPIFLASH的ID,如果正确继续,否则报错
4.向SPIFALSH地址0x12AB00开始写一串字符,再读出比较判断是否与写入的一致
5.向SPIFALSH地址0x12AB00开始写连续256个字节的0x5A,然后读出并发送给串口,通过串口调试助手判别是否读到的都是0x5A.
实验原理根据教材。
四.实验设备
硬件部分:
PC计算机(宿主机)、亮点STM32实验板、JLINK。
软件部分:
PC机WINDOWS系统、MDKKEIL软件、ISP软件、串口调试助手。
五.实验步骤
1参考SPI及SPIFLASH部分,编写SPI及SPIFLASH驱动程序。
2编写主程序
3编译代码,使用JLINK或ISP下载到实验板
4记录实验过程,撰写实验报告
实验七TF卡编程实验
一.实验简介
编程实现通过SPI接口对TF卡进行读写操作。
二.实验目的及原理
巩固SPI编程,学会对的TF卡读写操作。
原理:
详细内容参考教材《基于STM32的嵌入式系统原理与设计》
TF卡即MicroSD卡,其体积比SD卡更小,目前广泛应用在嵌入式领域,具有体积小、速度快、存储容量大的优点。
最典型的应用是手机,通过TF卡来扩展存储容量。
目前市面上的TF卡容量大都在8G以上的。
在第二章,设计了TF卡的接口,将TF卡插入板子上的TF卡插槽,即可对其进行编程操作。
TF卡可以采用SPI接口,本实验的内容是编写程序实现使用SPI接口对TF卡进行编程。
将卡的重要操作的流程列出如下:
1.卡的初始化流程:
1)初始化SPI,将SPI设置为低速模式。
2)发送至少74个周期的脉冲给TF卡。
因主机上电后,所有SD卡进入Idle状态。
至少74个时钟周期后才能开始总线传输。
3)设置CS为低,发送命令CMD0,直到得到0X01的响应信息,一直得不到则返回错误信息。
4)发送CMD8,获取电压信息,查看是否为2.7到3.3,如不是则错误,返回错误信息。
5)发送CMD55,然后发送ACMD41,进行初始化。
若超时了仍不成功则返回错误信息,否则返回0。
2.读卡流程
读单块流程为
1)发送CMD17,收到0x00表示成功
2)连续读直到读到开始字节0xFE
3)读512个字节
4)读两个CRC伪CRC字节(0xFF)
读多块方法:
1)发送CMD18读,收到0x00表示成功
2)连续读直到读到开始字节0xFE
3)读512字节
4)读两个CRC字节
5)如果还想读下一扇区,重复2-4
6)发送CMD12来停止读多块操作
3.写卡流程
写单块方法:
1)发送CMD24,收到0x00表示成功
2)发送时钟,直到收到0xFF
3).发送写单块开始字节0xFE