arduino i2c 如何写16位寄存器_Arduino之我见
Arduino是一款時尚流行的開源軟件&硬件平臺,其開發入門簡單,是眾多DIY玩家及創客的首選。目前,Arduino也開始進入了中小學的創客課程。然而在與很多玩家、學生或是創客老師交流的過程中,總能聽到這樣的疑問:Arduino到底是不是單片機?Arduino和單片機有什么區別?玩Arduino是不是必須與單片機結合?Arduino是不是只能給小朋友或者DIY玩家玩玩,做不了產品?為了訴清這些疑問,特此發表一下我的見解。
首先給出一個明確的回答:玩Arduino就是在玩單片機,和玩“51”或“STM32”一樣,都是玩單片機。既然都是單片機,那么它們的開發過程其實都是一樣的,都要經過:編程—編譯—燒錄的過程。而它們最大的差異就在編程這個環節,而后面的編譯和燒錄都是一樣的,也就是說,無論你用什么編程:C語言、匯編、圖形,都要經過編譯,得到由0和1組成的機器碼,最后再把機器碼燒錄到單片機內部,單片機才能執行我們設計的程序。下面我們開始深入并且通俗地來說說Arduino。
Arduino系列的開發板,我們常用的NANO及UNO板,板載的單片機就是ATMEL(愛特梅爾)的mega328p單片機,而MEGA板則板載mega2560單片機,我們通常叫它AVR單片機。下面圍繞NANO板來論述。
Arduino NANO板
ATMEL MEGA328P單片機
從上圖我們可以看到,NANO板上的引腳(端口)旁邊都標注一些編號:D2,D3…D13;A0,A1…A7;TX1、RX0;而這些固定編號的引腳都通過電路板上的“走線”一一對應地連接到mega328p單片機的引腳,這個“對應關系”我們也可以從Arduino官方提供的電路原理圖上看到,如下圖:
NANO板—mega328p引腳映射圖
圖中“紅色框”部分為NANO板上標注出的引腳編號,它的順序由“Arduino”定義;“藍色框”部分為mega328p芯片的引腳編號,這個由芯片生產廠商定義;“綠色框”為mega328p單片機的引腳分組騙號,也由芯片生產廠商定義。下面給出mega328p的引腳圖:
MEGA328P單片機引腳圖
綜合以上兩圖,我們可以看到完整的引腳映射。例如,NANO板的D2引腳連接的是mega328p芯片的第32號引腳,該引腳屬于mega328p單片機引腳分組的D組第2號引腳(PD2)。這里的引腳分組,對應的則是芯片內部引腳控制寄存器,D組的8個引腳(PD0-PD7)由一個寄存器進行控制,也就是說,如果我們要控制PD0-PD7中任意一個引腳,都要對D組的寄存器進行賦值控制。下面我們來看看用NANO板的D2引腳來控制一個LED閃爍(假設高電平點亮,也就是將D2引腳的電平設置為高,且延時函數delay()已定義),不同的代碼實現。
首先是Arduino IDE(Arduino官方開發環境)的C代碼:
int led_0= 2;
pinMode(led_0,OUTPUT);
digitalWrite(led_0,HIGH);
delay(1000);
digitalWrite(led_0,LOW);
delay(1000);
或者: int led_0= 2;
pinMode(led_0,OUTPUT);
digitalWrite(led_0, 1);
delay(1000);
digitalWrite(led_0, 0);
delay(1000);
接下來是AVR寄存器操作C代碼:
DDRD |= 0x04;
PORTD |= 0X04;
delay(1000);
PORTD &= ~0X04;
delay(1000);
或者: DDRD |= BIT(2);
PORTD |= BIT(2);
delay(1000);
PORTD &= ~BIT(2);
delay(1000);
最后來看看圖形代碼(Krobot-啃蘿卜):
以上幾種代碼都實現了NANO板D2引腳控制的LED閃爍的效果。但其中最為直觀的就是圖形代碼,其次就是Arduino IDE中的C代碼。在圖形編程中我們只要確定LED連接到了板上的幾號引腳,然后拖動相應的圖標并設置一下參數就可以完成程序編寫;而在Arduino IDE中,是要稍有英語基礎,也可以直觀的對板上的引腳編號進行“數字寫”操作(digitalWrite)就可以完成程序的編寫。而直接操作AVR寄存器,則需要結合芯片引腳圖,確定需要操作的引腳編號,然后從芯片手冊中查找到相應的寄存器,對相應的寄存器進行操作才能實現同樣的效果,而這也就是單片機編程最為復雜繁瑣的地方,成百上千的寄存器,以及寄存器中各數據位的定義無形成為了入門單片機的一個門檻,讓很多初學者“望而卻步”。
那么,這幾種代碼之間存在著怎樣的聯系呢?實際上,AVR指令集編寫的代碼是圖形和Arduino IDE代碼的核心。我們首先來說說ArduinoIDE。Arduino的創始團隊首先建立硬件平臺,這個平臺包括所有Arduino所有系列的開發板,并且這些開發板的引腳定義建立了一個“統一”的機制;然后根據芯片型號及引腳定義機制,基于AVR指令集編寫了所有操作的底層代碼,這些代碼中提供了我們可以訪問或調用的函數接口,讓開發者避開了繁瑣的寄存器操作,從而單片機的編程開發變得簡單了很多。例如UART串口(serial)的操作,我們在ArduinoIDE中開發,只需知道我們要使用的串口編號是多少(NANO、UNO默認只有串口0,而mega則有4個串口:serial0-serial3),然后簡單的在初始化setup()中調用函數Serial.begin(波特率)即可完成串口啟動及波特率的設置,而其背后實質上已經對相關的寄存器進行了操作。因此,Arduino實質上是包括了一系列硬件系統的定義及打包好的底層驅動程序,這些打包好的底層驅動程序,我們可以稱它們為“庫”或者“庫函數”,Arduino也可以看作是AVR單片機的“庫開發”,而對硬件系統的定義及庫函數也保證了同一個代碼可以快速地“移植”到不同的單片機中,例如上面的代碼在可以在NANO中運行也可以在mega中運行,只要保證LED接到板上標注的2號引腳,在燒錄程序之前正確設置“開發板型號”就可以在不同的板上實現同樣的效果。以上所提到的“庫”稱為Arduino官方庫即底層驅動,我們可以在ArduinoIDE根目錄的文件夾中找到一個名為“hardware”(即硬件)的文件夾,里面存放的就是底層驅動代碼。同時,在這個根目錄下,還有一個文件夾:“libraries”,即“庫”,這個庫則是基于底層庫二次開發的或是基于AVR指令集開發的非官方庫函數,也稱為第三方庫,主要是一些外部傳感器、模塊的驅動程序,這部分庫函數我們可以從網絡上下載別人寫好的,也可以自己寫,寫好的庫函數按照一定的規則存放在這個文件夾中就可以使用了。下面以mpu6050陀螺儀的驅動為例,再次說明。
首先,官方驅動庫中提供了I2C總線的驅動庫(即Wire庫),然后我們可以在網上找到一個基于Wire庫開發的I2C讀寫操作的庫和一個基于I2C讀寫操作庫開發的mpu6050驅動庫。在使用mpu6050時,我們的重點是得到三軸加速度值及三軸角速度值,而要得到這6個數據,我們要通過I2C總線訪問陀螺儀內部的12個寄存器,并且在上電初始化時,還必須通過I2C總線去設置陀螺儀內部的一些寄存器,才能從陀螺儀獲得正確的數據,而這一系列操作是比較繁瑣的,對于初學者即便是使用了官方的驅動庫,也會被I2C的時序搞得暈頭轉向。而有了mpu6050對應的庫函數以后,我們甚至可以不知道I2C是個啥,也不知道陀螺儀里有些什么“稀奇古怪”的寄存器,就稀里糊涂地得到了陀螺儀的數據。這就是庫的“魅力”所在。
而圖形編程,也是建立在“庫”的基礎之上的,有些圖形化編程界面是ArduinoIDE的插件,有些圖形編程軟件的文件里,都附帶一個ArduinoIDE。對于這一塊,我了解得也不是足夠深入,因此不作過多的討論了。
總而言之,玩Arduino就是玩單片機,玩的就是基于庫函數的AVR單片機開發,而目前Arduino官方也推出了搭載ARM內核單片機的開發板及相關的庫函數,例如DUE板(引腳與MEGA2560板一致)、STAR OTTO板(國內暫未上市,搭載STM32F469單片機),這些都是32位的單片機,運算處理速度比我們常用的那些板(NANO、UNO、mega2560)要高出很多,借助“庫”的幫助,我們依然可以輕松入門。
Arduino mega2560板
Arduino DUE板
Arduino STAR OTTO板
庫函數給入門開發帶來了極大的方便,那么,我們是不是可以完完全全地依賴“庫”呢?我的看法是:如果只是搞一搞簡單的小制作,做一些簡單的流程化控制,搞搞科普展示或者青少年的簡單體驗課程,那么依靠圖形或是完完全全地依賴庫,是沒有任何問題的。但如果要做一些較為復雜的產品設計,那還是應該深入地學習一下,即便不直接操作寄存器,也應該了解一個庫是如何編寫的,庫里有哪些函數、變量是可以調用的,哪些函數、變量是庫“私有”的(不可調用),它的執行效率如何,再者,還應該深入了解一下:系統時鐘、I2C總線時序、SPI總線時序、UATR串口(Serial)、外部中斷、定時中斷及計數、ADC功能(模擬-數字轉換),DAC(數字-模擬轉換)及PWM(脈沖寬度調制)。掌握了這些知識就可以對自己的開發有一個更好的把握,就可以決策哪些地方可以用什么庫,哪些地方需要自己寫驅動,哪些庫可以進行怎樣的修改,或者自己該如何寫庫,以滿足設計要求。系統實時性是單片機開發的一個重要指標,比如無人機的飛控系統、自平衡小車控制系統,都有很高的實時性及時序要求,這是算法實現的基本保障,而如果忽略了這個問題,不管用什么單片機、用什么編程,最終得出只能是被視為“玩玩”的東西。就性能而言,Arduino使用的AVR系列單片機,在8位機中算是比較強大的了,處理速度和內部存儲空間都是比較“寬?!钡?。其實很多電子產品中都有AVR的“身影”,例如很多航模無人機使用的無刷電機控制器,鋰電池保姆充電器,還有大名鼎鼎、風靡全球的開源無人機飛控系統—APM都是AVR“干的”,而且APM還是基于Arduino開發的。當然了,AVR跟STM32或NXP系列相比,那肯定是相差甚遠的,要知道那是32位的,而且系統時鐘頻率一般都72M或更高,運算處理速度是相當快的,而且還有更豐富的片上資源。但是,并不是所有系統都需要這樣高性能的芯片,為項目選擇合適的芯片才是最好的。
最后總結,玩Arduino,就是玩單片機。至于“玩”到什么程度,完全取決于自己的需求。如果玩得深入,Arduino可以幫助我們深入地理解“庫”的概念,從而順利過渡到STM32的庫開發學習。
以上就是我個人的理解,有不對的地方敬請批評指正,共同學習,共同進步。
總結
以上是生活随笔為你收集整理的arduino i2c 如何写16位寄存器_Arduino之我见的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bp神经网络隐含层神经元个数_CNN,残
- 下一篇: Lightning被淘汰 iPhone