基于STM32Cube的嵌入式系统应用 课件 第9章 STM32 SPI控制器_第1页
基于STM32Cube的嵌入式系统应用 课件 第9章 STM32 SPI控制器_第2页
基于STM32Cube的嵌入式系统应用 课件 第9章 STM32 SPI控制器_第3页
基于STM32Cube的嵌入式系统应用 课件 第9章 STM32 SPI控制器_第4页
基于STM32Cube的嵌入式系统应用 课件 第9章 STM32 SPI控制器_第5页
已阅读5页,还剩67页未读, 继续免费阅读

下载本文档

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

文档简介

第9章STM32SPI控制器本章讲述了STM32SPI控制器,包括STM32的SPI通信原理、STM32F407SPI串行总线的工作原理、SPI的HAL驱动程序、采用STM32Cube和HAL库的SPI应用实例。9.1STM32的SPI通信原理实际生产生活当中,有些系统的功能无法完全通过STM32的片上外设来实现。例如,16位及以上的A/D转换器、温/湿度传感器、大容量EEPROM或Flash、大功率电机驱动芯片、无线通信控制芯片等。此时,只能通过扩展特定功能的芯片来实现这些功能。另外,有的系统需要两个或者两个以上的主控器(STM32或FPGA),而这些主控器之间也需要通过适当的芯片间通信方式来实现通信。常见的系统内通信方式有并行和串行两种。并行方式指同一个时刻,在嵌入式处理器和外围芯片之间传递数据有多位;串行方式则是指每个时刻传递的数据只有一位,需要通过多次传递才能完成一字节的传输。9.1.1SPI串行总线概述串行外设接口(SerialPeripheralInterface,SPI)是由美国摩托罗拉(Motorola)公司提出的一种高速全双工串行同步通信接口,首先出现在M68HC系列处理器中,由于其简单方便,成本低廉,传输速度快,因此被其他半导体厂商广泛使用,从而成为事实上的标准。SPI与USART相比,其数据传输速度要快得多,因此它被广泛地应用于微控制器与ADC、LCD等设备的通信,尤其是高速通信的场合。微控制器还可以通过SPI组成一个小型同步网络进行高速数据交换,完成较复杂的工作。作为全双工同步串行通信接口,SPI采用主/从模式(master/slave),支持一个或多个从设备,能够实现主设备和从设备之间的高速数据通信。SPI具有硬件简单、成本低廉、易于使用、传输数据速度快等优点,使用于成本敏感或者高速通信的场合。SPI也存在无法检查纠错、不具备寻址能力和接收方没有应答信号等缺点,不适合复杂或者可靠性要求较高的场合。SPI是同步全双工串行通信接口。SPI在物理层体现为4条信号线,分别是SCK、MOSI、MISO和SS。(1)SCK(SerialClock),即时钟线,由主设备产生。不同的设备支持的时钟频率不同。(2)MOSI(MasterOutputSlaveInput),即主设备数据输出/从设备数据输入线。(3)MISO(MasterInputSlaveOutput),即主设备数据输入/从设备数据输出线。。(4)SS(SlaveSelect),有时候也叫CS(ChipSelect),SPI从设备选择信号线,当有多个SPI从设备与SPI主设备相连(即一主多从)时,SS用来选择激活指定的从设备,由SPI主设备(通常是微控制器)驱动,低电平有效。当只有一个SPI从设备与SPI主设备相连(即一主一从)时,SS并不是必需的。因此,SPI也被称为三线同步通信接口。除了SCK、MOSI、MISO和SS这4条信号线外,SPI接口还包含一个串行移位寄存器,如图9-1所示。图9-1SPI接口组成9.1.2SPI串行总线互连方式SPI互连主要有一主一从和一主多从两种互连方式。1. 一主一从在一主一从的SPI互连方式下,只有一个SPI主设备和一个SPI从设备进行通信。这种情况下,只需要分别将主设备的SCK、MOSI、MISO和从设备的SCK、MOSI、MISO直接相连,并将主设备的SS置为高电平,从设备的SS接地(置为低电平,片选有效,选中该从设备)即可,如图9-2所示。图9-2一主一从的SPI互连2. 一主多从在一主多从的SPI互连方式下,一个SPI主设备可以和多个SPI从设备相互通信。这种情况下,所有的SPI设备(包括主设备和从设备)共享时钟线和数据线,即SCK、MOSI、MISO这3条线,并在主设备端使用多个GPIO引脚来选择不同的SPI从设备,如图9-3所示。图9-3一主多从的SPI互连串行外设接口(SPI)允许芯片与外部设备以半/全双工、同步、串行方式通信。此接口可以被配置成主模式,并为外部从设备提供通信时钟(SCK),接口还能以多主的配置方式工作。它可用于多种用途,包括使用一条双向数据线的双线单工同步传输,还可使用CRC校验的可靠通信。9.2STM32F4SPI串行总线的工作原理9.2.1SPI串行总线的特征STM32F407微控制器的小容量产品有1个SPI接口,中等容量产品有2个SPI,大容量产品则有3个SPI。STM32F407微控制器SPI主要具有以下特征:(1)3线全双工同步传输。(2)带或不带第三根双向数据线的双线单工同步传输。(3)8或16位传输帧格式选择。(4)主或从操作。(5)支持多主模式。(6)8个主模式波特率预分频系数(最大为fPCLK/2)。(7)从模式频率(最大为fPCLK/2)。(8)主模式和从模式的快速通信。(9)主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变。(10)可编程的时钟极性和相位。(11)可编程的数据顺序,MSB在前或LSB在前。(12)可触发中断的专用发送和接收标志。(13)SPI总线忙状态标志。(14)支持可靠通信的硬件CRC。在发送模式下,CRC值可以被作为最后一个字节发送;在全双工模式下,对接收到的最后一个字节自动进行CRC校验。(15)可触发中断的主模式故障、过载以及CRC错误标志。(16)支持DMA功能的1字节发送和接收缓冲器,产生发送和接受请求。9.2.2SPI串行总线的内部结构STM32F407微控制器SPI主要由波特率发生器、收发控制和数据存储转移三部分组成,内部结构如图9-4所示。波特率发生器用来产生SPI的SCK时钟信号,收发控制主要由控制寄存器组成,数据存储转移主要由移位寄存器、接收缓冲区和发送缓冲区等构成。图9-4STM32F407微控制器SPI内部结构图STM32系列微控制器SPI的功能主要由波特率控制、收发控制和数据存储转移3部分构成。1. 波特率控制波特率发生器可产生SPI的SCK时钟信号。波特率预分频系数为2、4、8、16、32、64、128或256。通过设置波特率控制位(BR)可以控制SCK的输出频率,从而控制SPI的传输速率。2. 收发控制收发控制由若干个控制寄存器组成,如SPI控制寄存器SPI_CR1、SPI_CR2和SPI状态寄存器SPI_SR等。3. 数据存储转移数据存储转移如图9-4的左上部分所示,主要由移位寄存器、接收缓冲区和发送缓冲区等构成。9.2.3SPI串行总线时钟信号的相位和极性SPI_CR寄存器的CPOL和CPHA位,能够组合成四种可能的时序关系。CPOL(时钟极性)位控制在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。如果CPOL被清0,SCK引脚在空闲状态保持低电平;如果CPOL被置1,SCK引脚在空闲状态保持高电平。如图9-5所示,如果CPHA(时钟相位)位被清0,数据在SCK时钟的奇数(第1、3、5个···)跳变沿(CPOL位为0时就是上升沿,CPOL位为1时就是下降沿)进行数据位的存取,数据在SCK时钟偶数(第2、4、6个···)跳变沿(CPOL位为0时就是下降沿,CPOL位为1时就是上升沿)准备就绪。图9-5CPHA=0时SPI时序图如图9-6所示,如果CPHA(时钟相位)位被置1,数据在SCK时钟的偶数(第2、4、6个···)跳变沿(CPOL位为0时就是下降沿,CPOL位为1时就是上升沿)进行数据位的存取,数据在SCK时钟奇数(第1、3、5个···)跳变沿(CPOL位为0时就是上升沿,CPOL位为1时就是下降沿)准备就绪。图9-6CPHA=1时SPI时序图9.2.4STM32的SPI接口配置1.配置SPI为从模式在从模式下,SCK引脚用于接收从主设备来的串行时钟。SPI_CR1寄存器中BR[2:0]的设置不影响数据传输速率。SPI从模式的配置步骤如下,(1)设置DFF位以定义数据帧格式为8位或16位。(2)选择CPOL和CPHA位来定义数据传输和串行时钟之间的相位关系。为保证正确的数据传输,从设备和主设备的CPOL和CPHA位必须配置成相同的方式。(3)帧格式(SPI_CR1寄存器中的LSBFIRST位定义的“最高位在前”还是“最低位在前”)必须与主设备相同。(4)在NSS引脚管理硬件模式下,在数据帧传输过程中,NSS引脚必须为低电平。在NSS软件模式下,设置SPI_CR1寄存器中的SSM位并清除SSI位。(5)在SPI_CR1寄存器中,清除MSTR位,设置SPE位,使相应引脚工作于SPI模式下。2. 配置SPI为主模式在主模式时,MOSI引脚是数据输出,而MISO引脚是数据输入,在SCK引脚产生串行时钟。SPI主模式的配置步骤如下:(1)通过SPI_CR1寄存器的BR[2:0]位定义串行时钟波特率。(2)选择CPOL和CPHA位,定义数据传输和串行时钟间的相位关系。(3)设置DFF位来定义8位或16位数据帧格式。(4)配置SPI_CR1寄存器的LSBFIRST位定义帧格式。(5)如果需要NSS引脚工作在输入模式,在硬件模式下,在整个数据帧传输期间应把NSS引脚连接到高电平;在软件模式下,需设置SPI_CR1寄存器的SSM位和SSI位。如果NSS引脚工作在输出模式,则只需设置SSOE位。(6)必须设置MSTR位和SPE位(只当NSS引脚被连到高电平,这些位才能保持置位)。3. 配置SPI为单工通信SPI模块能够以两种配置工作于单工方式:1条时钟线和1条双向数据线;1条时钟线和1条数据线(只接收或只发送)。(1)1条时钟线和1条双向单向数据线(BIDIMODE=1)通过设置SPI_CR1寄存器中的BIDIMODE位启用此模式。在这个模式下,SCK引脚作为时钟,主设备使用MOSI引脚而从设备使用MISO引脚作为数据通信。传输的方向由SPI_CR1寄存器里的BIDIOE控制,当这个位是1的时候,数据线是输出,否则是输入。(2)1条时钟和1条单向数据线(BIDIDIMODE=0)在这个模式下,SPI模块可以或者作为只发送,或者作为只接收。9.2.5STM32的SPI接口数据发送与接收过程1.接收与发送缓冲器接收时,接收到的数据被存放在接收缓冲器中;发送时,在数据被发送之前,首先被存放在发送缓冲器中。读SPIDR寄存器将返回接收缓冲器的内容;写入SPI_DR寄存器的数据将被写入发送缓冲器中。2.主模式下的数据传输(1)全双工模式(BIDIMODEE=0并且RXONLY=0)(2)单向的只接收模式(BIDIMODE并且RRXONLY=1)(3)双向模式,发送时(BIDIMODE并且BIIDIOE=1)(4)双向模式,接收时(BIDIMODE=1并且BIDIOE=0)3.从模式下的数据传输(1)全双工模式(BIDIMODE并且RXONLY=0)(2)单向的只接收模式(BIDIMODE=0并且RXONLY=1)(3)双向模式发送时(BIDIMODE=1并且BIDIOE=1)(4)双向模式接收时(BIDIMODE=并且BIDIOE=0)4.处理数据的发送与接收当数据从发送缓冲器传送到移位寄存器时,TXE标志置位(发送缓冲器空),表示发送缓冲器可以接收下一个数据;如果在SPI_CR2寄存器中设置了TXEIE位,则此时会产生中断;写入数据到SPI_DR寄存器即可清除TXE位。9.3.1SPI寄存器操作的宏函数SPI的驱动程序头文件是stm32f4xx_hal_spi.h。SPI寄存器操作的宏函数如表9-1所示。宏函数中的参数_HANDLE是具体某个SPI接口的对象指针,参数_INTERRUPT是SPI的中断事件类型,参数_FLAG_是事件中断标志。9.3SPI的HAL驱动程序宏函数功能描述HAL_SPI_DISABLE(_HANDLE_)禁用某个SPI接口HAL_SPI_ENABLE(_HANDLE_)启用某个SPI接口_HAL_SPI_DISABLE_IT(_HANDLE_,_INTERRUPT_)禁止某个中断事件源,不允许事件产生硬件中断_HAL_SPI_ENABLE_IT(HANDLE_,_INTERRUPT_)开启某个中断事件源,允许事件产生硬件中断_HAL_SPI_GET_IT_SOURCE(_HANDLE_,INTERRUPT_)检查某个中断事件源是否被允许产生硬件中断_HAL_SPI_GET_FLAG(_HANDLE_,_FLAG_)获取某个事件的中断标志,检查事件是否发生_HAL_SPI_CLEAR_CRCERRFLAG(_HANDLE_)清除CRC校验错误中断标志_HAL_SPI_CLEAR_FREFLAG(_HANDLE_)清除TI帧格式错误中断标志_HAL_SPI_CLEAR_MODFFLAG(_HANDLE_)清除主模式故障中断标志_HAL_SPI_CLEAR_OVRFLAG(_HANDLE_)清除溢出错误中断标志表9-1SPI寄存器操作的宏函数STM32CubeMX自动生成的文件spi.c会定义表示具体SPI接口的外设对象变量。例如,使用SPI1时,会定义如下的外设对象变量hspil,宏函数中的参数_HANDLE_就可以使用&hspil。SPI_HandleTypeDefhspil;//表示SPI1的外设对象变量在SPI的HAL驱动程序中,定义了6个表示事件中断标志位的宏,可作为宏函数中参数FLAG_的取值;定义了3个表示中断事件类型的宏,可作为宏函数中参数_INTERRUPT的取值。这些宏定义符号如表9-2所示。中断事件SPI状态寄存器SPI_SR中的断标志位表示事件中断标志位的宏SPI控制寄存器SPI_CR2中的中断事件使能控制位表示中断事件使能位的宏(用于表示中断事件类型)发送缓冲区为空TXESPI_FLAG_TXETXEIESPI_IT_TXE接收缓冲区非空RXNESPI_FLAG_RXNEEXNEIESPI_IT_RXNE主模式故障MODFSPI_FLAG_MODFERRIESPI_IT_ERR溢出错误OVRSPI_FLAG_OVRCRC校验错误CRCERRSPI_FLAG_CRCERRTI帧格式错误FRESPI_FLAG_FRE表9-2SPI的中断事件和宏定义9.3.2SPI初始化和阻塞式数据传输SPI接口初始化、状态查询和阻塞式数据传输的函数列表如表9-3所示。函数名功能描述HAL_SPI_Init()SPI初始化,配置SPI接口参数HAL_SPI_MspInit()SPI的MSP初始化函数,重新实现时一般用于SPI接口引脚GPIO初始化和中断设置HAL_SPI_GetState()返回SPI接口当前状态,返回值是枚举类型HAL_SPI_StateTypeDefHAL_SPI_GetError()返回SPI接口最后的错误码,错误码有一组宏定义HAL_SPI_Transmit()阻塞式发送一个缓冲区的数据HAL_SPI_Receive()阻塞式接收指定长度的数据保存到缓冲区HAL_SPI_TransmitReceive()阻塞式同时发送和接收一定长度的数据表9-3SPI初始化和阻塞式数据传输相关函数1. SPI接口初始化函数HAL_SPI_Init()用于具体某个SPI接口的初始化,其原型定义如下:HAL_StatusTypeDefHAL_SPI_Init(SPI_HandleTypeDef*hspi)2. 阻塞式数据发送和接收SPI是一种主/从通信方式,通信完全由SPI主机控制,因为SPI主机控制了时钟信号SCK。函数HAL_SPI_Transmit()用于发送数据,其原型定义如下:HAL_StatusTypeDefHAL_SPI_Transmit(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tsize,uint32_tTimeout);

