STM32入門(mén)基本知識(shí)_第1頁(yè)
STM32入門(mén)基本知識(shí)_第2頁(yè)
STM32入門(mén)基本知識(shí)_第3頁(yè)
STM32入門(mén)基本知識(shí)_第4頁(yè)
STM32入門(mén)基本知識(shí)_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

STM32學(xué)前班教程之一:選擇他的理由經(jīng)過(guò)幾天的學(xué)習(xí),基本掌握了STM32的調(diào)試環(huán)境和一些基本知識(shí)。想拿出來(lái)與大家共享,笨教程本著最大限度簡(jiǎn)化刪減STM32入門(mén)的過(guò)程的思想,會(huì)把我的整個(gè)入門(mén)前的工作推薦給大家。就算是給網(wǎng)上的眾多教程、筆記的一種補(bǔ)充吧,所以叫學(xué)前班教程。其中涉及產(chǎn)品一律隱去來(lái)源和品牌,以防廣告之嫌。全部漢字內(nèi)容為個(gè)人筆記。所有相關(guān)參考資料也全部列出。:lol教程會(huì)分幾篇,因?yàn)樘L(zhǎng)啦。今天先來(lái)說(shuō)說(shuō)為什么是它一一我選擇STM32的原因。我對(duì)未來(lái)的規(guī)劃是以功能性為主的,在功能和面積之間做以平衡是我的首要選擇,而把運(yùn)算放在第二位,這根我的專業(yè)有關(guān)系。里面的運(yùn)算其實(shí)并不復(fù)雜,在入門(mén)階段想盡量減少所接觸的東西。不過(guò)說(shuō)實(shí)話,對(duì)DSP的外設(shè)并和開(kāi)發(fā)環(huán)境不滿意,這是為什么STM32一出就轉(zhuǎn)向的原因。下面是我自己做過(guò)的兩塊DSP28的全功能最小系統(tǒng)板,在做這兩塊板子的過(guò)程中發(fā)現(xiàn)要想盡力縮小DSP的面積實(shí)在不容易(目前只能達(dá)到50mmX45mm,這還是沒(méi)有其他器件的情況下),尤其是雙電源的供電方式和的電源讓人很頭疼。后來(lái)因?yàn)橐粋€(gè)項(xiàng)目,接觸了LPC2148并做了一塊板子,發(fā)現(xiàn)小型的ARM7在外設(shè)夠用的情況下其實(shí)很不錯(cuò),于是開(kāi)始搜集相關(guān)芯片資料,也同時(shí)對(duì)小面積的AVR和51都進(jìn)行了大致的比較,這個(gè)時(shí)候發(fā)現(xiàn)了CortexM3的STM32,比2148擁有更豐富和靈活的外設(shè),性能幾乎是2148兩倍(按照MIPS值計(jì)算)。正好2148我還沒(méi)上手,就直接轉(zhuǎn)了這款STM32F103。與2811相比較(核心供電情況下),135MHzX1MIPS?,F(xiàn)在用STM32F103,72MHzX,性能是DSP的66%,STM32F103R型(64管腳)芯片面積只有2811的51%,STM32F103C型(48管腳)面積是2811的25%,最大功耗是DSP的20%,單片價(jià)格是DSP的30%。且有更多的串口,CAP和PWM,這是有用的。高端型號(hào)有SDIO,理論上比SPI速度快。由以上比較,準(zhǔn)備將未來(lái)的擁有操作系統(tǒng)的高端應(yīng)用交給DSP的新型浮點(diǎn)型單片機(jī)28335,而將所有緊湊型小型、微型應(yīng)用交給STM32。STM32學(xué)前班教程:怎么開(kāi)發(fā)sw笨笨的STM32學(xué)前班教程之二:怎么開(kāi)發(fā)目前手頭的入門(mén)階段使用的開(kāi)發(fā)器概述該產(chǎn)品為簡(jiǎn)易STM32調(diào)試器和DEMO板一體化的調(diào)試學(xué)習(xí)設(shè)備,價(jià)格在一百多塊。2、硬件配置仿真部分:USB口,reset,指示燈,JTAGDEMO部分:4按鍵(IO),4LED(I0),—個(gè)串口,啟動(dòng)方式跳線,所有引腳的焊盤(pán)(可自行焊接插針進(jìn)行擴(kuò)展)DEMO芯片:STM32F103C8T6(程序空間64K)參數(shù)和擴(kuò)展:注:學(xué)習(xí)的目標(biāo)芯片是STM32F103CBT6(7X7mm,128Kflash,16KRAM)以及STM32F103RET6(lOXIOmm,512Kflash,64KRAM)。STM32-SK的硬件連接方法(用板載調(diào)試器調(diào)試板載DEMO):JP3、JP5須全部短接USB通過(guò)電纜連接至PC的USB串口連接至PC的串口或者通過(guò)USB轉(zhuǎn)串口電纜連接(力特Z-TEC,與RS232轉(zhuǎn)接電纜)WindowsXP自動(dòng)安裝驅(qū)動(dòng)安裝完成后如果DEMO板里面有程序就會(huì)自動(dòng)運(yùn)行了。這是ST-Link-II的通用連接方法以上是學(xué)習(xí)階段比較方便的仿真器,進(jìn)入工程階段后準(zhǔn)備換J-LinkV7的仿真器進(jìn)行開(kāi)發(fā)。目前比較滿意的產(chǎn)品:JLinkv7+USB轉(zhuǎn)串口:購(gòu)買(mǎi)后所需的改造:打開(kāi)殼體,將USB的+5V供電跟JTAG20針的第二腳Vsupply飛線,提供目標(biāo)板5V500mA的供電??粗械奶攸c(diǎn):集成串口,擁有20針JTAG可以改造Vspply為供電接口,小巧好帶,便宜。常見(jiàn)的用于STM32單片機(jī)的仿真器分類a)Ulink2:之前常用的仿真器。Keil公司產(chǎn)品,之前專用于ARM7,現(xiàn)擴(kuò)展到CortexM3,調(diào)試接口支持JTAG和SWD,連接到PC主機(jī)的USB?,F(xiàn)在這種調(diào)試器已經(jīng)用的越來(lái)越少了。b)ST-Link-II:ST公司的仿真接口,支持IAREWARM,USB全速,USB電源供電,自適應(yīng)目標(biāo)系統(tǒng)JTAG電平,可向目標(biāo)系統(tǒng)提供不大于5V/200mA電源。這種調(diào)試器不多見(jiàn),但是許多調(diào)試器與目標(biāo)板一體設(shè)計(jì)的學(xué)習(xí)板上常見(jiàn)。c)J-LinkV6/V7:SEGGER公司產(chǎn)品,調(diào)試接口支持JTAG和SWV(V7速度是V6的12倍),USB接口,通過(guò)USB供電,下載速度達(dá)到720kbyte/s,與IARWEARM無(wú)縫集成,寬目標(biāo)板電壓范圍:(V7支持5V),多核調(diào)試,給目標(biāo)板提供電源。這種調(diào)試器現(xiàn)在出現(xiàn)的越來(lái)越多,兼容性比較好(主要是指能夠與IARWEARM無(wú)縫集成這點(diǎn)),國(guó)內(nèi)山寨貨和各種變種也很多。6、目標(biāo)板主要分為一體化設(shè)計(jì)(與調(diào)試器、供電整合)和單獨(dú)設(shè)計(jì)兩類,詳細(xì)產(chǎn)品比較見(jiàn)豆皮的《如何選擇STM32開(kāi)發(fā)板》。STM32學(xué)前班教程之三:讓PC工作開(kāi)發(fā)軟件的選擇1、軟件與版本的選擇需求:支持STLink2或未來(lái)的JlinkV7調(diào)試接口(因?yàn)镾TM32-SK使用這個(gè)接口),能夠找到去除軟件限制的方法,最好具有中文版幫助和界面,最好帶有純軟件仿真選擇:RealViewMDK或者IAREWARM(5版本觀望一下)。2、RealViewMDK(中國(guó)版)安裝與去除限制第一步:執(zhí)行安裝程序完成基本安裝,最后選項(xiàng)選擇加入虛擬硬件,便于純軟件調(diào)試。第二步:執(zhí)行軟件,點(diǎn)擊File--〉LicenceManager,復(fù)制CID的數(shù)據(jù)到破解器的CID,其他選項(xiàng)如下圖,然后點(diǎn)擊Generate。第三步:復(fù)制LIC0的數(shù)據(jù)到軟件的LIC框里面,點(diǎn)擊AddLIC。注意添加序列號(hào)后LicenceManager會(huì)算出這個(gè)號(hào)對(duì)應(yīng)的有效期,如果到期會(huì)顯示為紅色,需要重新點(diǎn)擊破解軟件的Generate,再算一個(gè)填進(jìn)去就行了。第四步:將ST-LINKII-KEILDriver所需的文件(兩個(gè)DLL)拷貝到\Keil\ARM\BIN下,替換原有文件。第五步:打開(kāi)Keil安裝目錄下的文件,在[ARM]、[ARMADS]、[KARM]項(xiàng)目下添加TDRV7=BIN\("STLinkIIDebugger")行,并保存修改。第六步:打開(kāi)MDK,在項(xiàng)目的options設(shè)置的Debug選項(xiàng)中選擇STLINKIIDebugger,同時(shí)在Utilities的選項(xiàng)中選擇STLINKIIDebugger。完成以上步驟,就完成了ST-LINKII的相關(guān)配置,可以作為調(diào)試器開(kāi)始使用。注意:目前ST-LINKII不支持Flash菜單中的Download和Erase命令,程序在使用Start/StopDebugSession時(shí)自動(dòng)載入flash中供調(diào)試。3、IAREWARM安裝與破解第一步:開(kāi)始/運(yùn)行…兀皿。顯示DOS界面,執(zhí)行〉〉得到本機(jī)ID碼,復(fù)制這個(gè)ID碼,再執(zhí)行ID碼〉〉,得到一組注冊(cè)碼。第二步:使用(30天限制版,其他版本無(wú)法使用第一步中的注冊(cè)碼),執(zhí)行安裝程序完成基本安裝,過(guò)程中需要添入第一步里面算出來(lái)的注冊(cè)碼,可以取消時(shí)間限制,但是那一組當(dāng)中只有一個(gè)有效,需要實(shí)驗(yàn)。4、鏈接硬件調(diào)試程序RealViewMDK:找到一個(gè)STM32-SK的基礎(chǔ)程序,最好是只關(guān)于IO的且與當(dāng)前板子程序不同,這樣在板上就可以看到結(jié)果,點(diǎn)擊Project/openproject。例如GPIO、TIMER(另兩個(gè)例程是關(guān)于串口的,需要連接串口才能夠看到運(yùn)行結(jié)果)。使用“OpenProject”打開(kāi),然后設(shè)置Option里面的linker和Utilities里面的項(xiàng)目為“STLinkIIDebuger"。編譯程序,再使用“Start/StopDebugSession"來(lái)寫(xiě)入程序。IAREWARM:與以上相同,找到一個(gè)符合條件的例程。打開(kāi)一個(gè)eww工程文件,右鍵選取Option,在Debuger里面選擇“Third-PartyDriver",在“Third-PartyDriver"里面添上“$PROJ_DIR$\..\ddl\”。使用“Make”或“RebuildAll”來(lái)編譯程序,點(diǎn)“Debug"就燒寫(xiě)進(jìn)Flash。使用調(diào)試欄里面的“go”等等運(yùn)行程序。注:由于目前版本MDK與我手頭的ST-LINK-II編程器不兼容,所以后面的所有工作均改用IAR。STM32學(xué)前班教程之四:打好基礎(chǔ)建立模板1、新建目錄Project_IAR4,按照自己的順序重新組織dll(驅(qū)動(dòng));inc、src函數(shù)庫(kù);settings,其他所有文件全部放這個(gè)新建的目錄下。2、雙擊打開(kāi),繼續(xù)更改內(nèi)部設(shè)置。3、需更改的內(nèi)容列表:位置和項(xiàng)目目標(biāo)說(shuō)明Project\Edirconfignations新建基于STM3210B的配置編譯目標(biāo)和過(guò)程文件存放Project\Option\GeneralOption\TargetSTSTM32F10x選擇芯片類型Project\Option\C/C++Compiler\Preprocessor\Additionalincludedirectories$PROJ_DIR$\$PROJ_DIR$\inc頭文件相對(duì)位置,需要包括“map/lib/type”的位置Project\Option\C/C++Compiler\Preprocessor\Definedsymbols空空白是在Flash里面調(diào)試程序,VECT_TAB_RAM是在RAM里調(diào)試程序Project\Option\C/C++Compiler\Optimizations\Size最終編譯一般選擇High調(diào)試可選NoneNone,Low,Medium,High是不同的代碼優(yōu)化等級(jí)Project\Option\Linker\Output去掉Overrridedefault輸出格式使用默認(rèn)Project\Option\Linker\ExtraOutput打開(kāi)GeneralExtraOutput去掉Overrridedefault廠家要求Project\Option\Linker\Config打開(kāi)Overrridedefault$PROJ_DIR$\使用Flash調(diào)試程序,如果需要使用RAM調(diào)試則改為Project\Option\Debugger\Setup\DriverThird-PartyDriver使用第三方驅(qū)動(dòng)連接單片機(jī)Project\Option\Debugger、DownloadUseflashloader下載到flash所需的設(shè)置Project\Option\Debugger\Third-PartyDriver\Third-PartyDriver\IARdebuggerdriver$PROJ_DIR$\ddl\驅(qū)動(dòng)文件路徑注1:所有跟路徑相關(guān)的設(shè)置需要根據(jù)實(shí)際情況編寫(xiě),相對(duì)路徑的編寫(xiě)一一“$PROJ_DIR$”代表eww文件所在文件夾,“..”代表向上一層。注2:其他設(shè)置使用庫(kù)函數(shù)里面的工程文件的默認(rèn)選項(xiàng)即可,初學(xué)不用了解太多。4、需要重新刪除并重新添加Project下“FWLib”和“User”的所有文件,為了刪減外設(shè)模塊方便需要在“USER”額外添加“”(不添加也可以,需要展開(kāi)找到它)。然后執(zhí)行Project'RebuidAll,通過(guò)則設(shè)置完畢。5、完成以上步驟,第一個(gè)自己習(xí)慣的程序庫(kù)就建立完畢了,以后可以從“”中刪減各種庫(kù)文件,從“”編輯中斷,從“”編寫(xiě)得到自己的程序。最后需要將這個(gè)庫(kù)打包封存,每次解壓縮并修改主目錄名稱即可。6、我的程序庫(kù)特點(diǎn):a)默認(rèn)兼容ST-LINK-II,IAREWARM,F(xiàn)lash調(diào)試,其他有可能需要更改設(shè)置b)為操作方便減少了目錄的層次c)為學(xué)習(xí)方便使用網(wǎng)友漢化版2.0.2固件,主要是庫(kù)函數(shù)中c代碼的注釋。后面隨著學(xué)習(xí)深入將在我的模板里面加入如下內(nèi)容:d)加入必用的flash(讀取優(yōu)化),lib(debug),nvic(中斷位置判斷、開(kāi)中斷模板),rcc(時(shí)鐘管理模板,開(kāi)啟外設(shè)時(shí)鐘模板),gpio(管腳定義模板)的初始化代碼,所有模板代碼用到的時(shí)候只要去掉前面的注釋“pt――開(kāi)發(fā)板和最小系統(tǒng)設(shè)計(jì)需求。c)如何選擇STM32開(kāi)發(fā)板.pdf各種開(kāi)發(fā)板介紹和功能比較。d)MXCHIP的系列視頻教程一一全部芯片基礎(chǔ)及其外設(shè)的教程,使用函數(shù)庫(kù)編程的話就不用看每個(gè)視頻后半段的關(guān)于寄存器的介紹了。e)STM32_Technical_Slide(常見(jiàn)問(wèn)題)——一些優(yōu)化設(shè)計(jì)方案。3、關(guān)于參考書(shū),買(mǎi)了兩本但是基本對(duì)學(xué)習(xí)沒(méi)什么幫助,如果湊齊以上資料,建議慎重買(mǎi)書(shū),不如留著那n個(gè)幾十塊錢(qián),攢到一起買(mǎi)開(kāi)發(fā)板。我自己的學(xué)習(xí)過(guò)程1、一共24個(gè)庫(kù),不可能都學(xué),都學(xué)也沒(méi)用。按照我的工作需求必須學(xué)的有16個(gè),這16個(gè)也不是全學(xué)。主要學(xué)習(xí)來(lái)源是各種例程代碼、“固件函數(shù)庫(kù)用戶手冊(cè)”和“參考手冊(cè)”。具體學(xué)習(xí)方法是通讀不同來(lái)源的程序,在程序中找到相關(guān)的函數(shù)庫(kù)的應(yīng)用,然后再閱讀相關(guān)文檔,有條件的實(shí)驗(yàn)。對(duì)于內(nèi)容的選擇方面,根據(jù)入門(mén)內(nèi)容和未來(lái)應(yīng)用,將所涉及的范圍精簡(jiǎn)到最低,但是對(duì)所選擇的部分的學(xué)習(xí)則力求明確。以下是我按照自己的需求對(duì)程序庫(kù)函數(shù)排列的學(xué)習(xí)順序:a)絕大部分程序都要涉及到的庫(kù)一一flash,lib,nvic,rcc,只學(xué)基礎(chǔ)的跟最簡(jiǎn)單應(yīng)用相關(guān)必用的部分,其他部分后期再返回頭學(xué)。b)各種程序通用但不必用的庫(kù)exti,MDA,systic,只通讀理解其作用。c)DEM0板擁有的外設(shè)庫(kù)gpio,usart,編寫(xiě)代碼實(shí)驗(yàn)。d)未來(lái)需要用到的外設(shè)的庫(kù)tim,timl,adc,i2c,spi,先理解等待有條件后實(shí)驗(yàn)。e)開(kāi)發(fā)可靠性相關(guān)庫(kù)bkp,iwdg,wwdg,pwr,參考其他例程的做法。f)其他,根據(jù)興趣來(lái)學(xué)。STM32學(xué)前班教程之六:這些代碼大家都用得到2、閱讀flash:芯片內(nèi)部存儲(chǔ)器flash操作函數(shù)我的理解一一對(duì)芯片內(nèi)部flash進(jìn)行操作的函數(shù),包括讀取,狀態(tài),擦除,寫(xiě)入等等,可以允許程序去操作flash上的數(shù)據(jù)?;A(chǔ)應(yīng)用1,FLASH時(shí)序延遲幾個(gè)周期,等待總線同步操作。推薦按照單片機(jī)系統(tǒng)運(yùn)行頻率,0—24MHZ時(shí),取Latency=O;24—48MHz時(shí),取Latency=1;48~72MHz時(shí),取Latency=2。所有程序中必須的用法:FLASH_SetLatency(FLASH_Latency_2);位置:RCC初始化子函數(shù)里面,時(shí)鐘起振之后?;A(chǔ)應(yīng)用2,開(kāi)啟FLASH預(yù)讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法:FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);位置:RCC初始化子函數(shù)里面,時(shí)鐘起振之后。3、閱讀lib:調(diào)試所有外設(shè)初始化的函數(shù)。我的理解一一不理解,也不需要理解。只要知道所有外設(shè)在調(diào)試的時(shí)候,EWRAM需要從這個(gè)函數(shù)里面獲得調(diào)試所需信息的地址或者指針之類的信息?;A(chǔ)應(yīng)用1,只有一個(gè)函數(shù)debug。所有程序中必須的。用法:#ifdefDEBUGdebug();#endif位置:main函數(shù)開(kāi)頭,聲明變量之后。4、閱讀nvic:系統(tǒng)中斷管理。我的理解——管理系統(tǒng)內(nèi)部的中斷,負(fù)責(zé)打開(kāi)和關(guān)閉中斷?;A(chǔ)應(yīng)用1,中斷的初始化函數(shù),包括設(shè)置中斷向量表位置,和開(kāi)啟所需的中斷兩部分。所有程序中必須的。用法:voidNVIC_Configuration(void)

