<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32L051上使用RT-Thread (五、完結篇)

矜辰所致 ? 來源:矜辰所致 ? 作者:矜辰所致 ? 2022-06-29 10:34 ? 次閱讀
應用篇-在STM32L051上使用RT-Thread 第五篇,也是本次應用的完結篇。
把按鍵驅動移植好,定時器使用加上。

目錄

  • 前言
  • 一、按鍵操作
    • 1.1 按鍵驅動移植
    • 1.2 按鍵測試
  • 二、定時器操作
    • 2.1 定時器邏輯添加
    • 2.2 定時器測試
  • 三、時刻關注占RAM大小
    • 最后大小說明
  • 結語

前言

在完成基本的傳感器采集,串口通訊移植修改后,其實作為一個單品傳感器已經是正常的工作起來了,但是如果我們在使用產品的時候有特殊情況,比如需要發送特定的無線報文,或者設置不同的工作模式之類的操作,我們就可以通過按鍵操作進行一定的配置。

所以本文會移植一個按鍵驅動,能夠支持按鍵 短按,固定時間的長按等操作,同時周期執行的程序改成使用定時器來控制。
本文是《RT-Thread 應用篇 — 在STM32L051上使用 RT-Thread》完結篇
??
一個簡單的應用:無線溫濕度傳感器
??
一個小內存的芯片:STM32L051C8T6
??
一個小而美麗的物聯網操作系統:RT-Thread
??
本 RT-Thread 專欄記錄的開發環境:
RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發環境 及 配合CubeMX開發快速上手)
RT-Thread記錄(二、RT-Thread內核啟動流程 — 啟動文件和源碼分析)
??
RT-Thread 內核篇系列博文鏈接:
RT-Thread記錄(三、RT-Thread 線程操作函數及線程管理與FreeRTOS的比較)
RT-Thread記錄(四、RT-Thread 時鐘節拍和軟件定時器)
RT-Thread記錄(五、RT-Thread 臨界區保護)
RT-Thread記錄(六、IPC機制之信號量、互斥量和事件集)
RT-Thread記錄(七、IPC機制之郵箱、消息隊列)
RT-Thread記錄(八、理解 RT-Thread 內存管理)
RT-Thread記錄(九、RT-Thread 中斷處理與階段小結)
??
在STM32L051C8 上使用 RT-Thread 應用篇系列博文連接:
RT-Thread 應用篇 — 在STM32L051上使用 RT-Thread (一、無線溫濕度傳感器 之 新建項目)
RT-Thread 應用篇 — 在STM32L051上使用 RT-Thread (二、無線溫濕度傳感器 之 CubeMX配置)
RT-Thread 應用篇 — 在STM32L051上使用 RT-Thread (三、無線溫濕度傳感器 之 I2C通訊)
RT-Thread 應用篇 — 在STM32L051上使用 RT-Thread (四、無線溫濕度傳感器 之 串口通訊)

一、按鍵操作

在初步的測試框架中,我當時使用的是簡單的按鍵處理方式,這里也上一下源碼做測試備份:

static void key_thread_entry(void *par){
    while(1){
        if(key1_read == 0){
            rt_thread_mdelay(10); //去抖動
            if(key1_read == 0){
                //按鍵按下,do something
                while(key1_read == 0){rt_thread_mdelay(10);}
            }
        }
        if(key2_read == 0){
            rt_thread_mdelay(10); //去抖動
            if(key2_read == 0){
                //按鍵按下,do something
                while(key2_read == 0){rt_thread_mdelay(10);}
            }
        }
        rt_thread_mdelay(1);
    }
}

但是在實際中,如果要實現長按,組合按之類的方式,還是需要一個適用的按鍵驅動。

1.1 按鍵驅動移植

按鍵驅動 是用我自己一直使用的一個,在我博文以前上傳過,.c.h文件都開源了:

幾個實用的按鍵驅動(STM32、51都適用)

老樣子,把文件放置我們自己的驅動文件夾下面,然后右擊,同步 scons 配置至項目:

poYBAGK7uk-AVjIiAAAbjMfyHEg474.png

因為這個驅動程序源碼都給了,移植替換也不麻煩,所以簡單看看:

pYYBAGK7uk-Ac5IbAAEGMxc1Qe4134.png

1.2 按鍵測試

使用方式我介紹按鍵的博文也說過,在這個應用上只使用了3中按鍵方式:

poYBAGK7ulCAJrYWAAC4fnOBKs0731.png

這里直接看下測試結果,按鍵正常:

pYYBAGK7ulCANWWpAABUPpnARQM943.png

按鍵移植成功,因為我們按鍵調用都使用的是開始已經創建好的看見線程,所以相對之前額外的內存占用是沒有的,多的只是一個全局變量Timer21_count,如下圖:

poYBAGK7ulCAAMIjAAChSVMlFp8882.png

細節說明: unsigned int 幾個字節在不同編譯器或者平臺可能是不一樣的,我們只需簡單的測試一下即可:

pYYBAGK7ulGAAFnzAABBZtLGY-U560.png

二、定時器操作

雖然按鍵也用到了定時器,但是那個定時器是專門給按鍵驅動用的,我們開始還初始化了一個定時時間1S的定時器,開始也測試過了。

在使用裸機的時候,需要一定時間周期性的進行某項工作,我們只能使用定時器,而用了操作系統,在單獨的線程中直接使用操作系統的延時函數也可以達到效果。

在一般的應用,定時時間沒有那么嚴格要求的時候,完全可以直接使用rt_thread_mdelay,比如原始的周期處理:

poYBAGK7ulGAMSKJAABqtG8C-6c844.png

但是復雜一些的應用,都使用rt_thread_mdelay,線程多了管理起來就不方便了,如果使用定時器配合信號量(在裸機中就是全局變量)那就是比較規范的方式了。

2.1 定時器邏輯添加

我們需要給定時器創建一個計數的全局變量,然后到了一定的時間給需要執行任務的線程通知,這個通知我們新建信號量實現(雖然通知也可以使用全局變量),但是既然用了RT-Thread ,就把IPC機制用起來,這樣保證良好的習慣也為以后做大的應用打下好的基礎。

我們操作如下圖所示:

pYYBAGK7ulGAWQvIAACUV1rwzI4996.png

所以我們原始的周期處理代碼改成如下所示:

poYBAGK7ulGAdFfQAABmdDqs6Y8901.png

2.2 定時器測試

測試也沒什么,串口通訊接收報文也正常,今天改的按鍵和定時器也正常。

最后測試所有的功能和結果都正常:

pYYBAGK7ulGAcTEKAAEWQ7kR8HY007.png

三、時刻關注占RAM大小

今天的工作做完,本應用篇也算完結了,最后還是要看一下占用RAM的大?。?/p> poYBAGK7ulGADZ0OAAEjyID5qUU722.png

最終的程序,運行時候需要占用 RAM的大?。?7456 字節,我們的芯片 RAM:8192字節。

最后大小說明

從一開始,因為我們是在小內存的芯片上使用 RT-Thread ,所以每一篇每改一次代碼博主都會記錄內存使用大小。

最終程序我們上面記錄需要使用的 RAM 大小為 7456 字節,實際上本次應用內存占用還有一定的優化空間的,比如主線程2K還是可以減少一點,按鍵線程其實不需要512字節等等。。。

但是因為本次應用也確實簡單,而且內存也沒到溢出的地步,所以就沒有遇到瓶頸也就沒有特意的花精力去處理每一個線程合適的大小。

其實在文章中,我也經常說明一些影響內存的細節問題,希望看過我文章的小伙伴都有體會。

結語

?? 我希望大家都能夠自己去掌握自己程序的內存。??

掌握自己程序內存占用,首先要理解數據在芯片上的存放方式。

使用了操作系統,也得明白任務棧和系統棧的關系。對于每個線程,哪些操作需要占用內存都需要一定的了解。

對于基本的程序設計,也得明白 不同關鍵字修飾的變量存放的不同位置。

其實所有的這些我在自己的文章中都有過說明,相信關注博主的小伙伴一定有所收獲!
??
一個簡單的應用:無線溫濕度傳感器
??
一個小內存的芯片:STM32L051C8T6
??
一個小而美麗的物聯網操作系統:RT-Thread

好了,到本文為止,我們《RT-Thread 應用篇 — 在STM32L051上使用 RT-Thread》系列也就算完結了。

希望小伙伴多多支持,多多指教!謝謝!

從下一篇文章開始我們就要開始學習 RT-Thread 的 I/O 設備模型了。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 移植
    +關注

    關注

    1

    文章

    369

    瀏覽量

    27888
  • 定時器
    +關注

    關注

    23

    文章

    3154

    瀏覽量

    112453
  • 按鍵驅動
    +關注

    關注

    0

    文章

    11

    瀏覽量

    7103
  • RT-Thread
    +關注

    關注

    31

    文章

    1184

    瀏覽量

    39003
收藏 人收藏

    評論

    相關推薦

    STM32L051上使用RT-Thread (一、新建項目)

    學完了 RT-Thread 內核基礎,來使用 RT-Thread 實現一個小應用。 硬件平臺:STM32L051C8 TCM310(Enocean無線芯片) 軟件平臺:RT-Thread
    的頭像 發表于 06-25 20:45 ?5812次閱讀
    <b class='flag-5'>STM32L051</b>上使用<b class='flag-5'>RT-Thread</b> (一、新建項目)

    STM32L051上使用RT-Th (二、CubeMX配置)

    應用篇-在STM32L051上使用RT-Thread 第二篇,使用STM32CubeMX 進行對應外設配置,同時做一些簡單測試。
    的頭像 發表于 06-26 14:02 ?3976次閱讀
    <b class='flag-5'>STM32L051</b>上使用<b class='flag-5'>RT</b>-Th (二、CubeMX配置)

    STM32L051上使用RT-Threa (三、I2C通訊)

    應用篇-在STM32L051上使用RT-Thread 第三篇,學習RT-Thread Studio如何添加自定義的.c .h文件,
    的頭像 發表于 06-27 10:32 ?3242次閱讀
    <b class='flag-5'>STM32L051</b>上使用<b class='flag-5'>RT</b>-Threa (三、I2C通訊)

    STM32L051上使用RT-Thread (四、串口通訊)

    應用篇-在STM32L051上使用RT-Thread 第四篇,巧妙的使用信號量處理串口通訊。
    的頭像 發表于 06-28 10:59 ?4751次閱讀
    <b class='flag-5'>STM32L051</b>上使用<b class='flag-5'>RT-Thread</b> (四、串口通訊)

    基于STM32L051的可穿戴設備字庫顯示設計

    `12832OLED點陣STM32L051,顯示屏0.91寸128*32OLED,LCD驅動芯片是SSD1306,字庫顯示采用高通GT24L24A2Y字庫芯片,字庫芯片主要用于實現OLED界面
    發表于 08-30 15:55

    總結STM32L051的STOP模式

    本文總結下STM32L051的STOP模式,通過外部中斷「按鍵、串口」進行喚醒。
    發表于 08-13 09:36

    求大佬分享STM32L051使用HAL庫操作實例

    求大佬分享STM32L051使用HAL庫操作實例
    發表于 11-26 06:47

    【原創精選】RT-Thread征文精選技術文章合集

    、I2C通訊)STM32L051使用RT-Thread (四、串口通訊)STM32L051使用RT-
    發表于 07-26 14:56

    STM32L051進入停止模式時如何關閉IWDG?

    當我使用STM32L051時,它的iwdg和停止功能,進入停止模式后,iwdg也在工作,我想在停止時關閉iwdg,但我在FLASH_OPTR寄存器中沒有找到“IWDG_STOP”的這一點,所以我不知道該怎么做,因為我在 STM8L051
    發表于 01-13 07:38

    RT-Thread STM32 配置系統時鐘(使用外部晶振)

    RT-Thread STM32 配置系統時鐘開發環境芯片:STM32F103RCT6RT-Thread Studio: V1.0.6(現在已經更新到1.1.3,由于本人使用RTT開發已經有一段時間
    發表于 12-14 18:45 ?14次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>STM32</b> 配置系統時鐘(使用外部晶振)

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
    發表于 02-22 18:23 ?7次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 <b class='flag-5'>STM32</b>L475 上手指南

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發表于 02-22 18:31 ?8次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    【RTT征文精選】畫板子、敲代碼、玩RTOS、搞Linux,大家一起“秀”!

    //STM32L051上使用RT-Thread(一、新建項目)STM32L051上使用RT-Th(二、CubeMX配置)STM32L051
    的頭像 發表于 08-25 09:56 ?489次閱讀
    【RTT征文精選】畫板子、敲代碼、玩RTOS、搞Linux,大家一起“秀”!

    新書上架|嵌入式系統原理及應用——基于STM32RT-Thread

    教程書籍編撰過程中的第一選擇! 本次上新的書籍為胡永濤主編的《嵌入式系統原理及應用——基于STM32RT-Thread》。 本書以意法半導體(ST)的STM32L431系列微控制器為硬件核心,采用
    的頭像 發表于 09-25 18:25 ?620次閱讀
    新書上架|嵌入式系統原理及應用——基于<b class='flag-5'>STM32</b>和<b class='flag-5'>RT-Thread</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>