1. 程式人生 > >s5pv210定時器、看門狗和RTC

s5pv210定時器、看門狗和RTC

1.1什麼是定時器?
1.1.1定時器是SOC中常見得外設
(1)定時器與計數器。計數器是用來計數的(每隔一個固定時間會計一個數);因為計數器的計數時間週期是固定的,因此到了一定時間只要用計數值×計數時間週期,就能得到一個時間段,這個時間段就是我們定的時間(這就是定時器了)。
(2)定時器/計數器作為SoC的外設,主要用來實現定時執行程式碼的功能。定時器相對於SoC來說,就好象鬧鐘相對於人來說意義一樣。
1.1.2定時器的作用?
(1)定時器可以讓SoC在執行主程式的同時,可以(通過定時器)具有計時功能,到了一定時間(計時結束)後,定時器會產生中斷提醒CPU,CPU會去處理中斷並執行定時器中斷的ISR。從而去執行預先設定好的事件。
(2)定時器就好象是CPU的一個祕書一樣,這個祕書專門管幫CPU來計時,併到時間後提醒CPU要做某件事情。所以CPU有了定時器之後,只需預先把自己xx時間之後必須要做的事情繫結到定時器中斷ISR即可,到了時間之後定時器就會以中斷的方式提醒CPU來處理這個事情。
1.1.3定時器的原理
(1)定時器計時其實是通過計數來實現的。定時器內部有一個計數器,這個計數器根據一個時鐘(這個時鐘源來自於ARM的APB匯流排,然後經過時鐘模組內部的分頻器來分頻得到)來工作。每隔一個時鐘週期,計數器就計數一次,定時器的時間就是計數器計數值×時鐘週期。
(2)定時器內部有1個暫存器TCNT,計時開始時我們會把一個總的計數值(譬如說300)放入TCNT暫存器中,然後每隔一個時鐘週期(假設為1ms)TCNT中的值會自動減1(硬體自動完成,不需要CPU軟體去幹預),直到TCNT中減為0的時候,TCNT就會觸發定時器中斷。
1.1.4定時器和看門狗、RTC、蜂鳴器的關係
(1)這幾個東西都是和時間有關的部件。
(2)看門狗其實就是一個定時器,只不過定時時間到了之後不只是中斷,還可以復位CPU
(3)RTC是實時時鐘,它和定時器的差別就好象鬧鐘(定時器)和鐘錶(RTC)的差別一樣。
(4)蜂鳴器是一個發聲裝置,在ARM裡面蜂鳴器是用定時器模組來驅動的。
2、S5PV210中的定時器
在S5PV210內部,一共有四類定時器件。
2.1PWM定時器
(1)這種是最常用的,平時所說的定時器一般指的是這個。像簡單微控制器(譬如51微控制器)中的定時器也是這類。
(2)為什麼叫PWM定時器,因為一般SoC中產生PWM訊號都是靠這個定時器模組的。
2.2系統定時器
(1)系統(指的是作業系統)定時器,系統定時器也是用來產生固定時間間隔(TCNT×時鐘週期)訊號的,稱為systick,這個systick用來給作業系統提供tick訊號。
(2)產生systick作為作業系統的時間片(time slice)的。
(3)一般做作業系統移植的時候,這裡不會由我們自己來做,一般原廠提供的基礎移植部分就已經包含了,所以這裡我也從來沒有研究過。
2.3看門狗定時器
(1)看門狗定時器本質上也是一個定時器,和上面2個沒有任何本質區別。
(2)看門狗定時器可以設定在時間到了的時候產生中斷,也可以選擇發出復位訊號復位CPU。
(3)看門狗定時器在實踐中應用很多,尤其是工業領域(環境複雜、干擾多)機器容易出問題,而且出問題後後果很嚴重,此時一般都會用看門狗來進行系統復位。
2.4實時時鐘RTC
(1)區分時間段和時間點。時間段是相對的,兩個時間點相減就會得到一個時間段;而時間點是絕對的,是絕無僅有的一個時間點。
(2)定時器關注的是時間段(而不是時間點),定時器計時從開啟定時器的那一刻開始,到定的時間段結束為止產生中斷;RTC中工作用的是時間點(xx年x月x日x時x分x秒星期x)。
(3)RTC和定時器的區別,就相當於是鐘錶和鬧鐘的區別。
3、S5PV210的PWM定時器
3.1為什麼叫PWM定時器?
本質上是定時器;
用來產生PWM波形
3.2PWM定時器介紹
(1)S5PV210有5個PWM定時器。
其中0、1、2、3各自對應一個外部GPIO,可以通過這些對應的GPIO產生PWM波形訊號並輸出;
Timer4沒有對應的外部GPIO(它不是為了生成PWM波形而設計的,而是為了產生內部定時器中斷而設計的);
(2)S5PV210的5個PWM定時器的時鐘源為PCLK_PSYS
timer0和timer1共同使用一個預分頻器,timer2、3、4共同使用一個預分頻器;
每個timer有一個專用的獨立的分頻器;
預分頻器和分頻器構成了2級分頻系統,將PCLK_PSYS兩級分頻後生成的時鐘供給timer模組作為時鐘週期。
這裡寫圖片描述

3.3S5PV210的PWM定時器框圖簡介
關鍵點:時鐘源、預分頻器、分頻器、TCMPB&TCNTB、dead zone
(1)預分頻器和分頻器
兩級分頻是串聯(級聯)的,所以兩級分頻的分頻數是相乘的。
兩級分頻的分頻係數分別在TCFG0和TCFG1兩個暫存器中設定。
預分頻器有2個,prescaler0為timer0&timer1共用,prescaler1為timer2、3、4共用;
兩個prescaler都是8個bit位,因此prescaler value範圍為0~255,因此預分頻器的分頻值範圍為1~256(注意實際分頻值為prescaler value + 1)。
分頻器實質上是一個MUX開關,多選一開關決定了走哪個分頻係數路線。可以選擇的有1/1,1/2,1/4,1/8,1/16等。
計算一下,兩級分頻下來,分頻最小為1/1(也可能是1/2),最大分頻為1/256×16(1/4096)。
在PCLK_PSYS為66MHz的情況下(預設時鐘設定就是66MHz的),此時兩級分頻後的時鐘週期範圍為0.03us到62.061us;
再結合TCNTB的值的設定(範圍為1~2的32次方),可知能定出來的時間最長為266548.27s(摺合74小時多,遠遠夠用)。

(2)TCNT&TCMP、TCNTB&TCMPB、TCNTO
TCNT和TCNTB是相對應的;TCNTB是有地址的暫存器,供程式設計師操作;TCNT在內部和TCNTB相對應,它沒有暫存器地址,程式設計師不能程式設計訪問這個暫存器。
TCNT暫存器功能就是用來減1的,它是內部的不能讀寫;我們向TCNT中寫數值要通過TCNTB往進寫,讀取TCNT暫存器中的值要通過讀取相對應的TCNTO暫存器。
工作流程:事先算好TCNT暫存器中開始減的那個數(譬如300),然後將之寫入TCNTB暫存器中,在啟動timer前,將TCNTB中的值刷到TCNT暫存器中(有一位暫存器專門用來操作刷資料過去的),之後就可以啟動定時器開始計時;在計時過程中如果想知道TCNT暫存器中的值減到多少了,可以讀取相應的TCNTO暫存器。
定時功能只需要TCNT、TCNTB兩個即可;TCNTO暫存器用來做一些捕獲計時;TCMPB用來生成PWM波形。

3.4自動過載和雙緩衝

(1)定時器工作的時候,一次定時算一個工作迴圈。
定時器預設是單個迴圈工作的,也就是說定時一次,計時一次,到期中斷一次就完了。下次如果還要再定時中斷,需要另外設定。
(2)現實中用定時器來做的時候往往是迴圈的
可以寫程式碼反覆重置定時器暫存器的值(在每次中斷處理的isr中再次給TCNTB中賦值,再次刷到TCNT中再次啟動定時器),早期的微控制器定時器就是這樣的;
高階SoC中的定時器已經預設內建這種迴圈定時工作模式,就叫自動裝載(auto-reload)機制。
(3)自動裝載機制就是當定時器初始化好開始計時後再不用管了,一個週期到了之後,自動從TCNTB中再次裝載值到TCNT中,再次啟動定時器開始下個迴圈。
3.5什麼是PWM
(1)PWM(pulse wide modulation,脈寬調製)
PWM波形是一個週期性波形,週期為T,在每個週期內波形是完全相同的。
每個週期內由一個高電平和一個低電平組成。
(2)PWM波形的2個重要引數
一個是週期T,另一個是佔空比duty(佔空比就是一個週期內高電平的時間除以週期時間的商)。
(3)PWM波形的用處
譬如通訊上用PWM來進行脈寬調製對基波進行載波調製;
在發光二極體LED照明領域可以用PWM波形來調製電流進行調光;
用來驅動蜂鳴器等裝置。
3.6PWM波形成的原理
(1)早期的簡單微控制器裡(譬如51微控制器)沒有專用的PWM定時器
需要自己結合GPIO和定時器模組來生產PWM波形;
流程:先將GPIO引腳電平拉高,同時啟動定時器定T*duty時間,時間到了在isr中將電平拉低,然後定時T*(1-duty)後再次啟動定時器,然後時間到了後在isr中將電平拉高,然後再定時T*duty時間再次啟動定時器……
(2)因為定時器經常和PWM的產生有關,所以設計SoC的時候就直接把定時器和一個GPIO引腳內部繫結起來
然後在定時器內部給設定了PWM產生的機制,可以更方便的利用定時器產生PWM波形。
利用PWM定時器來產生PWM波形時,就可以不用中斷,而是直接生成PWM。
繫結之後壞處就是GPIO引腳是固定的、死板的、不能隨便換的。
(3)在S5PV210中,PWM波形產生有2個暫存器很關鍵,一個是TCNTB、一個是TCMPB。
TCNTB決定PWM波形的週期,TCMPB決定PWM波形的佔空比。
最終生成的PWM波形的週期是:TCNTB×時鐘週期(PCLK_PSYS經過兩極分頻後得到的時鐘週期)。
最終生成的PWM波形的佔空比是:TCMPB/TCNTB

3.7輸出電平翻轉器
(1)這裡寫圖片描述
(2)基於上面講的,當duty從30%變到70%時,我們TCMPB暫存器中的值就要改(譬如TCNTB中是300時,TCMPB就要從210變化到90)。這樣的改變可以滿足需要,但是計算有點麻煩。於是乎210的PWM定時器幫我們提供了一個友好的工具叫做電平翻轉器。
(3)電平翻轉器在電路上的實質就是一個電平取反的部件,在程式設計上反映為一個暫存器位。寫0就關閉輸出電平反轉,寫1就開啟輸出電平反轉。開啟後和開啟前輸出電平剛好高低反轉。(輸出電平一反轉30%的duty就變成70%了)
(4)實戰中到底是TCNT和TCMPB誰大誰小時高電平還是低電平,一般不用理論分析,只要寫個程式碼然後用示波器實際看一下出來的波形就知道了;如果反了就直接開啟電平翻轉器即可。
3.8、死區生成器
(1)PWM有一個應用就是用在功率電路中用來對交流電壓進行整流。整流時2路整流分別在正電平和負電平時導通工作,不能同時導通(同時導通會直接短路,瞬間的同時導通都會導致電路燒燬)。大功率的開關電源、逆變器等裝置廣泛使用了整流技術。特別是逆變器,用SoC的GPIO輸出的PWM波形來分別驅動2路整流的IGBT。
(2)PWM波形用來做整理時要求不能同時高或低,因為會短路。但是實際電路是不理想的,不可能同時上升/下降沿,所以比較安全的做法是留死區。
(3)死區這東西離不了也多不了。死區少了容易短路,死區多了控制精度低了不利於產品效能的提升。
(4)S5PV210給大家提供了自帶的死區生成器,只要開啟死區生成器,生產出來的PWM波形就自帶了死區控制功能,使用者不用再自己去操心死區問題。
(5)大部分人工作是用不到這個的,直接關掉死區生成器即可。

4、蜂鳴器和PWM定時器實戰程式設計
4.1原理圖和硬體資訊
這裡寫圖片描述
(1)查閱原理圖可知,開發板底板上的蜂鳴器通過GPD0_2(XpwmTOUT2)引腳連線在SoC上。
(2)GPD0_2引腳通過限流電阻接在三極體基極上,引腳有電蜂鳴器就會有電(三極體導通);引腳沒電蜂鳴器就會沒電(三極體關閉)。這些都是硬體問題,軟體工程師不用管,軟體工程師只要寫程式控制GPD0_2引腳的電平產生PWM波形即可。
(3)GPD0CON(0xE02000A0),要把bit8~bit11設定為0b0010(功能選擇為TOUT_2,就是把這個引腳設定為PWM輸出功能)
(4)從GPD0_2引腳可以反推出使用的是timer2這個PWM定時器。
4.2 PWM定時器主要暫存器詳解
(1)相關的暫存器有TCFG0、TCFG1、CON、TCNTB2、TCMPB2、TCNTO2
這裡寫圖片描述
這裡寫圖片描述

預分頻器和分頻器的配置分別在TCFG0和TCFG1兩個暫存器中,如下兩個圖,

預分頻器都是8位的,又因為在記憶體和暫存器的世界裡,沒有負數,所以C語言給我們提供了unsigned的機制,

所以它的取值範圍是0~255,所以預分頻器的分頻範圍是1~256,

分頻器實際就是MUX開關,

經過兩級分頻,分頻範圍是1/1~1/(256*16),前面也可能是二分之一。

這裡寫圖片描述
這裡寫圖片描述

#define     GPD0CON     (0xE02000A0)
#define     TCFG0       (0xE2500000)
#define     TCFG1       (0xE2500004)
#define     CON         (0xE2500008)
#define     TCNTB2      (0xE2500024)
#define     TCMPB2      (0xE2500028)

#define     rGPD0CON    (*(volatile unsigned int *)GPD0CON)
#define     rTCFG0      (*(volatile unsigned int *)TCFG0)
#define     rTCFG1      (*(volatile unsigned int *)TCFG1)
#define     rCON        (*(volatile unsigned int *)CON)
#define     rTCNTB2     (*(volatile unsigned int *)TCNTB2)
#define     rTCMPB2     (*(volatile unsigned int *)TCMPB2)


// 初始化PWM timer2,使其輸出PWM波形:頻率是2KHz、duty為50%
void timer2_pwm_init(void)
{
    // 設定GPD0_2引腳,將其配置為XpwmTOUT_2
    rGPD0CON &= ~(0xf<<8);
    rGPD0CON |= (2<<8);

    // 設定PWM定時器的一干暫存器,使其工作
    rTCFG0 &= ~(0xff<<8);
    rTCFG0 |= (65<<8);          // prescaler1 = 65, 預分頻後頻率為1MHz

    rTCFG1 &= ~(0x0f<<8);
    rTCFG1 |= (1<<8);           // MUX2設定為1/2,分頻後時鐘週期為500KHz
    // 時鐘設定好,我們的時鐘頻率是500KHz,對應的時鐘週期是2us。也就是說每隔2us
    // 計一次數。如果要定的時間是x,則TCNTB中應該寫入x/2us

    rCON |= (1<<15);        // 使能auto-reload,反覆定時才能發出PWM波形
    //rTCNTB2 = 250;            // 0.5ms/2us = 500us/2us = 250
    //rTCMPB2 = 125;            // duty = 50%

    rTCNTB2 = 50;           
    rTCMPB2 = 25;   

    // 第一次需要手工將TCNTB中的值重新整理到TCNT中去,以後就可以auto-reload了
    rCON |= (1<<13);        // 開啟自動重新整理功能
    rCON &= ~(1<<13);      // 關閉自動重新整理功能

    rCON |= (1<<12);        // 開timer2定時器。要先把其他都設定好才能開定時器
}



5、看門狗定時器
5.1什麼是看門狗、有什麼用
(1)看門狗定時器和普通的定時器並無本質區別。定時器可以設定一個時間,在這個時間完成之前定時器不斷計時,時間到的時候定時器會復位CPU(重啟系統)。
(2)系統正常工作的時候當然不希望被重啟,但是系統受到干擾、極端環境等可能會產生異常工作或者不工作,這種狀態可能會造成不良影響(至少是不工作),此時解決方案就是重啟系統。
(3)普通裝置重啟不是問題,但是有些裝置人工重啟存在困難。這時候我們希望系統能夠自己檢驗自己是否已經跑飛,並且在意識到自己跑飛的時候,可以很快的(幾個ms或者更短)自我重啟。這個功能就要靠看門狗定時器來實現。
(4)典型應用的情景是:我們在應用程式中開啟看門狗裝置,初始化好給它一個時間,然後應用程式使用一個執行緒來喂狗,這個執行緒的執行時間安全短於看門狗的復位時間。當系統(或者應用程式)異常後,喂狗執行緒自然就不工作了,然後到時候看門狗就會復位。
(5)補充:實戰中有時候為了絕對的可靠,我們並不會用SoC中自帶的看門狗,而是使用專門的外接的看門狗晶片來實現看門狗。
這裡寫圖片描述

#define     WTCON       (0xE2700000)
#define     WTDAT       (0xE2700004)
#define     WTCNT       (0xE2700008)
#define     WTCLRINT    (0xE270000C)

#define     rWTCON      (*(volatile unsigned int *)WTCON)
#define     rWTDAT      (*(volatile unsigned int *)WTDAT)
#define     rWTCNT      (*(volatile unsigned int *)WTCNT)
#define     rWTCLRINT   (*(volatile unsigned int *)WTCLRINT)


// 初始化WDT使之可以產生中斷
void wdt_init_interrupt(void)
{
    // 第一步,設定好預分頻器和分頻器,得到時鐘週期是128us
    rWTCON &= ~(0xff<<8);
    rWTCON |= (65<<8);              // 1MHz

    rWTCON &= ~(3<<3);
    rWTCON |= (3<<3);               // 1/128 MHz, T = 128us

    // 第二步,設定中斷和復位訊號的使能或禁止
    rWTCON |= (1<<2);               // enable wdt interrupt
    rWTCON &= ~(1<<0);             // disable wdt reset

    // 第三步,設定定時時間
    // WDT定時計數個數,最終定時時間為這裡的值×時鐘週期
    //rWTDAT = 10000;                   // 定時1.28s
    //rWTCNT = 10000;                   // 定時1.28s

    // 其實WTDAT中的值不會自動刷到WTCNT中去,如果不顯式設定WTCON中的值,它的值就是
    // 預設值,然後以這個預設值開始計數,所以這個時間比較久。如果我們自己顯式的
    // 設定了WTCNT和WTDAT一樣的值,則第一次的定時值就和後面的一樣了。
    rWTDAT = 1000;                  // 定時0.128s
    //rWTCNT = 1000;                    // 定時0.128s

    // 第四步,先把所有暫存器都設定好之後,再去開看門狗
    rWTCON |= (1<<5);               // enable wdt
}


// wdt的中斷處理程式
void isr_wdt(void)
{
    static int i = 0;
    // 看門狗定時器時間到了時候應該做的有意義的事情
    printf("wdt interrupt, i = %d...", i++);

    // 清中斷
    intc_clearvectaddr();
    rWTCLRINT = 1;
}

相關推薦

s5pv210定時看門RTC

1.1什麼是定時器? 1.1.1定時器是SOC中常見得外設 (1)定時器與計數器。計數器是用來計數的(每隔一個固定時間會計一個數);因為計數器的計數時間週期是固定的,因此到了一定時間只要用計數值×計數時間週期,就能得到一個時間段,這個時間段就是我們定

《9.定時看門RTC

《9.定時器、看門狗和RTC》 第一部分、章節目錄 1.9.1.什麼是定時器 1.9.2.S5PV210中的定時器 1.9.3.S5PV210的PWM定時器1 1.9.4.S5PV210的PWM定時器2 1.9.5.S5PV210的PWM定時器3 1.9.6.蜂鳴器和PWM定時器程式設計

定時看門RTC

注:本文學習朱有鵬老師課程和自己整理而成。方便今後查閱,感謝朱老師~ 什麼是定時器(timer) 1.定時器是SoC中常見外設1、定時器與計數器。計數器是用來計數的(每隔一個固定時間會計一個數);因

定時看門&RTC

定時器作為Soc中的常見外設,和其他外設並沒有什麼不同,通常和計數器聯絡在一起,定時器常用來實現定時執行程式碼,相當於Soc的鬧鐘,可以讓Soc具有計時功能。 定時器原理 定時器通過內部的計數器的計數來實現的,計數器根據時鐘頻率來工作,時鐘源來自APB匯

js 定時延時週期

js 定時器有以下兩個方法: setInterval() :按照指定的週期(以毫秒計)來呼叫函式或計算表示式。方法會不停地呼叫函式,直到 clearInterval() 被呼叫或視窗被關閉。setTimeout() :在指定的毫秒數後呼叫函式或計算表示式。setInterv

STM32之獨立看門視窗看門定時

STM32F10系列晶片內建了2個看門狗,提高了更高的安全性等好處。獨立看門狗(IWDG)是由專門的40KHz的低速時鐘驅動,即使主時鐘發生故障也仍然有效。 IWDG的主要特徵有自由執行的遞減計數器,時鐘由獨立的RC振盪器提供,看門狗被啟用後,則在計數器計數至0x000時產

GIL定時線程queue進程池線程池

nco ces war 同時 127.0.0.1 非阻塞 enc rgs turn 一、GIL1、什麽是GIL(這是Cpython解釋器) GIL本質就是一把互斥鎖,那既然是互斥鎖,原理都一樣,都是讓多個並發線程同一時間只能 有一個執行 即:有了GIL的存

