STM32H723使用LL库驱动SPI时遇到的坑

事实上不止H723,起码我手上的H7B0也有类似的情况,可能全H7系列都是这种"特性"

使用cubemx配置好了外设,然后keil主函数里加上一句LL_SPI_Enable(SPIx)。一般情况下,SPI就可以正常收发了,但H7不一样,怎么往TXDR里面塞数据就是没输出,引脚一点波形也没有,看寄存器状态也不对,多塞几次状态寄存器就开始报错了。百度也没找到类似情况的解释,可能H7没什么人用LL库开发。经过排查,发现是H7的SPIx->CR1中有一个Communication Start控制位,只有这个位置1才能进行发送,也在驱动库里多了一个对应的函数LL_SPI_StartMasterTransfer(SPIx)。就这么一个小小的改动,让我折腾了许久。不是很能理解,有了Enable还加这么个二级开关意欲何为,即便是考虑到fifo啥的高级应用,可我根本没用FIFO啊,不应该默认使能吗。

可能有的人要说,上面怎么算坑了,明明是你技术不行,H7一直都这样。确实我H7用得少,也看不来冗长的参考手册。但下面要说的这个一定是坑。STM32H723的LL_SPI_SetDataWidth()函数,并不能在硬件层面限制数据宽度,但在某些情况下又必须得配置。如能

在使用LL_SPI_SetDataWidth把SPI配置为8bit后,如果给SPI->TXDR直接赋值一个任意位的常数,单片机都会以32bit去发送,如果要限定8bit或者16bit发送,需要调用LL_SPI_TransmitData16/LL_SPI_TransmitData8,或者使用强制类型转换标注需要发送的数据是多少bit。如果单片机不知道数据是多少宽度的,全部会以32bit发送。非常智能,但非常奇怪,那么LL_SPI_SetDataWidth这个函数意义何在呢,如果发送的数据宽度是以实际数据为主,那为何还要配置SPI?

在使用DMA发送的时候,只是从DMA这边配置发送端和接收端的宽度还不行,DMA实际搬运的时候会受到LL_SPI_SetDataWidth设置值的影响,例如,设置了通道两端都是8bit,但最后一次设置的SPI数据宽度是16bit,SPI实际还是会以16bit进行发送。

就是说,配置的一个参数,到底起到什么作用,得具体情况具体分析,而不能按照常见的思想去进行判断。坑坑坑

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: STM32 LL是一种低级别的驱动,提供了对STM32微控制器底层寄存器的访问。SPI DMA(直接内存访问)是一种高效的数据传输方式,可以在通信过程中减少CPU的负担。 STM32 LL中提供了SPI和DMA的驱动函数,用户可以使用这些函数来实现SPI DMA传输。具体步骤如下: 1. 配置SPI口,设置传输速度、数据位数、钟极性、钟相位等参数。 2. 配置DMA,设置数据缓冲区、数据长度、传输方向等参数。接收数据需要将DMA的传输方向设置为从外设到内存。 3. 启动DMA传输,并等待传输完成。传输完成后,可以通过DMA中断或查询方式来获取传输结果。 使用STM32 LLSPI DMA传输可以提高数据传输的效率,并减少CPU的负担。在实际应用中,用户需要根据实际需求进行配置和调试,以实现更好的性能和稳定性。 ### 回答2: STM32系列芯片是一款广泛应用于嵌入式系统中的微控制器,而LL则是ST公司开发的一套轻量级固件,提供了一系列的低级驱动,并结合HAL使用,方便开发者进行芯片驱动的编写。 SPI (Serial Peripheral Interface)总线是一种同步串行通信协议,在通信中分为一主多从的结构,可同连接多个设备。SPI总线传输的数据速率快,适合短距离以高速率进行数据传输。SPI总线传输协议中有一种DMA模式,即在传输使用DMA进行高速且低开销的数据传输。 在STM32芯片中使用LL编写SPI DMA的驱动程序,首先要初始化所需的GPIO引脚,设置SPI序及工作模式。LM中提供了LL_SPI_Init()函数,方便控制SPI总线通信的初始化。接着,设置DMA请求的方向与传输模式,即将SPI的数据缓存区作为数据的源头或数据的接收端。 在使用STM32 LL编写SPI DMA的驱动程序,需要首先学习一些关于LLSPI和DMA的相关知识。SPI总线传输速度快、传输距离短,因此在嵌入式系统控制中应用广泛。同使用DMA模式进行数据传输可以减少CPU的使用率,提高数据传输效率,提高嵌入式系统的性能。 总之,LL提供了开发SPI DMA功能的方便工具,可以帮助开发者减轻编写驱动程序的负担,提高系统调试与运行的效率和可靠性。 ### 回答3: STM32是一系列由ST公司推出的ARM Cortex-M处理器,LL则是其官方提供的低级驱动,用于管理STM32芯片的外设。其中,SPI和DMA是两个重要的外设,下面将介绍STM32 LLSPI DMA的应用。 SPI,全称Serial Peripheral Interface,是一种串行接口协议,它的主要特点是简单易用、高效可靠、传输速率快等。在STM32中,SPI是一种重要的外设,它可以进行多种模式的数据传输,比如全双工、半双工、主从等。SPI通常用于与外部器件进行数据交互,比如存储器、传感器、LCD等。 而DMA,全称Direct Memory Access,是一种直接存储器访问技术,它可以实现数据的高速传输,减轻CPU的负担。在STM32中,DMA是一种独立的硬件模块,可以提高数据传输效率,尤其在处理大批量数据更为明显。 在STM32使用SPI+DMA,可以提高数据传输的效率,减少CPU的占用率,提高系统的稳定性。在LL中,进行SPI+DMA传输可以分为以下步骤: 1. 初始化SPI和DMA模块:包括SPI钟配置、传输速率、工作模式,以及DMA的通道配置、数据长度等。 2. 启动DMA传输:首先将SPI的数据发送寄存器与DMA的内存地址关联,然后通过启动DMA传输,实现大批量数据的快速传输。 3. 等待传输完成:在DMA传输完成前,可以通过中断方式或轮询方式判断传输是否完成,等待传输完成后,即可进行下一步操作。 在使用SPI DMA传输,需要注意以下几点: 1. SPI的数据传输模式必须是DMA模式,可以通过LLSPI_ClearFlag_DMATransfer完成。 2. DMA传输完成后,必须及禁用DMA传输中断和DMA通道,以确保数据不会重复传输。 3. 在初始化SPI DMA,要根据实际情况选择合适的传输模式和缓冲区大小,以确保数据传输的稳定性和可靠性。 总之,SPI和DMA是STM32中重要的外设,在LL的支持下,可以实现快速、高效、稳定的数据传输,提高系统的性能和可靠性。同,在使用过程中,需要合理配置、正确使用,才能发挥它们的优势。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值