【STM32H7】第15章 ThreadX GUIX定时器更新功能

2023-12-17 01:32

本文主要是介绍【STM32H7】第15章 ThreadX GUIX定时器更新功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429

第15章       ThreadX GUIX定时器更新功能

本章节为大家讲解GUIX定时器更新功能。这个功能用的到地方很多,比如更新文本控件显示RTC时钟,采集数据的动态更新等场合都要用到。

目录

第15章       ThreadX GUIX定时器更新功能

15.1 初学者重要提示

15.2 GUIX Studio设置窗口事件回调

15.2.1        窗口事件回调设置

15.2.2        文本控件prompt动态更新

15.3 GUIX定时器更新功能

15.3.1        了解GUIX定时器相关宏定义

15.3.2        了解GUIX定时器API

15.3.3        窗口(控件)里事件回调的定时器实现框架

15.3.4        窗口里面定时器更新功能实例(重要)

15.4 实验例程设计框架

15.5 实验例程

15.6 总结


 

15.1 初学者重要提示

  1.   务必看第11章学习GUIX Studio的使用方法和第12章学习GUIX Studio生成的代码移植到硬件平台的方法。
  2.   使用文本控件prompt做动态更新,要勾选GUIX Studio中的Private Text Copy,详解本章2.2.2小节。
  3.   本章节教程的3.3.4小节是重点,对定时器更新的使用方法进行了说明。

15.2 GUIX Studio设置窗口事件回调

GUIX Studio的设置方法与第11章一样,我们这里把控件的位置和大小做了调整,并为window窗口创建一个定时器。

新调整的界面效果如下:

 

15.2.1        窗口事件回调设置

下面我们为窗口控件设置一个Event Function,此功能是窗口的事件回调函数。在这个回调函数里面,大家可以处理各种事件。

 

这里为Event Function设置的回调函数名为_cbEventWindow0,然后就可以使用GUIX Studio生成新的代码。生成的代码移植到硬件平台的方法看第12章即可。

15.2.2        文本控件prompt动态更新

使用控件prompt做更新,一定要在GUIX Studio上勾选Private Text Copy,否则prompt的内容是无法更新的:

 

15.3 GUIX定时器更新功能

在GUIX Studio上设置好事件回调函数名后,剩下就是在程序里面实现定时器事件回调的处理,这里把实现方法为大家做个说明。

15.3.1        了解GUIX定时器相关宏定义

GUIX定时器相关的几个宏定义如下:

#ifndef GX_TICKS_SECOND
#define GX_TICKS_SECOND                     20
#endif/* Set default ThreadX timer tick frequency 100Hz (10ms timer). */#ifndef TX_TIMER_TICKS_PER_SECOND
#define TX_TIMER_TICKS_PER_SECOND ((ULONG)100)
#endif/* Default 20ms GUIX system timer.  */
#ifndef GX_SYSTEM_TIMER_MS
#define GX_SYSTEM_TIMER_MS        20
#endif/* Derive GX_SYSTEM_TIMER_TICKS based on GX_SYSTEM_TIMER_MS value. */
#ifndef GX_SYSTEM_TIMER_TICKS
#define GX_SYSTEM_TIMER_TICKS     ((GX_SYSTEM_TIMER_MS * TX_TIMER_TICKS_PER_SECOND) / 1000)
#endif

以本教程配置的例子为例,仅用到定义GX_SYSTEM_TIMER_TICKS,其它基本都没用到。这个宏定义被ThreadX内核定时器组件的创建函数所调用,以此来供GUIX的定时器组件使用:

tx_timer_create(&_gx_system_timer, "guix timer", _gx_system_timer_expiration, 0,GX_SYSTEM_TIMER_TICKS, GX_SYSTEM_TIMER_TICKS, TX_NO_ACTIVATE);

一般我们都设置ThreadX内核系统时钟节拍为1000Hz,即1ms。因此这里设置GX_SYSTEM_TIMER_TICKS表示GUIX定时器的周期单位是GX_SYSTEM_TIMER_TICKS毫秒。比如GX_SYSTEM_TIMER_TICKS定义为2,表示GUIX的定时器单位是2ms。

15.3.2        了解GUIX定时器API

我们主要用到函数gx_system_timer_start,用于启动定时器。函数原型如下:

#define gx_system_timer_start(a, b, c, d)    _gx_system_timer_start((GX_WIDGET *)a, b, c, d)
UINT  _gx_system_timer_start(GX_WIDGET *owner, UINT timer_id, UINT initial_ticks, UINT reschedule_ticks)

函数形参含义如下:

  •   owner

控件指针变量,指向控件控制块,表示为那个控件创建定时器。

  •   timer_id

定时器ID。

  •   initial_ticks

初始溢出时间,单位由宏定义GX_SYSTEM_TIMER_TICKS决定。

参数范围1到0xFFFFFFFF。

  •   reschedule_ticks

周期性执行时间,单位由宏定义GX_SYSTEM_TIMER_TICKS决定。

参数范围1到0xFFFFFFFF。

 

注意事项:

  •   宏定义GX_MAX_ACTIVE_TIMERS决定可以创建的最多定时器个数,默认值是32。
  •   此函数最后两个时间参数不可以设置为0。

15.3.3        窗口(控件)里事件回调的定时器实现框架

GUIX的定时器调用是在窗口(控件)的事件回调函数里面调用的。以窗口为例,窗口的Event Function事件回调函数实现框架如下:

