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

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

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

本章節爲你們講解GUIX定時器更新功能。這個功能用的到地方不少,好比更新文本控件顯示RTC時鐘,採集數據的動態更新等場合都要用到。框架

15.1初學者重要提示函數

15.2 GUIX Studio設置窗口事件回調學習

15.3 GUIX定時器更新功能ui

15.4 實驗例程設計框架spa

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窗口建立一個定時器。調試

新調整的界面效果以下:code

 

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定時器更新功能,推薦你們設置不一樣的參數看效果,熟練掌握這些函數的用法。

相關文章
相關標籤/搜索