版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
./STM32開(kāi)發(fā)入門教程<一>開(kāi)發(fā)環(huán)境建立及其應(yīng)用入門準(zhǔn)備:我們常用的STM32開(kāi)發(fā)編譯環(huán)境為Keil公司的MDK<MicrocontrollerDevelopmentKit>和IAR公司的EWARM.在這里我們提供了比較穩(wěn)定的新版本編譯軟件下載:MDK4.10限于篇幅,在我們的教程里面將先以MDK下的一個(gè)例子來(lái)介紹如何使用MDK進(jìn)行嵌入式應(yīng)用開(kāi)發(fā).MDK安裝與配置:基于MDK下的開(kāi)發(fā)中基本的過(guò)程:<1>創(chuàng)建工程;<2>配置工程;<3>用C/C++或者匯編語(yǔ)言編寫(xiě)源文件;<4>編譯目標(biāo)應(yīng)用程序<5>修改源程序中的錯(cuò)誤<6>測(cè)試鏈接應(yīng)用程序<1>創(chuàng)建一個(gè)工程:在uVision3主界面中選擇"Project"->"NewuVisionProject"菜單項(xiàng),打開(kāi)一個(gè)標(biāo)準(zhǔn)對(duì)話框選擇好你電腦中的保存目錄后,輸入一個(gè)你的工程名字后點(diǎn)確認(rèn).我們的工程中建了一個(gè)名字叫"NewProject"的工程.從設(shè)備庫(kù)中選擇目標(biāo)芯片,我們的MINI-STM32開(kāi)發(fā)板使用的是STM32F103V8T6,因此選中STMicrocontroller下對(duì)應(yīng)的芯片:ARM32-bitCortex-M3Microcontroller,72MHz,64kBFlash,20kBSRAM,PLL,EmbeddedInternalRC8MHzand32kHz,Real-TimeClock,NestedInterruptController,PowerSavingModes,JTAGandSWD,3Synch.16-bitTimerswithInputCapture,OutputCompareandPWM,16-bit6-chAdvancedTimer,216-bitWatchdogTimers,SysTickTimer,2SPI,2I2C,3USART,USB2.0FullSpeedInterface,CAN2.0BActive,212-bit16-chA/DConverter,FastI/OPorts選擇完芯片型號(hào)后會(huì)提示是否在目標(biāo)工程中加入CPU的相關(guān)的啟動(dòng)代碼,如下圖所示.啟動(dòng)代碼是用來(lái)初始化目標(biāo)設(shè)備的配置,完成運(yùn)行的系統(tǒng)初始化工作,因此我們選擇"是",這會(huì)使系統(tǒng)的啟動(dòng)代碼編寫(xiě)工作量大大減少.<2>配置工程:選擇菜單中"Project"->"OptionforTarget"或者選擇快捷菜單中的圖標(biāo):因?yàn)镸INI-STM32開(kāi)發(fā)板上使用的就是8M的晶振且是使用的片內(nèi)的RAM和ROM因此"taget"下我們都可以使用默認(rèn)的配置;在"Output"菜單下我們需要選中"CreatHexFile"來(lái)生成編譯好的工程代碼,此工程可以通過(guò)仿真器或者串口ISP燒錄進(jìn)開(kāi)發(fā)板中.注:ISP燒錄過(guò)程我們將在入門教程二中給大家介紹."Listing""User"菜單中我們保持默認(rèn)即可."C/C++"菜單為我們常用的菜單,這里簡(jiǎn)單的介紹下他們的具體功能:PreProcesserSymbols中的Define,Undefine菜單表示是工程的宏定義中的變量,我們將在今后的教程中詳細(xì)介紹這個(gè)功能.Optimization為優(yōu)化選項(xiàng),Level0為不優(yōu)化,這種模式最適合調(diào)試,因?yàn)椴粫?huì)優(yōu)化掉代碼,基本每個(gè)用到的變量都可以打斷點(diǎn).Level3為優(yōu)化等級(jí)最高,最適合生產(chǎn)過(guò)程中下載到芯片中的代碼.IncludePath為工程中的包含路徑,一般需將.h文件或者庫(kù)文件的地址配置進(jìn)去."Asm"和"Link"將在今后的高級(jí)教程中介紹."Debug"為我們調(diào)試使用的配置選項(xiàng),"UseSimulator"為使用軟件仿真.這里根據(jù)大家手里的仿真器來(lái)選擇配置環(huán)境.如果你使用的是Ulink,那么就選擇"UlinkCotexDebug",如果你選擇的是JLINK,那么就選擇"CotexM3Jlink",如果你使用的是ST公司出的簡(jiǎn)易仿真器ST-Link,那么你就選擇"ST-LinkDebug".注意:右邊當(dāng)中的選項(xiàng)"Runtomain{}"選項(xiàng)如果勾上就表示仿真時(shí)進(jìn)入了就會(huì)進(jìn)入到main函數(shù),如果沒(méi)有選上就會(huì)進(jìn)入初始地址,你需要自己打斷點(diǎn)運(yùn)行到你的主程序main處.當(dāng)插上仿真器后選擇上面右圖中的Setting后會(huì)跳出一個(gè)仿真器的配置菜單.左邊會(huì)自動(dòng)識(shí)別出你的仿真器的信息.如下圖為ULINK2的信息:對(duì)于SWJ選項(xiàng)為三線制調(diào)試,將在后面的高級(jí)教程中介紹.右下方有兩個(gè)選項(xiàng):"VerifyCodeDownload":表示下載后校驗(yàn)數(shù)據(jù)"Downloadtoflash":表示當(dāng)仿真的時(shí)候先將目標(biāo)代碼下載到Flash中.Trace菜單為跟蹤配置,可以實(shí)時(shí)的將一些變量使用曲線的形式實(shí)時(shí)表示出來(lái),我們將在今后的高級(jí)教程中介紹這一項(xiàng)功能.注意:市面上目前的盜版Ulink2不支持這項(xiàng)功能,正版的支持,Jlink也不支持這項(xiàng)功能."FlashDownload"菜單用來(lái)配置使用仿真器程序下載的配置選項(xiàng),大家務(wù)必選擇好和你芯片配套的選項(xiàng).如果你是使用的別人模板下修改為你的工程,這個(gè)選項(xiàng)請(qǐng)注意一下,如果不正確將不能將你的代碼下載到芯片中.配置好"Debug"后,那么"Utilities"可以不用配置.如果你使用的是仿真器仿真,在你已經(jīng)正確得將目標(biāo)板和仿真器建立了物理連接后,請(qǐng)選擇正確的仿真器進(jìn)行配置.<二>ISP在線下載程序ISP:insystemprogramming簡(jiǎn)介:ISP:用寫(xiě)入器將code燒入,不過(guò),芯片可以在目標(biāo)板上,不用取出來(lái),在設(shè)計(jì)目標(biāo)板的時(shí)候就將接口設(shè)計(jì)在上面,所以叫"在系統(tǒng)編程",即不用脫離系統(tǒng);應(yīng)用場(chǎng)合:1,ISP程序升級(jí)需要到現(xiàn)場(chǎng)解決,不過(guò)好一點(diǎn)的是不必拆機(jī)器了;ISP的實(shí)現(xiàn)一般需要很少的外部電路輔助實(shí)現(xiàn),通??衫脝纹瑱C(jī)的串行口接到計(jì)算機(jī)的RS232口,通過(guò)專門設(shè)計(jì)的固件程序來(lái)編程內(nèi)部存儲(chǔ)器。主要是指代芯片的燒寫(xiě)方式,以往寫(xiě)片子需要把片子拿下來(lái),離開(kāi)電路,用編程器燒,換句話說(shuō),芯片不能不脫離應(yīng)用系統(tǒng)進(jìn)行寫(xiě)入。ISP主要針對(duì)這個(gè)問(wèn)題,使用JTAG或者串行口〔MCU內(nèi)部有BootLoader,通過(guò)指定的方式激活之,它可以和PC或其它上位機(jī)通過(guò)串口聯(lián)系,不用使單片機(jī)離開(kāi)應(yīng)用系統(tǒng)而更新內(nèi)部的程序/設(shè)置進(jìn)行程序的燒寫(xiě)操作。因此,具有ISP功能的MCU可以不使用編程器進(jìn)行編程。當(dāng)然,實(shí)現(xiàn)ISP可能需要一些硬件電路支持,具體的在數(shù)據(jù)手冊(cè)中有說(shuō)明。一般具備ISP功能后,就不要編程器了,而是使用下載線進(jìn)行編程工作。但是不是說(shuō)他們就一定不支持編程器了,具體型號(hào)具體分析。是否需要仿真器進(jìn)行仿真和是否具備ISP和IAP沒(méi)有必然的聯(lián)系。只不過(guò)具備了IAP功能,可以在MCU內(nèi)寫(xiě)入監(jiān)控程序,模擬一個(gè)仿真器,當(dāng)然,這個(gè)監(jiān)控程序是要消耗資源的,和使用硬件的仿真器還有一定的差異。以上就是ISP的一些概念上的描述,現(xiàn)在通俗點(diǎn)說(shuō)就是怎么利用工具把程序下載到芯片當(dāng)中去.第一步:配置工程,輸出編譯后的代碼.Hex文件:我們打開(kāi)第一個(gè)我們的教程例子,GPIO_Test這個(gè)例子工程.先按照下面的步驟來(lái)配置一下工程:點(diǎn)擊下圖中的Option選項(xiàng);選中"Output"菜單下的"CreateHEXFile",并且在右邊的"NameofExecutable"中填寫(xiě)我們生成編譯代碼的文件名稱.配置完選項(xiàng)后,點(diǎn)擊工程編譯按鈕,然后我們就可以在\Example2-GPIO\GPIO_test\output目錄下面得到Gpio_Test.Hex文件了.第二步:準(zhǔn)備串口物理連接和設(shè)置Boot跳線選擇芯片啟動(dòng)類型先需要準(zhǔn)備一根串口延長(zhǎng)線,一頭為公頭,一頭為母頭的串口連接線<非交叉線>,和一臺(tái)有串口的電腦.<注意:如果您的電腦沒(méi)有串口,請(qǐng)購(gòu)買"USB轉(zhuǎn)RS232"的硬件設(shè)備來(lái)擴(kuò)充你電腦的串口.>將Mini-STM32的J1跳線帽跳至2,3兩腳上選擇芯片從內(nèi)部的Boot區(qū)啟動(dòng),上電后會(huì)先進(jìn)入ISP狀態(tài).連接串口線至你的電腦上的串口將USB延長(zhǎng)線連接至你的電腦上給Mini-STM32開(kāi)發(fā)板供上5V電源.當(dāng)開(kāi)發(fā)板上的電源指示燈點(diǎn)亮后一切準(zhǔn)備就緒.第三步:配置ISP下載軟件mcuisp.exe:您可以點(diǎn)擊下載穩(wěn)定版的mcuispV0.975版本的軟件:mcuisp.rar<576.58KB>打開(kāi)mcuisp.exe綠色軟件,選擇好您連接至開(kāi)發(fā)板使用的電腦上的串口,可以通過(guò)搜索串口菜單來(lái)自動(dòng)搜索出你電腦上的串口信息.在左上方的"程序文件"選擇你準(zhǔn)備燒入芯片中的代碼,就是前面我們生成的Gpio_Test.Hex.然后在菜單選項(xiàng)欄上選擇"STMISP"菜單,點(diǎn)擊"讀STM32器件信息"命令按鈕.我們會(huì)在右邊的信息框中顯示出連接成功的信息:如圖所示:選擇上"校驗(yàn)"和"編程后運(yùn)行"兩個(gè)選項(xiàng)后點(diǎn)擊"開(kāi)始編程".會(huì)報(bào)出程序成功燒入芯片的一些信息,如下:DTR電平置高<+3-+12V>,復(fù)位RTS置高<+3-+12V>,選擇進(jìn)入BootLoader...延時(shí)100毫秒DTR電平變低<-3--12V>釋放復(fù)位RTS維持高開(kāi)始連接...3,接收到:1F在串口COM4連接成功@115200bps,耗時(shí)343毫秒芯片內(nèi)BootLoader版本號(hào):2.1芯片PID:00000410芯片F(xiàn)LASH容量為128KB芯片SRAM容量為65535KB<此信息僅供參考,新版本芯片已不包含此信息>96位的芯片唯一序列號(hào):33006C065839353235581943讀出的選項(xiàng)字節(jié):A55AFF00FF00FF00FF00FF00FF00FF00全片擦除成功第547毫秒,已準(zhǔn)備好共寫(xiě)入2KB,進(jìn)度100%,耗時(shí)4343毫秒成功從08000000開(kāi)始運(yùn)行向您報(bào)告,命令執(zhí)行完畢,一切正常這個(gè)時(shí)候您可以看到您手中的Mini-STM32開(kāi)發(fā)板上的兩個(gè)紅色LED有規(guī)律的輪流點(diǎn)亮,說(shuō)明程序已經(jīng)成功的燒入芯片了.最后您在斷電后將Mini-STM32上J1的跳線帽跳至1,2引腳上,重新上電后,程序就可以正常運(yùn)行了.<三>系統(tǒng)時(shí)鐘SysTick<一>背景介紹在傳統(tǒng)的嵌入式系統(tǒng)軟件按中通常實(shí)現(xiàn)Delay<N>函數(shù)的方法為:for<i=0;i<=x;i++>;x對(duì)應(yīng)于對(duì)應(yīng)于N毫秒的循環(huán)值對(duì)于STM32系列微處理器來(lái)說(shuō),執(zhí)行一條指令只有幾十個(gè)ns,進(jìn)行for循環(huán)時(shí),要實(shí)現(xiàn)N毫秒的x值非常大,而且由于系統(tǒng)頻率的寬廣,很難計(jì)算出延時(shí)N毫秒的精確值。針對(duì)STM32微處理器,需要重新設(shè)計(jì)一個(gè)新的方法去實(shí)現(xiàn)該功能,以實(shí)現(xiàn)在程序中使用Delay<N>。<二>STM32SysTick介紹Cortex-M3的內(nèi)核中包含一個(gè)SysTick時(shí)鐘。SysTick為一個(gè)24位遞減計(jì)數(shù)器,SysTick設(shè)定初值并使能后,每經(jīng)過(guò)1個(gè)系統(tǒng)時(shí)鐘周期,計(jì)數(shù)值就減1。計(jì)數(shù)到0時(shí),SysTick計(jì)數(shù)器自動(dòng)重裝初值并繼續(xù)計(jì)數(shù),同時(shí)內(nèi)部的COUNTFLAG標(biāo)志會(huì)置位,觸發(fā)中斷<如果中斷使能情況下>。在STM32的應(yīng)用中,使用Cortex-M3內(nèi)核的SysTick作為定時(shí)時(shí)鐘,設(shè)定每一毫秒產(chǎn)生一次中斷,在中斷處理函數(shù)里對(duì)N減一,在Delay<N>函數(shù)中循環(huán)檢測(cè)N是否為0,不為0則進(jìn)行循環(huán)等待;若為0則關(guān)閉SysTick時(shí)鐘,退出函數(shù)。注:全局變量TimingDelay,必須定義為volatile類型,延遲時(shí)間將不隨系統(tǒng)時(shí)鐘頻率改變。<三>STSysTick庫(kù)文件使用ST的函數(shù)庫(kù)使用systick的方法1、調(diào)用SysTick_CounterCmd<>--失能SysTick計(jì)數(shù)器2、調(diào)用SysTick_ITConfig<>--失能SysTick中斷3、調(diào)用SysTick_CLKSourceConfig<>--設(shè)置SysTick時(shí)鐘源。4、調(diào)用SysTick_SetReload<>--設(shè)置SysTick重裝載值。5、調(diào)用SysTick_ITConfig<>--使能SysTick中斷6、調(diào)用SysTick_CounterCmd<>--開(kāi)啟SysTick計(jì)數(shù)器<四>SystemTick工程實(shí)戰(zhàn)外部晶振為8MHz,9倍頻,系統(tǒng)時(shí)鐘為72MHz,SysTick的最高頻率為9MHz〔最大為HCLK/8,在這個(gè)條件下,把SysTick效驗(yàn)值設(shè)置成9000,將SysTick時(shí)鐘設(shè)置為9MHz,就能夠產(chǎn)生1ms的時(shí)間基值,即SysTick產(chǎn)生1ms的中斷。/*Configurethesystemclocks*/RCC_Configuration<>;SysTick_Configuration<>;第一步:配置RCC寄存器和SysTick寄存器RCC_Configuration:配置RCC寄存器voidRCC_Configuration<void>{/*RCCsystemreset<fordebugpurpose>*/RCC_DeInit<>;/*EnableHSE*/RCC_HSEConfig<RCC_HSE_ON>;/*WaittillHSEisready*/HSEStartUpStatus=RCC_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>;/*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>;/*EnablePLL*/RCC_PLLCmd<ENABLE>;/*WaittillPLLisready*/while<RCC_GetFlagStatus<RCC_FLAG_PLLRDY>==RESET>{}/*SelectPLLassystemclocksource*/RCC_SYSCLKConfig<RCC_SYSCLKSource_PLLCLK>;/*WaittillPLLisusedassystemclocksource*/while<RCC_GetSYSCLKSource<>!=0x08>{}}/*EnableGPIOAandAFIOclocks*/RCC_APB2PeriphClockCmd<RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE>;}SysTick_Configuration:配置SysTickvoidSysTick_Configuration<void>{/*SelectAHBclock<HCLK>asSysTickclocksource*/SysTick_CLKSourceConfig<SysTick_CLKSource_HCLK>;/*SetSysTickPriorityto3*/NVIC_SystemHandlerPriorityConfig<SystemHandler_SysTick,3,0>;/*SysTickinterrupteach1mswithHCLKequalto72MHz*/SysTick_SetReload<72000>;/*EnabletheSysTickInterrupt*/SysTick_ITConfig<ENABLE>;}第二步:配置SysTick中斷函數(shù)這里我們定義了一個(gè)TestSig全局變量,用于我們使用Keil軟件自帶的邏輯分析儀來(lái)分析.volatilevu32TimingDelay=0;vu8TestSig=0;voidSysTickHandler<void>{TimingDelay--;if<TimingDelay%2>{TestSig=1;}else{TestSig=0;}}第三步:編寫(xiě)Delay延時(shí)函數(shù)Delay:系統(tǒng)延時(shí)函數(shù),使用系統(tǒng)時(shí)鐘操作.voidDelay<u32nTime>{/*EnabletheSysTickCounter*/SysTick_CounterCmd<SysTick_Counter_Enable>;TimingDelay=nTime;while<TimingDelay!=0>;/*DisabletheSysTickCounter*/SysTick_CounterCmd<SysTick_Counter_Disable>;/*CleartheSysTickCounter*/SysTick_CounterCmd<SysTick_Counter_Clear>;}第四步:主函數(shù)中調(diào)用Delay在Mini-STM32開(kāi)發(fā)板上有兩個(gè)LED燈,分別是PA0,PA1.我們做個(gè)流水燈程序,讓他們循環(huán)點(diǎn)亮.while<1>{GPIO_SetBits<GPIOA,GPIO_Pin_0>;Delay<100>;GPIO_ResetBits<GPIOA,GPIO_Pin_0>;Delay<100>;GPIO_SetBits<GPIOA,GPIO_Pin_1>;Delay<100>;GPIO_ResetBits<GPIOA,GPIO_Pin_1>;Delay<100>;}<五>仿真調(diào)試把工程便宜通過(guò)后,進(jìn)入軟件仿真如下圖所示:點(diǎn)擊工程快捷菜單的邏輯分析儀在邏輯分析儀中我們點(diǎn)擊Setup按鍵會(huì)彈出安裝對(duì)話框.點(diǎn)右上方的"新建"圖標(biāo),在菜單中輸入"TestSig"這個(gè)全局變量.添加完之后就可以點(diǎn)Close了.如果您仿真完可以點(diǎn)擊左下方的"KillAll"刪除所有監(jiān)視變量.全速運(yùn)行后就可以看到下面的波形了哦如果你使用仿真器在Mini-STM32上調(diào)試的話你還可以看到兩個(gè)LED在跑跑馬燈程序了.到此我們這章節(jié)的教程就結(jié)束了,相信大家也掌握了SystemTick的用法了.<四>GPIO簡(jiǎn)單應(yīng)用和外部中斷這個(gè)章節(jié)我們將學(xué)習(xí)最基本的STM32的GPIO的應(yīng)用.我們將分為兩個(gè)章節(jié)來(lái)學(xué)習(xí).第一部份:GPIO的基本應(yīng)用和IO口的配置第二部份:外部中斷的使用1:設(shè)計(jì)要求:開(kāi)發(fā)板上有2個(gè)LED,我們的目的為有規(guī)律的點(diǎn)亮LED1和LED2.當(dāng)按鍵按下去的時(shí)候所有的燈滅,等待2秒鐘后恢復(fù)有規(guī)律的點(diǎn)亮.2:硬件電路:3:軟件程序設(shè)計(jì):<1>根據(jù)要求配置GPIOA中的PA0,PA1為輸出,PA3,PA8為輸入對(duì)于下面程序中的GPIO_InitStructure.GPIO_Speed和GPIO_InitStructure.GPIO_Mode推薦大家看下面兩篇文章.STM32GPIO的十大優(yōu)越功能綜述備注:當(dāng)STM32的GPIO端口設(shè)置為輸出模式時(shí),有三種速度可以選擇:2MHz、10MHz和50MHz,這個(gè)速度是指I/O口驅(qū)動(dòng)電路的速度,是用來(lái)選擇不同的輸出驅(qū)動(dòng)模塊,達(dá)到最佳的噪聲控制和降低功耗的目的。STM32GPIO端口的輸出速度設(shè)置備注:共有8種模式,可以通過(guò)編程選擇:1.浮空輸入2.帶上拉輸入3.帶下拉輸入4.模擬輸入5.開(kāi)漏輸出——<此模式可實(shí)現(xiàn)hotpower說(shuō)的真雙向IO>6.推挽輸出7.復(fù)用功能的推挽輸出8.復(fù)用功能的開(kāi)漏輸出模式7和模式8需根據(jù)具體的復(fù)用功能決定。voidGPIO_Configuration<void>{GPIO_InitTypeDefGPIO_InitStructure;/*ConfigurePA.asOutputpush-pull*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init<GPIOA,GPIO_InitStructure>;/*ConfigurePA3,PA8asinputfloating<EXTILine3,EXTILine8>*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init<GPIOA,GPIO_InitStructure>;}<2>打開(kāi)GPIOA的時(shí)鐘,因?yàn)镾TM32是一個(gè)低功耗的MCU,每一個(gè)你使用的外圍設(shè)備都需要單獨(dú)開(kāi)啟時(shí)鐘,如果不開(kāi)啟將不能使用,這個(gè)也是對(duì)于STM32初學(xué)者容易疏忽的地方/*EnableGPIOAandAFIOclocks*/RCC_APB2PeriphClockCmd<RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE>;STM32共有5種時(shí)鐘源,其中三種不同的時(shí)鐘源可用作為驅(qū)動(dòng)系統(tǒng)時(shí)鐘〔SYSCLK;1、HSI由內(nèi)部8MHzRC振蕩器產(chǎn)生,它是可以直接用來(lái)作為系統(tǒng)時(shí)鐘或經(jīng)2分頻后作為PLLSRC輸入。HIS時(shí)鐘頻率在出廠時(shí)被校準(zhǔn)在1%〔25°C,在系統(tǒng)復(fù)位時(shí),工廠校準(zhǔn)值會(huì)被裝載到時(shí)鐘控制寄存器的HISCAL[7..0]位。用戶可以通過(guò)更改HISCAL[4..0]來(lái)調(diào)整HSI頻率。另外時(shí)鐘寄存器中有一個(gè)HSIRDY位用來(lái)指示HSIRC是不穩(wěn)定工作,在時(shí)鐘啟過(guò)后,直到這個(gè)標(biāo)志位置被硬件置1后,HSIRC時(shí)鐘才被輸出。HSIRC時(shí)鐘還可以用時(shí)鐘寄存器中的HSION位來(lái)啟動(dòng)和關(guān)閉。HSI時(shí)鐘同時(shí)也是HSE晶體蕩振器的備用時(shí)鐘源。使用HSE時(shí)鐘,程序設(shè)置時(shí)鐘參數(shù)流程:1、將RCC寄存器重新設(shè)置為默認(rèn)值RCC_DeInit;2、打開(kāi)外部高速時(shí)鐘晶振HSERCC_HSEConfig<RCC_HSE_ON>;3、等待外部高速時(shí)鐘晶振工作HSEStartUpStatus=RCC_WaitForHSEStartUp<>;4、設(shè)置AHB時(shí)鐘RCC_HCLKConfig;5、設(shè)置高速AHB時(shí)鐘RCC_PCLK2Config;6、設(shè)置低速速AHB時(shí)鐘RCC_PCLK1Config;7、設(shè)置PLLRCC_PLLConfig;8、打開(kāi)PLLRCC_PLLCmd<ENABLE>;9、等待PLL工作while<RCC_GetFlagStatus<RCC_FLAG_PLLRDY>==RESET>10、設(shè)置系統(tǒng)時(shí)鐘RCC_SYSCLKConfig;11、判斷是否PLL是系統(tǒng)時(shí)鐘while<RCC_GetSYSCLKSource<>!=0x08>12、打開(kāi)要使用的外設(shè)時(shí)鐘RCC_APB2PeriphClockCmd<>/RCC_APB1PeriphClockCmd<>具體設(shè)置請(qǐng)參考下面的文章STM32時(shí)鐘系統(tǒng)與軟件配置STM32的時(shí)鐘系統(tǒng)分析STM32的時(shí)鐘與RTC<3>設(shè)置外部中斷,所有的GPIO口都可以作為外部中斷源.具體可以參考下面這篇文章.STM32中外部中斷與外部事件/*ConnectEXTILine3toPA.3*/GPIO_EXTILineConfig<GPIO_PortSourceGPIOA,GPIO_PinSource3>;/*ConfigureEXTILine3togenerateaninterruptonfallingedge*/EXTI_InitStructure.EXTI_Line=EXTI_Line3;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init<EXTI_InitStructure>;同樣不要忘記打開(kāi)時(shí)鐘,我們?cè)诖蜷_(kāi)PA口的時(shí)候已經(jīng)加上了RCC_APB2Periph_AFIO,這里再提醒大家一下./*EnableGPIOAandAFIOclocks*/RCC_APB2PeriphClockCmd<RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE>;最后就是編寫(xiě)外部中斷入口函數(shù).voidEXTI3_IRQHandler<void>{inti;if<EXTI_GetITStatus<EXTI_Line9>!=RESET>{GPIO_SetBits<GPIOA,GPIO_Pin_0>;GPIO_SetBits<GPIOA,GPIO_Pin_1>;for<i=0;i<=8000000;i++>;GPIO_ResetBits<GPIOA,GPIO_Pin_0>;GPIO_ResetBits<GPIOA,GPIO_Pin_1>;for<i=0;i<=1000000;i++>/*CleartheEXTIline3pendingbit*/EXTI_ClearITPendingBit<EXTI_Line3>;}}不要忘記在中斷函數(shù)處理完成后清掉標(biāo)志位,不然會(huì)不停的進(jìn)入中斷.<4>編譯與調(diào)試我們已經(jīng)完成所有程序編寫(xiě)部份,接下來(lái)就是將工程編譯成功后下載到我們的Mini-STM32開(kāi)發(fā)板中進(jìn)行調(diào)試和仿真.如果看到LED有規(guī)律的點(diǎn)亮和熄滅,按下按鈕后LED先是一起熄滅,在一起點(diǎn)亮,然后恢復(fù)有規(guī)律的點(diǎn)亮這個(gè)過(guò)程,說(shuō)明我們已經(jīng)達(dá)到我們的設(shè)計(jì)目標(biāo).總結(jié):我們學(xué)習(xí)完了這篇教程之后,相信大家對(duì)下面幾個(gè)方面的內(nèi)容已經(jīng)掌握了.*GPIO的設(shè)置*STM32GPIO的優(yōu)勢(shì)*STM32的時(shí)鐘結(jié)構(gòu)*外部中斷的配置*外部中斷和外部事件的區(qū)別<五>異步串口雙工通訊<一>STM32的USART模擬介紹通用同步異步收發(fā)器〔USART提供了一種靈活的方法來(lái)與使用工業(yè)標(biāo)準(zhǔn)NR異步串行數(shù)據(jù)格式的外部設(shè)備之間進(jìn)行全雙工數(shù)據(jù)交換。USART利用分?jǐn)?shù)波特率發(fā)生器提供寬范圍的波特率選擇。它支持同步單向通信和半雙工單線通信。它也支持LIN<局部互連網(wǎng)>,智能卡協(xié)議和IrDA<紅外數(shù)據(jù)組織>SIRENDEC規(guī)范,以及調(diào)制解調(diào)器<CTS/RTS>操作。它還允許多處理器通信。用于多緩沖器配置的DMA方式,可以實(shí)現(xiàn)高速數(shù)據(jù)通信。主要特性:全雙工的,異步通信NR標(biāo)準(zhǔn)格式分?jǐn)?shù)波特率發(fā)生器系統(tǒng)-發(fā)送和接收共用的可編程波特率,最高到4.5Mbits/s可編程數(shù)據(jù)字長(zhǎng)度〔8位或9位可配置的停止位-支持1或2個(gè)停止位LIN主發(fā)送同步斷開(kāi)符的能力以及LIN從檢測(cè)斷開(kāi)符的能力-當(dāng)USART硬件配置成LIN時(shí),生成13位斷開(kāi)符;檢測(cè)10/11位斷開(kāi)符發(fā)送方為同步傳輸提供時(shí)鐘IRDASIR編碼器解碼器-在正常模式下支持3/16位的持續(xù)時(shí)間智能卡模擬功能-智能卡接口支持ISO7816-3標(biāo)準(zhǔn)里定義的異步協(xié)議智能卡-智能卡用到的0.5和1.5個(gè)停止位單線半雙工通信使用DMA的可配置的多緩沖器通信-在保留的SRAM里利用集中式DMA緩沖接收/發(fā)送字節(jié)單獨(dú)的發(fā)送器和接收器使能位檢測(cè)標(biāo)志-接收緩沖器滿-發(fā)送緩沖器空-傳輸結(jié)束標(biāo)志校驗(yàn)控制-發(fā)送校驗(yàn)位-對(duì)接收數(shù)據(jù)進(jìn)行校驗(yàn)四個(gè)錯(cuò)誤檢測(cè)標(biāo)志-溢出錯(cuò)誤-噪音錯(cuò)誤-幀錯(cuò)誤-校驗(yàn)錯(cuò)誤10個(gè)帶標(biāo)志的中斷源-CTS改變-LIN斷開(kāi)符檢測(cè)-發(fā)送數(shù)據(jù)寄存器-發(fā)送完成-接收數(shù)據(jù)寄存器-檢測(cè)到總線為空-溢出錯(cuò)誤-幀錯(cuò)誤-噪音錯(cuò)誤-校驗(yàn)錯(cuò)誤多處理器通信--如果地址不匹配,則進(jìn)入靜默模式從靜默模式中喚醒〔通過(guò)空閑總線檢測(cè)或地址標(biāo)志檢測(cè)兩種喚醒接收器的方式-地址位〔MSB-空閑總線<二>程序編寫(xiě)<1>在RCC_Configuration函數(shù)中,打開(kāi)串口時(shí)鐘/*EnableUSART1,GPIOA,GPIOxandAFIOclocks*/RCC_APB2PeriphClockCmd<RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOx|RCC_APB2Periph_AFIO,ENABLE>;<2>設(shè)置串口的RTX,TDXIO口的屬性voidGPIO_Configuration<void>{GPIO_InitTypeDefGPIO_InitStructure;/*ConfigureUSART1Rx<PA.10>asinputfloating*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init<GPIOA,GPIO_InitStructure>;/*ConfigureUSART1Tx<PA.09>asalternatefunctionpush-pull*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init<GPIOA,GPIO_InitStructure>;}<3>移植fputc函數(shù)intfputc<intch,FILE*f>{/*Placeyourimplementationoffputchere*//*e.g.writeacharactertotheUSART*/USART_SendData<USART1,<u8>ch>;/*Loopuntiltheendoftransmission*/while<USART_GetFlagStatus<USART1,USART_FLAG_TC>==RESET>{}returnch;}<4>主函數(shù)中初始化串口設(shè)置USART_ClockInitStructure.USART_Clock=USART_Clock_Disable;USART_ClockInitStructure.USART_CPOL=USART_CPOL_Low;USART_ClockInitStructure.USART_CPHA=USART_CPHA_2Edge;USART_ClockInitStructure.USART_LastBit=USART_LastBit_Disable;/*ConfiguretheUSART1synchronousparamters*/USART_ClockInit<USART1,USART_ClockInitStructure>;USART_InitStructure.USART_BaudRate=115200;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;/*ConfigureUSART1basicandasynchronousparamters*/USART_Init<USART1,USART_InitStructure>;/*EnableUSART1*/USART_Cmd<USART1,ENABLE>;<5>編寫(xiě)應(yīng)用程序printf<"\r\n歡迎來(lái)到麥思網(wǎng)論壇\r\n">;printf<"\r\n\r\n">;printf<"\r\nPleaseInputCharacterFromKeyboard\r\n">;while<1>{if<USART_GetFlagStatus<USART1,USART_IT_RXNE>==SET>{i=USART_ReceiveData<USART1>;printf<"%c",i0xFF>;/*printtheinputchar*/}}<三>調(diào)試仿真程序<1>使用KeiluVision3通過(guò)ULINK2仿真器連接實(shí)驗(yàn)板,打開(kāi)實(shí)驗(yàn)例程目錄USART_TEST子目錄下的USART.Uv2例程,編譯鏈接工程;<2>使用MINI-STM32開(kāi)發(fā)板附帶的串口線,連接開(kāi)發(fā)板上的COM和PC機(jī)的串口;<3>在PC機(jī)上運(yùn)行windows自帶的超級(jí)終端串口通信程序〔波特率115200、1位停止位、無(wú)校驗(yàn)位、無(wú)硬件流控制;或者使用其它串口通信程序;<4>選擇硬件調(diào)試模式,點(diǎn)擊MDK的Debug菜單,選擇Start/StopDebugSession項(xiàng)或Ctrl+F5鍵,遠(yuǎn)程連接目標(biāo)板并下載調(diào)試代碼到目標(biāo)系統(tǒng)中;<5>例程正常運(yùn)行之后會(huì)在超級(jí)終端顯示以下信息:"歡迎來(lái)到麥思網(wǎng)論壇""""PleaseInputCharacterFromKeyboard"在PC機(jī)的鍵盤上輸入的字符,將在超級(jí)終端上顯示。<6>也可選擇軟件調(diào)試模式,點(diǎn)擊MDK的Debug菜單,打開(kāi)串行窗口,選擇Start/StopDebugSession項(xiàng)或Ctrl+F5鍵,在串行窗口中也可看到與第〔5步超級(jí)終端中所顯示的相同內(nèi)容。使用軟件調(diào)試可以參考貼子:[原創(chuàng)]MDK下使用SerialWindows調(diào)試串口教程<六>基于DMA的ADC<一>STM32ADC模塊介紹<二>程序編寫(xiě)<1>設(shè)置ADC的地址#defineADC1_DR_Address<<u32>0x4001244C><2>初始化DMA和ADC模塊與應(yīng)用程序/*DMAchannel1configuration*/DMA_DeInit<DMA1_Channel1>;DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;//外設(shè)地址DMA_InitStructure.DMA_MemoryBaseAddr=<u32>ADC_ConvertedValue;//內(nèi)存地址DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//DMA傳輸方向單向DMA_InitStructure.DMA_BufferSize=1;//設(shè)置DMA在傳輸時(shí)緩沖區(qū)的長(zhǎng)度wordDMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//設(shè)置DMA外設(shè)遞增模式DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Disable;//設(shè)置DMA內(nèi)存遞增模式DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//外設(shè)數(shù)據(jù)字長(zhǎng)DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//內(nèi)存數(shù)據(jù)字長(zhǎng)DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//設(shè)置傳輸模式連續(xù)不斷的循環(huán)模式DMA_InitStructure.DMA_Priority=DMA_Priority_High;//設(shè)置DMA的優(yōu)先級(jí)別DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//設(shè)置DMA的2個(gè)memory中的變量互相訪問(wèn)DMA_Init<DMA1_Channel1,DMA_InitStructure>;/*EnableDMAchannel1*/DMA_Cmd<DMA1_Channel1,ENABLE>;/*ADC1configuration*/ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//獨(dú)立工作模式ADC_InitStructure.ADC_ScanConvMode=ENABLE;//掃描方式ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//連續(xù)轉(zhuǎn)換ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//外部觸發(fā)禁止ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//數(shù)據(jù)右對(duì)齊ADC_InitStructure.ADC_NbrOfChannel=1;//用于轉(zhuǎn)換的通道數(shù)ADC_Init<ADC1,ADC_InitStructure>;/*ADC1regularchannel14configuration*/ADC_RegularChannelConfig<ADC1,ADC_Channel_2,1,ADC_SampleTime_55Cycles5>;/*EnableADC1DMA*/ADC_DMACmd<ADC1,ENABLE>;/*EnableADC1*/ADC_Cmd<ADC1,ENABLE>;/*EnableADC1resetcalibarationregister*/ADC_ResetCalibration<ADC1>;/*ChecktheendofADC1resetcalibrationregister*/while<ADC_GetResetCalibrationStatus<ADC1>>;/*StartADC1calibaration*/ADC_StartCalibration<ADC1>;/*ChecktheendofADC1calibration*/while<ADC_GetCalibrationStatus<ADC1>>;/*StartADC1SoftwareConversion*/ADC_SoftwareStartConvCmd<ADC1,ENABLE>;while<1>{AD_value=ADC_GetConversionValue<ADC1>;delay<>;}<三>仿真調(diào)試<1>使用KeiluVision3通過(guò)ULINK2仿真器連接實(shí)驗(yàn)板,使用MINI-STM32開(kāi)發(fā)板附帶的串口線,連接實(shí)驗(yàn)板上的UART1和PC機(jī)的串口,打開(kāi)實(shí)驗(yàn)例程目錄下的ADC.Uv2例程,編譯鏈接工程;<2>在PC機(jī)上運(yùn)行windows自帶的超級(jí)終端串口通信程序〔波特率115200、1位停止位、無(wú)校驗(yàn)位、無(wú)硬件流控制;或者使用其它串口通信程序;<3>點(diǎn)擊MDK的Debug菜單,點(diǎn)擊Start/StopDebugSession;<4>旋轉(zhuǎn)電位器R19,可以看到串口輸出數(shù)值不斷變化,正常顯示結(jié)果如下所示。usart1printAD_valueThecurrentADvalue=0x0425ThecurrentADvalue=0x0423ThecurrentADvalue=0x0421ThecurrentADvalue=0x0422ThecurrentADvalue=0x0420ThecurrentADvalue=0x0416ThecurrentADvalue=0x03B6ThecurrentADvalue=0x0841ThecurrentADvalue=0x08C3ThecurrentADvalue=0x08C0ThecurrentADvalue=0x08BEThecurrentADvalue=0x09E9ThecurrentADvalue=0x0A12ThecurrentADvalue=0x0ACAThecurrentADvalue=0x0B0DThecurrentADvalue=0x0B10ThecurrentADvalue=0x0B0E<5>若無(wú)開(kāi)發(fā)板,讀者也可以使用軟件仿真模式來(lái)完成程序運(yùn)行。MINI-STM32開(kāi)發(fā)板入門教程<七>-工業(yè)現(xiàn)場(chǎng)總線CAN<七>-工業(yè)現(xiàn)場(chǎng)總線CAN<一>工業(yè)現(xiàn)場(chǎng)總線CAN的基本介紹以及STM32的CAN模塊簡(jiǎn)介首先通讀手冊(cè)中關(guān)于CAN的文檔,必須精讀。STM32F10xxx參考手冊(cè)Rev7V3.pdf/bbs/redirect.php?tid=255goto=lastpost#lastpost需要精讀的部分為RCC和CAN兩個(gè)章節(jié)。為什么需要精讀RCC呢?因?yàn)槲覀儗W(xué)習(xí)CAN的波特率的設(shè)置,將要使用到RCC部分的設(shè)置,因此推薦大家先復(fù)習(xí)下這部分中的幾個(gè)時(shí)鐘。關(guān)于STM32的can總線簡(jiǎn)單介紹bxCAN是基本擴(kuò)展CAN<BasicExtendedCAN>的縮寫(xiě),它支持CAN協(xié)議2.0A和2.0B。它的設(shè)計(jì)目標(biāo)是,以最小的CPU負(fù)荷來(lái)高效處理大量收到的報(bào)文。它也支持報(bào)文發(fā)送的優(yōu)先級(jí)要求〔優(yōu)先級(jí)特性可軟件配置。對(duì)于安全緊要的應(yīng)用,bxCAN提供所有支持時(shí)間觸發(fā)通信模式所需的硬件功能。主要特點(diǎn)·支持CAN協(xié)議2.0A和2.0B主動(dòng)模式·波特率最高可達(dá)1兆位/秒·支持時(shí)間觸發(fā)通信功能發(fā)送·3個(gè)發(fā)送郵箱·發(fā)送報(bào)文的優(yōu)先級(jí)特性可軟件配置·記錄發(fā)送SOF時(shí)刻的時(shí)間戳接收·3級(jí)深度的2個(gè)接收FIFO·14個(gè)位寬可變的過(guò)濾器組-由整個(gè)CAN共享·標(biāo)識(shí)符列表·FIFO溢出處理方式可配置·記錄接收SOF時(shí)刻的時(shí)間戳可支持時(shí)間觸發(fā)通信模式·禁止自動(dòng)重傳模式·16位自由運(yùn)行定時(shí)器·定時(shí)器分辨率可配置·可在最后2個(gè)數(shù)據(jù)字節(jié)發(fā)送時(shí)間戳管理·中斷可屏蔽·郵箱占用單獨(dú)1塊地址空間,便于提高軟件效率<二>STM32CAN模塊工作模式STM32的can的工作模式分為:/*CANoperatingmode*/#defineCAN_Mode_Normal<<u8>0x00>/*normalmode*/#defineCAN_Mode_LoopBack<<u8>0x01>/*loopbackmode*/#defineCAN_Mode_Silent<<u8>0x02>/*silentmode*/#defineCAN_Mode_Silent_LoopBack<<u8>0x03>/*loopbackcombinedwithsilentmode*/在此章我們的Mini-STM32教程中我們將使用到CAN_Mode_LoopBack和CAN_Mode_Normal兩種模式。我們第一步做的就是使用運(yùn)行在CAN_Mode_LoopBack下進(jìn)行自測(cè)試。在參考手冊(cè)中CAN_Mode_LoopBack<環(huán)回模式>的定義如下:環(huán)回模式可用于自測(cè)試。為了避免外部的影響,在環(huán)回模式下CAN內(nèi)核忽略確認(rèn)錯(cuò)誤<在數(shù)據(jù)/遠(yuǎn)程幀的確認(rèn)位時(shí)刻,不檢測(cè)是否有顯性位>。在環(huán)回模式下,bxCAN在內(nèi)部把Tx輸出回饋到Rx輸入上,而完全忽略CANRX引腳的實(shí)際狀態(tài)。發(fā)送的報(bào)文可以在CANTX引腳上檢測(cè)到。因此這種模式也特別適合大家做好硬件后自測(cè)程序。<三>CAN接口端口映射STM32中的CAN物理引腳腳位可以設(shè)置成三種:默認(rèn)模式,重定義地址1模式,重定義地址2模式。在我們的Mini-STM32上面沒(méi)有接出CAN的接口芯片,所以我們可以利用RealViewMDK的CAN軟件模擬模塊來(lái)做實(shí)驗(yàn).默認(rèn)模式/*ConfigureCANpin:RX*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init<GPIOA,GPIO_InitStructure>;/*ConfigureCANpin:TX*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init<GPIOA,GPIO_InitStructure>;重定義地址1模式/*ConfigureCANpin:RX*///GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//GPIO_Init<GPIOB,GPIO_InitStructure>;/*ConfigureCANpin:TX*///GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//GPIO_Init<GPIOB,GPIO_InitStructure>;/*ConfigureCANRemap重影射*///GPIO_PinRemapConfig<GPIO_Remap1_CAN,ENABLE>;重定義地址2模式/*ConfigureCANpin:RX*///GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//GPIO_Init<GPIOD,GPIO_InitStructure>;/*ConfigureCANpin:TX*///GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//GPIO_Init<GPIOD,GPIO_InitStructure>;/*ConfigureCANRemap重影射*///GPIO_PinRemapConfig<GPIO_Remap2_CAN,ENABLE>;設(shè)置完CAN的引腳之后還需要打開(kāi)CAN的時(shí)鐘:/*CANPeriphclockenable*/RCC_APB1PeriphClockCmd<RCC_APB1Periph_CAN,ENABLE>;<四>CAN波特率設(shè)置4、我們需要搞明白CAN波特率的設(shè)置,這個(gè)章節(jié)也是使用CAN的最重要的部分之一,因?yàn)檫@實(shí)際應(yīng)用中我們需要根據(jù)我們實(shí)際的場(chǎng)合來(lái)選擇CAN的波特率。一般情況下面1Mbps的速率下可以最高可靠傳輸40米以內(nèi)的距離。在50K以下的波特率中一般可以可靠傳輸數(shù)公里遠(yuǎn)。對(duì)于波特率的設(shè)置需要詳細(xì)學(xué)習(xí)參考手冊(cè)對(duì)應(yīng)部分的解釋。我們?cè)谡{(diào)試軟件的時(shí)候可以使用示波器來(lái)測(cè)試CANTX引腳上的波形的波特率,這樣可以得到事半功倍的效果,大大的縮短調(diào)試學(xué)習(xí)的時(shí)間。//***************************************************************//BaudRate=1/NominalBitTime//NominalBitTime=1tq+tBS1+tBS2//tq=<BRP[9:0]+1>xtPCLK//tPCLK=CAN'sclock=APB1'sclock//****************************************************************也就是BaudRate=APB1/<<BS1+BS2+1>*Prescaler>這里注意的是采用點(diǎn)的位置,也就時(shí)BS1,BS2的設(shè)置問(wèn)題,這里我也找了一些資料,抄錄下來(lái)給大家,是CANopen協(xié)議中推薦的設(shè)置。1Mbps速率下,采用點(diǎn)的位置在6tq位置處,BS1=5,BS2=2500kbps速率下,采用點(diǎn)的位置在8tq位置處,BS1=7,BS2=3250kbps速率下,采用點(diǎn)的位置在14tq位置處,BS1=13,BS2=2125k,100k,50k,20k,10k的采用點(diǎn)位置與250K相同。因此我們需要重視的有軟件中的這么幾個(gè)部分://設(shè)置AHB時(shí)鐘〔HCLK//RCC_SYSCLK_Div1AHB時(shí)鐘=系統(tǒng)時(shí)鐘RCC_HCLKConfig<RCC_SYSCLK_Div8>;//設(shè)置低速AHB時(shí)鐘〔PCLK1//RCC_HCLK_Div2APB1時(shí)鐘=HCLK/2RCC_PCLK1Config<RCC_HCLK_Div2>;//PLLCLK=8MHz*8=64MHz//設(shè)置PLL時(shí)鐘源及倍頻系數(shù)RCC_PLLConfig<RCC_PLLSource_HSE_Div1,RCC_PLLMul_8>;CAN波特率設(shè)置中需要的就是PCLK1的時(shí)鐘。CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;CAN_InitStructure.CAN_Prescaler=5;通過(guò)上面部分的時(shí)鐘設(shè)置我們已經(jīng)可以算出我們的波特率了CAN_bps=PCLK1/<<1+7+8>*5>=25Kbps大家也可以實(shí)際測(cè)試中修改時(shí)鐘值來(lái)通過(guò)示波器測(cè)試我們需要的波特率是否正確例如將PLLCLK設(shè)置降低一半://PLLCLK=8MHz*4=32MHz//設(shè)置PLL時(shí)鐘源及倍頻系數(shù)RCC_PLLConfig<RCC_PLLSource_HSE_Div1,RCC_PLLMul_4>;那么我們得到的CAN_bps也會(huì)降低一半。接下來(lái)還可以修改HCLK和PCLK1,其實(shí)最終這幾個(gè)分頻和倍頻值最終影響的都是PCLK1。通過(guò)幾次試驗(yàn),相信大家應(yīng)該很容易掌握波特率的設(shè)置了。設(shè)置完波特率我們直接測(cè)試函數(shù):/*CANtransmitat100Kb/sandreceivebypollinginloopbackmode*/TestRx=CAN_Polling<>;if<TestRx==FAILED>{/*TurnonledconnectedtoPA.00pin<LD1>*/GPIO_SetBits<GPIOA,GPIO_Pin_0>;}else{/*TurnoffledconnectedtoPA.00pin<LD1>*/GPIO_ResetBits<GPIOA,GPIO_Pin_0>;}/*CANtransmitat500Kb/sandreceivebyinterruptinloopbackmode*/TestRx=CAN_Interrupt<>;if<TestRx==FAILED>{/*TurnonledconnectedtoPA.01pin<LD2>*/GPIO_SetBits<GPIOA,GPIO_Pin_1>;}else{/*TurnoffledconnectedtoPA.01pin<LD2>*/GPIO_ResetBits<GPIOA,GPIO_Pin_1>;}將CAN軟件仿真模擬器調(diào)用出來(lái).大家可以仿真程序,當(dāng)程序中Test等于Passed那么說(shuō)明Loopback模式測(cè)試通過(guò)了。并且在CAN通訊框中我們可以看到發(fā)送和接收到的數(shù)據(jù):回循模式下的源代碼,基于MDK3.5:Example7.1-CANLoopBackMode.rar<493.79KB>到此時(shí)說(shuō)明如果大家只有一塊CAN模塊的時(shí)候?qū)W習(xí)可以告一個(gè)段落了,不過(guò)這個(gè)并不代表大家就已經(jīng)掌握了CAN了,正真要掌握它,大家還是需要看大量的CAN部分的資料,參考手冊(cè)部分的也是不夠的,市面上有幾本專門介紹現(xiàn)場(chǎng)總線和CAN總線的書(shū),推薦大家買來(lái)經(jīng)常翻翻看看,這樣到需要實(shí)際應(yīng)用的時(shí)候才可以做到如魚(yú)得水。<五>正常模式完成了loopback模式的測(cè)試之后接下來(lái)我們需要學(xué)習(xí)的就是多機(jī)通訊了,當(dāng)然由于我們的Mini-STM32沒(méi)有將CAN接口引出來(lái),所以我們沒(méi)有辦法在板子上面做這部分的試驗(yàn)了,只能在RealViewMDK的軟件中進(jìn)行模擬。如果您擁有兩塊帶CAN硬件的STM32的板子,您需要自己構(gòu)建硬件的物理層的連接,使用三根線將CANH,CANL,GND三根線直連,當(dāng)然你要接好終端電阻才能保證通訊的正常通訊,當(dāng)兩塊板子都跳好后我們使用萬(wàn)用表測(cè)量下CANH和CANL之間的電阻是否為60歐姆。多塊板子多機(jī)通訊的是否你只需要在總線的主機(jī)端和最后一端接上終端電阻就可以了.在初始化完成后,軟件應(yīng)該讓硬件進(jìn)入正常模式,以便正常接收和發(fā)送報(bào)文。軟件可以通過(guò)對(duì)CAN_MCR寄存器的INRQ位清'0',來(lái)請(qǐng)求從初始化模式進(jìn)入正常模式,然后要等待硬件對(duì)CAN_MSR寄存器的INAK位置'1'的確認(rèn)。在跟CAN總線取得同步,即在CANRX引腳上監(jiān)測(cè)到11個(gè)連續(xù)的隱性位<等效于總線空閑>后,bxCAN才能正常接收和發(fā)送報(bào)文。不需要在初始化模式下進(jìn)行過(guò)濾器初值的設(shè)置,但必須在它處在非激活狀態(tài)下完成<相應(yīng)的FACT位為'0'>。而過(guò)濾器的位寬和模式的設(shè)置,則必須在初始化模式中進(jìn)入正常模式前完成。準(zhǔn)備工作做完我們需要設(shè)置CAN通訊部份軟件。我們把TestStatusCAN_Polling<void>函數(shù)和TestStatusCAN_Interrupt<void>函數(shù)中的LoopBack模式修改為Normal模式.//CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;接下來(lái)我們就可以做實(shí)驗(yàn)了.但是由于RealViewMDK的CAN模塊沒(méi)有辦法接收,所以我們只做發(fā)送的例子.我們的例子中分別發(fā)送兩幀數(shù)據(jù):<1>TestStatusCAN_Polling<void>查詢發(fā)送第一幀數(shù)據(jù)為:ID為0x11,數(shù)據(jù)為8個(gè)字節(jié)的一個(gè)數(shù)據(jù)包.TxMessage.StdId=0x11;TxMessage.RTR=CAN_RTR_DATA;TxMessage.IDE=CAN_ID_STD;TxMessage.DLC=8;TxMessage.Data[0]=0x01;TxMessage.Data[1]=0x02;TxMessage.Data[2]=0x03;TxMessage.Data[3]=0x04;TxMessage.Data[4]=0x05;TxMessage.Data[5]=0x06;TxMessage.Data[6]=0x07;TxMessage.Data[7]=0x08;<2>TestStatusCAN_Interrupt<void>中斷發(fā)送第二幀數(shù)據(jù)為:ID為0x1234,數(shù)據(jù)為8個(gè)字節(jié)的一個(gè)數(shù)據(jù)包.TxMessage.StdId=0x12;TxMessage.ExtId=0x34;TxMessage.IDE=CAN_ID_EXT;TxMessage.RTR=CAN_RTR_DATA;TxMessage.DLC=8;TxMessage.Data[0]=0x11;TxMessage.Data[1]=0x22;TxMessage.Data[2]=0x33;TxMessage.Data[3]=0x44;TxMessage.Data[4]=0x55;TxMessage.Data[5]=0x66;TxMessage.Data[6]=0x77;TxMessage.Data[7]=0x88;CAN_Transmit<&TxMessage>;在主函數(shù)中初始化之后加上這兩句發(fā)送函數(shù):/*CANtransmitat100Kb/sandreceivebypollinginNormalmode*/CAN_Polling<>;while<i++<1000>;/*CANtransmitat500Kb/sandreceivebyinterruptinNormalmode*/CAN_Interrupt<>;程序改完了,我們需要編譯通過(guò)后,點(diǎn)軟件仿真.將CAN軟件仿真模擬器調(diào)用出來(lái).接下來(lái)我們?nèi)龠\(yùn)行到while<1>就可以看到結(jié)果了.正常模式下的源代碼,基于MDK3.5:Example7.2-CANNormalMode.rar<488.73KB>我們的CAN這部份的教程就結(jié)束了哦.<八>UniqueDeviceID每一片STM32芯片內(nèi)部擁有一個(gè)獨(dú)一無(wú)二的UniqueDeviceID,96Bit.這個(gè)ID號(hào)可以提供給開(kāi)發(fā)者很多優(yōu)越的功能,例如:1.可以把ID做為用戶最終產(chǎn)品的序列號(hào),幫助用戶進(jìn)行產(chǎn)品的管理。2.在某些需要保證安全性的功能代碼運(yùn)行前,通過(guò)校驗(yàn)此ID,保證最終產(chǎn)品的某些功能的安全性。3.用ID配合加解密算法,對(duì)芯片內(nèi)部的代碼進(jìn)行加加密,以保證用戶產(chǎn)品的安全性和不可復(fù)制性。這項(xiàng)功能相信對(duì)那些不希望自己的產(chǎn)品不被別人抄襲來(lái)說(shuō)肯定是個(gè)非常不錯(cuò)的。下面我就先大家介紹如何讀出這個(gè)ID:這個(gè)ID號(hào)是放在片內(nèi)Flash中的固定的位置,直接讀取出來(lái)就行了.96位的獨(dú)特ID位于地址0x1FFFF7E8~0x1FFFF7F4的系統(tǒng)存儲(chǔ)區(qū),由ST公司在工廠中寫(xiě)入<用戶不能修改>用戶可以以字節(jié)、半字、或字的方式單獨(dú)讀取其間的任一地址.<一>配置好串口,用于調(diào)試演示,這一部份前面的章節(jié)我們已經(jīng)介紹過(guò)了.可以參考貼子:[原創(chuàng)]MINI-STM32開(kāi)發(fā)板入門教程<六>基于DMA的ADC當(dāng)然也可以直接下載我們的例程去讀這部分的程序.<二>讀取UniqueDeviceIDu32Dev_Serial0,Dev_Serial1,Dev_Serial2;Dev_Serial0=*<vu32*><0x1FFFF7E8>;Dev_Serial1=*<vu32*><0x1FFFF7EC>;Dev_Serial2=*<vu32*><0x1FFFF7F0>;<三>仿真調(diào)試<1>使用KeiluVision3通過(guò)ULINK2仿真器連接實(shí)驗(yàn)板,使用MINI-STM32開(kāi)發(fā)板附帶的串口線,連接實(shí)驗(yàn)板上的UART1和PC機(jī)的串口,打開(kāi)實(shí)驗(yàn)例程目錄下的ADC.Uv2例程,編譯鏈接工程;<2>在PC機(jī)上運(yùn)行windows自帶的超級(jí)終端串口通信程序〔波特率115200、1位停止位、無(wú)校驗(yàn)位、無(wú)硬件流控制;或者使用其它串口通信程序;<3>點(diǎn)擊MDK的Debug菜單,點(diǎn)擊Start/StopDebugSession;<4>全速運(yùn)行程序,顯示結(jié)果如下所示。麥思網(wǎng)原創(chuàng)教程MINI-STM32STM32F103RBT6UniqueDeviceID:066C00333235395843195835備注:其中最后一行的數(shù)字就是我的MINI-STM32開(kāi)發(fā)板中STM32F103RBT6的UniqueDeviceID.您的ID當(dāng)然肯定會(huì)和我的不一樣哦.<九>內(nèi)部溫度傳感器<一>STM32內(nèi)部溫度傳感器概要STM32芯片內(nèi)部一項(xiàng)獨(dú)特的功能就是內(nèi)部集成了一個(gè)溫度傳感器,因?yàn)槭莾?nèi)置,所以測(cè)試的是芯片內(nèi)部的溫度,如果芯片外接負(fù)載一定的情況下,那么芯片的發(fā)熱也基本穩(wěn)定,相對(duì)于外界的溫度而言,這個(gè)偏差值也是基本穩(wěn)定的.也就是說(shuō)用STM32內(nèi)部傳感器來(lái)測(cè)量外界環(huán)境的溫度.在一些惡劣的應(yīng)用環(huán)境下面,可以通過(guò)檢測(cè)芯片內(nèi)部而感知設(shè)備的工作環(huán)境溫度,如果溫度過(guò)高或者過(guò)低了則馬上睡眠或者停止運(yùn)轉(zhuǎn).可以保證您的設(shè)備工作的可靠性.1.STM32內(nèi)部溫度傳感器與ADC的通道16相連,與ADC配合使用實(shí)現(xiàn)溫度測(cè)量;2.測(cè)量范圍–40~125℃,精度±1.5℃。3.溫度傳感器產(chǎn)生一個(gè)隨溫度線性變化的電壓,轉(zhuǎn)換范圍在2V<VDDA<3.6V之間。轉(zhuǎn)換公式如下圖所示:手冊(cè)中對(duì)于公式中的參數(shù)說(shuō)明:<二>程序編寫(xiě)寫(xiě)代碼的時(shí)候,在測(cè)量要求不怎么高的情況下,公式可以簡(jiǎn)化.簡(jiǎn)化的公式:Temperature=<1.42-ADC_Value*3.3/4096>*1000/4.35+25;程序編寫(xiě):1.初始化ADC,初始化DMA可以參考貼子:[原創(chuàng)]MINI-STM32開(kāi)發(fā)板入門教程<六>基于DMA的ADC主意:內(nèi)部溫度傳感器是使用了ADC1的第16通道哦.2.ADC_TempSensorVrefintCmd<ENABLE>;使能溫度傳感器和內(nèi)部參考電壓通道3.按照剛才列出的公式計(jì)算Temperature=<1.42-ADC_Value*3.3/4096>*1000/4.35+25;第二步是做什么的呢?參考下圖:<三>仿真調(diào)試<1>使用KeiluVision3通過(guò)ULINK2仿真器連接實(shí)驗(yàn)板,使用MINI-STM32開(kāi)發(fā)板附帶的串口線,連接實(shí)驗(yàn)板上的UART1和PC機(jī)的串口,打開(kāi)實(shí)驗(yàn)例程目錄下的ADC.Uv2例程,編譯鏈接工程;<2>在PC機(jī)上運(yùn)行windows自帶的超級(jí)終端串口通信程序〔波特率115200、1位停止位、無(wú)校驗(yàn)位、無(wú)硬件流控制;或者使用其它串口通信程序;<3>點(diǎn)擊MDK的Debug菜單,點(diǎn)擊Start/StopDebugSession;<4>全速運(yùn)行程序,顯示結(jié)果如下所示。<十>RTC實(shí)時(shí)時(shí)鐘<一>STM32RTC實(shí)時(shí)時(shí)鐘概要STM32內(nèi)部RTC功能非常實(shí)用,它的供電和時(shí)鐘是獨(dú)立于內(nèi)核的,可以說(shuō)是STM32內(nèi)部獨(dú)立的外設(shè)模塊,有加上RTC內(nèi)部寄存器不受系統(tǒng)復(fù)位掉電的影響,我們可以才用外部電池供電和32768表振晶體來(lái)實(shí)現(xiàn)真正RTC〔實(shí)時(shí)時(shí)鐘功能。這里引用手冊(cè)里一段概述:RTC由兩個(gè)主要部分組成。第一部分〔APB1接口用來(lái)和APB1總線相連。此單元還包含一組16位寄存器,可通過(guò)APB1總線對(duì)其進(jìn)行讀寫(xiě)操作。APB1接口以APB1總線時(shí)鐘為時(shí)鐘,用來(lái)與APB1總線接口。另一部分〔RTC核由一系列可編程計(jì)數(shù)器組成,分成兩個(gè)主要模塊。第一個(gè)模塊是RTC的預(yù)分頻模塊,它可編程產(chǎn)生最長(zhǎng)為1秒的RTC時(shí)間基準(zhǔn)TR_CLK。RTC的預(yù)分頻模塊包含了一個(gè)20位的可編程分頻器〔RTC預(yù)分頻器。在每個(gè)TR_CLK周期中,如果在RTC_CR寄存器中設(shè)置了相應(yīng)允許位,則RTC產(chǎn)生一個(gè)中斷〔秒中斷。第2個(gè)模塊是一個(gè)32位的可編程的計(jì)數(shù)器,它可被初始化為當(dāng)前的系統(tǒng)時(shí)間。系統(tǒng)時(shí)間以TR_CLK速度增長(zhǎng)并與存儲(chǔ)在RTC_ALR寄存器中的可編程的時(shí)間相比較,如果RTC_CR控制寄存器中設(shè)置了相應(yīng)允許位,則比較匹配時(shí)將產(chǎn)生一個(gè)鬧鐘中斷。<二
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球鹽酸毛果蕓香堿行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025服務(wù)器托管合同書(shū)模板
- 綠色供應(yīng)鏈一體化管理合同
- 2025關(guān)于醫(yī)藥采購(gòu)合同
- 品牌服務(wù)協(xié)議書(shū)合同范本
- 濱海新區(qū)應(yīng)急管理局
- 房屋租賃權(quán)轉(zhuǎn)讓合同范文
- 建筑材料居間合同
- 藥品購(gòu)銷標(biāo)準(zhǔn)合同
- 企業(yè)間借款擔(dān)保合同
- 2025年國(guó)網(wǎng)陜西省電力限公司高校畢業(yè)生招聘1100人(第二批)高頻重點(diǎn)提升(共500題)附帶答案詳解
- 《深度學(xué)習(xí)的7種有力策略》
- 2025年潞安化工集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 幼兒園一日生活安全課件
- 《認(rèn)罪認(rèn)罰案件被追訴人反悔應(yīng)對(duì)機(jī)制研究》
- 多旋翼無(wú)人飛行器嵌入式飛控開(kāi)發(fā)實(shí)戰(zhàn)-基于STM32系列微控制器的代碼實(shí)現(xiàn)
- 國(guó)家開(kāi)放大學(xué)護(hù)理社會(huì)實(shí)踐報(bào)告
- 投資項(xiàng)目評(píng)估管理制度
- 《工程地質(zhì)》試題及答案四
- 工程項(xiàng)目歸檔資料目錄范本
- 氦離子化色譜法測(cè)試電氣設(shè)備油中溶解氣體的技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論