總網頁瀏覽量

顯示具有 GPIO 標籤的文章。 顯示所有文章
顯示具有 GPIO 標籤的文章。 顯示所有文章

2024年4月8日 星期一

【TI AM335x SoC系統晶片之GPIO驅動操作流程】


作者: 林普賢 ( sam91001200@gmail.com )、 孫文良( iws6645@gmail.com )


首先要去看開發板的電路圖。這裡以Beaglebone green wireless這塊開發板(dev. board)為例,在以下網址可以找到此開發板的電路圖[1]。

https://wiki.seeedstudio.com/BeagleBone_Green_Wireless/

(註: 而我們實驗時所使用的Beaglebone green wireless與Beaglebone Black這兩塊板子上面的系統晶片SoC同為TI的AM3358,所以在此二塊開發板上,其驅動GPIO的方式是同理的。)

如果我們想要點亮開發板上的D5 LED,就必須尋找它連接的腳位(pin)。由下圖可以得知D5所連接的腳位(pin)為GPIO1_24。





這時候我們就可以在AM335x的Datasheet[2]找到原來GPIO1_24的PIN_Name是GPMC_A8,並且腳位的模式需要選擇為7。




現在我們已經知道要操作的腳位是GPMC_A8,接下來就是看Reference Manual的GPIO feature去了解如何操作各個暫存器完成我們想要的功能。


由上面這張系統框圖可以看到,整個GPIO的操作其實不困難。給GPIO週邊提供時鐘、配置GPIO週邊的I/O方向、最後多工器選擇腳位的輸出由哪個週邊接管。有了這個系統框圖再搭配各個暫存器的說明,要自己寫出GPIO的裝置驅動程式相信不會太困難。

 

首先是圖中最左邊的Power & Clock,有玩過stm32的朋友一定很熟悉。沒錯,就是打開GPIO週邊的時鐘,沒有這個時鐘GPIO週邊是不會工作的。我們需要驅動LED的腳位是GPIO1_24,所以要操作CM_PER_GPIO1_CLKCTRL這個暫存器將GPIO1的時鐘打開。

 

操作記憶體地址這邊只講一次,其他暫存器的地址也是這樣查找的。在Reference Manual[3]我們尋找CM_PER_GPIO1_CLKCTRL應該找的到以下資訊:


可以看到CM_PER_GPIO1_CLKCTRL它的記憶體地址是基於CM_PER偏移了AC h,至於CM_PER的地址在哪裡呢? 可以在Memory Map的章節查到:



所以這樣我們就知道了CM_PER_GPIO1_CLKCTRL的記憶體地址,接下來要要看看需要設定這個暫存器的哪些內容。這裡需要操作Bit 18的欄位以及Bit [0:1],表示將時鐘致能開啟GPIO功能。對應的example code(先暫時不討論ioremap)如下:

static volatile unsigned int *CM_PER_GPIO1_CLKCTRL = 0x44E00000 + 0xAC;

*CM_PER_GPIO1_CLKCTRL = (1<<18) | 0x2;

接下來要講解GPIO週邊的暫存器操作,在裝置初始化的時候其實只需要操作GPIO1_OE將output功能啟用就好,而GPIO1_CLEARDATAOUT和GPIO1_SETDATAOUT都是在撰寫功能時才會進行操作。這裡只會講解GPIO_OE的操作方式,其餘兩個暫存器的操作方式也是同理。



可以看到上圖說明想要啟用GPIO1對應接腳需要對相對應的bit進行clear操作,對應的程式如下:

*GPIO1_OE &= ~(1<<24);                            // 將GPIO1_24設置為輸出模式

*GPIO1_CLEARDATAOUT = (1<<24);       // 將GPIO1_24清0 (低電位)

*GPIO1_SETDATAOUT = (1<<24);           // 將GPIO1_24置1 (高電位)

最後是GPMC_A8的腳位選擇功能。由於晶片的接腳有限,對於同一支腳位它可能被各個不同的週邊共享,但同一時間只能選擇一種功能進行操作。這裡我們需要的選擇一般的輸入輸出模式,所以需要將對應的暫存器賦值為7(先前有提及)。對應的程式如下:

*conf_gpmc_a8 = 7;

至此,所有涉及點燈的GPIO操作以及其對應的暫存器已講解完畢,如果手邊有基於AM335x系列處理器的開發板的朋友,可以趕緊來實戰看看驗證成果。


References: 

[1] Seeed Studio BeagleBone® Green Wireless Schematic

[2] AM3358 Datasheet

[3] AM3358 Technical Reference Manual


林普賢、孫文良

-----

歡迎各方洽談合作,務實/踏實追求共好。

個人簡歷: https://sites.google.com/view/wenliangsun/


‼本園區開設之技術課程進一步詳情請參見下方blog網頁的課程介紹👇:
本學習區之Facebook粉絲頁如下:

--------------------------

林普賢 孫文良 (阿良的嵌入式系統技術學習區)

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先點擊參考這篇介紹文章】



2021年10月10日 星期日

【嵌入式系統基礎原理與實務課程】 GPIO單元之簡介推廣

 🥸 最近在本園區所開設的 「嵌入式系統基礎原理與實務課程」內,和幾位工程師學員講解到GPIO的部分,頗有感觸。


GPIO (General-Purpose Input/Output)的應用看似簡單,但其背後的原理可有著不少學問。

如果以呼叫現成的API函數的方式來達成之前demo影片中以GPIO驅動LED亮/滅的簡易功能,整個過程大概只要2分鐘 (例如如果使用Arduino UNO這種板子上就有現成LED的開發板,就連外接LED的動作和時間都可以省了,搭配digitalWrite這類的現成函數真的只要2分鐘就可以完成),但事情的完整真相真的「只有」這麼簡單嗎❓❓ 這樣就是了解GPIO了嗎❓

‼事實上‼ 其應用功能(表面)背後的韌體、與GPIO結構驅動原理(從CPU到記憶體單元中去讀到你寫好且被Compiler編譯完成的machine code到驅動GPIO周邊,GPIO的數位高低電位是如何輸出驅動或讀取,詳情是怎麼一回事),可以講解好幾個小時,

韌體開發並不是純軟體開發,如果是驅動周邊 (Peripheral周邊裝置,詳見註1)的軟韌體開發工程師來說,一位有心於研發工作的工程師是有必要去精進加強自己對於軟韌硬體的基礎知識和了解,

這些很可能是許多軟韌體工程師過去在學校課程內所沒學過、甚至到工作後也從沒去思考過的內容,課程希望帶給學員不同的技術視野並啟發思考。

❗ 本園區開設的課程的GPIO課程內容會包含:

👉介紹標準MCS51的Intel官方Datasheet GPIO的相關內容

👉從了解MCU從執行你所撰寫的C code (被C51 Compiler編譯為數位訊號碼,也就是0和1組成的、符合MCS51指令集的機械碼 實際上是長什麼樣子?) 與Assembly language(組合語言)的關係是什麼? 而這些machine code是被燒錄到哪裡? 又是如何被MCU內的CPU所執行? 和I/O周邊裝置的關係又是什麼?

👉GPIO Port內的運作原理是什麼? 如何從GPIO輸出數位的High & Low電位? 如何由GPIO讀入數位的的High & Low電位? (可舉一反三了解其它MCU的稍有不同的GPIO架構)

👉在一般常見的GPIO外部元件驅動基礎應用下,基礎MCU/SoC外部介面電子電路原理講解,這包含類比電路與數位電路的相關基礎知識,例如如何用BJT、MOSFET做簡單的開關應用、如何和MCU/SoC的GPIO搭配?

👉何謂上拉(Pull-up)/下拉(pull-down)電阻? 何謂開汲極(Open drain)?

👉為什麼Standard 8051 MCU的GPIO Port0作高電位輸出應用時,需要外加上拉電阻(pullup resister)才能使用?

👉Standard 8051 MCU的GPIO Port0和Port2是如何存取外部記憶體(雖然現代很少這樣用了,但就學習專業的角度而言仍有了解該原理的學習價值),Port0又是如何兼具存取external memory時的Address bus和Data bus功能?

👉MCU/SoC內的CPU是如何存取周邊的 (如課程介紹所述,我們不只介紹8051,只是把8051當成講解與實驗教材)、何謂memory map I/O? 何謂Port map I/O? 這兩種方式有何差異? 8051 MCU內的CPU去存取I/O是屬於哪種方式?

👉實際韌體撰寫/燒錄/電路接線實驗 等實作教學

👉在課程介紹完8051 MCU內部組織原理的各單元之後,還會有各式的外部元件驅動原理與實驗教學 (可參見課綱介紹)

藉由上述的方式,讓學員完整了解電腦系統(包含嵌入式系統)「韌體」開發的基礎紮實與本質。

下方講義內容中的8051 PORT架構原圖參考自Intel MCS51 user manual而繪製,而講義為個人整理編寫

課程講義內容

🔎註1: Peripheral就是周邊裝置,以MCU/SoC內部的來說,例如GPIO、UART、I2C、SPI、ADC、DAC、USB、.......(族繁不及備載)都是Peripherals,但現在很多年輕學生(不分政治立場)都只聽過「外設」 (外部設備),因為大陸的嵌入式系統技術文章都是這樣講,而台灣近年來很缺乏嵌入式底層技術詳細探討類的網路文章)

‼課程進一步詳情請參見下方blog網頁的課程介紹👇:

2021年9月4日 星期六

適合初學者的【嵌入式系統基礎原理與實務課程】

‼ 在此推廣一下 適合初學者的【嵌入式系統基礎原理與實務課程】‼

👉 本po文的影片內容為一個簡易的小範例,由8051 MCU GPIO之Output(輸出)驅動LED完成簡易跑馬燈功能。

影片內容包含從操作KEIL C51 IDE的免費評估版對程式碼進行編譯,並且藉由 ISP (In System Programming) 燒錄方式(便宜又好用) 對8051 MCU進行燒錄並觀察執行結果。


.

❓ 看完這篇po文的demo影片,或許有些學員會感到疑惑,這影片的跑馬燈功能,豈不是在學校課程裡面就看過/做過了? 這不是都很簡單嗎? 

 

不用擔心 🥸,其實這些表面上簡單的demo功能的背後,其實有著許多深入的學問和需要學習的基礎觀念,在業界做深入的技術問題時很可能會需要這些觀念,而許多大學學校課程不一定會詳細教背後詳細原理,也可能是學員過去從來沒有仔細思考過的較深入的基礎內容。

.

以這個po文的demo影片內容來舉例背後涵蓋的基礎內容,例如: 

👉 以8051實際實作範例說明低階語言 (組合語言,Assembly Language)與C語言(高階語言)的實際差異介紹

👉 介紹8051 指令集 (組合語言 其實即為對應指令集 的 助憶符號)

👉 MCU的原廠官方Datasheet技術手冊的基本閱讀能力

👉 MCU內部架構、GPIO架構原理(例如Port0的open drain是指什麼)、暫存器存取、記憶體組織架構

👉 MCU外部介面電子電路原理(與基礎,包含數位電路和類比電路及訊號的基本觀念)

👉 C語言的各種技巧與重點(包含8051基礎應用以外的平台的韌體開發常見內容和觀念),韌體程式流程追蹤與撰寫

👉 整合開發環境(IDE)操作

👉 ISP燒錄韌體之方式,以及燒錄器所對應軟體之操作 


上述內容在本學習區所開設的課程內容中都會詳細講述,

.

許多學校課程會講的內容,本課程當然會涵蓋到;而就連許多學校課程裡面沒講到的(詳細細節原理與實務開發經驗),在本課程內還是會學到。

.

註: 這門課的核心並不只是教你8051 Microcontroller,而是關於嵌入式系統(Embedded System)的軟硬體入門理論觀念與技術基礎,

同時也會補充許多「真正的計算機概論」的重要內容,不要懷疑,多數人不一定真的有理解過,包含: 

👉 何謂電腦?

👉 何謂嵌入式系統? 

👉 何謂跑non-OS及何謂有跑OS的電腦(計算機)系統

👉 何謂CPU? 何謂MCU(微控制器)? 何謂微處理機? 何謂SoC(系統晶片)? 

👉 產業相關職缺類別與實際可能的工作內容情況(講師分享自身的產業工作經驗與曾經輔導多位學員的經驗)

👉 以8051 MCU作為範例實作的目標教材,目標是希望學員能打下紮實的嵌入式系統基礎,課程內容中會有一系列的基礎實作教學

.


本園區之FB粉絲專頁如下:

--------------------

孫文良 (阿良的嵌入式系統技術學習區)

個人簡介: https://sites.google.com/view/wenliangsun/

【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先參考 課程招生網頁連結】


2021年8月16日 星期一

【阿良的嵌入式系統技術學習區】STM32系列MCU韌體程式設計基礎實務 課程內容介紹

