ARM開發板上uClinux內核移植

2020-12-05 電子產品世界

簡述:針對「如何在以S3C44B0X為核心的ARMSYS開發板上建立uClinux內核移植」的一個總結,其內容包括對Bootloader的功能分析和uClinux2.4.24發行版內核基礎上針對S3C44B0X開發板進行修改的重點內容的逐一列舉。

本文引用地址:http://www.eepw.com.cn/article/152110.htm

2.Bootloader

2.1Bootloader概述

Boot Loader

就是在作業系統內核運行之前運行的一段程序。通過這段程序,我們可以初始化硬體設備、建立內存空間的映射圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終調用作業系統內核准備好正確的環境。因此,正確建立uClinux移植的前提條件是具備一個與uClinux配套、易於使用的

Bootloader。

ARMSYS開發板提供了這樣一個uClinux專用的Bootloader,該Bootloader程序燒錄在系統的地址0x0處,每次上電即運行,能夠正確完成硬體系統的初始化和uClinux的引導。

理論上,uClinux引導時並非一定需要一個獨立於內核的Bootloader。然而,將Bootloader與內核分開設計能夠使軟體架構更加清晰,也有助於靈活地支持多種引導方式,實現一些有用的輔助功能。

ARMSYS提供的Bootloader的主要任務可以概括如下:

1.硬體初始化;

2.從主機下載新的內核映像和文件系統映像;

3.燒寫NorFlash和Nandflash;

4.加載uClinux 內核映像並啟動運行;

5.提供串行超級終端上的人機操作界面。

2.2存儲空間分布

Bootloader採用默認的存儲空間分布地址來加載uClinux內核、文件系統,並按照正確引導uClinux的運行。在ARMSYS的Bootloader中,默認的存儲空間分布如下表:

內容 起始地址

存儲介質

Bootloader程序空間 0x00000000

Flash

壓縮內核映像 0x00010000

Flash

ROM文件系統映像 0x000e0000

Flash

內核運行地址 0x0c008000

SDRAM

壓縮內核解壓地址 0x0c100000

SDRAM

文件系統加載 0x0c700000 SDRAM

這個存儲空間的分配方式也不是固定不變的,可以通過修改Bootloader中的相關代碼來改變。

2.3Bootloader的工作

完整的Bootloader引導流程可描述如下:

硬體初始化階段一

◎ 硬體初始化

◎ 複製二級中斷異常矢量表

◎ 初始化各種處理器模式

◎ 複製RO和RW,清零ZI

(跳轉到C代碼入口函數)

硬體初始化階段二

◎ 初始化本階段使用到的硬體設備;

◎ 建立人機界面

實現映像文件的下載和燒錄工具

◎ 實現映像文件的加載和運行工具

下面對上述各步驟進行逐一說明,並對與uClinux相關的內容詳細加以說明。

2.3.1 硬體初始化

板子上電或復位後,程序從位於地址0x0的Reset Exception

Vector處開始執行,因此需要在這裡放置Bootloader的第一條指令:b

ResetHandler,跳轉到標號為ResetHandler處進行第一階段的硬體初始化,主要內容為:關Watchdog

Timer,關中斷,初始化PLL和時鐘,初始化存儲器控制器。比較重要的是PLL的輸出頻率要計算正確,ARMSYS中把它設置為64MHz;這實際上就是處理器的工作主頻,這個時間參數在第二階段計算SDRAM的刷新計數值和UART的波特率等參數時還要用到。

2.3.2建立二級異常中斷矢量表

異常中斷矢量表(Exception Vector

Table)是Bootloader與uClinux內核發生聯繫關鍵的地方之一。即使uClinux內核已經得到處理器的控制權運行,一旦發生中斷,處理器還是會自動跳轉到從0x0地址開始的第一級異常中斷矢量表中的某個表項(依據於中斷類型)處讀取指令運行。

在編寫 Bootloader時,地址0x0處的一級異常中斷矢量表只需簡單地包含向二級異常中斷矢量表的跳轉指令就可以。這樣,就能夠正確地將發生的事件交給

uClinux的中斷處理程序來處理。對於uClinux內核,它在RAM空間中基地址為0xc000000處建立了自己的二級異常中斷矢量表,因此,

Bootloader的第一級異常中斷矢量表如下所示:

b ResetHandler ;Reset Handler

ldr

pc,=0x0c000004 ;Undefined Instruction Handler

ldr pc,=0x0c000008 ;Software

Interrupt Handler

ldr pc,=0x0c00000c ;Prefetch Abort Handler

ldr

pc,=0x0c000010 ;Data Abort Handler

b .

ldr pc,=0x0c000018 ;IRQ

Handler

ldr pc,=0x0c00001c ;FIQ Handler

LTORG

如果在Bootloader執行的全過程中都不必響應中斷,那麼上面的設置已能滿足要求。但在我們的

ARMSYS上提供了USB下載器,需要用到中斷,那麼Bootloader必須在同樣的地址(0xc000000)處配置自己的二級異常中斷矢量表,以便同uClinux兼容。這張表事先存放在

Flash Memory裡,引導過程中由Bootloader將其複製到RAM地址0x0C000000:

存放矢量表:

;IRQ ==the program put this phrase to 0xc000000

ExceptionHanlderBegin

b .

ldr pc, MyHandleUndef ; HandlerUndef

ldr

pc, MyHandleSWI ; HandlerSWI

ldr pc, MyHandlePabort ; HandlerPabort

ldr

pc, MyHandleDabort ; HandlerDAbort

b . ; HandlerReserved

ldr pc,

MyHandleIRQ ; HandlerIRQ

ldr pc, MyHandleFIQ ; HandlerFIQ

MyHandleUndef DCD HandleUndef ;reserve a word(32bit)

MyHandleSWI DCD

HandleSWI

MyHandlePabort DCD HandlePabort

MyHandleDabort DCD

HandleDabort

MyHandleIRQ DCD HandleIRQ

MyHandleFIQ DCD HandleFIQ

ExceptionHanlderEnd

建立二級矢量表:

;****************************************************

;* Setup IRQ handler

*

;****************************************************

ldr

r0,=(_IRQ_BASEADDRESS + 0x100)

ldr r2,=_IRQ_BASEADDRESS

add r3,r0,

#0x100

0

CMP r0, r3

STRCC r2, [r0], #4;cc:Carry clear;save R2 to R0

address, R0 =R0+ 4。

BCC %B0

ldr r1,=_IRQ_BASEADDRESS

ldr r0,=ExceptionHanlderBegin ;if there isn't

'subs pc,lr,#4' at 0x18, 0x1c

ldr r3,=ExceptionHanlderEnd

0

CMP r0, r3

;put the vector table at _IRQ_BASEADDRESS(0xc000000)

LDRCC r2, [r0],

#4

STRCC r2, [r1], #4

BCC %B0

ldr r1,=DIsrIRQ;put the IRQ judge program at

_IRQ_BASEADDRESS+0x80(0xc000080)

ldr r0,=IsrIRQ ;if there isn't 'subs

pc,lr,#4' at 0x18, 0x1c

ldr r3,=IsrIRQEnd

0

CMP r0, r3

LDRCC r2,

[r0], #4

STRCC r2, [r1], #4

BCC %B0

ldr r1, =MyHandleIRQ ;MyHandleIRQ point to DIsrIRQ

ldr r0,

=ExceptionHanlderBegin

ldr r4, =_IRQ_BASEADDRESS;

sub r0, r1, r0

add

r0, r0,r4

ldr r1, =DIsrIRQ

str r1, [r0]

定義Handlexxx:

^ (_IRQ_BASEADDRESS)

HandleReset # 4

HandleUndef # 4

HandleSWI #

4

HandlePabort # 4

HandleDabort # 4

HandleReserved # 4

HandleIRQ #

4

HandleFIQ # 4

^ (_IRQ_BASEADDRESS+0x80)

DIsrIRQ # 4

;IntVectorTable

^

(_IRQ_BASEADDRESS+0x100)

HandleADC # 4

HandleRTC # 4

HandleUTXD1 #

4

HandleUTXD0 # 4

HandleSIO # 4

HandleIIC # 4

