本人初學STM32F1系列單片機,打算上手HAL庫,應大四學長之約在寒假製作一個音樂播放器(MP3)。STM32F103RCT6是學長選的MCU型號,本來想著自己畫板子,但是晶元管腳太細不好焊接就放棄了。最終在某寶上找到了一款STM入手的開發板。但是商家提供的LCD驅動(LCD使用硬體SPI介面,具 ...
本人初學STM32F1系列單片機,打算上手HAL庫,應大四學長之約在寒假製作一個音樂播放器(MP3)。STM32F103RCT6是學長選的MCU型號,本來想著自己畫板子,但是晶元管腳太細不好焊接就放棄了。最終在某寶上找到了一款STM入手的開發板。但是商家提供的LCD驅動(LCD使用硬體SPI介面,具體接在SPI2上)是建立在標準庫之上的,無法直接使用。嘗試了一下將HAL庫和標準庫合併,發現兩個庫文件並不相容。這就需要對LCD驅動進行移植才能使用HAL庫。搗鼓了三天(因為我的C語言實在是沒什麼基礎),摸索出來HAL庫最基本的用法,總算是移植成功了。實際上修改的地方並不多,現將修改的地方說明如下:
lcd.c
首先要刪除#include "delay.h" ,因為HAL庫自帶一個延時函數HAL_Delay(),沒有必要再定義一個延時函數。同時替換所有的delay_ms()為HAL_Delay()。
然後便是要刪除函數void SPI2_Init(void),這個函數是用於配置SPI2介面和需要用到的GPIO的,但是標準庫與HAL庫函數介面不同,故不再適用。
刪除以後,SPI2以及GPIO的初始化可以交付給STM32CubeMX進行配置,具體操作方法如下:
首先新建一個STM32Cube工程,選擇晶元型號為STM32F103RCTx
這個軟體有個坑,預設配置是不開啟調試功能的!!如果你使用J-Link或ST-Link,預設設置下會導致下載一次後無法調試或下載。
正確的配置方式在SYS設置中開啟調試功能的!!!
如果不慎沒有開啟調試功能,Under Reset模式下擦寫即可
進行RCC設置
開啟SPI2模塊(全雙工模式)
查看開發板原理圖得知PB12作為LCD的片選信號引腳,PC6作為寄存器/數據選擇信號引腳,故需設置PB12,PC6為輸出
切換選項卡至"Clock Configuration",配置時鐘,只需修改系統時鐘為72MHz即可。
切換選項卡至"Configuration",配置GPIO及SPI2。
GPIO的配置
SPI2的配置預設即可
功耗計算可以先不用關心,點擊保存項目,選擇合適的位置。保存完成後按住Crtl+Shift+G生成代碼。
初始化代碼修改完成後接著修改驅動中的其他函數
讀寫一個位元組的函數
1 u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte)
2 {
3 while((SPIx->SR&SPI_I2S_FLAG_TXE)==RESET); //等待發送區空
4 SPIx->DR=Byte; //發送一個byte
5 while((SPIx->SR&SPI_I2S_FLAG_RXNE)==RESET);//等待接收完一個byte
6 return SPIx->DR; //返回收到的數據
7 }
這裡引用的均是標準庫內的定義,在HAL庫中是找不到的,需要修改如下
1 u8 LCD_WriteByte(u8 Byte) 2 { 3 u8 Rxdata; 4 HAL_SPI_TransmitReceive(&hspi2,&Byte,&Rxdata,1, 1000); 5 return Rxdata; //返回收到的數據 6 }
下一步需要修改的是lcd.h文件
lcd.h
1 #define LCD_CTRL GPIOB //定義TFT數據埠 2 #define LCD_CTRL2 GPIOC //定義TFT數據埠 3 #define LCD_RS GPIO_Pin_6 //PB1連接至TFT --RS 4 #define LCD_CS GPIO_Pin_12 //PB11 連接至TFT --CS 5 //#define LCD_RST GPIO_Pin_12 //PB12連接至TFT --RST 6 #define LCD_SCL GPIO_Pin_13 //PB13連接至TFT -- CLK 7 #define LCD_SDA GPIO_Pin_15 //PB15連接至TFT - SDI
這部分需要將GPIO_Pin_X均改為大寫,即GPIO_PIN_X,其他無需變動。
另外一點需要註意的是標準庫中u8,u16,u32的定義存放在stm32f10x.h中,我沒有找到HAL庫中相似的定義,所以就自己寫了個頭文件,include在需要定義u8等的文件內(如果你有更好的方法請通過評論告知我,謝謝)。
1 #ifndef __SIGN_H_ 2 #define __SIGN_H_ 3 4 typedef signed char int8_t; 5 typedef signed short int int16_t; 6 typedef signed int int32_t; 7 typedef signed __int64 int64_t; 8 /* exact-width unsigned integer types */ 9 typedef unsigned char uint8_t; 10 typedef unsigned short int uint16_t; 11 typedef unsigned int uint32_t; 12 typedef unsigned __int64 uint64_t; 13 typedef int32_t s32; 14 typedef int16_t s16; 15 typedef int8_t s8; 16 typedef uint32_t u32; 17 typedef uint16_t u16; 18 typedef uint8_t u8; 19 20 #endif
至此,LCD驅動的移植已經完成了,主要修改的都是一些標準庫與HAL庫巨集定義不相同的地方。一點感受就是使用STM32CubeMX可以省去很多修改初始化代碼的工作,同時也利於維護。設備的初始化不應當出現在驅動里,而是應當交由STM32CubeMX在main.c中進行初始化。這樣做以後,如果遇到需要修改初始化參數的地方,只需要打開STM32CubeMX重新配置即可,而不會影響用戶以及驅動的代碼。另外一點感受就是keil的分組可以設置一個新的Drivers/User組以與Drivers/STM32F1xx_HAL_Driver區分,同樣也利於維護。
最後附一張沒怎麼上GUI的圖,算是成功驅動了吧。