3. 阻塞式同时发送与接收数据虽然SPI通信一般采用应答式,MISO和MOSI两根线不同时传输有效数据。在原理上,它们是可以在SCK时钟信号作用下同时传输有效数据的。函数HAL_SPI_TransmitReceive()就实现了接收和发送同时操作的功能,其原型定义如下:HAL_StatusTypeDefHAL_SPI_TransmitReceive(SPI_HandleTypeDef*hspi,uint8_t*pTxData,uint8_t*pRxData,uint16_tSize,uint32_tTimeout)9.3.3SPI中断方式数据传输SPI接口能以中断方式传输数据,是非阻塞式数据传输。中断方式数据传输的相关函数、产生的中断事件类型、对应的回调函数等如表9-4所示。中断事件类型用中断事件使能控制位的宏定义表示。图1-3带操作系统的嵌入式软件的体系结构构函数名函数功能产生的中断事件类型对应的回调函数HAL_SPI_Transmit_IT()中断方式发送一个缓冲区的数据SPI_IT_TXEHAL_SPI_TxCpltCallback()HAL_SPI_Receive_IT()中断方式接收指定长度的数据保存到缓冲区SPI_IT_RXNEHAL_SPI_RxCpltCallback()HAL_SPI_TransmitReceive_IT()中断方式发送和接收一定长度的数据SPI_IT_TXE和SPI_IT_RXNEHAL_SPI_TxRxCpltCallback()前3个DMA方式传输函数前3个中断模式传输函数都可能产生

SPI_IT_ERR中断事件SPI_IT_ERRHAL_SPI_ErrorCallback()HAL_SPI_IRQHandler()SPI中断ISR里调用的通用处理函数——HAL_SPI_Abort()取消非阻塞式数据传输,本函数以阻塞模式运行——HAL_SPI_Abort_IT()取消非阻塞式数据传输,本函数以中断模式运行—HAL_SPI_AbortCpltCallback()表9-4SPI中断方式数据传输相关函数函数HAL_SPI_Transmit_IT()用于发送一个缓冲区的数据,发送完成后,会产生发送完成中断事件(SPI_IT_TXE),对应的回调函数是HAL_SPI_TxCpltCallback()。函数HAL_SPI_Receive_IT()用于接收指定长度的数据保存到缓冲区,接收完成后,会产生接收完成中断事件(SPI_IT_RXNE),对应的回调函数是HAL_SPI_RxCpltCallback()。函数HAL_SPI_TransmitReceive_IT()是发送和接收同时进行,由它启动的数据传输会产生SPI_IT_TXE和SPI_IT_RXNE中断事件,但是有专门的回调函数HAL_SPI_TxRxCpltCallback()。上述3个函数的原型定义如下:HAL_StatusTypeDefHAL_SPI_Transmit_IT(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize);HAL_StatusTypeDefHAL_SPI_Receive_IT(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize):HALStatusTypeDefHALSPITransmitReceive_IT(SPI_HandleTypeDef*hapi,uint8_t*pIxData,uint8_t*pRxData,uint16_tSize);9.3.4SPI的DMA方式数据传输SPI的发送和接收有各自的DMA请求,能以DMA方式进行数据发送和接收。DMA方式传输时触发DMA流的中断事件,主要是DMA传输完成中断事件。SPI的DMA方式数据传输的相关函数如表9-5所示。DMA方式功能函数函数功能DMA流中断事件对应的回调函数HAL_SPI_Transmit_DMA()DMA方式发送数据DMA传输完成HAL_SPI_TxCpltCallback()DMA传输半完成HAL_SPI_TxHalfCpltCallback()HAL_SPI_Receive_DMA()DMA方式接收数据DMA传输完成HAL_SPI_TxCpltCallback()DMA传输半完成HAL_SPI_TxHalfCpltCallback()HAL_SPI_TransmitReceive_DMA()DMA方式发送/接收数据DMA传输完成HAL_SPI_TxRxCpltCallback()DMA传输半完成HAL_SPI_TxRxHalfCpltCallback()前3个DMA方式传输函数DMA传输错误中断事件DMA传输错误HAL_SPI_ErrorCallback()HAL_SPI_DMAPause()暂停DMA传输——HAL_SPI_DMAResume()继续DMA传输——HAL_SPI_DMAStop()停止DMA传输——表9-5SPI的DMA方式数据传输的相关函数启动DMA方式发送和接收数据的两个函数的原型分别定义如下:HAL_StatusTypeDefHAL_SPI_Transmit_DMA(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize);HAL_StatusTypeDefHAL_SPI_Receive_DMA(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize);Flash存储器又称闪存,它与EEPROM都是掉电后数据不丢失的存储器,但Flash存储器容量普遍大于EEPROM,现在基本取代了它的地位。我们生活中常用的U盘、SD卡、SSD固态硬盘以及STM32芯片内部用于存储程序的设备,都是Flash类型的存储器。本节以一种使用SPI通信的串行Flash存储芯片W25Q128的读写为例,讲述STM32的SPI使用方法。实例中STM32的SPI外设采用主模式,通过查询事件的方式来确保正常通信。9.4采用STM32Cube和HAL库的SPI应用实例9.4.1STM32的SPI配置流程使用STM32的SPI2的主模式,下面讲述SPI2部分的设置步骤。SPI相关的库函数和定义分布在文件stm32f4xx_hal_spi.c以及头文件stm32f4xx_hal_spi.h中。STM32的主模式配置步骤如下:(1)配置相关引脚的复用功能,使能SPI2时钟。如果要用SPI2,第一步就要使能SPI2的时钟,SPI2的时钟通过APB1ENR的第14位来设置。其次要设置SPI2的相关引脚为复用输出,这样才会连接到SPI2上否则这些IO口还是默认的状态,也就是标准输入输出口。这里使用的是PB13、PB14、PB15这3个(SCK、MISO、MOSI,CS使用软件管理方式),所以设置这三个为复用功能IO。使能SPI2时钟的方法为:__HAL_RCC_SPI2_CLK_ENABLE(); //使能SPI2时钟复用PB13、PB14和PB15为SPI2引脚通过HAL_GPIO_Init函数实现,代码如下:GPIO_Initure.Pin=GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //快速(2)设置SPI2工作模式。 这一步全部是通过SPI2_CR1来设置,设置SPI2为主机模式,设置数据格式为8位,然后通过CPOL和CPHA位来设置SCK时钟极性及采样方式。并设置SPI2的时钟频率(最大18Mhz),以及数据的格式(MSB在前还是LSB在前)。在HAL库中初始化SPI的函数为:HAL_StatusTypeDefHAL_SPI_Init(SPI_HandleTypeDef*hspi);(3)使能SPI2。这一步通过SPI2_CR1的bit6来设置,以启动SPI2,在启动之后,就可以开始SPI通信了。库函数使能SPI1的方法为:HAL_SPI_ENABLE(&SPI2_Handler);//使能SPI2(4)SPI传输数据。通信接口当然需要有发送数据和接受数据的函数,HAL库提供的发送数据函数原型为:HAL_StatusTypeDefHAL_SPI_Transmit(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize,uint32_tTimeout);这个函数很好理解,往SPIx数据寄存器写入数据Data,从而实现发送。(5)设置SPI传输速度。SPI初始化结构体SPI_InitTypeDef有一个成员变量是BaudRatePrescaler,该成员变量用来设置SPI的预分频系数,从而决定了SPI的传输速度。9.4.2SPI与Flash存储器接口的硬件设计W25Q128SPI串行Flash硬件连接图如图9-7所示。图9-7W25Q128SPI串行Flash接口电路图本开发板中的Flash芯片(W25Q128)是一种使用SPI通信协议的NORFlash存储器,它的CS/CLK/DIO/DO引脚分别连接到STM32对应的SPI引脚NSS、SCK、MOSI、MISO上,其中STM32的NSS引脚是一个普通的GPIO,不是SPI的专用NSS引脚,所以程序中要使用软件控制的方式。本实例通过KEY1按键来控制NORFlash的写入,通过按键KEY0来控制NORFlash的读取。并在LCD模块上显示相关信息。还可以通过USMART控制读取NORFlash的ID、擦除某个扇区或整片擦除。DS0闪烁用于提示程序正在运行。在硬件上,LCD模块与开发板的IO口对应关系如下:LCD_BL(背光控制)对应PB15;LCD_CS对应PG12即FSMC_NE4;LCD_RS对应PF12即FSMC_A6;LCD_WR对应PD5即FSMC_NWE;LCD_RD对应PD4即FSMC_NOE;LCD_D[15:0]则直接连接在FSMC_D15~FSMC_D0;9.4.3SPI与Flash存储器接口的软件设计SPI_InitTypeDef结构体成员用于设置SPI工作参数,并由外设初始化配置函数,比如MX_SPI1_Init()调用,这些设定参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。初始化结构体定义在stm32f4xx_hal_spi.h文件中,初始化库函数定义在stm32f4xx_hal_spi.c文件中,编程时可以结合这两个文件内注释使用。SPI_InitTypeDef结构体如下。typedefstruct{uint32_tMode;/*设置SPI的主/从机端模式*/uint32_tDirection;/*设置SPI的单双向模式*/uint32_tDataSize;/*设置SPI的数据帧长度,可选8/16位*/uint32_tCLKPolarity;/*设置时钟极性CPOL,可选高/低电平*/uint32_tCLKPhase;/*设置时钟相位,可选奇/偶数边沿采样*/uint32_tNSS;/*设置NSS引脚由SPI硬件控制还是软件控制*/uint32_tBaudRatePrescaler;/*设置时钟分频因子,fpclk/分频数=fSCK*/uint32_tFirstBit;/*设置MSB/LSB先行*/uint32_tTIMode;/*指定是否启用TI模式*/uint32_tCRCCalculation;/*指定是否启用CRC计算*/uint32_tCRCPolynomial;/*设置CRC校验的表达式*/}SPI_InitTypeDef;1.通过STM32CubeMX新建工程通过STM32CubeMX新建工程的步骤如下:(1)新建文件夹Demo目录下新建文件夹SPI,这是保存本章新建工程的文件夹。(2)新建STM32CubeMX工程在STM32CubeMX开发环境中新建工程。(3)选择MCU或开发板CommercialPartNumber和MCUs/MPUsList选择STM32F407ZGT6,选择StartProject启动工程。(4)保存STM32CubeMX工程使用STM32CubeMX菜单File→SaveProject,保存工程。(5)生成报告使用STM32CubeMX菜单File→GenerateReport生成当前工程的报告文件。(6)配置MCU时钟树STM32CubeMXPinout&Configuration子页面下,选择SystemCore→RCC,HighSpeedClock(HSE)根据开发板实际情况,选择Crystal/CeramicResonator(晶体/陶瓷晶振)。STM32CubeMX切换到ClockConfiguration子页面下,根据开发板外设情况配置总线时钟。此处配置Inputfrequency为8MHz,PLLSourceMux为HSE,分频系数/M为8,PLLMul倍频为336MHz,PLLCLK分频/2后为168MHz,SystemClockMux为PLLCLK,APB1Prescaler为/4,APB2Prescaler为/2,其余默认设置即可。(7)配置MCU外设根据LED、KEY、LCD和SPI1电路,整理出MCU连接的GPIO引脚的输入/输出配置。配置完成后的GPIO端口页面如图9-8所示。图9-8配置完成后的GPIO端口页面在STM32CubeMX中配置完SPI1和USART1后,会自动完成相关GPIO口的配置,不需用户配置。配置完成后的SPI1GPIO端口页面如图9-9所示。图9-9配置完成后的SPI1GPIO端口页面STM32CubeMXPinout&Configuration子页面下选择Connectivity→USART1,对USART1进行设置。Mode选择Asynchronous,HardwareFlowControl(RS232)选择Disable,ParameterSettings具体配置如图9-10所示。图9-10USART1配置页面STM32CubeMXPinout&Configuration子页面下选择Connectivity→SPI1,对SPI1进行设置。Mode为Full-DuplexMaster,具体配置如图9-11所示。图9-11SPI1配置页面STM32CubeMXPinout&Configuration子页面下选择Timers→TIM4,对TIM4进行设置。ClockSource选择InternalClock,具体配置如图9-12所示。图9-12TIM4配置页面STM32CubeMXPinout&Configuration子页面下选择Connectivity→FSMC,对FSMC模块进行设置。ChipSelect选择NE4,MemoryType选择LCDInterface,LCDRegisterSelect选择A6,Data选择16bits,具体配置如图9-13所示。图9-13FSMC配置页面切换到STM32CubeMXPinout&Configuration子页面下选择SystemCore→NVIC,修改PriorityGroup为2bitsforpre-emptionpriority(2位抢占优先级),Enabled栏勾选TIM4globalinterrupt和USART1globalinterrupt,修改TIM4globalinterrupt、USART1globalinterrupt的PreemptionPriority(抢占优先级)和SubPriority(子优先级)如图9-14所示。图9-14NVIC配置页面CodeGeneration页面Selectforinitsequenceordering栏勾选TIM4globali

温馨提示

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

评论

0/150

提交评论