<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          ARM S3C2410硬件手冊(cè)重點(diǎn)

          ——
          作者: 時(shí)間:2007-12-11 來(lái)源:電子開(kāi)發(fā)網(wǎng) 收藏

          a.Memory Controller
          b.Nand Flash
          c.UART
          d.Interrupt
          e.Timer

          Memory Controller
          SDRAM:
            提供了外接ROM、SRAM、SDRAM、NOR Flash、NAND Flash的接口。外接存儲(chǔ)器的空間被分為8 BANKS,每BANK容量為128M:當(dāng)訪問(wèn)BANKx(x從0到7)所對(duì)應(yīng)的地址范圍x*128M到(x+1)*128M-1
            SDRAM使用BANK6,它的物理起始地址為6*128M=0x30000000。

          SDRAM(刷新):
            之所以稱為DRAM,就是因?yàn)樗粩噙M(jìn)行刷新(Refresh)才能保留住數(shù)據(jù),因此它是DRAM最重要的操作。
          那么要隔多長(zhǎng)時(shí)間重復(fù)一次刷新呢?目前公認(rèn)的標(biāo)準(zhǔn)是,存儲(chǔ)體中電容的數(shù)據(jù)有效保存期上限是64ms(毫秒,1/1000秒),也就是說(shuō)每一行刷新的循環(huán)周期是64ms。這樣刷新速度就是:行數(shù)量/64ms
          刷新操作分為兩種:自動(dòng)刷新(Auto Refresh,簡(jiǎn)稱AR)與自刷新(Self Refresh,簡(jiǎn)稱SR)。不論是何種刷新方式,都不需要外部提供行地址信息,因?yàn)檫@是一個(gè)內(nèi)部的自動(dòng)操作。對(duì)于AR, SDRAM內(nèi)部有一個(gè)行地址生成器(也稱刷新計(jì)數(shù)器)用來(lái)自動(dòng)的依次生成行地址。
              由于刷新涉及到所有L-Bank,因此在刷新過(guò)程中,所有L-Bank都停止工作,而每次刷新所占用的時(shí)間為9個(gè)時(shí)鐘周期(PC133標(biāo)準(zhǔn)),之后就可進(jìn)入正常的工作狀態(tài),也就是說(shuō)在這9 個(gè)時(shí)鐘期間內(nèi),所有工作指令只能等待而無(wú)法執(zhí)行。
              SR則主要用于休眠模式低功耗狀態(tài)下的數(shù)據(jù)保存,這方面最著名的應(yīng)用就是STR(Suspend to RAM,休眠掛起于內(nèi)存)。在發(fā)出AR命令時(shí),將CKE置于無(wú)效狀態(tài),就進(jìn)入了SR模式,此時(shí)不再依靠系統(tǒng)時(shí)鐘工作,而是根據(jù)內(nèi)部的時(shí)鐘進(jìn)行刷新操作。

          SDRAM(寄存器設(shè)置):
          本實(shí)驗(yàn)介紹如何使用SDRAM,這需要設(shè)置13個(gè)寄存器。由于我們只使用了BANK6,大部分的寄存器我們不必理會(huì):
          1.BWSCON:對(duì)應(yīng)BANK0-BANK7,每BANK使用4位。這4位分別表示:
          a.STx:?jiǎn)?dòng)/禁止SDRAM的數(shù)據(jù)掩碼引腳,對(duì)于SDRAM,此位為0;對(duì)于SRAM,此位為1。
          b.WSx:是否使用存儲(chǔ)器的WAIT信號(hào),通常設(shè)為0
          c.DWx:使用兩位來(lái)設(shè)置存儲(chǔ)器的位寬:00-8位,01-16位,10-32位,11-保留。
          d.比較特殊的是BANK0對(duì)應(yīng)的4位,它們由跳線決定,只讀。
          對(duì)于本開(kāi)發(fā)板,使用兩片容量為32Mbyte、位寬為16的SDRAM組成容量為64Mbyte、位寬為32的存儲(chǔ)器,所以其BWSCON相應(yīng)位為: 0010。對(duì)于本開(kāi)發(fā)板,BWSCON可設(shè)為0x22111110:其實(shí)我們只需要將BANK6對(duì)應(yīng)的4位設(shè)為0010即可,其它的是什么值沒(méi)什么影響,這個(gè)值是參考上給出的。
          2.BANKCON0-BANKCON5:我們沒(méi)用到,使用默認(rèn)值0x00000700即
          3. BANKCON6-BANKCON7:設(shè)為0x00018005 在8個(gè)BANK中,只有BANK6和BANK7可以使用SRAM或SDRAM,所以BANKCON6-7與BANKCON0-5有點(diǎn)不同: a.MT([16:15]):用于設(shè)置本BANK外接的是SRAM還是SDRAM:SRAM-0b00,SDRAM-0b11
          b.當(dāng)MT=0b11時(shí),還需要設(shè)置兩個(gè)參數(shù): Trcd([3:2]):RAS to CAS delay,設(shè)為推薦值0b01 SCAN([1:0]):
          SDRAM的列地址位數(shù),對(duì)于本開(kāi)發(fā)板使用的SDRAM HY57V561620CT-H,列地址位數(shù)為9,所以SCAN=0b01。如果使用其他型號(hào)的SDRAM,您需要查看它的數(shù)據(jù)來(lái)決定SCAN的取值:00-8位,01-9位,10-10位
          4. REFRESH(SDRAM refresh control register):設(shè)為0x008e0000+ R_CNT 其中R_CNT用于控制SDRAM的刷新周期,占用REFRESH寄存器的[10:0]位,它的取值可如下計(jì)算(SDRAM時(shí)鐘頻率就是HCLK):
          R_CNT = 2^11 + 1 – SDRAM時(shí)鐘頻率(MHz) * SDRAM刷新周期(uS)
          在未使用PLL時(shí),SDRAM時(shí)鐘頻率等于晶振頻率12MHz;
          SDRAM 的刷新周期在SDRAM的數(shù)據(jù)上有標(biāo)明,在本開(kāi)發(fā)板使用的SDRAM HY57V561620CT-H的數(shù)據(jù)手冊(cè)上,可看見(jiàn)這么一行“8192 refresh cycles / 64ms”:所以,刷新周期=64ms/8192 = 7.8125 uS。
          對(duì)于本實(shí)驗(yàn),R_CNT = 2^11 + 1 – 12 * 7.8125 = 1955, REFRESH=0x008e0000 + 1955 = 0x008e07a3
          5.BANKSIZE:0x000000b2
          位[7]=1:Enable burst operation
          位[5]=1:SDRAM power down mode enable
          位[4]=1:SCLK is active only during the access (recommended) 位[2:1]=010:BANK6、BANK7對(duì)應(yīng)的地址空間與BANK0-5不同。BANK0-5的地址空間都是固定的128M,地址范圍是 (x*128M)到(x+1)*128M-1,x表示0到5。但是BANK7的起始地址是可變的,您可以從數(shù)據(jù)手冊(cè)第5章“Table 5-1. Bank 6/7 Addresses”中了解到BANK6、7的地址范圍與地址空間的關(guān)系。
          本開(kāi)發(fā)板僅使用BANK6的64M空間,我們可以令位[2:1]=010(128M/128M)或001(64M/64M):這沒(méi)關(guān)系,多出來(lái)的空間程序會(huì)檢測(cè)出來(lái),不會(huì)發(fā)生使用不存在的內(nèi)存的情況——后面介紹到的bootloader和linux內(nèi)核都會(huì)作內(nèi)存檢測(cè)。 位[6]、位[3]沒(méi)有使用
          6.MRSRB6、MRSRB7:0x00000030
          能讓我們修改的只有位[6:4](CL),SDRAM HY57V561620CT-H不支持CL=1的情況,所以位[6:4]取值為010(CL=2)或011(CL=3)。

          Nand Flash
          當(dāng)OM1、OM0都是低電平——即開(kāi)發(fā)板插上BOOT SEL跳線時(shí),S3C2410從NAND Flash啟動(dòng):NAND Flash的開(kāi)始4k代碼會(huì)被自動(dòng)地復(fù)制到內(nèi)部SRAM中。我們需要使用這4k代碼來(lái)把更多的代碼從NAND Flash中讀到SDRAM中去。
          NAND Flash的操作通過(guò)NFCONF、NFCMD、NFADDR、NFDATA、NFSTAT和NFECC六個(gè)寄存器來(lái)完成。在開(kāi)始下面內(nèi)容前,請(qǐng)打開(kāi)S3C2410數(shù)據(jù)手冊(cè)和NAND Flash K9F1208U0M的數(shù)據(jù)手冊(cè)。

          在S3C2410數(shù)據(jù)手冊(cè)218頁(yè),我們可以看到讀寫NAND Flash的操作次序:
          1.Set NAND flash configuration by NFCONF register.
          2.Write NAND flash command onto NFCMD register.
          3.Write NAND flash address onto NFADDR register.
          4.Read/Write data while checking NAND flash status by NFSTAT register. R/nB signal should be checked before read operation or after program operation.

          1、NFCONF:設(shè)為0xf830——
          使能NAND Flash控制器、初始化ECC、NAND Flash片選信號(hào)nFCE=1(inactive,真正使用時(shí)再讓它等于0)

          設(shè)置TACLS、TWRPH0、TWRPH1。
          需要指出的是TACLS、TWRPH0和TWRPH1,請(qǐng)打開(kāi)S3C2410數(shù)據(jù)手冊(cè)218頁(yè),可以看到這三個(gè)參數(shù)控制的是NAND Flash信號(hào)線CLE/ALE與寫控制信號(hào)nWE的時(shí)序關(guān)系。
          我們?cè)O(shè)的值為TACLS=0,TWRPH0=3,TWRPH1=0,其含義為:TACLS=1個(gè)HCLK時(shí)鐘,TWRPH0=4個(gè)HCLK時(shí)鐘,TWRPH1=1個(gè)HCLK時(shí)鐘。

          請(qǐng)打開(kāi)K9F1208U0M數(shù)據(jù)手冊(cè)第13頁(yè),在表“AC Timing Characteristics for Command / Address / Data Input”中可以看到: CLE setup Time = 0 ns,CLE Hold Time = 10 ns, ALE setup Time = 0 ns,ALE Hold Time = 10 ns, WE Pulse Width = 25 ns 可以計(jì)算,即使在HCLK=100MHz的情況下,TACLS+TWRPH0+TWRPH1=6/100 uS=60 ns,也是可以滿足NAND Flash K9F1208U0M的時(shí)序要求的。

          2、NFCMD: 對(duì)于不同型號(hào)的Flash,操作命令一般不一樣。對(duì)于本板使用的K9F1208U0M,請(qǐng)打開(kāi)其數(shù)據(jù)手冊(cè)第8頁(yè)“Table 1. Command Sets”
          3、NFADDR:地址
          4、NFDATA:數(shù)據(jù),只用到低8位
          5、NFSTAT:狀態(tài),只用到位0,0-busy,1-ready
          6、NFECC:校驗(yàn)

          現(xiàn)在來(lái)看一下如何從NAND Flash中讀出數(shù)據(jù):
          1、NFCONF = 0xf830
          2、在第一次操作NAND Flash前,通常復(fù)位一下:
          NFCONF &= ~0x800 (使能NAND Flash)
          NFCMD = 0xff (reset命令)
          循環(huán)查詢NFSTAT位0,直到它等于1
          3、NFCMD = 0 (讀命令)
          4、這步得稍微注意一下,請(qǐng)打開(kāi)K9F1208U0M數(shù)據(jù)手冊(cè)第7頁(yè),那個(gè)表格列出了在地址操作的4個(gè)步驟對(duì)應(yīng)的地址線,A8沒(méi)用到:
          NFADDR = addr & 0xff
          NFADDR = (addr>>9) & 0xff (注意了,左移9位,不是8位)
          NFADDR = (addr>>17) & 0xff (左移17位,不是16位)
          NFADDR = (addr>>25) & 0xff (左移25位,不是24位)
          5、循環(huán)查詢NFSTAT位0,直到它等于1
          6、連續(xù)讀NFDATA寄存器512次,得到一頁(yè)數(shù)據(jù)(512字節(jié))
          7、NFCONF |= 0x800 (禁止NAND Flash)

          {{分頁(yè)}}

          UART
          UART的寄存器有11X3個(gè)(3個(gè)UART)之多,我選最簡(jiǎn)單的方法來(lái)進(jìn)行本實(shí)驗(yàn),用到的寄存器也有8個(gè)。不過(guò)初始化就用去了5個(gè)寄存器,剩下的3個(gè)用于接收、發(fā)送數(shù)據(jù)。

          1、初始化:
          a.把使用到的引腳GPH2、GPH3定義為TXD0、RXD0:
          GPHCON |= 0xa0 GPHUP |= 0x0c (上拉)
          b.ULCON0 ( UART channel 0 line control register ):設(shè)為0x03 此值含義為:8個(gè)數(shù)據(jù)位,1個(gè)停止位,無(wú)校驗(yàn),正常操作模式(與之相對(duì)的是Infra-Red Mode,此模式表示0、1的方式比較特殊)。
          c.UCON0 (UART channel 0 control register ):設(shè)為0x05 除了位[3:0],其他位都使用默認(rèn)值。位[3:0]=0b0101表示:發(fā)送、接收都
          使用“中斷或查詢方式”——本實(shí)驗(yàn)使用查詢查詢方式。
          d.UFCON0 (UART channel 0 FIFO control register ):設(shè)為0x00 每個(gè)UART內(nèi)部都有一個(gè)16字節(jié)的發(fā)送FIFO和接收FIFO,但是本實(shí)驗(yàn)不使用FIFO,設(shè)為默認(rèn)值0
          e.UMCON0 (UART channel 0 Modem control register ):設(shè)為0x00 本實(shí)驗(yàn)不使用流控,設(shè)為默認(rèn)值0
          f.UBRDIV0 ( R/W Baud rate divisior register 0 ):設(shè)為12 本實(shí)驗(yàn)未使用PLL, PCLK=12MHz,設(shè)置波特率為57600,則由公式 UBRDIVn = (int)(PCLK / (bps x 16) ) –1 可以計(jì)算得UBRDIV0 = 12,請(qǐng)使用S3C2410數(shù)據(jù)手冊(cè)第314頁(yè)的誤差公式驗(yàn)算一下此波特率是否在可容忍的誤差范圍之內(nèi),如果不在,則需要更換另一個(gè)波特率(本實(shí)驗(yàn)使用的 57600是符合的)。
          void init_uart( )
          {//初始化UART
          GPHCON |= 0xa0; //GPH2,GPH3 used as TXD0,RXD0
          GPHUP = 0x0c; //GPH2,GPH3內(nèi)部上拉
          ULCON0 = 0x03; //8N1(8個(gè)數(shù)據(jù)位,無(wú)校驗(yàn)位,1個(gè)停止位)
          UCON0 = 0x05; //查詢方式
          UFCON0 = 0x00; //不使用FIFO
          UMCON0 = 0x00; //不使用流控
          UBRDIV0 = 12; //波特率為57600 10 }

          2、發(fā)送數(shù)據(jù):
          a.UTRSTAT0 ( UART channel 0 Tx/Rx status register ):位[2]:無(wú)數(shù)據(jù)發(fā)送時(shí),自動(dòng)設(shè)為1。當(dāng)我們要使用串口發(fā)送數(shù)據(jù)時(shí),先讀此位以判斷是否有數(shù)據(jù)正在占用發(fā)送口。位[1]:發(fā)送FIFO是否為空,本實(shí)驗(yàn)未用此位位[0]:接收緩沖區(qū)是否有數(shù)據(jù),若有,此位設(shè)為1。本實(shí)驗(yàn)中,需要不斷查詢此位一判斷是否有數(shù)據(jù)已經(jīng)被接收。
          b.UTXH0 (UART channel 0 transmit buffer register ): 把要發(fā)送的數(shù)據(jù)寫入此寄存器。
          void putc(unsigned char c)
          {
          while( ! (UTRSTAT0 & TXD0READY) ); //不斷查詢,直到可以發(fā)送數(shù)據(jù)
          UTXH0 = c; //發(fā)送數(shù)據(jù)
          }
          3、接收數(shù)據(jù):
          a.UTRSTAT0:如同上述“2、發(fā)送數(shù)據(jù)”所列,我們用到位[0]
          b.URXH0 (UART channel 0 receive buffer register ): 當(dāng)查詢到UTRSTAT0 位[0]=1時(shí),讀此寄存器獲得串口接收到的數(shù)據(jù)。
          unsigned char getc( )
          {
          while( ! (UTRSTAT0 & RXD0READY) ); //不斷查詢,直到接收到了數(shù)據(jù)
          return URXH0; //返回接收到的數(shù)據(jù)
          }

          中斷 Interrrupt
          SUBSRCPND和SRCPND寄存器表明有哪些中斷被觸發(fā)了,正在等待處理(pending);
          SUBMASK(INTSUBMSK寄存器)和MASK(INTMSK寄存器)用于屏蔽某些中斷。
          1、“Request sources(without sub -register)”中的中斷源被觸發(fā)之后,SRCPND寄存器中相應(yīng)位被置1,如果此中斷沒(méi)有被INTMSK寄存器屏蔽、或者是快中斷(FIQ)的話,它將被進(jìn)一步處理
          2、對(duì)于“Request sources(with sub -register)”中的中斷源被觸發(fā)之后,SUBSRCPND寄存器中的相應(yīng)位被置1,如果此中斷沒(méi)有被INTSUBMSK寄存器屏蔽的話,它在 SRCPND寄存器中的相應(yīng)位也被置1,之后的處理過(guò)程就和“Request sources(without sub -register)”一樣了
          請(qǐng)打開(kāi)S3C2410數(shù)據(jù)手冊(cè)357頁(yè),“Figure 14-2. Priority Generating Block”顯示了各中斷源先經(jīng)過(guò)6個(gè)一級(jí)優(yōu)先級(jí)仲裁器選出各自優(yōu)先級(jí)最高的中斷,然后再經(jīng)過(guò)二級(jí)優(yōu)先級(jí)仲裁器選從中選出優(yōu)先級(jí)最高的中斷。IRQ的中斷優(yōu)先級(jí)由RIORITY寄存器設(shè)定,請(qǐng)參考數(shù)據(jù)手冊(cè)365頁(yè),RIORITY寄存器中ARB_SELn(n從0到6)用于設(shè)定仲裁器n各輸入信號(hào)的中斷優(yōu)先級(jí),例如ARB_SEL6[20:19](0最高,其后各項(xiàng)依次降低):
          00 = REQ 0-1-2-3-4-5 01 = REQ 0-2-3-4-1-5
          10 = REQ 0-3-4-1-2-5 11 = REQ 0-4-1-2-3-5
          RIORITY寄存器還有一項(xiàng)比較特殊的功能,如果ARB_MODEn設(shè)為1,則仲裁器n中輸入的中斷信號(hào)的優(yōu)先級(jí)別將會(huì)輪換。例如ARB_MODE6設(shè)為1,則仲裁器6的6個(gè)輸入信號(hào)的優(yōu)先級(jí)將如下輪換(見(jiàn)數(shù)據(jù)手冊(cè)358頁(yè))

          使用中斷的步驟:
          1、當(dāng)發(fā)生中斷IRQ時(shí),CPU進(jìn)入“中斷模式”,這時(shí)使用“中斷模式”下的堆棧;當(dāng)發(fā)生快中斷FIQ時(shí),CPU進(jìn)入“快中斷模式”,這時(shí)使用“快中斷模式”下的堆棧。所以在使用中斷前,先設(shè)置好相應(yīng)模式下的堆棧。
          2、對(duì)于“Request sources(without sub -register)”中的中斷,將INTSUBMSK寄存器中相應(yīng)位設(shè)為0
          3、將INTMSK寄存器中相應(yīng)位設(shè)為0
          4、確定使用此的方式:是FIQ還是IRQ。
          a.如果是FIQ,則在INTMOD寄存器設(shè)置相應(yīng)位為1
          b.如果是IRQ,則在RIORITY寄存器中設(shè)置優(yōu)先級(jí)

          使用中斷的步驟:
          5、準(zhǔn)備好中斷處理函數(shù),
          a.中斷向量: 在中斷向量設(shè)置好當(dāng)FIQ或IRQ被觸發(fā)時(shí)的跳轉(zhuǎn)函數(shù), IRQ、FIQ的中斷向量地址分別為0x00000018、0x0000001c
          b.對(duì)于IRQ,在跳轉(zhuǎn)函數(shù)中讀取INTPND寄存器或INTOFFSET寄存器的值來(lái)確定中斷源,然后調(diào)用具體的處理函數(shù)
          c.對(duì)于FIQ,因?yàn)橹挥幸粋€(gè)中斷可以設(shè)為FIQ,無(wú)須判斷中斷源
          d.中斷處理函數(shù)進(jìn)入和返回

          6、設(shè)置CPSR寄存器中的F-bit(對(duì)于FIQ)或I-bit(對(duì)于IRQ)為0,開(kāi)中斷
          使用中斷的步驟:
          IRQ進(jìn)入和返回
          sub lr, lr, #4 @計(jì)算返回地址
          stmdb sp!, { r0-r12,lr } @保存使用到的寄存器…… 
          ldmia sp!, { r0-r12,pc }^ @中斷返回 @^表示將spsr的值賦給cpsr

          對(duì)于FIQ,進(jìn)入和返回的代碼如下:
          sub lr, lr, #4 @計(jì)算返回地址
          stmdb sp!, { r0-r7,lr } @保存使用到的寄存器……
          ldmia sp!, { r0-r7,pc }^ @快中斷返回, @^表示將spsr的值賦給cpsr
          中斷返回之前需要清中斷:往SUBSRCPND(用到的話)、SRCPND、INTPND中相應(yīng)位寫1即可。對(duì)于INTPND,最簡(jiǎn)單的方法就是“INTPND=INTPND”

          Timer幾個(gè)重要寄存器介紹
          1、TCFG0和TCFG1:分別設(shè)為119和0x03
          這連個(gè)寄存器用于設(shè)置“Control Logic”的時(shí)鐘,計(jì)算公式如下:
          Timer input clock Frequency = PCLK / {prescaler value+1} / {divider value}
          對(duì)于TIMER0,prescaler value = TCFG0[7:0],divider value由TCFG1[3:0]確定(0b000:2,0b001:4,0b010:8,0b0011:16,0b01xx:使用外部TCLK0)。
          對(duì)于本實(shí)驗(yàn),TIMER0時(shí)鐘 = 12MHz/(119+1)/(16) = 6250Hz
          2、TCNTB0:設(shè)為3125
          在6250Hz的頻率下,此值對(duì)應(yīng)的時(shí)間為0.5S
          3、TCON:
          TIMER0對(duì)應(yīng)bit[3:0]:
          bit[3]用于確定在TCNT0計(jì)數(shù)到0時(shí),是否自動(dòng)將TCMPB0和TCNTB0寄存器的值裝入TCMP0和TCNT0寄存器中
          bit[2]用于確定TOUT0是否反轉(zhuǎn)輸出(本實(shí)驗(yàn)未用)
          bit[1]用于手動(dòng)更新TCMP0和TCNT0寄存器:在第一次使用定時(shí)器前,此位需要設(shè)為1,此時(shí)TCMPB0和TCNTB0寄存器的值裝入TCMP0和TCNT0寄存器中
          bit[0]用于啟動(dòng)TIMER0
          4、TCONO0:只讀寄存器,用于讀取當(dāng)前TCON0寄存器的值

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();