HandleURXD1 #

4

HandleURXD0 # 4

HandleTIMER5 # 4

HandleTIMER4 # 4

HandleTIMER3 #

4

HandleTIMER2 # 4

HandleTIMER1 # 4

HandleTIMER0 # 4

HandleUERR01 #

4

HandleWDT # 4

HandleBDMA1 # 4

HandleBDMA0 # 4

HandleZDMA1 #

4

HandleZDMA0 # 4

HandleTICK # 4

HandleEINT4567 # 4

HandleEINT3 #

4

HandleEINT2 # 4

HandleEINT1 # 4

HandleEINT0 # 4

將異常中斷矢量重構到SDRAM,這樣的好處就是可以在其它的功能程序內對中斷處理程序的地址任意賦值。為此,我們在44b.h文件中定義:

/* ISR */

#define pISR_RESET (*(unsigned

*)(_IRQ_BASEADDRESS+0x0))

#define pISR_UNDEF (*(unsigned

*)(_IRQ_BASEADDRESS+0x4))

#define pISR_SWI (*(unsigned

*)(_IRQ_BASEADDRESS+0x8))

#define pISR_PABORT (*(unsigned

*)(_IRQ_BASEADDRESS+0xc))

#define pISR_DABORT (*(unsigned

*)(_IRQ_BASEADDRESS+0x10))

#define pISR_RESERVED (*(unsigned

*)(_IRQ_BASEADDRESS+0x14))

#define pISR_IRQ (*(unsigned

*)(_IRQ_BASEADDRESS+0x18))

#define pISR_FIQ (*(unsigned

*)(_IRQ_BASEADDRESS+0x1c))

#define pISR_ADC (*(unsigned *)(_IRQ_BASEADDRESS+0x100))//0x20))

#define

pISR_RTC (*(unsigned *)(_IRQ_BASEADDRESS+0x104))//0x24))

#define pISR_UTXD1

(*(unsigned *)(_IRQ_BASEADDRESS+0x108))//0x28))

#define pISR_UTXD0

(*(unsigned *)(_IRQ_BASEADDRESS+0x10c))//0x2c))

#define pISR_SIO (*(unsigned

*)(_IRQ_BASEADDRESS+0x110))//0x30))

#define pISR_IIC (*(unsigned

*)(_IRQ_BASEADDRESS+0x114))//0x34))

#define pISR_URXD1 (*(unsigned

*)(_IRQ_BASEADDRESS+0x118))//0x38))

#define pISR_URXD0 (*(unsigned

*)(_IRQ_BASEADDRESS+0x11c))//0x3c))

#define pISR_TIMER5 (*(unsigned

*)(_IRQ_BASEADDRESS+0x120))//0x40))

#define pISR_TIMER4 (*(unsigned

*)(_IRQ_BASEADDRESS+0x124))//0x44))

#define pISR_TIMER3 (*(unsigned

*)(_IRQ_BASEADDRESS+0x128))//0x48))

#define pISR_TIMER2 (*(unsigned

*)(_IRQ_BASEADDRESS+0x12c))//0x4c))

#define pISR_TIMER1 (*(unsigned

*)(_IRQ_BASEADDRESS+0x130))//0x50))

#define pISR_TIMER0 (*(unsigned

*)(_IRQ_BASEADDRESS+0x134))//0x54))

#define pISR_UERR01 (*(unsigned

*)(_IRQ_BASEADDRESS+0x138))//0x58))

#define pISR_WDT (*(unsigned

*)(_IRQ_BASEADDRESS+0x13c))//0x5c))

#define pISR_BDMA1 (*(unsigned

*)(_IRQ_BASEADDRESS+0x140))//0x60))

#define pISR_BDMA0 (*(unsigned

*)(_IRQ_BASEADDRESS+0x144))//0x64))

#define pISR_ZDMA1 (*(unsigned

*)(_IRQ_BASEADDRESS+0x148))//0x68))

#define pISR_ZDMA0 (*(unsigned

*)(_IRQ_BASEADDRESS+0x14c))//0x6c))

#define pISR_TICK (*(unsigned

*)(_IRQ_BASEADDRESS+0x150))//0x70))

#define pISR_EINT4567 (*(unsigned

*)(_IRQ_BASEADDRESS+0x154))//0x74))

#define pISR_EINT3 (*(unsigned

*)(_IRQ_BASEADDRESS+0x158))//0x78))

#define pISR_EINT2 (*(unsigned

*)(_IRQ_BASEADDRESS+0x15c))//0x7c))

#define pISR_EINT1 (*(unsigned

*)(_IRQ_BASEADDRESS+0x160))//0x80))

#define pISR_EINT0 (*(unsigned

*)(_IRQ_BASEADDRESS+0x164))//0x84))

例如,我們要使用到Exint4567中斷,定義好中斷處理程序Meint4567Isr()後,僅需要一條語句:

pISR_EINT4567=(int)MEint4567Isr;

就能使中斷發生後正確跳轉到我們編寫的處理程序上。

2.3.3 初始化各種處理器模式

ARM7TDMI支持7種Operation

Mode:User,FIQ,IRQ,Supervisor,Abort,System和Undefined。Bootloader需要依次切換到每種模式,初始化其程序狀態寄存器(SPSR)和堆棧指針(SP)。

2.3.4 複製RO和RW,清零ZI

一個ARM由RO,RW和ZI三個段組成,其中RO為代碼段,RW是已初始化的全局變量,ZI是未初始化的全局變量(對於GNU工具,對應的概念是

TEXT,DATA和BSS)。Bootloader要將RW段複製到RAM中,並將ZI段清零。編譯器使用下列符號來記錄各段的起始和結束地址:

|Image$$RO$$Base| :RO段起始地址

|Image$$RO$$Limit|

:RO段結束地址加1

|Image$$RW$$Base| :RW段起始地址

|Image$$RW$$Limit|

:ZI段結束地址加1

|Image$$ZI$$Base| :ZI段起始地址

|Image$$ZI$$Limit| :ZI段結束地址加1

需要注意的是,這些標號的值是根據連結器中設置的中ro-base和rw-base的設置來計算的,我們的Bootloader的對應設置是:ro-base =

0xc000000, rw-base = 0xc5f0000。

完成這個步驟後,第一階段的硬體初始化就完成了。

BL Main

跳轉到C語言程序,開始第二階段的初始化和系統引導。

2.3.5 C語言中的硬體初始化

繼續對硬體進行初始化,主要包括對以下設備的初始化:GPIO,Cache,Interrupt Controller,Watchdog

Timer和UARTs。S3C44B0X處理器內置data/instruction合一的8KB

Cache,且允許按地址範圍設置兩個Non-Cacheable區間。合理的配置是打開對RAM區間的Cache,關閉對其它地址區間(非存儲器設備, I/O設備

)的Cache。所有硬體初始化完畢之後,開中斷。

2.3.6 建立人機界面

引導過程的最後一步是在串行終端上建立人機界面,並等待用戶輸入命令。若接收到用戶輸入,則顯示菜單模式或命令行模式的交互界面,等待用戶進一步的命令。這裡就不對此詳細討論了。

2.4加載uClinux內核

ARMSYS

提供的Bootloader支持兩種uClinux啟動運行方式:直接從SDRAM中的內核映像中運行;從flash將壓縮格式的內核映像加載到

SDRAM,再從SDRAM運行。前者需要利用Bootloader提供的對映像文件下載的工具;後者則需要利用Bootloader提供的

flash燒錄工具進行燒錄,然後再加載運行。

壓縮格式的uClinux內核映像文件都是由開頭的一段自解壓代碼和後面的壓縮數據部分組成。對於Kernel而言,由於是以壓縮格式存放,因次只能以非XIP方式執行。自解壓類型的uClinux

內核映像文件首先存放在Flash Memory中,由Bootloader加載到SDRAM中的0xc100000地址處,然後將控制權交給它。可執行的uClinux

Kernel將被解壓到最終的執行空間,然後開始運行。壓縮格式Image所佔據的臨時SDRAM空間可在隨後由uClinux回收利用。

