第8章自己寫庫——構(gòu)建庫函數(shù)雛形
實(shí)際上,構(gòu)建固件庫是一件費(fèi)時(shí)費(fèi)力的事情,并且它對(duì)開發(fā)者對(duì)芯片的熟悉程度有一定的要求。甚至,當(dāng)一個(gè)固件庫的封裝程度很高時(shí),想要閱讀并理解該固件庫的底層代碼也會(huì)變成一件有較高難度的事情。瑞薩RA系列單片機(jī)所使用的官方FSP庫便是這樣的一種封裝程度很高的固件庫。所幸的是,F(xiàn)SP庫的意義在于為開發(fā)者封裝硬件底層,因此一般而言,F(xiàn)SP庫是帶來方便的,開發(fā)者只需學(xué)會(huì)如何使用FSP庫即可,而不用深入到FSP庫的底層細(xì)節(jié)。
構(gòu)建固件庫一般是由芯片廠商來做,比如FSP庫就是由瑞薩官方構(gòu)建和維護(hù)的。為了讓讀者更加清晰地了解到固件庫的作用,我們接下來將會(huì)說明一種構(gòu)建一個(gè)封裝程度較低的固件庫的思路。值得注意的是,本章所構(gòu)建的庫函數(shù)雛形與實(shí)際上的FSP庫有很大區(qū)別,但求這對(duì)讀者理解和使用FSP庫有所幫助。
8.1硬件設(shè)計(jì)
野火啟明6M5開發(fā)板的LED電路圖如圖所示。
野火啟明4M2開發(fā)板的LED電路圖下圖所示。
野火啟明2L1開發(fā)板的LED電路圖下圖所示。
8.2軟件設(shè)計(jì)
8.2.1新建工程
對(duì)于e2studio開發(fā)環(huán)境:拷貝一份我們之前新建的e2s工程模板“05_Template”,然后將工程文件夾重命名為“09_Register_MyLib”,最后再將它導(dǎo)入到我們的e2studio工作空間中。
對(duì)于Keil開發(fā)環(huán)境:拷貝一份我們之前新建的Keil工程模板“06_Template”,然后將工程文件夾重命名為“09_Register_MyLib”,并進(jìn)入該文件夾里面雙擊Keil工程文件,打開該工程。
工程新建好之后,在工程根目錄的“src”文件夾下面新建“ioport”文件夾,再進(jìn)入“ioport”文件夾里面新建ioport驅(qū)動(dòng)的源文件和頭文件:“ra_ioport.c”和“ra_ioport.h”。工程文件結(jié)構(gòu)如下。
列表1:文件結(jié)構(gòu)
左右滑動(dòng)查看完整內(nèi)容
09_Register_MyLib ├─ ...... └─src ├─ ioport │ ├─ ra_ioport.c │ └─ ra_ioport.h └─ hal_entry.c
警告
注意:對(duì)于使用Keil開發(fā)環(huán)境的用戶,將代碼文件放到“src”文件夾下之后,Keil軟件并不會(huì)自動(dòng)將它們加入到工程,這時(shí)候需要打開RASC FSP配置界面,點(diǎn)擊一次單擊右上角的“Generate Project Content”按鈕,從而“src”文件夾下的代碼文件就會(huì)被自動(dòng)加入進(jìn)工程中。接著關(guān)閉FSP配置界面返回到Keil,然后進(jìn)行一次編譯后會(huì)彈出一個(gè)提示框提示工程結(jié)構(gòu)發(fā)生了變化,點(diǎn)擊確定即可。對(duì)于使用e2studio的用戶則不需要如此。
8.2.2包含寄存器定義的頭文件
在ra_ioport.h中通過包含“hal_data.h”頭文件來間接包含寄存器定義頭文件:R7FA6M5BH.h或R7FA4M2AD.h或R7FA2L1AB.h。
列表2:代碼清單8-1:ra_ioport.h
左右滑動(dòng)查看完整內(nèi)容
#include"hal_data.h"http://間接包含了頭文件 "R7FA6M5BH.h" / "R7FA4M2AD.h" / →"R7FA2L1AB.h"
8.2.3端口和引腳號(hào)的枚舉類型定義
我們需要定義端口和引腳號(hào)的枚舉類型,用來表示某個(gè)要操控的某個(gè)引腳。但是如果像:“BSP_IO_PORT_04_PIN_00”、“BSP_IO_PORT_04_PIN_03”和“BSP_IO_PORT_04_PIN_04”
這樣定義端口和引腳號(hào)的枚舉類型,會(huì)造成與FSP庫中的枚舉定義沖突,因此我們暫時(shí)把端口和引腳號(hào)分開出來單獨(dú)定義。
列表3:代碼清單8-2:ra_ioport.h文件
左右滑動(dòng)查看完整內(nèi)容
/* IOPORT 端口定義 */ typedefenumio_port { IO_PORT_00 = 0x0000, ///< IO port?0 IO_PORT_01 =?0x0100,?///< IO port 1 IO_PORT_02 = 0x0200, ///< IO port?2 IO_PORT_03 =?0x0300,?///< IO port 3 IO_PORT_04 = 0x0400, ///< IO port?4 IO_PORT_05 =?0x0500,?///< IO port 5 IO_PORT_06 = 0x0600, ///< IO port?6 IO_PORT_07 =?0x0700,?///< IO port 7 IO_PORT_08 = 0x0800, ///< IO port?8 IO_PORT_09 =?0x0900,?///< IO port 9 IO_PORT_10 = 0x0A00, ///< IO port?10 IO_PORT_11 =?0x0B00,?///< IO port 11 IO_PORT_12 = 0x0C00, ///< IO port?12 IO_PORT_13 =?0x0D00,?///< IO port 13 IO_PORT_14 = 0x0E00, ///< IO port?14 } IO_Port_t; /* IOPORT 引腳定義 */ typedefenumio_pin { IO_PIN_00?=?0x0000,?///< IO port 0 pin 0 IO_PIN_01 = 0x0001, ///< IO port?0?pin?1 IO_PIN_02 =?0x0002,?///< IO port 0 pin 2 IO_PIN_03 = 0x0003, ///< IO port?0?pin?3 IO_PIN_04 =?0x0004,?///< IO port 0 pin 4 IO_PIN_05 = 0x0005, ///< IO port?0?pin?5 IO_PIN_06 =?0x0006,?///< IO port 0 pin 6 IO_PIN_07 = 0x0007, ///< IO port?0?pin?7 IO_PIN_08 =?0x0008,?///< IO port 0 pin 8 IO_PIN_09 = 0x0009, ///< IO port?0?pin?9 IO_PIN_10?=?0x000A,?///< IO port 0 pin 10 IO_PIN_11 = 0x000B, ///< IO port?0?pin?11 IO_PIN_12 =?0x000C,?///< IO port 0 pin 12 IO_PIN_13 = 0x000D, ///< IO port?0?pin?13 IO_PIN_14 =?0x000E,?///< IO port 0 pin 14 IO_PIN_15 = 0x000F, ///< IO port?0?pin?15 } IO_Pin_t;
8.2.4IOPORT相關(guān)功能的枚舉類型定義
接著定義IOPORT相關(guān)功能的枚舉類型,這里的每一個(gè)枚舉類型都對(duì)應(yīng)著IOPORT的其中一項(xiàng)功能配置。
列表4:代碼清單8-3:ra_ioport.h文件
左右滑動(dòng)查看完整內(nèi)容
/* IO 引腳模式 */ typedefenum { IO_MODE_GPIO=0,/* 普通 GPIO 功能 */ IO_MODE_AF=1,/* 復(fù)用功能 */ IO_MODE_AN=2/* 模擬輸入輸出功能 */ } IO_Mode_t; /* IO 引腳方向 */ typedefenum { IO_DIR_INPUT=0,// 引腳用作 GPIO 輸入功能 IO_DIR_OUTPUT=1// 引腳用作 GPIO 輸出功能 } IO_Dir_t; /* IO 引腳輸出類型 */ typedefenum { IO_OTYPE_PP=0x00,/* 推挽模式 */ IO_OTYPE_OD=0x01/* 開漏模式 */ } IO_OType_t; /* IO 引腳輸出能力 */ typedefenum { IO_DRIVE_LOW=0,// Low drive IO_DRIVE_MIDDLE=1,// Middle drive IO_DRIVE_HSHD=2,// High-speed high-drive IO_DRIVE_HIGH=3// High drive } IO_DriveCapability_t; /* IO 引腳輸出電平 */ typedefenumio_level { IO_LEVEL_LOW=0,// Low IO_LEVEL_HIGH// High } IO_Level_t; /* IO 引腳輸入上下拉 */ typedefenum { IO_NO_PULL= 0x00u,/* 浮空輸入 */ IO_PULL_UP= 0x01u,/* 上拉輸入 */ //IO_PULL_DOWN = 0x02u /* RA6M5/RA4M2/RA2L1 引腳沒有下拉功能 */ } IO_Pull_t;
-
瑞薩
+關(guān)注
關(guān)注
36文章
22375瀏覽量
87832 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4374瀏覽量
64379 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5583瀏覽量
103041
原文標(biāo)題:自己寫庫:構(gòu)建庫函數(shù)雛形——瑞薩RA系列FSP庫開發(fā)實(shí)戰(zhàn)指南(20)
文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
用TIM的PWM輸出模式寫一個(gè)步進(jìn)電機(jī)的Stepper庫函數(shù)

單片機(jī)庫函數(shù)有哪些
【野火啟明6M5開發(fā)板體驗(yàn)】開箱+認(rèn)識(shí)開發(fā)板+資料
高中生自己寫的STC8A8K64S4A12(8051)單片機(jī)庫函數(shù)分享

從自定義的庫函數(shù)到STM32官方標(biāo)準(zhǔn)庫

IAR中將部分文件編譯成庫函數(shù).a及如何調(diào)用庫函數(shù)

【STM32】標(biāo)準(zhǔn)庫與HAL庫對(duì)照學(xué)習(xí)教程三--使用庫函數(shù)配置GPIO點(diǎn)亮LED燈

stm32下標(biāo)準(zhǔn)庫函數(shù)與HAL庫函數(shù)編程方式的差異

關(guān)于STM32庫函數(shù)手動(dòng)添加時(shí)鐘問題。

基于標(biāo)準(zhǔn)庫函數(shù)與基于HAL庫函數(shù)的stm32編程方式對(duì)比

評(píng)論