NVIC_InitTypeDefNVIC_InitStructure;在串口初始化中NVIC_InitTypeDefNVIC_InitStructure;在串口初始化中USART_Cmd之前加入中斷設(shè)置:USART_ITConfig(USARTl,USART_IT_TXE,ENABLE);RCC、GPIO里面打開(kāi)串口相應(yīng)的基本時(shí)鐘、管腳設(shè)置iii.NVIC里面加入串口中斷打開(kāi)代碼:NVIC_InitTypeDefNVIC_InitStructure;在文件中找到voidUSARTl_IRQHandler函數(shù),在其中添入執(zhí)行代碼。一般最少三個(gè)步驟:先使用if語(yǔ)句判斷是發(fā)生那個(gè)中斷,然后清除中斷標(biāo)志位,最后給字符串賦值,或做其他事情。voidUSART1_IRQHandler(void)文件中定義的變量或函數(shù),在其它.c文件中使用extern+定義代碼再次定義就可以直接調(diào)用了。STM32筆記之九:打斷它來(lái)為我辦事,EXIT(外部I/O中斷)應(yīng)用目的:跟串口輸入類似,不使用中斷進(jìn)行的IO輸入效率也很低,而且可以通過(guò)EXTI插入按鈕事件,本節(jié)聯(lián)系EXTI中斷。初始化函數(shù)定義:voidEXTI_Configuration(void);由于我的需求只跟高電平寬度有關(guān),所以避免了使用PWM輸入模式,這樣可以每個(gè)管腳捕捉一路信號(hào)。如果使用PWM模式,每一路需要占用兩個(gè)寄存器,所以一個(gè)定時(shí)器只能同時(shí)使用兩路PWM輸入。由于捕捉需要觸發(fā)啟動(dòng)定時(shí)器,所以PWM輸出與捕捉不容易在同一個(gè)TIM通道上實(shí)現(xiàn)。如果必須的話只能增加計(jì)數(shù)溢出的相關(guān)代碼。有些程序省略了捕捉通道的初始化代碼,這是不對(duì)的在基本計(jì)時(shí)器初始化代碼里面注意選擇適當(dāng)?shù)挠?jì)數(shù)器長(zhǎng)度,最好讓波形長(zhǎng)度不要長(zhǎng)于一個(gè)計(jì)數(shù)周期,否則需要增加溢出代碼很麻煩。一個(gè)計(jì)數(shù)周期的長(zhǎng)度計(jì)算跟如下幾個(gè)參數(shù)有關(guān):RCC初始化代碼里面的RCC_PCLKxConfig,這是TIM的基礎(chǔ)時(shí)鐘源與系統(tǒng)時(shí)鐘的關(guān)系。TIM初始化的TIM_Period,這是計(jì)數(shù)周期的值TIM初始化的TIM_Prescaler,這是計(jì)數(shù)周期的倍頻計(jì)數(shù)器,相當(dāng)于調(diào)節(jié)計(jì)數(shù)周期,可以使

TIM_Period盡量大,提高計(jì)數(shù)精度。STM32筆記之十二:時(shí)鐘不息工作不止,systic時(shí)鐘應(yīng)用a)目的:使用系統(tǒng)時(shí)鐘來(lái)進(jìn)行兩項(xiàng)實(shí)驗(yàn)——周期執(zhí)行代碼與精確定時(shí)延遲。b)初始化函數(shù)定義:voidSysTick_Configuration(void);c)初始化函數(shù)調(diào)用:SysTick_Configuration();初始化函數(shù)voidSysTick_Configuration(void){定義通用變量SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);定義通用變量u16Tic_Val=0;在文件中相應(yīng)定義:externu16Tic_Val;定義函數(shù)名稱:externu16Tic_Val;定義函數(shù)名稱:void函數(shù):voidTic_Delay(u16Tic_Count)voidSysTickHandler函數(shù)里面添加Tic_Val++;調(diào)Tic_Delay(10);printf("");函數(shù)將停止工作,這個(gè)現(xiàn)象很奇怪Tic_Delay(u16Tic_Count);精確延時(shí)在文件中用代碼:疑問(wèn):如果去掉計(jì)時(shí)行那個(gè)沒(méi)用的STM32筆記之十三:惡搞,兩只看門(mén)狗a)目的:a)了解兩種看門(mén)狗(我叫它:系統(tǒng)運(yùn)行故障探測(cè)器和獨(dú)立系統(tǒng)故障探測(cè)器,新手往往被這個(gè)并不形象的象形名稱搞糊涂)之間的區(qū)別和基本用法。b)相同:都是用來(lái)探測(cè)系統(tǒng)故障,通過(guò)編寫(xiě)代碼定時(shí)發(fā)送故障清零信號(hào)(高手們都管這個(gè)代碼叫做“喂狗”),告訴它系統(tǒng)運(yùn)行正常。一旦系統(tǒng)故障,程序清零代碼(“喂狗”)無(wú)法執(zhí)行,其計(jì)數(shù)器就會(huì)計(jì)數(shù)不止,直到記到零并發(fā)生故障中斷(狗餓了開(kāi)始叫喚),控制CPU重啟整個(gè)系統(tǒng)(不行啦,開(kāi)始咬人了,快跑……)。c)區(qū)別:獨(dú)立看門(mén)狗Iwdg――我的理解是獨(dú)立于系統(tǒng)之外,因?yàn)橛歇?dú)立時(shí)鐘,所以不受系統(tǒng)影響的系統(tǒng)故障探測(cè)器。(這條狗是借來(lái)的,見(jiàn)誰(shuí)偷懶它都咬?。┲饕糜诒O(jiān)視硬件錯(cuò)誤。窗口看門(mén)狗wwdg――我的理解是系統(tǒng)內(nèi)部的故障探測(cè)器,時(shí)鐘與系統(tǒng)相同。如果系統(tǒng)時(shí)鐘不走了,這個(gè)狗也就失去作用了。(這條狗是老板娘養(yǎng)的,老板不干活兒他不管?。┲饕糜诒O(jiān)視軟件錯(cuò)誤。d)初始化函數(shù)定義:鑒于兩只狗作用差不多,使用過(guò)程也差不多初始化函數(shù)栓一起了,用的時(shí)候根據(jù)情況刪減。voidWDG_Configuration(void);e)初始化函數(shù)調(diào)用:WDG_Configuration();f)初始化函數(shù)voidWDG_Configuration()有狗平常沒(méi)事情可以不理,但是千萬(wàn)別忘了喂它,否則死都不知道怎么死的!初始化程序的調(diào)用一定要在systic的初始化之后。獨(dú)立看門(mén)狗需要systic中斷來(lái)喂,但是systic做別的用處不能只做這件事,所以我寫(xiě)了如下幾句代碼,可以不影響systic的其他應(yīng)用,其他systic周期代碼也可參考:第一步:在中定義變量intTic_IWDG;2009-4-222.0.22009-4-262010/06/21浮空輸入帶上拉輸入帶下拉輸入模擬輸入開(kāi)漏輸出——(此模式可實(shí)現(xiàn)hotpower說(shuō)的真雙向IO)推挽輸出復(fù)用功能的推挽輸出復(fù)用功能的開(kāi)漏輸出模式7和模式8需根據(jù)具體的復(fù)用功能決定。二、專門(mén)的寄存器(GPIOx_BSRR和GPIOx_BRR)實(shí)現(xiàn)對(duì)GPIO口的原子操作,即回避了設(shè)置或清除I/O端口時(shí)的“讀-修改-寫(xiě)”操作,使得設(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口在高低電平分別為和時(shí),可以提供或吸收8mA電流;如果把輸入輸出電平分別放寬到和時(shí),可以提供或吸收20mA電流。七、具有獨(dú)立的喚醒I/O口。八、很多I/O口的復(fù)用功能可以重新映射。九、GPIO口的配置具有上鎖功能,當(dāng)配置好GPIO口后,可以通過(guò)程序鎖住配置組合,直到下次芯片復(fù)位才能解鎖。此功能非常有利于在程序跑飛的情況下保護(hù)系統(tǒng)中其他的設(shè)備,不會(huì)因?yàn)槟承﹊/o口的配置被改變而損壞一一如一個(gè)輸入口變成輸出口并輸出電流。STM32第一個(gè)例子2007/12/142008/4/24要得到高電平狀態(tài)需要上拉電阻才行.適合于做電流型的驅(qū)動(dòng),其吸收電流的能力相對(duì)強(qiáng)(一般20ma以內(nèi)).利用外部電路的驅(qū)動(dòng)能力,減少I(mǎi)C內(nèi)部的驅(qū)動(dòng)。當(dāng)IC內(nèi)部MOSFET導(dǎo)通時(shí),驅(qū)動(dòng)電流是從外部的VCC流經(jīng)Rpull-up,MOSFET到GND°IC內(nèi)部?jī)H需很下的柵極驅(qū)動(dòng)電流。如圖1??梢詫⒍鄠€(gè)開(kāi)漏輸出的Pin,連接到一條線上。形成“與邏輯”關(guān)系。如圖1,當(dāng)PIN_A、PIN_B、PIN_C任意一個(gè)變低后,開(kāi)漏線上的邏輯就為0了。這也是I2C,SMBus等總線判斷總線占用狀態(tài)的原理??梢岳酶淖兩侠娫吹碾妷?,改變傳輸電平。如圖2,IC的邏輯電平由電源Vcc1決定,而輸出高電平則由Vcc2決定。這樣我們就可以用低電平邏輯控制輸出高電平邏輯了。開(kāi)漏Pin不連接外部的上拉電阻,則只能輸出低電平(因此對(duì)于經(jīng)典的51單片機(jī)的P0口而言,要想做輸入輸出功能必須加外部上拉電阻,否則無(wú)法輸出高電平邏輯)。標(biāo)準(zhǔn)的開(kāi)漏腳一般只有輸出的能力。添加其它的判斷電路,才能具備雙向輸入、輸出的能力。應(yīng)用中需注意:開(kāi)漏和開(kāi)集的原理類似,在許多應(yīng)用中我們利用開(kāi)集電路代替開(kāi)漏電路。例如,某輸入Pin要求由開(kāi)漏電路驅(qū)動(dòng)。則我們常見(jiàn)的驅(qū)動(dòng)方式是利用一個(gè)三極管組成開(kāi)集電路來(lái)驅(qū)動(dòng)它,即方便又節(jié)省成本。如圖3。上拉電阻Rpull-up的阻值決定了邏輯電平轉(zhuǎn)換的沿的速度。阻值越大,速度越低功耗越小。反之亦然。Push-Pull輸出就是一般所說(shuō)的推挽輸出,在CMOS電路里面應(yīng)該較CMOS輸出更合適,應(yīng)為在CMOS里面的push—pull輸出能力不可能做得雙極那么大。輸出能力看IC內(nèi)部輸出極N管P管的面積。和開(kāi)漏輸出相比,push-pull的高低電平由IC的電源低定,不能簡(jiǎn)單的做邏輯操作等。push-pull是現(xiàn)在CMOS電路里面用得最多的輸出級(jí)設(shè)計(jì)方式。at91rm9200GPIO模擬12C接口時(shí)注意!什么是OC、OD集電極開(kāi)路門(mén)(集電極開(kāi)路OC或源極開(kāi)路OD)open-drain是漏極開(kāi)路輸出的意思,相當(dāng)于集電極開(kāi)路(open-collector)輸出,即ttl中的集電極開(kāi)路(oc)輸出。一般用于線或、線與,也有的用于電流驅(qū)動(dòng)。open-drain是對(duì)mos管而言,open-collector是對(duì)雙極型管而言,在用法上沒(méi)啥區(qū)別。開(kāi)漏形式的電路有以下幾個(gè)特點(diǎn):1?利用外部電路的驅(qū)動(dòng)能力,減少I(mǎi)C內(nèi)部的驅(qū)動(dòng)?;蝌?qū)動(dòng)比芯片電源電壓高的負(fù)載.2.可以將多個(gè)開(kāi)漏輸出的Pin,連接到一條線上。通過(guò)一只上拉電阻,在不增加任何器件的情況下,形成“與邏輯”關(guān)系。這也是I2C,SMBus等總線判斷總線占用狀態(tài)的原理。如果作為圖騰輸出必須接上拉電阻。接容性負(fù)載時(shí),下降延是芯片內(nèi)的晶體管,是有源驅(qū)動(dòng),速度較快;上升延是無(wú)源的外接電阻,速度慢。如果要求速度高電阻選擇要小,功耗會(huì)大。所以負(fù)載電阻的選擇要兼顧功耗和速度。3?可以利用改變上拉電源的電壓,改變傳輸電平。例如加上上拉電阻就可以提供TTL/CMOS電平輸出等。開(kāi)漏Pin不連接外部的上拉電阻,則只能輸出低電平。一般來(lái)說(shuō),開(kāi)漏是用來(lái)連接不同電平的器件,匹配電平用的。5?正常的CMOS輸出級(jí)是上、下兩個(gè)管子,把上面的管子去掉就是OPEN-DRAIN了。這種輸出的主要目的有兩個(gè):電平轉(zhuǎn)換和線與。由于漏級(jí)開(kāi)路,所以后級(jí)電路必須接一上拉電阻,上拉電阻的電源電壓就可以決定輸出電平。這樣你就可以進(jìn)行任意電平的轉(zhuǎn)換了。7?線與功能主要用于有多個(gè)電路對(duì)同一信號(hào)進(jìn)行拉低操作的場(chǎng)合,如果本電路不想拉低,就輸出高電平,因?yàn)镺PEN-DRAIN上面的管子被拿掉,高電平是靠外接的上拉電阻實(shí)現(xiàn)的。(而正常的CMOS輸出級(jí),如果出現(xiàn)一個(gè)輸出為高另外一個(gè)為低時(shí),等于電源短路。)提供了靈活的輸出方式,但是也有其弱點(diǎn),就是帶來(lái)上升沿的延時(shí)。因?yàn)樯仙厥峭ㄟ^(guò)外接上拉無(wú)源電阻對(duì)負(fù)載充電,所以當(dāng)電阻選擇小時(shí)延時(shí)就小,但功耗大;反之延時(shí)大功耗小。所以如果對(duì)延時(shí)有要求,則建議用下降沿輸出。什么是線或邏輯與線與邏輯?在一個(gè)結(jié)點(diǎn)(線)上,連接一個(gè)上拉電阻到電源VCC或VDD和n個(gè)NPN或NMOS晶體管的集電極C或漏極D,這些晶體管的發(fā)射極E或源極S都接到地線上,只要有一個(gè)晶體管飽和,這個(gè)結(jié)點(diǎn)(線)就被拉到地線電平上.因?yàn)檫@些晶體管的基極注入電流(NPN)或柵極加上高電平(NMOS),晶體管就會(huì)飽和,所以這些基極或柵極對(duì)這個(gè)結(jié)點(diǎn)(線)的關(guān)系是或非NOR邏輯.如果這個(gè)結(jié)點(diǎn)后面加一個(gè)反相器,就是或OR邏輯.注:個(gè)人理解:線與,接上拉電阻至電源。(~A)&(~B)=~(A+B),由公式較容易理解線與此概念的由來(lái)如果用下拉電阻和PNP或PMOS管就可以構(gòu)成與非NAND邏輯,或用負(fù)邏輯關(guān)系轉(zhuǎn)換與/或邏輯.注:線或,接下拉電阻至地。(~A)+(~B)=~(AB);這些晶體管常常是一些邏輯電路的集電極開(kāi)路OC或源極開(kāi)路OD輸出端.這種邏輯通常稱為線與/線或邏輯,當(dāng)你看到一些芯片的OC或OD輸出端連在一起,而有一個(gè)上拉電阻時(shí),這就是線或/線與了,但有時(shí)上拉電阻做在芯片的輸入端內(nèi).順便提示如果不是OC或OD芯片的輸出端是不可以連在一起的,總線BUS上的雙向輸出端連在一起是有管理的,同時(shí)只能有一個(gè)作輸出,而其他是高阻態(tài)只能輸入.什么是推挽結(jié)構(gòu)一般是指兩個(gè)三極管分別受兩互補(bǔ)信號(hào)的控制,總是在一個(gè)三極管導(dǎo)通的時(shí)候另一個(gè)截止.要實(shí)現(xiàn)線與需要用OC(opencollector)門(mén)電路?如果輸出級(jí)的有兩個(gè)三極管,始終處于一個(gè)導(dǎo)通、一個(gè)截止的狀態(tài),也就是兩個(gè)三級(jí)管推挽相連,這樣的電路結(jié)構(gòu)稱為推拉式電路或圖騰柱(Totem-pole)輸出電路(可惜,圖無(wú)法貼上)。當(dāng)輸出低電平時(shí),也就是下級(jí)負(fù)載門(mén)輸入低電平時(shí),輸出端的電流將是下級(jí)門(mén)灌入T4;當(dāng)輸出高電平時(shí),也就是下級(jí)負(fù)載門(mén)輸入高電平時(shí),輸出端的電流將是下級(jí)門(mén)從本級(jí)電源經(jīng)T3、D1拉出。這樣一來(lái),輸出高低電平時(shí),T3—路和T4一路將交替工作,從而減低了功耗,提高了每個(gè)管的承受能力。又由于不論走哪一路,管子導(dǎo)通電阻都很小,使RC常數(shù)很小,轉(zhuǎn)變速度很快。因此,推拉式輸出級(jí)既提高電路的負(fù)載能力,又提高開(kāi)關(guān)速度。供你參考。推挽電路是兩個(gè)參數(shù)相同的三極管或MOSFET,以推挽方式存在于電路中,各負(fù)責(zé)正負(fù)半周的波形放大任務(wù),電路工作時(shí),兩只對(duì)稱的功率開(kāi)關(guān)管每次只有一個(gè)導(dǎo)通,所以導(dǎo)通損耗小效率高。輸出既可以向負(fù)載灌電流,也可以從負(fù)載抽取電流本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:2010/06/13STM32時(shí)鐘控制RCC對(duì)于單片機(jī)系統(tǒng)來(lái)說(shuō),CPU和總線以及外設(shè)的時(shí)鐘設(shè)置是非常重要的,因?yàn)闆](méi)有時(shí)鐘就沒(méi)有時(shí)序,組合電路能干什么想必各位心里都清楚。其實(shí)時(shí)鐘的學(xué)習(xí)這部分應(yīng)該提前一些,但由于一開(kāi)始時(shí)間比較短,有些急于求成,所以直接使用了萬(wàn)利給的例程,姑且跳過(guò)了這一步。介于下面我計(jì)劃要學(xué)習(xí)的任務(wù)都涉及到兆級(jí)的高速傳輸,例如全速USB,DMA等等,所以不能再忽略時(shí)鐘啦,必須要仔細(xì)研究一下。我學(xué)習(xí)RCC的參考資料:技術(shù)文檔0427及其中文翻譯版STM32F10xxx_Library_Manual_ChineseV2的第十五章和RM0008_CH參考手冊(cè)。準(zhǔn)備知識(shí):片上總線標(biāo)準(zhǔn)種類繁多,而由ARM公司推出的AMBA片上總線受到了廣大IP開(kāi)發(fā)商和SoC系統(tǒng)集成者的青睞,已成為一種流行的工業(yè)標(biāo)準(zhǔn)片上結(jié)構(gòu)。AMBA規(guī)范主要包括了AHB(AdvancedHighperformanceBus)系統(tǒng)總線和APB(AdvancedPeripheralBus)外圍總線。二者分別適用于高速與相對(duì)低速設(shè)備的連接。由于時(shí)鐘是一個(gè)由內(nèi)而外的東西,具體設(shè)置要從寄存器開(kāi)始。RCC寄存器結(jié)構(gòu),RCC_TypeDeff,在文件“”中定義如下:typedefstruct{vu32CR;vu32CFGR;vu32CIR;vu32APB2RSTR;vu32APB1RSTR;vu32AHBENR;vu32APB2ENR;vu32APB1ENR;vu32BDCR;vu32CSR;}RCC_TypeDef;這些寄存器的具體定義和使用方式參見(jiàn)芯片手冊(cè),在此不贅述,因?yàn)镃語(yǔ)言的開(kāi)發(fā)可以不和他們直接打交道,當(dāng)然如果能夠加以理解和記憶,無(wú)疑是百利而無(wú)一害。相信細(xì)心的朋友早就發(fā)現(xiàn)板子上只有8Mhz的晶振,而增強(qiáng)型最高工作頻率為72Mhz,顯然需要用PLL倍頻9倍,這些設(shè)置都需要在初始化階段完成。為了方便說(shuō)明,我借用一下例程的RCC設(shè)置函數(shù),并用中文注釋的形式加以說(shuō)明:*FunctionNameSet_System*Description:ConfiguresMainsystemclocks&power*Input:None.*Return:None..不過(guò)沒(méi)關(guān)系,反正沒(méi)參數(shù)需要說(shuō)明,重要的是函數(shù)體。staticvoidRCC_Config(void){/*這里是重置了RCC的設(shè)置,類似寄存器復(fù)位*/RCC_DeInit();/*使能外部高速晶振*/RCC_HSEConfig(RCC_HSE_ON);/*等待高速晶振穩(wěn)定*/HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS){/*使能flash預(yù)讀取緩沖區(qū)*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*令Flash處于等待狀態(tài),2是針對(duì)高頻時(shí)鐘的,這兩句跟RCC沒(méi)直接關(guān)系,可以暫且略過(guò)*/FLASH_SetLatency(FLASH_Latency_2);/*HCLK=SYSCLK設(shè)置高速總線時(shí)鐘=系統(tǒng)時(shí)鐘*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK設(shè)置低速總線2時(shí)鐘=高速總線時(shí)鐘*/RCC_PCLK2Config(RCC_HCLK_Div1);/*PCLK1=HCLK/2設(shè)置低速總線1的時(shí)鐘=高速時(shí)鐘的二分頻*/RCC_PCLK1Config(RCC_HCLK_Div2);/*ADCCLK=PCLK2/6設(shè)置ADC外設(shè)時(shí)鐘二低速總線2時(shí)鐘的六分頻*/RCC_ADCCLKConfig(RCC_PCLK2_Div6);/*SetPLLclockoutputto72MHzusingHSE(8MHz)asentryclock*/*Input:None*Output:None*Return:NonevoidRCC_Configuration(void){ErrorStatusHSEStartUpStatus;/*RCCsystemreset(fordebugpurpose)*///RCC_DeInit();/*EnableHSE*/RCC_HSEConfig(RCC_HSE_ON);/*WaittillHSEisready*/HSEStartUpStatusHSEStartUpStatusRCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS){/*HCLK=SYSCLK*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Div1);/*PCLK1=HCLK/2*/RCC_PCLK1Config(RCC_HCLK_Div2);/*ADCCLK=PCLK2/6*/RCC_ADCCLKConfig(RCC_PCLK2_Div6);/*Flash2waitstate*/FLASH_SetLatency(FLASH_Latency_2);/*EnablePrefetchBuffer*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*PLLCLK=8MHz*9=72MHz*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//Pll在最后設(shè)置/*EnablePLL*/RCC_PLLCmd(ENABLE);/*WaittillPLLisready*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}/*SelectPLLassystemclocksource*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*WaittillPLLisusedassystemclocksource*/while(RCC_GetSYSCLKSource()!=0x08){}}/*EnableGPIOA,GPIOB,GPIOC,GPIOD,GPIOEandAFIOclocks*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);/*TIM2clocksenable*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);/*CANPeriphclockenable*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN,ENABLE);}STM32的學(xué)習(xí)心得之TIMx(通用定時(shí)器)基本的配置定時(shí)器的基本設(shè)置1、=0x0;//時(shí)鐘預(yù)分頻數(shù)例如:時(shí)鐘頻率=72/(時(shí)鐘預(yù)分頻+1)2、=TIM1_CounterMode_Up;//定時(shí)器模式向上計(jì)數(shù)3、=0xFFFF;//自動(dòng)重裝載寄存器周期的值(定時(shí)時(shí)間)累計(jì)0xFFFF個(gè)頻率后產(chǎn)生個(gè)更新或者中斷(也是說(shuō)定時(shí)時(shí)間到)4、=0x0;//時(shí)間分割值5、TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化定時(shí)器26、TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//打開(kāi)中斷溢出中斷7、TIM_Cmd(TIM2,ENABLE);//打開(kāi)定時(shí)器此外要記住一定要打開(kāi)定時(shí)器的時(shí)鐘(RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);),定時(shí)器的頻率的可以編程的,有對(duì)應(yīng)的模式設(shè)置和中斷處理。STM32學(xué)習(xí)筆記之串口通訊主要功能是把PC機(jī)發(fā)送的數(shù)據(jù)接收后再返回給PC機(jī)參數(shù)9600,8,1,N。Copyright(c)2008wormchenAllrightsreserved文件名:說(shuō)明:串口發(fā)送接收數(shù)據(jù)將PC端發(fā)來(lái)的數(shù)據(jù)返回給PC主要硬件:EMSTM32Vl+miniSTMV100(外部8MRC)編譯環(huán)境:當(dāng)前版本:#includevoidRCC_Config(void);voidGPIO_Config(void);voidUSART_Config(void);voidPut_String(u8*p);intmain(void){RCC_Config();GPIO_Config();USART_Config();Put_String("\r\n請(qǐng)發(fā)送數(shù)據(jù)_\r\n");while(1){while(1){if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==SET){USART_SendData(USART2,USART_ReceiveData(USART2));}}}}函數(shù):voidRCC_Config(void)功能:配置系統(tǒng)時(shí)鐘參數(shù):無(wú)返回:無(wú)voidRCC_Config(void){ErrorStatusHSEStartUpStatus;//定義外部高速晶體啟動(dòng)狀態(tài)枚舉變量RCC_DeInit();//復(fù)位RCC外部設(shè)備寄存器到默認(rèn)值RCC_HSEConfig(RCC_HSE_ON);//打開(kāi)外部高速晶振HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待外部高速時(shí)鐘準(zhǔn)備好if(HSEStartUpStatus==SUCCESS)//外部高速時(shí)鐘已經(jīng)準(zhǔn)別好RCC_HCLKConfig(RCC_SYSCLK_Divl);//配置AHB(HCLK)時(shí)鐘等于==SYSCLKRCC_PCLK2Config(RCC_HCLK_Divl);//配置APB2(PCLK2)鐘==AHB時(shí)鐘RCC_PCLKlConfig(RCC_HCLK_Div2);//配置APB1(PCLK1)鐘==AHB1/2時(shí)鐘RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//配置PLL時(shí)鐘==外部高速晶體時(shí)鐘*9RCC_PLLCmd(ENABLE);//使能PLL時(shí)鐘while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//等待PLL時(shí)鐘就緒{}RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系統(tǒng)時(shí)鐘=PLL時(shí)鐘while(RCC_GetSYSCLKSource()!=0x08)//檢查PLL時(shí)鐘是否作為系統(tǒng)時(shí)鐘{}}RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE);//打開(kāi)GPIOD和AFIO時(shí)鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能串口2時(shí)鐘}函數(shù):voidGPIO_Config(void)功能:GPIO配置參數(shù):無(wú)返回:無(wú)voidGPIO_Config(void){//設(shè)置RTS,Tx為推拉輸出模式GPIO_InitTypeDefGPIO_InitStructure;//定義GPIO初始化結(jié)構(gòu)體GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);//使能GPIO端口映射USART2=GPIO_Pin_4|GPIO_Pin_5;//選擇PIN4PIN5=GPIO_Speed_50MHz;//引腳頻率50M=GPIO_Mode_AF_PP;//引腳設(shè)置推拉輸出GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化GPIOD//配置CTS,USART2Rx為浮點(diǎn)輸入模式=GPIO_Pin_3|GPIO_Pin_6;=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOD,&GPIO_InitStructure);}函數(shù):voidUSART_Config(void)功能:USART配置參數(shù):無(wú)返回:無(wú)voidUSART_Config(void){USART_InitTypeDefUSART_InitStructure;//定義串口初始化結(jié)構(gòu)體=9600;//波特率9600=USART_WordLength_8b;//8位數(shù)據(jù)=USART_StopBits_1;//1個(gè)停止位=USART_Parity_No;//無(wú)校驗(yàn)位=USART_HardwareFlowControl_None;//禁用RTSCTS硬件流控制=USART_Mode_Rx|USART_Mode_Tx;//使能發(fā)送接收=USART_Clock_Disable;//串口時(shí)鐘禁止=USART_CPOL_Low;//時(shí)鐘下降沿有效=USART_CPHA_2Edge;//數(shù)據(jù)在第二個(gè)時(shí)鐘沿捕捉=USART_LastBit_Disable;//最后數(shù)據(jù)位的時(shí)鐘脈沖不輸出到SCLK引腳USART_Init(USART2,&USART_InitStructure);//初始化串口2USART_Cmd(USART2,ENABLE);//串口2使能}函數(shù):voidPut_String(void)功能:向串口輸出字符串參數(shù):無(wú)返回:無(wú)voidPut_String(u8*p){while(*p){USART_SendData(USART2,*p++);while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET){}}}基于STM32的PWM輸出)初始化函數(shù)定義:voidTIM_Configuration(void);//定義TIM初始化函數(shù)初始化函數(shù)調(diào)用:TIM_Configuration();//TIM初始化函數(shù)調(diào)用初始化函數(shù),不同于前面模塊,TIM的初始化分為兩部分一一基本初始化和通道初始化:voidTIM_Configuration(void)//TIM初始化函數(shù){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;//定時(shí)器初始化結(jié)構(gòu)TIM_OCInitTypeDefTIM_OCInitStructure;//通道輸出初始化結(jié)構(gòu)//TIM3初始化=OxFFFF;//周期0?FFFF=5;//時(shí)鐘分頻=0;//時(shí)鐘分割=TIM_CounterMode_Up;//模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//基本初始化TIM_ITConfig(TIM3,TIM_IT_CC4,ENABLE);//打開(kāi)中斷,中斷需要這行代碼//TIM3通道初始化TIM_OCStructInit(&TIM_OCInitStructure);//默認(rèn)參數(shù)=TIM_OCMode_PWM1;//工作狀態(tài)=TIM_OutputState_Enable;//設(shè)定為輸出,需要PWM輸出才需要這行代碼=0x2000;//占空長(zhǎng)度=TIM_OCPolarity_High;//高電平TIM_OC4Init(TIM3,&TIM_OCInitStructure);//通道初始化TIM_Cmd(TIM3,ENABLE);//啟動(dòng)TIM3}RCC初始化函數(shù)中加入TIM時(shí)鐘開(kāi)啟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM3,ENABLE);GPIO里面將輸入和輸出管腳模式進(jìn)行設(shè)置。信號(hào):AF_PP,50MHz。使用中斷的話在NVIC里添加如下代碼://打開(kāi)TIM2中斷=TIM2_IRQChannel;//通道=3;//占先級(jí)=1;//響應(yīng)級(jí)=ENABLE;//啟動(dòng)NVIC_Init(&NVIC_InitStructure);//初始化中斷代碼:voidTIM2_IRQHandler(void){if(TIM_GetITStatus(TIM2,TIM_IT_CC4)!=RESET)//判斷中斷來(lái)源{TIM_ClearITPendingBit(TIM2,TIM_IT_CC4);//清除中斷標(biāo)志GPIO_WriteBit(GPIOB,GPIO_Pin_11,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_11)));//變換LED色彩IC4value=TIM_GetCapture4(TIM2);//獲取捕捉數(shù)值}}簡(jiǎn)單應(yīng)用://改變占空比TIM_SetCompare4(TIM3,變量);注意事項(xiàng):管腳的IO輸出模式是根據(jù)應(yīng)用來(lái)定,比如如果用PWM輸出驅(qū)動(dòng)LED則應(yīng)該將相應(yīng)管腳設(shè)為AF_PP,否則單片機(jī)沒(méi)有輸出。STM32資料一(轉(zhuǎn)載)注:下面是一些常用的代碼,網(wǎng)上很多但是大多注釋不全。高手看沒(méi)問(wèn)題,對(duì)于我們這些新手就費(fèi)勁了……所以我把這些代碼集中,進(jìn)行了逐句注釋,希望對(duì)新手們有價(jià)值。flash:芯片內(nèi)部存儲(chǔ)器flash操作函數(shù)我的理解一一對(duì)芯片內(nèi)部flash進(jìn)行操作的函數(shù),包括讀取,狀態(tài),擦除,寫(xiě)入等等,可以允許程序去操作flash上的數(shù)據(jù)?;A(chǔ)應(yīng)用1,FLASH時(shí)序延遲幾個(gè)周期,等待總線同步操作。推薦按照單片機(jī)系統(tǒng)運(yùn)行頻率,0—24MHZ時(shí),取Latency=O;24—48MHz時(shí),取Latency=1;48~72MHz時(shí),取Latency=2。所有程序中必須的用法:FLASH_SetLatency(FLASH_Latency_2);位置:RCC初始化子函數(shù)里面,時(shí)鐘起振之后。基礎(chǔ)應(yīng)用2,開(kāi)啟FLASH預(yù)讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法:FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);位置:RCC初始化子函數(shù)里面,時(shí)鐘起振之后。3、lib:調(diào)試所有外設(shè)初始化的函數(shù)。我的理解一一不理解,也不需要理解。只要知道所有外設(shè)在調(diào)試的時(shí)候,EWRAM需要從這個(gè)函數(shù)里面獲得調(diào)試所需信息的地址或者指針之類的信息。基礎(chǔ)應(yīng)用1,只有一個(gè)函數(shù)debug。所有程序中必須的。用法:#ifdefDEBUGdebug();#endif位置:main函數(shù)開(kāi)頭,聲明變量之后。4、nvic:系統(tǒng)中斷管理。我的理解——管理系統(tǒng)內(nèi)部的中斷,負(fù)責(zé)打開(kāi)和關(guān)閉中斷?;A(chǔ)應(yīng)用1,中斷的初始化函數(shù),包括設(shè)置中斷向量表位置,和開(kāi)啟所需的中斷兩部分。所有程序中必須的。用法:voidNVIC_Configuration(void)用法:NVIC_InitTypeDefNVIC_InitStructure;//中斷管理恢復(fù)默認(rèn)參數(shù)#ifdefVECT_TAB_RAM//如果C/C++Compiler\Preprocessor\Definedsymbols中的定義了VECT_TAB_RAM(見(jiàn)程序庫(kù)更改內(nèi)容的表格)NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);//則在RAM調(diào)試#else//如果沒(méi)有定義VECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//則在Flash里調(diào)試#endif//結(jié)束判斷語(yǔ)句//以下為中斷的開(kāi)啟過(guò)程,不是所有程序必須的。//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(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í)行。//=中斷通道名;//開(kāi)中斷,中斷名稱見(jiàn)函數(shù)庫(kù)//=0;//搶占優(yōu)先級(jí)//=0;//響應(yīng)優(yōu)先級(jí)//=ENABLE;//啟動(dòng)此通道的中斷//NVIC_Init(&NVIC_InitStructure);//中斷初始化}5、rcc:單片機(jī)時(shí)鐘管理。我的理解——管理外部、內(nèi)部和外設(shè)的時(shí)鐘,設(shè)置、打開(kāi)和關(guān)閉這些時(shí)鐘。

基礎(chǔ)應(yīng)用1:時(shí)鐘的初始化函數(shù)過(guò)程——用法:voidRCC_Configuration(void)//時(shí)鐘初始化函數(shù){ErrorStatusHSEStartUpStatus;//等待時(shí)鐘的穩(wěn)定RCC_DeInit();//時(shí)鐘管理重置RCC_HSEConfig(RCC_HSE_ON);打開(kāi)外部晶振HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS){FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//flash讀取緩沖,加速FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK2Config(RCC_HCLK_Div2);的一半RCC_PCLK1Config(RCC_HCLK_Div2);的一半//注:AHB主要負(fù)責(zé)外部存儲(chǔ)器時(shí)鐘°PB2負(fù)責(zé)AD,I/O,高級(jí)TIM,2345,普通TIM。////等待外部晶振就緒//flash操作的延時(shí)//AHB使用系統(tǒng)時(shí)鐘//APB2////等待外部晶振就緒//flash操作的延時(shí)//AHB使用系統(tǒng)時(shí)鐘//APB2(高速)為HCLK//APB1(低速)為HCLK串口1。APB1負(fù)責(zé)DA,USB,SPI,I2C,CAN,串口RCC_PLLCmd(ENABLE);//啟動(dòng)PLL

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)RESET){}//while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)RESET){}//等待PLL啟動(dòng)RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//將PLL設(shè)置為系統(tǒng)時(shí)鐘源while(RCC_GetSYSCLKSource()!=0x08){}//等待系統(tǒng)時(shí)鐘源的啟動(dòng)}//RCC_AHBPeriphClockCmd(ABP2設(shè)備1|ABP2設(shè)備2|,ENABLE);//啟動(dòng)AHP設(shè)備//RCC_APB2PeriphClockCmd(ABP2設(shè)備1|ABP2設(shè)備2|,ENABLE);//啟動(dòng)ABP2設(shè)備//RCC_APB1PeriphClockCmd(ABP2設(shè)備1|ABP2設(shè)備2|,ENABLE);//啟動(dòng)ABP1設(shè)備}6、exti:外部設(shè)備中斷函數(shù)我的理解一一外部設(shè)備通過(guò)引腳給出的硬件中斷,也可以產(chǎn)生軟件中斷,19個(gè)上升、下降或都觸發(fā)。EXTIO?EXTI15連接到管腳,EXTI線16連接到PVD(VDD監(jiān)視),EXTI線17連接到RTC(鬧鐘),EXTI線18連接到USB(喚醒)?;A(chǔ)應(yīng)用1,設(shè)定外部中斷初始化函數(shù)。按需求,不是必須代碼。用法:voidEXTI_Configuration(void){EXTI_InitTypeDefEXTI_InitStructure;//外部設(shè)備中斷恢復(fù)默認(rèn)參數(shù)=通道1|通道2;//設(shè)定所需產(chǎn)生外部中斷的通道,一共19個(gè)。=EXTI_Mode_Interrupt;//產(chǎn)生中斷=EXTI_Trigger_Falling;//上升下降沿都觸發(fā)=ENABLE;//啟動(dòng)中斷的接收EXTI_Init(&EXTI_InitStructure);//外部設(shè)備中斷啟動(dòng)}7、7、dma:通過(guò)總線而越過(guò)CPU讀取外設(shè)數(shù)據(jù)我的理解一一通過(guò)DMA應(yīng)用可以加速單片機(jī)外設(shè)、存儲(chǔ)器之間的數(shù)據(jù)傳輸,并在傳輸期間不影響CPU進(jìn)行其他事情。這對(duì)于入門(mén)開(kāi)發(fā)基本功能來(lái)說(shuō)沒(méi)有太大必要,這個(gè)內(nèi)容先行跳過(guò)。8、systic:系統(tǒng)定時(shí)器我的理解——可以輸出和利用系統(tǒng)時(shí)鐘的計(jì)數(shù)、狀態(tài)?;A(chǔ)應(yīng)用1,精確計(jì)時(shí)的延時(shí)子函數(shù)。推薦使用的代碼。用法:staticvu32TimingDelay;//全局變量聲明voidSysTick_Config(void)//systick初始化函數(shù){SysTick_CounterCmd(SysTick_Counter_Disable);//停止系統(tǒng)定時(shí)器SysTick_ITConfig(DISABLE);//停止systick中斷SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//systick使用HCLK作為時(shí)鐘源,頻率值除以8。SysTick_SetReload(9000);//重置時(shí)間1毫秒(以72MHz為基礎(chǔ)計(jì)算)SysTick_ITConfig(ENABLE);//開(kāi)啟systic中斷}voidDelay(u32nTime)//延遲一毫秒的函數(shù){//systic開(kāi)始計(jì)//systic開(kāi)始計(jì)時(shí)

TimingDelaynTime;//計(jì)時(shí)長(zhǎng)度賦值給遞減變量TimingDelaynTime;//計(jì)時(shí)長(zhǎng)度賦值給遞減變量while(TimingDelay!=0);//檢測(cè)是否計(jì)時(shí)完成SysTick_CounterCmd(SysTick_Counter_Disable);//關(guān)閉計(jì)數(shù)器SysTick_CounterCmd(SysTick_Counter_Clear);//清除計(jì)數(shù)值}voidTimingDelay_Decrement(void)//遞減變量函數(shù),函數(shù)名由“”中的中斷響應(yīng)函數(shù)定義好了。{if(TimingDelay!=0x00)//檢測(cè)計(jì)數(shù)變量是否達(dá)到0{TimingDelay--;//計(jì)數(shù)變量遞減}}注:建議熟練后使用,所涉及知識(shí)和設(shè)備太多,新手出錯(cuò)的可能性比較大。新手可用簡(jiǎn)化的延時(shí)函數(shù)代替//簡(jiǎn)單延時(shí)函數(shù)//循環(huán)變量遞減計(jì)//簡(jiǎn)單的長(zhǎng)時(shí)間延時(shí)函數(shù)voidDelay(vu32nCount)//簡(jiǎn)單延時(shí)函數(shù)//循環(huán)變量遞減計(jì)//簡(jiǎn)單的長(zhǎng)時(shí)間延時(shí)函數(shù){for(;nCount!=0;nCount--);數(shù)}當(dāng)延時(shí)較長(zhǎng),又不需要精確計(jì)時(shí)的時(shí)候可以使用嵌套循環(huán)voidDel

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論