成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇帶給你GPIO 軟件框架

系統 Linux
我們研究 GPIO 的軟件部分,分別從單片機平臺和 Linux 平臺來研究。單片機平臺編寫 GPIO 口程序,以 STM32F103 為例,有三種模式:庫函數、HAL庫、寄存器。

[[431681]]

GPIO 八種工作模式詳解

接著上一篇的講,我們上一篇研究了 GPIO 的硬件結構,其來源于 STM32 官方手冊,研究了 GPIO 的八種工作模式和推挽輸出及開漏輸出原理,接下來我們研究 GPIO 的軟件部分,分別從單片機平臺和 Linux 平臺來研究。

1、單片機平臺

單片機平臺編寫 GPIO 口程序,以 STM32F103 為例,有三種模式:庫函數、HAL庫、寄存器。

使用庫函數的方式操控 GPIO 方式如下:

  1. void LED_Init(void) 
  2.     GPIO_InitTypeDef GPIO_InitStructure; 
  3.  
  4.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能 PB 端口時鐘 
  5.  
  6.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 
  7.     //PB5 端口配置 
  8.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出 
  9.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度 
  10.     GPIO_Init(GPIOB, &GPIO_InitStructure); //根據設定參數初始化 GPIOB.5 
  11.     GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 輸出高 

上述代碼就是使用庫函數來初始化 STM32 的一個 IO 為輸出功能,可以看出上述初始化代碼中重點要做的事情有一下幾個:

①、使能指定 GPIO 的時鐘。

②、初始化 GPIO,比如輸出功能、上拉、速度等等。

③、STM32 有的 IO 可以作為其它外設引腳,也就是 IO 復用,如果要將 IO 作為其它外設引腳使用的話就需要設置 IO 的復用功能。

④、最后設置 GPIO 輸出高電平或者低電平。

STM32 的 GPIO 初始化就是以上四步,使用庫函數操作 GPIO 還是很簡單的。但是我們知道 STM32F1 系列是有庫函數的,但是 STM32F7 系列就沒有庫函數了,ST 公司沒有出,STM32F7 只有 HAL 庫和寄存器兩種操作方式。

2、嵌入式 Linux 平臺

先總結一句:不管是單片機還是高端 ARM 平臺,最底層都是寄存器,硬件之上就是寄存器,任何封裝形式到最底層就是操作寄存器。

對于上了 Linux 系統的平臺,我們有其他方法,讓它可以像單片機一樣簡單的操作 IO 口,這得益于各路 Linux 大神對系統底層的封裝。

在 Linux 中有 pinctrl 和 gpio 子系統,它們提供了 API 接口給你使用,讓你方便的操控 GPIO 口。

Linux 內核針對 PIN 的配置推出了 pinctrl 子系統,對 GPIO 的配置推出了 gpio 子系統。

上面這句話很重要,我詳細解釋一下:這里是將 pin 腳和控制 IO 口輸入輸出分離。

pinctrl 子系統管理 200 個 IO 口的上拉下拉電阻,電流驅動能力,是硬件底層的存在。如果 pinctrl 將某個 pin 腳初始化成了普通 GPIO 而不是 IIC 或者 SPI,那么接下來我們就可以使用 gpio 子系統的 API 去操作 IO 口輸出高低電平。

傳統的配置 pin 的方式就是直接操作相應的寄存器,但是這種配置 方式比較繁瑣、而且容易出問題(比如 pin 功能沖突)。pinctrl 子系統就是為了解決這個問題而引入的,pinctrl 子系統主要工作內容如下:

①、獲取設備樹中 pin 信息。

②、根據獲取到的 pin 信息來設置 pin 的復用功能

③、根據獲取到的 pin 信息來設置 pin 的電氣特性,比如上/下拉、速度、驅動能力等。

對于我們使用者來講,只需要在設備樹里面設置好某個 pin 的相關屬性即可,其他的初始化工作均由 pinctrl 子系統來完成,pinctrl 子系統源碼目錄為 drivers/pinctrl。

注意,pinctrl 子系統也是一個標準的 platform 驅動,當設備和驅動匹配的時候,probe 函數會執行,只是 pinctrl 子系統采用的 arch_initcall 去聲明,而不是 module_init(device_initcall),所以在系統起來的時候它會先加載。(具體原因看下面這篇文章)

Linux 驅動掛載順序分析

pinctrl 和 gpio 子系統軟件框架如下:

pinctrl

 

gpio

可以看出其實兩者軟件框架一樣的,主要是 HW Abstract layer 具體實現不一樣。

你以為兩者是分離的,實際上不是的,gpio 子系統是基于 pinctrl 子系統的,gpio 的 API 接口的實現很多都是基于 pinctrl 子系統的函數。

 

責任編輯:姜華 來源: 嵌入式Linux系統開發
相關推薦

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2021-06-21 14:36:46

Vite 前端工程化工具

2021-01-28 08:55:48

Elasticsear數據庫數據存儲

2023-03-29 07:45:58

VS編輯區編程工具

2021-04-14 14:16:58

HttpHttp協議網絡協議

2021-04-08 11:00:56

CountDownLaJava進階開發

2022-03-22 09:09:17

HookReact前端

2021-07-21 09:48:20

etcd-wal模塊解析數據庫

2021-04-01 10:51:55

MySQL鎖機制數據庫

2021-03-12 09:21:31

MySQL數據庫邏輯架構

2022-02-17 08:53:38

ElasticSea集群部署

2022-04-29 14:38:49

class文件結構分析

2024-06-13 08:34:48

2022-02-25 15:50:05

OpenHarmonToggle組件鴻蒙

2023-03-13 09:31:04

2021-07-08 07:30:13

Webpack 前端Tree shakin

2021-05-08 08:36:40

ObjectString前端

2021-04-23 08:59:35

ClickHouse集群搭建數據庫

2021-04-14 07:55:45

Swift 協議Protocol

2022-03-08 08:32:43

Tekton云原生開源
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.av在线| 51ⅴ精品国产91久久久久久 | 91精品国产综合久久精品 | 欧美日本在线观看 | 在线视频一区二区 | 别c我啊嗯国产av一毛片 | 日韩综合在线视频 | 精品欧美一区二区中文字幕视频 | 夜夜骚视频 | 久久精品欧美一区二区三区麻豆 | 日韩视频区 | 精品伊人久久 | 一区二区三区四区视频 | 亚洲欧美精品国产一级在线 | av黄色免费在线观看 | 婷婷毛片 | 99国产精品视频免费观看一公开 | 亚洲a视频 | 黄色在线观看网址 | 一级黄a | 日本久久久一区二区三区 | 狠狠操狠狠干 | av一级 | 亚洲高清在线观看 | 亚洲网站在线观看 | 99精品国产一区二区三区 | av在线视| 免费观看一级毛片 | 91视频网址| 成人免费视频网站在线观看 | 日本一区二区三区视频在线 | 午夜免费精品视频 | 亚洲高清av在线 | 国产精品视频一 | 精品国产乱码久久久久久丨区2区 | 国产日韩一区二区 | 在线观看www| 精品国产欧美日韩不卡在线观看 | 亚洲人成人一区二区在线观看 | 天堂三级 | 黄色片网此 |