UINT _cbEventWindow(GX_WINDOW *widget, GX_EVENT *event_ptr)
{switch (event_ptr->gx_event_type){/* 控件显示事件 */case GX_EVENT_SHOW:break;/* 定时器时间溢出事件*/case GX_EVENT_TIMER:break;default:return gx_window_event_process(widget, event_ptr);}return 0;
}

事件回调函数还有很多其它事件供用户使用,这里仅列出了定时器用到的两个。这个框架基本是固定的,大家直接调用即可,下面举一个实例来说明定时器的使用。

15.3.4        窗口里面定时器更新功能实例(重要)

实例代码如下,本章教程配套例子也是用的这个代码:

/*
*********************************************************************************************************
*    函 数 名: _cbEventWindow
*    功能说明: 窗口window的事件回调函数
*    形    参: widget     窗口句柄
*             event_ptr  事件指针
*    返 回 值: 返回0表示成功
*********************************************************************************************************
*/
UINT _cbEventWindow(GX_WINDOW *widget, GX_EVENT *event_ptr)
{static uint32_t count = 0;char buf[20] = {0};switch (event_ptr->gx_event_type){/* 控件显示事件 */case GX_EVENT_SHOW:/* 启动一个GUIX定时器 */gx_system_timer_start((GX_WIDGET *)widget, GUI_ID_Timer0, 1, 50);/* 默认事件处理 */gx_window_event_process(widget, event_ptr);break;/* 定时器时间溢出事件*/case GX_EVENT_TIMER:if (event_ptr->gx_event_payload.gx_event_timer_id == GUI_ID_Timer0){sprintf(buf, "%d", count++);gx_prompt_text_set((GX_PROMPT *)&(window.window_prompt), buf);                }break;default:return gx_window_event_process(widget, event_ptr);}return 0;
}
  •   GX_EVENT_SHOW

窗口(控件)显示事件。当窗口(控件)显示时,会产生此消息,既可以附加到一个可见窗口(控件),也可以通过函数gx_widget_show()。窗口(控件)绘制前会产生此消息。

  •   gx_system_timer_start

启动定时器。

    •   第1个参数是事件回调函数传递进来的形参。
    •   第2个参数是定时器ID,通过此参数可以区分多个定时器。
    •   第3个参数是初始溢出时间,默认本教程配套例子设置的时间单位是2ms。这里配置为1,表示2ms后周期性执行。
    •   第4个参数是周期执行时间,这里配置为50,表示定时器周期是100ms。特别注意参数这个参数设置为1-5延迟时间都是10ms左右,设置到6以上就正常了。有待后续研究原因。
  •   gx_window_event_process

用于窗口(控件)的默认事件处理。

  •   GX_EVENT_TIMER

定时器周期性溢出事件

  •   gx_prompt_text_set

设置文本控件prompt的内容。

 

针对这个实例,推荐大家设置不同的参数看效果,熟练掌握这些函数的用法,这样用起GUIX也得心应手。

15.4 实验例程设计框架

本章例程的重点是GUIX定时器更新的实现,任务中专门为窗口设置了一个Event Function事件回调函数。

 

15.5 实验例程

(注,如果是电阻屏,需要做触摸校准,校准方法看本教程附件章节A)

配套例子:

本章节配套了如下两个例子供大家移植参考:

  •   V7-2015_GUIX Timer Update

GUIX Studio生成的代码在硬件平台实际运行的工程,含有GCC,IAR,MDK AC5和AC6四个版本工程。

  •   V7-2016_GUIX Studio Timer Update

GUIX Studio工程模板,设计界面后,生成的文件可直接添加到MDK,IAR和GCC软件平台使用。

实验目的:

  1. 本章主要学习GUIX的定时器更新功能。

实验内容:

  1. 共创建了如下几个任务,通过按下按键K1可以通过串口打印任务堆栈使用情况

App Task Start任务  :启动任务,这里用作BSP驱动包处理。

App Task MspPro任务 :消息处理,这里用作LED闪烁。

App Task UserIF任务 :按键消息处理。

App Task GUI任务    :GUI应用任务。

App Task STAT任务   :统计任务。

App Task IDLE任务   :空闲任务。

GUIX System Thread  :GUI系统任务。

System Timer Thread任务:系统定时器任务。

实验效果:

GUIX Studio的界面设计如下:

串口打印任务执行情况:

IAR,MDK AC5和AC6工程可以串口打印任务执行情况:按开发板的按键K1可以打印,波特率 115200,数据位 8,奇偶校验位无,停止位 1:

Embedded Studio(GCC)平台的串口打印是通过其调试组件SEGGER RTT做的串口打印,速度也非常快,打印效果如下:

 

展示里面有乱码是因为Embedded Studio不支持中文。

15.6 总结

本章节主要为大家讲解了GUIX定时器更新功能,推荐大家设置不同的参数看效果,熟练掌握这些函数的用法。

这篇关于【STM32H7】第15章 ThreadX GUIX定时器更新功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/502639

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

SpringCloud使用Nacos 配置中心实现配置自动刷新功能使用

《SpringCloud使用Nacos配置中心实现配置自动刷新功能使用》SpringCloud项目中使用Nacos作为配置中心可以方便开发及运维人员随时查看配置信息,及配置共享,并且Nacos支持配... 目录前言一、Nacos中集中配置方式?二、使用步骤1.使用$Value 注解2.使用@Configur

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue