目錄
前言
環(huán)境配置
Hello RT-Thread
GPIO輸入與中斷
I2C主機(jī)驅(qū)動
SPI主機(jī)驅(qū)動
ADC設(shè)備驅(qū)動
PWM設(shè)備驅(qū)動
Flash設(shè)備驅(qū)動
WDT設(shè)備驅(qū)動
1 前言
本文說明如何在 RT-Thread 下配置與使用 EK-RA2E2 的板載外設(shè)的BSP驅(qū)動
BSP已被提交PR:https://github.com/RT-Thread/rt-thread/pull/10695
2環(huán)境配置
整個移植過程會用到的幾個工具版本如下,建議使用相同版本,較低版本會出現(xiàn)兼容性問題。
Env 工具版本 :V2.0.0
Arm GNU Toolchain: 13.2
JLink 版本 :V7.7.0
FSP 版本 :V6.0.0
Renesas 的芯片驅(qū)動源碼是通過軟件工具配置生成的,整個板子的移植過程都會使用到RASC這個軟件工具。
下載鏈接:https://github.com/renesas/fsp/releases

注意:
如果要在 MDK 上使用FSP,請參照 rt-thread 的RA系列BSP制作過程.md的如何在 MDK 中打開 FSP,綁定第三方工具RASC。
此次移植過程,筆者主要是以 linux 下的 GNU 環(huán)境進(jìn)行移植,環(huán)境配置過程不再贅述。
3 Hello RT-Thread
EK-RA2E2 的基礎(chǔ)例程默認(rèn)支持MSH,編譯基礎(chǔ)例程并燒錄成功后,可通過串口工具進(jìn)行交互,同時能觀察到LED3紅燈以 1Hz 的頻率閃爍。
SCI_UART使用到的引腳分別是:
TX 為 P101
RX 為 P100
LED3 使用的引腳為:
P015
本次移植也支持了一鍵nano,因為該板子的MCU內(nèi)存空間有限,如果想節(jié)省空間,可以考慮選擇nano。
nano默認(rèn)啟用了MSH,與標(biāo)準(zhǔn)版的基礎(chǔ)例程一致。
4 GPIO輸入與中斷
外部中斷作為一種外設(shè)資源,需要開發(fā)者通過 ICU (interrupt control unit) 進(jìn)行管理 。
下面以 EK-RA2E2 的按鍵SW2為例子,介紹如何配置一個外部中斷。
打開RASC,RASC會通過文件configuration.xml加載板子的配置。
進(jìn)入Pins頁面,找到Interrupt:IC
使能ICU,SW2 連接的引腳為 P205,所以這里 選擇 IRQ1。
進(jìn)入Stacks頁面,通過New Stack中的INPUT找到External IRQ (r_icu)。筆者配置了上升沿,并開啟了數(shù)字濾波,中斷回調(diào)函數(shù)需要寫入irq_callback以支持drv_gpio.c的中斷回調(diào)功能。
開發(fā)者通過使用rt_pin_attach_irq和rt_pin_irq_enable實現(xiàn)中斷注冊和中斷使能。
注意:
通過原理圖和板子可以得知,標(biāo)簽E32表示按鍵和 P205 是開路狀態(tài)。開發(fā)者使用按鍵時,需要通過電阻或錫將兩個焊盤連接。
5 I2C主機(jī)驅(qū)動
EK-RA2E2 有一個 I3C 外設(shè),兼容 I2C
筆者采樣OLED模塊SSD1360作為從設(shè)備,下面介紹如何使用 I2C 驅(qū)動。
打開RASC,點擊進(jìn)入到Pins頁面,找到Conectivity:I3C
SCL : P400
SDA: P401
進(jìn)入Stacks頁面,通過New Stack中的Conectivity找到I2C Master(r_iic_b_master)。中斷回調(diào)函數(shù)修改為i2c_master_callback以支持drv_i2c.c的異步事件功能,數(shù)據(jù)傳輸后驅(qū)動層會通過rt_event_recv來確認(rèn)傳輸是否成功完成。
scons --menuconfig啟用Hardware Drivers Config—>On-Chip Peripheral Drivers—>Enable hardware I2C Bus—>Enable hardware I2C0 Bus
編寫應(yīng)用程序進(jìn)行讀寫功能驗證
注意:
EK-RA2E2 的 I3C 引腳,SCL 和 SDA 沒有掛上拉電阻。如果開發(fā)者在兩腳懸空狀態(tài)下使用 I2C,傳輸函數(shù)會返回錯誤。所以要么和筆者一樣,選取的從設(shè)備模塊自帶上拉;要么先給板子提供上拉,再將從設(shè)備掛到總線上。
6 SPI主機(jī)驅(qū)動
EK-RA2E2有一個 SPI 外設(shè),下面介紹如何使用 SPI 驅(qū)動。
注意:
由于SCI_UART使用了引腳 P101 和 P100 ,兩個外設(shè)引腳沖突,所以開發(fā)者在使用 SPI 時需要將SCI_UART的引腳遷移到別的可用引腳上去。
打開RASC,進(jìn)入Pins頁面,找到Conectivity:SPI。
進(jìn)入Stacks頁面,通過New Stack中的Conectivity找到SPI (r_spi)。中斷回調(diào)函數(shù)修改為spi0_callback以支持drv_spi.c的異步事件功能。RASC 會提示要求開發(fā)者配置中斷優(yōu)先級,配置完中斷優(yōu)先級后請將DTC刪掉,保持與圖中一致。
scons --menuconfig啟用Hardware Drivers Config—>On-Chip Peripheral Drivers—>Enable hardware SPI Bus—>Enable hardware SPI0 Bus
編寫應(yīng)用程序進(jìn)行讀寫功能驗證
注意:
筆者這里展示的 MISO 均為 0xFF,這是因為MISO引腳處于懸空狀態(tài)。筆者已經(jīng)驗證過引腳功能是有效的,開發(fā)者在驗證的時候?qū)⑵渑cMOSI短接,利用日志打印即可。
7 ADC設(shè)備驅(qū)動
ADC 特性:
12-bit A/D Converter,至多8個模擬輸入采樣通道
采樣通道并不連續(xù),支持 5、6、9、10、19、20、21、22
筆者使用了煙霧傳感器,以 Channel9 為例,下面介紹如何進(jìn)行 ADC 采樣 。
打開RASC,進(jìn)入Pins頁面,找到Analog:ADC。啟用 Channel5 、Channel6 、Channel9。
進(jìn)入Stacks頁面,通過New Stack中的Analog找到ADC (r_adc)。配置為continuous scan模式,并勾選上需要采樣的通道。
scons --menuconfig啟用Hardware Drivers Config—>On-Chip Peripheral Drivers—>Enable ADC —> Enable ADC0
由于參考電壓是 3.3V,所以是乘以 3300。此外,若配置的采樣通道為21,則rt_adc_read的第二個參數(shù)應(yīng)為21。
8 PWM設(shè)備驅(qū)動
GPT (General PWM Timer)特性:
一個 16-bit 6通道 的定時器
編號從 GPT4 到 GPT9,每個 GPT 可以控制兩個引腳輸出
在drv_pwm.c中,GPT 的每個通道都是一個設(shè)備實例。例如,使用 GPT4 和 GPT5,就需要創(chuàng)建兩個 PWM 設(shè)備。
以 GPT4 為例,下面介紹如何通過 GPT 產(chǎn)生 PWM 。
打開RASC,進(jìn)入Pins頁面,找到Timers:GPT。配置兩個引腳一起工作。
進(jìn)入Stacks頁面,通過New Stack中的Timer找到Timer, General PWM(r_gpt)。修改 timer4 和 channel4,然后啟用Pin Output Support,最后使能兩個引腳輸出。
scons --menuconfig啟用Hardware Drivers Config—>On-Chip Peripheral Drivers—>Enable PWM—>Enable GPT4
編寫應(yīng)用程序驗證 PWM 功能
9 Flash設(shè)備驅(qū)動
EK-RA2E2 能提供至多 64KB 的Code Flash內(nèi)存 和 2KBData Flash內(nèi)存,但實際在使用Code Flash的時候達(dá)不到這個理論值。
從文檔《RA2E2-Group-Hardware》的Option-Setting Memory一節(jié)可知
0x00000400 到0x0000043B 被分配給了OFS1,OFS2 和 Security MPU
Code Flash從0x00000440 開始,到 0x00010000 結(jié)束
Data Flash從0x40100000 開始,到 0x40100800 結(jié)束
本次移植筆者支持了Code Flash的讀寫操作,下面筆者將通過 fal 抽象層演示 EK-RA2E2 的 flash 設(shè)備驅(qū)動。
打開RASC,進(jìn)入Stacks頁面,通過New Stack中的Storage找到flash (r_flash_lp),使能Code Flash
中斷函數(shù)名需要填寫flash_callback,這個函數(shù)沒有實際意義。因為在驅(qū)動層操作 flash 的過程中,都會暫時的禁止中斷。
scons --menuconfig啟用Hardware Drivers Config—>On-Chip Peripheral Drivers—>Enable Onchip FLASH
drv_flash.c中實現(xiàn)的函數(shù)允許開發(fā)者直接調(diào)用,也可以通過 fal 抽象層進(jìn)行分區(qū)管理。
從 app 起始地址讀取 16 字節(jié),并與編譯出的hex文件進(jìn)行比較
從 app 起始地址偏移 0xF000 字節(jié),進(jìn)行 16 字節(jié)讀寫驗證
10 WDT設(shè)備驅(qū)動
啟用驅(qū)動的步驟與前面如出一轍,不再贅述。
因為驅(qū)動的配置都是圍繞著時鐘頻率和計數(shù)次數(shù),而不能直觀知道多久不喂狗會造成復(fù)位,所以這里筆者重點解釋如何計算 WDT 的超時時間。
WDT特性:
14-bit 的向下計數(shù)計時器
由 PCLKB 提供時鐘
計數(shù)溢出時會產(chǎn)生 NMI (不可屏蔽中斷),并造成系統(tǒng)復(fù)位
計算 WDT 超時時間:
PCLKB 可以在RASC的clock頁面查到,默認(rèn)為 24 MHz
時鐘分頻默認(rèn) 8192,即工作頻率為 PCLKB/8192
timeout 為 16384 cycles,即計數(shù) 16384 次后會造成復(fù)位
WDT 的工作頻率為f=24 MHz/8192 ≈ 2929.6875 KHz
計數(shù)一次要花的時間為t= 1 /f= 1 / 2929.6875 ≈ 341.333 us
超時時間為T= 341.333 us * 16384 cycles ≈ 5.5 s
-
移植
+關(guān)注
關(guān)注
1文章
406瀏覽量
29046 -
設(shè)備驅(qū)動
+關(guān)注
關(guān)注
0文章
69瀏覽量
11244 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1496瀏覽量
43465
發(fā)布評論請先 登錄
RT-Thread Nano硬核移植指南:手把手實現(xiàn)VGLite圖形驅(qū)動適配 | 技術(shù)集結(jié)

移植RT-Thread的原理與方法
RT-Thread Studio驅(qū)動SD卡

基于 Keil MDK 移植 RT-Thread Nano

RT-Thread全球技術(shù)大會:關(guān)于瑞薩RA2L1-CPK低功耗CPU演示

評論