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

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

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

3天內不再提示

可編程數字輸入和輸出詳解

嵌入式應用開發 ? 來源:嵌入式應用開發 ? 作者:嵌入式應用開發 ? 2022-06-18 19:30 ? 次閱讀

數字型輸入/輸出外設僅有兩種有效狀態,習慣用On和Off、High和Low、打開和關閉、接通和斷開等表示兩種有效狀態,譬如一個繼電器觸點的接通狀態和斷開狀態、 一顆指示燈的on狀態和off狀態等。存儲一個數字型輸入/輸出外設的狀態信息僅需要一個二進制位。絕大多數MCU的可編程I/O引腳都可編程輸出高電平和低電平, 這樣的I/O引腳電平狀態與相應接口電路即可控制數字型輸出外設的狀態,因此在MCU內部使用二進制位的“1”和“0”分別表示數字型輸出外設的狀態。 同時,通過讀取MCU的I/O引腳的電平即可獲取數字型輸入外設的狀態,并使用布爾型(Boolean)變量保存該狀態。

很多編程語言都支持布爾型變量,尤其支持嵌入式系統的編程語言,譬如C/C++語言。雖然布爾型變量的有效值僅為“1”和“0”,如果目標計算機系統不支持位操作和位尋址, 布爾型變量仍占用一個字節或更多二進制位來存儲一個二進制信息。現在的MCU絕大多數都支持位操作和位尋址,譬如ARM Cortex-M系列微內核支持“bit-band”操作, 允許存取指令訪問單個數據位(詳見 [1]_ 的6.7節)。

按鈕和LED指示燈是最簡單的數字型輸入和輸出外設,圖4.1給出BlueFi上的按鈕和LED指示燈的電路連接示意圖。

../_images/gpio_examples_reset_di_do.jpg

圖4.1 BlueFi上的按鈕和LED指示燈的電路連接示意圖

從上圖中,我們不僅能夠了解數字型輸入/輸出信號的電平電壓、驅動電流、頻率和復位期間的默認狀態,還能了解如何讀取數字型輸入外設的狀態到內部變量, 以及如何通過寫外設存儲區的地址單元來控制數字型輸出狀態。

BlueFi的主MCU(nRF52840)的外部復位信號的有效電平為低電平(詳見nRF52840的產品說明文檔 [2]_ ),且內部帶有上電復位(即冷復位)電路(圖中黃色的電阻電容), 圖4.1給出最簡單的外部復位電路:一個手動復位按鈕,一端接地,另一端與“nRST”引腳連接。內部上電復位電路的電阻與MCU的工作電源連接,當外部手動復位按鈕未被按下時保持復位引腳狀態為高電平, 這個電平的電壓顯然與MCU的工作電壓相等;當按下手動復位按鈕時復位引腳的狀態為低電平,這個電平的電壓與電源地相同。當我們需要給nRF52840復位時,只需要按下復位按鈕即可。 按下按鈕時從“nRST”引腳強制施加低電平信號給MCU內核的內部復位電路單元將片上所有功能單元(含CPU)復位,當我們釋放手動復位按鈕后,片上的上電復位電路確保“nRST”引腳處于高電平, CPU開始工作。我們在第2.7節已經了解到MCU的多種復位源,在復位期間,nRF52840內部的“RESETREAS”寄存器(0x4000 0400地址單元)將保存本次復位的信號源, 應用程序可以根據這個寄存器的內容來識別復位源。單按一次BlueFi的復位按鈕是正常的系統復位,而連續雙擊BlueFi的復位按鈕,你會發現BlueFi進入Bootloader狀態。 這個功能是使用“RESETREAS”寄存器的內容。

BlueFi的A和B按鈕是可編程的,兩個按鈕的電路連接完全相似(除了使用不同的I/O引腳),圖4.1中僅給出A按鈕的電路連接。A按鈕的接口電路不僅包含片外的按鈕, 還包含片內的可配置上拉/下拉電阻,由于A按鈕的一端與MCU工作電源連接、另一端與P1.7引腳連接,當A按鈕按下時P1.7引腳被強制與電源連接;如果P1.7的內部配置為下拉電阻, 當A按鈕釋放時P1.7引腳被下拉到電源地。通過讀取P1.7引腳的狀態確定A按鈕的狀態,當A按鈕按下時讀取狀態的結果為“1”(即高電平),當A按鈕釋放時讀取狀態的結果為“0”(即低電平)。 當我們將A按鈕的狀態保存到一個布爾型變量時,如果不采用DMA(直接存儲器訪問)方式,nRF52840的CPU的工作過程為:將P1.IN寄存器(即0x5000 0810地址單元)讀入CPU內部某個寄存器, 然后再將D7位的值(即P1.7引腳的狀態)保存到布爾型變量(即“Bit_Band”區的某個地址單元)。

