




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
課程教案專業(yè)名稱:智能控制技術(shù)課程名稱:嵌入式系統(tǒng)項目實訓B學時/學分:32學時授課對象:2023級任課教師:院部:2024年9月授課內(nèi)容項目一、MDK-ARM軟件安裝及設置授課專業(yè)智能控制技術(shù)專業(yè)課程性質(zhì)實踐授課班級與學時2022級智能控制1、2、3班(實踐:4學時)教學目標與要求1、學習MDK473軟件的安裝及注冊;2、熟悉Keil軟件的編譯環(huán)境與使用方法;3、固件庫FWLibV3.5的結(jié)構(gòu);4、新建項目工程;5、工程環(huán)境設置;教學重點軟件安裝使用教學難點軟件的配置。教學方法1、以案例演示和實物展示法為主,實際操作引導學生。2、使用多媒體手段進行教學。作業(yè)布置1、學生自己完成軟件安裝?2、完成軟件的配置?參考資料《嵌入式系統(tǒng)項目實訓指導書》教學后記讓學生進行了編譯軟件的安裝,有些學生能根據(jù)步驟,完成軟件及驅(qū)動程序的安裝設置,有些同學根據(jù)未完成,未完成的同學課后必須要完成軟件安裝。教學設計內(nèi)容備注與后記1實驗內(nèi)容本實驗實現(xiàn)STM32F1系列開發(fā)軟件的安裝及環(huán)境的配置,并且在此基礎上進行標準庫的工程模板的創(chuàng)建。1.1MDK-ARM4.73軟件安裝考慮到國信長天嵌入式競賽實訓平臺(CT1117E)上的Coocox調(diào)試器只能在MDK-ARMV4.xx環(huán)境下工作,本書以MDK-ARM4.73為例,進行軟件安裝。右擊以管理員身份運行軟件MDK473.exe,進行軟件安裝,如圖1.1所示。圖1.1安裝快捷鍵出現(xiàn)下圖界面,點擊“Next”進行軟件安裝,如圖1.2所示。圖1.2安裝界面勾選接受,點擊“Next”進入下一步,如圖1.3所示。圖1.3安裝同意界面安裝軟件顯示如下,要求輸入用戶的信息,輸入后點擊“Next”,如圖1.4所示。圖1.4填寫界面點擊“Next”,等待安裝完成,點擊“Finish”結(jié)束安裝,如圖1.5所示。圖1.5安裝結(jié)束界面1.2MDK軟件的注冊點擊桌面的Keil快捷鍵,運行編譯環(huán)境,如圖1.6所示。圖1.6快捷菜單需要注意,試用版有32K編譯程序代碼的限制,因此我們要進行軟件的注冊,否則如果超過代碼的限制后,編譯的文件會存在問題。運行MDK,然后打開“File”的“LicenseManagement”,進行軟件的注冊,如圖1.7所示。圖1.7拷貝CID號1.3Coocox調(diào)試仿真驅(qū)動器的安裝使用國信長天嵌入式競賽實訓平臺,因板載有Coocox調(diào)試器,需要安裝調(diào)試器驅(qū)動程序和調(diào)試器插件程序,并且需要對調(diào)試器進行設置。安裝調(diào)試器驅(qū)動程序:實驗平臺使用雙USBUART轉(zhuǎn)換芯片F(xiàn)T2232D作為板載調(diào)試器轉(zhuǎn)接芯片,將實訓平臺通過調(diào)試器USB插座CN2與PC相連,PC提示安裝FT2232驅(qū)動程序,安裝完成后顯示驅(qū)動程序軟件安裝對話框,如圖1.8所示。圖1.8FT2232驅(qū)動程序 設備管理器中出現(xiàn)USB設備USBSerialConverterA/B和COM端口USBSerialPort(COM22),不同的PC設備號可能不同,如圖1.9所示。圖1.9FT2232驅(qū)動USB串口號注意:記住COM端口號,后面的串行通信實驗要用到。如第一次插入開發(fā)板,沒有彈出驅(qū)動安裝界面,也可使用手動安裝驅(qū)動的方式,在設備驅(qū)動查找位置,找到FT2232驅(qū)動文件夾,在此文件夾中自動進行驅(qū)動程序安裝。安裝調(diào)試器插件程序:運行調(diào)試器Keil插件安裝程序CoMDKPlugin-1.3.1.exe,將插件程序安裝到Keil的安裝文件夾如C:\Keil。仿真器軟件安裝文件如圖1.10所示。圖1.10仿真器驅(qū)動在進行下面的調(diào)試器配置之前,先完成新建一個空白項目,詳見1.2.5小節(jié)。之后在Keil中打開新建的工程,單擊生成工具欄中的”TargetOption”按鍵,打開目標選項對話框,選擇“Debug”標簽,選擇“Use”調(diào)試器并從下拉列表中選擇“CooCoxDebugger”(如果沒有CooCoxDebugger,需重新安裝調(diào)試器插件程序),選中“Runtomain()”選項,如圖1.11所示。圖1.11Keil調(diào)試設置單擊“Settings”按鍵打開驅(qū)動設置對話框,確認“Debug”標簽中的“Adapter”為Colink,“Potr”為JTAG,“IDCODE”及“DeviceName”能識讀到數(shù)據(jù),如圖1.12所示。圖1.12JTAG識別選擇“FlashDownload”標簽,單擊“Add”按鈕打開“AddProgrammingAlgorithm”對話框,選擇“STM32F10xMed-densityFlash”,如圖1.13所示。圖1.13程序下載微控制器1.4固件庫FWLibV3.5分析固件庫FWLibV3.5結(jié)構(gòu)如下圖1.14所示。圖1.14固件庫FWLibV3.5結(jié)構(gòu)Libraries文件夾下面有CMSIS和STM32F10x_StdPeriph_Driver兩個目錄,包含驅(qū)動庫的源代碼及啟動文件。CMSIS文件夾存放的是符合CMSIS規(guī)范的一些文件。包括STM32F1核內(nèi)外設訪問層代碼,RTOSAPI,以及STM32F1片上外設訪問層代碼等。STM32F10x_StdPeriph_Driver放的是STM32F1標準外設固件庫源碼文件和對應的頭文件。inc目錄存放的是stm32f10x_ppp.h頭文件,無需改動。src目錄下面放的stm32f10x_ppp.c格式的固件庫源碼文件。每一個.c文件和一個相應的.h文件對應。Project文件夾:STM32F10x_StdPeriph_Examples文件夾中存放的是ST官方提供的固件實例源碼,STM32F10x_StdPeriph_Template文件夾中存放的是工程模板。Utilities文件下就是官方評估板的一些對應源碼。stm32f10x_stdperiph_lib_um.chm文件是固件庫的幫助文檔,主要講的是如何使用驅(qū)動庫來編寫自己的應用程序。1.5新建項目工程打開MDK軟件上,選擇Project-NewUVisionProject菜單項,則彈出如圖1.15所示保存工程界面。圖1.15新建工程項目在上面界面上給新項目工程命名,并單擊“保存”按鈕,則彈出器件選擇對話框,因為藍橋杯嵌入式開發(fā)板使用的MCU為STM32F103RB,所以選擇STMicroelectronics下面的STM32F103RB,如圖1.16所示。圖1.16項目工程微控制器選擇單擊“OK”按鈕,則MDK彈出一個如下對話框,詢問用戶是否加載啟動代碼到當前工程里面。若需要,則選擇是,本例中選擇否,完成以上步驟后,新建工程如圖1.17所示。圖1.17啟動文件選擇經(jīng)過以上操作后,新建工程如圖1.18所示。圖1.18創(chuàng)建工程1.6工程環(huán)境配置打開test1文件夾的項目工程,這是一個模板項目工程,打開項目后,可以點擊“編譯”按鈕,對所建立的工程進行編譯,編譯結(jié)果如圖1.19所示。圖1.19創(chuàng)建工程產(chǎn)生HEX文件。單擊Output標簽,打開Output選項卡,按照下圖所示勾選“CreatHEXFile”方框,這樣在編譯完成沒有錯誤的情況下就可以生成STM32單片機的可執(zhí)行文件格式,即.hex格式,選擇目標文件(Object)輸出的文件夾路徑,點擊“SelectFolderforObjects….”進行目標文件輸出文件夾路徑添加,如圖1.20所示。圖1.20工程配置選擇列表文件(Listing)輸出的文件夾路徑。單擊“Listing”標簽,在Listing選項中,添加目標文件輸出文件夾路徑,如圖1.21所示。圖1.21工程配置C/C++選項卡設置。單擊C/C++標簽,在C/C++選項卡的Define文件框中輸入代碼STM32F10X_MD,USE_STDPERIPH_DRIVER,如圖1.22所示。圖1.22C/C++選項卡設置添加頭文件路徑路徑,按照下圖所示添加相關(guān)頭文件路徑,否則編寫程序時會出現(xiàn)錯誤提示,如圖1.23所示。圖1.23添加頭文件路徑至此,一個完整的STM32開發(fā)工程在MDK下建立完成,接下來就可以進行代碼下載和仿真調(diào)試了。授課內(nèi)容項目二:GPIO端口控制授課專業(yè)智能控制技術(shù)課程性質(zhì)實踐授課班級與學時2022級智能控制1、2、3班(實踐:4學時)教學目標與要求1、熟練掌握在工程項目中,對標準庫函數(shù)驅(qū)動的調(diào)用;2、掌握STM32F1的GPIO驅(qū)動相關(guān)的標準庫函數(shù);3、掌握藍橋杯開發(fā)板的LED燈硬件電路及控制方式;4、學習課程中嘀答定時器使用;教學重點掌握STM32F1的GPIO驅(qū)動相關(guān)的標準庫函數(shù);教學難點掌握藍橋杯開發(fā)板的LED燈硬件電路及控制方式;教學方法1、以案例演示和實物展示法為主,實際操作引導學生。2、使用多媒體手段進行教學。作業(yè)布置1、組建項目工程,進行程序編寫,實現(xiàn)要求功能。2、熟練掌握GPIO標準庫的輸出驅(qū)動程序編寫。3、掌握74HC573鎖存器的驅(qū)動程序設計。4、掌握硬件仿真調(diào)試方法。5、自行進行程序設計,實現(xiàn)8個LED燈流水燈功能。參考資料《STM32F1開發(fā)標準教程》教學后記引導學生使用固件庫方式,完成第一個端口控制程序的安裝調(diào)試,同學第一次進行硬件程序設計,興趣很高,但成功率并不高,要加強課后的復習。教學設計內(nèi)容備注與后記1、實現(xiàn)內(nèi)容本實驗運用STM32F1的GPIO端口進行輸出控制功能,完成LED燈的閃爍控制。1.1標準項目目錄結(jié)構(gòu)首先把實驗1的項目工程打開,如圖2.1所示。圖2.1項目工程接下來逐一講解一下工程目錄下面的組以及重要文件。組Startup下面存放的主要是啟動文件及標準庫函數(shù)的配置文件。啟動文件在正常情況下不需要修改,配置文件可根據(jù)使用的標準庫驅(qū)動外設來進行.h文件的包含。組CMSIS組下面存放了ARM核心文件及system_stm32f10x.c文件,核心文件不需要修改,system_stm32f10x.c文件里面主要是系統(tǒng)時鐘初始化函數(shù)的相關(guān)定義,一般情況下也不需要用戶進行修改。組Library下面存放的是ST官方提供的外設驅(qū)動固件庫文件,這些文件大家可以根據(jù)工程需要來添加和刪除。每個stm32f10x_ppp.c源文件對應一個stm32f10x_ppp.h頭文件。組BSP_Driver里,用來存放實驗用到的外設驅(qū)動代碼,他們實現(xiàn)是通過調(diào)用Library下面的固件庫文件實現(xiàn)的,從本實驗開始,慢慢增加各外設的驅(qū)動文件的編寫。組User中,用來存放主程序,根據(jù)功能要求,編寫的主程序在此目錄下存放。除此之外,stm32f10x_it.c里面存放的部分中斷服務函數(shù),也一并存放在此目錄中。1.2GPIO固件庫的函數(shù)使用標準庫進行驅(qū)動程序編寫時,首先要理解ST官方外設驅(qū)動庫文件。在此要使用到GPIO外設端口,所以在組Library下,必須導入stm32f10x_gpio.c驅(qū)動。GPIO_Init函數(shù)說明如圖2.2所示。圖2.2GPIO_Init庫函數(shù)說明GPIO_Init函數(shù)有兩個參數(shù),第一個參數(shù)用來指定GPIO,取值范圍為GPIOA~GPIOG。第二個參數(shù)為初始化參數(shù)結(jié)構(gòu)體指針,結(jié)構(gòu)體類型為GPIO_InitTypeDef??纯碐PIO_InitTypeDef結(jié)構(gòu)體的定義。首先打開項目工程,然后找到stm32f10x_gpio.h文件下,可以查看到結(jié)構(gòu)體的定義: typedefstruct{ uint16_tGPIO_Pin; GPIOSpeed_TypeDefGPIO_Speed; GPIOMode_TypeDefGPIO_Mode;}GPIO_InitTypeDef;GPIO_Pin:該參數(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:當IO口作為輸出時,最高工作的速度選擇,參數(shù)范圍如下:typedefenum{GPIO_Speed_10MHz=1,GPIO_Speed_2MHz,GPIO_Speed_50MHz}GPIOSpeed_TypeDef;TypeDefGPIO_Mode:進行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種輸出,每一個I/O口只能選擇這8種狀態(tài)中的一種。GPIO庫函數(shù)其他功能函數(shù)請參考《STM32固件庫使用手冊V3.5》。RCC_APB2PeriphClokcCmd函數(shù)功能是對掛載在APB2系統(tǒng)總線上的外部設備,進行時鐘的使能,如圖2.3所示。圖2.3RCC_APB2PeriphClokcCmd庫函數(shù)說明掛載在APB2上的外部設備如圖2.4所示。圖2.4APB2上的外部設備1.3LED原理分析 LED的驅(qū)動電路圖如圖2.5所示。圖2.5LED驅(qū)動電路圖2.5中,H_D0~H_D7與PC8~PC15,NLE~PD2經(jīng)過J1、J2插針跳線連接起來,MCU的輸出口與LED驅(qū)動的鎖存器輸入相連接,要控制LED燈,還必須進行74HC573芯片的控制。實訓平臺上的8個LED指示燈LD1~LD8通過鎖存器分別與PC8~PC15相連,低電平時LED亮,高電平時LED滅。鎖存器的使能端與PD2相連,低電平時鎖存數(shù)據(jù)(鎖存器輸出不隨輸入變化),高電平時不鎖存數(shù)據(jù)(鎖存器輸出隨輸入變化)。1.4軟件程序設計進行LED控制的MCU對應端口初始化,參考程序如下: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); }進行74HC573并行鎖存芯片的驅(qū)動程序,參考如下:每次進行了顯示值的賦值后,再進行鎖存位的使能。voidLED_Disp(unsignedcharucLed){GPIO_Write(GPIOC,~ucLed<<8);GPIO_SetBits(GPIOD,GPIO_Pin_2);GPIO_ResetBits(GPIOD,GPIO_Pin_2); }主程序中,只需要使用上面編寫好的驅(qū)動,先進行控制端口的初始化操作,再使用課程中講過的SysTick定時器,產(chǎn)生1S的精準延時,最后進行LED燈閃爍驅(qū)動設置,就能實現(xiàn)本實驗功能的要求,主要程序參考如下:if((delay_ms>=1000)&&(delay_ms<2000)) { LED_Disp(0); } elseif(delay_ms>=2000) { LED_Disp(0xff); delay_ms=0; }1.5效果驗證根據(jù)上面的講述,完成整體程序的實現(xiàn),最后進行編譯無錯誤、警告后,連接好仿真接口USB與電腦的USB口之間的仿真線,再在Keil軟件中,進入硬件仿真狀態(tài)配置。(配置好工程的硬件仿真相關(guān)設置),如圖2.6所示,連接好硬件設備。授課內(nèi)容項目三:NVIC外部中斷授課專業(yè)智能控制技術(shù)課程性質(zhì)實踐授課班級與學時2022級智能控制1、2、3班(實踐:4學時)教學目標與要求1、掌握外部按鍵中斷功能實現(xiàn);2、掌握采用中斷實現(xiàn)原理,巧用中斷程序?qū)ν獠渴录M行處理;3、熟練學習中斷優(yōu)先級和外部中斷的使用方法;4、掌握使用標準庫開啟和關(guān)閉中斷,能正確初始化中斷。教學重點掌握采用中斷實現(xiàn)原理,巧用中斷程序?qū)ν獠渴录M行處理;教學難點熟練學習中斷優(yōu)先級和外部中斷的使用方法;教學方法1、以案例演示和實物展示法為主,實際操作引導學生。2、使用多媒體手段進行教學。作業(yè)布置1、進行外部按鍵的中斷實現(xiàn),完成整個工程項目。2、熟練掌握外部中斷、中斷觸發(fā)方式、通道使能、中斷或事件模式設置。3、掌握NVIC中斷通道的連接,如何配置優(yōu)先級。4、掌握搶占優(yōu)先級及亞優(yōu)級的功能及作用。參考資料《STM32F1開發(fā)標準教程》教學后記學生去理解中斷的使用,特別是外部中斷,進行外部功能的設置;但很多學生還是不理解中斷及外部輸入方式的本質(zhì)區(qū)別,多進行理論知識的學習。教學設計內(nèi)容備注與后記1.實驗內(nèi)容本實驗運用外部獨立按鍵的中斷檢測功能,進行按鍵分別控制LED1-LED4的點亮功能實現(xiàn)。1.1嵌套向量中斷控制器前面幾個實驗介紹了STM32GPIO的基本輸入輸出,本次我們介紹STM32嵌入式系統(tǒng)的中斷控制器。STM32F的每個IO口都可以作為中斷輸入,在使用中斷之前要對系統(tǒng)向量中斷控制器進行設定。嵌套向量中斷控制器簡稱NVIC,是Cortex-M3不可分割的一部分,它與Cortex-M3內(nèi)核的邏輯緊密耦合,有一部分甚至交融在一起。NVIC與Cortex-M3內(nèi)核相輔相成、里應外合,共同完成對中斷的響應。NVIC管理核異常等中斷,其有以下特點:-60個可屏蔽中斷通道(不包含16個Cortex-M3的中斷線);-16個可編程的優(yōu)先等級(使用了4位中斷優(yōu)先級);-低延遲的異常和中斷處理; -電源管理控制; -系統(tǒng)控制寄存器的實現(xiàn)。STM32(Cortex-M3)中有兩個優(yōu)先級的概念——搶占優(yōu)先級和亞優(yōu)先級。有人把亞優(yōu)先級稱作響應優(yōu)先級或副優(yōu)先級。每個中斷源都需要指定這兩種優(yōu)先級。 第0組:所有4位用于指定亞優(yōu)級。 第1組:最高1位用于指定搶占優(yōu)先級,最低3位用于指定亞優(yōu)先級。 第2組:最高2位用于指定搶占優(yōu)先級,最低2位用于指定亞優(yōu)先級。第3組:最高3位用于指定搶占優(yōu)先級,最低1位用于指定亞優(yōu)先級。 第4組:所有4位用于指定搶占優(yōu)先級。 可以通過調(diào)用STM32的固件庫中的函數(shù)NVIC_PriorityGroupConfig()選擇使用哪種優(yōu)先級分組方式,這個函數(shù)的參數(shù)有如下五種:NVIC_PriorityGroup_0:選擇第0組NVIC_PriorityGroup_1:選擇第1組NVIC_PriorityGroup_2:選擇第2組NVIC_PriorityGroup_3:選擇第3組NVIC_PriorityGroup_4:選擇第4組接下來要指定中斷源的優(yōu)先級。如下簡單的例子說明如何指定中斷源的搶占優(yōu)先級和亞優(yōu)先級:NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//使能按鍵所在的外部中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; //搶占優(yōu)先級2,NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; //子優(yōu)先級3NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能外部中斷通道NVIC_Init(&NVIC_InitStructure);要注意如下幾點:如果指定的搶占優(yōu)先級或亞優(yōu)先級別超出了選定的優(yōu)先級分組所限定的范圍,則可能得到意想不到的結(jié)果。搶占優(yōu)先級別相同的中斷源之間沒有嵌套關(guān)系。如果某個中斷源被指定為某個搶占優(yōu)先級別,又沒有其他中斷源處于同一個搶占優(yōu)先級別,則可以為這個中斷源指定任意有效的亞優(yōu)先級別。1.2外部中斷控制器先了解STM32IO口中斷一些基本概念。STM32的每個IO都可以作為外部中斷的中斷輸入口,這點也是STM32的強大之處。STM32F103的中斷控制器支持19個外部中斷/事件請求。每個中斷設有狀態(tài)位,每個中斷/事件都有獨立的觸發(fā)和屏蔽設置。STM32F103的19個外部中斷為:線0~15:對應外部IO口的輸入中斷。線16:連接到PVD輸出。線17:連接到RTC鬧鐘事件。線18:連接到USB喚醒事件。從上面可以看出,STM32供IO口使用的中斷線只有16個,但是STM32的IO口遠遠不止16個,那么STM32是怎么把16個中斷線和IO口一一對應起來的呢?于是STM32就這樣設計,GPIO的管腳GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分別對應中斷線0~15。這樣每個中斷線對應了最多7個IO口。下面我們看看GPIO跟中斷線的映射關(guān)系圖5.1所示。圖5.1中斷線的映射關(guān)系在庫函數(shù)中,配置GPIO與中斷線的映射關(guān)系的函數(shù)GPIO_EXTILineConfig()來實現(xiàn)的:該函數(shù)將GPIO端口與中斷線映射起來,如下所示:GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);將中斷線0與GPIOA映射起來,那么很明顯GPIOA.0與EXTI0中斷線連接了。設置好中斷線映射之后,那么到底來自這個IO口的中斷是通過什么方式觸發(fā)的呢?接下來我們就要設置該中斷線上中斷的初始化參數(shù)了。中斷線上中斷的初始化通過函數(shù)EXTI_Init()實現(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); 上面的例子設置中斷線0上的中斷為下降沿觸發(fā)。STM32的外設的初始化都是通過結(jié)構(gòu)體來設置初始值的,這里就不再述說初始化的過程了。1.3NVIC庫函數(shù)介紹NVIC驅(qū)動有多種用途,如使能或者失能IRQ中斷,使能或者失能單獨的IRQ通道、改變IRQ通道的優(yōu)先級等。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ù)設置了成員NVIC_IRQChannel中的搶占優(yōu)先級。-NVIC_IRQChannelSubPriority:該參數(shù)設置了成員NVIC_IRQChannel中的亞優(yōu)先級。-NVIC_IRQChannelCmd:該參數(shù)指定了在成員NVIC_IRQChannel中定義的IRQ通道被使能還是失能。這個參數(shù)的取值為ENABLE或者DISABLE。1.4外部中斷控制器庫函數(shù) EXTI_Init:函數(shù)對指定的參數(shù)初始化外設EXIT寄存器,如圖5.2所示。 圖5.2EXTI_Init庫函數(shù)說明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對應外部中斷-EXTI_Mode:設置了被使能線路的模式,如5.4所示。圖5.4EXTI_Mode說明 -EXTI_Trigger:設置了被使能線路的觸發(fā)邊沿,取值如圖5.5所示。圖5.5EXTI_Trigger說明 -EXTI_LineCmd函數(shù)用來定義選中線路的新狀態(tài)。它可以被設為ENABLE或者DISABLE。1.5軟件程序設計首先程序需要進行中斷優(yōu)先級分組的設置,如下:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);選擇了中斷優(yōu)先級2組,說明可進行搶占優(yōu)先級設為0-3共4級,亞優(yōu)先級同樣可設置為0-3共4級。接著進行IO端口初始化,初始化方式同實驗3輸入按鍵初始化相同,在此省略。完成IO端口初始化后,進行外部中斷線配置,并進行外部中斷參數(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ù),接著進行NVIC中斷的中斷通道及優(yōu)先級的設置,如下所示: NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;//搶占優(yōu)先級2, NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; //子優(yōu)先級2 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能外部中斷通道 NVIC_Init(&NVIC_InitStructure);最后不要忘記,中斷函數(shù)的編寫,在中斷函數(shù)中,先要進行外部中斷標志確定,看是否為誤觸發(fā)引起的中斷,如確定為外部產(chǎn)生的中斷,則實現(xiàn)按鍵相應功能,然后要把外部中斷的標志位進行清除。參考程序如下:voidEXTI0_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line0)!=RESET) { LED_Disp(0x01); EXTI_ClearITPendingBit(EXTI_Line0); }}大家自行完成整個功能程序,分別使用B1-B4按鍵,控制LED燈LED1-LED4點亮。如,當按下B1按鍵時,LED1點亮;當按下B2按鍵時,LED2點亮;當按下B3按鍵時,LED3點亮;當按下B4按鍵時,LED4點亮;達到功能后,編譯下載到開發(fā)板,看是否達到所需要求,按鍵控制是否靈活;授課內(nèi)容項目四:USART串行口授課專業(yè)智能控制技術(shù)課程性質(zhì)實踐授課班級與學時2022級智能控制1、2、3班(實踐:4學時)教學目標與要求1、學習異步串行口數(shù)據(jù)的收、發(fā)功能;2、掌握異步串行口的波特率、停止位及收發(fā)參數(shù)配置;3、掌握串行口中斷收、發(fā)功能的實現(xiàn);4、學習整數(shù)的ASCII碼分解方法,進行整數(shù)ASCII拆解發(fā)送。教學重點掌握異步串行口的波特率、停止位及收發(fā)參數(shù)配置;教學難點掌握串行口中斷收、發(fā)功能的實現(xiàn);教學方法1、以案例演示和實物展示法為主,實際操作引導學生。2、使用多媒體手段進行教學。作業(yè)布置1、根據(jù)項目功能要求,完成整個工程項目。2、熟練掌握串行口參數(shù)的配置。3、掌握串行口中斷功能的應用。4、掌握數(shù)值轉(zhuǎn)化為ASCII碼的方法,能進行ASCII碼與數(shù)據(jù)相互轉(zhuǎn)化。5、自己試著完成一幀數(shù)據(jù)的接收及字符串的發(fā)送如何實現(xiàn)。6、試著修改串口發(fā)送字符秒數(shù),改為字符串的方式如何實現(xiàn)。參考資料《STM32F1開發(fā)標準教程》教學后記要求同學熟練掌握異步串行口通信功能,此功能在工業(yè)中運用很廣泛,學生較難進行理解,加強理論知識的學習。教學設計內(nèi)容備注與后記1.實驗內(nèi)容本實驗采用異步串行口2的收、發(fā)功能,實現(xiàn)與上位機的通信。采用發(fā)送功能,實現(xiàn)每秒鐘向上位機發(fā)送累計秒數(shù);接收功能,進行當前累計秒數(shù)的設置修改功能。1.1STM32F1串口簡介通用同步/異步串行收發(fā)器(UniversalSynchronous/AsynchronousReceiver/Transmitte),是一個全雙工通用同步/異步串行收發(fā)模塊,是高度靈活的串行通信接口設備。USART收發(fā)模塊一般分為三大部分:時鐘發(fā)生器、數(shù)據(jù)發(fā)送器和接收器。USART的控制寄存器為所有的模塊共享。串口作為MCU的重要外部接口,同時也是軟件開發(fā)重要的調(diào)試手段,其重要性不言而喻。串口提供了一種靈活的方法來與使用工業(yè)標準NRZ異步串行數(shù)據(jù)格式的外設之間進行全雙工數(shù)據(jù)交換。USART的結(jié)構(gòu)框圖如下所示。USART利用分數(shù)波特率發(fā)生器提供寬范圍的波特率選擇,支持同步通信和半雙工的單線通信,也支持LIN(本地互聯(lián)網(wǎng)絡)、智能卡協(xié)議和IrDA(紅外數(shù)據(jù)組織)SIRENDEC標準和調(diào)制解調(diào)器操作(CTS/RTS)。USART允許多處理器通信,通過多緩沖配置的DMA可以進行高速的數(shù)據(jù)通信,該接口通過三個引腳連接到另外的外設上。任何USART雙向通信都至少需要兩個引腳,即接收數(shù)據(jù)輸入(RX)和發(fā)送數(shù)據(jù)輸出(TX)。RX:接收數(shù)據(jù)輸入。是串行數(shù)據(jù)輸入,采用過采樣技術(shù)來區(qū)分有效輸入數(shù)據(jù)和噪聲,從而恢復數(shù)據(jù)。TX:發(fā)送數(shù)據(jù)輸出。當發(fā)送器禁能的時候,輸出引腳恢復到IO端口配置。當發(fā)送器使能并且沒有數(shù)據(jù)要發(fā)送時,TX引腳是高電平。在單線和智能卡模式,該IO同時用于數(shù)據(jù)發(fā)送和接收(在USART層,在SW_RX上接收到數(shù)據(jù))。通過這些引腳,在正常USART模式下,串行數(shù)據(jù)作為幀發(fā)送和接收。包括:總線在發(fā)送或接收前應處于空閑狀態(tài)。一個起始位。一個數(shù)據(jù)字(8位或者9位),最低有效位在前0.5、1、1.5、2個停止位,由此表明數(shù)據(jù)幀的結(jié)束。使用分數(shù)波特率產(chǎn)生器——帶12位整數(shù)和4位小數(shù)。一個狀態(tài)寄存器(USART_SR)。數(shù)據(jù)寄存器(USART_DATA)。波特率寄存器(USART_BRR)——帶12位整數(shù)和4位小數(shù)。智能卡模式下的保護時間寄存器(USART_GTPR)。1.2串行口的庫函數(shù)使用外設,必須先使能時鐘,根據(jù)串行口設置的時鐘掛載位置,進行外設時鐘使能;例如,串行口2外設時鐘使能,如下所示:RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);USART_Init函數(shù)是串口參數(shù)初始化。此函數(shù)的參數(shù)結(jié)構(gòu)如圖6.1所示。圖6.1USART_Init庫函數(shù)說明這個函數(shù)的第一個入口參數(shù)是指定初始化的串口標號,如上選擇USART2.第二個入口參數(shù)是一個USART_InitTypeDef類型的結(jié)構(gòu)體指針,這個結(jié)構(gòu)體指針的成員變量用來設置串口的一些參數(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:該成員設置了USART傳輸?shù)牟ㄌ芈省?USART_WordLength:提示了在一個字節(jié)中傳輸或者接收到的數(shù)據(jù)位數(shù)。 USART_StopBits:定義了發(fā)送的停止位數(shù)目。 USART_Parity:奇偶校驗模式。 USART_Mode指定了使能或者失能發(fā)送和接收模式。 USART_HardwareFlowControl指定了硬件流控制模式使能還是失能。 USART_SendData:此函數(shù)實現(xiàn)了把數(shù)據(jù)填充到USAR_DR寄存器發(fā)送數(shù)據(jù)。參數(shù)功能如圖6.2所示。圖6.2USART_SendData庫函數(shù)說明USART_ReceiveData函數(shù),實現(xiàn)了從接收寄存器中,讀取串行口接收到的數(shù)據(jù)。參數(shù)功能如圖6.3所示。圖6.3USART_ReceiveData庫函數(shù)說明USART_ITConfig函數(shù),進行串口響應中斷的開啟,參數(shù)的功能如圖6.4所示。圖6.4USART_ITConfig庫函數(shù)說明USART_IT使能或者失能USART的中斷??梢匀∠卤淼囊粋€或者多個取值的組合作為該參數(shù)的值,如圖6.5所示。圖6.5USART_IT庫函數(shù)說明1.3藍橋杯串行口原理圖藍橋杯開發(fā)板中的串口2,是由仿真口的USB接口轉(zhuǎn)換接入的,經(jīng)過FT2232D芯片轉(zhuǎn)換出JTAG及串行口,如圖6.6所示。圖6.6USB轉(zhuǎn)串口原理圖轉(zhuǎn)換出來的串行口2,經(jīng)過J1、J2插頭的短接帽進行短接,最后與MCU的PA2、PA3進行了連接。最后要注意外部設備的GPIO口的復用功能選擇。1.4軟件程序設計經(jīng)過前面的介紹,對于復用功能的IO。首先要使能GPIO時鐘。然后使能復用功能時鐘。同時要把GPIO模式設置為復用功能對應模式。這些準備工作做完之后。剩下的當然是串口參數(shù)的初始化設置,包括波特率,停止位等等參數(shù)。在設置完成接下來就是使能串口,這很容易理解。同時,如果開啟了串口的接收中斷,當然要初始化NVIC設置中斷優(yōu)先級別。最后編寫中斷服務函數(shù)。串行設置的一般步驟可以總結(jié)如下幾步驟:串口時鐘使能,GPIO時鐘使能串口復位GPIO端口模式設置串口參數(shù)初始化開啟中斷并且初始化NVIC(如果需要開啟中斷才需要這個步驟)使能串口編寫中斷處理函數(shù)(如果開啟了串行口中斷,才需要這個步驟)下面我們把關(guān)鍵點的程序介紹如下,首先完成串行口時鐘及所使用的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);在完成初始化所有配置之后,因為使能了接收中斷,所以還需要完善接收中斷處理程序,這邊只是簡單的進行2位數(shù)值讀取,并沒有在中斷中進行接收中斷的檢測及完成功能后的接收中斷標志位的清除,簡單示例程序如下: voidUSART2_IRQHandler(void){ pucRcv[ucRno++]=USART_ReceiveData(USART2);}接著完善發(fā)送字符的功能函數(shù),使用發(fā)送數(shù)據(jù)標準固件庫的函數(shù);首先判斷發(fā)送緩存是否為空,為空就調(diào)用標準庫中的發(fā)送數(shù)據(jù)函數(shù),示例程序如下:unsignedcharUSART_SendChar(USART_TypeDef*USARTx,unsignedcharucChar){ while(!USART_GetFlagStatus(USARTx,USART_FLAG_TXE)); USART_SendData(USARTx,ucChar); returnucChar;}借用發(fā)送字符函數(shù),大家還可再次包裝,進行發(fā)送字符串函數(shù)的編寫,如下所示: voidUSART_SendString(USART_TypeDef*USARTx,unsignedchar*pucStr){ while(*pucStr!='\0') USART_SendChar(USARTx,*pucStr++);}當能大家也可使用查詢的方式,進行串行口的接收,當檢測到串行口接收緩存區(qū)存在數(shù)據(jù)時,進行串行口數(shù)據(jù)讀取,示例程序如下:unsignedcharUSART_ReceiveChar_NonBlocking(USART_TypeDef*USARTx){ if(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)) returnUSART_ReceiveData(USARTx); else return0;}最后是主程序的實現(xiàn),在主程序中,使用前面實驗講過的滴答定時器,進行秒計時,然后在每秒鐘時,進行秒數(shù)據(jù)的發(fā)送,在發(fā)送時注意把數(shù)值轉(zhuǎn)化為ASCII碼字符后發(fā)送;同時可接收上位機的兩位數(shù)數(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ù)以上的介紹,請自行完成項目工程程序,根據(jù)要求實現(xiàn)秒計時,并且每秒把秒數(shù)經(jīng)過串行口2發(fā)送到上位機顯示;同時上位機可發(fā)送2位數(shù)的數(shù)據(jù)給開發(fā)板,開發(fā)板收到數(shù)據(jù)后,能修改當前的秒計時變量。把程序編寫好了,經(jīng)過編譯下載到開發(fā)板中調(diào)試。1.5串口調(diào)試助手介紹因為在電腦中要能接收開發(fā)板上傳的數(shù)據(jù),并且要求上位機能發(fā)送數(shù)據(jù)到開發(fā)板;所以在電腦中將使用串口調(diào)試助手,進行功能的實現(xiàn)。在調(diào)試助手中,串行口的波特率及數(shù)據(jù)位和停止位的設置,這些設置要與開發(fā)板中串行口參數(shù)配置一致,配置好串口調(diào)試助手后,打開串口,可看到如下圖6.7所示,每秒鐘上傳當前的秒計數(shù)值。 圖6.7串口調(diào)試小助手經(jīng)過上面的調(diào)試后,可確定達到了所需的功能要求。串行口接收使用了中斷的方式,在每秒鐘進行計秒數(shù)值的串行口發(fā)送。授課內(nèi)容項目五:定時器定時功能授課專業(yè)智能控制技術(shù)課程性質(zhì)實踐授課班級與學時2022級智能控制1、2、3班(實踐:4學時)教學目標與要求1、掌握STM32F1系列的定時實現(xiàn)方法;2、熟悉定時器的參數(shù)配置;3、掌握定時時間的計算方式;4、熟悉加長延時的方法。教學重點熟悉定時器的參數(shù)配置;教學難點掌握定時時間的計算方式;教學方法1、以案例演示和實物展示法為主,實際操作引導學生。2、使用多媒體手段進行教學。作業(yè)布置1、實現(xiàn)定時器2的1毫秒中斷,在中斷中完成1秒累加,最終完成項目要求。2、掌握定時器的定時功能參數(shù)設置。3、掌握定時器的預分頻值及周期值的設置計算,熟悉兩值的取值范圍。4、實現(xiàn)準確的定時功能,達到定時延時要求。5、熟練掌握準確延時時間的參數(shù)值的設置。參考資料《STM32F1開發(fā)標準教程》教學后記學生自已完成了定時功能的設置及編程,讓學生理解了中斷的作用,希望能靈活掌握定時器的各項功能使用,定時器能實現(xiàn)的功能非常多,多去進行各類功能的設置,熟練各類定時功能使用。教學設計內(nèi)容備注與后記1.實驗內(nèi)容本實驗使用定時器2的定時功能,實現(xiàn)1S的定時。使程序每秒鐘進行LED1燈狀態(tài)置反控制。1.1STM32的通用定時器STM32F1的通用定時器是一個通過可編程預分頻器驅(qū)動的16位自動裝載計數(shù)器構(gòu)成。這些定時器適用于多種場合,經(jīng)典應用包括測量輸入信號的脈沖長度(輸入捕獲)或產(chǎn)生輸出波形(輸出比較和PWM)。使用定時器預分頻器和RCC時鐘控制器預分頻器,可以在幾微秒到幾毫秒間任意調(diào)整脈沖寬度和波形周期。STM32的每個通用定時器都是完全獨立的,沒有互相共享的任何資源。STM32F1的通用TIMx(TIM2、TIM3、TIM4和TIM5)定時器功能包括:16位向上、向下、向上/向下自動裝載計數(shù)器(TIMx_CNT)。16位可編程(可以實時修改)預分頻器(TIMx_PSC),計數(shù)器時鐘頻率的分頻系數(shù)為1~65535之間的任意數(shù)值。4個獨立通道(TIMx_CH1~4),這些通道可以用來作為:A、輸入捕獲B、輸出比較C、PWM生成(邊緣或中間對齊模式)D、單脈沖模式輸出可使用外部信號(TIMx_ETR)控制定時器和定時器互連(可以用1個定時器控制另外一個定時器)的同步電路。如下事件發(fā)生時產(chǎn)生中斷DMAA、更新:計數(shù)器向上溢出/向下溢出,計數(shù)器初始化(通過軟件或者內(nèi)部/外部觸發(fā))B、觸發(fā)事件(計數(shù)器啟動、停止、初始化或者由內(nèi)部/外部觸發(fā)計數(shù))C、輸入捕獲D、輸出比較E、支持針對定位的增量(正交)編碼器和霍爾傳感器電路F、觸發(fā)輸入作為外部時鐘或者按周期的電流管理1.2通用定時器的庫函數(shù)使用通用定時器,而且可以產(chǎn)生中斷。本實驗需應用標準庫函數(shù),將使用定時器產(chǎn)生中斷,然后在中斷服務函數(shù)里進行秒變量累加,當?shù)竭_1S時,進行LED1燈狀態(tài)反轉(zhuǎn),在這里使用定時器2達到所需的功能。定時器參數(shù)設置函數(shù)TIM_TimeBaseInit,進行定時器的初始化參數(shù),如圖7.1所示。圖7.1TIM_TimeBaseInit庫函數(shù)說明定時器的參數(shù)定義如下所示: typedefstruct{ uint16_tTIM_Prescaler; uint16_tTIM_CounterMode; uint16_tTIM_Period; uint16_tTIM_ClockDivision; uint8_tTIM_RepetitionCounter;}TIM_TimeBaseInitTypeDef;TIM_Period:設置了在下一個更新事件裝入活動的自動重裝載寄存器周期的值。它的取值必須在0x0000和0xFFFF之間。TIM_Prescaler:設置了用來作為TIMx時鐘頻率除數(shù)的預分頻值。它的取值必須在0x0000和0xFFFF之間。TIM_ClockDivision:設置時鐘分割。TIM_CounterMode:選擇計數(shù)器模式。TIM_RepetitionCounter:此參數(shù)是高級定時器才有用,這里不多解釋。TIM_ITConfig設置定時器中斷函數(shù),此函數(shù)可進行中間事件的使能或失能的功能,函數(shù)的詳細描述如圖7.2所示:圖7.2TIM_ITConfig庫函數(shù)說明TIM_IT輸入?yún)?shù)是使能或者失能TIM的中斷??梢匀∠卤淼囊粋€或者多個取值的組合作為該參數(shù)的值,如圖7.3所示。圖7.3TIM中斷源TIM_Cmd函數(shù)的作用是進行TIM的使能,函數(shù)的詳細參數(shù)如圖7.3所示。圖7.4TIM_Cmd庫函數(shù)說明函數(shù)TIM_GetITStatus的作用是用來取得中斷的狀態(tài),參數(shù)說明如圖7.5所示。圖7.5TIM_GetITStatus庫函數(shù)說明函數(shù)TIM_ClearITPendingBit的作用為清除中斷待處理的位,參數(shù)說明如圖7.6所示。圖7.6TIM_ClearITPendingBit庫函數(shù)說明1.3通用定時器的定時時間計算TIM1~4的時鐘頻率TIMCLK是72MHz(時鐘周期是13.89ns),經(jīng)過16位預分頻后的最低頻率和最長周期分別是:72MHz/65536=1099Hz65536/72Mhz=910.22us再經(jīng)過16位計數(shù)器分頻后的最低頻率和最長周期分別是:1099Hz/65536=16.77mHz65536/1099Hz=59.63STIM初始化時的主要工作是確定預分頻值和周期值,對于單個通道,預分頻值和周期值分別是(分頻值=時鐘頻率/輸出頻率):Int(分頻值/65536)<預分頻值<=min(分頻值/2,65536)周期值=分頻值/預分頻值根據(jù)推算可知,我們實驗要求產(chǎn)生1秒的延時,我們這里不直接使用定時器達到,在實驗中,我們運用定時器2產(chǎn)生1ms延時,再利用一變量進行毫秒累加,直到1秒到達后,再進行相應的功能實現(xiàn),學習中斷定時更長時間的實現(xiàn)方式。1.4軟件程序設計為了實現(xiàn)1秒鐘進行一次LED1燈的切換,除了進行LED端口時鐘使能外,對定時器外部資源時鐘也要使能,見下面程序: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);接著初始化定時器參數(shù),設置自動重裝載值,分頻系數(shù),計數(shù)方式等。這里設置定時器2每1毫秒產(chǎn)生一次定時中斷,參考程序如下: 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);在這里,使能定時中斷,使每到達設定值時,產(chǎn)生更新中斷。在此要設置中斷的優(yōu)先級及中斷的通道等。 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);最后不要忘了進行定時器工作使能。 TIM_Cmd(TIM2,ENABLE);在定時器中斷服務函數(shù)內(nèi),進行中斷標志判斷;并使其到達1S后,進行相應功能處理。 if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) { if(ucSec<1000) { ucSec++; } else { ucLed^=0x01; ucSec=0; } TIM_ClearITPendingBit(TIM2,TIM_IT_Update); }請同學自己完善項目工程,最終進行編譯無錯誤后下載到開發(fā)板中進行調(diào)試,達到每秒鐘能使LED1進行狀態(tài)反轉(zhuǎn)。授課內(nèi)容項目六:定時器PWM功能授課專業(yè)智能控制技術(shù)課程性質(zhì)實踐授課班級與學時2022級智能控制1、2、3班(實踐:4學時)教學目標與要求1、掌握STM32F1系列的PWM的實現(xiàn)方法;2、熟悉脈沖寬度調(diào)制的意義;3、熟練掌握定時周期的產(chǎn)生及占空比的調(diào)節(jié);4、掌握進行PWM波的引腳輸出。教學重點掌握STM32F1系列的PWM的實現(xiàn)方法;教學難點熟練掌握定時周期的產(chǎn)生及占空比的調(diào)節(jié);教學方法1、以案例演示和實物展示法為主,實際操作引導學生。2、使用多媒體手段進行教學。作業(yè)布置1、使用TIM2的比較輸出2,輸出占空比25%,頻率1KHz的波形。2、掌握輸出占空比的設置方式。3、同學根據(jù)介紹的占空比調(diào)節(jié)參數(shù),自己修改程序完成占空比的調(diào)節(jié)。4、熟練掌握定時器比較輸出通道與硬件的接口。參考資料《STM32F1開發(fā)標準教程》教學后記進一步讓學生理解定時器的功能,完成比較輸出PWM功能的編程,學生理解了占空比調(diào)節(jié)的概念,大部分學生掌握良好。教學設計內(nèi)容備注與后記1.實驗內(nèi)容本實驗采用定時器2的PWM輸出功能,實現(xiàn)輸出1KHz頻率,占空比為25%的波形。1.1PWM簡介脈沖寬度調(diào)制(PWM),是英文“PulseWidthModulation”的縮寫,簡稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來對模擬電路進行控制的一種非常有效的技術(shù)。簡單一點,就是對脈沖寬度的控制。STM32的定時器除了TIM6和TIM7。其他的定時器都可以用來產(chǎn)生PWM輸出。其中高級定時器TIM1和TIM8可以同時產(chǎn)生多達7路的PWM輸出。而通用定時器也能同時產(chǎn)生多達4路的PWM輸出,這樣,STM32最多可以同時產(chǎn)生30路PWM輸出。這里僅利用TIM2的CH2產(chǎn)生一路PWM輸出。如果要產(chǎn)生多路輸出,同學可以根據(jù)的代碼稍作修改即可。同樣,首先通過對PWM相關(guān)的寄存器的理論課程學習,大家了解了定時器TIM2的PWM原理之后,再深入學習怎么使用庫函數(shù)產(chǎn)生PWM輸出。要使STM32的通用定時器TIMx產(chǎn)生PWM輸出,除了前一實驗所用到庫函數(shù)外,再學習以下幾個相關(guān)庫函數(shù),來控制PWM輸出。1.2PWM相關(guān)庫函數(shù)TIM_OCxInit函數(shù)進行PWM通道設置,根據(jù)通道位置不同,x取值范圍1-4來進行設置,不同的通道的設置函數(shù)不一樣,這里實驗使用的是通道2,所以使用函數(shù)TIM_OC2Init,函數(shù)如圖8.1所示。圖8.1TIM_OC2Init庫函數(shù)說明其中參數(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ù)如圖8.2所示。圖8.2TIM_OCMode庫函數(shù)說明TIM_Pulse設置了待裝入捕獲比較寄存器的脈沖值。取值必須在0x0000和0xFFFF之間。TIM_OutputState用來設置比較輸出使能,也就是使能PWM輸出到端口。TIM_OCPolarity用來設置極性是高還是低。其他參數(shù)TIM_OutputNState,TIM_OCNPolarity,TIM_OCIdleStat,TIM_OCNIdleState是高級定時器TIM1和TIM8才用到的。TIM_OC2PreloadConfig函數(shù)是使能或者失能TIMx在CCR2上的預裝載寄存器。參數(shù)意義如圖8.3所示。圖8.3TIM_OC2PreloadConfig庫函數(shù)說明TIM_OCPreload值是輸出比較預裝載狀態(tài)可以使能或者失能。TIM_SetCompare2函數(shù)是修改TIM_CCR2來控制占空比,函數(shù)參數(shù)如圖8.4所示。圖8.4TIM_SetCompare2庫函數(shù)說明通過以上的庫函數(shù)介紹,加上實驗7介紹的庫函數(shù),就可進行PWM占空比的設置了。1.3軟件程序設計首先進行外設時鐘的使能,包括GPIO口及定時器時鐘,如下程序: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);其次進行輸出端口的配制,因為TIM2的比較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);輸出的定時器周期為1KHz,所以進行定時器參數(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);最后進行PWM波的占空比輸出,使用通道2進行輸出,并最終進行輸出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);最后,只需進行TIM2定時器的使能,就能在比較輸出2端口進行波形輸出。其它程序略,請同學們自己完善項目工程。實驗工程編譯無錯誤后,使用軟件仿真,進行PWM波輸出查看,最終仿真出來的波形如圖8.5所示。圖8.5PWM仿真效果圖從上面的仿真波形,可看到輸出頻率為1KHz,占空比為25%的PWM波形。授課內(nèi)容項目七:ADC轉(zhuǎn)換授課專業(yè)智能控制技術(shù)課程性質(zhì)實踐授課班級與學時2022級智能控制1、2、3班(實踐:4學時)教學目標與要求1、掌握STM32F1系列的外部模擬量及內(nèi)部溫度檢測方法;2、熟悉ADC轉(zhuǎn)換的參數(shù)設置;3、進一步掌握LCD顯示,串行數(shù)據(jù)發(fā)送等資源的應用;4、掌握規(guī)則通道與注入通道的區(qū)別。教學重點掌握STM32F1系列的外部模擬量及內(nèi)部溫度檢測方法;教學難點熟悉ADC轉(zhuǎn)換的參數(shù)設置;教學方法1、以案例演示和實物展示法為主,實際操作引導學生。2、使用多媒體手段進行教學。作業(yè)布置1、實現(xiàn)外部電壓的采集及溫度值的采集,實現(xiàn)整個工程項目。2、掌握ADC的規(guī)則及注入式轉(zhuǎn)換的設置方法。3、掌握轉(zhuǎn)換后的采集值與最終實際值的轉(zhuǎn)化方式。4、實現(xiàn)LCD顯示兩路采集值及轉(zhuǎn)化后實際值。5、實現(xiàn)經(jīng)串口通信,發(fā)送數(shù)據(jù)到上位機顯示兩路采集值及轉(zhuǎn)化值。參考資料《STM32F1開發(fā)標準教程》教學后記讓學生理解了模數(shù)轉(zhuǎn)換的步驟方法,也讓他們清楚了模擬量進行數(shù)字量轉(zhuǎn)化的原因,對一些外部模擬量的采集,希望都能靈活使用。教學設計內(nèi)容備注與后記1.實驗內(nèi)容本實驗進行外部模擬量電壓及內(nèi)部溫度傳感器的采集。最終實現(xiàn)外部電壓及溫度值的顯示處理。1.1STM32的ADC轉(zhuǎn)換器STM32的ADC是12位的一種逐次逼近型模/數(shù)轉(zhuǎn)換器。它有多達18個通道,可測量16個外部和兩個內(nèi)部信號源。各通道的A/D轉(zhuǎn)換可以單次、連續(xù)、掃描或間斷模式執(zhí)行。ADC的結(jié)果可以左對齊或右對齊方式存儲在16位數(shù)據(jù)寄存器中。模擬看門狗特性允許應用程序檢測輸入電壓是否超出用戶定義的高/低閾值。ADC的輸入時鐘不得超過14MHz,它是由PCLK2經(jīng)分頻產(chǎn)生,ADC的模塊框圖如圖10.1所示。STM32F103系列最少都擁有2個ADC,每個有16路轉(zhuǎn)換通道,可以把轉(zhuǎn)換組織成規(guī)則組和注入組。在任意多個通道上以任意順序進行的一系列轉(zhuǎn)換構(gòu)成成組轉(zhuǎn)換。例如,可以如下順序完成轉(zhuǎn)換:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。規(guī)則組由多達16個轉(zhuǎn)換組成。規(guī)則通道和它們的轉(zhuǎn)換順序在ADC_SQRx寄存器中選擇。規(guī)則組中轉(zhuǎn)換的總數(shù)應寫入ADC_SQR1寄存器的L[3:0]位中;注入組由多達四個轉(zhuǎn)換組成。注入通道和它們的轉(zhuǎn)換順序在ADC_JSQR寄存器中選擇。注入組里的轉(zhuǎn)換總數(shù)應寫入ADC_JSQR寄存器的L[1:0]位中;如果ADC_SQRx或ADC_JSQR寄存器在轉(zhuǎn)換期間被更改,當前的轉(zhuǎn)換被清除,一個新的啟動脈沖將發(fā)送到ADC以轉(zhuǎn)換新選擇的組。內(nèi)部溫度傳感器與通道ADC1_IN16相連接,內(nèi)部參考電壓和ADC1_IN17相連接??梢园醋⑷牖蛞?guī)則通道對這兩個內(nèi)部通道進行轉(zhuǎn)換。圖10.1ADC轉(zhuǎn)換框圖規(guī)則通道相當于你正常運行的程序,而注入通道呢,就相當于中斷。在你程序正常執(zhí)行的時候,中斷是可以打斷你的執(zhí)行的。同這個類似,注入通道的轉(zhuǎn)換可以打斷規(guī)則通道的轉(zhuǎn)換,在注入通道被轉(zhuǎn)換完成之后,規(guī)則通道才得以繼續(xù)轉(zhuǎn)換。單次轉(zhuǎn)換模式,在單次轉(zhuǎn)換模式下ADC只執(zhí)行一次轉(zhuǎn)換。該模式既可通過設置ADC_CR2寄存器的ADON位啟動,也可通過外部觸發(fā)啟動,這時CONT位為0。以規(guī)則通道為例,一旦所選擇的通道轉(zhuǎn)換完成,轉(zhuǎn)換結(jié)果將被存在ADC_DR寄存器中,EOC(轉(zhuǎn)換結(jié)束)標志將被置位,如果設置EOCIE,則會產(chǎn)生中斷,然后ADC將停止,直到下次啟動。連續(xù)轉(zhuǎn)換模式中,當前面ADC轉(zhuǎn)換一結(jié)束時馬上啟動另一次轉(zhuǎn)換。此模式可通過外部觸發(fā)啟動或通過設置ADC_CR2寄存器上的ADON位啟動,此時CONT位是1。每個轉(zhuǎn)換后的情況與單次轉(zhuǎn)換模式相同。ADC開關(guān)控制,通過設置ADC_CR2寄存器的ADON位可給ADC上電。當?shù)谝淮卧O置ADON位時,它將ADC從斷電狀態(tài)下喚醒。ADC上電延遲一段時間后,再次設置ADON位時開始進行轉(zhuǎn)換。通過清除ADON位可以停止轉(zhuǎn)換,并將ADC置于斷電模式。在這個模式中,ADC幾乎不耗電。ADC時鐘是由時鐘控制器提供的ADCCLK時鐘和PCLK2(APB2時鐘)同步,RCC控制器為ADC時鐘提供一個專用的可編程預分頻器。1.2ADC的庫函數(shù)ADC_Init函數(shù)用于進行ADC的參數(shù)初始化,如圖10.2所示。圖10.2ADC_Init庫函數(shù)說明其中ADC_InitT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安徽省阜陽市潁上二中2025年高考壓軸卷化學試卷含解析
- 江西省撫州市臨川二中、臨川二中實驗學校2025年高三第六次模擬考試化學試卷含解析
- 2025年乙苯脫氫催化劑項目合作計劃書
- 四川省攀枝花市2024-2025學年高三下學期3月第二次統(tǒng)一考試地理試題(含答案)
- 荊州市小學五年級數(shù)學下冊階段評價(三)(分數(shù)的意義和性質(zhì))(含答案)人教版
- 江蘇省蘇州市2024-2025學年度第二學期八年級道德與法治期中模擬卷(含答案)
- 2025屆云南省牟定縣一中高考化學二模試卷含解析
- 慢性腎病超聲診斷
- 護理應急急救知識培訓
- 2025年小型路面保潔設備項目建議書
- 四川省成都市2025屆高三一診考試英語試卷含解析
- 2024年湖北省安全員C證(專職安全員)考試題庫
- 公司綠色可持續(xù)發(fā)展規(guī)劃報告
- 職業(yè)道德試題及答案
- 《大模型原理與技術(shù)》全套教學課件
- 生產(chǎn)異常處理流程
- 2023年護理人員分層培訓、考核計劃表
- 《護理法律法規(guī)》課件
- 企業(yè)員工安全生產(chǎn)月培訓
- 專題03平行線的性質(zhì)與判定壓軸題真題分類(原卷版)2022-2023學年七年級數(shù)學下冊重難點題型分類高分必刷題(人教版)
- 圍墻拆除重建施工方案
評論
0/150
提交評論