STM32—cubeMX+HAL库的SPI接口使用

发布者:BlossomSunrise最新更新时间:2019-02-12 来源: eefocus关键字:STM32  cubeMX  HAL库  SPI接口 手机看文章 扫描二维码
随时随地手机看文章

摘要:

 本文主要介绍STM32的SPI接口、cubeMX软件配置SPI接口和分析SPI相关代码。


STM32之SPI简介:

(1)SPI协议【Serial Peripheral Interface】

   串行外围设备接口,是一种高速全双工的通信总线。主要用在MCU与FLASH\ADC\LCD等模块之间的通信。


(2)SPI信号线

       SPI 共包含 4 条总线。


SS(Slave Select):片选信号线,当有多个SPI 设备与 MCU 相连时,每个设备的这个片选信号线是与 MCU 单独的引脚相连的,而其他的 SCK、MOSI、MISO 线则为多个设备并联到相同的 SPI 总线上,低电平有效。


SCK (Serial Clock):时钟信号线,由主通信设备产生,不同的设备支持的时钟频率不一样,如 STM32 的 SPI 时钟频率最大为 f PCLK /2。


MOSI (Master Output Slave Input):主设备输出 / 从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入数据,即这条线上数据的方向为主机到从机。


MISO(Master Input Slave Output):主设备输入 / 从设备输出引脚。主机从这条信号线读入数据,从机的数据则由这条信号线输出,即在这条线上数据的方向为从机到主机。


下图是主器件与多个从器件通信图。其中SCK,MOSI,MISO是接在一起的,NSS分别接到不同的IO管脚控制。主器件要和从器件通信就先拉低对应从器件的NSS管脚使能。默认状态IO1,IO2,IO3全为高电平,当主器件和从器件1通信时,拉低IO1管脚使能从器件1。而从器件2,3不使能,不作响应。



(3)SPI特性

 

单次传输可选择为 8 或 16 位。


波特率预分频系数(最大为 fPCLK/2) 。


时钟极性(CPOL)和相位(CPHA)可编程设置。


数据顺序的传输顺序可进行编程选择,MSB 在前或 LSB 在前。


注:MSB(Most Significant Bit)是“最高有效位”,LSB(Least Significant Bit)是“最低有效位”。


可触发中断的专用发送和接收标志。


可以使用 DMA 进行数据传输操作。


   下图是STM32的SPI框架图。



如上图,MISO数据线接收到的信号经移位寄存器处理后把数据转移到接收缓冲区,然后这个数据就可以由我们的软件从接收缓冲区读出了。


当要发送数据时,我们把数据写入发送缓冲区,硬件将会把它用移位寄存器处理后输出到 MOSI数据线。


SCK 的时钟信号则由波特率发生器产生,我们可以通过波特率控制位(BR)来控制它输出的波特率。


控制寄存器 CR1掌管着主控制电路,STM32的 SPI模块的协议设置(时钟极性、相位等)就是由它来制定的。而控制寄存器 CR2则用于设置各种中断使能。


最后为 NSS引脚,这个引脚扮演着 SPI协议中的SS片选信号线的角色,如果我们把 NSS引脚配置为硬件自动控制,SPI模块能够自动判别它能否成为 SPI的主机,或自动进入 SPI从机模式。但实际上我们用得更多的是由软件控制某些 GPIO引脚单独作为SS信号,这个 GPIO引脚可以随便选择。


(4)SPI时钟时序


根据时钟极性(CPOL)及相位(CPHA)不同,SPI有四种工作模式。


时钟极性(CPOL)定义了时钟空闲状态电平:


    CPOL=0为时钟空闲时为低电平


    CPOL=1为时钟空闲时为高电平


时钟相位(CPHA)定义数据的采集时间。


    CPHA=0:在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。


    CPHA=1:在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。



cubeMX软件配置SPI:

下面继续介绍cubeMX软件配置STM32L152的SPI接口方法。


(1)打开软件,选择对应芯片后,配置好时钟源;


(2)勾选SPI1为全双工,硬件NSS关闭,如下图:



(3)勾选好后,PA5、PA6、PA7如下图,在配置PA4为普通io口,gpio_output



(4)SPI1的参数配置选择默认,如下图所示



(5)生成代码,保存即可。


HAL库的SPI函数分析:

下面具体分析下生成的SPI函数和函数调用。


SPI_HandleTypeDef hspi1; //SPI结构体类定义,下面看其结构体内部的声明。


 


下面分析SPI的初始化函数:


void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)

{

 

 

  GPIO_InitTypeDef GPIO_InitStruct;

  if(hspi->Instance==SPI1)

  {

  /* USER CODE BEGIN SPI1_MspInit 0 */

  /* USER CODE END SPI1_MspInit 0 */

    /* Peripheral clock enable */

    __HAL_RCC_SPI1_CLK_ENABLE();//使能SPI1时钟

  

    /**SPI1 GPIO Configuration    

    PA5     ------> SPI1_SCK

    PA6     ------> SPI1_MISO

    PA7     ------> SPI1_MOSI 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);//配置SPI的数据线和时钟线

  /* USER CODE BEGIN SPI1_MspInit 1 */

  /* USER CODE END SPI1_MspInit 1 */

  }

 

static void MX_SPI1_Init(void)

{

  hspi1.Instance = SPI1;

  hspi1.Init.Mode = SPI_MODE_MASTER;//主模式

  hspi1.Init.Direction = SPI_DIRECTION_2LINES;//全双工

  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;//数据位为8位

  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;//CPOL=0,low

  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;//CPHA为数据线的第一个变化沿

  hspi1.Init.NSS = SPI_NSS_SOFT;//软件控制NSS

  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//2分频,32M/2=16MHz

  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;//最高位先发送

  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;//TIMODE模式关闭

  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//CRC关闭

  hspi1.Init.CRCPolynomial = 10;//默认值,无效

  if (HAL_SPI_Init(&hspi1) != HAL_OK)//初始化

  {

    _Error_Handler(__FILE__, __LINE__);

  }

}



利用SPI接口发送和接收数据主要调用以下两个函数:


HAL_StatusTypeDef  HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//发送数据

HAL_StatusTypeDef  HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//接收数据

 


关键字:STM32  cubeMX  HAL库  SPI接口 引用地址:STM32—cubeMX+HAL库的SPI接口使用

上一篇:STM32中time.h文件详解
下一篇:STM32—进入STOP模式后功耗下不去问题

推荐阅读最新更新时间:2024-03-16 16:23

STM32串行通讯采用中断方式发送,接收
近期发现很多人都不愿意用中断方式,来使用STM32的串口。说是问题多。但自己测试了,中断没有任何问题。无论接收和发送。 我贴出源程序。 注意一点是:USART_ITConfig(USART3, USART_IT_TXE, ENABLE); 这个函数一旦执行,就会启动一次中断,正是这个原因,许多人想尽方法去避免空发送,但实际上这是设计者的智慧所在。用空中断启动发送!无需在执行:SART_SendData(USART3, UART3_Buf.SendBuf ); //启动发送! 一旦启动了中断,就在中断程序里继续发送。 发送初始化程序:将要发送的数据准备好,放在一个BUF里: COM3_EN(SEND_EN)
[单片机]
stm32定时器时钟源时钟选择,重点是外部时钟源1模式的理解
有意义的参考 TI与ITRX的区别参考:https://blog.csdn.net/gtkknd/article/details/39292517 解析参考:https://blog.csdn.net/qq_33559992/article/details/103728903?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2 基础了解 时钟选择计数器时钟可由下列时钟源提供:
[单片机]
<font color='red'>stm32</font>定时器时钟源时钟选择,重点是外部时钟源1模式的理解
STM32之调试支持(DBG)
STM32F10xxx使用Cortex™-M3内核,该内核内含硬件调试模块,支持复杂的调试操作。硬件调试模块允许内核在取指(指令断点)或访问数据(数据断点)时停止。内核停止时,内核的内部状态和系统的外部状态都是可以查询的。完成查询后,内核和外设可以被复原,程序将继续执行。 SWJ调试端口(serial wire and JTAG) STM32F10xxx内核集成了串行/JTAG调试接口(SWJ-DP)。这是标准的ARM CoreSight调试接口,包括JTAG-DP接口(5个引脚)和SW-DP接口(2个引脚)。 ● JTAG调试接口(JTAG-DP)为AHP-AP模块提供5针标准JTAG接口。 ● 串行调试接口(SW-DP)
[单片机]
<font color='red'>STM32</font>之调试支持(DBG)
STM32中断优先级和开关总中断
一,中断优先级: STM32(Cortex-M3)中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念 抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理
[单片机]
STM32_外部中断之按键控制点亮LED灯
/* 名称:STM32_外部中断之按键控制点亮LED灯 说明:对于STM32来说,其中断种类众多。(除了外部中断还有内部异常)其每个GPIO端口的引脚都可以作为外部中断的中断源。 对其的设置也比C51要复杂的多。对于具体的使用来说可以总结为以下步骤: 1.初始化作为外部中断源的GPIO口。和普通的GPIO的设置类似,不过由于是使用GPIO引脚作为中断源,所以还需要开启复用时钟。 2..配置中断控制器 NVIC。由于有很多的中断,所以STM32用NVIC来控制操作各种中断。配置NVIC主要是配置一些中断源,中断的优先级(包括抢占优先级和相应优先级)还有设置使能中断(类似于C51中开启总开关)。 3..配置中断线EXIT线,是
[单片机]
STM32总结之GPIO 常用库函数
配置相关函数 1.void GPIO_Init (GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct) 函数解释:GPIO的初始化函数,该函数的作用是对io进行初始化。 参数: (1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。 (2)GPIO_InitStruct,GPIO的初始化相关结构体。该结构体里的成员变量决定了我们具体的初始化参数。以下进行说明: GPIO_Pin:指定具体的io脚,如GPIO_Pin_0,GPIO_Pin_1这样的宏定义。 GPIO_Mode:指定GPIO的模式,有八种模式: GPIO_
[单片机]
STM32:keil的软件逻辑分析仪( logic analyzer)使用
在keil MDK中软件逻辑分析仪很强的功能,可以分析数字信号,模拟化的信号,CPU的总线(UART、IIC等一切有输出的管脚),提供调试函数机制,用于产生自定义的信号,如Sin,三角波、澡声信号等,这些都可以定义。   以keil里自带的stm32的CPU为例,对PWM波形跟踪观测,打开C:\Keil\ARM\Boards\Keil\MCBSTM32\PWM_2目录下的stm32的Dome,第一步:进行仿真配置,如图: 把开工程中的Abstract.txt文件有对工程的描述,PWM从PB0.8和PB0.9输出,稍后将它加入软件逻辑分析仪里。 The 'PWM' project is a simpl
[单片机]
<font color='red'>STM32</font>:keil的软件逻辑分析仪( logic analyzer)使用
STM32 RTC实时时钟(二)
上次实验完成了对实时时钟的基本功能——计时的实验,这次在计时的基础上对RTC的可编程闹钟的功能进行测试。 RTC 单元提供两个可编程闹钟,即闹钟 A 和闹钟 B。 可通过将 RTC_CR 寄存器中的 ALRAE 和 ALRBE 位置 1 来使能可编程闹钟功能。如果日历亚秒、秒、分钟、小时、日期或日分别与闹钟寄存器RTC_ALRMASSR/RTC_ALRMAR 和RTC_ALRMBSSR/RTC_ALRMBR 中编程的值相匹配,则 ALRAF 和 ALRBF 标志会被置为1。可通过 RTC_ALRMAR 和 RTC_ALRMBR 寄存器的 MSKx 位以及 RTC_ALRMASSR 和RTC_ALRMBSSR 寄
[单片机]
<font color='red'>STM32</font> RTC实时时钟(二)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved