LCDドライバーとRT-Threadスタディノートシリーズのemwinの例(2)

序文

Internet of Things、スマートホーム、スマートコントロール、その他の業界の急速な発展に伴い、使用要件を軽減し、ユーザーエクスペリエンスを向上させる、小型で美しく、応答が速く、低コストのモジュール式のカスタマイズされた組み込みシステムに対する需要が高まっています。 、人間とコンピューターの相互作用は非常に優れた方法であるため、この記事ではrtthread + lcd + emwinGUIのデバッグの記録とプロセスを記録します。

1.リソースの紹介

ハードウェアは自作PCBボードで、リソースは次のとおりです。

  • MCU:STM32F407ZGT6
  • LCD:3.2インチ320 * 240解像度、ドライバーチップ:ILI9341。RESETピンとバックライト制御ピンを除いて、他のピン接続はPunctualAtomのSTM32F407Explorer開発ボードと互換性があります。
  • FSMCインターフェースドライバーを使用する

ソフトウェアはrtthreadstudio1.1.5バージョンを使用します

次に、構成プロセス

1.emwinパッケージを追加します

ここに写真の説明を挿入
ここに写真の説明を挿入

ソフトウェアパッケージは、有効化の例が保存された後、プロジェクトのパッケージの下で利用可能になります。ソフトウェアパッケージには、LCDおよびOLEDドライバーのデモが含まれています。見てみると、PunctualAtomのドライバーに似ています。直接使用できます。内部にデモフォルダがないため、ソフトウェアパッケージを選択し、右クリックしてリソースが配置れているディレクトリ開きます。ソフトウェアパッケージにデモフォルダがあります。lcdドライバを使用しているので、2つのファイルdrv_lcd.hとdrv_lcd.hをドライブにコピーします。ドライバーフォルダは以下の通りです
ここに写真の説明を挿入

2.外部ピンを構成します

オフチップFSMCインターフェースを構成します。私の構成は次のとおりです。

static void HAL_FSMC_MspInit(void){
    
    
  /* USER CODE BEGIN FSMC_MspInit 0 */

  /* USER CODE END FSMC_MspInit 0 */
  GPIO_InitTypeDef GPIO_InitStruct ={
    
    0};

  /* Peripheral clock enable */
  __HAL_RCC_FSMC_CLK_ENABLE();

  /*lcd IO config*/
    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOE_CLK_ENABLE();
    __HAL_RCC_GPIOF_CLK_ENABLE();
    __HAL_RCC_GPIOG_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();

    //PD0,1,4,5,8,9,10,14,15
    GPIO_InitStruct.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_8|\
                     GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14|GPIO_PIN_15;
    GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;      //ÍÆÍ츴ÓÃ
    GPIO_InitStruct.Pull=GPIO_PULLUP;          //ÉÏÀ­
    GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;     //¸ßËÙ
    GPIO_InitStruct.Alternate=GPIO_AF12_FSMC;  //¸´ÓÃΪFSMC
    HAL_GPIO_Init(GPIOD,&GPIO_InitStruct);     //³õʼ»¯

    //PE7,8,9,10,11,12,13,14,15
    GPIO_InitStruct.Pin=GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|\
                     GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
    HAL_GPIO_Init(GPIOE,&GPIO_InitStruct);

    //PF12
    GPIO_InitStruct.Pin=GPIO_PIN_12;
    HAL_GPIO_Init(GPIOF,&GPIO_InitStruct);

    //PG12
    GPIO_InitStruct.Pin=GPIO_PIN_12;
    HAL_GPIO_Init(GPIOG,&GPIO_InitStruct);
  /* USER CODE END FSMC_MspInit 1 */
}

次のマクロ定義は、stm32f4xx_hal_conf.hファイルで有効になっています

#define HAL_CRC_MODULE_ENABLED
#define HAL_SRAM_MODULE_ENABLED

RT-Thread studioによって作成されたプロジェクトにはLLライブラリのソースファイルがないため、FSMCインターフェイスは2つのファイルstm32f4xx_ll_fsmc.cとstm32f4xx_ll_fmc.cを使用する必要があります。したがって、STM32CUBEによって生成されたプロジェクトのライブラリファイルからこれら2つのファイルをコピーする必要があります。
ここに写真の説明を挿入
ゴープロジェクトへと変更するdrv_lcd.cファイルを開くの定義LCD_BLを。私が直接、他の場所で、他のIOとそれを駆動するので、操作本のLCD_BLのピンこのファイルの下では、され、完全にコメント

LCD画面インターフェースのLCD_BLLCD_RESET、および電源のPWR構成は次のとおり
です。ハードウェアはMOSチューブを使用してLCDの電源を制御し、以下は電源投入直後に電源をオンにすることです。

#define PWR_PIN  GET_PIN(C, 2)
#define LCD_BL   GET_PIN(A, 6)
#define LCD_RESET   GET_PIN(A, 4)
static int open_lcd_power(void)
{
    
    
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    rt_pin_mode(PWR_PIN, PIN_MODE_OUTPUT);
    rt_pin_mode(LCD_BL, PIN_MODE_OUTPUT);
    rt_pin_mode(LCD_RESET, PIN_MODE_OUTPUT);
    rt_pin_write(PWR_PIN, PIN_HIGH);
    rt_pin_write(LCD_BL, PIN_HIGH);
    rt_pin_write(LCD_RESET, PIN_HIGH);
    return RT_EOK;
}
INIT_BOARD_EXPORT(open_lcd_power);

注:現時点では、パッケージの作成者がkeilによって作成およびアップロードされているため、直接コンパイルでエラーが報告されます。したがって、emwinライブラリはkeilの
ソリューションです。公式ライブラリは使用するGCCコンパイラライブラリを見つけることです。これは単純で大雑把です。 keilライブラリをGCCライブラリの形式に変更することもできます。最初に使用し、後で探します。
ここに写真の説明を挿入
現時点では、コンパイルにエラーが残っています
ここに写真の説明を挿入
。未定義の_sbrk関数は次のとおりです。この関数はlibcを使用する必要があるため、パッケージに含まれています。このlibcを有効にするだけです
ここに写真の説明を挿入
ここに写真の説明を挿入

エラーなしでコンパイルを保存します(警告はすべてライブラリの非互換性によるものです。当面は無視できます。後で置き換えるためにgccによってコンパイルされたライブラリを見つけることができます)

emwin GUIはハードウェアCRCを使用する必要があるため、CRCクロックを開くか、GUI_Test.cファイルを開いてコードを追加するか、キューブを使用してより厳密なポイントに従ってHAL_CRC_MspInit関数を生成するか、テストプログラムから直接__HAL_RCC_CRC_CLK_ENABLE()関数を直接追加する必要があります。関数呼び出しを使用する場合は、標準に従ってください。
ヒント:CrcHandle.StateがデフォルトでHAL_CRC_STATE_RESETではないという落とし穴があり、クロックをオンにすることができないため、HAL_CRC_STATE_RESET状態と等しくする必要があります(まだ少し粗い)

void HAL_CRC_MspInit(CRC_HandleTypeDef* hcrc)
{
    
    
  if(hcrc->Instance==CRC)
  {
    
    
    __HAL_RCC_CRC_CLK_ENABLE();
  }
}
static void test_thread(void *param)
{
    
    
    CRC_HandleTypeDef   CrcHandle;
    CrcHandle.Instance = CRC; 
    CrcHandle.State = HAL_CRC_STATE_RESET;
    HAL_CRC_Init(&CrcHandle);
    GUI_Init();
    GUIDEMO_Main();
}

この時点でのコンパイルとダウンロードは正常に実行されます
ここに写真の説明を挿入


総括する

  • EmwinはCRCを有効にする必要があります。私はこの機能を直接使用してCRC状態でドライブしているため、クロックが長時間オンになりませんでした。
  • LCD画面のRESETピンをHighに引き上げる必要があります。ボードを描画するときに、ボードに直接接続されていないピンが吊り下げられ、画面が機能しませんでした。
  • ソフトウェアパッケージにLCDピン構成がない場合は、独自のインターフェイスに従って構成する必要があります
  • emwinライブラリファイルとlibcを開く必要があります

おすすめ

転載: blog.csdn.net/weixin_39137443/article/details/109962978