帶你走進(jìn)STM32的世界 更多學(xué)習資料分享群,歡迎大家加入471417140 STM32F10xx時(shí)鐘系統框圖:時(shí)鐘是整個(gè)系統的脈搏 下圖是STM32F10xx時(shí)鐘系統的框圖,通過(guò)這個(gè)圖可以一目了然地看到各個(gè)部件時(shí)鐘產(chǎn)生的路徑,還可以很方便地計算出各部分的時(shí)鐘頻率。 STM32的四個(gè)時(shí)鐘源(HSI、HSE、LSI和LSE)也在圖中標出;圖中間的時(shí)鐘監視系統(CSS)是在很多ST7的單片機中就出現的安全設置。特別注意:圖的右邊,輸出定時(shí)器時(shí)鐘之前有一個(gè)乘法器,它的操作不是由程序控制的,是由硬件根據前一級的APB預分頻器的輸出自動(dòng)選擇,當APB預分頻器的分頻因子為1時(shí),這個(gè)乘法器無(wú)作用;當APB預分頻器的分頻因子大于1時(shí),這個(gè)乘法器做倍頻操作,即將APB預分頻器輸出的頻率乘2,這樣可以保證定時(shí)器可以得到最高的72MHz時(shí)鐘脈沖。 STM32上很多管腳功能可以重新映射 STM32上有很多I/O口,也有很多的內置外設,為了節省引出管腳,這些內置外設都是與I/O口共用引出管腳,ST稱(chēng)其為I/O管腳的復用功能,相信這點(diǎn)大家都很清楚,因為基本上所有單片機都是這么做的。但不知有多少人知道,很多復用功能的引出腳可以通過(guò)重映射,從不同的I/O管腳引出,即復用功能的引出腳位是可通過(guò)程序改變的。 這一功能的直接好處是,PCB電路板的設計人員可以在需要的情況下,不必把某些信號在板上繞一大圈完成聯(lián)接,方便了PCB的設計同時(shí)潛在地減少了信號的交叉干擾。復用功能引出腳的重映射功能所帶來(lái)的潛在好處是,在你不需要同時(shí)使用多個(gè)復用功能時(shí),虛擬地增加復用功能的數量。例如,STM32上最多有3個(gè)USART接口,當你需要更多UART接口而又不需要同時(shí)使用它們時(shí),可以通過(guò)這個(gè)重映射功能實(shí)現更多的UART接口。 下述復用功能的引出腳具有重映射功能: - 晶體振蕩器的引腳在不接晶體時(shí),可以作為普通I/O口 - CAN模塊 - JTAG調試接口 - 大部分定時(shí)器的引出接口 - 大部分USART的引出接口 - I2C1的引出接口 - SPI1的引出接口 詳細內容請看STM32的技術(shù)參考手冊。 請務(wù)必記。喝绻褂昧巳我庖环N重映射功能,在初始化和使用之前,一定要打開(kāi)AFIO時(shí)鐘。 下圖示出了部分復用功能引出腳的重映射結果: 【演示實(shí)例】一個(gè)在EK-STM32F板子上的RTC作為calender的例子 硬件連接:串口線(xiàn)連至板子的UART-0端口。超級終端設置為: Bits Per seconds: 115200 Data bits: 8 Parity: none Stop bits: 1 Flow control Hardware 板子第一次跑這個(gè)程序時(shí),進(jìn)入時(shí)間配置。 根據超級終端上的提示,一次輸入年,月,日,時(shí),分,秒 (1月就輸入01,10月直接輸入10;同理3號就輸入03) 隨后當前的時(shí)間就顯示到了超級終端上,并且每秒刷新。 沒(méi)有斷電的情況下再跑這個(gè)程序,由于看到bake up區域有被設置過(guò)時(shí)間的標志,不再進(jìn)入時(shí)間設置階段,而是直接到時(shí)間顯示間斷,在超級終端上,每秒刷新。 當然如果在EK-STM32F板子上將Vbat和電池相接,具體就是:將紅色的電源跳線(xiàn)帽中的從下往上數的第5個(gè)取下,從原來(lái)的水平放置改成豎直放置(和上面的VBAT相連)。就算斷電,只要再上電,看到back up區域中的記號,一樣直接進(jìn)入時(shí)間顯示。因為斷電后,back up區域由電池供電,其中記錄的記號不會(huì )由于系統掉電而消失。 【演示實(shí)例】使用EK-STM32F板測量STM32的功耗 這個(gè)例子演示了如何使用EK-STM32F開(kāi)發(fā)評估板測量STM32F103VBT6在各種模式下的功耗。例子中演示了如何進(jìn)入STM32的各種模式(RUN、SLEEP、STOP、STANDBY),使用這個(gè)例子您可以通過(guò)EK-STM32F板上的紅色跳線(xiàn)(VDD、VREF+和VDDA)測量功耗。 本實(shí)例首先通過(guò)UART與Windows的Hyperterminal通信,用戶(hù)可以選擇需要進(jìn)入的功耗模式,然后這個(gè)例程把用戶(hù)選好的配置存到后備寄存器,再次復位后STM32將進(jìn)入之前選定的模式。 附件包中包含了一個(gè)說(shuō)明文件,詳細說(shuō)明了如何設置板上的跳線(xiàn)和操作的過(guò)程。 STM32 GPIO的十大優(yōu)越功能綜述 前幾天Hotpower邀請大家討論一下GPIO的功能、性能和優(yōu)缺點(diǎn)(STM32的GPIO很強大~~~),等了幾天沒(méi)見(jiàn)太多人發(fā)言,但綜合來(lái)看提到了3點(diǎn):1)真雙向IO,2)速度快,3)寄存器功能重復。關(guān)于第3點(diǎn)有說(shuō)好,有說(shuō)多余的,見(jiàn)仁見(jiàn)智。 下面我就在做個(gè)拋磚引玉,根據ST手冊上的內容,簡(jiǎn)單地綜述一下GPIO的功能: 一、共有8種模式,可以通過(guò)編程選擇: 1. 浮空輸入 2. 帶上拉輸入 3. 帶下拉輸入 4. 模擬輸入 5. 開(kāi)漏輸出——(此模式可實(shí)現hotpower說(shuō)的真雙向IO) 6. 推挽輸出 7. 復用功能的推挽輸出 8. 復用功能的開(kāi)漏輸出 模式7和模式8需根據具體的復用功能決定。 二、專(zhuān)門(mén)的寄存器(GPIOx_BSRR和GPIOx_BRR)實(shí)現對GPIO口的原子操作,即回避了設置或清除I/O端口時(shí)的“讀-修改-寫(xiě)”操作,使得設置或清除I/O端口的操作不會(huì )被中斷處理打斷而造成誤動(dòng)作。 三、每個(gè)GPIO口都可以作為外部中斷的輸入,便于系統靈活設計。 四、I/O口的輸出模式下,有3種輸出速度可選(2MHz、10MHz和50MHz),這有利于噪聲控制。 五、所有I/O口兼容CMOS和TTL,多數I/O口兼容5V電平。 六、大電流驅動(dòng)能力:GPIO口在高低電平分別為0.4V和VDD-0.4V時(shí),可以提供或吸收8mA電流;如果把輸入輸出電平分別放寬到1.3V和VDD-1.3V時(shí),可以提供或吸收20mA電流。 七、具有獨立的喚醒I/O口。 八、很多I/O口的復用功能可以重新映射,見(jiàn):你知道嗎?STM32上很多管腳功能可以重新映射。 九、GPIO口的配置具有上鎖功能,當配置好GPIO口后,可以通過(guò)程序鎖住配置組合,直到下次芯片復位才能解鎖。此功能非常有利于在程序跑飛的情況下保護系統中其他的設備,不會(huì )因為某些I/O口的配置被改變而損壞——如一個(gè)輸入口變成輸出口并輸出電流。 十、輸出模式下輸入寄存器依然有效,在開(kāi)漏配置模式下實(shí)現真正的雙向I/O功能。 STM32內置參照電壓的使用 每個(gè)STM32芯片都有一個(gè)內部的參照電壓,相當于一個(gè)標準電壓測量點(diǎn),在芯片內部連接到ADC1的通道17。 根據數據手冊中的數據,這個(gè)參照電壓的典型值是1.20V,最小值是1.16V,最大值是1.24V。這個(gè)電壓基本不隨外部供電電壓的變化而變化。 不少人把這個(gè)參照電壓與ADC的參考電壓混淆。ADC的參考電壓都是通過(guò)Vref+提供的。100腳以上的型號,Vref+引到了片外,引腳名稱(chēng)為Vref+;64腳和小于64腳的型號,Vref+在芯片內部與VCC信號線(xiàn)相連,沒(méi)有引到片外,這樣AD的參考電壓就是VCC上的電壓。 在A(yíng)DC的外部參考電壓波動(dòng),或因為Vref+在芯片內部與VCC相連而VCC變化的情況下,如果對于A(yíng)DC測量的準確性要求不高時(shí),可以使用這個(gè)內部參照電壓得到ADC測量的電壓值。 具體方法是在測量某個(gè)通道的電壓值之前,先讀出參照電壓的ADC測量數值,記為ADrefint;再讀出要測量通道的ADC轉換數值,記為ADchx;則要測量的電壓為: Vchx = Vrefint * (ADchx/ADrefint) 其中Vrefint為參照電壓=1.20V。 上述方法在使用內置溫度傳感器對因為溫度變化,對系統參數進(jìn)行補償時(shí)就十分有效。 STM32的ADC輸入通道配置 STM32中最多有3個(gè)ADC模塊,每個(gè)模塊對應的通道不完全重疊。 下圖是STM32F103CDE數據手冊中的總框圖的左下角,圖中可以看出有8個(gè)外部ADC管腳分別接到了3個(gè)ADC模塊,有8個(gè)外部ADC管腳只分別接到了2個(gè)ADC模塊,還有5個(gè)外部ADC管腳只接到了ADC3模塊,這樣總共是21個(gè)通道。 下表是這些ADC管腳與每個(gè)ADC模塊的對應關(guān)系,表中可以看出ADC1還有2個(gè)內部通道,分別接到內部的溫度傳感器和內部的參照電壓: 關(guān)于STM32 ADC速度的問(wèn)題 STM32F103xx系列稱(chēng)為增強型產(chǎn)品,增強型產(chǎn)品的最高時(shí)鐘頻率可以達到72MHz。增強型產(chǎn)品的英文名稱(chēng)為Performance Line。 STM32F101xx系列稱(chēng)為基本型產(chǎn)品,基本型產(chǎn)品的最高時(shí)鐘頻率可以達到36MHz;拘彤a(chǎn)品的英文名稱(chēng)為Access Line。 根據設計,當ADC模塊的頻率為14MHz時(shí),可以達到ADC的最快采樣轉換速度。 要得到14MHz的ADC頻率,就要求SYSCLK的頻率是14MHz的倍數,即14MHz、28MHz、42MHz、56MHz、70MHz、84MHz等;對于基本型產(chǎn)品14MHz和28MHz處于它的最大允許頻率范圍內;對于增強型產(chǎn)品,14MHz、28MHz、42MHz、56MHz和70MHz幾種頻率都在它的最大允許頻率范圍內,但因為ADC預分頻器的分頻系數只有2、4、6、8這幾個(gè),使用70MHz不能得到最大的14MHz,所以要想得到最快的ADC轉換速度,在增強型產(chǎn)品上能用的最快SYSCLK頻率是56MHz。 ADC的速度由2個(gè)參數決定,它是采樣時(shí)間和轉換時(shí)間之和: 即:TCONV = 采樣時(shí)間 + 12.5個(gè)ADC時(shí)鐘周期 在STM32中,ADC的采樣時(shí)間是由用戶(hù)程序在一組預定的數值中選擇,按照ADC的時(shí)鐘周期計算,共有8種選擇: 1.5、7.5、13.5、28.5、41.5、55.5、71.5和239.5 按最小的1.5個(gè)時(shí)鐘周期的采樣時(shí)間計算,最短的TCONV等于14個(gè)時(shí)鐘周期,如果ADC的時(shí)鐘頻率是14MHz,則ADC的速度為每秒100萬(wàn)次。 注意:當ADC的時(shí)鐘頻率超過(guò)14MHz時(shí),ADC的精度將會(huì )顯著(zhù)下降。 STM32內置CRC模塊的使用 所有的STM32芯片都內置了一個(gè)硬件的CRC計算模塊,可以很方便地應用到需要進(jìn)行通信的程序中,這個(gè)CRC計算模塊使用常見(jiàn)的、在以太網(wǎng)中使用的計算多項式: X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2 + X + 1 寫(xiě)成16進(jìn)制就是:0x04C11DB7 使用這個(gè)內置CRC模塊的方法非常簡(jiǎn)單,既首先復位CRC模塊(設置CRC_CR=0x01),這個(gè)操作把CRC計算的余數初始化為0xFFFFFFFF;然后把要計算的數據按每32位分割為一組數據字,并逐個(gè)地把這組數據字寫(xiě)入CRC_DR寄存器(既下圖中的綠色框),寫(xiě)完所有的數據字后,就可以從CRC_DR寄存器(既下圖中的蘭色框)讀出計算的結果。 注意:雖然讀寫(xiě)操作都是針對CRC_DR寄存器,但實(shí)際上是訪(fǎng)問(wèn)的不同物理寄存器。 有幾點(diǎn)需要說(shuō)明: 1)上述算法中變量CRC,在每次循環(huán)結束包含了計算的余數,它始終是向左移位(既從最低位向最高位移動(dòng)),溢出的數據位被丟棄。 2)輸入的數據始終是以32位為單位,如果原始數據少于32位,需要在低位補0,當然也可以高位補0。 3)假定輸入的DWORD數組中每個(gè)分量是按小端存儲。 4)輸入數據是按照最高位最先計算,最低位最后計算的順序進(jìn)行。 例如: 如果輸入0x44434241,內存中按字節存放的順序是:0x41, 0x42, 0x43, 0x44。計算的結果是:0xCF534AE1 如果輸入0x41424344,內存中按字節存放的順序是:0x44, 0x43, 0x42, 0x41。計算的結果是:0xABCF9A63 STM32中定時(shí)器的時(shí)鐘源 STM32中有多達8個(gè)定時(shí)器,其中TIM1和TIM8是能夠產(chǎn)生三對PWM互補輸出的高級定時(shí)器,常用于三相電機的驅動(dòng),它們的時(shí)鐘由APB2的輸出產(chǎn)生。其它6個(gè)為普通定時(shí)器,時(shí)鐘由APB1的輸出產(chǎn)生。 下圖是STM32參考手冊上時(shí)鐘分配圖中,有關(guān)定時(shí)器時(shí)鐘部分的截圖: 從圖中可以看出,定時(shí)器的時(shí)鐘不是直接來(lái)自APB1或APB2,而是來(lái)自于輸入為APB1或APB2的一個(gè)倍頻器,圖中的藍色部分。 下面以定時(shí)器2~7的時(shí)鐘說(shuō)明這個(gè)倍頻器的作用:當APB1的預分頻系數為1時(shí),這個(gè)倍頻器不起作用,定時(shí)器的時(shí)鐘頻率等于A(yíng)PB1的頻率;當APB1的預分頻系數為其它數值(即預分頻系數為2、4、8或16)時(shí),這個(gè)倍頻器起作用,定時(shí)器的時(shí)鐘頻率等于A(yíng)PB1的頻率兩倍。 假定AHB=36MHz,因為APB1允許的最大頻率為36MHz,所以APB1的預分頻系數可以取任意數值;當預分頻系數=1時(shí),APB1=36MHz,TIM2~7的時(shí)鐘頻率=36MHz(倍頻器不起作用);當預分頻系數=2時(shí),APB1=18MHz,在倍頻器的作用下,TIM2~7的時(shí)鐘頻率=36MHz。 有人會(huì )問(wèn),既然需要TIM2~7的時(shí)鐘頻率=36MHz,為什么不直接取APB1的預分頻系數=1?答案是:APB1不但要為T(mén)IM2~7提供時(shí)鐘,而且還要為其它外設提供時(shí)鐘;設置這個(gè)倍頻器可以在保證其它外設使用較低時(shí)鐘頻率時(shí),TIM2~7仍能得到較高的時(shí)鐘頻率。 再舉個(gè)例子:當AHB=72MHz時(shí),APB1的預分頻系數必須大于2,因為APB1的最大頻率只能為36MHz。如果APB1的預分頻系數=2,則因為這個(gè)倍頻器,TIM2~7仍然能夠得到72MHz的時(shí)鐘頻率。能夠使用更高的時(shí)鐘頻率,無(wú)疑提高了定時(shí)器的分辨率,這也正是設計這個(gè)倍頻器的初衷。 STM32中外部中斷與外部事件 這張圖是一條外部中斷線(xiàn)或外部事件線(xiàn)的示意圖,圖中信號線(xiàn)上劃有一條斜線(xiàn),旁邊標志19字樣的注釋?zhuān)硎具@樣的線(xiàn)路共有19套。 圖中的藍色虛線(xiàn)箭頭,標出了外部中斷信號的傳輸路徑,首先外部信號從編號1的芯片管腳進(jìn)入,經(jīng)過(guò)編號2的邊沿檢測電路,通過(guò)編號3的或門(mén)進(jìn)入中斷“掛起請求寄存器”,最后經(jīng)過(guò)編號4的與門(mén)輸出到NVIC中斷控制器;在這個(gè)通道上有4個(gè)控制選項,外部的信號首先經(jīng)過(guò)邊沿檢測電路,這個(gè)邊沿檢測電路受上升沿或下降沿選擇寄存器控制,用戶(hù)可以使用這兩個(gè)寄存器控制需要哪一個(gè)邊沿產(chǎn)生中斷,因為選擇上升沿或下降沿是分別受2個(gè)平行的寄存器控制,所以用戶(hù)可以同時(shí)選擇上升沿或下降沿,而如果只有一個(gè)寄存器控制,那么只能選擇一個(gè)邊沿了。 接下來(lái)是編號3的或門(mén),這個(gè)或門(mén)的另一個(gè)輸入是“軟件中斷/事件寄存器”,從這里可以看出,軟件可以?xún)?yōu)先于外部信號請求一個(gè)中斷或事件,既當“軟件中斷/事件寄存器”的對應位為“1”時(shí),不管外部信號如何,編號3的或門(mén)都會(huì )輸出有效信號。 一個(gè)中斷或事件請求信號經(jīng)過(guò)編號3的或門(mén)后,進(jìn)入掛起請求寄存器,到此之前,中斷和事件的信號傳輸通路都是一致的,也就是說(shuō),掛起請求寄存器中記錄了外部信號的電平變化。 外部請求信號最后經(jīng)過(guò)編號4的與門(mén),向NVIC中斷控制器發(fā)出一個(gè)中斷請求,如果中斷屏蔽寄存器的對應位為“0”,則該請求信號不能傳輸到與門(mén)的另一端,實(shí)現了中斷的屏蔽。 明白了外部中斷的請求機制,就很容易理解事件的請求機制了。圖中紅色虛線(xiàn)箭頭,標出了外部事件信號的傳輸路徑,外部請求信號經(jīng)過(guò)編號3的或門(mén)后,進(jìn)入編號5的與門(mén),這個(gè)與門(mén)的作用與編號4的與門(mén)類(lèi)似,用于引入事件屏蔽寄存器的控制;最后脈沖發(fā)生器把一個(gè)跳變的信號轉變?yōu)橐粋(gè)單脈沖,輸出到芯片中的其它功能模塊。 在這張圖上我們也可以知道,從外部激勵信號來(lái)看,中斷和事件是沒(méi)有分別的,只是在芯片內部分開(kāi),一路信號會(huì )向CPU產(chǎn)生中斷請求,另一路信號會(huì )向其它功能模塊發(fā)送脈沖觸發(fā)信號,其它功能模塊如何相應這個(gè)觸發(fā)信號,則由對應的模塊自己決定。 在圖上部的APB總線(xiàn)和外設模塊接口,是每一個(gè)功能模塊都有的部分,CPU通過(guò)這樣的接口訪(fǎng)問(wèn)各個(gè)功能模塊,這里就不再贅述了。 STM32的USART發(fā)送數據時(shí)如何使用TXE和TC標志 在USART的發(fā)送端有2個(gè)寄存器,一個(gè)是程序可以看到的USART_DR寄存器(下圖中陰影部分的TDR),另一個(gè)是程序看不到的移位寄存器(下圖中陰影部分Transmit Shift Register)。 對應USART數據發(fā)送有兩個(gè)標志,一個(gè)是TXE=發(fā)送數據寄存器空,另一個(gè)是TC=發(fā)送結束;對照下圖,當TDR中的數據傳送到移位寄存器后,TXE被設置,此時(shí)移位寄存器開(kāi)始向TX信號線(xiàn)按位傳輸數據,但因為T(mén)DR已經(jīng)變空,程序可以把下一個(gè)要發(fā)送的字節(操作USART_DR)寫(xiě)入TDR中,而不必等到移位寄存器中所有位發(fā)送結束,所有位發(fā)送結束時(shí)(送出停止位后)硬件會(huì )設置TC標志。 另一方面,在剛剛初始化好USART還沒(méi)有發(fā)送任何數據時(shí),也會(huì )有TXE標志,因為這時(shí)發(fā)送數據寄存器是空的。 TXEIE和TCIE的意義很簡(jiǎn)單,TXEIE允許在TXE標志為'1'時(shí)產(chǎn)生中斷,而TCIE允許在TC標志為'1'時(shí)產(chǎn)生中斷。 至于什么時(shí)候使用哪個(gè)標志,需要根據你的需要自己決定。但我認為T(mén)XE允許程序有更充裕的時(shí)間填寫(xiě)TDR寄存器,保證發(fā)送的數據流不間斷。TC可以讓程序知道發(fā)送結束的確切時(shí)間,有利于程序控制外部數據流的時(shí)序。 STM32設置了很多非常有用和靈活的控制和狀態(tài)位,只要你很好地掌握了它們的用法,可以讓你的應用更加精確和高效。深圳STM32技術(shù)實(shí)訓提升QQ754634522 這是STM32技術(shù)參考手冊中的一頁(yè): 在STM32中如何配置片內外設使用的IO端口 首先,一個(gè)外設經(jīng)過(guò)配置輸入的時(shí)鐘和初始化后即被激活(開(kāi)啟)。 如果需要使用該外設的輸入輸出管腳,則需要配置相應的GPIO端口;否則該外設對應的輸入輸出管腳可以做普通GPIO管腳使用。 技術(shù)咨詢(xún)李老師,電話(huà)13544345450,QQ2966383766。 |
資料共享群471417140 |
更多C語(yǔ)言 C++、JAVA、數電模電、51單片機、PIC stm32 ARM Linux驅動(dòng) 嵌入式、安卓系統 FPGA、DSP Cortex-M3學(xué)習 請咨詢(xún)李老師:騰訊QQ2966383766 中國移動(dòng)全球通18928805217 更多學(xué)習資料分享群,歡迎大家加入群471417140 廣州、深圳南山、民治、龍崗、西鄉、長(cháng)沙、鄭州、南寧同步學(xué)習中! |
謝謝分享。。。。。。。。。。! |
這個(gè)是廣告吶 |
介紹基礎。 |