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

发布时间:2023-08-02  

前言

在完成基本的传感器采集,串口通讯移植修改后,其实作为一个单品传感器已经是正常的工作起来了,但是如果我们在使用产品的时候有特殊情况,比如需要发送特定的无线报文,或者设置不同的工作模式之类的操作,我们就可以通过按键操作进行一定的配置。


所以本文会移植一个按键驱动,能够支持按键 短按,固定时间的长按等操作,同时周期执行的程序改成使用定时器来控制。

本文是《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的大小:

poYBAGK7ulGADZ0OAAEjyID5qUU722.png


最终的程序,运行时候需要占用 RAM的大小: 7456 字节,我们的芯片 RAM:8192字节。

最后大小说明

从一开始,因为我们是在小内存的芯片上使用 RT-Thread ,所以每一篇每改一次代码博主都会记录内存使用大小。

最终程序我们上面记录需要使用的 RAM 大小为 7456 字节,实际上本次应用内存占用还有一定的优化空间的,比如主线程2K还是可以减少一点,按键线程其实不需要512字节等等。。。

但是因为本次应用也确实简单,而且内存也没到溢出的地步,所以就没有遇到瓶颈也就没有特意的花精力去处理每一个线程合适的大小。

其实在文章中,我也经常说明一些影响内存的细节问题,希望看过我文章的小伙伴都有体会。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    5.12V精度差别在百倍,小数点后0.12V,基本很难做到高精度标准电压,市场通用电压为5V,上浮一定百分比。 2008年11月发布的STC12系列单片机数据手册中,STC12C系列的单片机......
    复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发; 2、HEX文件建立了第一个单片机C语言项目,但为了让编译好的程序能通过编程器写入51芯 片中,要先用编译器生成HEX文件 3、C 编译器所支持的......
    单片机自学需要买开发板嘛?初学者如何使用单片机开发板?;从事单片机开发的那些老工程师,或者是刚入门的单片机软件工程师,可以说99%的人都曾经买过开发板,或者一直借助开发板来从事单片机开发工作。 也许......
    STM32F103+RT-Thread从零开始(二)——RTT系统中点亮LED;上次的的推文简单说了下如何使用Keil创建STM32F103的工程,并且完成了LED点亮,及让LED等闪烁的功能,那是诸多同学学习单片机......
    90%的单片机初学者,都会遇到的10个问题;01、C语言和汇编语言在开发单片机时各有哪些优缺点? 汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主......
    容从5.5V跌落到4.5V(甚至可以下到3.6V)所能维持的单片机掉电工作时间。这里假设设单片机工作电流为20MA(外设驱动电流已经被屏蔽)不难算出: ......
    的实现更加灵活。例如,可利用单片机的串行口连接到计算机的RS232口,通过设计者自己专门设计的软件程序来对STC单片机内部的存储器编程。   支持ISP方式的单片机,不一定支持IAP方式。但是,支持......
    STM32的单片机则具有较多的学习资料。下面就这两种单片机介绍一下编程环境。 1、单片机常用的编程环境 比较流行的单片机环境有keil和IAR,这两种环境可以覆盖市面上90%的单片机型号,而且......
    系统的可靠性“当一个单片机系统设计完成,对于不同的单片机系统产品会有不同的测试项目和方法,但是有一些是必须测试的:1.测试单片机软件功能的完善性。这是针对所有单片机系统功能的测试,测试......
    盘点那些常见的单片机编程框架!;随着科技的不断发展,单片机已经广泛应用于各种各样的领域。而随着单片机编程的需求越来越大,编程框架也变得越来越重要。本文将为大家盘点常见的单片机编程框架。 1......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>