課程涵蓋內容如下:

  • 韌體程式常用程式語言
    • 組合語言指令集與MCU架構簡介
      • 以架構簡潔清晰的Intel MCS51指令集為教材範例
    • C語言基礎複習
    • 高階與低階語言(C語言 與 組合語言Assembly)差異介紹與實驗驗證

  • STM32 MCU常見開發環境操作教學
    • ARM KEILC 評估版 整合開發環境(IDE)操作教學
    • STM32CubeMX工具與STM32Cube IDE操作教學
    • 其它IDE簡介(如 IAR)

  • 中斷(Interrupt)機制
    • ARM Cortex-Mx系列搭配之NVIC (嵌套式向量中斷控制器)介紹
    • 中斷優先權實驗

  • 周邊裝置驅動原理與實作
    • GPIO(通用輸入/輸出介面)
      • GPIO架構與驅動原理
        • IO Port結構原理、Open-drain(開汲極)、Push-Pull output(推挽式輸出)、Pull-up、Pull-down等相關硬體電路原理
      • 外部簡易電路整合應用設計原理
      • 輸出驅動實驗(GPO, General Purpose Output)
      • 輸入驅動實驗(GPI, General Purpose Input)
    • Timer/Counter(計時器/計數器)
      • 計時器
      • 計數器
      • 輪詢與中斷應用實驗
    • UART (通用非同步串列傳輸通訊介面)
      • UART之協定原理
      • 輪詢與中斷應用實驗 (與其它具備UART介面之設備進行通訊實驗)
      • RS232與RS485纜線介紹
        • 電氣位準轉換原理
        • 相關IC介紹
    • ADC(類比轉數位轉換器)
      • 輪詢與中斷機制  搭配 亮度感測器 進行實驗
    • I²C串列通訊介面
    • SPI串列通訊介面
    • 其它各種周邊裝置、I/O介面或協定(PWM、1-wire、DAC、DMA...)

  • 基礎電子電路與元件應用
      • 類比電子電路 與 數位電子電路 基礎原理觀念
      • 基本電壓、電流量測
      • 二極體
      • 電晶體
        • 如: BJT開關應用、MOSFET (如level shift電路應用)
      • OPA(運算放大器)基本應用
      • 穩壓IC應用介紹
        • 光耦合IC
          • Relay繼電器驅動

        • 進階選修
          • GPIO進階應用之 矩陣多按鈕鍵盤 掃描輸入演算法
          • GPIO進階應用之 多合一七段顯示器 掃描輸出演算法
          • LCD顯示驅動
          • 各式無線通訊模組應用(藍牙、ZigBee、LoRa、Wifi等等)
          • 各式感測器應用(如: 溫度、溼度、三軸加速度感測器、陀螺儀、電流感測、pH酸鹼值、ORP氧化還原...等等)
          • 步進馬達驅動
          • 直流馬達驅動
          • 應用專題
            • 物聯網IoT (如 智慧家庭、智慧農業、自動化系統...)
            • 穿戴式裝置(慣性感測、生醫訊號處理應用...)


         


        2021年7月30日 星期五

        於10年前,在大二暑假時期設計製作的以8051 MCU為核心的PCB電路,順便聊聊某些名校大學系所的推甄文化。

        想當初就讀大學時期,除了堅持學業成績常保持在第一之外,幾乎每個寒暑假、甚至修課讀書以外的時間都自願在實驗室做專題專案度過(坦白說比起多數人的大學生活來說,真的不輕鬆,但很充實,將碩班生活提前到大學時期來過),

        當時主要為了想要多參加教育部競賽,以便推甄名校大學的碩士班。沒想到後來到了所謂名校大學,看到不少名校大學大學部直升的學生幾乎是不用花太多時間做專題,更不用積極參加校外全國競賽,很輕易就可以直升本系碩士班(有些系所真的只看考生大學就讀的校名、系名,或者看是否有認識的教授推薦,就佔了大部分的錄取因素,但如此的作法確實也錄取了許多大學時期不太用心在專業方面的直升學生,說真的不少人的專業實力在大學時期是真的沒什麼累積,就連學科理論基礎也未必比較有概念),坦白說,時至今日,個人對某些不太客觀的推甄錄取標準現象仍感到有些感慨。

        分享一下10年前,於大二升大三的暑假時期,在實驗室開發的一個小作品(印象中這個小作品後來沒有拿去正式參賽,後續我和同學們還做了另外四至五個作品專案去參加教育部舉辦的競賽,也在大三這一年內,拿到了4個教育部競賽獎項),這是一個8051 MCU為核心的PCB電路,包含MCU韌體程式的撰寫(使用KEILC開發環境)、電路設計、PCB電路Layout和製作。這是就讀大學時期的第一個PCB電路  (記得在更久以前,在就讀高職時期,就有做過小型電子琴電路,當時也是洗板子,但印象中當時Layout好像是用手繪的方式..所以當時電子琴電路的走線沒辦法這麼筆直)。

        而當時還不流行Arduino這類的現成MCU板子,所以除了韌體程式和PC端GUI程式的撰寫之外,我們大學那間實驗室的電路板幾乎都是學生們自己做電路設計、Layout設計 和 洗版製作的。

        主要透過Counter計數來自8051 MCU外部的紅外線遮斷模組的訊號,並透過GPIO顯示於LCD,同時也藉由UART輸出串列資料,再藉由ICL232  IC將8051 UART訊號電氣位準轉換為RS232 Cable訊號位準,將資料傳輸資料至PC端由GUI程式做後續應用處理。

        當時設計製作的PCB電路,如下FB貼文中的照片所示。



        --------------------

        孫文良 (阿良的嵌入式系統技術學習區)

        個人簡介: https://sites.google.com/view/wenliangsun/

        【若需要嵌入式系統技術輔導課程 可來信洽談合作方式: iws6645@gmail.com,亦可先參考 課程招生網頁連結】