草庐IT

Stm32 HAL_UART_Receive读取不到数据的问题

最近在做Stm32方面的工作时发现使用HAL_UART_Receive函数去读取数据时出现了问题,代码如下: charbuffer[128]={0};HAL_UART_Receive(phuart,buffer,128,timer);这段代码非常简单,就是在一定时间内读取满128个字符,但是会有一个问题,如果超时时buffer没有被读取到128个字节那么下次还可以读取,但是一旦超出或到达128个字节下次在读取就会没有数据,但是在中断情况下是可以正常读取的,随后我去查了一下USART寄存器,发现它有一个OVRDIS的功能,简单来说就是当数据达到buff设定大小时会将ORE标志置1,那么下次来新数

学习STM32是用标准库好还是HAL库好?各自有什么优缺点?做项目应用哪种库比较合适?

学习STM32可以使用标准库或HAL库,它们各有优缺点,具体使用哪种库取决于你的项目需求和个人偏好。标准库是适用于单片机开发的基本库。它提供了对芯片的低级访问,可直接访问寄存器,操作系统资源,中断和固件等。标准库代码量较小,运行速度快,适用于简单的应用程序或需要高效性能的应用。HAL库是由ST公司提供的一种高级别的库,提供了一些高级别的API函数,可以更方便地进行硬件操作。HAL库提供了更多的驱动程序和功能,使编码更加简单,可读性更好。但HAL库代码量较大,运行速度相对较慢,适用于较为复杂的应用程序。选择库的时候,需要考虑以下因素:项目需求:如果项目需求比较简单,可以使用标准库;如果项目需求较

STM32的HAL库开发系列 - 串口DMA接收

STM32的HAL库开发系列-串口DMA接收串口DMA接收函数:HAL_StatusTypeDefHAL_UART_Receive_DMA(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize)串口空闲中断(IDLE):当DMA串口接收开始后,DMA通道会不断的将发送来的数据转移到主存,那么问题来了,该如何判断串口接收是否完成从而及时关闭DMA通道?如何知道接收到数据的长度?答案便是使用串口空闲中断。串口空闲中断,对应事件标志为IDLE。检测到串口空闲线路时,该位由硬件置1。如果USART_CR1寄存器中IDLEIE=1,则会生成中断。该位由软

STM32 HAL库基于DRV8301的FOC开环速度控制

目录CubeMX基本配置drv8301控制模式(3pwm?6pwm?死区时间设置?)SVPWM理论推导HALL接口设置以及旋转速度获取原理FOC开环控制主要分为三步:第一,角度自增;第二,Park逆变换;第三,SVPWM计算出下个周期要写入的占空比Ta,Tb,Tc验证SVPWM模块也非常简单,串口打印出来应该是个比较标准的马鞍波(我是20k频率,可供参考) 如果角度改变太快会造成波形有不同程度的失真,不过是正常现象,角度变化改小点就可以了CubeMX基本配置使用STM32外设情况如下:TIM1高级定时器CH1-CH3输出三路互补的PWM信号,设置为中央对齐模式,同时CH4配置为PWMgener

HAL库 编译错误:XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o)的可能原因之一及解决方法

我在学习STM32HAL库版本时遇到了这种编译问题 由于是刚开始学习STM32代码跟例程是一样的,所以代码不可能出错。我去网上寻找答案看到了(7条消息)(已解决)STM32报错Error:L6218E:Undefinedsymbolassert_param(referredfrommisc.o)._老龙QAQ的博客-CSDN博客于是按照他的方法试验了一下,发现我已经定义了宏并不是这个问题。于是我找到了报错的函数位置  发现报错的函数只存在这一个头文件里面,并且在写程序的时候并没有使用。所以有可能是没有把相关的.c文件加进去,导致函数未定义  加入之后再重新编译,发现 问题得到了解决。希望这篇文

U8g2库的STM32硬件SPI(DMA)移植教程(HAL、OLED显示、四线SPI、DMA)

U8g2库的STM32硬件SPI(DMA)移植教程U8g2库的STM32硬件SPI移植教程(HAL、OLED显示、四线SPI)前言U8g2简介U8g2是什么U8g2支持的显示控制器U8g2的优势CubexMX的配置RCC配置外部高速晶振(精度更高)——HSE:SYS配置:Debug设置成SerialWire(否则可能导致芯片自锁):时钟树配置:SPI1配置半双工(全双工):作为OLED的通讯方式:(注意这里的配置)DMA配置:工程配置:U8g2移植准备U8g2库文件精简U8g2库文件去掉csrc文件夹中无用的驱动文件精简u8g2_d_setup.c(注意不是u8x8_setup.c)精简u8g

STM32 Cube MX 之hal库软件模拟IIC 可直接移植使用

此为软件模拟IIC,可以直接移植到HAL库使用。.h文件需要自己做函数声明这里就不再放出,如有问题大家可以讨论。使用的时候只需要更改SDA和SCL引脚的宏定义就可以移植使用,当然IIC协议其实就是根据IIC的时序图编写代码,主要内容就是包括开始信号,停止信号以及发送数据的格式、接收数据和数据的应答。此IIC代码可以供所有的IIC模块使用,包括IIC必须要的几个基本功能代码中都已经给出。下面开始来介绍IIC协议。IIC协议具体内容写数据:主机给从机发从机只收SDA为输出模式读数据:从机给主机发主机收SDA为输入模式IIC具体内容:(只规定了开始信号停止信号8位数据(发8位收一位ACK)ACK应答

【STM32】【HAL库】定时器编码器模式测速

目录概述HAL设置 定时器的编码器模式定时器设置 常用函数代码概述电机AB相增量型编码器的介绍和解码方法在这里介绍过了电机编码器https://blog.csdn.net/m0_57585228/article/details/125791283测速可以使用外部中断进行脉冲计数很多型号的单片机中有专门的电路来计算脉冲的速度和方向,也就是定时器的编码器模式因为是硬件计数,所以计数频率可以很高,性能比软件来的好,使用也比较方便但是需要连接到指定的GPIO这里以常见的4倍频测速为例子进行设置HAL设置要开启:定时器的编码器模式定时器中断一个周期性的定时器及中断 定时器的编码器模式开启编码器模式 编码

STM32 使用HAL库实现微秒级长延时

STM32使用HAL库实现微秒级长延时背景定时器初始化主程序中的设计背景STM32HAL库中有一个延时函数HAL_Delay(),可以实现毫秒级的延时,能够满足一般延时需求。在有些场合下,我们需要更精准的延时,同时可能会有较长时间的延时,需要对定时器进行一些特殊的设计。定时器初始化定时器分频为1MHz,计数方式设置为向上计数//定时器2初始化函数voidMX_TIM2_Init(void){//部分代码略htim2.Instance=TIM2;htim2.Init.Prescaler=71;//根据定时器2的频率进行分频htim2.Init.CounterMode=TIM_COUNTERMOD

STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号

STM32-HAL库串口DMA空闲中断的正确使用方式+解析SBUS信号一.问题描述二.方法一——使用HAL_UART_Receive_DMA三.方法二——使用HAL_UARTEx_ReceiveToIdle_DMA四.方法三——使用HAL_UARTEx_ReceiveToIdle_IT(不使用DMA)五.总结一.问题描述能够点进这篇文章的小伙伴肯定是对STM32串口DMA空闲中断接收数据感兴趣的啦,今天用这一功能实现串口解析航模遥控器sbus信号时,查阅了很多网友发布的文章(勤劳的搬运工~),包括自己之前写过一篇博客STM32_HAL库_CubeMx串口DMA通信(DMA发送+DMA空闲接收不