可以從flash拷貝到SDRAM解壓運行,自然同樣也可以直接下載到SDRAM運行。這對於調試內核都是非常方便的。對於壓縮格式的內核映像文件(image.rom和image.ram)都可以直接下載到SDRAM的特定地址處,並從該地址開始運行(參考2.2節)。

2.5調用Kernel

Bootloader調用uClinux 內核的方法是直接跳轉到Kernel的第一條指令處。

採用C語句:((void

(*)(void))ram_addr)();

2.6工具

ARMSYS

的Bootloader在人機界面上提供了8個功能項目,其中包括支持從主機通過USB口下載文件到目標板的SDRAM和Nandflash上;用

SDRAM中的數據燒寫Flash

Memory。由於USB口下載速度快,利用這些功能項能夠輕鬆地調試uClinux的內核(具體使用方法參考《uClinux移植包在ARMSYS上的使用說明》一文)。

對uClinux專用Bootloader的介紹到此,下面開始對uClinux的內核部分的移植進行說明。

3.uClinux2.4.24內核組成

◎arch:

arch目錄下有多個子目錄,它的每一個子目錄都代表內核支持的一種CPU體系結構,每個子目錄中又進一步分解為boot、mm、

kernel等子目錄,分別包含與系統引導、內存管理、系統調用的進入和返回、終端處理以及其它內核中依賴於CPU和系統結構的底層代碼。與ARM處理器(不帶有MMU)相關的代碼放在目錄arch/armnommu下,與S3C44B0X相關的代碼則放在目錄arch/armnommu/match-

S3C44B0X。

◎ include:include子目錄包括編譯核心所需要的大部分頭文件。與平臺無關的頭文件在

include/linux子目錄下,與ARM處理器(不帶MMU)相關的頭文件在include/asm-armnommu子目錄下,與

S3C44B0X相關的代碼在include/asm-armnommu/arch-S3C44B0X目錄下;

init:這個目錄包含核心的初始化代碼(注意:不是系統的引導代碼),包含兩個文件main.c和Version.c,這是研究核心如何工作的一個非常好的起點。

