国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

rt-thread移植finSH控制臺中STM32 HAL庫的缺陷

發(fā)布者:快樂舞動最新更新時間:2025-01-16 來源: jianshu關(guān)鍵字:rt-thread  移植  STM32  HAL庫 手機看文章 掃描二維碼
隨時隨地手機看文章

小小的一個串口居然看了半天,原來對STM32系列的lib庫,好像是1.x版本感覺還不錯的。后來ST非要整個CUBEMx庫,往一個中斷接受函數(shù)里丟了一堆東西。
在rt-thread官網(wǎng)中給出了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;

}


用中斷模式+接受隊列接受大量數(shù)據(jù)可能會更健壯可靠些。問題是實驗了幾次,只要在串口助手中發(fā)送了2個字節(jié),中斷接受就出現(xiàn)問題,再也進入不了中斷函數(shù)了。后來關(guān)閉了控制臺的echo回應(yīng)功能,居然神奇的好了。


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

多半定位到是串口發(fā)送導(dǎo)致的。原來這是ST的HAL庫的bug,在串口發(fā)送中進行了互斥操作,導(dǎo)致有接受中斷時不能再次啟動接受中斷。如下


/**

  * @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);   ...
    }}

在中斷回調(diào)函數(shù)中加入個unlock就好了。
當(dāng)時是注意到RTT官方的文檔中斷發(fā)送函數(shù)中有unlock操作,看來接受 也得加個


/* 移植控制臺,實現(xiàn)控制臺輸出, 對接 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);

    }

}


關(guān)鍵字:rt-thread  移植  STM32  HAL庫 引用地址:rt-thread移植finSH控制臺中STM32 HAL庫的缺陷

上一篇:使用STM32 ST-LINK Utility下載程序
下一篇:《嵌入式-STM32開發(fā)指南》第二部分 基礎(chǔ)篇 - 第6章串口通信(HAL庫)

推薦閱讀最新更新時間:2025-07-04 12:05

rt-thread移植finSH控制臺STM32 HAL庫的缺陷
小小的一個串口居然看了半天,原來對STM32系列的lib庫,好像是1.x版本感覺還不錯的。后來ST非要整個CUBEMx庫,往一個中斷接受函數(shù)里丟了一堆東西。 在rt-thread官網(wǎng)中給出了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 SPI調(diào)試之HAL庫的調(diào)試
uint8_t aTxBuffer __attribute__((at(0x20000200))) = {0xaa, 0x00, 0x00}; 在沒有上面的__attribute__((at(0x20000200))的時候,程序會進入Hardfault,進入的原因是程序不能從奇地址讀取數(shù)據(jù)。 這個原因非常難找,我也是無語。對其的原因 API在中斷里和應(yīng)用程序里不同同時使用,否則會陷入死機。 中斷和應(yīng)用程序不能用同一資源。 void SPI_RF_WriteByte(uint8_t *WriteBuff, uint16_t Size) { HAL_StatusTypeDef status = HAL_ERROR; //
[單片機]
嵌入式案例 用RT-ThreadSTM32實現(xiàn)機器人驅(qū)動控制模型算法
概述 機器人運動系統(tǒng)式一套高復(fù)雜性、高性、驅(qū)動力小于機體物理自由度的非線性系統(tǒng),為了實現(xiàn)機器人在空間中穩(wěn)定的運動姿態(tài)控制,本設(shè)計把機器人運動系統(tǒng)在空間中的運動形式等效成了旋轉(zhuǎn)倒立擺模型,基于該模型的運動特點,分別設(shè)計了速度閉環(huán)控制算法和角度閉環(huán)控制算法,通過雙閉環(huán)控制算法來實現(xiàn)對空間中旋轉(zhuǎn)倒立擺的穩(wěn)定控制。 開發(fā)環(huán)境 :該設(shè)計硬件依托于ART-開發(fā)平臺,主控芯片采用H750高性能單片機,同時采用TB6612芯片作為旋轉(zhuǎn)倒立擺的核心動力驅(qū)動,采用霍爾作為速度采集,采用高精度作為擺臂角度采集傳感器,采用屏幕來進行參數(shù)的顯示,與實時調(diào)整。 RT-Thre版本:RT-Thread版本采用4.0.2 開發(fā)工具及版本:m
[機器人]
STM32程序移植的一些注意方法
一,步驟 建立需要的子函數(shù)及將對應(yīng)的函數(shù)在所有子函數(shù)之前聲明。另一種方法是:新建一個子函數(shù)(.c)文件和頭文件庫(.h)文件,分別保存在用戶文件夾中(這個文件夾是主函數(shù)所在的文件夾),將剛剛保存的子函數(shù)文件添加到程序文件夾中(保存在主函數(shù)所在的文件夾并不表示包含到了函數(shù)里,因此要在編程軟件(即開發(fā)環(huán)境)添加,添加方法詳見http://blog.csdn.net/ambizxzh/article/details/74324288) 移植的方法也可以參照上面這個鏈接。 二,注意 1,在配置子函數(shù)文件時,當(dāng)出現(xiàn)多個結(jié)構(gòu)體時結(jié)構(gòu)體要在任何結(jié)構(gòu)體元素賦值之前,也就是說對于A結(jié)構(gòu)體,它必須放在A結(jié)構(gòu)體、B結(jié)構(gòu)體、C…等結(jié)構(gòu)體的結(jié)構(gòu)體元
[單片機]
STM32CUBEMX F103 HAL庫開發(fā)之 USB虛擬串口
stm32 USB VPC虛擬串口簡介 很多stm32的開發(fā)版都帶有一個usb接口,可以用cubeMx將其配置成一個虛擬串口,使用USB線就可以打印調(diào)試信息,省去了用TTL轉(zhuǎn)USB的步驟,而且USB虛擬串口的速度和穩(wěn)定性比TTL轉(zhuǎn)USB要好,在開發(fā)中,這個工具可以幫助我們節(jié)省一個串口,同時獲得更穩(wěn)定的傳輸。 STM32F103C8T6_Black_Pill-1最小系統(tǒng)開發(fā)板 這個開發(fā)板性價比可謂是高到天際了,淘寶上遍地都是,它的led燈是接在PB12上的 ,我推薦這個板子作為實驗用,它還有一個專門的網(wǎng)站,STM32F103C8T6-Black-Pill 它也是stm32duino項目的官方支持的板子,最近也在搗鼓STM32du
[單片機]
STM32F4 HAL庫DMA學(xué)習(xí)
用了一段時間HAL庫,不知道是不是用外設(shè)固件庫時間長一點的原因,個人感覺沒有固件庫來的直接??碊MA部分看的有點亂,捋一下。 DMA的使用方法及細節(jié)直接看官方的手冊就可以了,注意的是如果原地址和目的地址的數(shù)據(jù)長度不一樣的話只能使用FIFO模式,直接模式下原地址和目的地址的數(shù)據(jù)長度必須一致。 主要是簡單整理一下使用DMA的初始化過程,以串口發(fā)送使用DMA為例: (1) 定義一個外設(shè)的句柄,對外設(shè)的基本參數(shù)、IO、時鐘、中斷等進行初始化。 UART_HandleTypeDef UART1_Handler; .... HAL_UART_Init(&UART1_Handler); 調(diào)用外設(shè)的初始
[單片機]
RT-Thread開發(fā)GD32F450添加adc外設(shè)
開發(fā)板使用的是gd32f450zk,env工具使用的版本是1.3.5,rtthread版本是5.0.0 添加adc外設(shè)的步驟如下: 步驟1: 查看開發(fā)板的電路原理圖,確定adc的使用引腳,使用的是引腳PF6,即adc012_IN4,如下圖: 步驟2: 使用env工具開啟adc外設(shè),并選擇配置相應(yīng)的adc外設(shè),如下如 步驟3:打開drv_adc.c文件,修改代碼 修改后代碼如下,也可以全部修改為GET_PIN(F, 6) #ifdef BSP_USING_ADC2 { ADC2, RCU_ADC2, { GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A,
[單片機]
<font color='red'>RT-Thread</font>開發(fā)GD32F450添加adc外設(shè)
i.MX6ULL終結(jié)者Debian文件系統(tǒng)的構(gòu)建i.MX6ULL 移植Debian文件系統(tǒng)
1、安裝Qumu和Debootstrap 由于我們是在 Ubuntu 上構(gòu)建的debian的文件系統(tǒng),所以安裝這倆個工具我們直接使用apt-get命令即可。命令如下: apt-get install binfmt-support qemu qemu-user-static debootstrap 如圖 1.1所示: 2、抽取Debain文件系統(tǒng) 抽取文件系統(tǒng)我們使用的是debootstrap命令,我們執(zhí)行以下命令即可從debian下載源中獲取到文件系統(tǒng): debootstrap --arch=armhf --foreign buster root https://mirrors.tuna.tsinghua.edu.c
[單片機]
i.MX6ULL終結(jié)者Debian文件系統(tǒng)的構(gòu)建i.MX6ULL <font color='red'>移植</font>Debian文件系統(tǒng)
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved