找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4241|回復(fù): 0
收起左側(cè)

STM32需要注意的地方匯總

[復(fù)制鏈接]
ID:99624 發(fā)表于 2015-12-27 05:56 | 顯示全部樓層 |閱讀模式
注:AHB主要負(fù)責(zé)外部存儲(chǔ)器時(shí)鐘。PB2負(fù)責(zé)AD,I/O,高級(jí)TIM,串口1。APB1負(fù)責(zé)DA,USB,SPI,I2C,CAN,串口2345,普通TIM。
使用MDK KeiluVision4進(jìn)行學(xué)習(xí),照著前面幾個(gè)歷程進(jìn)行學(xué)習(xí),看懂幾個(gè)歷程后想自己也照著搞搞,開始有些錯(cuò)誤經(jīng)調(diào)試后都解決了,但是在其他問題都解決后,編譯就出現(xiàn)了More More than one section matches selector - cannot all be FIRST/LAST這個(gè)錯(cuò)誤,還提示啥包涵了一個(gè)錯(cuò)誤的路徑,本人各種檢查路徑,和歷程的都一樣了,可這個(gè)問題還沒解決,當(dāng)然后來(lái)發(fā)現(xiàn)這個(gè)不是路徑的問題,上網(wǎng)找了好久,終于發(fā)現(xiàn)了,在歷程中RVMDK以及STM32_EVAL中的幾個(gè)初始匯編文件前有三個(gè)紅點(diǎn),而自己的工程中沒有,再找資料才發(fā)現(xiàn)了如何設(shè)置,在此分享下,希望對(duì)大家有幫助:
對(duì)需要設(shè)置的文件(就是文件上有三個(gè)紅點(diǎn)的文件,幾個(gè)歷程基本都一樣),點(diǎn)右鍵Options for File'***',勾去灰化的Include in Target Build和Always Build,然后才重新編譯,就能順利通過了。
類型說明------100腳
S - 電源
I - 輸入
O - 輸出
I/O - 輸入輸出
FT - 5V 兼容
VDD - 單片機(jī)3.3V 電源正
VSS - 單片機(jī)3.3V 電源負(fù)
VDDA - 單片機(jī)A/D 轉(zhuǎn)換器電源正
VSSA - 單片機(jī)A/D 轉(zhuǎn)換器電源負(fù)
VREF+ - 單片機(jī)A/D 轉(zhuǎn)換器參考電壓正
VREF- - 單片機(jī)A/D 轉(zhuǎn)換器參考電壓負(fù)
由于STM32F103 系列單片機(jī)的內(nèi)部高速RC 振蕩器(HSI)由VDDA、VSSA 供電,故
即使不使用單片機(jī)自帶的A/D 轉(zhuǎn)換器,也必須保證VDDA、VSSA 的供電,否則STM32F103
單片機(jī)不能正常啟動(dòng)。在EC30-EKSTM32 核心板的背面,VDDA 和VSSA 分別通過電感連接
到VDD 和VSS。如果外部有VDDA、VSSA 的處理電路,需要將背面這兩個(gè)電感拆除。


STM32F103 有兩個(gè)獨(dú)立的12 位A/D 轉(zhuǎn)換器,16 個(gè)A/D 轉(zhuǎn)換通道。EC30-EKSTM32 只
使用第1 個(gè)A/D 轉(zhuǎn)換器ADC1。16 個(gè)A/D 轉(zhuǎn)換通道分布在PA0 ~ PA7、PB0、PB1、PC0 ~ PC5
這16 個(gè)管腳上,其中任何一個(gè)管腳都可以配置為模擬量輸入管腳AIWx。

設(shè)置NVIC優(yōu)先級(jí)分組,方式。注:一共16個(gè)優(yōu)先級(jí),分為搶占式和響應(yīng)式。兩種優(yōu)先級(jí)所占的數(shù)量由此代碼確定,NVIC_PriorityGroup_x可以是0、1、2、3、4,分別代表?yè)屨純?yōu)先級(jí)有1、2、4、8、16個(gè)和響應(yīng)優(yōu)先級(jí)有16、8、4、2、1個(gè)。規(guī)定兩種優(yōu)先級(jí)的數(shù)量后,所有的中斷級(jí)別必須在其中選擇,搶占級(jí)別高的會(huì)打斷其他中斷優(yōu)先執(zhí)行,而響應(yīng)級(jí)別高的會(huì)在其他中斷執(zhí)行完優(yōu)先執(zhí)行。


STM32中有些硬件功能可以由用戶自己配置,選擇字節(jié)用于這些配置。這些通過用戶選擇字節(jié)配置的功能不能簡(jiǎn)單地通過軟件配置,相應(yīng)的功能必須在芯片上電時(shí)存在。如內(nèi)部的獨(dú)立看門狗,可以通過用戶選擇字節(jié)配置為做看門狗用,也可以通過用戶選擇字節(jié)配置為做普通計(jì)數(shù)器用;做看門狗使用時(shí),軟件是無(wú)法停止它的,所以芯片上電時(shí)這個(gè)功能就必須有效。
STM32三種啟動(dòng)模式中存儲(chǔ)器的存儲(chǔ)介質(zhì)
STM32三種啟動(dòng)模式對(duì)應(yīng)的存儲(chǔ)介質(zhì)均是芯片內(nèi)置的,它們是:
1)用戶閃存 = 芯片內(nèi)置的Flash。
2)SRAM = 芯片內(nèi)置的RAM區(qū),就是內(nèi)存啦。
3)系統(tǒng)存儲(chǔ)器 = 芯片內(nèi)部一塊特定的區(qū)域,芯片出廠時(shí)在這個(gè)區(qū)域預(yù)置了一段Bootloader,就是通常說的ISP程序。這個(gè)區(qū)域的內(nèi)容在芯片出廠后沒有人能夠修改或擦除,即它是一個(gè)ROM區(qū)。在每個(gè)STM32的芯片上都有兩個(gè)管腳BOOT0和BOOT1,這兩個(gè)管腳在芯片復(fù)位時(shí)的電平狀態(tài)決定了芯片復(fù)位后從哪個(gè)區(qū)域開始執(zhí)行程序,見下表:
BOOT1=x  BOOT0=0  從用戶閃存啟動(dòng),這是正常的工作模BOOT1=0  BOOT0=1  從系統(tǒng)存儲(chǔ)器啟動(dòng),這種模式啟動(dòng)的程序功能由廠家設(shè)置。
BOOT1=1  BOOT0=1  從內(nèi)置SRAM啟動(dòng),這種模式可以用于調(diào)試。



STM32 GPIO端口的輸出速度設(shè)置
當(dāng)STM32的GPIO端口設(shè)置為輸出模式時(shí),有三種速度可以選擇:2MHz、10MHz和50MHz,這個(gè)速度是指I/O口驅(qū)動(dòng)電路的速度,是用來(lái)選擇不同的輸出驅(qū)動(dòng)模塊,達(dá)到最佳的噪聲控制和降低功耗的目的。
高頻的驅(qū)動(dòng)電路,噪聲也高,當(dāng)你不需要高的輸出頻率時(shí),請(qǐng)選用低頻驅(qū)動(dòng)電路,這樣非常有利于提高系統(tǒng)的EMI性能。
當(dāng)然如果你要輸出較高頻率的信號(hào),但卻選用了較低頻率的驅(qū)動(dòng)模塊,你很可能會(huì)得到失真的輸出信號(hào)。
實(shí)際上芯片內(nèi)部在I/O口的輸出部分安排了多個(gè)響應(yīng)速度不同的輸出驅(qū)動(dòng)電路,用戶可以根據(jù)自己的需要選擇合適的驅(qū)動(dòng)電路。
注意:GPIO的引腳速度是指I/O口驅(qū)動(dòng)電路的響應(yīng)速度而不是輸出信號(hào)的速度,輸出信號(hào)的速度與你的程序有關(guān)。
關(guān)鍵是,GPIO的引腳速度跟應(yīng)用匹配。
比如對(duì)于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引腳速度就夠了,既省電也噪聲小。
對(duì)于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引腳速度或許不夠,這時(shí)可以選用10M的GPIO引腳速度。
對(duì)于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引腳速度顯然不夠了,需要選用50M的GPIO的引腳速度。


STM32F10xx時(shí)鐘系統(tǒng)框圖:時(shí)鐘是整個(gè)系統(tǒng)的脈搏
下圖是STM32F10xx時(shí)鐘系統(tǒng)的框圖,通過這個(gè)圖可以一目了然地看到各個(gè)部件時(shí)鐘產(chǎn)生的路徑,還可以很方便地計(jì)算出各部分的時(shí)鐘頻率。
STM32的四個(gè)時(shí)鐘源(HSI、HSE、LSI和LSE)也在圖中標(biāo)出;圖中間的時(shí)鐘監(jiān)視系統(tǒng)(CSS)是在很多ST7的單片機(jī)中就出現(xiàn)的安全設(shè)置。特別注意:圖的右邊,輸出定時(shí)器時(shí)鐘之前有一個(gè)乘法器,它的操作不是由程序控制的,是由硬件根據(jù)前一級(jí)的APB預(yù)分頻器的輸出自動(dòng)選擇,當(dāng)APB預(yù)分頻器的分頻因子為1時(shí),這個(gè)乘法器無(wú)作用;當(dāng)APB預(yù)分頻器的分頻因子大于1時(shí),這個(gè)乘法器做倍頻操作,即將APB預(yù)分頻器輸出的頻率乘2,這樣可以保證定時(shí)器可以得到最高的72MHz時(shí)鐘脈沖。


STM32上很多管腳功能可以重新映射
STM32上有很多I/O口,也有很多的內(nèi)置外設(shè),為了節(jié)省引出管腳,這些內(nèi)置外設(shè)都是與I/O口共用引出管腳,ST稱其為I/O管腳的復(fù)用功能,相信這點(diǎn)大家都很清楚,因?yàn)榛旧纤袉纹瑱C(jī)都是這么做的。但不知有多少人知道,很多復(fù)用功能的引出腳可以通過重映射,從不同的I/O管腳引出,即復(fù)用功能的引出腳位是可通過程序改變的。
這一功能的直接好處是,PCB電路板的設(shè)計(jì)人員可以在需要的情況下,不必把某些信號(hào)在板上繞一大圈完成聯(lián)接,方便了PCB的設(shè)計(jì)同時(shí)潛在地減少了信號(hào)的交叉干擾。復(fù)用功能引出腳的重映射功能所帶來(lái)的潛在好處是,在你不需要同時(shí)使用多個(gè)復(fù)用功能時(shí),虛擬地增加復(fù)用功能的數(shù)量。例如,STM32上最多有3個(gè)USART接口,當(dāng)你需要更多UART接口而又不需要同時(shí)使用它們時(shí),可以通過這個(gè)重映射功能實(shí)現(xiàn)更多的UART接口。
下述復(fù)用功能的引出腳具有重映射功能:
  - 晶體振蕩器的引腳在不接晶體時(shí),可以作為普通I/O口
  - CAN模塊
  - JTAG調(diào)試接口
  - 大部分定時(shí)器的引出接口
  - 大部分USART的引出接口
  - I2C1的引出接口
  - SPI1的引出接口
詳細(xì)內(nèi)容請(qǐng)看STM32的技術(shù)參考手冊(cè)。
請(qǐng)務(wù)必記。喝绻褂昧巳我庖环N重映射功能,在初始化和使用之前,一定要打開AFIO時(shí)鐘。
下圖示出了部分復(fù)用功能引出腳的重映射結(jié)果:

【演示實(shí)例】一個(gè)在EK-STM32F板子上的RTC作為calender的例子硬件連接:串口線連至板子的UART-0端口。超級(jí)終端設(shè)置為:
Bits Per seconds: 115200
Data bits: 8
Parity: none
Stop bits: 1
Flow control Hardware

板子第一次跑這個(gè)程序時(shí),進(jìn)入時(shí)間配置。
根據(jù)超級(jí)終端上的提示,一次輸入年,月,日,時(shí),分,秒
(1月就輸入01,10月直接輸入10;同理3號(hào)就輸入03)
隨后當(dāng)前的時(shí)間就顯示到了超級(jí)終端上,并且每秒刷新。

沒有斷電的情況下再跑這個(gè)程序,由于看到bake up區(qū)域有被設(shè)置過時(shí)間的標(biāo)志,不再進(jìn)入時(shí)間設(shè)置階段,而是直接到時(shí)間顯示間斷,在超級(jí)終端上,每秒刷新。

當(dāng)然如果在EK-STM32F板子上將Vbat和電池相接,具體就是:將紅色的電源跳線帽中的從下往上數(shù)的第5個(gè)取下,從原來(lái)的水平放置改成豎直放置(和上面的VBAT相連)。就算斷電,只要再上電,看到back up區(qū)域中的記號(hào),一樣直接進(jìn)入時(shí)間顯示。因?yàn)閿嚯姾,back up區(qū)域由電池供電,其中記錄的記號(hào)不會(huì)由于系統(tǒng)掉電而消失。


【演示實(shí)例】使用EK-STM32F板測(cè)量STM32的功耗這個(gè)例子演示了如何使用EK-STM32F開發(fā)評(píng)估板測(cè)量STM32F103VBT6在各種模式下的功耗。例子中演示了如何進(jìn)入STM32的各種模式(RUN、SLEEP、STOP、STANDBY),使用這個(gè)例子您可以通過EK-STM32F板上的紅色跳線(VDD、VREF+和VDDA)測(cè)量功耗。

本實(shí)例首先通過UART與Windows的Hyperterminal通信,用戶可以選擇需要進(jìn)入的功耗模式,然后這個(gè)例程把用戶選好的配置存到后備寄存器,再次復(fù)位后STM32將進(jìn)入之前選定的模式。

附件包中包含了一個(gè)說明文件,詳細(xì)說明了如何設(shè)置板上的跳線和操作的過程。



STM32 GPIO的十大優(yōu)越功能綜述前幾天Hotpower邀請(qǐng)大家討論一下GPIO的功能、性能和優(yōu)缺點(diǎn)(STM32的GPIO很強(qiáng)大~~~),等了幾天沒見太多人發(fā)言,但綜合來(lái)看提到了3點(diǎn):1)真雙向IO,2)速度快,3)寄存器功能重復(fù)。關(guān)于第3點(diǎn)有說好,有說多余的,見仁見智。

下面我就在做個(gè)拋磚引玉,根據(jù)ST手冊(cè)上的內(nèi)容,簡(jiǎn)單地綜述一下GPIO的功能:
一、共有8種模式,可以通過編程選擇:
  1. 浮空輸入
  2. 帶上拉輸入
  3. 帶下拉輸入
  4. 模擬輸入
  5. 開漏輸出——(此模式可實(shí)現(xiàn)hotpower說的真雙向IO)
  6. 推挽輸出
  7. 復(fù)用功能的推挽輸出
  8. 復(fù)用功能的開漏輸出
模式7和模式8需根據(jù)具體的復(fù)用功能決定。

二、專門的寄存器(GPIOx_BSRR和GPIOx_BRR)實(shí)現(xiàn)對(duì)GPIO口的原子操作,即回避了設(shè)置或清除I/O端口時(shí)的“讀-修改-寫”操作,使得設(shè)置或清除I/O端口的操作不會(huì)被中斷處理打斷而造成誤動(dòng)作。

三、每個(gè)GPIO口都可以作為外部中斷的輸入,便于系統(tǒng)靈活設(shè)計(jì)。

四、I/O口的輸出模式下,有3種輸出速度可選(2MHz、10MHz和50MHz),這有利于噪聲控制。

五、所有I/O口兼容CMOS和TTL,多數(shù)I/O口兼容5V電平。

六、大電流驅(qū)動(dòng)能力:GPIO口在高低電平分別為0.4V和VDD-0.4V時(shí),可以提供或吸收8mA電流;如果把輸入輸出電平分別放寬到1.3V和VDD-1.3V時(shí),可以提供或吸收20mA電流。

七、具有獨(dú)立的喚醒I/O口。

八、很多I/O口的復(fù)用功能可以重新映射,見:你知道嗎?STM32上很多管腳功能可以重新映射。

九、GPIO口的配置具有上鎖功能,當(dāng)配置好GPIO口后,可以通過程序鎖住配置組合,直到下次芯片復(fù)位才能解鎖。此功能非常有利于在程序跑飛的情況下保護(hù)系統(tǒng)中其他的設(shè)備,不會(huì)因?yàn)槟承㊣/O口的配置被改變而損壞——如一個(gè)輸入口變成輸出口并輸出電流。

十、輸出模式下輸入寄存器依然有效,在開漏配置模式下實(shí)現(xiàn)真正的雙向I/O功能。
STM32內(nèi)置參照電壓的使用每個(gè)STM32芯片都有一個(gè)內(nèi)部的參照電壓,相當(dāng)于一個(gè)標(biāo)準(zhǔn)電壓測(cè)量點(diǎn),在芯片內(nèi)部連接到ADC1的通道17。
根據(jù)數(shù)據(jù)手冊(cè)中的數(shù)據(jù),這個(gè)參照電壓的典型值是1.20V,最小值是1.16V,最大值是1.24V。這個(gè)電壓基本不隨外部供電電壓的變化而變化。
不少人把這個(gè)參照電壓與ADC的參考電壓混淆。ADC的參考電壓都是通過Vref+提供的。100腳以上的型號(hào),Vref+引到了片外,引腳名稱為Vref+;64腳和小于64腳的型號(hào),Vref+在芯片內(nèi)部與VCC信號(hào)線相連,沒有引到片外,這樣AD的參考電壓就是VCC上的電壓。
在ADC的外部參考電壓波動(dòng),或因?yàn)閂ref+在芯片內(nèi)部與VCC相連而VCC變化的情況下,如果對(duì)于ADC測(cè)量的準(zhǔn)確性要求不高時(shí),可以使用這個(gè)內(nèi)部參照電壓得到ADC測(cè)量的電壓值。
具體方法是在測(cè)量某個(gè)通道的電壓值之前,先讀出參照電壓的ADC測(cè)量數(shù)值,記為ADrefint;再讀出要測(cè)量通道的ADC轉(zhuǎn)換數(shù)值,記為ADchx;則要測(cè)量的電壓為:
Vchx = Vrefint * (ADchx/ADrefint)
其中Vrefint為參照電壓=1.20V。
上述方法在使用內(nèi)置溫度傳感器對(duì)因?yàn)闇囟茸兓,?duì)系統(tǒng)參數(shù)進(jìn)行補(bǔ)償時(shí)就十分有效。

STM32的ADC輸入通道配置
STM32中最多有3個(gè)ADC模塊,每個(gè)模塊對(duì)應(yīng)的通道不完全重疊。
下圖是STM32F103CDE數(shù)據(jù)手冊(cè)中的總框圖的左下角,圖中可以看出有8個(gè)外部ADC管腳分別接到了3個(gè)ADC模塊,有8個(gè)外部ADC管腳只分別接到了2個(gè)ADC模塊,還有5個(gè)外部ADC管腳只接到了ADC3模塊,這樣總共是21個(gè)通道。
下表是這些ADC管腳與每個(gè)ADC模塊的對(duì)應(yīng)關(guān)系,表中可以看出ADC1還有2個(gè)內(nèi)部通道,分別接到內(nèi)部的溫度傳感器和內(nèi)部的參照電壓:

關(guān)于STM32 ADC速度的問題
STM32F103xx系列稱為增強(qiáng)型產(chǎn)品,增強(qiáng)型產(chǎn)品的最高時(shí)鐘頻率可以達(dá)到72MHz。增強(qiáng)型產(chǎn)品的英文名稱為Performance Line。
STM32F101xx系列稱為基本型產(chǎn)品,基本型產(chǎn)品的最高時(shí)鐘頻率可以達(dá)到36MHz。基本型產(chǎn)品的英文名稱為Access Line。
根據(jù)設(shè)計(jì),當(dāng)ADC模塊的頻率為14MHz時(shí),可以達(dá)到ADC的最快采樣轉(zhuǎn)換速度。
要得到14MHz的ADC頻率,就要求SYSCLK的頻率是14MHz的倍數(shù),即14MHz、28MHz、42MHz、56MHz、70MHz、84MHz等;對(duì)于基本型產(chǎn)品14MHz和28MHz處于它的最大允許頻率范圍內(nèi);對(duì)于增強(qiáng)型產(chǎn)品,14MHz、28MHz、42MHz、56MHz和70MHz幾種頻率都在它的最大允許頻率范圍內(nèi),但因?yàn)锳DC預(yù)分頻器的分頻系數(shù)只有2、4、6、8這幾個(gè),使用70MHz不能得到最大的14MHz,所以要想得到最快的ADC轉(zhuǎn)換速度,在增強(qiáng)型產(chǎn)品上能用的最快SYSCLK頻率是56MHz。

ADC的速度由2個(gè)參數(shù)決定,它是采樣時(shí)間和轉(zhuǎn)換時(shí)間之和:
  即:TCONV = 采樣時(shí)間 + 12.5個(gè)ADC時(shí)鐘周期
在STM32中,ADC的采樣時(shí)間是由用戶程序在一組預(yù)定的數(shù)值中選擇,按照ADC的時(shí)鐘周期計(jì)算,共有8種選擇:
    1.5、7.5、13.5、28.5、41.5、55.5、71.5和239.5
按最小的1.5個(gè)時(shí)鐘周期的采樣時(shí)間計(jì)算,最短的TCONV等于14個(gè)時(shí)鐘周期,如果ADC的時(shí)鐘頻率是14MHz,則ADC的速度為每秒100萬(wàn)次。

注意:當(dāng)ADC的時(shí)鐘頻率超過14MHz時(shí),ADC的精度將會(huì)顯著下降。
STM32內(nèi)置CRC模塊的使用
所有的STM32芯片都內(nèi)置了一個(gè)硬件的CRC計(jì)算模塊,可以很方便地應(yīng)用到需要進(jìn)行通信的程序中,這個(gè)CRC計(jì)算模塊使用常見的、在以太網(wǎng)中使用的計(jì)算多項(xiàng)式:
  X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X + 1
寫成16進(jìn)制就是:0x04C11DB7
使用這個(gè)內(nèi)置CRC模塊的方法非常簡(jiǎn)單,既首先復(fù)位CRC模塊(設(shè)置CRC_CR=0x01),這個(gè)操作把CRC計(jì)算的余數(shù)初始化為0xFFFFFFFF;然后把要計(jì)算的數(shù)據(jù)按每32位分割為一組數(shù)據(jù)字,并逐個(gè)地把這組數(shù)據(jù)字寫入CRC_DR寄存器(既下圖中的綠色框),寫完所有的數(shù)據(jù)字后,就可以從CRC_DR寄存器(既下圖中的蘭色框)讀出計(jì)算的結(jié)果。
注意:雖然讀寫操作都是針對(duì)CRC_DR寄存器,但實(shí)際上是訪問的不同物理寄存器。

有幾點(diǎn)需要說明:
1)上述算法中變量CRC,在每次循環(huán)結(jié)束包含了計(jì)算的余數(shù),它始終是向左移位(既從最低位向最高位移動(dòng)),溢出的數(shù)據(jù)位被丟棄。
2)輸入的數(shù)據(jù)始終是以32位為單位,如果原始數(shù)據(jù)少于32位,需要在低位補(bǔ)0,當(dāng)然也可以高位補(bǔ)0。
3)假定輸入的DWORD數(shù)組中每個(gè)分量是按小端存儲(chǔ)。
4)輸入數(shù)據(jù)是按照最高位最先計(jì)算,最低位最后計(jì)算的順序進(jìn)行。
例如:
如果輸入0x44434241,內(nèi)存中按字節(jié)存放的順序是:0x41, 0x42, 0x43, 0x44。計(jì)算的結(jié)果是:0xCF534AE1
如果輸入0x41424344,內(nèi)存中按字節(jié)存放的順序是:0x44, 0x43, 0x42, 0x41。計(jì)算的結(jié)果是:0xABCF9A63
STM32中定時(shí)器的時(shí)鐘源STM32中有多達(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)生。
下圖是STM32參考手冊(cè)上時(shí)鐘分配圖中,有關(guān)定時(shí)器時(shí)鐘部分的截圖:
從圖中可以看出,定時(shí)器的時(shí)鐘不是直接來(lái)自APB1或APB2,而是來(lái)自于輸入為APB1或APB2的一個(gè)倍頻器,圖中的藍(lán)色部分。
下面以定時(shí)器2~7的時(shí)鐘說明這個(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的頻率兩倍。
假定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。
有人會(huì)問,既然需要TIM2~7的時(shí)鐘頻率=36MHz,為什么不直接取APB1的預(yù)分頻系數(shù)=1?答案是:APB1不但要為TIM2~7提供時(shí)鐘,而且還要為其它外設(shè)提供時(shí)鐘;設(shè)置這個(gè)倍頻器可以在保證其它外設(shè)使用較低時(shí)鐘頻率時(shí),TIM2~7仍能得到較高的時(shí)鐘頻率。
再舉個(gè)例子:當(dāng)AHB=72MHz時(shí),APB1的預(yù)分頻系數(shù)必須大于2,因?yàn)锳PB1的最大頻率只能為36MHz。如果APB1的預(yù)分頻系數(shù)=2,則因?yàn)檫@個(gè)倍頻器,TIM2~7仍然能夠得到72MHz的時(shí)鐘頻率。能夠使用更高的時(shí)鐘頻率,無(wú)疑提高了定時(shí)器的分辨率,這也正是設(shè)計(jì)這個(gè)倍頻器的初衷。
STM32中外部中斷與外部事件這張圖是一條外部中斷線或外部事件線的示意圖,圖中信號(hào)線上劃有一條斜線,旁邊標(biāo)志19字樣的注釋,表示這樣的線路共有19套。
圖中的藍(lán)色虛線箭頭,標(biāo)出了外部中斷信號(hào)的傳輸路徑,首先外部信號(hào)從編號(hào)1的芯片管腳進(jìn)入,經(jīng)過編號(hào)2的邊沿檢測(cè)電路,通過編號(hào)3的或門進(jìn)入中斷“掛起請(qǐng)求寄存器”,最后經(jīng)過編號(hào)4的與門輸出到NVIC中斷控制器;在這個(gè)通道上有4個(gè)控制選項(xiàng),外部的信號(hào)首先經(jīng)過邊沿檢測(cè)電路,這個(gè)邊沿檢測(cè)電路受上升沿或下降沿選擇寄存器控制,用戶可以使用這兩個(gè)寄存器控制需要哪一個(gè)邊沿產(chǎn)生中斷,因?yàn)檫x擇上升沿或下降沿是分別受2個(gè)平行的寄存器控制,所以用戶可以同時(shí)選擇上升沿或下降沿,而如果只有一個(gè)寄存器控制,那么只能選擇一個(gè)邊沿了。
接下來(lái)是編號(hào)3的或門,這個(gè)或門的另一個(gè)輸入是“軟件中斷/事件寄存器”,從這里可以看出,軟件可以優(yōu)先于外部信號(hào)請(qǐng)求一個(gè)中斷或事件,既當(dāng)“軟件中斷/事件寄存器”的對(duì)應(yīng)位為“1”時(shí),不管外部信號(hào)如何,編號(hào)3的或門都會(huì)輸出有效信號(hào)。
一個(gè)中斷或事件請(qǐng)求信號(hào)經(jīng)過編號(hào)3的或門后,進(jìn)入掛起請(qǐng)求寄存器,到此之前,中斷和事件的信號(hào)傳輸通路都是一致的,也就是說,掛起請(qǐng)求寄存器中記錄了外部信號(hào)的電平變化。
外部請(qǐng)求信號(hào)最后經(jīng)過編號(hào)4的與門,向NVIC中斷控制器發(fā)出一個(gè)中斷請(qǐng)求,如果中斷屏蔽寄存器的對(duì)應(yīng)位為“0”,則該請(qǐng)求信號(hào)不能傳輸?shù)脚c門的另一端,實(shí)現(xiàn)了中斷的屏蔽。
明白了外部中斷的請(qǐng)求機(jī)制,就很容易理解事件的請(qǐng)求機(jī)制了。圖中紅色虛線箭頭,標(biāo)出了外部事件信號(hào)的傳輸路徑,外部請(qǐng)求信號(hào)經(jīng)過編號(hào)3的或門后,進(jìn)入編號(hào)5的與門,這個(gè)與門的作用與編號(hào)4的與門類似,用于引入事件屏蔽寄存器的控制;最后脈沖發(fā)生器把一個(gè)跳變的信號(hào)轉(zhuǎn)變?yōu)橐粋(gè)單脈沖,輸出到芯片中的其它功能模塊。
在這張圖上我們也可以知道,從外部激勵(lì)信號(hào)來(lái)看,中斷和事件是沒有分別的,只是在芯片內(nèi)部分開,一路信號(hào)會(huì)向CPU產(chǎn)生中斷請(qǐng)求,另一路信號(hào)會(huì)向其它功能模塊發(fā)送脈沖觸發(fā)信號(hào),其它功能模塊如何相應(yīng)這個(gè)觸發(fā)信號(hào),則由對(duì)應(yīng)的模塊自己決定。
在圖上部的APB總線和外設(shè)模塊接口,是每一個(gè)功能模塊都有的部分,CPU通過這樣的接口訪問各個(gè)功能模塊,這里就不再贅述了。
STM32的USART發(fā)送數(shù)據(jù)時(shí)如何使用TXE和TC標(biāo)志
在USART的發(fā)送端有2個(gè)寄存器,一個(gè)是程序可以看到的USART_DR寄存器(下圖中陰影部分的TDR),另一個(gè)是程序看不到的移位寄存器(下圖中陰影部分Transmit Shift Register)。

對(duì)應(yīng)USART數(shù)據(jù)發(fā)送有兩個(gè)標(biāo)志,一個(gè)是TXE=發(fā)送數(shù)據(jù)寄存器空,另一個(gè)是TC=發(fā)送結(jié)束;對(duì)照下圖,當(dāng)TDR中的數(shù)據(jù)傳送到移位寄存器后,TXE被設(shè)置,此時(shí)移位寄存器開始向TX信號(hào)線按位傳輸數(shù)據(jù),但因?yàn)門DR已經(jīng)變空,程序可以把下一個(gè)要發(fā)送的字節(jié)(操作USART_DR)寫入TDR中,而不必等到移位寄存器中所有位發(fā)送結(jié)束,所有位發(fā)送結(jié)束時(shí)(送出停止位后)硬件會(huì)設(shè)置TC標(biāo)志。

另一方面,在剛剛初始化好USART還沒有發(fā)送任何數(shù)據(jù)時(shí),也會(huì)有TXE標(biāo)志,因?yàn)檫@時(shí)發(fā)送數(shù)據(jù)寄存器是空的。

TXEIE和TCIE的意義很簡(jiǎn)單,TXEIE允許在TXE標(biāo)志為'1'時(shí)產(chǎn)生中斷,而TCIE允許在TC標(biāo)志為'1'時(shí)產(chǎn)生中斷。

至于什么時(shí)候使用哪個(gè)標(biāo)志,需要根據(jù)你的需要自己決定。但我認(rèn)為TXE允許程序有更充裕的時(shí)間填寫TDR寄存器,保證發(fā)送的數(shù)據(jù)流不間斷。TC可以讓程序知道發(fā)送結(jié)束的確切時(shí)間,有利于程序控制外部數(shù)據(jù)流的時(shí)序。

STM32設(shè)置了很多非常有用和靈活的控制和狀態(tài)位,只要你很好地掌握了它們的用法,可以讓你的應(yīng)用更加精確和高效。

這是STM32技術(shù)參考手冊(cè)中的一頁(yè):
在STM32中如何配置片內(nèi)外設(shè)使用的IO端口
首先,一個(gè)外設(shè)經(jīng)過配置輸入的時(shí)鐘和初始化后即被激活(開啟)。
如果需要使用該外設(shè)的輸入輸出管腳,則需要配置相應(yīng)的GPIO端口;否則該外設(shè)對(duì)應(yīng)的輸入輸出管腳可以做普通GPIO管腳使用。
   
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表