【利用STM32F103RCT6/HAL庫製作音樂播放器】標準庫LCD驅動移植

来源:https://www.cnblogs.com/chalkim/archive/2018/02/04/8411989.html
-Advertisement-
Play Games

本人初學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的圖,算是成功驅動了吧。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 回到目錄 路由首碼就是我們所說的api/values里的api,這裡的api可以用其它具體含義的字元表示,如Shop,Order,Game,它可以表示一個個模塊,這一般在單體架構里;也可以是一個個小服務,這一般在微服務架構里. 對於基於微服務的設計理念里,我們每個模塊都成了一個網站,一個服務,它們的 ...
  • BaiduDiskSearcher 用C#編寫的百度網盤搜索工具(.NET4.0 & Visual Studio 2017) 功能 1、搜索任意名稱的百度網盤共用文件 2、可以打開或複製網盤地址及分享者主頁; 3、可以導出搜索結果。 界面 源代碼: 註: 1、軟體代碼為原創,如需轉載,請註明出處; ...
  • 因為有一個小工具需要和其它的業務對接數據,所以就試一下看能不能弄一個無需配置快速對接的方法出來,百(以)度(訛)過(傳)後(訛),最後還是對照wcf配置對象調試出來了: 1.創建WebHttpBinding 2.添加ServiceMetadataBehavior 3.獲取一個serverendpoi ...
  • 實例產品基於asp.net mvc 5.0框架,源碼下載地址:http://www.jinhusns.com/Products/Download 我們註意到地址欄的URL是Home/Index 路由可以指定它的URL及其預設值,還可以約束URL的各個部分我們在新建的應用程式中的Global.asax ...
  • Controller是MVC中比較重要的一部分。幾乎所有的業務邏輯都是在這裡進行處理的,並且從Model中取出數據。在ASP.NET MVC Preview5中,將原來的Controller類一分為二,分為了Controller類和ControllerBase類。Controller類繼承自Cont ...
  • 配置文件中紅色標註是必填項。 ...
  • 在場景中除預設camera和light外,添加cube物體,並掛載腳本。 值得註意的是ScreenToWorldPoint方法並未給z軸進行賦值所以需要自己給z軸賦值。v.z並不是cube的z軸而是攝像機和cube的距離。 效果圖: ...
  • 本文介紹Linux環境安裝Nginx,這裡用的Linux系統是CentOS 7.2. 1. 從Nginx官網下載Nginx。這裡用的版本為:1.13.6. 2. 將下載下來的Nginx上傳到Linux上,這裡以/opt/nginx目錄為例。運行“tar -zxvf nginx-1.13.6.tar. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...