日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

正点原子STM32F4探索者开发板HAL库TFT LCD屏幕例程移植到STM32CubeMX+CLion

發(fā)布時間:2023/12/14 编程问答 100 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正点原子STM32F4探索者开发板HAL库TFT LCD屏幕例程移植到STM32CubeMX+CLion 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

在學(xué)習(xí)STM32時,跟著教程學(xué)標(biāo)準(zhǔn)庫都是用Keil軟件開發(fā),HAL庫配套的例程也是Keil開發(fā)的, 同時發(fā)現(xiàn)配套例程的HAL庫程序的硬件配置代碼都是自己編寫的,而在網(wǎng)上搜的HAL庫程序都是用STM32CubeMX+Keil編寫的,而這種方法極大的節(jié)省了硬件配置的時間,但是對于Keil的風(fēng)格并不太滿意,于是跟著網(wǎng)上的教程搭了CLion編寫STM32程序的平臺…

正文

首先打開LCD配套例程的lcd.c文件找到發(fā)現(xiàn),有關(guān)FSMC的配置在如下圖所示位置



于是我們便可以根據(jù)例程的配置,用STM32CubeMX配置FSMC,如圖

別忘了還有LCD屏幕的背光引腳,探索者的LCD屏幕背光引腳連接的是PB15,所以在STM32CubeMX也要配置相關(guān)的引腳,如圖


然后新建一個lcd.h和lcd.c

然后將例程中的lcd.h的內(nèi)容(除了引用的頭文件)復(fù)制到我們新建的lcd.h文件中,注意,在CLion中新建的頭文件是自動生成了條件編譯(#ifndef和#endif)的,所以我們只需復(fù)制條件編譯里面的內(nèi)容即可,如圖

復(fù)制完內(nèi)容后我們可以發(fā)現(xiàn)有很多錯誤,沒關(guān)系,這都是沒有定義的數(shù)據(jù)類型而已,接下來我們自己進(jìn)行定義就行了
在我們自己新建的lcd.h文件中添加以下代碼:

#include "stdint.h"typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; typedef volatile u8 vu8; typedef volatile u16 vu16; typedef volatile u32 vu32;

添加完后我們發(fā)現(xiàn),原來的很多個錯誤只剩下一個錯誤,而這個錯誤只需要把extern SRAM_HandleTypeDef TFTSRAM_Handler; 刪了或者注釋了就行了,因?yàn)槲覀冇肧TM32CubeMX配置了FSMC,所以并不需要在lcd.h跟lcd.c里面再定義,然后我們在main.c里面引入lcd.h就可以編譯一下,并編譯通過證明lcd.h這個頭文件就修改好了



接下來我們將例程中的lcd.c的內(nèi)容復(fù)制到我們新建的lcd.c文件中,同樣的不需要把頭文件的引入復(fù)制,錯誤同樣的多,不要緊,我們一步步修改

首先我們引入剛剛修改完的lcd頭文件#include "lcd.h",因?yàn)槲覀円呀?jīng)配置過FSMC了,所以我們要刪除或注釋有關(guān)FSMC配置的代碼,以下是例程中配置FSMC所用到的代碼

SRAM_HandleTypeDef TFTSRAM_Handler;

//SRAM底層驅(qū)動,時鐘使能,引腳分配 //此函數(shù)會被HAL_SRAM_Init()調(diào)用 //hsram:SRAM句柄 void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram) {GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_FSMC_CLK_ENABLE(); //使能FSMC時鐘__HAL_RCC_GPIOD_CLK_ENABLE(); //使能GPIOD時鐘__HAL_RCC_GPIOE_CLK_ENABLE(); //使能GPIOE時鐘__HAL_RCC_GPIOF_CLK_ENABLE(); //使能GPIOF時鐘__HAL_RCC_GPIOG_CLK_ENABLE(); //使能GPIOG時鐘//初始化PD0,1,4,5,8,9,10,14,15GPIO_Initure.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_Initure.Mode=GPIO_MODE_AF_PP; //推挽復(fù)用GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速GPIO_Initure.Alternate=GPIO_AF12_FSMC; //復(fù)用為FSMCHAL_GPIO_Init(GPIOD,&GPIO_Initure); //初始化//初始化PE7,8,9,10,11,12,13,14,15GPIO_Initure.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_Initure);//初始化PF12GPIO_Initure.Pin=GPIO_PIN_12;HAL_GPIO_Init(GPIOF,&GPIO_Initure);//初始化PG12GPIO_Initure.Pin=GPIO_PIN_12;HAL_GPIO_Init(GPIOG,&GPIO_Initure); }

以下代碼在LCD初始化函數(shù)void LCD_Init(void)中,因?yàn)槠聊槐彻庖_我們在STM32CubeMX中已經(jīng)配置過了,所以也注釋了背光引腳的配置

GPIO_InitTypeDef GPIO_Initure;FSMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;FSMC_NORSRAM_TimingTypeDef FSMC_WriteTim;__HAL_RCC_GPIOB_CLK_ENABLE(); //開啟GPIOB時鐘GPIO_Initure.Pin=GPIO_PIN_15; //PB15,背光控制GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽輸出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速HAL_GPIO_Init(GPIOB,&GPIO_Initure);TFTSRAM_Handler.Instance=FSMC_NORSRAM_DEVICE;TFTSRAM_Handler.Extended=FSMC_NORSRAM_EXTENDED_DEVICE;TFTSRAM_Handler.Init.NSBank=FSMC_NORSRAM_BANK4; //使用NE4TFTSRAM_Handler.Init.DataAddressMux=FSMC_DATA_ADDRESS_MUX_DISABLE; //地址/數(shù)據(jù)線不復(fù)用TFTSRAM_Handler.Init.MemoryType=FSMC_MEMORY_TYPE_SRAM; //SRAMTFTSRAM_Handler.Init.MemoryDataWidth=FSMC_NORSRAM_MEM_BUS_WIDTH_16; //16位數(shù)據(jù)寬度TFTSRAM_Handler.Init.BurstAccessMode=FSMC_BURST_ACCESS_MODE_DISABLE; //是否使能突發(fā)訪問,僅對同步突發(fā)存儲器有效,此處未用到TFTSRAM_Handler.Init.WaitSignalPolarity=FSMC_WAIT_SIGNAL_POLARITY_LOW;//等待信號的極性,僅在突發(fā)模式訪問下有用TFTSRAM_Handler.Init.WaitSignalActive=FSMC_WAIT_TIMING_BEFORE_WS; //存儲器是在等待周期之前的一個時鐘周期還是等待周期期間使能NWAITTFTSRAM_Handler.Init.WriteOperation=FSMC_WRITE_OPERATION_ENABLE; //存儲器寫使能TFTSRAM_Handler.Init.WaitSignal=FSMC_WAIT_SIGNAL_DISABLE; //等待使能位,此處未用到TFTSRAM_Handler.Init.ExtendedMode=FSMC_EXTENDED_MODE_ENABLE; //讀寫使用不同的時序TFTSRAM_Handler.Init.AsynchronousWait=FSMC_ASYNCHRONOUS_WAIT_DISABLE;//是否使能同步傳輸模式下的等待信號,此處未用到TFTSRAM_Handler.Init.WriteBurst=FSMC_WRITE_BURST_DISABLE; //禁止突發(fā)寫TFTSRAM_Handler.Init.ContinuousClock=FSMC_CONTINUOUS_CLOCK_SYNC_ASYNC;//FMC讀時序控制寄存器FSMC_ReadWriteTim.AddressSetupTime=0x0F; //地址建立時間(ADDSET)為16個HCLK 1/168M=6ns*16=96nsFSMC_ReadWriteTim.AddressHoldTime=0;FSMC_ReadWriteTim.DataSetupTime=60; //數(shù)據(jù)保存時間為60個HCLK =6*60=360nsFSMC_ReadWriteTim.AccessMode=FSMC_ACCESS_MODE_A;//模式A//FMC寫時序控制寄存器FSMC_WriteTim.BusTurnAroundDuration=0; //總線周轉(zhuǎn)階段持續(xù)時間為0,此變量不賦值的話會莫名其妙的自動修改為4。導(dǎo)致程序運(yùn)行正常FSMC_WriteTim.AddressSetupTime=9; //地址建立時間(ADDSET)為9個HCLK =54nsFSMC_WriteTim.AddressHoldTime=0;FSMC_WriteTim.DataSetupTime=8; //數(shù)據(jù)保存時間為6ns*9個HCLK=54nFSMC_WriteTim.AccessMode=FSMC_ACCESS_MODE_A; //模式AHAL_SRAM_Init(&TFTSRAM_Handler,&FSMC_ReadWriteTim,&FSMC_WriteTim);delay_ms(50); // delay 50 ms

注釋完后我們發(fā)現(xiàn)錯誤僅剩下幾個了

接著我們看一下錯誤描述,并定位到錯誤的位置

我們看到第1個錯誤跟第3,4,5,6,7個錯誤都是跟延時有關(guān)的,我們知道,delay_ms()跟delay_us()是正點(diǎn)原子自己編寫的,獨(dú)自放在SYSTEAM/delay文件夾里面的,我們并沒有引用,而HAL庫自帶了延時函數(shù)HAL_Delay(),注意HAL_Delay()函數(shù)最少延時時間是1ms,而第1個錯誤delay_us(5)是延時5us,我們直接使用HAL_Delay(1)延時1ms代替就行了,剩下的延時函數(shù)錯誤的都是ms級的,直接替換成HAL_Delay()就行了,替換完后發(fā)現(xiàn),延時有關(guān)的函數(shù)還是有問題,不要著急,后面引入相關(guān)的頭文件就行了




然后引入頭文件#include "main.h"后發(fā)現(xiàn),不但HAL_Delay()函數(shù)有關(guān)的錯誤沒有了,FSMC_Bank1E有關(guān)的錯誤也沒有了,因?yàn)檫@兩個錯誤都依賴stm32f4xx_hal.h頭文件,而main.h里面引用了stm32f4xx_hal.h頭文件,所以錯誤就沒有了,當(dāng)然我們也可以直接引用stm32f4xx_hal.h頭文件




而printf()函數(shù)錯誤,我們引入#include "stdio.h"頭文件即可



LCD_LED=1;這個點(diǎn)亮背光代碼錯誤是因?yàn)檎c(diǎn)原子用了宏替換來置位引腳的,我們直接改為
HAL_GPIO_WritePin(LCD_BL_GPIO_Port, LCD_BL_Pin, GPIO_PIN_SET);
就可以直接點(diǎn)亮背光了


最后就剩下字體文件的錯誤了,我們只需要把例程中的font.h文件添加到項(xiàng)目的\Core\Inc文件夾中,并在lcd.c文件中引入#include "font.h"頭文件即可



接著我們編譯一下,編譯通過即完成移植。

最后,我們把例程中的main.c有關(guān)屏幕顯示的代碼復(fù)制到我們的main.c文件中測試

下載燒錄后

總結(jié)

以上是生活随笔為你收集整理的正点原子STM32F4探索者开发板HAL库TFT LCD屏幕例程移植到STM32CubeMX+CLion的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。