對于P1.7內部可配置的上拉/下拉電阻的使用,需要在BlueFi初始化期間根據A按鈕的電路進行編程配置。按照圖4.1,使用Arduino IDE平臺,A按鈕的初始化和使用代碼參考如下:

void setup() {
  // put your setup code here, to run once:
  pinMode(PIN_BUTTON1, INPUT_PULLDOWN);
}

void loop() {
  // put your main code here, to run repeatedly:
  bool state_aBtn = digitalRead(PIN_BUTTON1);
  if (state_aBtn == HIGH) {
    // A button be pressed
  } else {
    // A button be released
  }
}

第3行代碼是調用Arduino內部函數“pinMode(PIN_BUTTON1, INPUT_PULLDOWN)”將P1.7引腳(即與A按鈕連接的I/O引腳)配置為輸入模式且使用內部下拉電阻。在Arduin IDE平臺, 有三種輸入配置:浮空輸入(INPUT)、上拉輸入(INPUT_PULLUP)和下拉輸入(INPUT_PULLDOWN)。第8行調用Arduino內部函數“digitalRead(PIN_BUTTON1)”讀取A按鈕的狀態, 由于按鈕的狀態為二進制型信息,所以將A按鈕的當前狀態暫存在布爾型變量“state_aBtn”中。根據圖4.1的電路結構,當A按鈕被按下時布爾型變量“state_aBtn”的值為“true”或“HIGH”。 注意,“HIGH”是Arduino平臺的布爾型常量,“true”是C/C++編程語言的標準常量。

BlueFi有兩顆亮起時顏色分別為紅色和白色的LED指示燈,他們的連接電路如圖4.1所示,兩顆LED分別受P1.12和P1.14引腳控制。當程序將P1.OUT寄存器(即0x5000 0804地址單元) 的D12位置位時,P1.12引腳將輸“1”(即高電平),紅色LED指示燈將亮起;當程序將P1.OUT寄存器的D12位清零時,P1.12引腳輸入“0”(即低電平),紅色LED指示燈將熄滅。 BlueFi與其他數字電路采用相同的設計習慣,I/O引腳為高電平時對應的電壓等于MCU的I/O工作電壓,低電平對應的電壓等于電源地,按照前一章的BlueFi電路原理介紹, nRF52840使用3.3V作為I/O引腳電壓。根據紅色LED的正向壓降、串聯電阻的阻值和高電平的電壓,我們可以計算出紅色LED亮起時的電流(簡稱on電流),這個電流的大小決定指示燈的亮度。

根據A按鈕的狀態控制紅色LED指示燈亮和滅的代碼如下:

oid setup() {
  // put your setup code here, to run once:
  pinMode(PIN_BUTTON1, INPUT_PULLDOWN);
  pinMode(LED_RED, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  bool state_aBtn = digitalRead(PIN_BUTTON1);
  if (state_aBtn == HIGH) {
    // A button be pressed
    digitalWrite(LED_RED, HIGH);
  } else {
    // A button be released
    digitalWrite(LED_RED, LOW);
  }
}

按照“..Arduino15packagesadafruithardwarenrf520.20.5variantsbluefi_nrf52840variant.h“頭文件中對BlueFi的I/O引腳用法的定義, 只需要將上述代碼中的“LED_RED”引腳名稱替換為“LED_WHITE”,然后編譯并下載修改后的代碼到BlueFi,可以使用A按鈕控制白色LED的亮和滅。

與紅色LED相比,你也許已經發現BlueFi的白色LED更亮一些。這說明,白色LED指示燈on電流大于紅色LED。如果使用I/O引腳輸出的高電平電壓直接驅動LED,并不斷地減小LED的串聯電阻阻值, LED的亮度將會不斷地增加嗎?如果假設I/O引腳輸出的高電平電壓是理想的(即內阻為0且功率足夠大),這個問題的答案是肯定的。事實上,所有MCU的I/O引腳的驅動能力都是有限的, 按拉電流和灌電流兩種指標分別指定每一個I/O引腳的驅動能力。當I/O引腳的驅動能力無法滿足LED指示燈on電流時,我們自然會想到外部驅動,如圖4.1中使用外部NPN三極管驅動白色LED指示燈, 此時I/O引腳輸出的拉電流被三極管放大數十倍(即三極管的放大倍數)作為白色LED指示燈on電流。當外部數字型輸出外設需要更大的負載電流時,或許需要多級結構(如達林頓結構)的三極管提高放大倍數。

對于MCU的可編程I/O引腳,除了可配置的上拉/下拉電阻、可編程為輸入/輸出模式等,還有更多可配置的結構。以nRF52840為例,我們需要進一步了解其內部的結構,如圖4.2所示。

../_images/nrf52840_gpio_pin_details_pin0.jpg

圖4.2 nRF52840可編程I/O引腳的內部結構

在上圖中,我們可以找到一個可編程輸入/輸出引腳的所有配置選項、輸入通道、輸出通道等。除了數字I/O功能之外,一個可編程輸入/輸出引腳也可以當作模擬I/O功能引腳使用, 圖4.2中的“ANAEN”是編程配置一個引腳當作數字I/O或模擬I/O的控制位。關于模擬輸入/輸出的功能,詳見下一節。在nRF52840的手冊中,我們可以找到每一個可編程輸入/輸出引腳的 配置和控制相關的存儲器地址和有效的控制位,“pinMode(pin,mode)”、“digitalRead(pin)”和“digitalWrite(pin,value)”等基本數字型I/O接口都是通過編程這些存儲單元而實現的。

已經了解數字型I/O的電路和軟件接口之后,我們可以接著第3章最后一節的任務:為BlueFi設計BSP,現在只涉及BlueFi的數字I/O相關的部分,即兩個輸入按鈕和兩個LED指示燈的BSP。 如果你是BlueFi的二次開發(編程應用)用戶,你將會如何使用按鈕和LED指示燈呢?BSP的目的是根據特定硬件電路封裝API并加快二次用戶開發的工作效率,譬如BlueFi的兩個按鈕的配置 (需根據按鈕的電路結構)等,用戶只需調用BSP封裝的API即可得到“按鈕被按下/釋放/長按“,或直接控制“紅色LED亮/滅/切換”等。

為了了解BSP的基本結構,我們首先來實現LED控制的API

審核編輯:符乾江

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

    關注

    5143

    文章

    19569

    瀏覽量

    315663
  • i/o控制
    +關注

    關注

    1

    文章

    3

    瀏覽量

    1068
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    可編程SLIC語音芯片哪家好?

    在當今數字化快速發展的時代,語音芯片的應用越來越廣泛,而可編程SLIC(用戶線路接口電路)語音芯片更是憑借其獨特的優勢,受到眾多行業的青睞。那么,面對眾多的選擇,哪家的可編程SLIC語音芯片更勝一籌
    的頭像 發表于 06-12 13:55 ?85次閱讀
    <b class='flag-5'>可編程</b>SLIC語音芯片哪家好?

    參考設計#60 W 可編程電源 具有零電壓開關 (ZVS) 和 5-20 V 可變輸出

    電源,具有 ZVS 和 5-20 V 可編程輸出.pdf *附件:60 W 可編程電源_gerber.zip InnoSwitch4-Pro 數字可控零電壓開關反激式開關 IC 75
    的頭像 發表于 01-23 15:22 ?610次閱讀
    參考設計#60 W <b class='flag-5'>可編程</b>電源 具有零電壓開關 (ZVS) 和 5-20 V 可變<b class='flag-5'>輸出</b>

    可編程電壓范圍指的是輸入到ADS828芯片的電壓范圍嗎

    ADS828, THS4503用的是ADS828,在數據手冊上看到可編程電壓范圍,我想問的是,可編程電壓范圍指的是輸入到ADS828芯片的電壓范圍嗎? 關于ADS828還有一點不明白,ADS828
    發表于 01-20 06:40

    可編程交流負載標準

    標準通常具有高精度和高穩定性的特點,在測試過程中,負載需要提供穩定的電壓和電流輸出,以確保測試結果的準確性。因此,可編程交流負載設備通常會采用先進的控制技術和高精度的傳感器,以保證輸出的穩定性和精度
    發表于 01-15 13:53

    愛普生(EPSON) 常規可編程晶振

    常規可編程晶振主要用來替換一般用途的中低頻四腳有源晶振,可以滿足大多數用途有源晶振的快速交付。愛普生(Epson)作為全球領先的晶體產品供應商,提供了一系列可編程晶振,可以與基波正常振蕩器相同
    的頭像 發表于 01-13 15:24 ?540次閱讀
    愛普生(EPSON) 常規<b class='flag-5'>可編程</b>晶振

    AN-953: 具可編程模數的直接數字頻率合成器(DDS)

    電子發燒友網站提供《AN-953: 具可編程模數的直接數字頻率合成器(DDS).pdf》資料免費下載
    發表于 01-13 14:13 ?0次下載
    AN-953: 具<b class='flag-5'>可編程</b>模數的直接<b class='flag-5'>數字</b>頻率合成器(DDS)

    可編程晶振的鎖相環原理

    (Phase-LockedLoop,PLL)技術在可編程晶振中扮演著關鍵角色,以下是對可編程晶振中鎖相環技術的詳細講解:一、鎖相環技術的基本原理1、鎖相環是一種利用相位同步產生
    的頭像 發表于 01-08 17:39 ?514次閱讀
    <b class='flag-5'>可編程</b>晶振的鎖相環原理

    PLC可編程控制器的簡介

    PLC的英文全稱為Programmable Logic Controller,也就是可編程序控制器。它是一種將計算機技術與繼電器技術結合起來的現代化自動控制裝置,1969年,美國數字化設備公司研制出
    的頭像 發表于 12-23 09:09 ?952次閱讀

    PGA309電壓輸出可編程傳感器調節器

    電子發燒友網站提供《PGA309電壓輸出可編程傳感器調節器.pdf》資料免費下載
    發表于 11-01 09:29 ?0次下載
    PGA309電壓<b class='flag-5'>輸出</b><b class='flag-5'>可編程</b>傳感器調節器

    可編程晶振的優點和缺點

    可編程晶振,近年來漸入人們眼中。什么是可編程晶振,與普通晶振有什么區別?可編程晶振的優點和缺點有哪些?1,什么是可編程晶振可編程晶振是一種可
    的頭像 發表于 09-30 10:44 ?798次閱讀
    <b class='flag-5'>可編程</b>晶振的優點和缺點

    用TMAG5328電阻器和電壓可編程霍爾效應開關實現可編程性和診斷

    電子發燒友網站提供《用TMAG5328電阻器和電壓可編程霍爾效應開關實現可編程性和診斷.pdf》資料免費下載
    發表于 09-11 10:01 ?0次下載
    用TMAG5328電阻器和電壓<b class='flag-5'>可編程</b>霍爾效應開關實現<b class='flag-5'>可編程</b>性和診斷

    關于可編程交流電源特點及應用介紹

    可編程交流電源是一種高度靈活且可調節的電源。與傳統的固定輸出交流電源相比,它具有許多獨特的功能和廣泛的應用范圍。 一、可編程交流電源特點 1、可編程交流電源電壓可調 雖然傳統的固定
    的頭像 發表于 08-29 15:48 ?726次閱讀

    具有數字和模擬輸出的PGA900可編程電阻式傳感調節器數據表

    電子發燒友網站提供《具有數字和模擬輸出的PGA900可編程電阻式傳感調節器數據表.pdf》資料免費下載
    發表于 08-15 11:31 ?0次下載
    具有<b class='flag-5'>數字</b>和模擬<b class='flag-5'>輸出</b>的PGA900<b class='flag-5'>可編程</b>電阻式傳感調節器數據表

    TMP401 ±1°C可編程、遠程和本地數字輸出溫度傳感器數據表

    電子發燒友網站提供《TMP401 ±1°C可編程、遠程和本地數字輸出溫度傳感器數據表.pdf》資料免費下載
    發表于 08-13 10:17 ?0次下載
    TMP401 ±1°C<b class='flag-5'>可編程</b>、遠程和本地<b class='flag-5'>數字</b><b class='flag-5'>輸出</b>溫度傳感器數據表

    可編程晶振都有什么頻率的呢?分享3個挑選可編程晶振的技巧

    頻率范圍全面覆蓋,滿足多樣化需求: ? CMOS可編程晶振:1~200MHz寬廣選擇,為您的基礎應用提供穩定可靠的支持。 ? 可編程差分晶振:高達2100MHz的卓越性能,滿足高速數據傳輸與信號處理的高標準要求。 ? 可編程壓控
    的頭像 發表于 07-18 18:30 ?1550次閱讀
    <b class='flag-5'>可編程</b>晶振都有什么頻率的呢?分享3個挑選<b class='flag-5'>可編程</b>晶振的技巧
    主站蜘蛛池模板: 天天夜天天干 | 尤物啪啪| 亚洲国产欧美日韩一区二区三区 | a天堂中文在线官网 | 欧美成网站 | 欧美成人三级伦在线观看 | 四虎成人精品在永久在线观看 | 全黄h全肉边做边吃奶在线观看 | 午夜一区二区在线观看 | 亚洲一级毛片免费观看 | 99精品热 | 五月天婷婷色 | 午夜高清视频在线观看 | 国产精品美女www爽爽爽视频 | 久热福利视频 | 边做边爱在线观看视频免费 | 欧美黄色免费网址 | 22sihu国产精品视频影视资讯 | 操碰视频在线观看 | 天天做天天摸 | 福利在线看片 | 天堂bt种子资源地址在线 | 四虎永久免费观看 | 麻豆三级视频 | www你懂的 | 日韩欧美成人乱码一在线 | 日韩午夜在线视频不卡片 | 日本不卡在线播放 | 亚洲天堂免费看 | 色多多18免费观看 | 伊人久久大香线蕉综合高清 | 亚洲福利二区 | 四虎影院观看视频 | 久久精品看片 | 五夜婷婷| 女人张开腿让男人桶免费最新 | 在线观看亚洲天堂 | 香蕉视频黄色片 | 亚洲伊人久久大香线蕉结合 | 人人干人人玩 | 日本一区二区免费在线观看 |