rt-thread移植finSH控制台中STM32 HAL库的缺陷

发布者:快乐舞动最新更新时间:2025-01-16 来源: jianshu关键字:rt-thread  移植  STM32  HAL库 手机看文章 扫描二维码
随时随地手机看文章

小小的一个串口居然看了半天,原来对STM32系列的lib库,好像是1.x版本感觉还不错的。后来ST非要整个CUBEMx库,往一个中断接受函数里丢了一堆东西。
在rt-thread官网中给出了nano版本增加控制台的示范例程,主要是增加了一个接受队列。(如果用rt-thread studio配置控制台,接受好像用的是查询模式,如果只是单纯一个控制台,不干其他事情好像也没啥事)


#ifdef RT_USING_FINSH

char rt_hw_console_getchar(void)

{

    int ch = -1;


    if (__HAL_UART_GET_FLAG(&handle, UART_FLAG_RXNE) != RESET)

    {

#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32F0)

    || defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32H7)

    || defined(SOC_SERIES_STM32G4)

        ch = handle.Instance->RDR & 0xff;

#else

        ch = handle.Instance->DR & 0xff;

#endif

    }

    else

    {

        if(__HAL_UART_GET_FLAG(&handle, UART_FLAG_ORE) != RESET)

        {

            __HAL_UART_CLEAR_OREFLAG(&handle);

        }

        rt_thread_mdelay(10);

    }

    return ch;

}


用中断模式+接受队列接受大量数据可能会更健壮可靠些。问题是实验了几次,只要在串口助手中发送了2个字节,中断接受就出现问题,再也进入不了中断函数了。后来关闭了控制台的echo回应功能,居然神奇的好了。


    /* normal is echo mode */#ifndef FINSH_ECHO_DISABLE_DEFAULT
    shell->echo_mode = 1;#else
    shell->echo_mode = 0;#endif

多半定位到是串口发送导致的。原来这是ST的HAL库的bug,在串口发送中进行了互斥操作,导致有接受中断时不能再次启动接受中断。如下


/**

  * @brief  Sends an amount of data in blocking mode.

  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),

  *         the sent data is handled as a set of u16. In this case, Size must indicate the number

  *         of u16 provided through pData.

  * @param  huart Pointer to a UART_HandleTypeDef structure that contains

  *               the configuration information for the specified UART module.

  * @param  pData Pointer to data buffer (u8 or u16 data elements).

  * @param  Size  Amount of data elements (u8 or u16) to be sent

  * @param  Timeout Timeout duration

  * @retval HAL status

  */

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

