STM32開發(fā)入門教程_第1頁
STM32開發(fā)入門教程_第2頁
STM32開發(fā)入門教程_第3頁
STM32開發(fā)入門教程_第4頁
STM32開發(fā)入門教程_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

./STM32開發(fā)入門教程<一>開發(fā)環(huán)境建立及其應(yīng)用入門準(zhǔn)備:我們常用的STM32開發(fā)編譯環(huán)境為Keil公司的MDK<MicrocontrollerDevelopmentKit>和IAR公司的EWARM.在這里我們提供了比較穩(wěn)定的新版本編譯軟件下載:MDK4.10限于篇幅,在我們的教程里面將先以MDK下的一個例子來介紹如何使用MDK進(jìn)行嵌入式應(yīng)用開發(fā).MDK安裝與配置:基于MDK下的開發(fā)中基本的過程:<1>創(chuàng)建工程;<2>配置工程;<3>用C/C++或者匯編語言編寫源文件;<4>編譯目標(biāo)應(yīng)用程序<5>修改源程序中的錯誤<6>測試鏈接應(yīng)用程序<1>創(chuàng)建一個工程:在uVision3主界面中選擇"Project"->"NewuVisionProject"菜單項,打開一個標(biāo)準(zhǔn)對話框選擇好你電腦中的保存目錄后,輸入一個你的工程名字后點確認(rèn).我們的工程中建了一個名字叫"NewProject"的工程.從設(shè)備庫中選擇目標(biāo)芯片,我們的MINI-STM32開發(fā)板使用的是STM32F103V8T6,因此選中STMicrocontroller下對應(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選擇完芯片型號后會提示是否在目標(biāo)工程中加入CPU的相關(guān)的啟動代碼,如下圖所示.啟動代碼是用來初始化目標(biāo)設(shè)備的配置,完成運行的系統(tǒng)初始化工作,因此我們選擇"是",這會使系統(tǒng)的啟動代碼編寫工作量大大減少.<2>配置工程:選擇菜單中"Project"->"OptionforTarget"或者選擇快捷菜單中的圖標(biāo):因為MINI-STM32開發(fā)板上使用的就是8M的晶振且是使用的片內(nèi)的RAM和ROM因此"taget"下我們都可以使用默認(rèn)的配置;在"Output"菜單下我們需要選中"CreatHexFile"來生成編譯好的工程代碼,此工程可以通過仿真器或者串口ISP燒錄進(jìn)開發(fā)板中.注:ISP燒錄過程我們將在入門教程二中給大家介紹."Listing""User"菜單中我們保持默認(rèn)即可."C/C++"菜單為我們常用的菜單,這里簡單的介紹下他們的具體功能:PreProcesserSymbols中的Define,Undefine菜單表示是工程的宏定義中的變量,我們將在今后的教程中詳細(xì)介紹這個功能.Optimization為優(yōu)化選項,Level0為不優(yōu)化,這種模式最適合調(diào)試,因為不會優(yōu)化掉代碼,基本每個用到的變量都可以打斷點.Level3為優(yōu)化等級最高,最適合生產(chǎn)過程中下載到芯片中的代碼.IncludePath為工程中的包含路徑,一般需將.h文件或者庫文件的地址配置進(jìn)去."Asm"和"Link"將在今后的高級教程中介紹."Debug"為我們調(diào)試使用的配置選項,"UseSimulator"為使用軟件仿真.這里根據(jù)大家手里的仿真器來選擇配置環(huán)境.如果你使用的是Ulink,那么就選擇"UlinkCotexDebug",如果你選擇的是JLINK,那么就選擇"CotexM3Jlink",如果你使用的是ST公司出的簡易仿真器ST-Link,那么你就選擇"ST-LinkDebug".注意:右邊當(dāng)中的選項"Runtomain{}"選項如果勾上就表示仿真時進(jìn)入了就會進(jìn)入到main函數(shù),如果沒有選上就會進(jìn)入初始地址,你需要自己打斷點運行到你的主程序main處.當(dāng)插上仿真器后選擇上面右圖中的Setting后會跳出一個仿真器的配置菜單.左邊會自動識別出你的仿真器的信息.如下圖為ULINK2的信息:對于SWJ選項為三線制調(diào)試,將在后面的高級教程中介紹.右下方有兩個選項:"VerifyCodeDownload":表示下載后校驗數(shù)據(jù)"Downloadtoflash":表示當(dāng)仿真的時候先將目標(biāo)代碼下載到Flash中.Trace菜單為跟蹤配置,可以實時的將一些變量使用曲線的形式實時表示出來,我們將在今后的高級教程中介紹這一項功能.注意:市面上目前的盜版Ulink2不支持這項功能,正版的支持,Jlink也不支持這項功能."FlashDownload"菜單用來配置使用仿真器程序下載的配置選項,大家務(wù)必選擇好和你芯片配套的選項.如果你是使用的別人模板下修改為你的工程,這個選項請注意一下,如果不正確將不能將你的代碼下載到芯片中.配置好"Debug"后,那么"Utilities"可以不用配置.如果你使用的是仿真器仿真,在你已經(jīng)正確得將目標(biāo)板和仿真器建立了物理連接后,請選擇正確的仿真器進(jìn)行配置.<二>ISP在線下載程序ISP:insystemprogramming簡介:ISP:用寫入器將code燒入,不過,芯片可以在目標(biāo)板上,不用取出來,在設(shè)計目標(biāo)板的時候就將接口設(shè)計在上面,所以叫"在系統(tǒng)編程",即不用脫離系統(tǒng);應(yīng)用場合:1,ISP程序升級需要到現(xiàn)場解決,不過好一點的是不必拆機(jī)器了;ISP的實現(xiàn)一般需要很少的外部電路輔助實現(xiàn),通??衫脝纹瑱C(jī)的串行口接到計算機(jī)的RS232口,通過專門設(shè)計的固件程序來編程內(nèi)部存儲器。主要是指代芯片的燒寫方式,以往寫片子需要把片子拿下來,離開電路,用編程器燒,換句話說,芯片不能不脫離應(yīng)用系統(tǒng)進(jìn)行寫入。ISP主要針對這個問題,使用JTAG或者串行口〔MCU內(nèi)部有BootLoader,通過指定的方式激活之,它可以和PC或其它上位機(jī)通過串口聯(lián)系,不用使單片機(jī)離開應(yīng)用系統(tǒng)而更新內(nèi)部的程序/設(shè)置進(jìn)行程序的燒寫操作。因此,具有ISP功能的MCU可以不使用編程器進(jìn)行編程。當(dāng)然,實現(xiàn)ISP可能需要一些硬件電路支持,具體的在數(shù)據(jù)手冊中有說明。一般具備ISP功能后,就不要編程器了,而是使用下載線進(jìn)行編程工作。但是不是說他們就一定不支持編程器了,具體型號具體分析。是否需要仿真器進(jìn)行仿真和是否具備ISP和IAP沒有必然的聯(lián)系。只不過具備了IAP功能,可以在MCU內(nèi)寫入監(jiān)控程序,模擬一個仿真器,當(dāng)然,這個監(jiān)控程序是要消耗資源的,和使用硬件的仿真器還有一定的差異。以上就是ISP的一些概念上的描述,現(xiàn)在通俗點說就是怎么利用工具把程序下載到芯片當(dāng)中去.第一步:配置工程,輸出編譯后的代碼.Hex文件:我們打開第一個我們的教程例子,GPIO_Test這個例子工程.先按照下面的步驟來配置一下工程:點擊下圖中的Option選項;選中"Output"菜單下的"CreateHEXFile",并且在右邊的"NameofExecutable"中填寫我們生成編譯代碼的文件名稱.配置完選項后,點擊工程編譯按鈕,然后我們就可以在\Example2-GPIO\GPIO_test\output目錄下面得到Gpio_Test.Hex文件了.第二步:準(zhǔn)備串口物理連接和設(shè)置Boot跳線選擇芯片啟動類型先需要準(zhǔn)備一根串口延長線,一頭為公頭,一頭為母頭的串口連接線<非交叉線>,和一臺有串口的電腦.<注意:如果您的電腦沒有串口,請購買"USB轉(zhuǎn)RS232"的硬件設(shè)備來擴(kuò)充你電腦的串口.>將Mini-STM32的J1跳線帽跳至2,3兩腳上選擇芯片從內(nèi)部的Boot區(qū)啟動,上電后會先進(jìn)入ISP狀態(tài).連接串口線至你的電腦上的串口將USB延長線連接至你的電腦上給Mini-STM32開發(fā)板供上5V電源.當(dāng)開發(fā)板上的電源指示燈點亮后一切準(zhǔn)備就緒.第三步:配置ISP下載軟件mcuisp.exe:您可以點擊下載穩(wěn)定版的mcuispV0.975版本的軟件:mcuisp.rar<576.58KB>打開mcuisp.exe綠色軟件,選擇好您連接至開發(fā)板使用的電腦上的串口,可以通過搜索串口菜單來自動搜索出你電腦上的串口信息.在左上方的"程序文件"選擇你準(zhǔn)備燒入芯片中的代碼,就是前面我們生成的Gpio_Test.Hex.然后在菜單選項欄上選擇"STMISP"菜單,點擊"讀STM32器件信息"命令按鈕.我們會在右邊的信息框中顯示出連接成功的信息:如圖所示:選擇上"校驗"和"編程后運行"兩個選項后點擊"開始編程".會報出程序成功燒入芯片的一些信息,如下:DTR電平置高<+3-+12V>,復(fù)位RTS置高<+3-+12V>,選擇進(jìn)入BootLoader...延時100毫秒DTR電平變低<-3--12V>釋放復(fù)位RTS維持高開始連接...3,接收到:1F在串口COM4連接成功@115200bps,耗時343毫秒芯片內(nèi)BootLoader版本號:2.1芯片PID:00000410芯片F(xiàn)LASH容量為128KB芯片SRAM容量為65535KB<此信息僅供參考,新版本芯片已不包含此信息>96位的芯片唯一序列號:33006C065839353235581943讀出的選項字節(jié):A55AFF00FF00FF00FF00FF00FF00FF00全片擦除成功第547毫秒,已準(zhǔn)備好共寫入2KB,進(jìn)度100%,耗時4343毫秒成功從08000000開始運行向您報告,命令執(zhí)行完畢,一切正常這個時候您可以看到您手中的Mini-STM32開發(fā)板上的兩個紅色LED有規(guī)律的輪流點亮,說明程序已經(jīng)成功的燒入芯片了.最后您在斷電后將Mini-STM32上J1的跳線帽跳至1,2引腳上,重新上電后,程序就可以正常運行了.<三>系統(tǒng)時鐘SysTick<一>背景介紹在傳統(tǒng)的嵌入式系統(tǒng)軟件按中通常實現(xiàn)Delay<N>函數(shù)的方法為:for<i=0;i<=x;i++>;x對應(yīng)于對應(yīng)于N毫秒的循環(huán)值對于STM32系列微處理器來說,執(zhí)行一條指令只有幾十個ns,進(jìn)行for循環(huán)時,要實現(xiàn)N毫秒的x值非常大,而且由于系統(tǒng)頻率的寬廣,很難計算出延時N毫秒的精確值。針對STM32微處理器,需要重新設(shè)計一個新的方法去實現(xiàn)該功能,以實現(xiàn)在程序中使用Delay<N>。<二>STM32SysTick介紹Cortex-M3的內(nèi)核中包含一個SysTick時鐘。SysTick為一個24位遞減計數(shù)器,SysTick設(shè)定初值并使能后,每經(jīng)過1個系統(tǒng)時鐘周期,計數(shù)值就減1。計數(shù)到0時,SysTick計數(shù)器自動重裝初值并繼續(xù)計數(shù),同時內(nèi)部的COUNTFLAG標(biāo)志會置位,觸發(fā)中斷<如果中斷使能情況下>。在STM32的應(yīng)用中,使用Cortex-M3內(nèi)核的SysTick作為定時時鐘,設(shè)定每一毫秒產(chǎn)生一次中斷,在中斷處理函數(shù)里對N減一,在Delay<N>函數(shù)中循環(huán)檢測N是否為0,不為0則進(jìn)行循環(huán)等待;若為0則關(guān)閉SysTick時鐘,退出函數(shù)。注:全局變量TimingDelay,必須定義為volatile類型,延遲時間將不隨系統(tǒng)時鐘頻率改變。<三>STSysTick庫文件使用ST的函數(shù)庫使用systick的方法1、調(diào)用SysTick_CounterCmd<>--失能SysTick計數(shù)器2、調(diào)用SysTick_ITConfig<>--失能SysTick中斷3、調(diào)用SysTick_CLKSourceConfig<>--設(shè)置SysTick時鐘源。4、調(diào)用SysTick_SetReload<>--設(shè)置SysTick重裝載值。5、調(diào)用SysTick_ITConfig<>--使能SysTick中斷6、調(diào)用SysTick_CounterCmd<>--開啟SysTick計數(shù)器<四>SystemTick工程實戰(zhàn)外部晶振為8MHz,9倍頻,系統(tǒng)時鐘為72MHz,SysTick的最高頻率為9MHz〔最大為HCLK/8,在這個條件下,把SysTick效驗值設(shè)置成9000,將SysTick時鐘設(shè)置為9MHz,就能夠產(chǎn)生1ms的時間基值,即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ù)這里我們定義了一個TestSig全局變量,用于我們使用Keil軟件自帶的邏輯分析儀來分析.volatilevu32TimingDelay=0;vu8TestSig=0;voidSysTickHandler<void>{TimingDelay--;if<TimingDelay%2>{TestSig=1;}else{TestSig=0;}}第三步:編寫Delay延時函數(shù)Delay:系統(tǒng)延時函數(shù),使用系統(tǒng)時鐘操作.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開發(fā)板上有兩個LED燈,分別是PA0,PA1.我們做個流水燈程序,讓他們循環(huá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)試把工程便宜通過后,進(jìn)入軟件仿真如下圖所示:點擊工程快捷菜單的邏輯分析儀在邏輯分析儀中我們點擊Setup按鍵會彈出安裝對話框.點右上方的"新建"圖標(biāo),在菜單中輸入"TestSig"這個全局變量.添加完之后就可以點Close了.如果您仿真完可以點擊左下方的"KillAll"刪除所有監(jiān)視變量.全速運行后就可以看到下面的波形了哦如果你使用仿真器在Mini-STM32上調(diào)試的話你還可以看到兩個LED在跑跑馬燈程序了.到此我們這章節(jié)的教程就結(jié)束了,相信大家也掌握了SystemTick的用法了.<四>GPIO簡單應(yīng)用和外部中斷這個章節(jié)我們將學(xué)習(xí)最基本的STM32的GPIO的應(yīng)用.我們將分為兩個章節(jié)來學(xué)習(xí).第一部份:GPIO的基本應(yīng)用和IO口的配置第二部份:外部中斷的使用1:設(shè)計要求:開發(fā)板上有2個LED,我們的目的為有規(guī)律的點亮LED1和LED2.當(dāng)按鍵按下去的時候所有的燈滅,等待2秒鐘后恢復(fù)有規(guī)律的點亮.2:硬件電路:3:軟件程序設(shè)計:<1>根據(jù)要求配置GPIOA中的PA0,PA1為輸出,PA3,PA8為輸入對于下面程序中的GPIO_InitStructure.GPIO_Speed和GPIO_InitStructure.GPIO_Mode推薦大家看下面兩篇文章.STM32GPIO的十大優(yōu)越功能綜述備注:當(dāng)STM32的GPIO端口設(shè)置為輸出模式時,有三種速度可以選擇:2MHz、10MHz和50MHz,這個速度是指I/O口驅(qū)動電路的速度,是用來選擇不同的輸出驅(qū)動模塊,達(dá)到最佳的噪聲控制和降低功耗的目的。STM32GPIO端口的輸出速度設(shè)置備注:共有8種模式,可以通過編程選擇:1.浮空輸入2.帶上拉輸入3.帶下拉輸入4.模擬輸入5.開漏輸出——<此模式可實現(xiàn)hotpower說的真雙向IO>6.推挽輸出7.復(fù)用功能的推挽輸出8.復(fù)用功能的開漏輸出模式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>打開GPIOA的時鐘,因為STM32是一個低功耗的MCU,每一個你使用的外圍設(shè)備都需要單獨開啟時鐘,如果不開啟將不能使用,這個也是對于STM32初學(xué)者容易疏忽的地方/*EnableGPIOAandAFIOclocks*/RCC_APB2PeriphClockCmd<RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE>;STM32共有5種時鐘源,其中三種不同的時鐘源可用作為驅(qū)動系統(tǒng)時鐘〔SYSCLK;1、HSI由內(nèi)部8MHzRC振蕩器產(chǎn)生,它是可以直接用來作為系統(tǒng)時鐘或經(jīng)2分頻后作為PLLSRC輸入。HIS時鐘頻率在出廠時被校準(zhǔn)在1%〔25°C,在系統(tǒng)復(fù)位時,工廠校準(zhǔn)值會被裝載到時鐘控制寄存器的HISCAL[7..0]位。用戶可以通過更改HISCAL[4..0]來調(diào)整HSI頻率。另外時鐘寄存器中有一個HSIRDY位用來指示HSIRC是不穩(wěn)定工作,在時鐘啟過后,直到這個標(biāo)志位置被硬件置1后,HSIRC時鐘才被輸出。HSIRC時鐘還可以用時鐘寄存器中的HSION位來啟動和關(guān)閉。HSI時鐘同時也是HSE晶體蕩振器的備用時鐘源。使用HSE時鐘,程序設(shè)置時鐘參數(shù)流程:1、將RCC寄存器重新設(shè)置為默認(rèn)值RCC_DeInit;2、打開外部高速時鐘晶振HSERCC_HSEConfig<RCC_HSE_ON>;3、等待外部高速時鐘晶振工作HSEStartUpStatus=RCC_WaitForHSEStartUp<>;4、設(shè)置AHB時鐘RCC_HCLKConfig;5、設(shè)置高速AHB時鐘RCC_PCLK2Config;6、設(shè)置低速速AHB時鐘RCC_PCLK1Config;7、設(shè)置PLLRCC_PLLConfig;8、打開PLLRCC_PLLCmd<ENABLE>;9、等待PLL工作while<RCC_GetFlagStatus<RCC_FLAG_PLLRDY>==RESET>10、設(shè)置系統(tǒng)時鐘RCC_SYSCLKConfig;11、判斷是否PLL是系統(tǒng)時鐘while<RCC_GetSYSCLKSource<>!=0x08>12、打開要使用的外設(shè)時鐘RCC_APB2PeriphClockCmd<>/RCC_APB1PeriphClockCmd<>具體設(shè)置請參考下面的文章STM32時鐘系統(tǒng)與軟件配置STM32的時鐘系統(tǒng)分析STM32的時鐘與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>;同樣不要忘記打開時鐘,我們在打開PA口的時候已經(jīng)加上了RCC_APB2Periph_AFIO,這里再提醒大家一下./*EnableGPIOAandAFIOclocks*/RCC_APB2PeriphClockCmd<RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE>;最后就是編寫外部中斷入口函數(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)志位,不然會不停的進(jìn)入中斷.<4>編譯與調(diào)試我們已經(jīng)完成所有程序編寫部份,接下來就是將工程編譯成功后下載到我們的Mini-STM32開發(fā)板中進(jìn)行調(diào)試和仿真.如果看到LED有規(guī)律的點亮和熄滅,按下按鈕后LED先是一起熄滅,在一起點亮,然后恢復(fù)有規(guī)律的點亮這個過程,說明我們已經(jīng)達(dá)到我們的設(shè)計目標(biāo).總結(jié):我們學(xué)習(xí)完了這篇教程之后,相信大家對下面幾個方面的內(nèi)容已經(jīng)掌握了.*GPIO的設(shè)置*STM32GPIO的優(yōu)勢*STM32的時鐘結(jié)構(gòu)*外部中斷的配置*外部中斷和外部事件的區(qū)別<五>異步串口雙工通訊<一>STM32的USART模擬介紹通用同步異步收發(fā)器〔USART提供了一種靈活的方法來與使用工業(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方式,可以實現(xiàn)高速數(shù)據(jù)通信。主要特性:全雙工的,異步通信NR標(biāo)準(zhǔn)格式分?jǐn)?shù)波特率發(fā)生器系統(tǒng)-發(fā)送和接收共用的可編程波特率,最高到4.5Mbits/s可編程數(shù)據(jù)字長度〔8位或9位可配置的停止位-支持1或2個停止位LIN主發(fā)送同步斷開符的能力以及LIN從檢測斷開符的能力-當(dāng)USART硬件配置成LIN時,生成13位斷開符;檢測10/11位斷開符發(fā)送方為同步傳輸提供時鐘IRDASIR編碼器解碼器-在正常模式下支持3/16位的持續(xù)時間智能卡模擬功能-智能卡接口支持ISO7816-3標(biāo)準(zhǔn)里定義的異步協(xié)議智能卡-智能卡用到的0.5和1.5個停止位單線半雙工通信使用DMA的可配置的多緩沖器通信-在保留的SRAM里利用集中式DMA緩沖接收/發(fā)送字節(jié)單獨的發(fā)送器和接收器使能位檢測標(biāo)志-接收緩沖器滿-發(fā)送緩沖器空-傳輸結(jié)束標(biāo)志校驗控制-發(fā)送校驗位-對接收數(shù)據(jù)進(jìn)行校驗四個錯誤檢測標(biāo)志-溢出錯誤-噪音錯誤-幀錯誤-校驗錯誤10個帶標(biāo)志的中斷源-CTS改變-LIN斷開符檢測-發(fā)送數(shù)據(jù)寄存器-發(fā)送完成-接收數(shù)據(jù)寄存器-檢測到總線為空-溢出錯誤-幀錯誤-噪音錯誤-校驗錯誤多處理器通信--如果地址不匹配,則進(jìn)入靜默模式從靜默模式中喚醒〔通過空閑總線檢測或地址標(biāo)志檢測兩種喚醒接收器的方式-地址位〔MSB-空閑總線<二>程序編寫<1>在RCC_Configuration函數(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>編寫應(yīng)用程序printf<"\r\n歡迎來到麥思網(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通過ULINK2仿真器連接實驗板,打開實驗例程目錄USART_TEST子目錄下的USART.Uv2例程,編譯鏈接工程;<2>使用MINI-STM32開發(fā)板附帶的串口線,連接開發(fā)板上的COM和PC機(jī)的串口;<3>在PC機(jī)上運行windows自帶的超級終端串口通信程序〔波特率115200、1位停止位、無校驗位、無硬件流控制;或者使用其它串口通信程序;<4>選擇硬件調(diào)試模式,點擊MDK的Debug菜單,選擇Start/StopDebugSession項或Ctrl+F5鍵,遠(yuǎn)程連接目標(biāo)板并下載調(diào)試代碼到目標(biāo)系統(tǒng)中;<5>例程正常運行之后會在超級終端顯示以下信息:"歡迎來到麥思網(wǎng)論壇""""PleaseInputCharacterFromKeyboard"在PC機(jī)的鍵盤上輸入的字符,將在超級終端上顯示。<6>也可選擇軟件調(diào)試模式,點擊MDK的Debug菜單,打開串行窗口,選擇Start/StopDebugSession項或Ctrl+F5鍵,在串行窗口中也可看到與第〔5步超級終端中所顯示的相同內(nèi)容。使用軟件調(diào)試可以參考貼子:[原創(chuàng)]MDK下使用SerialWindows調(diào)試串口教程<六>基于DMA的ADC<一>STM32ADC模塊介紹<二>程序編寫<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在傳輸時緩沖區(qū)的長度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ù)字長DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//內(nèi)存數(shù)據(jù)字長DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//設(shè)置傳輸模式連續(xù)不斷的循環(huán)模式DMA_InitStructure.DMA_Priority=DMA_Priority_High;//設(shè)置DMA的優(yōu)先級別DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//設(shè)置DMA的2個memory中的變量互相訪問DMA_Init<DMA1_Channel1,DMA_InitStructure>;/*EnableDMAchannel1*/DMA_Cmd<DMA1_Channel1,ENABLE>;/*ADC1configuration*/ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//獨立工作模式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ù)右對齊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通過ULINK2仿真器連接實驗板,使用MINI-STM32開發(fā)板附帶的串口線,連接實驗板上的UART1和PC機(jī)的串口,打開實驗例程目錄下的ADC.Uv2例程,編譯鏈接工程;<2>在PC機(jī)上運行windows自帶的超級終端串口通信程序〔波特率115200、1位停止位、無校驗位、無硬件流控制;或者使用其它串口通信程序;<3>點擊MDK的Debug菜單,點擊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>若無開發(fā)板,讀者也可以使用軟件仿真模式來完成程序運行。MINI-STM32開發(fā)板入門教程<七>-工業(yè)現(xiàn)場總線CAN<七>-工業(yè)現(xiàn)場總線CAN<一>工業(yè)現(xiàn)場總線CAN的基本介紹以及STM32的CAN模塊簡介首先通讀手冊中關(guān)于CAN的文檔,必須精讀。STM32F10xxx參考手冊Rev7V3.pdf/bbs/redirect.php?tid=255goto=lastpost#lastpost需要精讀的部分為RCC和CAN兩個章節(jié)。為什么需要精讀RCC呢?因為我們將學(xué)習(xí)CAN的波特率的設(shè)置,將要使用到RCC部分的設(shè)置,因此推薦大家先復(fù)習(xí)下這部分中的幾個時鐘。關(guān)于STM32的can總線簡單介紹bxCAN是基本擴(kuò)展CAN<BasicExtendedCAN>的縮寫,它支持CAN協(xié)議2.0A和2.0B。它的設(shè)計目標(biāo)是,以最小的CPU負(fù)荷來高效處理大量收到的報文。它也支持報文發(fā)送的優(yōu)先級要求〔優(yōu)先級特性可軟件配置。對于安全緊要的應(yīng)用,bxCAN提供所有支持時間觸發(fā)通信模式所需的硬件功能。主要特點·支持CAN協(xié)議2.0A和2.0B主動模式·波特率最高可達(dá)1兆位/秒·支持時間觸發(fā)通信功能發(fā)送·3個發(fā)送郵箱·發(fā)送報文的優(yōu)先級特性可軟件配置·記錄發(fā)送SOF時刻的時間戳接收·3級深度的2個接收FIFO·14個位寬可變的過濾器組-由整個CAN共享·標(biāo)識符列表·FIFO溢出處理方式可配置·記錄接收SOF時刻的時間戳可支持時間觸發(fā)通信模式·禁止自動重傳模式·16位自由運行定時器·定時器分辨率可配置·可在最后2個數(shù)據(jù)字節(jié)發(fā)送時間戳管理·中斷可屏蔽·郵箱占用單獨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兩種模式。我們第一步做的就是使用運行在CAN_Mode_LoopBack下進(jìn)行自測試。在參考手冊中CAN_Mode_LoopBack<環(huán)回模式>的定義如下:環(huán)回模式可用于自測試。為了避免外部的影響,在環(huán)回模式下CAN內(nèi)核忽略確認(rèn)錯誤<在數(shù)據(jù)/遠(yuǎn)程幀的確認(rèn)位時刻,不檢測是否有顯性位>。在環(huán)回模式下,bxCAN在內(nèi)部把Tx輸出回饋到Rx輸入上,而完全忽略CANRX引腳的實際狀態(tài)。發(fā)送的報文可以在CANTX引腳上檢測到。因此這種模式也特別適合大家做好硬件后自測程序。<三>CAN接口端口映射STM32中的CAN物理引腳腳位可以設(shè)置成三種:默認(rèn)模式,重定義地址1模式,重定義地址2模式。在我們的Mini-STM32上面沒有接出CAN的接口芯片,所以我們可以利用RealViewMDK的CAN軟件模擬模塊來做實驗.默認(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的引腳之后還需要打開CAN的時鐘:/*CANPeriphclockenable*/RCC_APB1PeriphClockCmd<RCC_APB1Periph_CAN,ENABLE>;<四>CAN波特率設(shè)置4、我們需要搞明白CAN波特率的設(shè)置,這個章節(jié)也是使用CAN的最重要的部分之一,因為這實際應(yīng)用中我們需要根據(jù)我們實際的場合來選擇CAN的波特率。一般情況下面1Mbps的速率下可以最高可靠傳輸40米以內(nèi)的距離。在50K以下的波特率中一般可以可靠傳輸數(shù)公里遠(yuǎn)。對于波特率的設(shè)置需要詳細(xì)學(xué)習(xí)參考手冊對應(yīng)部分的解釋。我們在調(diào)試軟件的時候可以使用示波器來測試CANTX引腳上的波形的波特率,這樣可以得到事半功倍的效果,大大的縮短調(diào)試學(xué)習(xí)的時間。//***************************************************************//BaudRate=1/NominalBitTime//NominalBitTime=1tq+tBS1+tBS2//tq=<BRP[9:0]+1>xtPCLK//tPCLK=CAN'sclock=APB1'sclock//****************************************************************也就是BaudRate=APB1/<<BS1+BS2+1>*Prescaler>這里注意的是采用點的位置,也就時BS1,BS2的設(shè)置問題,這里我也找了一些資料,抄錄下來給大家,是CANopen協(xié)議中推薦的設(shè)置。1Mbps速率下,采用點的位置在6tq位置處,BS1=5,BS2=2500kbps速率下,采用點的位置在8tq位置處,BS1=7,BS2=3250kbps速率下,采用點的位置在14tq位置處,BS1=13,BS2=2125k,100k,50k,20k,10k的采用點位置與250K相同。因此我們需要重視的有軟件中的這么幾個部分://設(shè)置AHB時鐘〔HCLK//RCC_SYSCLK_Div1AHB時鐘=系統(tǒng)時鐘RCC_HCLKConfig<RCC_SYSCLK_Div8>;//設(shè)置低速AHB時鐘〔PCLK1//RCC_HCLK_Div2APB1時鐘=HCLK/2RCC_PCLK1Config<RCC_HCLK_Div2>;//PLLCLK=8MHz*8=64MHz//設(shè)置PLL時鐘源及倍頻系數(shù)RCC_PLLConfig<RCC_PLLSource_HSE_Div1,RCC_PLLMul_8>;CAN波特率設(shè)置中需要的就是PCLK1的時鐘。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;通過上面部分的時鐘設(shè)置我們已經(jīng)可以算出我們的波特率了CAN_bps=PCLK1/<<1+7+8>*5>=25Kbps大家也可以實際測試中修改時鐘值來通過示波器測試我們需要的波特率是否正確例如將PLLCLK設(shè)置降低一半://PLLCLK=8MHz*4=32MHz//設(shè)置PLL時鐘源及倍頻系數(shù)RCC_PLLConfig<RCC_PLLSource_HSE_Div1,RCC_PLLMul_4>;那么我們得到的CAN_bps也會降低一半。接下來還可以修改HCLK和PCLK1,其實最終這幾個分頻和倍頻值最終影響的都是PCLK1。通過幾次試驗,相信大家應(yīng)該很容易掌握波特率的設(shè)置了。設(shè)置完波特率我們直接測試函數(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)用出來.大家可以仿真程序,當(dāng)程序中Test等于Passed那么說明Loopback模式測試通過了。并且在CAN通訊框中我們可以看到發(fā)送和接收到的數(shù)據(jù):回循模式下的源代碼,基于MDK3.5:Example7.1-CANLoopBackMode.rar<493.79KB>到此時說明如果大家只有一塊CAN模塊的時候?qū)W習(xí)可以告一個段落了,不過這個并不代表大家就已經(jīng)掌握了CAN了,正真要掌握它,大家還是需要看大量的CAN部分的資料,參考手冊部分的也是不夠的,市面上有幾本專門介紹現(xiàn)場總線和CAN總線的書,推薦大家買來經(jīng)常翻翻看看,這樣到需要實際應(yīng)用的時候才可以做到如魚得水。<五>正常模式完成了loopback模式的測試之后接下來我們需要學(xué)習(xí)的就是多機(jī)通訊了,當(dāng)然由于我們的Mini-STM32沒有將CAN接口引出來,所以我們沒有辦法在板子上面做這部分的試驗了,只能在RealViewMDK的軟件中進(jìn)行模擬。如果您擁有兩塊帶CAN硬件的STM32的板子,您需要自己構(gòu)建硬件的物理層的連接,使用三根線將CANH,CANL,GND三根線直連,當(dāng)然你要接好終端電阻才能保證通訊的正常通訊,當(dāng)兩塊板子都跳好后我們使用萬用表測量下CANH和CANL之間的電阻是否為60歐姆。多塊板子多機(jī)通訊的是否你只需要在總線的主機(jī)端和最后一端接上終端電阻就可以了.在初始化完成后,軟件應(yīng)該讓硬件進(jìn)入正常模式,以便正常接收和發(fā)送報文。軟件可以通過對CAN_MCR寄存器的INRQ位清'0',來請求從初始化模式進(jìn)入正常模式,然后要等待硬件對CAN_MSR寄存器的INAK位置'1'的確認(rèn)。在跟CAN總線取得同步,即在CANRX引腳上監(jiān)測到11個連續(xù)的隱性位<等效于總線空閑>后,bxCAN才能正常接收和發(fā)送報文。不需要在初始化模式下進(jìn)行過濾器初值的設(shè)置,但必須在它處在非激活狀態(tài)下完成<相應(yīng)的FACT位為'0'>。而過濾器的位寬和模式的設(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;接下來我們就可以做實驗了.但是由于RealViewMDK的CAN模塊沒有辦法接收,所以我們只做發(fā)送的例子.我們的例子中分別發(fā)送兩幀數(shù)據(jù):<1>TestStatusCAN_Polling<void>查詢發(fā)送第一幀數(shù)據(jù)為:ID為0x11,數(shù)據(jù)為8個字節(jié)的一個數(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個字節(jié)的一個數(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<>;程序改完了,我們需要編譯通過后,點軟件仿真.將CAN軟件仿真模擬器調(diào)用出來.接下來我們?nèi)龠\行到while<1>就可以看到結(jié)果了.正常模式下的源代碼,基于MDK3.5:Example7.2-CANNormalMode.rar<488.73KB>我們的CAN這部份的教程就結(jié)束了哦.<八>UniqueDeviceID每一片STM32芯片內(nèi)部擁有一個獨一無二的UniqueDeviceID,96Bit.這個ID號可以提供給開發(fā)者很多優(yōu)越的功能,例如:1.可以把ID做為用戶最終產(chǎn)品的序列號,幫助用戶進(jìn)行產(chǎn)品的管理。2.在某些需要保證安全性的功能代碼運行前,通過校驗此ID,保證最終產(chǎn)品的某些功能的安全性。3.用ID配合加解密算法,對芯片內(nèi)部的代碼進(jìn)行加加密,以保證用戶產(chǎn)品的安全性和不可復(fù)制性。這項功能相信對那些不希望自己的產(chǎn)品不被別人抄襲來說肯定是個非常不錯的。下面我就先大家介紹如何讀出這個ID:這個ID號是放在片內(nèi)Flash中的固定的位置,直接讀取出來就行了.96位的獨特ID位于地址0x1FFFF7E8~0x1FFFF7F4的系統(tǒng)存儲區(qū),由ST公司在工廠中寫入<用戶不能修改>用戶可以以字節(jié)、半字、或字的方式單獨讀取其間的任一地址.<一>配置好串口,用于調(diào)試演示,這一部份前面的章節(jié)我們已經(jīng)介紹過了.可以參考貼子:[原創(chuàng)]MINI-STM32開發(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通過ULINK2仿真器連接實驗板,使用MINI-STM32開發(fā)板附帶的串口線,連接實驗板上的UART1和PC機(jī)的串口,打開實驗例程目錄下的ADC.Uv2例程,編譯鏈接工程;<2>在PC機(jī)上運行windows自帶的超級終端串口通信程序〔波特率115200、1位停止位、無校驗位、無硬件流控制;或者使用其它串口通信程序;<3>點擊MDK的Debug菜單,點擊Start/StopDebugSession;<4>全速運行程序,顯示結(jié)果如下所示。麥思網(wǎng)原創(chuàng)教程MINI-STM32STM32F103RBT6UniqueDeviceID:066C00333235395843195835備注:其中最后一行的數(shù)字就是我的MINI-STM32開發(fā)板中STM32F103RBT6的UniqueDeviceID.您的ID當(dāng)然肯定會和我的不一樣哦.<九>內(nèi)部溫度傳感器<一>STM32內(nèi)部溫度傳感器概要STM32芯片內(nèi)部一項獨特的功能就是內(nèi)部集成了一個溫度傳感器,因為是內(nèi)置,所以測試的是芯片內(nèi)部的溫度,如果芯片外接負(fù)載一定的情況下,那么芯片的發(fā)熱也基本穩(wěn)定,相對于外界的溫度而言,這個偏差值也是基本穩(wěn)定的.也就是說用STM32內(nèi)部傳感器來測量外界環(huán)境的溫度.在一些惡劣的應(yīng)用環(huán)境下面,可以通過檢測芯片內(nèi)部而感知設(shè)備的工作環(huán)境溫度,如果溫度過高或者過低了則馬上睡眠或者停止運轉(zhuǎn).可以保證您的設(shè)備工作的可靠性.1.STM32內(nèi)部溫度傳感器與ADC的通道16相連,與ADC配合使用實現(xiàn)溫度測量;2.測量范圍–40~125℃,精度±1.5℃。3.溫度傳感器產(chǎn)生一個隨溫度線性變化的電壓,轉(zhuǎn)換范圍在2V<VDDA<3.6V之間。轉(zhuǎn)換公式如下圖所示:手冊中對于公式中的參數(shù)說明:<二>程序編寫寫代碼的時候,在測量要求不怎么高的情況下,公式可以簡化.簡化的公式:Temperature=<1.42-ADC_Value*3.3/4096>*1000/4.35+25;程序編寫:1.初始化ADC,初始化DMA可以參考貼子:[原創(chuàng)]MINI-STM32開發(fā)板入門教程<六>基于DMA的ADC主意:內(nèi)部溫度傳感器是使用了ADC1的第16通道哦.2.ADC_TempSensorVrefintCmd<ENABLE>;使能溫度傳感器和內(nèi)部參考電壓通道3.按照剛才列出的公式計算Temperature=<1.42-ADC_Value*3.3/4096>*1000/4.35+25;第二步是做什么的呢?參考下圖:<三>仿真調(diào)試<1>使用KeiluVision3通過ULINK2仿真器連接實驗板,使用MINI-STM32開發(fā)板附帶的串口線,連接實驗板上的UART1和PC機(jī)的串口,打開實驗例程目錄下的ADC.Uv2例程,編譯鏈接工程;<2>在PC機(jī)上運行windows自帶的超級終端串口通信程序〔波特率115200、1位停止位、無校驗位、無硬件流控制;或者使用其它串口通信程序;<3>點擊MDK的Debug菜單,點擊Start/StopDebugSession;<4>全速運行程序,顯示結(jié)果如下所示。<十>RTC實時時鐘<一>STM32RTC實時時鐘概要STM32內(nèi)部RTC功能非常實用,它的供電和時鐘是獨立于內(nèi)核的,可以說是STM32內(nèi)部獨立的外設(shè)模塊,有加上RTC內(nèi)部寄存器不受系統(tǒng)復(fù)位掉電的影響,我們可以才用外部電池供電和32768表振晶體來實現(xiàn)真正RTC〔實時時鐘功能。這里引用手冊里一段概述:RTC由兩個主要部分組成。第一部分〔APB1接口用來和APB1總線相連。此單元還包含一組16位寄存器,可通過APB1總線對其進(jìn)行讀寫操作。APB1接口以APB1總線時鐘為時鐘,用來與APB1總線接口。另一部分〔RTC核由一系列可編程計數(shù)器組成,分成兩個主要模塊。第一個模塊是RTC的預(yù)分頻模塊,它可編程產(chǎn)生最長為1秒的RTC時間基準(zhǔn)TR_CLK。RTC的預(yù)分頻模塊包含了一個20位的可編程分頻器〔RTC預(yù)分頻器。在每個TR_CLK周期中,如果在RTC_CR寄存器中設(shè)置了相應(yīng)允許位,則RTC產(chǎn)生一個中斷〔秒中斷。第2個模塊是一個32位的可編程的計數(shù)器,它可被初始化為當(dāng)前的系統(tǒng)時間。系統(tǒng)時間以TR_CLK速度增長并與存儲在RTC_ALR寄存器中的可編程的時間相比較,如果RTC_CR控制寄存器中設(shè)置了相應(yīng)允許位,則比較匹配時將產(chǎn)生一個鬧鐘中斷。<二

溫馨提示

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

評論

0/150

提交評論