目次
ART-Pi H750にTouchGFXを
移植する(1)-STM32CUBMXを使用してTouchGFXプロジェクトを生成するART-Pi H750にTransplant TouchGFXを作成する(2)-MDKの外部QSPI-FLASHプログラミングアルゴリズムを
作成するART-Pi H750にTransplant TouchGFXを作成する( 3)-RTGFスレッドシステムへのTouchGFXの移植
ART-Pi H750へのTouchGFXの移植(4)-RT-Thread Studioを使用してTouchGFXを移植し
、ART-Pi H750にTouchGFXを移植(5)-ST-LINKを外部にするQSPI-FLASHプログラミングアルゴリズム
実験プラットフォーム:
ハードウェア: RT-Thread公式ART-PI H750開発バージョン、Punctual Atom 4.3インチRGBLCDスクリーン(800 * 480)
ソフトウェア: STM32CubeH7ファームウェアライブラリの最新バージョン、TouchGFXDesigner v4.14およびSTM32CubeMX V6.0.1、開発環境MDK v5.29
コードのダウンロード:
発表される
著者に連絡する:
公式アカウントをフォローし、無料で表示し、「グループを追加」に返信し、技術交流グループに参加してください
RTスレッドを理解する
RT-Threadは、リアルタイムオペレーティングシステム(RTOS)カーネル、ミドルウェアコンポーネント、および開発者コミュニティを統合するテクノロジープラットフォームです。XiongPuxiang氏によって開発され、オープンソースコミュニティの力と統合されています。RT-Threadも完全で豊富なコンポーネントです、拡張性が高く、開発が容易で、超低消費電力、高セキュリティのIoTオペレーティングシステム。RT-Threadには、GUI、ネットワークプロトコルスタック、安全な送信、低電力コンポーネントなど、IoT OSプラットフォームに必要なすべての主要コンポーネントがあります。RT-Threadは11年間の累積開発後、すでに中国で最大の組み込みオープンソースコミュニティを有しており、エネルギー、自動車、医療、家庭用電化製品などの業界でも広く使用されています。累積インストール容量は6億台を超え、独立しています。中国で最大のインストール容量を備えた、最も成熟した安定したオープンソースRTOSを開発。
2006年にソースコードとオープンソースがリリースされて以来、RT-Threadは「オープンソースとオープン」の概念に準拠し、市場のニーズを満たすために開発者に近く、組み込み型とIoTのさまざまなアプリケーションシナリオを完全にカバーできる小さくて美しいIoTオペレーティングシステムの作成を主張しています。 :
- 小リソースシーンのMCUは、RT-Thread Nanoバージョン(2006年にリリースされた、Cortex-M、RISC-Vなど)の簡単な制御に使用されます。
- 中規模のIoTノードは、RT-Thread IoT OSバージョン(2017年にリリースされた、Cortex-M、Loongson、RISC-Vなど用)を使用します。
- 機能豊富なスマートデバイスは、RT-Threadスマートマイクロカーネルバージョン(2020年にリリース、Cortex-A、Loongson、RISC-VなどのMMUを搭載したプロセッサ用)を使用します。
RT-Threadソースコードの入手方法
githubアドレス:https : //github.com/RT-Thread/rt-thread
giteeアドレス:https ://gitee.com/rtthread/rt-thread
RTスレッドを学ぶ方法
- RT-Threadシステム公式学習ドキュメント、https://www.rt-thread.org/document/site/
- 理解のコア RT-スレッドシステムを、ダウンロードして EnvのツールおよびRT-スレッドStudio開発ツールをインストールします。
- RT-Threadのデバイスドライバー、コンポーネント、ソフトウェアパッケージの使用方法を学びます。
TouchGFXのオペレーティングシステムを変更する
STM32CubeMXがデフォルトでサポートするオペレーティングシステムはFreeRTOSです。TouchGFXは、オペレーティングシステムの有無にかかわらずアプリケーションで実行できます。ユーザーがオペレーティングシステムを変更したい場合は、OSWrappersクラスを再実装するだけで、異なるRTOSを切り替えることができます。
TouchGFXをRTスレッドに移行する
1. OSWrappersクラスを再実装します。
/**
******************************************************************************
* File Name : OSWrappers.cpp
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under Ultimate Liberty license
* SLA0044, the "License"; You may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* www.st.com/SLA0044
*
******************************************************************************
*/
#include <touchgfx/hal/OSWrappers.hpp>
#include <stm32h7xx_hal.h>
#include <touchgfx/hal/GPIO.hpp>
#include <touchgfx/hal/HAL.hpp>
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <rthw.h>
static rt_sem_t frame_buffer_sem;
static rt_mq_t vsync_q = 0;
using namespace touchgfx;
// Just a dummy value to insert in the VSYNC queue.
static uint8_t dummy = 0x5a;
/*
* Initialize frame buffer semaphore and queue/mutex for VSYNC signal.
*/
void OSWrappers::initialize()
{
frame_buffer_sem = rt_sem_create("gfx_sem", 1, RT_IPC_FLAG_PRIO);
// Create a queue of length 1
vsync_q = rt_mq_create("gfx_mq", 1, 1, RT_IPC_FLAG_PRIO);
}
/*
* Take the frame buffer semaphore. Blocks until semaphore is available.
*/
void OSWrappers::takeFrameBufferSemaphore()
{
rt_sem_take(frame_buffer_sem, RT_WAITING_FOREVER);
}
/*
* Release the frame buffer semaphore.
*/
void OSWrappers::giveFrameBufferSemaphore()
{
rt_sem_release(frame_buffer_sem);
}
/*
* Attempt to obtain the frame buffer semaphore. If semaphore is not available, do
* nothing.
*
* Note must return immediately! This function does not care who has the taken the semaphore,
* it only serves to make sure that the semaphore is taken by someone.
*/
void OSWrappers::tryTakeFrameBufferSemaphore()
{
rt_sem_trytake(frame_buffer_sem);
}
/*
* Release the frame buffer semaphore in a way that is safe in interrupt context. Called
* from ISR.
*
* Release the frame buffer semaphore in a way that is safe in interrupt context.
* Called from ISR.
*/
void OSWrappers::giveFrameBufferSemaphoreFromISR()
{
// Since this is called from an interrupt, FreeRTOS requires special handling to trigger a
// re-scheduling. May be applicable for other OSes as well.
rt_sem_release(frame_buffer_sem);
}
/*
* Signal that a VSYNC has occurred. Should make the vsync queue/mutex available.
*
* Note This function is called from an ISR, and should (depending on OS) trigger a
* scheduling.
*/
void OSWrappers::signalVSync()
{
if (vsync_q)
{
rt_mq_send(vsync_q, &dummy, 1);
}
}
/*
* This function blocks until a VSYNC occurs.
*
* Note This function must first clear the mutex/queue and then wait for the next one to
* occur.
*/
void OSWrappers::waitForVSync()
{
// First make sure the queue is empty, by trying to remove an element with 0 timeout.
rt_mq_recv(vsync_q, &dummy, 1, 0);
// Then, wait for next VSYNC to occur.
rt_mq_recv(vsync_q, &dummy, 1, RT_WAITING_FOREVER);
}
/*
* A function that causes executing task to sleep for a number of milliseconds.
*
* A function that causes executing task to sleep for a number of milliseconds.
* This function is OPTIONAL. It is only used by the TouchGFX in the case of
* a specific frame refresh strategy (REFRESH_STRATEGY_OPTIM_SINGLE_BUFFER_TFT_CTRL).
* Due to backwards compatibility, in order for this function to be useable by the HAL
* the function must be explicitly registered:
* hal.registerTaskDelayFunction(&OSWrappers::taskDelay)
*
* see HAL::setFrameRefreshStrategy(FrameRefreshStrategy s)
* see HAL::registerTaskDelayFunction(void (*delayF)(uint16_t))
*/
void OSWrappers::taskDelay(uint16_t ms)
{
rt_thread_mdelay(ms);
}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
2. touchgfxで必要な周辺機器をrtthreadに追加します。
移行のアイデア:touchgfxで必要なコンポーネントを確認し、rtthreadで必要に応じて追加します。詳細な手順については、このチュートリアルを参照してください:RTThreadとTouchGFXを使用してDIYデジタルメーターを実装します(2 )-RTGFシステムへのTouchGFXの移植
ART-PI実戦デモンストレーション
1.前のセクションのプロジェクトを開いてゲームルーチンをインポートする
このプロジェクトは画像とフォントを除いて比較的大きいため、コードの量が128kを超えているため、前のプロジェクトのようにコードを直接ダウンロードすることはできません。この場合、ST公式開発ボードを参照して、すべてのコードを外部フラッシュスペースに配置し、内部128kスペースを使用してブートローダーを作成できます。ブートローダーの電源がオンになると、qspiアドレスがマップされ、qspiフラッシュにジャンプします。アドレスでプログラムを実行します。
2.ブートローダーを作成する
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <drv_common.h>
#include "w25qxx.h"
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
/* defined the LED0 pin: PB1 */
#define LED0_PIN GET_PIN(I, 8)
#define VECT_TAB_OFFSET 0x00000000UL
#define APPLICATION_ADDRESS (uint32_t)0x90000000
typedef void (*pFunction)(void);
pFunction JumpToApplication;
int main(void)
{
/* set LED0 pin mode to output */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
W25QXX_Init();
W25Q_Memory_Mapped_Enable();//地址映射
SCB_DisableICache();
SCB_DisableDCache();
SysTick->CTRL = 0;
JumpToApplication = (pFunction)(*(__IO uint32_t *)(APPLICATION_ADDRESS + 4));
__set_MSP(*(__IO uint32_t *)APPLICATION_ADDRESS);
JumpToApplication();//跳转
return RT_EOK;
}
3.
スキャッタロードファイルを変更するようにAPPを作成し、すべてのコードを外部フラッシュに配置し、
割り込みの再マッピングを追加します。
static int vtor_config(void)
{
/* Vector Table Relocation in Internal QSPI_FLASH */
SCB->VTOR = QSPI_BASE;
return 0;
}
INIT_BOARD_EXPORT(vtor_config);
4. touch gt9147ソフトウェアパッケージ
を追加し、XY座標をSTM32TouchController.cppのtouchgfxに割り当てます。
bool STM32TouchController::sampleTouch(int32_t& x, int32_t& y)
{
/**
* By default sampleTouch returns false,
* return true if a touch has been detected, otherwise false.
*
* Coordinates are passed to the caller by reference by x and y.
*
* This function is called by the TouchGFX framework.
* By default sampleTouch is called every tick, this can be adjusted by HAL::setTouchSampleRate(int8_t);
*
*/
struct rt_touch_data *read_data;
read_data = read_coordinate();
if (read_data->event == RT_TOUCH_EVENT_DOWN || read_data->event == RT_TOUCH_EVENT_MOVE)
{
x = read_data->x_coordinate;
y = read_data->y_coordinate;
return true;
}
else
{
return false;
}
}