{

  uint16_t *tmp;

  uint32_t tickstart = 0U;


  /* Check that a Tx process is not already ongoing */

  if (huart->gState == HAL_UART_STATE_READY)

  {

    if ((pData == NULL) || (Size == 0U))

    {

      return  HAL_ERROR;

    }


    /* Process Locked */

    __HAL_LOCK(huart);



   ....

   ....



    /* At end of Tx process, restore huart->gState to Ready */

    huart->gState = HAL_UART_STATE_READY;


    /* Process Unlocked */

    __HAL_UNLOCK(huart);


国外论坛也有这个讨论
[https://community.st.com/s/question/0D50X00009XkeOGSAZ/questions-surrounding-hallock]


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){...


        __HAL_UNLOCK(&HUART);   ...
    }}

在中断回调函数中加入个unlock就好了。
当时是注意到RTT官方的文档中断发送函数中有unlock操作,看来接受 也得加个


/* 移植控制台,实现控制台输出, 对接 rt_hw_console_output */

void rt_hw_console_output(const char *str)

{

    rt_size_t i = 0, size = 0;

    char a = 'r';


    __HAL_UNLOCK(&HUART);


    size = rt_strlen(str);

    for (i = 0; i < size; i++)

    {

        if (*(str + i) == 'n')

        {

            HAL_UART_Transmit(&HUART, (uint8_t *)&a, 1, 1);

        }

        HAL_UART_Transmit(&HUART, (uint8_t *)(str + i), 1, 1);

    }

}


关键字:rt-thread  移植  STM32  HAL库 引用地址:rt-thread移植finSH控制台中STM32 HAL库的缺陷

上一篇:使用STM32 ST-LINK Utility下载程序
下一篇:《嵌入式-STM32开发指南》第二部分 基础篇 - 第6章串口通信(HAL库)

推荐阅读最新更新时间:2026-03-17 10:55

rt-thread移植finSH控制台STM32 HAL库的缺陷
小小的一个串口居然看了半天,原来对STM32系列的lib库,好像是1.x版本感觉还不错的。后来ST非要整个CUBEMx库,往一个中断接受函数里丢了一堆东西。 在rt-thread官网中给出了nano版本增加控制台的示范例程,主要是增加了一个接受队列。(如果用rt-thread studio配置控制台,接受好像用的是查询模式,如果只是单纯一个控制台,不干其他事情好像也没啥事) #ifdef RT_USING_FINSH char rt_hw_console_getchar(void) { int ch = -1; if (__HAL_UART_GET_FLAG(&handle, UART_FLAG_RXNE) !=
[单片机]
STM32 HAL库HAL库移植及工程模板的建立
文章内容偏向HAL库的移植和使用,以个人观点及了解为主,若与事实不符,则以www.st.com、www.stmcu.org.cn等平台为准。 使用的软件:VSCode(1.36版,带C/C++ IntelliSense插件) Keil MDK(5.26版) 芯片:STM32H743ZIT6(Nucleo-H743平台) 所使用的库:STM32Cube_FW_H7_V1.3.0,下载地址:https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software
[单片机]
【<font color='red'>STM32</font> <font color='red'>HAL库</font>】<font color='red'>HAL库</font>的<font color='red'>移植</font>及工程模板的建立
FreeRTOS移植,基于STM32 HAL库
一、硬件准备 一个STM32开发板(STM32F429IGT6),及其电源线等; 一个ST-Link下载器及其连接线等。 二、软件准备 FreeRTOS源码(V9.0.0); 一个基于STM32 HAL库的基础例程(跑马灯例程)。 三、移植FreeRTOS 3.1 添加FreeRTOS源码至工程 添加源代码至工程目录,添加至工程分组中,添加相关头文件路径 编译,提示找不到 FreeRTOSConfig.h 3.2 添加 FreeRTOSConfig.h 文件来源:事先参考众多例程中的 FreeRTOSConfig.h 后,总结出来的 编译结果为:2个error。SVC_Handler() 和 PendSV_Handler()
[单片机]
教程:只需六步,将Hal库移植到标准库
手头上正好有STM32的开发板和ESP-12E模块,想着控制个WS2812玩玩。到MCU开发的时候下载了生成的代码发现是HAL库的,无奈自己刚刚学习stm32,用的是标准库这里参考了官方的移植MSP340教程并修改出适用于STM32标准库的教程。 步骤1、下载好的代码包是这样的,需要把这两个文件夹直接复制到自己工程的文件夹里面: 步骤2、添加到自己的工程组里面,并添加路径: 步骤3、正题来了,现在开始移植工作,需要修改的文件分别如下:3.1、打开gizwits_product.h需要修改的地方如下,查看代码行数可以快速找到) 3.2、打开gizwits_product.c,需要修改的地方如下: 下面删除的
[单片机]
教程:只需六步,将<font color='red'>Hal库</font><font color='red'>移植</font>到标准库
机智云设备移植RT-Thread
开发环境: Keil版本:V5.30 RT-Thread版本:3.1.5 STM32cubeMX:V6.0.1 开发板MCU:STM32F103 机智云平台生成的应用代码是裸机版本的,而在实际应用过程中,通常会有多个功能,这个时候就需要用到实时系统,比如FreeRTOS, AzureRTOS ThreadX, RT-Thread等,笔者这里推荐RT-thread。 RT-Thread是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。适用
[单片机]
机智云设备<font color='red'>移植</font><font color='red'>RT-Thread</font>
STM32 HAL库】 STM32H743的电源配置和时钟配置
文章内容偏向HAL库的移植和使用,以个人观点及了解为主,若与事实不符,则以www.st.com、www.stmcu.org.cn等平台为准。 使用的软件: VSCode(1.36版,带C/C++ IntelliSense插件) Keil MDK(5.26版) 芯片:STM32H743ZIT6(Nucleo-H743平台) 所使用的库:STM32Cube_FW_H7_V1.3.0,下载地址:https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-emb
[单片机]
【<font color='red'>STM32</font> <font color='red'>HAL库</font>】 STM32H743的电源配置和时钟配置
STM32定时器中断详解(HAL库实战讲解)
1、定时器简单介绍 以STM32F103C8T6中几个定时器为例: TIM1:这是一个高级定时器,不仅具备基本的定时中断功能,还拥有内外时钟源选择、输入捕获、输出比较、编码器接口以及主从触发模式等多种功能。这使得TIM1能够适用于各种复杂的应用场景,为开发者提供强大的时间控制和信号处理能力。 TIM2、TIM3和TIM4:这些是通用定时器,同样具有定时功能,但在功能上与高级定时器有所区别。通用定时器通常用于实现一些基本的定时任务,如LED闪烁、脉冲宽度测量等。 每个定时器都由一个**16位计数器、预分频器和自动重装寄存器的时基单元组成。**预分频器可以对时钟进行分频,计数器则对预分频后的时钟进行计数。当计数器的值达到设定值时,
[单片机]
<font color='red'>STM32</font>定时器中断详解(<font color='red'>HAL库</font>实战讲解)
TM1650/AIP650数码管驱动显示STM32驱动程序HAL库
一、 Display显示DEMO: 1、 硬件: 图1.1 数码管模块原理图 由图1.1可知MCU通过DAT&CLK(I2C)两个引脚去控制数码管驱动IC,从而达到控制数码管的显示;打开TM1650/AIP650规格书, 图1.2 控制命令 我们知道TM1650/AIP650可以通过显示命令控制控制数码管的显示。 图1.3显存地址 通过往显存地址里面写数据可以就可以实现数字&字母在数码管的显示效果。 图1.3完整的写显示时序 完整的写显示时序如图1.3所示。这就MCU& TM1650/AIP650的通信协议,也就是说,通过软件实现写显示时序,我们就能实现我们所要的显示效果,接下来请看软件部分
[单片机]
TM1650/AIP650数码管驱动显示<font color='red'>STM32</font>驱动程序<font color='red'>HAL库</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved