STM32看门狗总结
轉(zhuǎn)自:http://www.openedv.com/thread-56260-1-1.html
?
| STM32看門狗總結(jié) 調(diào)原子哥的開發(fā)板一年多,基本上能用,但是對(duì)于STM32某些基本外設(shè)的工作機(jī)理還不甚明了。借此暑假的機(jī)會(huì)對(duì)各個(gè)外設(shè)的功能做一個(gè)簡(jiǎn)短的總結(jié),在提高自己基礎(chǔ)知識(shí)的同時(shí),也給其他同學(xué)提供一些參考。 先來(lái)看門狗部分的內(nèi)容。 看門狗部分內(nèi)容當(dāng)中較難理解的是窗口看門狗,其中窗口值設(shè)置以及如何引發(fā)復(fù)位更是很難搞懂,因此從根本上分析一下窗口看門狗的工作原理,而與其有關(guān)的中斷則略過(guò)。 stm32有兩個(gè)看門狗,獨(dú)立看門狗和窗口看門狗,其實(shí)兩者的功能是類似的,只是喂狗的限制時(shí)間不同。獨(dú)立看門狗有自己獨(dú)立的40Khz時(shí)鐘,不存在使能問(wèn)題;而窗口看門狗使用的是PCLK1時(shí)鐘,需要先使能時(shí)鐘。以下是關(guān)于看門狗的具體說(shuō)明: ①、獨(dú)立看門狗是限制喂狗時(shí)間在0-x內(nèi),x由你的相關(guān)寄存器決定。喂狗的時(shí)間不能過(guò)晚。 ②、窗口看門狗,所以稱之為窗口就是因?yàn)槠湮构窌r(shí)間是一個(gè)有上下限的范圍內(nèi),你可以通過(guò)設(shè)定相關(guān)寄存器,設(shè)定其上限時(shí)間和下限時(shí)間。喂狗的時(shí)間不能過(guò)早也不能過(guò)晚。 顯而易見的是,獨(dú)立看門狗比較簡(jiǎn)單,容易理解。 這里,主要對(duì)窗口看門狗的詳細(xì)含義作具體說(shuō)明。 看門狗的上窗口就是配置寄存器WWDG->CFR里設(shè)定的W[6:0];下窗口是0x40;當(dāng)窗口看門狗的計(jì)數(shù)器在上窗口之外,或是低于下窗口值都會(huì)產(chǎn)生復(fù)位。如上圖所講,當(dāng)計(jì)數(shù)器的值遞減到0x3f的計(jì)數(shù)時(shí)間內(nèi)未進(jìn)行喂狗操作,則會(huì)觸發(fā)復(fù)位;其次,如果在計(jì)數(shù)器值遞減到配置寄存器WWDG->CFR里設(shè)定的W[6:0]之前進(jìn)行喂狗操作,也會(huì)觸發(fā)復(fù)位。所以,在使用窗口看門狗時(shí),要設(shè)定兩個(gè)值,一個(gè)就是窗口看門狗的上窗口值,即配置寄存器WWDG->CFR里設(shè)定的W[6:0],另一個(gè)就是遞減計(jì)數(shù)器的計(jì)數(shù)初值。 再結(jié)合上圖中的邏輯關(guān)系分析一下: 如圖中所示標(biāo)號(hào),①③表示與門,②表示非或門; 1、當(dāng)T[6:0]>W[6:0]時(shí),比較器輸出的值是1,如果此時(shí)重裝載WWDG_CR,所以③就會(huì)輸出1,②的輸出也肯定是1,又因?yàn)槭鼓芰舜翱诳撮T狗,所以WWDG_CR的第7位WDGA也為1,即與門①的輸出是1,此時(shí)會(huì)觸發(fā)復(fù)位。簡(jiǎn)單的概括來(lái)說(shuō),就是當(dāng)遞減計(jì)數(shù)器的值在遞減到上窗口值W[6:0]之前進(jìn)行喂狗操作(即重裝載WWDG_CR),會(huì)觸發(fā)看門狗復(fù)位。 2、當(dāng)T[6:0]的第6位變?yōu)?時(shí),即T[6:0]的值變?yōu)?x3f,此時(shí)②的輸出肯定為1,而WDGA也為1,因此①的輸出是1,會(huì)觸發(fā)看門狗復(fù)位。簡(jiǎn)單的概括來(lái)說(shuō),就是當(dāng)遞減計(jì)數(shù)器的值在到達(dá)0x3f時(shí)仍未進(jìn)行喂狗操作(即重裝載WWDG_CR),同樣會(huì)觸發(fā)看門狗復(fù)位。 ?? 上窗口的值可以只有設(shè)定,7位二進(jìn)制數(shù)最大只可以設(shè)定為127(0x7f),最小又必須大于其下窗口的0x40,所以其取值范圍為64~127(0x40~0x7f),否則不能保證窗口。 配置寄存器WWDG->CFR寄存器中的[8:7]兩個(gè)位的設(shè)置為計(jì)數(shù)器設(shè)定時(shí)鐘分頻系數(shù),確定這個(gè)計(jì)數(shù)器可以定時(shí)的時(shí)間范圍,從而確定窗口的時(shí)間范圍。 窗口看門狗的時(shí)鐘來(lái)自于PCLK1,在時(shí)鐘配置中,其頻率為外部時(shí)鐘經(jīng)倍頻器后的二分頻時(shí)鐘,即為36Mhz,如上圖STM32時(shí)鐘樹所示。 窗口看門狗的超時(shí)公式如下: 36M時(shí)鐘下窗口看門狗的最小最大超時(shí)表: 表中數(shù)據(jù)的具體計(jì)算如下所示: ①、當(dāng)T[5:0]全部取0時(shí),7位計(jì)數(shù)器的值是0x40,此時(shí)距離復(fù)位值只能計(jì)數(shù)一次,在此時(shí)間之內(nèi)必須執(zhí)行喂狗操作,否則觸發(fā)復(fù)位。 從而可知各個(gè)WDGTB值下的最小超時(shí)時(shí)間,如WDGTB=0時(shí), Twwdg=4096×2^0×1/36?(us)=113?us,依次可計(jì)算出其他WDGTB值下的最小超時(shí)時(shí)間。 ②、當(dāng)T[5:0]全部取1時(shí),7位計(jì)數(shù)器的值是0x7f,此時(shí)距離復(fù)位值遞減計(jì)數(shù)0x40次(0x3f+1),在此時(shí)間之內(nèi)執(zhí)行喂狗操作可避免復(fù)位。 從而可知各個(gè)WDGTB值下的最大超時(shí)時(shí)間,如WDGTB=0時(shí), Twwdg=4096×2^0×64/36?(us)=7281.7?us,依次可計(jì)算出其他WDGTB值下的最大超時(shí)時(shí)間。 ? ? ? ? STM32?系列的CPU,有多達(dá)8個(gè)定時(shí)器,其中TIM1和TIM8是能夠產(chǎn)生三對(duì)PWM互補(bǔ)輸出的高級(jí)定時(shí)器,常用于三相電機(jī)的驅(qū)動(dòng),它們的時(shí)鐘由APB2的輸出產(chǎn)生。其它6個(gè)為普通定時(shí)器,時(shí)鐘由APB1的輸出產(chǎn)生。 通用定時(shí)器的定義:STM32的通用定時(shí)器是一個(gè)通過(guò)可編程預(yù)分頻器(PSC)驅(qū)動(dòng)的16位自動(dòng)裝載計(jì)數(shù)器(CNT)構(gòu)成。 功用:STM32的通用定時(shí)器可以被用于測(cè)量輸入信號(hào)的脈沖長(zhǎng)度(輸入捕獲)或者產(chǎn)生輸出波形(輸出比較和PWM)等。 分頻系數(shù):決定定時(shí)器的時(shí)基,即最小定時(shí)時(shí)間。 定時(shí)器的時(shí)鐘來(lái)源: 從圖中可以看出,定時(shí)器的時(shí)鐘不是直接來(lái)自APB1或APB2,而是來(lái)自于輸入為APB1或APB2的一個(gè)倍頻器。當(dāng)APB1的預(yù)分頻系數(shù)為1時(shí),這個(gè)倍頻器不起作用,定時(shí)器的時(shí)鐘頻率等于APB1的頻率;當(dāng)APB1的預(yù)分頻系數(shù)為其它數(shù)值(即預(yù)分頻系數(shù)為2、4、8或16)時(shí),這個(gè)倍頻器起作用,定時(shí)器的時(shí)鐘頻率等于APB1的頻率兩倍。 ?舉一個(gè)例子說(shuō)明。假定AHB=36MHz,因?yàn)锳PB1允許的最大頻率為36MHz,所以APB1的預(yù)分頻系數(shù)可以取任意數(shù)值; 當(dāng)預(yù)分頻系數(shù)=1時(shí),APB1=36MHz,TIM2~7的時(shí)鐘頻率=36MHz(倍頻器不起作用); 當(dāng)預(yù)分頻系數(shù)=2時(shí),APB1=18MHz,在倍頻器的作用下,TIM2~7的時(shí)鐘頻率=36MHz。 由于APB1不僅給通用定時(shí)器提供時(shí)鐘,還給其他外設(shè)提供時(shí)鐘,因此也體現(xiàn)了APB1?rescaler設(shè)計(jì)的靈活性。 ? 對(duì)自動(dòng)重裝載寄存器賦值,TIM_Period的大小實(shí)際上表示的是需要經(jīng)過(guò)TIM_Period次計(jì)數(shù)后才會(huì)發(fā)生一次更新或中斷。對(duì)TIM_Prescaler的設(shè)置,直接決定定時(shí)器的時(shí)鐘頻率。通俗點(diǎn)說(shuō),就是一秒鐘能計(jì)數(shù)多少次。比如算出來(lái)的時(shí)鐘頻率是2000,也就是一秒鐘會(huì)計(jì)數(shù)2000次,而此時(shí)如果TIM_Period設(shè)置為4000,即4000次計(jì)數(shù)后就會(huì)中斷一次。由于時(shí)鐘頻率是一秒鐘計(jì)數(shù)2000次,因此只要2秒鐘,就會(huì)中斷一次。發(fā)生中斷時(shí)間=(TIM_Prescaler+1)*?(TIM_Period+1)/FLK。 同樣需要注意的,一進(jìn)入中斷服務(wù)程序,第一步要做的,就是清除掉中斷標(biāo)志位。以便下次中斷服務(wù)函數(shù)的順利執(zhí)行。 注意:APB1?rescaler后得到的是通用定時(shí)器的時(shí)鐘源,再次基礎(chǔ)上進(jìn)行TIM_Prescaler的設(shè)置就得到通用定時(shí)器具體的時(shí)鐘頻率啦。所以小伙伴們千萬(wàn)不要把文中定時(shí)器中經(jīng)常提到的76MHz時(shí)鐘以及由(TIM_Prescaler+1)*/FLK計(jì)算得到的時(shí)鐘頻率搞混淆啦。 當(dāng)然,計(jì)數(shù)器的計(jì)數(shù)模式比較簡(jiǎn)單,這里沒有就其進(jìn)行詳細(xì)的說(shuō)明。 |
?
?
今天有同學(xué)問(wèn)我PWM到底咋工作的?為啥這樣啊?為啥啊?直接把我問(wèn)蒙了。所以今天就來(lái)總結(jié)一些通用定時(shí)器產(chǎn)生PWM輸出。
①、PWM主要就是控制頻率和占空比的:這兩個(gè)因素分別通過(guò)兩個(gè)寄存器控制:TIMX_ARR和TIMX_CCRX。ARR寄存器就是自動(dòng)重裝寄存器,也就是計(jì)數(shù)器記到這個(gè)數(shù)以后清零再開始計(jì),這樣PWM的頻率就是tim_frequency/(TIMX_ARR-1)。在計(jì)數(shù)時(shí)會(huì)不停的和CCRX寄存器中的數(shù)據(jù)進(jìn)行比較,如果小于的話是高電平或者低電平,計(jì)數(shù)值大于CCRX值的話電平極性反相。所以這也就控制了占空比。
②、TIM3-CNT中的數(shù)據(jù)從0計(jì)數(shù)到ARR中的值,當(dāng)計(jì)數(shù)到TIM3_CCRx接收到的數(shù)據(jù)大小時(shí),由高電平變?yōu)榈碗娖?#xff0c;當(dāng)CNT中的數(shù)值增加到ARR寄存器設(shè)定的值時(shí)就自動(dòng)清零,從0重新開始計(jì)數(shù),并產(chǎn)生一個(gè)計(jì)數(shù)溢出事件,從0計(jì)數(shù)到ARR值的這段時(shí)間是PWM的周期。設(shè)置CCRx的值用來(lái)改變PWM的占空比。
③、TIM3-CNT的值與TIM3_CCRx中的數(shù)據(jù)是自動(dòng)比較,TIM3-CNT的值與TIM3_CCRx中的數(shù)據(jù)相等時(shí),PWM是自動(dòng)產(chǎn)生跳變的,此過(guò)程是硬件實(shí)現(xiàn)的,在原子開發(fā)板的例程中找不到有關(guān)二者進(jìn)行比較的代碼,所以不要問(wèn)在軟件中是如何實(shí)現(xiàn)的,因?yàn)槲艺伊撕荛L(zhǎng)時(shí)間沒找到。
④端口重映射
為了優(yōu)化64腳或100腳封裝的外設(shè)數(shù)目,可以把一些復(fù)用功能重新映射到其他引腳上。設(shè)置復(fù)用重映射和調(diào)試I/O配置寄存器(AFIO_MAPR)實(shí)現(xiàn)引腳的重新映射。這時(shí),復(fù)用功能不再映射到它們的原始分配上。(注意:重定義的引腳是固定的,不是想重定義到哪個(gè)引腳就可以到哪個(gè)引腳的!重映像一般只適用于100和144腳的封裝!(具體看哪個(gè)外設(shè)))。
STM32上有很多I/O口,也有很多的內(nèi)置外設(shè)想I2C,ADC,ISP,USART等?,為了節(jié)省引出管腳,這些內(nèi)置外設(shè)基本上是與I/O口共用管腳的,也就是I/O管腳的復(fù)用功能。但是STM32還有一特別之處就是:很多復(fù)用內(nèi)置的外設(shè)的I/O引腳可以通過(guò)重映射功能,從不同的I/O管腳引出,即復(fù)用功能的引腳是可通過(guò)程序改變的。但這些重映射并不是任意的,只有有些引腳可以重映射.具體哪些引腳stm32參考手冊(cè)上的GPIO與AFIO章節(jié)上有。一般是定時(shí)器,通信接口等數(shù)字系統(tǒng)的引腳可以重映射,adc,dac,時(shí)鐘這種與模擬量有關(guān)的不可以。
簡(jiǎn)單的說(shuō)STM32的IO有3個(gè)功能一個(gè)是默認(rèn)的,一個(gè)是復(fù)用,一個(gè)是重映射功能(這個(gè)其實(shí)也屬于復(fù)用),如果配置成復(fù)用,則將使用第2個(gè)功能,如果配置成復(fù)用,同時(shí)相應(yīng)的重映射也配置了,則將使用第3個(gè)功能。
STM32的部分重映射實(shí)例:
?
?
輸入捕獲實(shí)驗(yàn)
捕獲是如何實(shí)現(xiàn)的?與定時(shí)器有什么關(guān)系?它為什么就能夠捕獲到呢?
先入為主:可以利用定時(shí)器捕獲某些IO口的高電平脈寬,脈寬時(shí)間可以通過(guò)串口打印得到。
輸入捕獲模式可以用來(lái)測(cè)量脈沖寬度或者測(cè)量頻率。STM32定時(shí)器除了TIM6和TIM7,其他的都具有輸入捕獲功能。STM32的輸入捕獲,簡(jiǎn)單的說(shuō)就是通過(guò)檢測(cè)TIMx_CHx上的邊沿信號(hào),在邊沿信號(hào)發(fā)生跳變(比如上升沿/下降沿)的時(shí)候,將當(dāng)前定時(shí)器的值存放到對(duì)應(yīng)的通道的捕獲/比較寄存器(TIMx_CCRx)里面,完成一次捕獲。
捕獲模式與比較模式的理解:
捕獲模式的原理是選定的輸入引腳發(fā)生選定的脈沖出發(fā)沿的時(shí)候,則該時(shí)刻定時(shí)器的計(jì)數(shù)值TIMx_CNT將被保存,同時(shí)產(chǎn)生中斷(TIMx_CNT的值不會(huì)與任何東西進(jìn)行比較)。該功能最常用的的就是測(cè)量一個(gè)外來(lái)脈沖的脈寬。
比較模式的原理是當(dāng)CCRx寄存器中設(shè)定的值與定時(shí)器計(jì)數(shù)器值相等的時(shí)候,相關(guān)引腳發(fā)生電平跳變,同時(shí)產(chǎn)生中斷。該功能常應(yīng)用于產(chǎn)生一個(gè)一定脈寬的PWM波形。
數(shù)字濾波器由一個(gè)事件計(jì)數(shù)器組成,它記錄到N個(gè)事件后會(huì)產(chǎn)生一個(gè)輸出的跳變:?這個(gè)N可以取值具體參考中文手冊(cè),意思是說(shuō):我采樣高電平,只有連續(xù)采樣到N個(gè)電平是高電平的話我才認(rèn)為是有效的高電平,低于N個(gè)我就認(rèn)為是無(wú)效的。
PWM輸入捕獲模式是輸入捕獲模式的特例,自己理解如下
1.?每個(gè)定時(shí)器有四個(gè)輸入捕獲通道IC1、IC2、IC3、IC4。且IC1?IC2一組,IC3?IC4一組。并且可是設(shè)置管腳和寄存器的對(duì)應(yīng)關(guān)系。
2.?同一個(gè)TIx輸入映射了兩個(gè)ICx信號(hào)。
3.?這兩個(gè)ICx信號(hào)分別在相反的極性邊沿有效。
4.?兩個(gè)邊沿信號(hào)中的一個(gè)被選為觸發(fā)信號(hào),并且從模式控制器被設(shè)置成復(fù)位模式。
5.?當(dāng)觸發(fā)信號(hào)來(lái)臨時(shí),被設(shè)置成觸發(fā)輸入信號(hào)的捕獲寄存器,捕獲“一個(gè)PWM周期(即連續(xù)的兩個(gè)上升沿或下降沿)”,它等于包含TIM時(shí)鐘周期的個(gè)數(shù)(即捕獲寄存器中捕獲的為TIM的計(jì)數(shù)個(gè)數(shù)n)。
6.?同樣另一個(gè)捕獲通道捕獲觸發(fā)信號(hào)和下一個(gè)相反極性的邊沿信號(hào)的計(jì)數(shù)個(gè)數(shù)m,即(即高電平的周期或低電平的周期)
7.?由此可以計(jì)算出PWM的時(shí)鐘周期和占空比了
????frequency=f(TIM時(shí)鐘頻率)/n。
????duty?cycle=(高電平計(jì)數(shù)個(gè)數(shù)/n),
????若m為高電平計(jì)數(shù)個(gè)數(shù),則duty?cycle=m/n
????若m為低電平計(jì)數(shù)個(gè)數(shù),則duty?cycle=(n-m)/n
注:因?yàn)橛?jì)數(shù)器為16位,所以一個(gè)周期最多計(jì)數(shù)65535個(gè),所以測(cè)得的?最小頻率=?TIM時(shí)鐘頻率/65535。
測(cè)量脈寬的理解:
輸入捕獲的原理是,定時(shí)器正常計(jì)數(shù)運(yùn)行,當(dāng)外部脈沖到來(lái)時(shí),將定時(shí)器計(jì)數(shù)值存起來(lái),當(dāng)下次脈沖到來(lái)時(shí),求出這兩次計(jì)數(shù)值差值,即為這兩段脈沖的周期。例如,定時(shí)器計(jì)數(shù)到10,外部脈沖到來(lái),使用last_time_CH1存儲(chǔ)10,下次脈沖到來(lái),此時(shí)定時(shí)器計(jì)數(shù)值運(yùn)行到110,使用this_time_CH1存儲(chǔ)110,之后做差,tmp16_CH1存儲(chǔ)差值100,由于定時(shí)器運(yùn)行于100KHZ,10us計(jì)數(shù)值增加一次,所以脈沖周期為100*10=1000us=1ms,即為1KHZ。當(dāng)然,定時(shí)器會(huì)溢出重裝,此時(shí)需要將差值補(bǔ)償運(yùn)算,tmp16_CH1?=?((0xFFFF?-?last_time_CH1)?+?this_time_CH1);可測(cè)量的范圍取決于定時(shí)器運(yùn)行的頻率,如果外部頻率慢到當(dāng)定時(shí)器整個(gè)計(jì)數(shù)一周后也沒有觸發(fā)兩次,會(huì)發(fā)生溢出,此時(shí)計(jì)數(shù)值已不準(zhǔn)確。所以定時(shí)器時(shí)鐘配置取決于外部脈沖頻率,應(yīng)配置得當(dāng)使得脈沖頻率范圍不致溢出。由于每次外部脈沖都會(huì)觸發(fā)中斷,尤其是四通道時(shí),所以使用中斷方式會(huì)略微占用CPU資源,使用DMA可以解決這一問(wèn)題。
得到脈沖周期后,即可通過(guò)運(yùn)算獲得外部頻率,進(jìn)而測(cè)速。
?
?
| STM32的ADC采樣(翻看網(wǎng)上內(nèi)容總結(jié)) 難點(diǎn):如何確定采樣周期?如何配置相關(guān)寄存器?轉(zhuǎn)換時(shí)間里的12.5是怎么來(lái)的? 一、基本概念:ADC轉(zhuǎn)換就是輸入模擬的信號(hào)量,單片機(jī)轉(zhuǎn)換成數(shù)字量。讀取數(shù)字量必須等轉(zhuǎn)換完成后,完成一個(gè)通道的讀取叫做采樣周期。采樣周期一般來(lái)說(shuō)=轉(zhuǎn)換時(shí)間+讀取時(shí)間。而轉(zhuǎn)換時(shí)間=采樣時(shí)間+12.5個(gè)時(shí)鐘周期。采樣時(shí)間是你通過(guò)寄存器告訴stm32采樣模擬量的時(shí)間,設(shè)置越長(zhǎng)越精確。 ? STM32的ADC模塊各個(gè)通道對(duì)應(yīng)的IO (注意:STM32F103系列最少都擁有2個(gè)ADC,STM32F103ZET6包含有3個(gè)ADC,STM32F103ZET6內(nèi)部集成了12位的逐次逼近型模擬數(shù)字轉(zhuǎn)換器,它有多大18個(gè)通道,可測(cè)量16個(gè)外部和2個(gè)內(nèi)部信號(hào)源。) 二、規(guī)則組和注入組 STM32的ADC通道分為規(guī)則組和注入組。因?yàn)锳DC轉(zhuǎn)換模塊只有一個(gè)ADC功能核心,它能夠支持這么多通道的數(shù)據(jù)轉(zhuǎn)換,用的是分時(shí)復(fù)用的方法。分組的目的是為了賦予特定的ADC通道優(yōu)先權(quán)。 比如,ADCx_IN2被分配到規(guī)則組,ADCx_IN3被分配到注入組,在IN2通道進(jìn)行數(shù)據(jù)轉(zhuǎn)換的過(guò)程中,外部信號(hào)觸發(fā)了IN3通道的轉(zhuǎn)換,則ADC功能核心將暫停IN2的轉(zhuǎn)換,轉(zhuǎn)去執(zhí)行IN3的轉(zhuǎn)換,完成轉(zhuǎn)換后在回來(lái)執(zhí)行IN2的轉(zhuǎn)換。由此可知,注入組的通道具有優(yōu)先轉(zhuǎn)換權(quán),可以打斷規(guī)則組通道正在進(jìn)行的轉(zhuǎn)換。 ? 三、STM32?ADC?采樣?頻率的確定 ①、可編程的通道采樣時(shí)間 ADC?使用若干個(gè)ADC_CLK?周期對(duì)輸入電壓采樣,采樣周期數(shù)目可以通過(guò) ADC_SMPR1?和ADC_SMPR2?寄存器中的SMP[2:0]位而更改。每個(gè)通道可以以 不同的時(shí)間采樣。 總轉(zhuǎn)換時(shí)間如下?計(jì)算: TCONV?=?采樣時(shí)間+?12.5?個(gè)周期 例如: 當(dāng)ADCCLK=14MHz?和1.5?周期的采樣時(shí)間 TCONV?=?1.5?+?12.5?=?14?周期?=?1μs ? 轉(zhuǎn)換時(shí)間里的12.5是怎么來(lái)的? 原子哥告訴我,ST固定死了的,咱們不用關(guān)心。 ? ②、具體分析如下: (1)我們的輸入信號(hào)是50Hz?(周期為20ms),初步定為1周期200個(gè)采樣點(diǎn),(注:一周期最少采20個(gè)點(diǎn),即采樣率最少為1k)?,每2個(gè)采樣點(diǎn)間隔為?20ms?/200?=?100?us ADC可編程的通道采樣時(shí)間我們選最小的?1.5?周期,則?ADC采樣周期一周期大小為 100us?/1.5=66us?。?ADC?時(shí)鐘頻率為?1/66us?=15?KHz。 ??ADC可編程的通道采樣時(shí)間我們選71.5?周期,則?ADC采樣周期一周期大小為 (100us?/71.5)?。?ADC?時(shí)鐘頻率為?7.15MHz。 ? (2)接下來(lái)我們要確定系統(tǒng)時(shí)鐘:我們?用的是?8M?Hz?的外部晶振做時(shí)鐘源(HSE),估計(jì)得?經(jīng)過(guò)?LL倍頻?LL?倍頻系數(shù)分別為2的整數(shù)倍,最大72?MHz。為了?提高數(shù)據(jù)計(jì)算效率,我們把系統(tǒng)時(shí)鐘定為72MHz,(PLL?9倍?頻)。則PCLK2=72MHz,PCLK1=36MHz; ? 我們通過(guò)設(shè)置時(shí)鐘配置寄存器(RCC_CFGR)?中?有?為ADC?時(shí)鐘提供一個(gè)專用的可編程預(yù)分器,將PCLK2?8?分頻后作為ADC?的時(shí)鐘,則可?知ADC?時(shí)鐘頻率為?9MHz ????????從手冊(cè)可知:?ADC?轉(zhuǎn)換時(shí)間: STM32F103xx?增強(qiáng)型產(chǎn)品:ADC?時(shí)鐘為56MHz?時(shí)為1μs(ADC?時(shí)鐘為72MHz?為1.17μs) ?(3)由以上分析可知:不太對(duì)應(yīng),我們重新對(duì)以上內(nèi)容調(diào)整,提出如下兩套方案: ? 方案一:我們的輸入信號(hào)是50Hz?(周期為20ms),初步定為1周期2500個(gè)采樣點(diǎn),(注:一周期最少采20個(gè)點(diǎn),即采樣率最少為1k)?,每2個(gè)采樣點(diǎn)間隔為?20ms?/2500?=?8?us ADC可編程的通道采樣時(shí)間我們選71.5?周期,則?ADC采樣周期一周期大小為 8us?/71.5?。?ADC?時(shí)鐘頻率約為?9?MHz。 將PCLK2?8?分頻后作為ADC?的時(shí)鐘,則可知ADC?時(shí)鐘頻率為?9MHz ? 方案二:我們的輸入信號(hào)是50Hz?(周期為20ms),初步定為1周期1000個(gè)采樣點(diǎn),(注:一周期最少采20個(gè)點(diǎn),即采樣率最少為1k)?,每2個(gè)采樣點(diǎn)間隔為?20ms?/1000=?20?us ADC可編程的通道采樣時(shí)間我們選239.5周期,則?ADC采樣周期一周期大小為 20us?/239.5?。?ADC?時(shí)鐘頻率約為?12?MHz。 |
?
?
| STM32?DAC實(shí)驗(yàn) 基本原理:12位的DAC模塊將測(cè)量用的基準(zhǔn)電壓(3.3V)分為4095份(3.3/4095),通過(guò)設(shè)定寄存器DAC_DHR12Rx(設(shè)定不同的對(duì)齊方式對(duì)應(yīng)的寄存器有所不同)的值,可以得到輸出電壓的大小,其值為寄存器內(nèi)值的大小乘以每一份的值(3.3/4095),結(jié)果就是希望輸出的電壓值大小。然后我們通過(guò)ADC采樣,就可以把輸出電壓的值檢測(cè)出來(lái),并顯示在LCD上。注意,這里參考電壓的設(shè)置,VREF+接到3.3V,VREF-接到0V。 另外,DAC輸出是受DORx寄存器直接控制的,但是不能直接往DORx寄存器寫入數(shù)據(jù),而是通過(guò)DHRx間接的傳給DORx寄存器,實(shí)現(xiàn)對(duì)DAC輸出的控制。 |
?
一、?GPIO模式配置???
???
1、輸入/輸出模式(參考stm32手冊(cè))??
2、GPIO輸出模式下,幾種速度的區(qū)別:??
(1).?GPIO?引腳速度:?GPIO_Speed_2MHz?????(10MHz,?50MHz)?;??
????又稱輸出驅(qū)動(dòng)電路的響應(yīng)速度:(芯片內(nèi)部在I/O口的輸出部分安排了多個(gè)響應(yīng)速度不同的輸出驅(qū)動(dòng)電路,用戶可以根據(jù)自己的需要選擇合適的驅(qū)動(dòng)電路,通過(guò)選擇速度來(lái)選擇不同的輸出驅(qū)動(dòng)模塊,達(dá)到最佳的噪聲控制和降低功耗的目的。)??
????可理解為:?輸出驅(qū)動(dòng)電路的帶寬:即一個(gè)驅(qū)動(dòng)電路可以不失真地通過(guò)信號(hào)的最大頻率。??
(如果一個(gè)信號(hào)的頻率超過(guò)了驅(qū)動(dòng)電路的響應(yīng)速度,就有可能信號(hào)失真。失真因素?)??
如果信號(hào)頻率為10MHz,而你配置了2MHz的帶寬,則10MHz的方波很可能就變成了正弦波。就好比是公路的設(shè)計(jì)時(shí)速,汽車速度低于設(shè)計(jì)時(shí)速時(shí),可以平穩(wěn)地運(yùn)行,如果超過(guò)設(shè)計(jì)時(shí)速就會(huì)顛簸,甚至翻車。??
關(guān)鍵是:?GPIO的引腳速度跟應(yīng)用相匹配,速度配置越高,噪聲越大,功耗越大。??
帶寬速度高的驅(qū)動(dòng)器耗電大、噪聲也大,帶寬低的驅(qū)動(dòng)器耗電小、噪聲也小。使用合適的驅(qū)動(dòng)器可以降低功耗和噪聲??
比如:高頻的驅(qū)動(dòng)電路,噪聲也高,當(dāng)不需要高的輸出頻率時(shí),請(qǐng)選用低頻驅(qū)動(dòng)電路,這樣非常有利于提高系統(tǒng)的EMI性能。當(dāng)然如果要輸出較高頻率的信號(hào),但卻選用了較低頻率的驅(qū)動(dòng)模塊,很可能會(huì)得到失真的輸出信號(hào)。關(guān)鍵是GPIO的引腳速度跟應(yīng)用匹配(推薦10倍以上?)。??
比如:??
① USART串口,若最大波特率只需115.2k,那用2M的速度就夠了,既省電也噪聲小。??
② I2C接口,若使用400k波特率,若想把余量留大些,可以選用10M的GPIO引腳速度。??
③ SPI接口,若使用18M或9M波特率,需要選用50M的GPIO的引腳速度。??
(2).?GPIO的翻轉(zhuǎn)速度指:輸入/輸出寄存器的0?,1?值反映到外部引腳(APB2上)高低電平的速度.手冊(cè)上指出GPIO最大翻轉(zhuǎn)速度可達(dá)18MHz。??
@通過(guò)簡(jiǎn)單的程序測(cè)試,用示波器觀察到的翻轉(zhuǎn)時(shí)間:??是綜合的時(shí)間,包括取指令的時(shí)間、指令執(zhí)行的時(shí)間、指令執(zhí)行后信號(hào)傳遞到寄存器的時(shí)間(這其中可能經(jīng)過(guò)很多環(huán)節(jié),比如AHB、APB、總線仲裁等),最后才是信號(hào)從寄存器傳輸?shù)揭_所經(jīng)歷的時(shí)間。????
如:有上拉電阻,其阻值越大,RC延時(shí)越大,即邏輯電平轉(zhuǎn)換的速度越慢,功耗越大。??
(3).GPIO?輸出速度:與程序有關(guān),(程序中寫的多久輸出一個(gè)信號(hào))。??
2、GPIO口設(shè)為輸入時(shí),輸出驅(qū)動(dòng)電路與端口是斷開,所以輸出速度配置無(wú)意義。??
3、在復(fù)位期間和剛復(fù)位后,復(fù)用功能未開啟,I/O端口被配置成浮空輸入模式。??
4、所有端口都有外部中斷能力。為了使用外部中斷線,端口必須配置成輸入模式。??
5、GPIO口的配置具有上鎖功能,當(dāng)配置好GPIO口后,可以通過(guò)程序鎖住配置組合,直到下次芯片復(fù)位才能解鎖。??
?一般應(yīng)用:??
模擬輸入_AIN?——應(yīng)用ADC模擬輸入,或者低功耗下省電。??
浮空輸入_IN_FLOATING?——可以做KEY識(shí)別,RX1??
開漏輸出_Out_OD——應(yīng)用于I2C總線;?(STM32開漏輸出若外部不接上拉電阻只能輸出0)??
二.?管腳的復(fù)用功能?重映射??
1、復(fù)用功能:內(nèi)置外設(shè)是與I/O口共用引出管腳(不同的功能對(duì)應(yīng)同一管腳)??
STM32?所有內(nèi)置外設(shè)的外部引腳都是與標(biāo)準(zhǔn)GPIO引腳復(fù)用的,如果有多個(gè)復(fù)用功能模塊對(duì)應(yīng)同一個(gè)引腳,只能使能其中之一,其它模塊保持非使能狀態(tài)。??
2、重映射功能:復(fù)用功能的引出腳可以通過(guò)重映射,從不同的I/O管腳引出,即復(fù)用功???能的引出腳位是可通過(guò)程序改變到其他的引腳上!??
直接好處:PCB電路板的設(shè)計(jì)人員可以在需要的情況下,不必把某些信號(hào)在板上繞一大圈完成聯(lián)接,方便了PCB的設(shè)計(jì)同時(shí)潛在地減少了信號(hào)的交叉干擾。??
如:USART1:?0:?沒有重映像(TX/PA9,RX/PA10);?1:?重映像(TX/PB6,RX/PB7)。??
(參考AFIO_MAPR寄存器介紹)[0,1為一寄存器的bit值]??
【注】?下述復(fù)用功能的引出腳具有重映射功能:??
??-?晶體振蕩器的引腳在不接晶體時(shí),可以作為普通I/O口??
??-?CAN模塊;?-?JTAG調(diào)試接口;-?大部分定時(shí)器的引出接口;?-?大部分USART引出接口??
??-?I2C1的引出接口;??-?SPI1的引出接口;??
舉例:對(duì)于STM32F103VBT6,47引腳為PB10,它的復(fù)用功能是I2C2_SCL和?USART3_TX,表示在上電之后它的默認(rèn)功能為PB10,而I2C2的SCL和USART3的TX為它的復(fù)用功能;另外在TIM2的引腳重映射后,TIM2_CH3也成為這個(gè)引腳的復(fù)用功能。??
(1)要使用STM32F103VBT6的47、48腳的USART3功能,則需要配置47腳為復(fù)用推挽輸出或復(fù)用開漏輸出,配置48腳為某種輸入模式,同時(shí)使能USART3并保持I2C2的非使能狀態(tài)。??
(2)使用STM32F103VBT6的47腳作為TIM2_CH3,則需要對(duì)TIM2進(jìn)行重映射,然后再按復(fù)用功能的方式配置對(duì)應(yīng)引腳.
總結(jié)
以上是生活随笔為你收集整理的STM32看门狗总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言中为什么要使用enum
- 下一篇: STM32之独立看门狗与窗口看门狗总结