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

一篇帶給你GPIO 軟件框架

系統(tǒng) Linux
我們研究 GPIO 的軟件部分,分別從單片機(jī)平臺(tái)和 Linux 平臺(tái)來(lái)研究。單片機(jī)平臺(tái)編寫(xiě) GPIO 口程序,以 STM32F103 為例,有三種模式:庫(kù)函數(shù)、HAL庫(kù)、寄存器。

[[431681]]

GPIO 八種工作模式詳解

接著上一篇的講,我們上一篇研究了 GPIO 的硬件結(jié)構(gòu),其來(lái)源于 STM32 官方手冊(cè),研究了 GPIO 的八種工作模式和推挽輸出及開(kāi)漏輸出原理,接下來(lái)我們研究 GPIO 的軟件部分,分別從單片機(jī)平臺(tái)和 Linux 平臺(tái)來(lái)研究。

1、單片機(jī)平臺(tái)

單片機(jī)平臺(tái)編寫(xiě) GPIO 口程序,以 STM32F103 為例,有三種模式:庫(kù)函數(shù)、HAL庫(kù)、寄存器。

使用庫(kù)函數(shù)的方式操控 GPIO 方式如下:

  1. void LED_Init(void) 
  2.     GPIO_InitTypeDef GPIO_InitStructure; 
  3.  
  4.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能 PB 端口時(shí)鐘 
  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); //根據(jù)設(shè)定參數(shù)初始化 GPIOB.5 
  11.     GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 輸出高 

上述代碼就是使用庫(kù)函數(shù)來(lái)初始化 STM32 的一個(gè) IO 為輸出功能,可以看出上述初始化代碼中重點(diǎn)要做的事情有一下幾個(gè):

①、使能指定 GPIO 的時(shí)鐘。

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

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

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

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

2、嵌入式 Linux 平臺(tái)

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

對(duì)于上了 Linux 系統(tǒng)的平臺(tái),我們有其他方法,讓它可以像單片機(jī)一樣簡(jiǎn)單的操作 IO 口,這得益于各路 Linux 大神對(duì)系統(tǒng)底層的封裝。

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

Linux 內(nèi)核針對(duì) PIN 的配置推出了 pinctrl 子系統(tǒng),對(duì) GPIO 的配置推出了 gpio 子系統(tǒng)。

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

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

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

①、獲取設(shè)備樹(shù)中 pin 信息。

②、根據(jù)獲取到的 pin 信息來(lái)設(shè)置 pin 的復(fù)用功能

③、根據(jù)獲取到的 pin 信息來(lái)設(shè)置 pin 的電氣特性,比如上/下拉、速度、驅(qū)動(dòng)能力等。

對(duì)于我們使用者來(lái)講,只需要在設(shè)備樹(shù)里面設(shè)置好某個(gè) pin 的相關(guān)屬性即可,其他的初始化工作均由 pinctrl 子系統(tǒng)來(lái)完成,pinctrl 子系統(tǒng)源碼目錄為 drivers/pinctrl。

注意,pinctrl 子系統(tǒng)也是一個(gè)標(biāo)準(zhǔn)的 platform 驅(qū)動(dòng),當(dāng)設(shè)備和驅(qū)動(dòng)匹配的時(shí)候,probe 函數(shù)會(huì)執(zhí)行,只是 pinctrl 子系統(tǒng)采用的 arch_initcall 去聲明,而不是 module_init(device_initcall),所以在系統(tǒng)起來(lái)的時(shí)候它會(huì)先加載。(具體原因看下面這篇文章)

Linux 驅(qū)動(dòng)掛載順序分析

pinctrl 和 gpio 子系統(tǒng)軟件框架如下:

pinctrl

 

gpio

可以看出其實(shí)兩者軟件框架一樣的,主要是 HW Abstract layer 具體實(shí)現(xiàn)不一樣。

你以為兩者是分離的,實(shí)際上不是的,gpio 子系統(tǒng)是基于 pinctrl 子系統(tǒng)的,gpio 的 API 接口的實(shí)現(xiàn)很多都是基于 pinctrl 子系統(tǒng)的函數(shù)。

 

責(zé)任編輯:姜華 來(lái)源: 嵌入式Linux系統(tǒng)開(kāi)發(fā)
相關(guān)推薦

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2021-06-21 14:36:46

Vite 前端工程化工具

2021-01-28 08:55:48

Elasticsear數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)

2023-03-29 07:45:58

VS編輯區(qū)編程工具

2021-04-14 14:16:58

HttpHttp協(xié)議網(wǎng)絡(luò)協(xié)議

2021-04-08 11:00:56

CountDownLaJava進(jìn)階開(kāi)發(fā)

2021-07-21 09:48:20

etcd-wal模塊解析數(shù)據(jù)庫(kù)

2024-06-13 08:34:48

2022-03-22 09:09:17

HookReact前端

2022-04-29 14:38:49

class文件結(jié)構(gòu)分析

2021-04-01 10:51:55

MySQL鎖機(jī)制數(shù)據(jù)庫(kù)

2021-03-12 09:21:31

MySQL數(shù)據(jù)庫(kù)邏輯架構(gòu)

2022-02-17 08:53:38

ElasticSea集群部署

2022-02-25 15:50:05

OpenHarmonToggle組件鴻蒙

2021-04-23 08:59:35

ClickHouse集群搭建數(shù)據(jù)庫(kù)

2021-07-08 07:30:13

Webpack 前端Tree shakin

2023-03-13 09:31:04

2021-04-14 07:55:45

Swift 協(xié)議Protocol

2021-05-08 08:36:40

ObjectString前端

2022-03-01 13:55:27

TektonKubernetes集群
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 噜噜噜噜狠狠狠7777视频 | 亚洲精品一区二区 | 亚洲国产精品久久久久久 | 在线视频 亚洲 | 久久成人精品视频 | 九九亚洲精品 | 国产一区二区三区四区五区3d | 欧美国产精品一区二区三区 | www.日韩 | 亚洲国产一区二区在线 | 日韩一区二区三区视频 | 国产精品久久久久一区二区三区 | 欧美综合久久久 | 国产精品视频一二三区 | 99久久久久久99国产精品免 | 亚洲国产精品一区二区三区 | 国产yw851.c免费观看网站 | 日韩电影一区二区三区 | 人人干人人看 | 亚洲国产成人av好男人在线观看 | 亚洲一区二区三区桃乃木香奈 | 亚洲香蕉 | 五月婷婷中文 | 酒色成人网 | 91玖玖 | 99精品国产在热久久 | 日本a∨视频 | 亚洲一区国产精品 | 日韩国产在线 | 亚洲第一在线视频 | 99这里只有精品视频 | 成人免费av | 日韩久久久久久久久久久 | 亚洲三区在线观看 | 男女视频在线观看免费 | 欧美日韩精品中文字幕 | 亚洲一区二区三区久久久 | 欧美日韩中文国产一区发布 | 97热在线| 亚洲一区二区在线免费观看 | 国产一区二区三区视频 |