kernel:主要的核心代碼,此目錄下的文件實現了大多數linux系統的內核函數,其中最重要的文件當屬sched.c;同樣,和體系結構相關的代碼在arch/*/kernel中;

drivers: 放置系統所有的設備驅動程序;每種驅動程序又各佔用一個子目錄:如,/block 下為塊設備驅動程序,比如ide(ide.c)。

其他:例如mm ,這個目錄包括所有獨立於處理器體系結構的內存管理代碼,如頁式存儲管理內存的分配和釋放等;lib放置核心的庫代碼;net,核心與網絡相關的代碼;

ipc,這個目錄包含核心的進程間通訊的代碼;fs,所有的文件系統代碼和各種類型的文件操作代碼,它的每一個子目錄支持一個文件系統,例如fat和

ext2;Scripts,此目錄包含用於配置核心的腳本文件等。

Linux Kernel Tree List

一般在每個目錄下,都有一個.depend 文件和一個 Makefile

文件,這兩個文件都是編譯時使用的輔助文件,仔細閱讀這兩個文件對弄清各個文件這間的聯繫和依託關係很有幫助;而且,在有的目錄下還有Readme

文件,它是對該目錄下的文件的一些說明,同樣有利於我們對內核源碼的理解。

uClinux-dist-20040408發行包中的內核對S3C44B0X處理器的支持是不完整的,因此,我們不能夠希望在make

config配置選項中選中44B0X目標板後,直接編譯它來得到一個很好地支持44B0X開發板的內核映像,我們必須為內核打上補丁。針對ARMSYS

的補丁文件可以在http://www.hzlitai.com.cn/download/default.asp地址處下載得到。這款補丁是眾多愛好

uClinux和44B0X處理器的網友們共同完成的。下一節我們就對這個補丁中的主要修改項目進行介紹和分析,從中了解uClinux移植中的要點。

相關焦點

  • arm開發板與樹莓派有什麼區別
    ARM開發板和樹莓派有什麼區別   使用的處理器的內核不同。樹莓派使用的是ARM-M9內核的處理器,是ARM開發板的一種。ARM開發板不是樹莓派。ARM開發板因為使用的MCU的內核不同可以分為很多版本,比如STM32F0系列是ARM-M0,STM32F1/F2系列是ARM-M3,STM32F3/F4系列是ARM-M4內核。
  • ARM微處理器的uC/OS的移植設計
    它使用ARM公司的16位/32位RISC結構,內核是arm7TDMI,工作在66MHz,片上集成了以下部件:8K Cache、外部存儲器控制器、LCD控制器、4個DMA通道、2個UART、1個多主I2C總線控制器、1個I2C總線控制器,以及5通道PWM定時器和1個內部定時器、8通道12位ADC等,能夠與常用的外圍設備實現無縫連接,功能強大。目前,國內應用較為廣泛。
  • 基於S3C44B0晶片的uClinux內核引導過程分析
    在S3C44B0晶片上移植 uClinux作業系統,能夠充分發揮該晶片系統資源豐富(相對單片機而言)的特點,開發出功能強大的應用產品。嵌入式系統的啟動引導程序與硬體嚴格相關,對編寫人員的要求較高,而在移植uClinux後又大大增加了引導程序的複雜程度,因此這部分代碼往往是各個嵌入式產品開發廠商嚴格保密的部分。
  • net-snmp移植到arm
    關於net-snmp的移植,是基於靜態編譯的,動態的沒有做成功,在arm上的移植過程大致如下:如果沒有涉及到擴展agent,則藍色字體不需要理會。tar -xzvf net-snmp-5.4.1.tar.gz,若想擴展agent,則可以將此模塊的.c和.h文件先放到net-snmp-5.4.4/agent/mibgroup下一起配置編譯;例如我這裡想用代理讀寫encoder模塊,那麼先將寫好的encoder源文件複製到net-snmp-5.4.4/agent/mibgroup路徑下;2.CC=arm-linux-gcc
  • ARM Linux根文件系統Root Filesystem的製作
    在使用devfs的內核裡如果沒有/dev,根本見不到Shell啟動的信息,因為內核找不到/dev/console;在使用udev的系統裡,也事先需要在/dev下建立console和null這兩個節點。關於devfs和udev的區別,網上很多文章說。當然如果你的內核已經不支持devfs了(2.6.12以後),可以使用純純的靜態節點。也就是用mknod人工生成。
  • ARM64 Linux 內核頁表的塊映射
    作者 | 宋寶華 責編 | 張文頭圖 | CSDN 下載自視覺中國內核文檔 Documentation/arm64/memory.rst 描述了 ARM64 Linux 內核空間的內存映射情況,應該是此方面最權威文檔。
  • AM335x(TQ335x)學習筆記——Nand&&網卡驅動移植
    移植完成音效卡驅動之後本想再接再勵,移植網卡驅動,但沒想到的是TI維護的內核太健壯,移植網卡驅動跟之前移植按鍵驅動一樣簡單,Nand驅動也是如此,於是,本人將Nand和網卡放在同一篇文章中介紹。介紹之前先感慨一下:TI的維護的內核真的很健壯,DTS真的很強大。1.
  • SiFive為HiFive Unmatched開發板升級內存
    致力於RISC-V市場發展的初創企業SiFive在10月公布一款名叫HiFive Unmatched的開發板,採用集成四個U74-MC內核+一個S7嵌入式內核組成的FU740 SoC,是目前最好的RISC-V開發板之一。
  • 谷歌為Coral開發板帶來Mendel Linux 4.0:基於Debian GNU/Linux 10
    上周末,谷歌正式宣布了 Mendel Linux 4.0「Day」的到來。
  • ARM指令學習筆記
    ARM946E-S是一種有5級流水線,集成有Thumb擴展功能、調試功能和哈佛總線的內核。在同樣工藝下,它是ARM7TDMI性能的兩倍以上。有了個簡單了解之後,開始投入到了arm指令的學習。arm7TDMI(-S)指令系統有兩套指令集,分別是32位的Arm指令集和16位的thumb指令集。簡單點說:arm支持arm內核的所有特點,具有高效、快速的特點;而thumb指令集靈活、小巧。
  • 從RTOS到Linux的應用移植
    在具體的應用移植過程中,還應考慮在Linux系統下解決上層應用實時響應底層硬體中斷,應用層與內核層的異步通信、數據交換,以及多進程、多線程的設計等問題。ioremap宏定義在asm/io.h內:#define ioremap(addr, size)__ioremap(addr, size, 0)__ioremap函數原型為(arm/mm/ioremap.c):void __iomem * __ioremap(unsigned long phys_addr, size_t size, unsigned long flags
  • 將Iphone中的三軸陀螺儀開源——STM32F429I Discovery開發板評測
    近日,愛板網拿到了意法半導體的又一款STM32F4 Discovery系列開發板,板卡基於強大的Cortex-M4內核的STM32F429微控制器,同時板載了一個曾在iphone4剛發布的時候,賈伯斯聲稱的非常神奇的玩意——三軸陀螺儀,一起去瞧瞧。
  • 51單片機開發板上步進電機的總結經驗
    轉子齒數按公式推算可得為8個,步距角應為11.25度,給出的資料那應該叫半步距角.其它的參數均可按照參數圖中進行,電機可以用ULN2003A這個晶片來驅動,我決定先不看51hei官方提供的資料和實例程序,看憑自己的實力能不能讓這個小東西轉動起來,照著圖2的連線圖連了起來(那4個指示燈是我自己加上去的.方便觀察)並且把P1.0,P1.1,P1.2,P1.3四個I/O口和51hei單片機開發板
  • (文末申請開發板測評)
    1、利用東軟載波開發板進行ADC及PWM調光測試 【一】DHT11和RTC模塊部分代碼:該模塊的驅動只要對原有SDK程序進行簡單移植即可,主要是對IO管腳的配置。此次開發板評測活動,上海東軟載波微電子有限公司推出的是ES-PDS覆蓋全新的32位MCU--ES32F369x/ES32F366x/ES32F365x晶片。 ES32產品使用「原型開發系統」 (Prototype development system)是具有統一接口規範的一系列開發板。
  • STM32F469開發板-黑科技助推圖形顯示
    是不是有種感嘆,世界發展的太快,開發板都這麼玩了。ST的STM32F7 Discovery開發板非常相似。 TouchGFX是一個獨特的軟體框架,可以在低性能的硬體上實現媲美智慧型手機上的圖形用戶界面(GUI),一句話,如果你有在MCU上跑圖形用戶界面的需求,一旦你用了Touch GFX,那就再也回不去了。 點開Touch GFX,裡面有幾個功能項,如下圖所示。
  • uC/OS-II在EP7312上的移植
    1 μC/OS-II簡介  μC/OS-II並非一個完整的實時作業系統,它只是一個實時內核。μC/OS-II不像其它實時作業系統一樣,提供給用戶的是一個標準的API函數,程序開發人員利用作業系統提供的API函數進行應用程式的開發。要想在μC/OS-II內核上進行應用程式的開發,就需要程序開發人員在實時內核的基礎上建立自己的實時作業系統。
  • ARM學習筆記--GPIO接口
    1.1.3 GPxUP寄存器 GPxUP:某位為1時,相應引腳無內部上拉電阻;為0時,相應引腳使用內部上拉電阻。 上拉電阻的作用在於:當GPIO引腳處於第三態(即不是輸出高電平,也不是輸出低電平,而是呈高阻態,即相當於沒接晶片)時,它的電平狀態由上拉電阻、下拉電阻確定。
  • ARM 浮點運算詳解
    一:早期ARM上的浮點模擬器:早期的ARM沒有協處理器,所以浮點運算是由CPU來模擬的,即所需浮點運算均在浮點運算模擬器(float math emulation)上進行,需要的浮點運算,常要耗費數千個循環才能執行完畢,因此特別緩慢。
  • 麒麟座迷你開發板
    聯網功能作為物聯網方面的開發板,麒麟座迷你開發板通過板載WIFI模塊進行聯網,模塊型號為ESP8266_01,通過串口與單片機通信,接入簡單方便,資料齊全。當然,用戶想用其他的方式聯網,也可以通過擴展IO進行擴展。