java定時Spring定時Quartz定時

   當前java程式中能夠實現定時的主要有三種方式,分別是:java定時器,spring定時器,quartz定時器。    下面依次講講他們的應用! java定時器的應用    其實java很早就有解決定時器任務的方法了,ja

uCOS的軟體定時uCOS時鐘節拍滴答定時的關係

uCOS2.81後的版本中有軟體定時器的概念,如果要開啟定時器任務,需要在OS_CFG.H檔案中 #define  OS_TMR_EN                 1 軟體定時器其實跟硬體中斷

tiny4412 裸機程式 三關閉看門呼叫C程式

一、原理說明 上是章中大家可能有會覺得奇怪,CPU不是有看門狗嘛?為什麼CPU沒有復位,程式還能正常工作呢? 檢視Eyxnos4412的手冊,第5章簡要的說明了其啟動順序,如下圖3-1所示是Eyxnos4412啟動順序圖,這裡雖然沒有說的很清楚,但內部iROM和BL1程式中

1.S5PV210定時系統概述時鐘結構框圖分析

PULSE WIDTH MODULATION TIMER(脈衝寬度調製定時器) 1.1 OVERVIEW OF PULSE WIDTH MODULATION TIMER The S5PV210 has five 32-bit Pulse Width Modulation (PWM) timers. These

MySQL5-函數/存儲過程與定時觸發器

名稱 狀態 訪問 safe 安全問題 ant comm gnu led 目錄 一、函數/存儲過程 二、定時器 三、觸發器 四、函數語句學習 一、函數/存儲過程 1、函數與存儲過程 (1) function與procedure的區別:一個有返回值,一個沒有,僅此而已。

STM32定時輸出PWM頻率步進電機控制速度計算

內部 定時 .cn 但是 nbsp 返回 定時器 開發 r12 1、STM32F4系列定時器輸出PWM頻率計算 第一步,了解定時器的時鐘多少:   我們知道AHP總線是168Mhz的頻率,而APB1和APB2都是掛在AHP總線上的。 (1)高級定時器timer1, time

第34天:日期函數定時倒計時

spl inner function nth 設置 gin dem 案例 支持 一、日期函數(Date())設置本地日期:年月日時分秒1、聲明日期var date=new Date();//創建一個新的日期函數2、使用函數date.getTime();//提倡使用,date

stm32 獨立看門窗口看門區別h5魚蝦蟹源碼出售

情況 企鵝 電路 判斷 默認 設置 如果 添加 正常 看門狗介紹看門狗這東西雖然簡單h5魚蝦蟹源碼出售(h5.hxforum.com) 聯系方式170618633533企鵝2952777280 微信Tel17061863533 源碼出售,售房卡出售,平臺出租,但我相信絕大

Django Restful Framework【第四篇】版本解析序列化請求數據驗證

tor ade clu cts scheme com 繼承 src 當前 一、版本 程序也來越大時,可能通過版本不同做不同的處理 沒用rest_framework之前,我們可以通過以下這樣的方式去獲取。 class UserView(APIView): def

css選擇(1)——元素選擇類名id選擇

span pan 包含 最重要的 通過 font 給定 情況 但是 css的主要優點之一就是它能很容易地向所有同類型的元素應用一組樣式。當然它是通過選擇器來實現這一點的。 基本規則結構: 語法= 選擇器 +聲明塊 1.元素選擇器——直接使用html元素名,指向文檔元素

利用定時 1定時0控制led1led2分別 2hz0.5hz閃爍

fine blog style 0ms log pre del nbsp efi 1 //利用定時器 1和定時器0控制led1和led2分別 2hz和0.5hz閃爍 2 //利用定時器0 1s,led1取反,利用計數器1,(65535-10)%256,取反 3 #i

微服務springcloud—微服務閘道Zuul簡介Zuul微服務

使用zuul構建微服務閘道器 為什麼要使用微服務閘道器 雖然微服務架構已經初具雛形,但還有一些問題————不同的微服務 一般會有不同的網路地址,而外部客戶端(例如手機APP)可能還需 呼叫多個微服務接口才能完成一個業務需求。例如一個電影購票的 手機APP,可能會呼叫多個微服務介面,才

stm32 獨立看門視窗看門區別

本文轉自: http://blog.sina.com.cn/s/blog_dc9571b90101isxs.html   1)獨立看門狗沒有中斷,視窗看門狗有中斷   2)獨立看門狗有硬體軟體之分,視窗看門狗只能軟體控制   3)獨立看