日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

rt-thread移植finSH控制臺(tái)中STM32 HAL庫(kù)的缺陷

發(fā)布者:快樂(lè)舞動(dòng)最新更新時(shí)間:2025-01-16 來(lái)源: jianshu關(guān)鍵字:rt-thread  移植  STM32  HAL庫(kù) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

小小的一個(gè)串口居然看了半天,原來(lái)對(duì)STM32系列的lib庫(kù),好像是1.x版本感覺(jué)還不錯(cuò)的。后來(lái)ST非要整個(gè)CUBEMx庫(kù),往一個(gè)中斷接受函數(shù)里丟了一堆東西。
在rt-thread官網(wǎng)中給出了nano版本增加控制臺(tái)的示范例程,主要是增加了一個(gè)接受隊(duì)列。(如果用rt-thread studio配置控制臺(tái),接受好像用的是查詢模式,如果只是單純一個(gè)控制臺(tái),不干其他事情好像也沒(méi)啥事)


#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;

}


用中斷模式+接受隊(duì)列接受大量數(shù)據(jù)可能會(huì)更健壯可靠些。問(wèn)題是實(shí)驗(yàn)了幾次,只要在串口助手中發(fā)送了2個(gè)字節(jié),中斷接受就出現(xiàn)問(wèn)題,再也進(jìn)入不了中斷函數(shù)了。后來(lái)關(guān)閉了控制臺(tái)的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)致的。原來(lái)這是ST的HAL庫(kù)的bug,在串口發(fā)送中進(jìn)行了互斥操作,導(dǎo)致有接受中斷時(shí)不能再次啟動(dòng)接受中斷。如下


/**

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


國(guó)外論壇也有這個(gè)討論
[https://community.st.com/s/question/0D50X00009XkeOGSAZ/questions-surrounding-hallock]


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){...


        __HAL_UNLOCK(&HUART);   ...
    }}

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


/* 移植控制臺(tái),實(shí)現(xiàn)控制臺(tái)輸出, 對(duì)接 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庫(kù) 引用地址:rt-thread移植finSH控制臺(tái)中STM32 HAL庫(kù)的缺陷

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

推薦閱讀最新更新時(shí)間:2025-07-23 07:26

STM32標(biāo)準(zhǔn)庫(kù)和HAL庫(kù)的區(qū)別
大體看了下,標(biāo)準(zhǔn)庫(kù)移植起來(lái)沒(méi)有HAL庫(kù)方便。 用HAL庫(kù)移植起來(lái)不需要改動(dòng),怪不得ST推HAL庫(kù) 好像標(biāo)準(zhǔn)庫(kù)后面的芯片就不支持了 怪不得華清現(xiàn)在講課,STM32的課還有freertos的課都是用的STM32CUBE https://blog.csdn.net/ice_masters/article/details/105644704 https://blog.csdn.net/bornpride/article/details/94601754 怪不得這里說(shuō)沒(méi)有可移植性,我最開(kāi)始看到這句的時(shí)候很吃驚,標(biāo)準(zhǔn)庫(kù)怎么沒(méi)有可移植性了。
[單片機(jī)]
<font color='red'>STM32</font>標(biāo)準(zhǔn)庫(kù)和<font color='red'>HAL庫(kù)</font>的區(qū)別
RT-Thread中使用lwip自帶的tftp功能傳輸文件
TFTP協(xié)議 TFTP(簡(jiǎn)單文件傳輸協(xié)議)是TCP/IP協(xié)議族中的一個(gè)用來(lái)在客戶機(jī)與服務(wù)器之間進(jìn)行文件傳輸?shù)膮f(xié)議,端口號(hào)為69號(hào)。TFTP基于UDP協(xié)議,開(kāi)銷小、效率高,但是TFTP只能從服務(wù)器上獲得或者寫入文件,不能列出目錄,也不進(jìn)行認(rèn)證。 硬件框圖 常見(jiàn)的組成框圖差異不大,以STM32H7為例,ARM內(nèi)核與MAC控制器集成在一個(gè)MCU芯片中,外部與PHY芯片相連,經(jīng)過(guò)網(wǎng)絡(luò)變壓器之后通過(guò)網(wǎng)線連接到PC端,后者是通過(guò)無(wú)線WIFI的方式連到遠(yuǎn)端服務(wù)器。 而從操作系統(tǒng)的層面來(lái)看,硬件框圖就顯得不重要了,對(duì)于rt-thread來(lái)說(shuō),只關(guān)注協(xié)議應(yīng)用本身,與硬件的交互在移植的時(shí)候做好適配即可。下面以RT-Thread源碼包中的
[單片機(jī)]
<font color='red'>RT-Thread</font>中使用lwip自帶的tftp功能傳輸文件
ESP32 官方 Xmodem 代碼移植問(wèn)題
ESP32 官方提供了 Xmodem 的代碼,包含的 xmodem 的發(fā)送方和接收方源代碼(https://gitee.com/esp-components/esp-xmodem)。這部分代碼并不在正式的代碼庫(kù)中(https://github.com/espressif/esp-idf)。從代碼的提交情況看,該項(xiàng)目提交后就沒(méi)有維護(hù)了。 由于項(xiàng)目在 esp32 需要實(shí)現(xiàn) xmodem,我移植了該項(xiàng)目。調(diào)試過(guò)程中發(fā)現(xiàn),該代碼其實(shí)只是剛剛跑通,并沒(méi)有做詳細(xì)和異常性測(cè)試。比如我遇到的下面兩個(gè)致命問(wèn)題: /* Read data from UART */uint32_t esp_xmodem_read_data(esp_xmodem
[單片機(jī)]
MPlayer在ARM上的移植(S5PV210開(kāi)發(fā)板)
MPlayer 1.0已經(jīng)把大部分解碼庫(kù)都自帶了,如ffmpeg,但是自帶的音頻庫(kù)在S5PV210下效果非常不好.換成使用libmad效果不錯(cuò).因此MPlayer 在ARM-Linux的最簡(jiǎn)單的移植只需要移植這兩個(gè)即可.移植后即進(jìn)行字符界面的播放. 移植之前先做好移植前準(zhǔn)備,安裝好arm-linux交叉編譯器,并下載 MPlayer-1.0rc2.tar.bz2 和libmad包(libmad-0.15.1b.tar.gz) 1.安裝libmad (1)解壓libmad 解壓libmad包(libmad-0.15.1b.tar.gz); $ tar zxvf libmad-0.15.1b.tar.gz -C libmad
[單片機(jī)]
S3C6410嵌入式應(yīng)用平臺(tái)構(gòu)建(六)——linux-3.14.4移植到OK6410-(Yaffs2文件系統(tǒng)移植)
我個(gè)人覺(jué)得nandflash上用yaffs2文件系統(tǒng)是很好的方案,但是最新的Linux并不支持yaffs2文件系統(tǒng),需要你自己給內(nèi)核打補(bǔ)丁,不過(guò)話說(shuō)在前面,由于內(nèi)核間差異及兼容問(wèn)題,在編譯時(shí)肯定會(huì)出現(xiàn)各種編譯問(wèn)題,需要你一一的去解決。 一、準(zhǔn)備工作 1. 下載源碼 使用git工具下載:$ git clone git://www.aleph1.co.uk/yaffs2 2. 給內(nèi)核打補(bǔ)丁 下載完成后,在該執(zhí)行目錄下會(huì)有yaffs2文件夾,進(jìn)入該文件夾。 $ ./patch-ker.sh c m ../../kernel/test/linux-3.14.4 Updating ../../kernel/te
[單片機(jī)]
S3C6410嵌入式應(yīng)用平臺(tái)構(gòu)建(六)——linux-3.14.4<font color='red'>移植</font>到OK6410-(Yaffs2文件系統(tǒng)<font color='red'>移植</font>)
Linux移植之內(nèi)核啟動(dòng)過(guò)程start_kernel函數(shù)簡(jiǎn)析
在Linux移植之內(nèi)核啟動(dòng)過(guò)程引導(dǎo)階段分析中從arch/arm/kernel/head.S開(kāi)始分析,最后分析到課start_kernel這個(gè)C函數(shù),下面就簡(jiǎn)單分析下這個(gè)函數(shù),因?yàn)樯婕暗絃inux的內(nèi)容較多,這里只是簡(jiǎn)單介紹下內(nèi)核啟動(dòng)流程。先看一下內(nèi)核啟動(dòng)的流程框圖,截圖來(lái)自《嵌入式Linux應(yīng)用開(kāi)發(fā)完全手冊(cè)》。內(nèi)核引導(dǎo)階段已經(jīng)分析過(guò),接下來(lái)分析一下內(nèi)核啟動(dòng)的第二階段。 1、start_kernel函數(shù)全局概覽 2、start_kernel函數(shù)調(diào)用層次 1、start_kernel函數(shù)全局概覽,對(duì)start_kernel作一下粗略注釋。 打開(kāi)initMain.c ,下面主要分析處理UBOOT傳入的參數(shù),其中r1是傳入的第一個(gè)參
[單片機(jī)]
Linux<font color='red'>移植</font>之內(nèi)核啟動(dòng)過(guò)程start_kernel函數(shù)簡(jiǎn)析
011_STM32程序移植之_內(nèi)部flash開(kāi)機(jī)次數(shù)管理
1. 測(cè)試環(huán)境:STM32C8T6 2. 測(cè)試接口: 3. 串口使用串口一,波特率9600 單片機(jī)引腳------------CH340引腳 VCC--------------------VCC GND-------------------GND PA9--------------------RXD PA10-------------------TXD 1. 功能: 1. 使用STM32內(nèi)部falsh進(jìn)行開(kāi)機(jī)次數(shù)記錄 2. 通過(guò)串口輸入密碼進(jìn)行權(quán)限的設(shè)置 3. 設(shè)置唯一硬件標(biāo)識(shí) 2. 移植基礎(chǔ) 1. 008_STM32之_keil編譯內(nèi)存大小解析 2. 009_STM32程序移植之_內(nèi)部fa
[單片機(jī)]
011_STM32程序<font color='red'>移植</font>之_內(nèi)部flash開(kāi)機(jī)次數(shù)管理
u-boot2009.11 s3c2440移植手記
奮戰(zhàn)了好幾天了 U-BOOT終于有點(diǎn)眉目了,雖然nandflash還沒(méi)有弄好,目前還不支持從nandflash啟動(dòng)。先來(lái)張圖片吧哈哈。 u-boot作為現(xiàn)在主流的bootloader同樣分為boot 和 loader兩部分。 boot:(靴子呵呵基礎(chǔ)支撐作用)為第一階段,主要是硬件設(shè)備的初始化。 loader:(裝載機(jī))為第二階段完成初始化后將flash的內(nèi)容搬運(yùn)到內(nèi)存ram中運(yùn)行。 具體步驟我就不說(shuō)了 網(wǎng)上很多大俠都說(shuō)過(guò)了 我第一階段boot的調(diào)試方法:點(diǎn)燈 (1)——cpu/arm920t/start.S 匯編 完成第一階段后點(diǎn)一個(gè)燈,現(xiàn)象是LED1亮 (2)——board/..../xx2440.c 在init bo
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

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