0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

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

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

目錄

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

前言

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

所以本文會移植一個按鍵驅動,能夠支持按鍵 短按,固定時間的長按等操作,同時周期執(zhí)行的程序改成使用定時器來控制。
本文是《RT-Thread 應用篇 — 在STM32L051上使用 RT-Thread》完結篇
??
一個簡單的應用:無線溫濕度傳感器
??
一個小內(nèi)存的芯片:STM32L051C8T6
??
一個小而美麗的物聯(lián)網(wǎng)操作系統(tǒng):RT-Thread
??
本 RT-Thread 專欄記錄的開發(fā)環(huán)境:
RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發(fā)環(huán)境 及 配合CubeMX開發(fā)快速上手)
RT-Thread記錄(二、RT-Thread內(nèi)核啟動流程 — 啟動文件和源碼分析)
??
RT-Thread 內(nèi)核篇系列博文鏈接:
RT-Thread記錄(三、RT-Thread 線程操作函數(shù)及線程管理與FreeRTOS的比較)
RT-Thread記錄(四、RT-Thread 時鐘節(jié)拍和軟件定時器)
RT-Thread記錄(五、RT-Thread 臨界區(qū)保護)
RT-Thread記錄(六、IPC機制之信號量、互斥量和事件集)
RT-Thread記錄(七、IPC機制之郵箱、消息隊列)
RT-Thread記錄(八、理解 RT-Thread 內(nèi)存管理)
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);
    }
}

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

1.1 按鍵驅動移植

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

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

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

poYBAGK7uk-AVjIiAAAbjMfyHEg474.png

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

pYYBAGK7uk-Ac5IbAAEGMxc1Qe4134.png

1.2 按鍵測試

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

poYBAGK7ulCAJrYWAAC4fnOBKs0731.png

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

pYYBAGK7ulCANWWpAABUPpnARQM943.png

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

poYBAGK7ulCAAMIjAAChSVMlFp8882.png

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

pYYBAGK7ulGAAFnzAABBZtLGY-U560.png

二、定時器操作

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

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

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

poYBAGK7ulGAMSKJAABqtG8C-6c844.png

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

2.1 定時器邏輯添加

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

我們操作如下圖所示:

pYYBAGK7ulGAWQvIAACUV1rwzI4996.png

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

poYBAGK7ulGAdFfQAABmdDqs6Y8901.png

2.2 定時器測試

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

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

pYYBAGK7ulGAcTEKAAEWQ7kR8HY007.png

三、時刻關注占RAM大小

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

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

最后大小說明

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

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

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

其實在文章中,我也經(jīng)常說明一些影響內(nèi)存的細節(jié)問題,希望看過我文章的小伙伴都有體會。

結語

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

掌握自己程序內(nèi)存占用,首先要理解數(shù)據(jù)在芯片上的存放方式。

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

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

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

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

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

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

審核編輯:湯梓紅

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

    關注

    1

    文章

    375

    瀏覽量

    28011
  • 定時器
    +關注

    關注

    23

    文章

    3218

    瀏覽量

    113668
  • 按鍵驅動
    +關注

    關注

    0

    文章

    11

    瀏覽量

    7115
  • RT-Thread
    +關注

    關注

    31

    文章

    1239

    瀏覽量

    39427
收藏 人收藏

    評論

    相關推薦

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

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

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

    應用-在STM32L051使用RT-Thread 第二,使用STM32CubeMX 進行對
    的頭像 發(fā)表于 06-26 14:02 ?4300次閱讀
    <b class='flag-5'>STM32L051</b><b class='flag-5'>上</b>使用<b class='flag-5'>RT</b>-Th (二、CubeMX配置)

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

    應用-在STM32L051使用RT-Thread 第三,學習RT-Thread Studi
    的頭像 發(fā)表于 06-27 10:32 ?3463次閱讀
    <b class='flag-5'>STM32L051</b><b class='flag-5'>上</b>使用<b class='flag-5'>RT</b>-Threa (三、I2C通訊)

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

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

    總結STM32L051的STOP模式

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

    【原創(chuàng)精選】RT-Thread征文精選技術文章合集

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

    基于STM32F4和RT-Thread通用BootLoader使用經(jīng)驗

    基于STM32F4、RT-Thread通用BootLoader使用經(jīng)驗
    的頭像 發(fā)表于 02-27 17:23 ?6051次閱讀
    基于<b class='flag-5'>STM32</b>F4和<b class='flag-5'>RT-Thread</b>通用BootLoader使用經(jīng)驗

    RT-Thread系統(tǒng)移植到STM32f103

    RT-Thread系統(tǒng)移植到STM32f103
    發(fā)表于 12-09 12:51 ?26次下載
    <b class='flag-5'>RT-Thread</b>系統(tǒng)移植到<b class='flag-5'>STM32</b>f103

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

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

    RT-Thread全球技術大會:在RT-Thread編寫測試用例

    RT-Thread全球技術大會:在RT-Thread編寫測試用例 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:28 ?1363次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術大會:在<b class='flag-5'>RT-Thread</b><b class='flag-5'>上</b>編寫測試用例

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發(fā)表于 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 上手指南
    發(fā)表于 02-22 18:23 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 <b class='flag-5'>STM32L</b>475 上手指南

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

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

    STM32L4 RT-Thread Studio解決lptimer不工作的問題

    使用RT-Thread Studio 生成的基于STM32L4 的工程,發(fā)現(xiàn)開啟PM框架后,lptimer不能工作。
    的頭像 發(fā)表于 06-07 14:29 ?884次閱讀
    <b class='flag-5'>STM32L</b>4 <b class='flag-5'>RT-Thread</b> Studio解決lptimer不工作的問題

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

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