




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
課程教案專業(yè)名稱:智能控制技術(shù)課程名稱:嵌入式系統(tǒng)項(xiàng)目實(shí)訓(xùn)B學(xué)時(shí)/學(xué)分:32學(xué)時(shí)授課對(duì)象:2023級(jí)任課教師:院部:2024年9月授課內(nèi)容項(xiàng)目一、MDK-ARM軟件安裝及設(shè)置授課專業(yè)智能控制技術(shù)專業(yè)課程性質(zhì)實(shí)踐授課班級(jí)與學(xué)時(shí)2022級(jí)智能控制1、2、3班(實(shí)踐:4學(xué)時(shí))教學(xué)目標(biāo)與要求1、學(xué)習(xí)MDK473軟件的安裝及注冊(cè);2、熟悉Keil軟件的編譯環(huán)境與使用方法;3、固件庫(kù)FWLibV3.5的結(jié)構(gòu);4、新建項(xiàng)目工程;5、工程環(huán)境設(shè)置;教學(xué)重點(diǎn)軟件安裝使用教學(xué)難點(diǎn)軟件的配置。教學(xué)方法1、以案例演示和實(shí)物展示法為主,實(shí)際操作引導(dǎo)學(xué)生。2、使用多媒體手段進(jìn)行教學(xué)。作業(yè)布置1、學(xué)生自己完成軟件安裝?2、完成軟件的配置?參考資料《嵌入式系統(tǒng)項(xiàng)目實(shí)訓(xùn)指導(dǎo)書》教學(xué)后記讓學(xué)生進(jìn)行了編譯軟件的安裝,有些學(xué)生能根據(jù)步驟,完成軟件及驅(qū)動(dòng)程序的安裝設(shè)置,有些同學(xué)根據(jù)未完成,未完成的同學(xué)課后必須要完成軟件安裝。教學(xué)設(shè)計(jì)內(nèi)容備注與后記1實(shí)驗(yàn)內(nèi)容本實(shí)驗(yàn)實(shí)現(xiàn)STM32F1系列開(kāi)發(fā)軟件的安裝及環(huán)境的配置,并且在此基礎(chǔ)上進(jìn)行標(biāo)準(zhǔn)庫(kù)的工程模板的創(chuàng)建。1.1MDK-ARM4.73軟件安裝考慮到國(guó)信長(zhǎng)天嵌入式競(jìng)賽實(shí)訓(xùn)平臺(tái)(CT1117E)上的Coocox調(diào)試器只能在MDK-ARMV4.xx環(huán)境下工作,本書以MDK-ARM4.73為例,進(jìn)行軟件安裝。右擊以管理員身份運(yùn)行軟件MDK473.exe,進(jìn)行軟件安裝,如圖1.1所示。圖1.1安裝快捷鍵出現(xiàn)下圖界面,點(diǎn)擊“Next”進(jìn)行軟件安裝,如圖1.2所示。圖1.2安裝界面勾選接受,點(diǎn)擊“Next”進(jìn)入下一步,如圖1.3所示。圖1.3安裝同意界面安裝軟件顯示如下,要求輸入用戶的信息,輸入后點(diǎn)擊“Next”,如圖1.4所示。圖1.4填寫界面點(diǎn)擊“Next”,等待安裝完成,點(diǎn)擊“Finish”結(jié)束安裝,如圖1.5所示。圖1.5安裝結(jié)束界面1.2MDK軟件的注冊(cè)點(diǎn)擊桌面的Keil快捷鍵,運(yùn)行編譯環(huán)境,如圖1.6所示。圖1.6快捷菜單需要注意,試用版有32K編譯程序代碼的限制,因此我們要進(jìn)行軟件的注冊(cè),否則如果超過(guò)代碼的限制后,編譯的文件會(huì)存在問(wèn)題。運(yùn)行MDK,然后打開(kāi)“File”的“LicenseManagement”,進(jìn)行軟件的注冊(cè),如圖1.7所示。圖1.7拷貝CID號(hào)1.3Coocox調(diào)試仿真驅(qū)動(dòng)器的安裝使用國(guó)信長(zhǎng)天嵌入式競(jìng)賽實(shí)訓(xùn)平臺(tái),因板載有Coocox調(diào)試器,需要安裝調(diào)試器驅(qū)動(dòng)程序和調(diào)試器插件程序,并且需要對(duì)調(diào)試器進(jìn)行設(shè)置。安裝調(diào)試器驅(qū)動(dòng)程序:實(shí)驗(yàn)平臺(tái)使用雙USBUART轉(zhuǎn)換芯片F(xiàn)T2232D作為板載調(diào)試器轉(zhuǎn)接芯片,將實(shí)訓(xùn)平臺(tái)通過(guò)調(diào)試器USB插座CN2與PC相連,PC提示安裝FT2232驅(qū)動(dòng)程序,安裝完成后顯示驅(qū)動(dòng)程序軟件安裝對(duì)話框,如圖1.8所示。圖1.8FT2232驅(qū)動(dòng)程序 設(shè)備管理器中出現(xiàn)USB設(shè)備USBSerialConverterA/B和COM端口USBSerialPort(COM22),不同的PC設(shè)備號(hào)可能不同,如圖1.9所示。圖1.9FT2232驅(qū)動(dòng)USB串口號(hào)注意:記住COM端口號(hào),后面的串行通信實(shí)驗(yàn)要用到。如第一次插入開(kāi)發(fā)板,沒(méi)有彈出驅(qū)動(dòng)安裝界面,也可使用手動(dòng)安裝驅(qū)動(dòng)的方式,在設(shè)備驅(qū)動(dòng)查找位置,找到FT2232驅(qū)動(dòng)文件夾,在此文件夾中自動(dòng)進(jìn)行驅(qū)動(dòng)程序安裝。安裝調(diào)試器插件程序:運(yùn)行調(diào)試器Keil插件安裝程序CoMDKPlugin-1.3.1.exe,將插件程序安裝到Keil的安裝文件夾如C:\Keil。仿真器軟件安裝文件如圖1.10所示。圖1.10仿真器驅(qū)動(dòng)在進(jìn)行下面的調(diào)試器配置之前,先完成新建一個(gè)空白項(xiàng)目,詳見(jiàn)1.2.5小節(jié)。之后在Keil中打開(kāi)新建的工程,單擊生成工具欄中的”TargetOption”按鍵,打開(kāi)目標(biāo)選項(xiàng)對(duì)話框,選擇“Debug”標(biāo)簽,選擇“Use”調(diào)試器并從下拉列表中選擇“CooCoxDebugger”(如果沒(méi)有CooCoxDebugger,需重新安裝調(diào)試器插件程序),選中“Runtomain()”選項(xiàng),如圖1.11所示。圖1.11Keil調(diào)試設(shè)置單擊“Settings”按鍵打開(kāi)驅(qū)動(dòng)設(shè)置對(duì)話框,確認(rèn)“Debug”標(biāo)簽中的“Adapter”為Colink,“Potr”為JTAG,“IDCODE”及“DeviceName”能識(shí)讀到數(shù)據(jù),如圖1.12所示。圖1.12JTAG識(shí)別選擇“FlashDownload”標(biāo)簽,單擊“Add”按鈕打開(kāi)“AddProgrammingAlgorithm”對(duì)話框,選擇“STM32F10xMed-densityFlash”,如圖1.13所示。圖1.13程序下載微控制器1.4固件庫(kù)FWLibV3.5分析固件庫(kù)FWLibV3.5結(jié)構(gòu)如下圖1.14所示。圖1.14固件庫(kù)FWLibV3.5結(jié)構(gòu)Libraries文件夾下面有CMSIS和STM32F10x_StdPeriph_Driver兩個(gè)目錄,包含驅(qū)動(dòng)庫(kù)的源代碼及啟動(dòng)文件。CMSIS文件夾存放的是符合CMSIS規(guī)范的一些文件。包括STM32F1核內(nèi)外設(shè)訪問(wèn)層代碼,RTOSAPI,以及STM32F1片上外設(shè)訪問(wèn)層代碼等。STM32F10x_StdPeriph_Driver放的是STM32F1標(biāo)準(zhǔn)外設(shè)固件庫(kù)源碼文件和對(duì)應(yīng)的頭文件。inc目錄存放的是stm32f10x_ppp.h頭文件,無(wú)需改動(dòng)。src目錄下面放的stm32f10x_ppp.c格式的固件庫(kù)源碼文件。每一個(gè).c文件和一個(gè)相應(yīng)的.h文件對(duì)應(yīng)。Project文件夾:STM32F10x_StdPeriph_Examples文件夾中存放的是ST官方提供的固件實(shí)例源碼,STM32F10x_StdPeriph_Template文件夾中存放的是工程模板。Utilities文件下就是官方評(píng)估板的一些對(duì)應(yīng)源碼。stm32f10x_stdperiph_lib_um.chm文件是固件庫(kù)的幫助文檔,主要講的是如何使用驅(qū)動(dòng)庫(kù)來(lái)編寫自己的應(yīng)用程序。1.5新建項(xiàng)目工程打開(kāi)MDK軟件上,選擇Project-NewUVisionProject菜單項(xiàng),則彈出如圖1.15所示保存工程界面。圖1.15新建工程項(xiàng)目在上面界面上給新項(xiàng)目工程命名,并單擊“保存”按鈕,則彈出器件選擇對(duì)話框,因?yàn)樗{(lán)橋杯嵌入式開(kāi)發(fā)板使用的MCU為STM32F103RB,所以選擇STMicroelectronics下面的STM32F103RB,如圖1.16所示。圖1.16項(xiàng)目工程微控制器選擇單擊“OK”按鈕,則MDK彈出一個(gè)如下對(duì)話框,詢問(wèn)用戶是否加載啟動(dòng)代碼到當(dāng)前工程里面。若需要,則選擇是,本例中選擇否,完成以上步驟后,新建工程如圖1.17所示。圖1.17啟動(dòng)文件選擇經(jīng)過(guò)以上操作后,新建工程如圖1.18所示。圖1.18創(chuàng)建工程1.6工程環(huán)境配置打開(kāi)test1文件夾的項(xiàng)目工程,這是一個(gè)模板項(xiàng)目工程,打開(kāi)項(xiàng)目后,可以點(diǎn)擊“編譯”按鈕,對(duì)所建立的工程進(jìn)行編譯,編譯結(jié)果如圖1.19所示。圖1.19創(chuàng)建工程產(chǎn)生HEX文件。單擊Output標(biāo)簽,打開(kāi)Output選項(xiàng)卡,按照下圖所示勾選“CreatHEXFile”方框,這樣在編譯完成沒(méi)有錯(cuò)誤的情況下就可以生成STM32單片機(jī)的可執(zhí)行文件格式,即.hex格式,選擇目標(biāo)文件(Object)輸出的文件夾路徑,點(diǎn)擊“SelectFolderforObjects….”進(jìn)行目標(biāo)文件輸出文件夾路徑添加,如圖1.20所示。圖1.20工程配置選擇列表文件(Listing)輸出的文件夾路徑。單擊“Listing”標(biāo)簽,在Listing選項(xiàng)中,添加目標(biāo)文件輸出文件夾路徑,如圖1.21所示。圖1.21工程配置C/C++選項(xiàng)卡設(shè)置。單擊C/C++標(biāo)簽,在C/C++選項(xiàng)卡的Define文件框中輸入代碼STM32F10X_MD,USE_STDPERIPH_DRIVER,如圖1.22所示。圖1.22C/C++選項(xiàng)卡設(shè)置添加頭文件路徑路徑,按照下圖所示添加相關(guān)頭文件路徑,否則編寫程序時(shí)會(huì)出現(xiàn)錯(cuò)誤提示,如圖1.23所示。圖1.23添加頭文件路徑至此,一個(gè)完整的STM32開(kāi)發(fā)工程在MDK下建立完成,接下來(lái)就可以進(jìn)行代碼下載和仿真調(diào)試了。授課內(nèi)容項(xiàng)目二:GPIO端口控制授課專業(yè)智能控制技術(shù)課程性質(zhì)實(shí)踐授課班級(jí)與學(xué)時(shí)2022級(jí)智能控制1、2、3班(實(shí)踐:4學(xué)時(shí))教學(xué)目標(biāo)與要求1、熟練掌握在工程項(xiàng)目中,對(duì)標(biāo)準(zhǔn)庫(kù)函數(shù)驅(qū)動(dòng)的調(diào)用;2、掌握STM32F1的GPIO驅(qū)動(dòng)相關(guān)的標(biāo)準(zhǔn)庫(kù)函數(shù);3、掌握藍(lán)橋杯開(kāi)發(fā)板的LED燈硬件電路及控制方式;4、學(xué)習(xí)課程中嘀答定時(shí)器使用;教學(xué)重點(diǎn)掌握STM32F1的GPIO驅(qū)動(dòng)相關(guān)的標(biāo)準(zhǔn)庫(kù)函數(shù);教學(xué)難點(diǎn)掌握藍(lán)橋杯開(kāi)發(fā)板的LED燈硬件電路及控制方式;教學(xué)方法1、以案例演示和實(shí)物展示法為主,實(shí)際操作引導(dǎo)學(xué)生。2、使用多媒體手段進(jìn)行教學(xué)。作業(yè)布置1、組建項(xiàng)目工程,進(jìn)行程序編寫,實(shí)現(xiàn)要求功能。2、熟練掌握GPIO標(biāo)準(zhǔn)庫(kù)的輸出驅(qū)動(dòng)程序編寫。3、掌握74HC573鎖存器的驅(qū)動(dòng)程序設(shè)計(jì)。4、掌握硬件仿真調(diào)試方法。5、自行進(jìn)行程序設(shè)計(jì),實(shí)現(xiàn)8個(gè)LED燈流水燈功能。參考資料《STM32F1開(kāi)發(fā)標(biāo)準(zhǔn)教程》教學(xué)后記引導(dǎo)學(xué)生使用固件庫(kù)方式,完成第一個(gè)端口控制程序的安裝調(diào)試,同學(xué)第一次進(jìn)行硬件程序設(shè)計(jì),興趣很高,但成功率并不高,要加強(qiáng)課后的復(fù)習(xí)。教學(xué)設(shè)計(jì)內(nèi)容備注與后記1、實(shí)現(xiàn)內(nèi)容本實(shí)驗(yàn)運(yùn)用STM32F1的GPIO端口進(jìn)行輸出控制功能,完成LED燈的閃爍控制。1.1標(biāo)準(zhǔn)項(xiàng)目目錄結(jié)構(gòu)首先把實(shí)驗(yàn)1的項(xiàng)目工程打開(kāi),如圖2.1所示。圖2.1項(xiàng)目工程接下來(lái)逐一講解一下工程目錄下面的組以及重要文件。組Startup下面存放的主要是啟動(dòng)文件及標(biāo)準(zhǔn)庫(kù)函數(shù)的配置文件。啟動(dòng)文件在正常情況下不需要修改,配置文件可根據(jù)使用的標(biāo)準(zhǔn)庫(kù)驅(qū)動(dòng)外設(shè)來(lái)進(jìn)行.h文件的包含。組CMSIS組下面存放了ARM核心文件及system_stm32f10x.c文件,核心文件不需要修改,system_stm32f10x.c文件里面主要是系統(tǒng)時(shí)鐘初始化函數(shù)的相關(guān)定義,一般情況下也不需要用戶進(jìn)行修改。組Library下面存放的是ST官方提供的外設(shè)驅(qū)動(dòng)固件庫(kù)文件,這些文件大家可以根據(jù)工程需要來(lái)添加和刪除。每個(gè)stm32f10x_ppp.c源文件對(duì)應(yīng)一個(gè)stm32f10x_ppp.h頭文件。組BSP_Driver里,用來(lái)存放實(shí)驗(yàn)用到的外設(shè)驅(qū)動(dòng)代碼,他們實(shí)現(xiàn)是通過(guò)調(diào)用Library下面的固件庫(kù)文件實(shí)現(xiàn)的,從本實(shí)驗(yàn)開(kāi)始,慢慢增加各外設(shè)的驅(qū)動(dòng)文件的編寫。組User中,用來(lái)存放主程序,根據(jù)功能要求,編寫的主程序在此目錄下存放。除此之外,stm32f10x_it.c里面存放的部分中斷服務(wù)函數(shù),也一并存放在此目錄中。1.2GPIO固件庫(kù)的函數(shù)使用標(biāo)準(zhǔn)庫(kù)進(jìn)行驅(qū)動(dòng)程序編寫時(shí),首先要理解ST官方外設(shè)驅(qū)動(dòng)庫(kù)文件。在此要使用到GPIO外設(shè)端口,所以在組Library下,必須導(dǎo)入stm32f10x_gpio.c驅(qū)動(dòng)。GPIO_Init函數(shù)說(shuō)明如圖2.2所示。圖2.2GPIO_Init庫(kù)函數(shù)說(shuō)明GPIO_Init函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)用來(lái)指定GPIO,取值范圍為GPIOA~GPIOG。第二個(gè)參數(shù)為初始化參數(shù)結(jié)構(gòu)體指針,結(jié)構(gòu)體類型為GPIO_InitTypeDef??纯碐PIO_InitTypeDef結(jié)構(gòu)體的定義。首先打開(kāi)項(xiàng)目工程,然后找到stm32f10x_gpio.h文件下,可以查看到結(jié)構(gòu)體的定義: typedefstruct{ uint16_tGPIO_Pin; GPIOSpeed_TypeDefGPIO_Speed; GPIOMode_TypeDefGPIO_Mode;}GPIO_InitTypeDef;GPIO_Pin:該參數(shù)選擇待設(shè)置的GPIO管腳位,其取值范圍如下:#defineGPIO_Pin_0((uint16_t)0x0001)/*!<Pin0selected*/#defineGPIO_Pin_1((uint16_t)0x0002)/*!<Pin1selected*/#defineGPIO_Pin_2((uint16_t)0x0004)/*!<Pin2selected*/#defineGPIO_Pin_3((uint16_t)0x0008)/*!<Pin3selected*/#defineGPIO_Pin_4((uint16_t)0x0010)/*!<Pin4selected*/#defineGPIO_Pin_5((uint16_t)0x0020)/*!<Pin5selected*/#defineGPIO_Pin_6((uint16_t)0x0040)/*!<Pin6selected*/#defineGPIO_Pin_7((uint16_t)0x0080)/*!<Pin7selected*/#defineGPIO_Pin_8((uint16_t)0x0100)/*!<Pin8selected*/#defineGPIO_Pin_9((uint16_t)0x0200)/*!<Pin9selected*/#defineGPIO_Pin_10((uint16_t)0x0400)/*!<Pin10selected*/#defineGPIO_Pin_11((uint16_t)0x0800)/*!<Pin11selected*/#defineGPIO_Pin_12((uint16_t)0x1000)/*!<Pin12selected*/#defineGPIO_Pin_13((uint16_t)0x2000)/*!<Pin13selected*/#defineGPIO_Pin_14((uint16_t)0x4000)/*!<Pin14selected*/#defineGPIO_Pin_15((uint16_t)0x8000)/*!<Pin15selected*/#defineGPIO_Pin_All((uint16_t)0xFFFF)/*!<Allpinsselected*/GPIO_Speed:當(dāng)IO口作為輸出時(shí),最高工作的速度選擇,參數(shù)范圍如下:typedefenum{GPIO_Speed_10MHz=1,GPIO_Speed_2MHz,GPIO_Speed_50MHz}GPIOSpeed_TypeDef;TypeDefGPIO_Mode:進(jìn)行IO端口的工作模式選擇:typedefenum{GPIO_Mode_AIN=0x0,GPIO_Mode_IN_FLOATING=0x04,GPIO_Mode_IPD=0x28,GPIO_Mode_IPU=0x48,GPIO_Mode_Out_OD=0x14,GPIO_Mode_Out_PP=0x10,GPIO_Mode_AF_OD=0x1C,GPIO_Mode_AF_PP=0x18}GPIOMode_TypeDef;STM32F系列芯片的I/O口可以有8種工作模式,包括4種輸入和4種輸出,每一個(gè)I/O口只能選擇這8種狀態(tài)中的一種。GPIO庫(kù)函數(shù)其他功能函數(shù)請(qǐng)參考《STM32固件庫(kù)使用手冊(cè)V3.5》。RCC_APB2PeriphClokcCmd函數(shù)功能是對(duì)掛載在APB2系統(tǒng)總線上的外部設(shè)備,進(jìn)行時(shí)鐘的使能,如圖2.3所示。圖2.3RCC_APB2PeriphClokcCmd庫(kù)函數(shù)說(shuō)明掛載在APB2上的外部設(shè)備如圖2.4所示。圖2.4APB2上的外部設(shè)備1.3LED原理分析 LED的驅(qū)動(dòng)電路圖如圖2.5所示。圖2.5LED驅(qū)動(dòng)電路圖2.5中,H_D0~H_D7與PC8~PC15,NLE~PD2經(jīng)過(guò)J1、J2插針跳線連接起來(lái),MCU的輸出口與LED驅(qū)動(dòng)的鎖存器輸入相連接,要控制LED燈,還必須進(jìn)行74HC573芯片的控制。實(shí)訓(xùn)平臺(tái)上的8個(gè)LED指示燈LD1~LD8通過(guò)鎖存器分別與PC8~PC15相連,低電平時(shí)LED亮,高電平時(shí)LED滅。鎖存器的使能端與PD2相連,低電平時(shí)鎖存數(shù)據(jù)(鎖存器輸出不隨輸入變化),高電平時(shí)不鎖存數(shù)據(jù)(鎖存器輸出隨輸入變化)。1.4軟件程序設(shè)計(jì)進(jìn)行LED控制的MCU對(duì)應(yīng)端口初始化,參考程序如下:voidLED_Init(void){GPIO_InitTypeDefGPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|\GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|\GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOC,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;GPIO_Init(GPIOD,&GPIO_InitStruct); }進(jìn)行74HC573并行鎖存芯片的驅(qū)動(dòng)程序,參考如下:每次進(jìn)行了顯示值的賦值后,再進(jìn)行鎖存位的使能。voidLED_Disp(unsignedcharucLed){GPIO_Write(GPIOC,~ucLed<<8);GPIO_SetBits(GPIOD,GPIO_Pin_2);GPIO_ResetBits(GPIOD,GPIO_Pin_2); }主程序中,只需要使用上面編寫好的驅(qū)動(dòng),先進(jìn)行控制端口的初始化操作,再使用課程中講過(guò)的SysTick定時(shí)器,產(chǎn)生1S的精準(zhǔn)延時(shí),最后進(jìn)行LED燈閃爍驅(qū)動(dòng)設(shè)置,就能實(shí)現(xiàn)本實(shí)驗(yàn)功能的要求,主要程序參考如下:if((delay_ms>=1000)&&(delay_ms<2000)) { LED_Disp(0); } elseif(delay_ms>=2000) { LED_Disp(0xff); delay_ms=0; }1.5效果驗(yàn)證根據(jù)上面的講述,完成整體程序的實(shí)現(xiàn),最后進(jìn)行編譯無(wú)錯(cuò)誤、警告后,連接好仿真接口USB與電腦的USB口之間的仿真線,再在Keil軟件中,進(jìn)入硬件仿真狀態(tài)配置。(配置好工程的硬件仿真相關(guān)設(shè)置),如圖2.6所示,連接好硬件設(shè)備。授課內(nèi)容項(xiàng)目三:NVIC外部中斷授課專業(yè)智能控制技術(shù)課程性質(zhì)實(shí)踐授課班級(jí)與學(xué)時(shí)2022級(jí)智能控制1、2、3班(實(shí)踐:4學(xué)時(shí))教學(xué)目標(biāo)與要求1、掌握外部按鍵中斷功能實(shí)現(xiàn);2、掌握采用中斷實(shí)現(xiàn)原理,巧用中斷程序?qū)ν獠渴录M(jìn)行處理;3、熟練學(xué)習(xí)中斷優(yōu)先級(jí)和外部中斷的使用方法;4、掌握使用標(biāo)準(zhǔn)庫(kù)開(kāi)啟和關(guān)閉中斷,能正確初始化中斷。教學(xué)重點(diǎn)掌握采用中斷實(shí)現(xiàn)原理,巧用中斷程序?qū)ν獠渴录M(jìn)行處理;教學(xué)難點(diǎn)熟練學(xué)習(xí)中斷優(yōu)先級(jí)和外部中斷的使用方法;教學(xué)方法1、以案例演示和實(shí)物展示法為主,實(shí)際操作引導(dǎo)學(xué)生。2、使用多媒體手段進(jìn)行教學(xué)。作業(yè)布置1、進(jìn)行外部按鍵的中斷實(shí)現(xiàn),完成整個(gè)工程項(xiàng)目。2、熟練掌握外部中斷、中斷觸發(fā)方式、通道使能、中斷或事件模式設(shè)置。3、掌握NVIC中斷通道的連接,如何配置優(yōu)先級(jí)。4、掌握搶占優(yōu)先級(jí)及亞優(yōu)級(jí)的功能及作用。參考資料《STM32F1開(kāi)發(fā)標(biāo)準(zhǔn)教程》教學(xué)后記學(xué)生去理解中斷的使用,特別是外部中斷,進(jìn)行外部功能的設(shè)置;但很多學(xué)生還是不理解中斷及外部輸入方式的本質(zhì)區(qū)別,多進(jìn)行理論知識(shí)的學(xué)習(xí)。教學(xué)設(shè)計(jì)內(nèi)容備注與后記1.實(shí)驗(yàn)內(nèi)容本實(shí)驗(yàn)運(yùn)用外部獨(dú)立按鍵的中斷檢測(cè)功能,進(jìn)行按鍵分別控制LED1-LED4的點(diǎn)亮功能實(shí)現(xiàn)。1.1嵌套向量中斷控制器前面幾個(gè)實(shí)驗(yàn)介紹了STM32GPIO的基本輸入輸出,本次我們介紹STM32嵌入式系統(tǒng)的中斷控制器。STM32F的每個(gè)IO口都可以作為中斷輸入,在使用中斷之前要對(duì)系統(tǒng)向量中斷控制器進(jìn)行設(shè)定。嵌套向量中斷控制器簡(jiǎn)稱NVIC,是Cortex-M3不可分割的一部分,它與Cortex-M3內(nèi)核的邏輯緊密耦合,有一部分甚至交融在一起。NVIC與Cortex-M3內(nèi)核相輔相成、里應(yīng)外合,共同完成對(duì)中斷的響應(yīng)。NVIC管理核異常等中斷,其有以下特點(diǎn):-60個(gè)可屏蔽中斷通道(不包含16個(gè)Cortex-M3的中斷線);-16個(gè)可編程的優(yōu)先等級(jí)(使用了4位中斷優(yōu)先級(jí));-低延遲的異常和中斷處理; -電源管理控制; -系統(tǒng)控制寄存器的實(shí)現(xiàn)。STM32(Cortex-M3)中有兩個(gè)優(yōu)先級(jí)的概念——搶占優(yōu)先級(jí)和亞優(yōu)先級(jí)。有人把亞優(yōu)先級(jí)稱作響應(yīng)優(yōu)先級(jí)或副優(yōu)先級(jí)。每個(gè)中斷源都需要指定這兩種優(yōu)先級(jí)。 第0組:所有4位用于指定亞優(yōu)級(jí)。 第1組:最高1位用于指定搶占優(yōu)先級(jí),最低3位用于指定亞優(yōu)先級(jí)。 第2組:最高2位用于指定搶占優(yōu)先級(jí),最低2位用于指定亞優(yōu)先級(jí)。第3組:最高3位用于指定搶占優(yōu)先級(jí),最低1位用于指定亞優(yōu)先級(jí)。 第4組:所有4位用于指定搶占優(yōu)先級(jí)。 可以通過(guò)調(diào)用STM32的固件庫(kù)中的函數(shù)NVIC_PriorityGroupConfig()選擇使用哪種優(yōu)先級(jí)分組方式,這個(gè)函數(shù)的參數(shù)有如下五種:NVIC_PriorityGroup_0:選擇第0組NVIC_PriorityGroup_1:選擇第1組NVIC_PriorityGroup_2:選擇第2組NVIC_PriorityGroup_3:選擇第3組NVIC_PriorityGroup_4:選擇第4組接下來(lái)要指定中斷源的優(yōu)先級(jí)。如下簡(jiǎn)單的例子說(shuō)明如何指定中斷源的搶占優(yōu)先級(jí)和亞優(yōu)先級(jí):NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//使能按鍵所在的外部中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; //搶占優(yōu)先級(jí)2,NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; //子優(yōu)先級(jí)3NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能外部中斷通道NVIC_Init(&NVIC_InitStructure);要注意如下幾點(diǎn):如果指定的搶占優(yōu)先級(jí)或亞優(yōu)先級(jí)別超出了選定的優(yōu)先級(jí)分組所限定的范圍,則可能得到意想不到的結(jié)果。搶占優(yōu)先級(jí)別相同的中斷源之間沒(méi)有嵌套關(guān)系。如果某個(gè)中斷源被指定為某個(gè)搶占優(yōu)先級(jí)別,又沒(méi)有其他中斷源處于同一個(gè)搶占優(yōu)先級(jí)別,則可以為這個(gè)中斷源指定任意有效的亞優(yōu)先級(jí)別。1.2外部中斷控制器先了解STM32IO口中斷一些基本概念。STM32的每個(gè)IO都可以作為外部中斷的中斷輸入口,這點(diǎn)也是STM32的強(qiáng)大之處。STM32F103的中斷控制器支持19個(gè)外部中斷/事件請(qǐng)求。每個(gè)中斷設(shè)有狀態(tài)位,每個(gè)中斷/事件都有獨(dú)立的觸發(fā)和屏蔽設(shè)置。STM32F103的19個(gè)外部中斷為:線0~15:對(duì)應(yīng)外部IO口的輸入中斷。線16:連接到PVD輸出。線17:連接到RTC鬧鐘事件。線18:連接到USB喚醒事件。從上面可以看出,STM32供IO口使用的中斷線只有16個(gè),但是STM32的IO口遠(yuǎn)遠(yuǎn)不止16個(gè),那么STM32是怎么把16個(gè)中斷線和IO口一一對(duì)應(yīng)起來(lái)的呢?于是STM32就這樣設(shè)計(jì),GPIO的管腳GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分別對(duì)應(yīng)中斷線0~15。這樣每個(gè)中斷線對(duì)應(yīng)了最多7個(gè)IO口。下面我們看看GPIO跟中斷線的映射關(guān)系圖5.1所示。圖5.1中斷線的映射關(guān)系在庫(kù)函數(shù)中,配置GPIO與中斷線的映射關(guān)系的函數(shù)GPIO_EXTILineConfig()來(lái)實(shí)現(xiàn)的:該函數(shù)將GPIO端口與中斷線映射起來(lái),如下所示:GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);將中斷線0與GPIOA映射起來(lái),那么很明顯GPIOA.0與EXTI0中斷線連接了。設(shè)置好中斷線映射之后,那么到底來(lái)自這個(gè)IO口的中斷是通過(guò)什么方式觸發(fā)的呢?接下來(lái)我們就要設(shè)置該中斷線上中斷的初始化參數(shù)了。中斷線上中斷的初始化通過(guò)函數(shù)EXTI_Init()實(shí)現(xiàn)的。EXTI_Init()函數(shù)的使用范例如下所示:EXTI_InitStructure.EXTI_Line=EXTI_Line0;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure); 上面的例子設(shè)置中斷線0上的中斷為下降沿觸發(fā)。STM32的外設(shè)的初始化都是通過(guò)結(jié)構(gòu)體來(lái)設(shè)置初始值的,這里就不再述說(shuō)初始化的過(guò)程了。1.3NVIC庫(kù)函數(shù)介紹NVIC驅(qū)動(dòng)有多種用途,如使能或者失能IRQ中斷,使能或者失能單獨(dú)的IRQ通道、改變IRQ通道的優(yōu)先級(jí)等。NVIC_InitTypeDef定義該結(jié)構(gòu)體的代碼如下:typedefstruct{uint8_tNVIC_IRQChannel;uint8_tNVIC_IRQChannelPreemptionPriority;uint8_tNVIC_IRQChannelSubPriority;FunctionalStateNVIC_IRQChannelCmd;}NVIC_InitTypeDef;-NVIC_IRQChannel:該參數(shù)用于使能或失能指定的IRQ通道,-NVIC_IRQChannelPreemptionPriority:該參數(shù)設(shè)置了成員NVIC_IRQChannel中的搶占優(yōu)先級(jí)。-NVIC_IRQChannelSubPriority:該參數(shù)設(shè)置了成員NVIC_IRQChannel中的亞優(yōu)先級(jí)。-NVIC_IRQChannelCmd:該參數(shù)指定了在成員NVIC_IRQChannel中定義的IRQ通道被使能還是失能。這個(gè)參數(shù)的取值為ENABLE或者DISABLE。1.4外部中斷控制器庫(kù)函數(shù) EXTI_Init:函數(shù)對(duì)指定的參數(shù)初始化外設(shè)EXIT寄存器,如圖5.2所示。 圖5.2EXTI_Init庫(kù)函數(shù)說(shuō)明EXTI_InitTypeDef結(jié)構(gòu)體定義如下:typedefstruct{uint32_tEXTI_Line;EXTIMode_TypeDefEXTI_Mode;EXTITrigger_TypeDefEXTI_Trigger;FunctionalStateEXTI_LineCmd;}EXTI_InitTypeDef; -EXTI_Line:選擇了待使能或失能的外部線路,如圖5.3所示。圖5.3EXTI_Line對(duì)應(yīng)外部中斷-EXTI_Mode:設(shè)置了被使能線路的模式,如5.4所示。圖5.4EXTI_Mode說(shuō)明 -EXTI_Trigger:設(shè)置了被使能線路的觸發(fā)邊沿,取值如圖5.5所示。圖5.5EXTI_Trigger說(shuō)明 -EXTI_LineCmd函數(shù)用來(lái)定義選中線路的新?tīng)顟B(tài)。它可以被設(shè)為ENABLE或者DISABLE。1.5軟件程序設(shè)計(jì)首先程序需要進(jìn)行中斷優(yōu)先級(jí)分組的設(shè)置,如下:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);選擇了中斷優(yōu)先級(jí)2組,說(shuō)明可進(jìn)行搶占優(yōu)先級(jí)設(shè)為0-3共4級(jí),亞優(yōu)先級(jí)同樣可設(shè)置為0-3共4級(jí)。接著進(jìn)行IO端口初始化,初始化方式同實(shí)驗(yàn)3輸入按鍵初始化相同,在此省略。完成IO端口初始化后,進(jìn)行外部中斷線配置,并進(jìn)行外部中斷參數(shù)初始化,參考程序如下所示: GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); EXTI_InitStructure.EXTI_Line=EXTI_Line0; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure);設(shè)置好外部中斷參數(shù),接著進(jìn)行NVIC中斷的中斷通道及優(yōu)先級(jí)的設(shè)置,如下所示: NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;//搶占優(yōu)先級(jí)2, NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; //子優(yōu)先級(jí)2 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能外部中斷通道 NVIC_Init(&NVIC_InitStructure);最后不要忘記,中斷函數(shù)的編寫,在中斷函數(shù)中,先要進(jìn)行外部中斷標(biāo)志確定,看是否為誤觸發(fā)引起的中斷,如確定為外部產(chǎn)生的中斷,則實(shí)現(xiàn)按鍵相應(yīng)功能,然后要把外部中斷的標(biāo)志位進(jìn)行清除。參考程序如下:voidEXTI0_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line0)!=RESET) { LED_Disp(0x01); EXTI_ClearITPendingBit(EXTI_Line0); }}大家自行完成整個(gè)功能程序,分別使用B1-B4按鍵,控制LED燈LED1-LED4點(diǎn)亮。如,當(dāng)按下B1按鍵時(shí),LED1點(diǎn)亮;當(dāng)按下B2按鍵時(shí),LED2點(diǎn)亮;當(dāng)按下B3按鍵時(shí),LED3點(diǎn)亮;當(dāng)按下B4按鍵時(shí),LED4點(diǎn)亮;達(dá)到功能后,編譯下載到開(kāi)發(fā)板,看是否達(dá)到所需要求,按鍵控制是否靈活;授課內(nèi)容項(xiàng)目四:USART串行口授課專業(yè)智能控制技術(shù)課程性質(zhì)實(shí)踐授課班級(jí)與學(xué)時(shí)2022級(jí)智能控制1、2、3班(實(shí)踐:4學(xué)時(shí))教學(xué)目標(biāo)與要求1、學(xué)習(xí)異步串行口數(shù)據(jù)的收、發(fā)功能;2、掌握異步串行口的波特率、停止位及收發(fā)參數(shù)配置;3、掌握串行口中斷收、發(fā)功能的實(shí)現(xiàn);4、學(xué)習(xí)整數(shù)的ASCII碼分解方法,進(jìn)行整數(shù)ASCII拆解發(fā)送。教學(xué)重點(diǎn)掌握異步串行口的波特率、停止位及收發(fā)參數(shù)配置;教學(xué)難點(diǎn)掌握串行口中斷收、發(fā)功能的實(shí)現(xiàn);教學(xué)方法1、以案例演示和實(shí)物展示法為主,實(shí)際操作引導(dǎo)學(xué)生。2、使用多媒體手段進(jìn)行教學(xué)。作業(yè)布置1、根據(jù)項(xiàng)目功能要求,完成整個(gè)工程項(xiàng)目。2、熟練掌握串行口參數(shù)的配置。3、掌握串行口中斷功能的應(yīng)用。4、掌握數(shù)值轉(zhuǎn)化為ASCII碼的方法,能進(jìn)行ASCII碼與數(shù)據(jù)相互轉(zhuǎn)化。5、自己試著完成一幀數(shù)據(jù)的接收及字符串的發(fā)送如何實(shí)現(xiàn)。6、試著修改串口發(fā)送字符秒數(shù),改為字符串的方式如何實(shí)現(xiàn)。參考資料《STM32F1開(kāi)發(fā)標(biāo)準(zhǔn)教程》教學(xué)后記要求同學(xué)熟練掌握異步串行口通信功能,此功能在工業(yè)中運(yùn)用很廣泛,學(xué)生較難進(jìn)行理解,加強(qiáng)理論知識(shí)的學(xué)習(xí)。教學(xué)設(shè)計(jì)內(nèi)容備注與后記1.實(shí)驗(yàn)內(nèi)容本實(shí)驗(yàn)采用異步串行口2的收、發(fā)功能,實(shí)現(xiàn)與上位機(jī)的通信。采用發(fā)送功能,實(shí)現(xiàn)每秒鐘向上位機(jī)發(fā)送累計(jì)秒數(shù);接收功能,進(jìn)行當(dāng)前累計(jì)秒數(shù)的設(shè)置修改功能。1.1STM32F1串口簡(jiǎn)介通用同步/異步串行收發(fā)器(UniversalSynchronous/AsynchronousReceiver/Transmitte),是一個(gè)全雙工通用同步/異步串行收發(fā)模塊,是高度靈活的串行通信接口設(shè)備。USART收發(fā)模塊一般分為三大部分:時(shí)鐘發(fā)生器、數(shù)據(jù)發(fā)送器和接收器。USART的控制寄存器為所有的模塊共享。串口作為MCU的重要外部接口,同時(shí)也是軟件開(kāi)發(fā)重要的調(diào)試手段,其重要性不言而喻。串口提供了一種靈活的方法來(lái)與使用工業(yè)標(biāo)準(zhǔn)NRZ異步串行數(shù)據(jù)格式的外設(shè)之間進(jìn)行全雙工數(shù)據(jù)交換。USART的結(jié)構(gòu)框圖如下所示。USART利用分?jǐn)?shù)波特率發(fā)生器提供寬范圍的波特率選擇,支持同步通信和半雙工的單線通信,也支持LIN(本地互聯(lián)網(wǎng)絡(luò))、智能卡協(xié)議和IrDA(紅外數(shù)據(jù)組織)SIRENDEC標(biāo)準(zhǔn)和調(diào)制解調(diào)器操作(CTS/RTS)。USART允許多處理器通信,通過(guò)多緩沖配置的DMA可以進(jìn)行高速的數(shù)據(jù)通信,該接口通過(guò)三個(gè)引腳連接到另外的外設(shè)上。任何USART雙向通信都至少需要兩個(gè)引腳,即接收數(shù)據(jù)輸入(RX)和發(fā)送數(shù)據(jù)輸出(TX)。RX:接收數(shù)據(jù)輸入。是串行數(shù)據(jù)輸入,采用過(guò)采樣技術(shù)來(lái)區(qū)分有效輸入數(shù)據(jù)和噪聲,從而恢復(fù)數(shù)據(jù)。TX:發(fā)送數(shù)據(jù)輸出。當(dāng)發(fā)送器禁能的時(shí)候,輸出引腳恢復(fù)到IO端口配置。當(dāng)發(fā)送器使能并且沒(méi)有數(shù)據(jù)要發(fā)送時(shí),TX引腳是高電平。在單線和智能卡模式,該IO同時(shí)用于數(shù)據(jù)發(fā)送和接收(在USART層,在SW_RX上接收到數(shù)據(jù))。通過(guò)這些引腳,在正常USART模式下,串行數(shù)據(jù)作為幀發(fā)送和接收。包括:總線在發(fā)送或接收前應(yīng)處于空閑狀態(tài)。一個(gè)起始位。一個(gè)數(shù)據(jù)字(8位或者9位),最低有效位在前0.5、1、1.5、2個(gè)停止位,由此表明數(shù)據(jù)幀的結(jié)束。使用分?jǐn)?shù)波特率產(chǎn)生器——帶12位整數(shù)和4位小數(shù)。一個(gè)狀態(tài)寄存器(USART_SR)。數(shù)據(jù)寄存器(USART_DATA)。波特率寄存器(USART_BRR)——帶12位整數(shù)和4位小數(shù)。智能卡模式下的保護(hù)時(shí)間寄存器(USART_GTPR)。1.2串行口的庫(kù)函數(shù)使用外設(shè),必須先使能時(shí)鐘,根據(jù)串行口設(shè)置的時(shí)鐘掛載位置,進(jìn)行外設(shè)時(shí)鐘使能;例如,串行口2外設(shè)時(shí)鐘使能,如下所示:RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);USART_Init函數(shù)是串口參數(shù)初始化。此函數(shù)的參數(shù)結(jié)構(gòu)如圖6.1所示。圖6.1USART_Init庫(kù)函數(shù)說(shuō)明這個(gè)函數(shù)的第一個(gè)入口參數(shù)是指定初始化的串口標(biāo)號(hào),如上選擇USART2.第二個(gè)入口參數(shù)是一個(gè)USART_InitTypeDef類型的結(jié)構(gòu)體指針,這個(gè)結(jié)構(gòu)體指針的成員變量用來(lái)設(shè)置串口的一些參數(shù),結(jié)構(gòu)體如下:typedefstruct{uint32_tUSART_BaudRate;uint16_tUSART_WordLength;uint16_tUSART_StopBits;uint16_tUSART_Parity;uint16_tUSART_Mode;uint16_tUSART_HardwareFlowControl;}USART_InitTypeDef; USART_BaudRate:該成員設(shè)置了USART傳輸?shù)牟ㄌ芈省?USART_WordLength:提示了在一個(gè)字節(jié)中傳輸或者接收到的數(shù)據(jù)位數(shù)。 USART_StopBits:定義了發(fā)送的停止位數(shù)目。 USART_Parity:奇偶校驗(yàn)?zāi)J健?USART_Mode指定了使能或者失能發(fā)送和接收模式。 USART_HardwareFlowControl指定了硬件流控制模式使能還是失能。 USART_SendData:此函數(shù)實(shí)現(xiàn)了把數(shù)據(jù)填充到USAR_DR寄存器發(fā)送數(shù)據(jù)。參數(shù)功能如圖6.2所示。圖6.2USART_SendData庫(kù)函數(shù)說(shuō)明USART_ReceiveData函數(shù),實(shí)現(xiàn)了從接收寄存器中,讀取串行口接收到的數(shù)據(jù)。參數(shù)功能如圖6.3所示。圖6.3USART_ReceiveData庫(kù)函數(shù)說(shuō)明USART_ITConfig函數(shù),進(jìn)行串口響應(yīng)中斷的開(kāi)啟,參數(shù)的功能如圖6.4所示。圖6.4USART_ITConfig庫(kù)函數(shù)說(shuō)明USART_IT使能或者失能USART的中斷。可以取下表的一個(gè)或者多個(gè)取值的組合作為該參數(shù)的值,如圖6.5所示。圖6.5USART_IT庫(kù)函數(shù)說(shuō)明1.3藍(lán)橋杯串行口原理圖藍(lán)橋杯開(kāi)發(fā)板中的串口2,是由仿真口的USB接口轉(zhuǎn)換接入的,經(jīng)過(guò)FT2232D芯片轉(zhuǎn)換出JTAG及串行口,如圖6.6所示。圖6.6USB轉(zhuǎn)串口原理圖轉(zhuǎn)換出來(lái)的串行口2,經(jīng)過(guò)J1、J2插頭的短接帽進(jìn)行短接,最后與MCU的PA2、PA3進(jìn)行了連接。最后要注意外部設(shè)備的GPIO口的復(fù)用功能選擇。1.4軟件程序設(shè)計(jì)經(jīng)過(guò)前面的介紹,對(duì)于復(fù)用功能的IO。首先要使能GPIO時(shí)鐘。然后使能復(fù)用功能時(shí)鐘。同時(shí)要把GPIO模式設(shè)置為復(fù)用功能對(duì)應(yīng)模式。這些準(zhǔn)備工作做完之后。剩下的當(dāng)然是串口參數(shù)的初始化設(shè)置,包括波特率,停止位等等參數(shù)。在設(shè)置完成接下來(lái)就是使能串口,這很容易理解。同時(shí),如果開(kāi)啟了串口的接收中斷,當(dāng)然要初始化NVIC設(shè)置中斷優(yōu)先級(jí)別。最后編寫中斷服務(wù)函數(shù)。串行設(shè)置的一般步驟可以總結(jié)如下幾步驟:串口時(shí)鐘使能,GPIO時(shí)鐘使能串口復(fù)位GPIO端口模式設(shè)置串口參數(shù)初始化開(kāi)啟中斷并且初始化NVIC(如果需要開(kāi)啟中斷才需要這個(gè)步驟)使能串口編寫中斷處理函數(shù)(如果開(kāi)啟了串行口中斷,才需要這個(gè)步驟)下面我們把關(guān)鍵點(diǎn)的程序介紹如下,首先完成串行口時(shí)鐘及所使用的GPIO端口的初始化,如下參考程序: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_Init(GPIOA,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStruct); 接著完成串行口的參數(shù)配置初始化,參考程序如下: USART_InitStruct.USART_BaudRate=ulBaud; USART_InitStruct.USART_WordLength=USART_WordLength_8b; USART_InitStruct.USART_StopBits=USART_StopBits_1; USART_InitStruct.USART_Parity=USART_Parity_No; USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_Init(USART2,&USART_InitStruct); 使能串行口,程序如下: USART_Cmd(USART2,ENABLE); 完成接收中斷配置,使能串行口的接收中斷功能。示例程序如下: USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); NVIC_InitStruct.NVIC_IRQChannel=USART2_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStruct);在完成初始化所有配置之后,因?yàn)槭鼓芰私邮罩袛?,所以還需要完善接收中斷處理程序,這邊只是簡(jiǎn)單的進(jìn)行2位數(shù)值讀取,并沒(méi)有在中斷中進(jìn)行接收中斷的檢測(cè)及完成功能后的接收中斷標(biāo)志位的清除,簡(jiǎn)單示例程序如下: voidUSART2_IRQHandler(void){ pucRcv[ucRno++]=USART_ReceiveData(USART2);}接著完善發(fā)送字符的功能函數(shù),使用發(fā)送數(shù)據(jù)標(biāo)準(zhǔn)固件庫(kù)的函數(shù);首先判斷發(fā)送緩存是否為空,為空就調(diào)用標(biāo)準(zhǔn)庫(kù)中的發(fā)送數(shù)據(jù)函數(shù),示例程序如下:unsignedcharUSART_SendChar(USART_TypeDef*USARTx,unsignedcharucChar){ while(!USART_GetFlagStatus(USARTx,USART_FLAG_TXE)); USART_SendData(USARTx,ucChar); returnucChar;}借用發(fā)送字符函數(shù),大家還可再次包裝,進(jìn)行發(fā)送字符串函數(shù)的編寫,如下所示: voidUSART_SendString(USART_TypeDef*USARTx,unsignedchar*pucStr){ while(*pucStr!='\0') USART_SendChar(USARTx,*pucStr++);}當(dāng)能大家也可使用查詢的方式,進(jìn)行串行口的接收,當(dāng)檢測(cè)到串行口接收緩存區(qū)存在數(shù)據(jù)時(shí),進(jìn)行串行口數(shù)據(jù)讀取,示例程序如下:unsignedcharUSART_ReceiveChar_NonBlocking(USART_TypeDef*USARTx){ if(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)) returnUSART_ReceiveData(USARTx); else return0;}最后是主程序的實(shí)現(xiàn),在主程序中,使用前面實(shí)驗(yàn)講過(guò)的滴答定時(shí)器,進(jìn)行秒計(jì)時(shí),然后在每秒鐘時(shí),進(jìn)行秒數(shù)據(jù)的發(fā)送,在發(fā)送時(shí)注意把數(shù)值轉(zhuǎn)化為ASCII碼字符后發(fā)送;同時(shí)可接收上位機(jī)的兩位數(shù)數(shù)值,進(jìn)行當(dāng)前計(jì)時(shí)秒的修改。關(guān)鍵程序如下:if(ucSec!=ucSec1) { ucSec1=ucSec; USART_SendChar(USART2,ucSec/10+0x30); USART_SendChar(USART2,ucSec%10+0x30); USART_SendChar(USART2,''); } if(ucRno==5) { ucRno=3; ucSec=(pucRcv[3]-'0')*10+pucRcv[4]-'0'; }根據(jù)以上的介紹,請(qǐng)自行完成項(xiàng)目工程程序,根據(jù)要求實(shí)現(xiàn)秒計(jì)時(shí),并且每秒把秒數(shù)經(jīng)過(guò)串行口2發(fā)送到上位機(jī)顯示;同時(shí)上位機(jī)可發(fā)送2位數(shù)的數(shù)據(jù)給開(kāi)發(fā)板,開(kāi)發(fā)板收到數(shù)據(jù)后,能修改當(dāng)前的秒計(jì)時(shí)變量。把程序編寫好了,經(jīng)過(guò)編譯下載到開(kāi)發(fā)板中調(diào)試。1.5串口調(diào)試助手介紹因?yàn)樵陔娔X中要能接收開(kāi)發(fā)板上傳的數(shù)據(jù),并且要求上位機(jī)能發(fā)送數(shù)據(jù)到開(kāi)發(fā)板;所以在電腦中將使用串口調(diào)試助手,進(jìn)行功能的實(shí)現(xiàn)。在調(diào)試助手中,串行口的波特率及數(shù)據(jù)位和停止位的設(shè)置,這些設(shè)置要與開(kāi)發(fā)板中串行口參數(shù)配置一致,配置好串口調(diào)試助手后,打開(kāi)串口,可看到如下圖6.7所示,每秒鐘上傳當(dāng)前的秒計(jì)數(shù)值。 圖6.7串口調(diào)試小助手經(jīng)過(guò)上面的調(diào)試后,可確定達(dá)到了所需的功能要求。串行口接收使用了中斷的方式,在每秒鐘進(jìn)行計(jì)秒數(shù)值的串行口發(fā)送。授課內(nèi)容項(xiàng)目五:定時(shí)器定時(shí)功能授課專業(yè)智能控制技術(shù)課程性質(zhì)實(shí)踐授課班級(jí)與學(xué)時(shí)2022級(jí)智能控制1、2、3班(實(shí)踐:4學(xué)時(shí))教學(xué)目標(biāo)與要求1、掌握STM32F1系列的定時(shí)實(shí)現(xiàn)方法;2、熟悉定時(shí)器的參數(shù)配置;3、掌握定時(shí)時(shí)間的計(jì)算方式;4、熟悉加長(zhǎng)延時(shí)的方法。教學(xué)重點(diǎn)熟悉定時(shí)器的參數(shù)配置;教學(xué)難點(diǎn)掌握定時(shí)時(shí)間的計(jì)算方式;教學(xué)方法1、以案例演示和實(shí)物展示法為主,實(shí)際操作引導(dǎo)學(xué)生。2、使用多媒體手段進(jìn)行教學(xué)。作業(yè)布置1、實(shí)現(xiàn)定時(shí)器2的1毫秒中斷,在中斷中完成1秒累加,最終完成項(xiàng)目要求。2、掌握定時(shí)器的定時(shí)功能參數(shù)設(shè)置。3、掌握定時(shí)器的預(yù)分頻值及周期值的設(shè)置計(jì)算,熟悉兩值的取值范圍。4、實(shí)現(xiàn)準(zhǔn)確的定時(shí)功能,達(dá)到定時(shí)延時(shí)要求。5、熟練掌握準(zhǔn)確延時(shí)時(shí)間的參數(shù)值的設(shè)置。參考資料《STM32F1開(kāi)發(fā)標(biāo)準(zhǔn)教程》教學(xué)后記學(xué)生自已完成了定時(shí)功能的設(shè)置及編程,讓學(xué)生理解了中斷的作用,希望能靈活掌握定時(shí)器的各項(xiàng)功能使用,定時(shí)器能實(shí)現(xiàn)的功能非常多,多去進(jìn)行各類功能的設(shè)置,熟練各類定時(shí)功能使用。教學(xué)設(shè)計(jì)內(nèi)容備注與后記1.實(shí)驗(yàn)內(nèi)容本實(shí)驗(yàn)使用定時(shí)器2的定時(shí)功能,實(shí)現(xiàn)1S的定時(shí)。使程序每秒鐘進(jìn)行LED1燈狀態(tài)置反控制。1.1STM32的通用定時(shí)器STM32F1的通用定時(shí)器是一個(gè)通過(guò)可編程預(yù)分頻器驅(qū)動(dòng)的16位自動(dòng)裝載計(jì)數(shù)器構(gòu)成。這些定時(shí)器適用于多種場(chǎng)合,經(jīng)典應(yīng)用包括測(cè)量輸入信號(hào)的脈沖長(zhǎng)度(輸入捕獲)或產(chǎn)生輸出波形(輸出比較和PWM)。使用定時(shí)器預(yù)分頻器和RCC時(shí)鐘控制器預(yù)分頻器,可以在幾微秒到幾毫秒間任意調(diào)整脈沖寬度和波形周期。STM32的每個(gè)通用定時(shí)器都是完全獨(dú)立的,沒(méi)有互相共享的任何資源。STM32F1的通用TIMx(TIM2、TIM3、TIM4和TIM5)定時(shí)器功能包括:16位向上、向下、向上/向下自動(dòng)裝載計(jì)數(shù)器(TIMx_CNT)。16位可編程(可以實(shí)時(shí)修改)預(yù)分頻器(TIMx_PSC),計(jì)數(shù)器時(shí)鐘頻率的分頻系數(shù)為1~65535之間的任意數(shù)值。4個(gè)獨(dú)立通道(TIMx_CH1~4),這些通道可以用來(lái)作為:A、輸入捕獲B、輸出比較C、PWM生成(邊緣或中間對(duì)齊模式)D、單脈沖模式輸出可使用外部信號(hào)(TIMx_ETR)控制定時(shí)器和定時(shí)器互連(可以用1個(gè)定時(shí)器控制另外一個(gè)定時(shí)器)的同步電路。如下事件發(fā)生時(shí)產(chǎn)生中斷DMAA、更新:計(jì)數(shù)器向上溢出/向下溢出,計(jì)數(shù)器初始化(通過(guò)軟件或者內(nèi)部/外部觸發(fā))B、觸發(fā)事件(計(jì)數(shù)器啟動(dòng)、停止、初始化或者由內(nèi)部/外部觸發(fā)計(jì)數(shù))C、輸入捕獲D、輸出比較E、支持針對(duì)定位的增量(正交)編碼器和霍爾傳感器電路F、觸發(fā)輸入作為外部時(shí)鐘或者按周期的電流管理1.2通用定時(shí)器的庫(kù)函數(shù)使用通用定時(shí)器,而且可以產(chǎn)生中斷。本實(shí)驗(yàn)需應(yīng)用標(biāo)準(zhǔn)庫(kù)函數(shù),將使用定時(shí)器產(chǎn)生中斷,然后在中斷服務(wù)函數(shù)里進(jìn)行秒變量累加,當(dāng)?shù)竭_(dá)1S時(shí),進(jìn)行LED1燈狀態(tài)反轉(zhuǎn),在這里使用定時(shí)器2達(dá)到所需的功能。定時(shí)器參數(shù)設(shè)置函數(shù)TIM_TimeBaseInit,進(jìn)行定時(shí)器的初始化參數(shù),如圖7.1所示。圖7.1TIM_TimeBaseInit庫(kù)函數(shù)說(shuō)明定時(shí)器的參數(shù)定義如下所示: typedefstruct{ uint16_tTIM_Prescaler; uint16_tTIM_CounterMode; uint16_tTIM_Period; uint16_tTIM_ClockDivision; uint8_tTIM_RepetitionCounter;}TIM_TimeBaseInitTypeDef;TIM_Period:設(shè)置了在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值。它的取值必須在0x0000和0xFFFF之間。TIM_Prescaler:設(shè)置了用來(lái)作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值。它的取值必須在0x0000和0xFFFF之間。TIM_ClockDivision:設(shè)置時(shí)鐘分割。TIM_CounterMode:選擇計(jì)數(shù)器模式。TIM_RepetitionCounter:此參數(shù)是高級(jí)定時(shí)器才有用,這里不多解釋。TIM_ITConfig設(shè)置定時(shí)器中斷函數(shù),此函數(shù)可進(jìn)行中間事件的使能或失能的功能,函數(shù)的詳細(xì)描述如圖7.2所示:圖7.2TIM_ITConfig庫(kù)函數(shù)說(shuō)明TIM_IT輸入?yún)?shù)是使能或者失能TIM的中斷。可以取下表的一個(gè)或者多個(gè)取值的組合作為該參數(shù)的值,如圖7.3所示。圖7.3TIM中斷源TIM_Cmd函數(shù)的作用是進(jìn)行TIM的使能,函數(shù)的詳細(xì)參數(shù)如圖7.3所示。圖7.4TIM_Cmd庫(kù)函數(shù)說(shuō)明函數(shù)TIM_GetITStatus的作用是用來(lái)取得中斷的狀態(tài),參數(shù)說(shuō)明如圖7.5所示。圖7.5TIM_GetITStatus庫(kù)函數(shù)說(shuō)明函數(shù)TIM_ClearITPendingBit的作用為清除中斷待處理的位,參數(shù)說(shuō)明如圖7.6所示。圖7.6TIM_ClearITPendingBit庫(kù)函數(shù)說(shuō)明1.3通用定時(shí)器的定時(shí)時(shí)間計(jì)算TIM1~4的時(shí)鐘頻率TIMCLK是72MHz(時(shí)鐘周期是13.89ns),經(jīng)過(guò)16位預(yù)分頻后的最低頻率和最長(zhǎng)周期分別是:72MHz/65536=1099Hz65536/72Mhz=910.22us再經(jīng)過(guò)16位計(jì)數(shù)器分頻后的最低頻率和最長(zhǎng)周期分別是:1099Hz/65536=16.77mHz65536/1099Hz=59.63STIM初始化時(shí)的主要工作是確定預(yù)分頻值和周期值,對(duì)于單個(gè)通道,預(yù)分頻值和周期值分別是(分頻值=時(shí)鐘頻率/輸出頻率):Int(分頻值/65536)<預(yù)分頻值<=min(分頻值/2,65536)周期值=分頻值/預(yù)分頻值根據(jù)推算可知,我們實(shí)驗(yàn)要求產(chǎn)生1秒的延時(shí),我們這里不直接使用定時(shí)器達(dá)到,在實(shí)驗(yàn)中,我們運(yùn)用定時(shí)器2產(chǎn)生1ms延時(shí),再利用一變量進(jìn)行毫秒累加,直到1秒到達(dá)后,再進(jìn)行相應(yīng)的功能實(shí)現(xiàn),學(xué)習(xí)中斷定時(shí)更長(zhǎng)時(shí)間的實(shí)現(xiàn)方式。1.4軟件程序設(shè)計(jì)為了實(shí)現(xiàn)1秒鐘進(jìn)行一次LED1燈的切換,除了進(jìn)行LED端口時(shí)鐘使能外,對(duì)定時(shí)器外部資源時(shí)鐘也要使能,見(jiàn)下面程序: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);接著初始化定時(shí)器參數(shù),設(shè)置自動(dòng)重裝載值,分頻系數(shù),計(jì)數(shù)方式等。這里設(shè)置定時(shí)器2每1毫秒產(chǎn)生一次定時(shí)中斷,參考程序如下: TIM_TimeBaseInitStruct.TIM_Prescaler=(72-1); TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period=(1000-1);//(36000-1); TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);在這里,使能定時(shí)中斷,使每到達(dá)設(shè)定值時(shí),產(chǎn)生更新中斷。在此要設(shè)置中斷的優(yōu)先級(jí)及中斷的通道等。 TIM_ClearFlag(TIM2,TIM_FLAG_Update); TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure);最后不要忘了進(jìn)行定時(shí)器工作使能。 TIM_Cmd(TIM2,ENABLE);在定時(shí)器中斷服務(wù)函數(shù)內(nèi),進(jìn)行中斷標(biāo)志判斷;并使其到達(dá)1S后,進(jìn)行相應(yīng)功能處理。 if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) { if(ucSec<1000) { ucSec++; } else { ucLed^=0x01; ucSec=0; } TIM_ClearITPendingBit(TIM2,TIM_IT_Update); }請(qǐng)同學(xué)自己完善項(xiàng)目工程,最終進(jìn)行編譯無(wú)錯(cuò)誤后下載到開(kāi)發(fā)板中進(jìn)行調(diào)試,達(dá)到每秒鐘能使LED1進(jìn)行狀態(tài)反轉(zhuǎn)。授課內(nèi)容項(xiàng)目六:定時(shí)器PWM功能授課專業(yè)智能控制技術(shù)課程性質(zhì)實(shí)踐授課班級(jí)與學(xué)時(shí)2022級(jí)智能控制1、2、3班(實(shí)踐:4學(xué)時(shí))教學(xué)目標(biāo)與要求1、掌握STM32F1系列的PWM的實(shí)現(xiàn)方法;2、熟悉脈沖寬度調(diào)制的意義;3、熟練掌握定時(shí)周期的產(chǎn)生及占空比的調(diào)節(jié);4、掌握進(jìn)行PWM波的引腳輸出。教學(xué)重點(diǎn)掌握STM32F1系列的PWM的實(shí)現(xiàn)方法;教學(xué)難點(diǎn)熟練掌握定時(shí)周期的產(chǎn)生及占空比的調(diào)節(jié);教學(xué)方法1、以案例演示和實(shí)物展示法為主,實(shí)際操作引導(dǎo)學(xué)生。2、使用多媒體手段進(jìn)行教學(xué)。作業(yè)布置1、使用TIM2的比較輸出2,輸出占空比25%,頻率1KHz的波形。2、掌握輸出占空比的設(shè)置方式。3、同學(xué)根據(jù)介紹的占空比調(diào)節(jié)參數(shù),自己修改程序完成占空比的調(diào)節(jié)。4、熟練掌握定時(shí)器比較輸出通道與硬件的接口。參考資料《STM32F1開(kāi)發(fā)標(biāo)準(zhǔn)教程》教學(xué)后記進(jìn)一步讓學(xué)生理解定時(shí)器的功能,完成比較輸出PWM功能的編程,學(xué)生理解了占空比調(diào)節(jié)的概念,大部分學(xué)生掌握良好。教學(xué)設(shè)計(jì)內(nèi)容備注與后記1.實(shí)驗(yàn)內(nèi)容本實(shí)驗(yàn)采用定時(shí)器2的PWM輸出功能,實(shí)現(xiàn)輸出1KHz頻率,占空比為25%的波形。1.1PWM簡(jiǎn)介脈沖寬度調(diào)制(PWM),是英文“PulseWidthModulation”的縮寫,簡(jiǎn)稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來(lái)對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù)。簡(jiǎn)單一點(diǎn),就是對(duì)脈沖寬度的控制。STM32的定時(shí)器除了TIM6和TIM7。其他的定時(shí)器都可以用來(lái)產(chǎn)生PWM輸出。其中高級(jí)定時(shí)器TIM1和TIM8可以同時(shí)產(chǎn)生多達(dá)7路的PWM輸出。而通用定時(shí)器也能同時(shí)產(chǎn)生多達(dá)4路的PWM輸出,這樣,STM32最多可以同時(shí)產(chǎn)生30路PWM輸出。這里僅利用TIM2的CH2產(chǎn)生一路PWM輸出。如果要產(chǎn)生多路輸出,同學(xué)可以根據(jù)的代碼稍作修改即可。同樣,首先通過(guò)對(duì)PWM相關(guān)的寄存器的理論課程學(xué)習(xí),大家了解了定時(shí)器TIM2的PWM原理之后,再深入學(xué)習(xí)怎么使用庫(kù)函數(shù)產(chǎn)生PWM輸出。要使STM32的通用定時(shí)器TIMx產(chǎn)生PWM輸出,除了前一實(shí)驗(yàn)所用到庫(kù)函數(shù)外,再學(xué)習(xí)以下幾個(gè)相關(guān)庫(kù)函數(shù),來(lái)控制PWM輸出。1.2PWM相關(guān)庫(kù)函數(shù)TIM_OCxInit函數(shù)進(jìn)行PWM通道設(shè)置,根據(jù)通道位置不同,x取值范圍1-4來(lái)進(jìn)行設(shè)置,不同的通道的設(shè)置函數(shù)不一樣,這里實(shí)驗(yàn)使用的是通道2,所以使用函數(shù)TIM_OC2Init,函數(shù)如圖8.1所示。圖8.1TIM_OC2Init庫(kù)函數(shù)說(shuō)明其中參數(shù)初始化的結(jié)構(gòu)體如下所示:typedefstruct{uint16_tTIM_OCMode;uint16_tTIM_OutputState;uint16_tTIM_OutputNState;uint16_tTIM_Pulse;uint16_tTIM_OCPolarity;uint16_tTIM_OCNPolarity;uint16_tTIM_OCIdleState;uint16_tTIM_OCNIdleState;}TIM_OCInitTypeDef;TIM_OCMode函數(shù)選擇定時(shí)器模式,參數(shù)如圖8.2所示。圖8.2TIM_OCMode庫(kù)函數(shù)說(shuō)明TIM_Pulse設(shè)置了待裝入捕獲比較寄存器的脈沖值。取值必須在0x0000和0xFFFF之間。TIM_OutputState用來(lái)設(shè)置比較輸出使能,也就是使能PWM輸出到端口。TIM_OCPolarity用來(lái)設(shè)置極性是高還是低。其他參數(shù)TIM_OutputNState,TIM_OCNPolarity,TIM_OCIdleStat,TIM_OCNIdleState是高級(jí)定時(shí)器TIM1和TIM8才用到的。TIM_OC2PreloadConfig函數(shù)是使能或者失能TIMx在CCR2上的預(yù)裝載寄存器。參數(shù)意義如圖8.3所示。圖8.3TIM_OC2PreloadConfig庫(kù)函數(shù)說(shuō)明TIM_OCPreload值是輸出比較預(yù)裝載狀態(tài)可以使能或者失能。TIM_SetCompare2函數(shù)是修改TIM_CCR2來(lái)控制占空比,函數(shù)參數(shù)如圖8.4所示。圖8.4TIM_SetCompare2庫(kù)函數(shù)說(shuō)明通過(guò)以上的庫(kù)函數(shù)介紹,加上實(shí)驗(yàn)7介紹的庫(kù)函數(shù),就可進(jìn)行PWM占空比的設(shè)置了。1.3軟件程序設(shè)計(jì)首先進(jìn)行外設(shè)時(shí)鐘的使能,包括GPIO口及定時(shí)器時(shí)鐘,如下程序: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);其次進(jìn)行輸出端口的配制,因?yàn)門IM2的比較2輸出的引腳為PA1,所以配置端口如下: GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_Init(GPIOA,&GPIO_InitStruct);輸出的定時(shí)器周期為1KHz,所以進(jìn)行定時(shí)器參數(shù)設(shè)置,參考程序如下所示: TIM_TimeBaseInitStruct.TIM_Prescaler=(72-1); TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period=(1000-1); TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);最后進(jìn)行PWM波的占空比輸出,使用通道2進(jìn)行輸出,并最終進(jìn)行輸出PWM波使能,參考程序如下: TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse=250; TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High; TIM_OC2Init(TIM2,&TIM_OCInitStruct); TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);最后,只需進(jìn)行TIM2定時(shí)器的使能,就能在比較輸出2端口進(jìn)行波形輸出。其它程序略,請(qǐng)同學(xué)們自己完善項(xiàng)目工程。實(shí)驗(yàn)工程編譯無(wú)錯(cuò)誤后,使用軟件仿真,進(jìn)行PWM波輸出查看,最終仿真出來(lái)的波形如圖8.5所示。圖8.5PWM仿真效果圖從上面的仿真波形,可看到輸出頻率為1KHz,占空比為25%的PWM波形。授課內(nèi)容項(xiàng)目七:ADC轉(zhuǎn)換授課專業(yè)智能控制技術(shù)課程性質(zhì)實(shí)踐授課班級(jí)與學(xué)時(shí)2022級(jí)智能控制1、2、3班(實(shí)踐:4學(xué)時(shí))教學(xué)目標(biāo)與要求1、掌握STM32F1系列的外部模擬量及內(nèi)部溫度檢測(cè)方法;2、熟悉ADC轉(zhuǎn)換的參數(shù)設(shè)置;3、進(jìn)一步掌握LCD顯示,串行數(shù)據(jù)發(fā)送等資源的應(yīng)用;4、掌握規(guī)則通道與注入通道的區(qū)別。教學(xué)重點(diǎn)掌握STM32F1系列的外部模擬量及內(nèi)部溫度檢測(cè)方法;教學(xué)難點(diǎn)熟悉ADC轉(zhuǎn)換的參數(shù)設(shè)置;教學(xué)方法1、以案例演示和實(shí)物展示法為主,實(shí)際操作引導(dǎo)學(xué)生。2、使用多媒體手段進(jìn)行教學(xué)。作業(yè)布置1、實(shí)現(xiàn)外部電壓的采集及溫度值的采集,實(shí)現(xiàn)整個(gè)工程項(xiàng)目。2、掌握ADC的規(guī)則及注入式轉(zhuǎn)換的設(shè)置方法。3、掌握轉(zhuǎn)換后的采集值與最終實(shí)際值的轉(zhuǎn)化方式。4、實(shí)現(xiàn)LCD顯示兩路采集值及轉(zhuǎn)化后實(shí)際值。5、實(shí)現(xiàn)經(jīng)串口通信,發(fā)送數(shù)據(jù)到上位機(jī)顯示兩路采集值及轉(zhuǎn)化值。參考資料《STM32F1開(kāi)發(fā)標(biāo)準(zhǔn)教程》教學(xué)后記讓學(xué)生理解了模數(shù)轉(zhuǎn)換的步驟方法,也讓他們清楚了模擬量進(jìn)行數(shù)字量轉(zhuǎn)化的原因,對(duì)一些外部模擬量的采集,希望都能靈活使用。教學(xué)設(shè)計(jì)內(nèi)容備注與后記1.實(shí)驗(yàn)內(nèi)容本實(shí)驗(yàn)進(jìn)行外部模擬量電壓及內(nèi)部溫度傳感器的采集。最終實(shí)現(xiàn)外部電壓及溫度值的顯示處理。1.1STM32的ADC轉(zhuǎn)換器STM32的ADC是12位的一種逐次逼近型模/數(shù)轉(zhuǎn)換器。它有多達(dá)18個(gè)通道,可測(cè)量16個(gè)外部和兩個(gè)內(nèi)部信號(hào)源。各通道的A/D轉(zhuǎn)換可以單次、連續(xù)、掃描或間斷模式執(zhí)行。ADC的結(jié)果可以左對(duì)齊或右對(duì)齊方式存儲(chǔ)在16位數(shù)據(jù)寄存器中。模擬看門狗特性允許應(yīng)用程序檢測(cè)輸入電壓是否超出用戶定義的高/低閾值。ADC的輸入時(shí)鐘不得超過(guò)14MHz,它是由PCLK2經(jīng)分頻產(chǎn)生,ADC的模塊框圖如圖10.1所示。STM32F103系列最少都擁有2個(gè)ADC,每個(gè)有16路轉(zhuǎn)換通道,可以把轉(zhuǎn)換組織成規(guī)則組和注入組。在任意多個(gè)通道上以任意順序進(jìn)行的一系列轉(zhuǎn)換構(gòu)成成組轉(zhuǎn)換。例如,可以如下順序完成轉(zhuǎn)換:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。規(guī)則組由多達(dá)16個(gè)轉(zhuǎn)換組成。規(guī)則通道和它們的轉(zhuǎn)換順序在ADC_SQRx寄存器中選擇。規(guī)則組中轉(zhuǎn)換的總數(shù)應(yīng)寫入ADC_SQR1寄存器的L[3:0]位中;注入組由多達(dá)四個(gè)轉(zhuǎn)換組成。注入通道和它們的轉(zhuǎn)換順序在ADC_JSQR寄存器中選擇。注入組里的轉(zhuǎn)換總數(shù)應(yīng)寫入ADC_JSQR寄存器的L[1:0]位中;如果ADC_SQRx或ADC_JSQR寄存器在轉(zhuǎn)換期間被更改,當(dāng)前的轉(zhuǎn)換被清除,一個(gè)新的啟動(dòng)脈沖將發(fā)送到ADC以轉(zhuǎn)換新選擇的組。內(nèi)部溫度傳感器與通道ADC1_IN16相連接,內(nèi)部參考電壓和ADC1_IN17相連接??梢园醋⑷牖蛞?guī)則通道對(duì)這兩個(gè)內(nèi)部通道進(jìn)行轉(zhuǎn)換。圖10.1ADC轉(zhuǎn)換框圖規(guī)則通道相當(dāng)于你正常運(yùn)行的程序,而注入通道呢,就相當(dāng)于中斷。在你程序正常執(zhí)行的時(shí)候,中斷是可以打斷你的執(zhí)行的。同這個(gè)類似,注入通道的轉(zhuǎn)換可以打斷規(guī)則通道的轉(zhuǎn)換,在注入通道被轉(zhuǎn)換完成之后,規(guī)則通道才得以繼續(xù)轉(zhuǎn)換。單次轉(zhuǎn)換模式,在單次轉(zhuǎn)換模式下ADC只執(zhí)行一次轉(zhuǎn)換。該模式既可通過(guò)設(shè)置ADC_CR2寄存器的ADON位啟動(dòng),也可通過(guò)外部觸發(fā)啟動(dòng),這時(shí)CONT位為0。以規(guī)則通道為例,一旦所選擇的通道轉(zhuǎn)換完成,轉(zhuǎn)換結(jié)果將被存在ADC_DR寄存器中,EOC(轉(zhuǎn)換結(jié)束)標(biāo)志將被置位,如果設(shè)置EOCIE,則會(huì)產(chǎn)生中斷,然后ADC將停止,直到下次啟動(dòng)。連續(xù)轉(zhuǎn)換模式中,當(dāng)前面ADC轉(zhuǎn)換一結(jié)束時(shí)馬上啟動(dòng)另一次轉(zhuǎn)換。此模式可通過(guò)外部觸發(fā)啟動(dòng)或通過(guò)設(shè)置ADC_CR2寄存器上的ADON位啟動(dòng),此時(shí)CONT位是1。每個(gè)轉(zhuǎn)換后的情況與單次轉(zhuǎn)換模式相同。ADC開(kāi)關(guān)控制,通過(guò)設(shè)置ADC_CR2寄存器的ADON位可給ADC上電。當(dāng)?shù)谝淮卧O(shè)置ADON位時(shí),它將ADC從斷電狀態(tài)下喚醒。ADC上電延遲一段時(shí)間后,再次設(shè)置ADON位時(shí)開(kāi)始進(jìn)行轉(zhuǎn)換。通過(guò)清除ADON位可以停止轉(zhuǎn)換,并將ADC置于斷電模式。在這個(gè)模式中,ADC幾乎不耗電。ADC時(shí)鐘是由時(shí)鐘控制器提供的ADCCLK時(shí)鐘和PCLK2(APB2時(shí)鐘)同步,RCC控制器為ADC時(shí)鐘提供一個(gè)專用的可編程預(yù)分頻器。1.2ADC的庫(kù)函數(shù)ADC_Init函數(shù)用于進(jìn)行ADC的參數(shù)初始化,如圖10.2所示。圖10.2ADC_Init庫(kù)函數(shù)說(shuō)明其中ADC_InitT
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 文明用語(yǔ)使用規(guī)范
- 靜脈輸液的新理念
- 院內(nèi)感染預(yù)防
- 城市綜合管廊安全生產(chǎn)風(fēng)險(xiǎn)分級(jí)管控與隱患排查治理雙體系培訓(xùn)
- 中班美術(shù)教案課件
- 英語(yǔ)-2021年淮安市淮安區(qū)小升初英語(yǔ)考試真題譯林版
- 小米品牌創(chuàng)業(yè)計(jì)劃書
- 員工生日戶外聚會(huì)活動(dòng)策劃方案范文模板
- (高清版)DB12 046.92-2011 產(chǎn)品單位產(chǎn)量綜合能耗計(jì)算方法及限額 第92部分:酸奶
- (高清版)DB12 046.39-2011 產(chǎn)品單位產(chǎn)量綜合能耗計(jì)算方法及限額 第39部分:環(huán)氧丙烷
- 電解銅購(gòu)銷合同(國(guó)內(nèi)貿(mào)易)
- JBT 14933-2024 機(jī)械式停車設(shè)備 檢驗(yàn)與試驗(yàn)規(guī)范(正式版)
- DL-T300-2022火電廠凝汽器及輔機(jī)冷卻器管防腐防垢導(dǎo)則
- 四川省綿陽(yáng)市東辰學(xué)校2023-2024學(xué)年七年級(jí)下學(xué)期3月月考語(yǔ)文卷
- DZ/T 0430-2023 固體礦產(chǎn)資源儲(chǔ)量核實(shí)報(bào)告編寫規(guī)范(正式版)
- DZ∕T 0270-2014 地下水監(jiān)測(cè)井建設(shè)規(guī)范(正式版)
- 兒科科室培訓(xùn)計(jì)劃
- 六年級(jí)用排水法求不規(guī)則物體體積綜合題市公開(kāi)課一等獎(jiǎng)省賽課獲獎(jiǎng)
- 2024年“民用無(wú)人機(jī)及多旋翼無(wú)人機(jī)”駕駛員操控員技能與理論知識(shí)考試題庫(kù)含答案
- 退役軍人適應(yīng)性培訓(xùn)適應(yīng)性培訓(xùn)計(jì)劃
- 外科全套課件
評(píng)論
0/150
提交評(píng)論