在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM開發(fā)步步深入之定時(shí)加速

            ARM開發(fā)步步深入之定時(shí)加速

            作者: 時(shí)間:2016-12-06 來(lái)源:網(wǎng)絡(luò) 收藏

              實(shí)驗(yàn)?zāi)康模和ㄟ^(guò)使用MPLL提高系統(tǒng)時(shí)鐘,啟動(dòng)定時(shí)器產(chǎn)生中斷來(lái)點(diǎn)亮LED燈,啟動(dòng)Watchdog定時(shí)器,如果程序跑飛,借助Watchdog重新運(yùn)行程序,借此掌握的時(shí)鐘管理、PWM及看門狗定時(shí)器。

            本文引用地址:http://www.biyoush.com/article/201612/341185.htm

              實(shí)驗(yàn)環(huán)境及說(shuō)明:恒頤開發(fā)板H2410。

              實(shí) 驗(yàn)思路:開發(fā)板上電啟動(dòng)后,自動(dòng)將NandFlash開始的4K數(shù)據(jù)復(fù)制到SRAM中,然后跳轉(zhuǎn)到0地址開始執(zhí)行。然后來(lái)設(shè)置MPLL來(lái)改變FCLK、 HCLK、PCLK的值,初始化存儲(chǔ)控制器來(lái)使用SDRAM。初始化LED燈管腳、定時(shí)中斷控制器和看門狗,使能定時(shí)中斷控制器和看門狗。之后進(jìn)入 main函數(shù)死循環(huán)等待中斷的發(fā)生,每隔設(shè)定的時(shí)間觸發(fā)定時(shí)中斷,調(diào)用定時(shí)中斷處理函數(shù)點(diǎn)亮/熄滅LED燈。若程序跑飛,觸發(fā)看門狗重啟。

              知識(shí)掌握:系統(tǒng)時(shí)鐘、PWM定時(shí)器和Watchdog定時(shí)器

              一、系統(tǒng)時(shí)鐘:的時(shí)鐘控制邏輯為整個(gè)芯片提供了三種時(shí)鐘。

              ★FCLK 用于CPU核;HCLK用于AHB總線上設(shè)備---CPU核、存儲(chǔ)器控制器、中斷控制器、LCD控制器、DMA和USB主機(jī)模塊;PCLK用于APB總線 上設(shè)備---Watchdog、IIS、I2C、PWM定時(shí)器、MMC接口、ADC、UART、GPIO、RTC和SPI。

              ★AHB(Advanced High performance Bus)---主要用于高性能模塊間的連接;APB(Advanced Peripheral Bus)---主要用于低帶寬的周邊外設(shè)之間的連接。

              ★ 開發(fā)板時(shí)鐘頻率為12MHz,主要是為了降低電磁干擾和板間布線要求,需要通過(guò)PLL提高系統(tǒng)時(shí)鐘。S3C2410包括MPLL(用于FCLK、 HCLK、PLCK)和UPLL(用于USB設(shè)備),他們的設(shè)置方法類似。開發(fā)板上電→FCLK=Fin(外部輸入時(shí)鐘)→設(shè)置MPLL相關(guān)寄存器→等待 (Lock Time:長(zhǎng)短由寄存器LOCKTIME設(shè)定)→MPLL輸出穩(wěn)定,CPU工作在新的時(shí)鐘FCLK下。

              ★設(shè)置MPLL需要設(shè)置下面幾個(gè)重要寄存器:

              ●LOCKTIME寄存器(LOCK TIME COUNT)用于設(shè)置lock time的長(zhǎng)度,初始值0x00FFFFFF。

              ●MPLLCON(Main PLL Control)寄存器用于設(shè)置FCLK與Fin的倍數(shù),初始值0x0005C080。

              ●CLKDIVN(CLOCK DIVIDER CONTROL)寄存器用于設(shè)置FCLK、HCLK、PCLK三者的比例。

              二、PWM(pulse width modulation)定時(shí)器

              ★S3C2410共有5個(gè)16位的定時(shí)器,其中定時(shí)器0、1、2、3有PWM功能,因?yàn)樗鼈兌加幸粋€(gè)輸出引腳,可以通過(guò)定時(shí)器來(lái)控制引腳周期性的高、低電平變化;定時(shí)器4木有輸出引腳就不有PWM功能了。

              ★PLCK 是定時(shí)部件的時(shí)鐘源,先通過(guò)2個(gè)8位預(yù)分頻器(定時(shí)器0、1共用第一個(gè)定時(shí)器,2、3、4共用第二個(gè)),輸出進(jìn)入第二級(jí)分頻(輸出2/4/8/16分頻或 者外部時(shí)鐘TCLK0/TCLK1)。這兩次預(yù)分頻都是通過(guò)設(shè)置TCFG0寄存器完成的。每個(gè)定時(shí)器工作在哪種頻率下可以通過(guò)TCFG1寄存器來(lái)選擇的。

              ★定時(shí)器的使用主要涉及以下寄存器:

              ●TCFG0寄存器:位[7:0],位[15:8]分別用于控制預(yù)分頻器0,1;它們的值為0~255。經(jīng)過(guò)分頻器出來(lái)的時(shí)鐘頻率:PLCK/(TCFG0[7:0]+1或TCFG0[15:8]+1)。

              '700')this.width='700';if(this.offsetHeight>'700')this.height='700';" src="http://www.arm79.com/attachment/Mon_1005/94_67_154d167be4af4a1.jpg" onclick="if(this.width>=700) window.open('http://www.arm79.com/attachment/Mon_1005/94_67_154d167be4af4a1.jpg');" border="0" width="700">

              ●TCFG1寄存器:設(shè)定相應(yīng)定時(shí)器為經(jīng)過(guò)分頻器出來(lái)的時(shí)鐘頻率的幾分頻。定時(shí)器工作頻率= PLCK/(TCFG0[7:0]或TCFG0[15:8]+1)/幾分頻。

              ●TCNTBn/TCMPBn寄存器:這兩個(gè)寄存器都只用到位[15:0]。TCNTBn中保存定時(shí)器的初始計(jì)數(shù)值,TCMPBn中保存比較值。它們的在啟動(dòng)定時(shí)器時(shí),被傳到定時(shí)器內(nèi)部寄存器TCNTn,TCMPn中。

              ●TCNTOn寄存器:n為0~4,內(nèi)部寄存器TCNTn在其工作時(shí)鐘下不斷減1計(jì)數(shù),可以通過(guò)讀取TCNTOn寄存器得知其值。

              ●TCON寄存器:它的功能如下:第一次啟動(dòng)定時(shí)器時(shí),手動(dòng)將TCNTBn/TCMPBn寄存器的值裝入內(nèi)部寄存器TCNTn,TCMPn中;啟動(dòng),停止定時(shí)器;決定在定時(shí)器計(jì)數(shù)到達(dá)0時(shí)是否自動(dòng)裝入初值;決定定時(shí)器的管腳TOUTn的輸出電平是否反轉(zhuǎn)。

              三、Watchdog定時(shí)器:其使用和PWM定時(shí)器很類此。

              ★PLCK 先經(jīng)過(guò)8位預(yù)分頻器后再被分成4種頻率(16/32/64/128分頻)。使用看門狗定時(shí)器的一個(gè)最主要目的當(dāng)然是讓它給你看門了。程序正常執(zhí)行時(shí),必須 不斷重新設(shè)置WTCNT寄存器使其不為0,這樣可以保證系統(tǒng)不被重啟,稱為“喂狗”;程序崩潰時(shí)不能按時(shí)“喂狗”,則計(jì)數(shù)值到達(dá)0后系統(tǒng)重啟,使得程序可 以重新正常運(yùn)行。

              ★Watchdog存在的意義:開啟Watchdog之后程序必須定時(shí)向其反饋信息,這看似麻煩又耗資源,其實(shí)是很重要的行為, 是程序向硬件傳遞自身運(yùn)行狀態(tài)的一種方法。如果程序運(yùn)行良好則它應(yīng)該可以在規(guī)定的時(shí)間間隔內(nèi)向Watchdog反饋信息,借此來(lái)說(shuō)明程序運(yùn)行正常;若程序 由于某個(gè)不當(dāng)?shù)牟僮鞫M(jìn)入死循環(huán)等,則無(wú)法向Watchdog反饋信息,Watchdog將發(fā)生記時(shí)超時(shí),從而引起硬件重起。如果沒(méi)有Watchdog, 程序死掉就死掉了,只能等待用戶自己發(fā)現(xiàn)去吧。

              ★相關(guān)寄存器:

              ●WTCON寄存器:用于設(shè)置預(yù)分頻系數(shù),選擇工作頻率,決定是否使能中斷,是否啟用WATDOG功能等。

              ●WTDAT寄存器:用以決定Watchdog定時(shí)器的超時(shí)周期,值自動(dòng)寫入WTCNT。

              ●WTCNT寄存器:在啟動(dòng)WATDOG定時(shí)器前,必須往這個(gè)寄存器寫入初始計(jì)數(shù)值,啟動(dòng)定時(shí)器后,它做減1操作,當(dāng)計(jì)數(shù)器值達(dá)到0時(shí),如果中斷被使能的話,就發(fā)出中斷,如果Watchdog功能被使能的話就發(fā)出復(fù)位信號(hào),裝載WTDAT寄存器的值并重新計(jì)數(shù)。

              關(guān)鍵代碼解析:

              ★head.S頭文件來(lái)初始化,設(shè)置中斷模式、系統(tǒng)模式的棧,設(shè)置好中斷處理函數(shù)

              .text

              .global _start

              _start:

              @中斷向量表處理函數(shù),只給出復(fù)位和普通中斷模式的處理函數(shù),其它異常未使用

              b Reset

              ......

              @0x18: 中斷模式的向量地址

              b HandleIRQ

              @0x1c: 快中斷模式的向量地址

              HandleFIQ:

              b HandleFIQ

              Reset: @復(fù)位處理

              bl disable_watch_dog @關(guān)門喂狗

              ldr sp,=0x4096 @clock初始化棧地址

              bl clock_init @設(shè)置MPLL,改變FCLK、HCLK、PCLK

              bl mem_control_setup @設(shè)置存儲(chǔ)控制器以使用SDRAM

              bl copy_steppingstone_to_sdram @復(fù)制代碼到SDRAM中

              ldr pc, =on_sdram @跳到SDRAM中繼續(xù)執(zhí)行

              on_sdram:

              msr cpsr_c, #0xd2 @進(jìn)入中斷模式

              ldr sp, =0x32000000 @設(shè)置中斷模式棧指針

              msr cpsr_c, #0xdf @進(jìn)入系統(tǒng)模式

              ldr sp, =0x34000000 @設(shè)置系統(tǒng)模式棧指針

              bl init_led @初始化LED

              bl init_timer0 @初始化定時(shí)器0

              bl enable_timer0 @使能定時(shí)器0

              bl init_watchdog @初始化Watchdog

              bl enable_watchdog @使能Watchdog

              msr cpsr_c, #0x5f @設(shè)置I-bit=0,開IRQ中斷

              ldr lr, =halt_loop @設(shè)置返回地址

              ldr pc, =main @調(diào)用main函數(shù)

              halt_loop:

              b halt_loop

              ★init.c文件實(shí)現(xiàn)時(shí)鐘、GPIO、中斷及定時(shí)的初始化,主要代碼:

              /*

              * 時(shí)鐘初始化

              */

              #define S3C2410_MPLL_200MHZ ((0x5c<<12)|(0x04<<4)|(0x00))

              void init_clock(void)

              {

              CLKDIVN = 0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1

              /* 如果HDIVN非0,CPU的總線模式應(yīng)該從"fast bus mode"變?yōu)?quot;asynchronous bus mode"*/

              __asm__(

              "mrc p15, 0, r1, c1, c0, 0n" /* 讀出控制寄存器 */

              "orr r1, r1, #0xc0000000n" /* 設(shè)置為"asynchronous bus mode" */

              "mcr p15, 0, r1, c1, c0, 0n" /* 寫入控制寄存器 */

              );

              MPLLCON = S3C2410_MPLL_200MHZ; /* FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */

              }

              /*

              * 定時(shí)器0初始化

              */

              void init_timer0(void)

              {

              TCFG0 = 99; // 預(yù)分頻器0 = 99

              TCFG1 = 0x03; // 選擇16分頻

              TCNTB0 = 31250; // 0.5秒鐘觸發(fā)一次中斷

              TCON |= (1<<1); // 手動(dòng)更新

              TCON = 0x09; // 自動(dòng)加載,清“手動(dòng)更新”位,啟動(dòng)定時(shí)器0

              }

              /*

              * 定時(shí)器0中斷使能

              */

              void enable_timer0(void)

              {

              INTMSK &= (~(1<<10)); // 定時(shí)器0中斷使能

              }

              /*

              * Watchdog初始化

              */

              void init_watchdog(void)

              {

              //Prescaler Value = 99;Division_factor = 16(Clock Select=16);Interrupt Generation = 0(不產(chǎn)生中斷);Reset = 1(開啟Reset Signal)

              WTCON = 0x6381;

              //設(shè)置寄存器WTDAT的值為0x8000,時(shí)間一定要大于Timer0的時(shí)間

              WTDAT = 0x8000;

              }

              /*

              * Watchdog使能

              */

              void enable_watchdog(void)

              {

              WTCON|=1<<5;

              }

              ★interrupt.c文件實(shí)現(xiàn)中斷的處理,主要代碼:

              /*

              * 定時(shí)器0中斷處理函數(shù)

              */

              void Timer0_Handle(void)

              {

              //喂狗

              WTCNT=0x8000;

              //每次中斷令4個(gè)LED改變狀態(tài)

              if(INTOFFSET == 10)

              GPFDAT = ~(GPFDAT & (0xf << 4));

              //清中斷

              SRCPND = 1 << INTOFFSET;

              INTPND = INTPND;

              }



            關(guān)鍵詞: ARM S3C2410

            評(píng)論


            相關(guān)推薦

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

            關(guān)閉