在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

rt-thread 驅動篇(七)GPIO驅動

出出 ? 來源:出出 ? 作者:出出 ? 2022-06-13 09:48 ? 次閱讀

前言

一提 GPIO 可能會讓很多人覺得不屑,這么簡單的東西有什么可說的,也就是一個拉低拉高,誰不會呢。

今天我們不講推挽開漏、不提上拉下拉。大家來頭腦風暴一下 GPIO 相關的幾個問題。筆者說的不一定對,僅代表個人的一點兒小想法。

提出兩個問題

有兩個問題,需要考慮一下:
1. pin 設備驅動框架存在的必要性。
2. gpio 底層驅動使用官方提供的 api 還是直接寄存器操作?

單片機里,pin 引腳操作往往很簡單,寫一個寄存器就成。但是在一個操作系統里,為了方便移植、便于閱讀,對 pin 進行封裝,在不同芯片上使用同一套 api 也還是有必要的。而這也正是一個操作系統的職責之一。

第二個問題,留著大家自己想吧。

pin 驅動框架

我們大家都知道,在我們使用 pin 的時候,沒有誰先用 `rt_device_find` 查找 pin 設備,然后使用用 `rt_device_open` `rt_device_read` `rt_device_write` 去控制芯片引腳。而都是直接調用的 `rt_pin_xxx` c 函數簇。

pin 驅動框架,先把所有的 gpio 看作一個設備進行注冊,然后提供了三個 `rt_pin_mode` `rt_pin_read` `rt_pin_write` c 函數,而不是 `rt_device_xxx` api 去訪問某個 pin。
`rt_pin_mode` `rt_pin_read` `rt_pin_write` 這一套函數,可以不用考慮當前使用的是什么芯片,不用考慮芯片廠商提供的外設驅動庫 api 是怎么寫的。但是,真的是這樣嗎?

可以把驅動框架刪掉,`rt_pin_xxx` 函數直接對接底層驅動嗎?

當筆者閱讀模擬 iic 驅動源碼時,看到在控制 SCL SDA 高低電平切換時使用的 `rt_pin_write` 操作,一時間腦子一陣暈眩。為什么?我們先捋順一下拉低 SDA 的函數調用過程。

以 `SDA_L` 為例
1. `SDA_L` 宏是 `ops->set_sda(ops->data, val)` 通過操作符指針調用底層接口
2. `set_sda` 調用 `rt_pin_write`
3. `rt_pin_write` 通過 pin 設備執行 `_hw_pin.ops->pin_write` 調用的 pin 底層接口
4. 在 stm32 平臺上 `_hw_pin.ops->pin_write` 等于調用 `stm32_pin_write` 函數
5. `stm32_pin_write` 調用 `HAL_GPIO_WritePin`
6. `HAL_GPIO_WritePin` 函數寫寄存器。

彎彎繞繞,想控制 pin 引腳電平變化還真是煞費苦心了。

可以壓縮上述調用過程嗎?
`SDA_L` 宏直接定義調用 `stm32_pin_write` ,`stm32_pin_write` 內部直接操作寄存器。

soft iic 驅動

軟件模擬 iic 驅動需要軟件代碼控制 SCL SDA 兩根線時序,如前所述,拉低 SDA 線的過程被繁冗化了。

裸機能達到的 iic 時鐘速度,在使用 rt-thread 的模擬 iic 時根本達不到,在多級指針和函數調用過程中,效率被極大降低了。

有沒有一種策略,使 `SDA_L` 宏直接定義成 `stm32_pin_write` 或者 `gd32_pin_write` 等等。

筆者嘗試把 i2c-bit-ops.c 文件和 drv_soft_i2c.c 兩個文件進行合并,省掉了一級 `struct rt_i2c_bit_ops`,然后 `SDA_L` 也不使用 `rt_pin_write` 又跳過了多次指針調用。目前感覺良好。

GET_PIN

有哪位能告訴大家, `rt_pin_write(17, PIN_HIGH)` 這句代碼有明確的語義嗎?

函數調用中的第一個參數值 “17” 表示了什么?
可能啥也不代表。
首先,它肯定不是芯片引腳編號。
大多數芯片,GPIO 編碼采用的類似如下方式:
- 以端口編碼,一顆芯片上的 GPIO 可以分成若干個端口,用字母 A B C ... 命名(也有 1 2 3 編號命名的,比如 RA6M4)。我們稱之為 PA PB PC ...
- 每個端口有8/16個 io 。分別編碼 0-7 或者 0-15。有些芯片上的某個端口只有 15 個 io ,那就只有 0-14 有效。我們稱之為 PA0 PA15

為了不使用魔數 “17” ,這種模棱兩可,含義不明的寫法,rt-thread 針對每種芯片要求定義一個 `GET_PIN` 宏,它可以從一種直觀的引腳編號寫法中返回一個數字。比如 `GET_PIN(G, 1)` 的結果是 97。

使用 `GET_PIN` `rt_pin_write(17, PIN_HIGH)` 可以寫成 `rt_pin_write(GET_PIN(B, 1), PIN_HIGH)` ,這樣是不是更直觀了?

但是,有一種情況,不允許我們用 `GET_PIN` 。那就是在 menuconfig 或者 RT-Studio 的 Settings 里配置模擬 iic 兩個引腳號的時候。它只支持輸入數字,這個時候我們必須知道 `GET_PIN` 的數學含義,心算把 `GET_PIN(B, 1)` 轉成 17 。

`GET_PIN` 的數學含義是確定的嗎?是放之四海而皆準的嗎?在每一款芯片上可以使用同一個數學公式演算嗎?

**這個可以是,但實際卻不是**。

另類的 AB32 RA6M4 N32

我們仍然以 17 這個編號為例,下面來看看 AB32 RA6M4 上面它分別代表哪個 GPIO 。

AB32 上應該是 PE4。
AB32 版 `GET_PIN` 是這樣的:

#define __AB32_PORT(port)   GPIO##port
#define __AB32_GET_PIN_A(PIN)  PIN
#define __AB32_GET_PIN_B(PIN)  8 + PIN
#define __AB32_GET_PIN_E(PIN)  13 + PIN
#define __AB32_GET_PIN_F(PIN)  21 + PIN

幾個端口不通用,各自為戰

RA6M4 上不存在。因為 RA6M4 的 P100 對應的是 256 ;P015 對應的是 15 。沒有 17 這個編號。
AB32 版 `GET_PIN` 未實現。

還有 N32,上面筆者說了句“它肯定不是芯片引腳編號”。但是,我又發現在 N32 的drv_gpio.c 中,定義成了芯片引腳號。打臉了...
N32 版 `GET_PIN` 也未實現。

還有其它芯片是上述三種情況之外的嗎?歡迎大家講出來。

明確的應用層語義

不失一般性,假設可能存在某芯片端口編號不是連續的,中間缺失端口B。同時端口 A 也只有 12 個 io。我們把所有的端口和 io 進行排序編號。PA0 是 0 號、PA1 是 1 號 ... PA11 是 11 號。那么,PC0 編號是多少?12嗎?

假如有一同系列芯片,它是有端口 B 的。那么 PB0 編號該定義成多少合適呢?也是 12 嗎?

> 或者,干脆我們就假定所有的芯片端口都是連續無缺失的,每個端口也是滿滿當當 16 個 io 。這樣 PB0 總是 16,PC0 總是 32。

從理論上講,所有的芯片 gpio 編號系統是可以用一個公式實現的,這個公式可以在 rt-thread 使用寶典(2022-0516更新)中找到。

RA6M4 上,應用程序層可以使用 17 表示 P101,因為它的端口編號從 0 開始;
N32 上,應用程序層可以使用 17 表示 PB01,因為它的端口編號從 A 開始;
STM32 上,應用程序層可以使用 17 表示 PB01,因為它的端口編號從 A 開始;
AB32 上,應用程序層可以使用 17 表示 PB01,因為它的端口編號從 A 開始

無論用的哪家芯片,無論是哪個系列芯片,無論是哪款型號,它有多少引腳。我們希望 17 這個值能對應一個明確的引腳名。不會因為某系列芯片中某子型號因為其中某個端口 io 數量少一個導致后面所有 io 的編號都變了。又或者同樣的 PB01 在不同子型號不同封裝下的編號也不一樣。

結束語

大家有什么意見和想法,一塊兒聊聊啊。

> 把不同芯片的差異性進行封裝,提供給應用層語義明確的接口,是一個操作系統的職責之一。
復雜事情簡單化,簡單的事情保留那一點兒純粹。這也是封裝的基本原則。
寫應用程序代碼時,我們不想關心底層的實現,這是另一個操作系統的職責之一。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • GPIO
    +關注

    關注

    16

    文章

    1213

    瀏覽量

    52210
  • PIN
    PIN
    +關注

    關注

    1

    文章

    305

    瀏覽量

    24351
  • RT-Thread
    +關注

    關注

    31

    文章

    1299

    瀏覽量

    40263
  • 驅動框架
    +關注

    關注

    0

    文章

    14

    瀏覽量

    4069
收藏 人收藏

    評論

    相關推薦

    RT-Thread NUC97x 移植 LVGL

    不涉及 rt-thread 驅動,但是它是 LVGL 和 rt-thread 的接口。LVGL 在 rt-thread 上運行的基石。
    發表于 07-08 09:37 ?1500次閱讀

    基于RT-Thread的SPI通訊

    驅動層的驅動。(rt-thread的設備 I/O 模型有設備管理層、設備驅動框架層、設備驅動層),我寫過一
    的頭像 發表于 08-22 09:28 ?1744次閱讀

    RT-Thread ssd1306驅動

    RT-Thread 驅動ssd1306
    的頭像 發表于 04-21 10:08 ?26.5w次閱讀
    <b class='flag-5'>RT-Thread</b> ssd1306<b class='flag-5'>驅動</b>

    RT-Thread設備驅動開發指南基礎—以先楫bsp的hwtimer設備為例

    RT-Thread設備驅動開發指南》書籍是RT-thread官方出品撰寫,系統講解RT-thread IO設備驅動開發方法,從三方面進行講解
    的頭像 發表于 02-20 16:01 ?1754次閱讀
    <b class='flag-5'>RT-Thread</b>設備<b class='flag-5'>驅動</b>開發指南基礎<b class='flag-5'>篇</b>—以先楫bsp的hwtimer設備為例

    RT-Thread驅動開發指南進階-動手驅動先楫未適配的外設LCD

    經過上一的《《RT-Thread設備驅動開發指南》基礎--以先楫bsp的hwtimer設備為例》闡述,可以大致了解到RT-thread
    的頭像 發表于 02-25 11:04 ?2671次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>驅動</b>開發指南進階<b class='flag-5'>篇</b>-動手<b class='flag-5'>驅動</b>先楫未適配的外設LCD

    【原創精選】RT-Thread征文精選技術文章合集

    rt-thread 驅動(六)serialX弊端及解決方法rt-thread 驅動
    發表于 07-26 14:56

    如何在RT-Thread中使用通用GPIO設備驅動從而操作GPIO

    摘要本應用筆記描述了如何使用 RT-Thread 的通用 GPIO 設備驅動,包括驅動的配置、相關 API 的應用。并給出了在正點原子 STM32F4 探索者開發板上驗證的代碼示例。本
    發表于 10-25 11:17

    RT-Thread上的CAN總線介紹以及驅動編寫

    昨晚很榮幸邀請到李工在RT-Thread微信群進行RT-Thread上的CAN驅動和應用講座。小編整理了講座內容,特發出講義以供享用。
    的頭像 發表于 09-25 10:16 ?2.4w次閱讀

    簡要分析Thread的通用GPIO設備驅動

    為了給用戶提供操作GPIO的通用API,方便應用程序開發,RT-Thread中引入了通用GPIO設備驅動。并提供類似Arduino風格的API用于操作
    發表于 11-13 14:57 ?1500次閱讀

    RT-Thread Studio驅動SD卡

    RT-Thread Studio驅動SD卡前言一、創建基本工程1、創建Bootloader2、創建項目工程二、配置RT-Thread Settings三、代碼分析1.引入庫2.讀入數據四、效果驗證
    發表于 12-27 19:13 ?20次下載
    <b class='flag-5'>RT-Thread</b> Studio<b class='flag-5'>驅動</b>SD卡

    RT-Thread開源作品秀】基于RT-Thread的星務平臺研究

    本作品為了驗證星務軟件在RT-Thread系統運行的可行性,底層是否能夠驅動星務軟件,同時擴展RT-Thread應用范圍。ART-Pi作為衛星下位機,...
    發表于 01-25 18:26 ?6次下載
    【<b class='flag-5'>RT-Thread</b>開源作品秀】基于<b class='flag-5'>RT-Thread</b>的星務平臺研究

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread設備驅動開發指南》基礎--以先楫bsp的hwtimer設備為例

    一、概述(一)RT-Thread設備驅動RT-Thread設備驅動開發指南》書籍是RT-thread官方出品撰寫,系統講解
    的頭像 發表于 02-24 08:16 ?1736次閱讀
    《<b class='flag-5'>RT-Thread</b>設備<b class='flag-5'>驅動</b>開發指南》基礎<b class='flag-5'>篇</b>--以先楫bsp的hwtimer設備為例

    【好書推薦】RT-Thread設備驅動開發指南

    近年來國內芯片產業和物聯網產業的快速崛起,行業發展迫切需要更多人才,尤其需要掌握嵌入式操作系統等底層技術的人才。隨著RT-Thread被更廣泛地應用于行業中,開發者對嵌入式驅動開發的需求越來越
    的頭像 發表于 08-01 08:35 ?675次閱讀
    【好書推薦】<b class='flag-5'>RT-Thread</b>設備<b class='flag-5'>驅動</b>開發指南
    主站蜘蛛池模板: 7777在线| 日日夜夜精品| 黄视频福利| 久久久久国产精品免费免费不卡| 看看一级毛片| 国产资源站| 在线观看免费视频资源| 天天操天天干天天拍| 国产午夜剧场| 黄色国产网站| 精品一区二区国语对白| 一个色亚洲| 色多多在线观看播放| 久久国产精品亚洲综合| www.91在线播放| 色综合久久88| 亚洲性夜| 国产内地激情精品毛片在线一| 亚洲合集综合久久性色 | 天天伊人网| 九九热免费观看| h视频免费观看| 最新版天堂资源中文官网| 我要看黄色一级毛片| 免费看黄色毛片| 18年大片免费在线观看| 美女自熨出白浆视频在线播放| 三级欧美在线| 种子天堂| 热久久这里只有精品| 大色综合色综合网站| 人人爽天天爽夜夜爽曰| 黄 在线| 亚洲伊人tv综合网色| 欧美一级精品高清在线观看| 第四色亚洲色图| 狠狠色狠狠色狠狠五月ady| 亚洲激情网站| 四虎国产精品免费入口| 国产美女视频免费| 久久va|