错误分析
用的HAL库有丢包问题,
定义void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart1)
{
log_u("********************* huart1 err ********************************* \r\n");
switch(huart->ErrorCode)
{
case HAL_UART_ERROR_NONE:
log_u("HAL_UART_ERROR_NONE\r\n");
break;
case HAL_UART_ERROR_PE:
log_u("HAL_UART_ERROR_PE\r\n");
break;
case HAL_UART_ERROR_NE:
log_u("HAL_UART_ERROR_NE\r\n");
break;
case HAL_UART_ERROR_FE:
log_u("HAL_UART_ERROR_FE\r\n");
break;
case HAL_UART_ERROR_ORE:
log_u("HAL_UART_ERROR_ORE\r\n");
break;
case HAL_UART_ERROR_DMA:
log_u("HAL_UART_ERROR_DMA\r\n");
break;
default:
log_u("other\r\n");
break;
}
huart->RxState = HAL_UART_STATE_READY;
HAL_UART_Receive_IT( &huart1 , RxdBuff1, MAX_BUFFER);
for(i=0; i {
RxdBuff1[i] = 0;
}
}
}
错误日志为
[14:15:04]********************* huart1 err *********************************
[14:15:04]HAL_UART_ERROR_NE
[14:15:04]********************* huart1 err *********************************
[14:15:04]other
[14:15:04]********************* huart1 err *********************************
[14:15:04]HAL_UART_ERROR_ORE
[14:15:04]********************* huart1 err *********************************
[14:15:04]HAL_UART_ERROR_ORE
报HAL_UART_ERROR_NE错误
查看stm32数据手册
位 2 NF:检测到噪声标志 (Noise detected flag)
当在接收的帧上检测到噪声时,该位由硬件置 1。该位由软件序列清零(读入 USART_SR 寄
存器,然后读入 USART_DR 寄存器)。
0:未检测到噪声
1:检测到噪声
注意: 如果 EIE 位置 1,则在进行多缓冲区通信时,该位不会生成中断,因为该位出现的时间与
本身生成中断的 RXNE 位因 NF 标志而生成的时间相同。
注意: 当线路无噪声时,可以通过将 ONEBIT 位编程为 1 提高 USART 对偏差的容差来禁止
NF 标志(请参见第 695 页的第 26.3.5 节: USART 接收器对时钟偏差的容差)。
将ONEBIT设置为1之后,错误率减少但是仍然存在。
关键字:stm32f405 HAL库 串口接收错误
引用地址:
stm32f405 HAL库串口接收错误
推荐阅读最新更新时间:2024-03-16 16:09
stm32的HAL库i2c从机实现
stm32的i2c默认就是slave模式,本文基于HAL库实现中断方式的接收和发送,首先是初始化gpio和i2c,代码如下: I2C_HandleTypeDef I2cHandle; void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE() ; __HAL_RCC_GPIOC_CLK_ENABLE() ; /**I2C3 GPIO Configuration PA8 ------ I2C3_SCL PC9 -----
[单片机]
HAL库教程4:外部中断
外部中断机制 本章我们仍然是通过按键来控制LED,只不过实现方式由轮询变为了外部中断。为什么需要外部中断?为了给CPU减轻负担。 举个例子 比如你今天有个快递,快递一般放在前台或是门卫。你有两种方法,1、不停问前台,你的快递到了没有;2、等快递到了,让前台告诉你。 前者就是轮询,后者就是外部中断。 外部中断是由引脚检测到的中断。中断可以由上升沿、下降沿或双边沿触发。换句话说,中断不是由CPU去“询问”,而是由中断控制器“通知”的。 ARM的体系架构决定了处理器是执行完当前指令后再去检查是否有中断发生。 硬件:中断源- 中断控制器筛选- CPU核保存当前工作状态,跳到对应异常向量表 软件:根据
[单片机]
STM32F405与STM32F407CAN配置
STM32F405与STM32F407CAN配置略有不同,不同之处在于407多了一个电平拉高拉低模式,配置时一定要注意。 其次,要开CAN2,必须开CAN1,因为CAN1是主,CAN2是从;开了CAN中断,一定要写中断处理函数并及时清除中断标志位,否则程序会卡死。 405的配置: GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_A
[单片机]
ch32可以用hal库吗
ch32是什么? 首先,我们需要了解ch32是什么。 ch32是一款基于Cortex-M0内核的单片机,由GD32公司(中国制造)生产。它提供了许多通用外设(通用串行总线、通用定时器、通用异步收发器等),使得它成为开发嵌入式系统的理想选择。 Hal库是什么? STM32 HAL库(即硬件抽象层库)是STM32固件库(PLIB)的继任者。 HAL库是一组C代码,用于为STM32微控制器提供一个高层次的、通用的软件接口。这个软件接口把开发人员与硬件之间的交互抽象化,从而使得他们可以方便地编写不同的应用程序,而不必去关注底层硬件细节。 ch32和HAL库的兼容性? 虽然原则上来说,ch32与STM32微控制器不同,但由于它们都遵循ARM
[单片机]
使用STM32hal库usart的接收中断分析及出现部分问题的解决
最近开始使用ST的hal库,这个库相较于之前的标准库,优缺点兼具吧,hal库封装了更多底层的细节,我们可以很轻易的实现我们需要的功能,但是由于封装了太多的细节,导致一旦出问题,你就很难发现问题,内部调用的复杂让你觉得懵逼。 (一)hal库接收中断的分析 这几天在使用hal库的USART,其中用到的是接收中断,官方推荐的使用接收中断的方式是:在初始化函数上面先开启接收中断(这里就不介绍串口的配置,网上一大推,我就不给世界增加无谓的存储量了),开启的函数如下: HAL_UART_Receive_IT(&huart2,(uint8_t*)aRxBuffer, 1);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设
[单片机]
STM32标准库改为HAL库的程序实现
标准库占绝大多数,自己买的板子跟的资料也一般是标准库,HAL库很少,不过要是使用STM32CubeMx配置,那么就是使用的HAL库了,而参考资料是标准库的,就没有办法用。 注意: 1. 标准库与HAL库不兼容,不要想着直接拿来用了,比如标准库使用#include stm32f10x.h ,HAL库使用#include stm32f1xx_hal.h 要让标准库程序使用HAL库时也可以正常运行得到想要的结果,有以下几种方法: 一、 将标准库程序中的每个函数内的代码修改为使用HAL库且同样效果的代码, 比如标准库中配置GPIO的代码直接就可以用STM32CubeMx配置为相同效果 二、根据标准库程序整个程序运行的原理使用HAL库
[单片机]
stm32f7 HAL库 串口重定向 使用printf
首先将串口初始化,然后添加重定向代码 下面使用的是串口三,因此以串口三为例: UART_HandleTypeDef huart3; #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int
[单片机]
stm32F4XX之独立看门狗 HAL库
1:简介 独立看门狗 (IWDG) 由其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持 工作状态。窗口看门狗 (WWDG) 时钟由 APB1 时钟经预分频后提供,通过可配置的时间窗 口来检测应用程序非正常的过迟或过早的操作。 IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时 间精度要求较低的场合。WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程序。 独立看门狗的时钟是一个内部 RC时钟,所以并不是准确的 32Khz,而是在 15~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时
[单片机]