




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
嵌入式系統(tǒng)原理及應(yīng)用
項(xiàng)目化教程項(xiàng)目1
點(diǎn)亮一個(gè)LED燈目錄1.1嵌入式ARM處理器STM321.2任務(wù)1開發(fā)環(huán)境搭建1.3任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈1.1嵌入式ARM處理器STM32嵌入式系統(tǒng)概述
嵌入式系統(tǒng)是以應(yīng)用為中心,嵌入到應(yīng)用對象當(dāng)中的專用計(jì)算機(jī)系統(tǒng)。由于嵌入式系統(tǒng)具有體積小、性能強(qiáng)、功耗低、可靠性高以及面向具體應(yīng)用等特點(diǎn),目前已經(jīng)廣泛地應(yīng)用于軍事國防、消費(fèi)電子、信息家電、網(wǎng)絡(luò)通信、工業(yè)控制等各個(gè)領(lǐng)域,可以說我們生活在一個(gè)充滿嵌入式的世界當(dāng)中。1.1嵌入式ARM處理器STM32ARM處理器1.1嵌入式ARM處理器STM32Cortex-M3概覽1.1嵌入式ARM處理器STM32基于CM3的微控制器1.1嵌入式ARM處理器STM32初識STM32CORTEXM3CPU
72MHz6kB-64kBSRAMARMPeripheralBus(max72MHz)2x12-bitADC
16channels/1Msps1/2xI2C0/1xSPI1/2/4xUSART/LIN
Smartcard/IrDa
ModemControl32/49/80*I/OsUpto16Ext.ITsFlashI/F32kB-512kB
FlashMemoryTempSensor1xUSB2.0FS1xbxCAN2.0B6x16-bitPWM
SynchronizedACTimer2xWatchdog
(independent&window)2/3/5x16-bitTimerExternalMemoryInterface**JTAG/SWDebugXTALoscillators
32KHz+4~16MHzPowerSupply
Reg1.8V
POR/PDR/PVDDMA
3to11*ChannelsNestedvectITCtrl2xSPI/I2S**2xDAC**1xSDIO**ImageSensor**1xUSART/LIN
Smartcard/IrDa
Modem-Ctrl1xSPIBridgeBridge1xSysticTimerARMLiteHi-SpeedBus
Matrix/Arbiter(max72MHz)Int.RCoscillators
32KHz+8MHzPLLClockControlRTC/AWUARMPeripheralBus(max36MHz)20BBackupRegs1.1嵌入式ARM處理器STM32初識STM321.1嵌入式ARM處理器STM32初識STM321.1嵌入式ARM處理器STM32初識STM321.1嵌入式ARM處理器STM32STM32命名規(guī)則1.2任務(wù)1開發(fā)環(huán)境搭建MDK安裝1.2任務(wù)1開發(fā)環(huán)境搭建MDK安裝1.2任務(wù)1開發(fā)環(huán)境搭建MDK安裝1.2任務(wù)1開發(fā)環(huán)境搭建USB轉(zhuǎn)串口驅(qū)動(dòng)的安裝1.2任務(wù)1開發(fā)環(huán)境搭建開發(fā)板的資源描述1.2任務(wù)1開發(fā)環(huán)境搭建串口燒錄程序1.2任務(wù)1開發(fā)環(huán)境搭建串口燒錄程序1.2任務(wù)1開發(fā)環(huán)境搭建串口燒錄程序1.2任務(wù)1開發(fā)環(huán)境搭建串口燒錄程序1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈硬件設(shè)計(jì)1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)#include"stm32f10x.h"
(1)voidSystemInit()
(2){}intmain(){RCC_APB2ENR|=1<<3;
(3)GPIOB_CRL&=~(0x0F<<(4*0));GPIOB_CRL|=(3<<4*0);
(4)GPIOB_BSRR=(1<<(16+0));
(5)while(1){}}1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈軟件設(shè)計(jì)#include"stm32f10x.h"voidSystemInit(){}voiddelay(unsignedinti){while(i--);}intmain(){RCC_APB2ENR|=1<<3;GPIOB_CRL&=~(0x0F<<(4*0));GPIOB_CRL|=(3<<4*0);GPIOB_BSRR=(1<<(16+0));while(1){GPIOB_BSRR=(1<<(16+0));delay(0xFFFFF);GPIOB_BSRR=(1<<(0));delay(0xFFFFF);}}1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈工程編譯與調(diào)試1.2任務(wù)2使用寄存器點(diǎn)亮一個(gè)LED燈測試結(jié)果
下載成功后可以看到開發(fā)板上LED0指示燈閃爍舉一反三(1)控制LED3發(fā)光二極管閃爍。(2)點(diǎn)亮LED0、LED1、LED2、LED3指示燈。(3)實(shí)現(xiàn)LED0、LED1、LED2、LED3指示燈交替亮滅,類似流水燈效果。嵌入式系統(tǒng)原理及應(yīng)用
項(xiàng)目化教程項(xiàng)目2流水燈控制設(shè)計(jì)與實(shí)現(xiàn)目錄2.1STM32存儲器映射2.2認(rèn)識STM32固件庫2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈2.1STM32存儲器映射存儲器分塊序號用途地址范圍Block0SRAM(FLASH)0x00000000-0x1FFFFFFF(512MB)Block1SRAM0x20000000-0x3FFFFFFF(512MB)Block2片上外設(shè)0x40000000-0x5FFFFFFF(512MB)Block3FSMC的bank1-bank20x60000000-0x7FFFFFFF(512MB)Block4FSMC的bank3-bank40x80000000-0x9FFFFFFF(512MB)Block5FSMCregister0xA0000000-0xBFFFFFFF(512MB)Block6Notused0xC0000000-0xDFFFFFFF(512MB)Block7Cortex-M3內(nèi)部外設(shè)0xE0000000-0xFFFFFFFF(512MB)2.1STM32存儲器映射總線基地址總線名稱總線基地址相對外設(shè)基地址的偏移APB10x400000000x0APB20x400100000x00010000AHB0x400180000x000180002.1STM32存儲器映射GPIO外設(shè)基地址外設(shè)名稱外設(shè)基地址相對APB2總線的地址偏移GPIOA0x400108000x00000800GPIOB0x40010C000x00000C00GPIOC0x400110000x00001000GPIOD0x400114000x00001400GPIOE0x400118000x00001800GPIOF0x40011C000x00001C00GPIOG0x400120000x000020002.1STM32存儲器映射GPIOB寄存器地址寄存器名稱寄存器地址相對GPIOB基址的偏移GPIOB_CRL0x40010C000x00GPIOB_CRH0x40010C040x04GPIOB_IDR0x40010C080x08GPIOB_ODR0x40010C0C0x0CGPIOB_BSRR0x40010C100x10GPIOB_BRR0x40010C140x14GPIOB_LCKR0x40010C180x182.2認(rèn)識STM32固件庫STM32內(nèi)部有數(shù)百個(gè)寄存器,為了方便用戶編程,提高程序的移植性,解決不同廠商的芯片軟件兼容的問題,ST公司推出了一套CMSIS(CortexMicroControllerSoftwareInterfaceStandard)標(biāo)準(zhǔn)固件庫。(1)_htmresc文件夾:存放ST公司的LOGO圖標(biāo)。(2)Libraries文件夾:在這個(gè)文件夾內(nèi)有兩個(gè)子目錄,CMSIS文件夾用于存放符合CMSIS標(biāo)準(zhǔn)的文件,包括STM32啟動(dòng)文件、ARMCortex內(nèi)核文件、stm32f10x.h、system_stm32f10x.h和system_stm32f10x.c文件。啟動(dòng)文件有多種,需根據(jù)使用的STM32芯片來選擇,因?yàn)殚_發(fā)板上使用的是大容量的STM32F1芯片,所以選擇startup_stm32f10x_hd.s。core_cm3.h屬于CMSIS的核心文件,由ARM提供,對于所有CM3內(nèi)核的芯片來說這個(gè)文件都是相同的。system_stm32f10x.h主要是申明系統(tǒng)及總線時(shí)鐘相關(guān)的函數(shù),其中就有SystemInit()函數(shù)申明,這個(gè)函數(shù)在我們系統(tǒng)啟動(dòng)的時(shí)候都會調(diào)用,用來設(shè)置整個(gè)系統(tǒng)和總線時(shí)鐘。stm32f10x.h是STM32F10x的頭文件,內(nèi)部封裝了STM32的總線、內(nèi)存和外設(shè)寄存器等,同時(shí)還包含一些時(shí)鐘相關(guān)的定義和中斷相關(guān)定義等。STM32F10x_StdPeriph_Driver文件夾用于存放STM32外設(shè)驅(qū)動(dòng)文件,inc目錄用于存放外設(shè)的頭文件,src目錄用于存放外設(shè)的源文件。從這些文件的命名就可以知道對應(yīng)文件的功能。(3)Project文件夾:此文件夾下有2個(gè)子目錄,STM32F10x_StdPeriph_Examples文件夾存放的是ST公司提供的外設(shè)驅(qū)動(dòng)例程,在開發(fā)過程中可以借鑒這些例程快速構(gòu)建自己的外設(shè)驅(qū)動(dòng)。STM32F10x_StdPeriph_Template文件夾存放的是官方的固件庫工程模板,我們后面創(chuàng)建自己工程模板的時(shí)候就需要復(fù)制此文件夾內(nèi)的幾個(gè)文件。(4)Utilities文件夾:此文件夾是ST官方評估板的一些源文件。(5)stm32f10x_stdperiph_lib_um是固件庫的幫助文檔2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈創(chuàng)建庫函數(shù)工程模板2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈配置魔法棒2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈配置宏信息2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈配置頭文件路徑2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈編譯模板工程2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈STM32GPIO結(jié)構(gòu)2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈輸入工作模式1—輸入浮空模式2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈輸入工作模式2—輸入上拉模式2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈輸入工作模式3—輸入下拉模式2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈輸入工作模式4—模擬模式2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈輸出工作模式1—開漏輸出模式2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈輸出工作模式2—開漏復(fù)用輸出模式2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈輸出工作模式3—推挽輸出模式2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈輸出工作模式4—推挽復(fù)用輸出模式2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈GPIO工作方式上電復(fù)位后,GPIO默認(rèn)為浮空狀態(tài),部分特殊功能引腳為特定狀態(tài)推挽輸出:可以輸出強(qiáng)高低電平,連接數(shù)字器件
開漏輸出:只可以輸出強(qiáng)低電平,高電平得靠外部電阻拉高。輸出端相當(dāng)于三極管的集電極.要得到高電平狀態(tài)需要上拉電阻才行.適合于做電流型的驅(qū)動(dòng),其吸收電流的能力相對強(qiáng)(一般20ma以內(nèi))2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈GPIO相關(guān)配置寄存器每組GPIO端口的寄存器包括:兩個(gè)32位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個(gè)32位數(shù)據(jù)寄存器(GPIOx_IDR和GPIOx_ODR),一個(gè)32位置位/復(fù)位寄存器(GPIOx_BSRR),一個(gè)16位復(fù)位寄存器(GPIOx_BRR),一個(gè)32位鎖定寄存器(GPIOx_LCKR)。每個(gè)I/O端口位可以自由編程,然而I/O端口寄存器必須按32位字被訪問(不允許半字或字節(jié)訪問)。2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈GPIO相關(guān)配置寄存器-GPIOx_CRL:端口配置低寄存器-GPIOx_CRH:端口配置高寄存器
-GPIOx_IDR:端口輸入寄存器-GPIOx_ODR:端口輸出寄存器
-GPIOx_BSRR:端口位設(shè)置/清除寄存器
-GPIOx_BRR:端口位清除寄存器-GPIOx_LCKR:端口配置鎖存寄存器是每組IO口含下面7個(gè)寄存器。也就是7個(gè)寄存器,一共可以控制一組GPIO的16個(gè)IO口。2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈端口配置低寄存器(GPIOx_CRL)2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈端口配置低寄存器(GPIOx_CRL)2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈端口配置高寄存器(GPIOx_CRH)2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈端口輸入數(shù)據(jù)寄存器(GPIOx_IDR)2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈端口輸出數(shù)據(jù)寄存器(GPIOx_ODR)2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈端口輸出數(shù)據(jù)寄存器(GPIOx_ODR)2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈端口位設(shè)置/清除寄存器(GPIOx_BSRR)2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈端口位清除寄存器(GPIOx_BRR)2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈使用GPIO庫函數(shù)點(diǎn)亮流水燈2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈LEDGPIO初始化voidLED_Init(){GPIO_InitTypeDefGPIO_InitStructure;//定義結(jié)構(gòu)體變量RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB外設(shè)時(shí)鐘GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//選擇要設(shè)置的IO口GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//設(shè)置推挽輸出模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//設(shè)置傳輸速率GPIO_Init(GPIOB,&GPIO_InitStructure);/*初始化GPIOB*/GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);//將LED端口設(shè)置為高電平,熄滅所有LED}2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈流水燈功能實(shí)現(xiàn)#include"stm32f10x.h"#include"led.h"voiddelay(unsignedinti){while(i--);}intmain(){LED_Init();while(1){GPIO_ResetBits(GPIOB,GPIO_Pin_0);delay(0xFFFFF);GPIO_SetBits(GPIOB,GPIO_Pin_0);GPIO_ResetBits(GPIOB,GPIO_Pin_1);delay(0xFFFFF);GPIO_SetBits(GPIOB,GPIO_Pin_1);GPIO_ResetBits(GPIOB,GPIO_Pin_2);delay(0xFFFFF);GPIO_SetBits(GPIOB,GPIO_Pin_2);GPIO_ResetBits(GPIOB,GPIO_Pin_3);delay(0xFFFFF);GPIO_SetBits(GPIOB,GPIO_Pin_3);}}2.3任務(wù)3使用庫函數(shù)點(diǎn)亮流水燈實(shí)現(xiàn)效果舉一反三(1)快速查找?guī)讉€(gè)函數(shù):GPIO_Init、GPIO_SetBits、GPIO_RestBits,獲取函數(shù)的功能及使用方法。(2)創(chuàng)建一個(gè)自己的庫函數(shù)模板。(3)點(diǎn)亮LED2指示燈。(4)實(shí)現(xiàn)LED3閃爍。(5)實(shí)現(xiàn)LED花樣流水燈效果嵌入式系統(tǒng)原理及應(yīng)用
項(xiàng)目化教程項(xiàng)目3
數(shù)碼管控制設(shè)計(jì)與實(shí)現(xiàn)學(xué)習(xí)目標(biāo)1.掌握STM32的時(shí)鐘系統(tǒng);2.掌握STM32位帶操作;3.掌握SysTick定時(shí)器實(shí)現(xiàn)精確延時(shí);4.了解數(shù)碼管的結(jié)構(gòu)、工作原理和顯示方式;5.掌握數(shù)碼管靜態(tài)和動(dòng)態(tài)顯示設(shè)計(jì)。目錄3.1STM32的時(shí)鐘系統(tǒng)3.2STM32位帶操作3.3任務(wù)4使用位操作點(diǎn)亮流水燈3.4SysTick定時(shí)器3.5任務(wù)5數(shù)碼管顯示控制3.1STM32的時(shí)鐘系統(tǒng)STM32時(shí)鐘樹3.1STM32的時(shí)鐘系統(tǒng)STM32時(shí)鐘樹3.1STM32的時(shí)鐘系統(tǒng)1.STM32有5個(gè)時(shí)鐘源:HSI、HSE、LSI、LSE、PLL。
①、HSI是高速內(nèi)部時(shí)鐘,RC振蕩器,頻率為8MHz,精度不高。
②、HSE是高速外部時(shí)鐘,可接石英/陶瓷諧振器,或者接外部時(shí)
鐘源,頻率范圍為4MHz~16MHz。
③、LSI是低速內(nèi)部時(shí)鐘,RC振蕩器,頻率為40kHz,提供低功耗時(shí)鐘。WDG
④、LSE是低速外部時(shí)鐘,接頻率為32.768kHz的石英晶體。RTC
⑤、PLL為鎖相環(huán)倍頻輸出,其時(shí)鐘輸入源可選擇為HSI/2、HSE或者HSE/2。
倍頻可選擇為2~16倍,但是其輸出頻率最大不得超過72MHz。
2.系統(tǒng)時(shí)鐘SYSCLK可來源于三個(gè)時(shí)鐘源:
①、HSI振蕩器時(shí)鐘
②、HSE振蕩器時(shí)鐘
③、PLL時(shí)鐘3.STM32可以選擇一個(gè)時(shí)鐘信號輸出到MCO腳(PA8)上,可以選擇為PLL
輸出的2分頻、HSI、HSE、或者系統(tǒng)時(shí)鐘。4.任何一個(gè)外設(shè)在使用之前,必須首先使能其相應(yīng)的時(shí)鐘。3.1STM32的時(shí)鐘系統(tǒng)RCC相關(guān)配置寄存器typedefstruct{__IOuint32_tCR;//HSI,HSE,CSS,PLL等的使能和就緒標(biāo)志位__IOuint32_tCFGR;//PLL等的時(shí)鐘源選擇,分頻系數(shù)設(shè)定__IOuint32_tCIR;//
清除/使能時(shí)鐘就緒中斷__IOuint32_tAPB2RSTR;//APB2線上外設(shè)復(fù)位寄存器__IOuint32_tAPB1RSTR;//APB1線上外設(shè)復(fù)位寄存器__IOuint32_tAHBENR;//DMA,SDIO等時(shí)鐘使能__IOuint32_tAPB2ENR;//APB2線上外設(shè)時(shí)鐘使能__IOuint32_tAPB1ENR;//APB1線上外設(shè)時(shí)鐘使能__IOuint32_tBDCR;//備份域控制寄存器__IOuint32_tCSR;//控制狀態(tài)寄存器}RCC_TypeDef;3.1STM32的時(shí)鐘系統(tǒng)RCC相關(guān)頭文件和固件庫源文件頭文件:stm32f10x_rcc.h源文件:stm32f10x_rcc.c時(shí)鐘使能配置:
RCC_LSEConfig()、RCC_HSEConfig()、
RCC_HSICmd()、RCC_LSICmd()、RCC_PLLCmd()……時(shí)鐘源相關(guān)配置:
RCC_PLLConfig
()、
RCC_SYSCLKConfig()、
RCC_RTCCLKConfig()…分頻系數(shù)選擇配置:
RCC_HCLKConfig()、RCC_PCLK1Config()、RCC_PCLK2Config()…外設(shè)時(shí)鐘使能:RCC_APB1PeriphClockCmd()://APB1線上外設(shè)時(shí)鐘使能
RCC_APB2PeriphClockCmd();//APB2線上外設(shè)時(shí)鐘使能
RCC_AHBPeriphClockCmd();//AHB線上外設(shè)時(shí)鐘使能5.其他外設(shè)時(shí)鐘配置:
RCC_ADCCLKConfig();RCC_RTCCLKConfig();狀態(tài)參數(shù)獲取參數(shù):
RCC_GetClocksFreq();
RCC_GetSYSCLKSource();
RCC_GetFlagStatus()RCC中斷相關(guān)函數(shù):
RCC_ITConfig()、
RCC_GetITStatus()、
RCC_ClearITPendingBit()…3.2STM32位帶操作位操作原理
把每個(gè)比特膨脹為一個(gè)32位的字,當(dāng)訪問這些字的時(shí)候就達(dá)到了訪問比特的目的,比如說BSRR寄存器有32個(gè)位,那么可以映射到32個(gè)地址上,我們?nèi)ピL問(讀-改-寫)這32個(gè)地址就達(dá)到訪問32個(gè)比特的目的。3.2STM32位帶操作哪些區(qū)域支持位操作:其中一個(gè)是SRAM區(qū)的最低1MB范圍,0x20000000‐0x200FFFFF(SRAM區(qū)中的最低1MB)第二個(gè)則是片內(nèi)外設(shè)區(qū)的最低1MB范圍,
0x40000000‐0x400FFFFF(片上外設(shè)區(qū)中最低1MB)3.2STM32位帶操作3.2STM32位帶操作3.2STM32位帶操作位帶操作優(yōu)越性3.3任務(wù)4使用位操作點(diǎn)亮流水燈system.h里面對GPIO輸入輸出部分功能實(shí)現(xiàn)了位帶操作:#defineBITBAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))#defineMEM_ADDR(addr)*((volatileunsignedlong*)(addr))#defineBIT_ADDR(addr,bitnum)MEM_ADDR(BITBAND(addr,bitnum))//IO口地址映射#defineGPIOA_ODR_Addr(GPIOA_BASE+12)//0x4001080C#defineGPIOB_ODR_Addr(GPIOB_BASE+12)//0x40010C0C#defineGPIOF_ODR_Addr(GPIOF_BASE+12)//0x40011A0C#defineGPIOG_ODR_Addr(GPIOG_BASE+12)//0x40011E0C#defineGPIOA_IDR_Addr(GPIOA_BASE+8)//0x40010808#defineGPIOB_IDR_Addr(GPIOB_BASE+8)//0x40010C08#defineGPIOG_IDR_Addr(GPIOG_BASE+8)//0x40011E08//IO口操作,只對單一的IO口!//確保n的值小于16!#definePAout(n)BIT_ADDR(GPIOA_ODR_Addr,n)//輸出#definePAin(n)BIT_ADDR(GPIOA_IDR_Addr,n)//輸入#definePBout(n)BIT_ADDR(GPIOB_ODR_Addr,n)//輸出#definePBin(n)BIT_ADDR(GPIOB_IDR_Addr,n)//輸入…#definePFout(n)BIT_ADDR(GPIOF_ODR_Addr,n)//輸出#definePFin(n)BIT_ADDR(GPIOF_IDR_Addr,n)//輸入#definePGout(n)BIT_ADDR(GPIOG_ODR_Addr,n)//輸出#definePGin(n)BIT_ADDR(GPIOG_IDR_Addr,n)//輸入3.3任務(wù)4使用位操作點(diǎn)亮流水燈PB0LED閃爍#defineled0PBout(0)//PB0引腳連接LED0#defineled1PBout(1)//PB1引腳連接LED1#defineled2PCout(2)//PB2引腳連接LED2#defineled3PCout(3)//PB3引腳連接LED3#include"system.h"#include"led.h"voiddelay(u32i){while(i--);}intmain(){LED_Init();while(1){led0=!led0;delay(6000000);}}3.3任務(wù)4使用位操作點(diǎn)亮流水燈LED流水燈led0=1;led1=0;led2=1;led3=1;delay(6000000);led0=1;led1=1;led2=0;led3=1;delay(6000000);led0=1;led1=1;led2=1;led3=0;delay(6000000);}}#include"system.h"#include"led.h"voiddelay(u32i){while(i--);}intmain(){LED_Init();while(1){led0=0;led1=1;led2=1;led3=1;delay(6000000);3.3任務(wù)4使用位操作點(diǎn)亮流水燈測試效果3.4SysTick定時(shí)器Systick定時(shí)器是什么?Systick定時(shí)器,是一個(gè)簡單的定時(shí)器,對于CM3,CM4內(nèi)核芯片,都有Systick定時(shí)器。Systick定時(shí)器常用來做延時(shí),或者實(shí)時(shí)系統(tǒng)的心跳時(shí)鐘。這樣可以節(jié)省MCU資源,不用浪費(fèi)一個(gè)定時(shí)器。比如UCOS中,分時(shí)復(fù)用,需要一個(gè)最小的時(shí)間戳,一般在STM32+UCOS系統(tǒng)中,都采用Systick做UCOS心跳時(shí)鐘。3.4SysTick定時(shí)器Systick定時(shí)器就是系統(tǒng)滴答定時(shí)器,一個(gè)24
位的倒計(jì)數(shù)定時(shí)器,計(jì)到0
時(shí),將從RELOAD
寄存器中自動(dòng)重裝載定時(shí)初值。只要不把它在SysTick
控制及狀態(tài)寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。SysTick定時(shí)器被捆綁在NVIC中,用于產(chǎn)生SYSTICK異常(異常號:15)。Systick中斷的優(yōu)先級也可以設(shè)置。3.4SysTick定時(shí)器Systick相關(guān)寄存器SysTick
控制和狀態(tài)寄存器-CTRL
對于STM32,外部時(shí)鐘源是HCLK(AHB總線時(shí)鐘)的1/8
內(nèi)核時(shí)鐘是HCLK時(shí)鐘
配置函數(shù):SysTick_CLKSourceConfig();3.4SysTick定時(shí)器Systick相關(guān)寄存器SysTick
重裝載數(shù)值寄存器-LOADSysTick
當(dāng)前值寄存器-VAL3.4SysTick定時(shí)器Systick庫函數(shù)
固件庫中的Systick相關(guān)函數(shù):SysTick_CLKSourceConfig()//Systick時(shí)鐘源選擇misc.c文件中SysTick_Config(uint32_tticks)//初始化systick,時(shí)鐘為HCLK,并開啟中斷
//core_cm3.h/core_cm4.h文件中Systick中斷服務(wù)函數(shù):voidSysTick_Handler(void);3.4SysTick定時(shí)器Systick庫函數(shù)
SysTick_CLKSourceConfig函數(shù):voidSysTick_CLKSourceConfig(uint32_tSysTick_CLKSource){/*Checktheparameters*/assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));if(SysTick_CLKSource==SysTick_CLKSource_HCLK){SysTick->CTRL|=SysTick_CLKSource_HCLK;}else{SysTick->CTRL&=SysTick_CLKSource_HCLK_Div8;}}3.4SysTick定時(shí)器Systick庫函數(shù)
SysTick_CLKSourceConfig函數(shù):static__INLINEuint32_tSysTick_Config(uint32_tticks){if(ticks>SysTick_LOAD_RELOAD_Msk)return(1);/*Reloadvalueimpossible*/
/*setreloadregister*/SysTick->LOAD=(ticks&SysTick_LOAD_RELOAD_Msk)-1;/*setPriorityforCortex-M0SystemInterrupts*/NVIC_SetPriority(SysTick_IRQn,(1<<__NVIC_PRIO_BITS)-1);SysTick->VAL=0;/*LoadtheSysTickCounterValue*/SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|SysTick_CTRL_TICKINT_Msk|SysTick_CTRL_ENABLE_Msk;/*EnableSysTickIRQandSysTickTimer*/return(0);/*Functionsuccessful*/}3.4SysTick定時(shí)器delay延時(shí)static__IOuint32_tTimingDelay;voidDelay(__IOuint32_tnTime){TimingDelay=nTime;while(TimingDelay!=0);}voidSysTick_Handler(void){if(TimingDelay!=0x00){TimingDelay--;}}intmain(void){…if(SysTick_Config(SystemCoreClock/1000))//systick時(shí)鐘為HCLK,中斷時(shí)間間隔1ms{while(1);}while(1){Delay(200);//2ms…}}用中斷的方式實(shí)現(xiàn)delay延時(shí)3.4SysTick定時(shí)器使用SysTick定時(shí)器實(shí)現(xiàn)流水燈#include"system.h"#include"SysTick.h"#include"led.h"intmain(){SysTick_Init(72);LED_Init();while(1){led1=0;led2=1;delay_ms(500);//精確延時(shí)500msled1=1;led2=0;delay_ms(500);}}3.5任務(wù)5數(shù)碼管顯示控制LED數(shù)碼管內(nèi)部引腳圖3.5任務(wù)5數(shù)碼管顯示控制8段LED段碼顯示字符共陰極段碼共陽極段碼顯示字符共陰極段碼共陽極段碼03FHC0HC39HC6H106HF9Hd5EHA1H25BHA4HE79H86H34FHB0HF71H8EH466H99HH76H89H56DH92HL38HC7H67DH82Hn37HC8H707HF8Ho5CHA3H87FH80HP73H8CH96FH90HU3EHC1HA77H88H滅00HFFHb7CH83H
3.5任務(wù)5數(shù)碼管顯示控制N位LED數(shù)碼管結(jié)構(gòu)3.5任務(wù)5數(shù)碼管顯示控制4位LED動(dòng)態(tài)顯示電路3.5任務(wù)5數(shù)碼管顯示控制數(shù)碼管模塊電路圖3.5任務(wù)5數(shù)碼管顯示控制初始化數(shù)碼管IOvoidSMG_Init(){GPIO_InitTypeDefGPIO_InitStructure;//聲明一個(gè)結(jié)構(gòu)體變量,用來初始化GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//開啟GPIO時(shí)鐘/*配置GPIO的模式和IO口*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;//選擇要設(shè)置的IO口GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);/*初始化GPIO*/}3.5任務(wù)5數(shù)碼管顯示控制靜態(tài)顯示核心代碼#include"system.h"#include"SysTick.h"#include"led.h"#include"smg.h"u8smgduan[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//0~F數(shù)碼管段選數(shù)據(jù)intmain(){u8i=0;SysTick_Init(72);LED_Init();SMG_Init();while(1){led0=1;for(i=0;i<16;i++){GPIO_Write(GPIOB,(u16)(~smgduan[i]));delay_ms(1000);}}}3.5任務(wù)5數(shù)碼管顯示控制靜態(tài)顯示效果3.5任務(wù)5數(shù)碼管顯示控制數(shù)碼管動(dòng)態(tài)顯示#include"system.h"#include"SysTick.h"#include"led.h"#include"smg.h"u8smgduan[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//0~F數(shù)碼管段選數(shù)據(jù)intmain(){u8i=0;SysTick_Init(72);LED_Init();SMG_Init();while(1){led0=1;led1=0;led2=0;led3=0;GPIO_Write(GPIOB,(u16)(~0x3F));delay_ms(1000);led0=0;led1=1;led2=0;led3=0;GPIO_Write(GPIOB,(u16)(~0x06));delay_ms(1000);led0=0;led1=0;led2=1;led3=0;GPIO_Write(GPIOB,(u16)(~0x5B));delay_ms(1000);led0=0;led1=0;led2=0;led3=1;GPIO_Write(GPIOB,(u16)(~0x4F));delay_ms(1000);}}3.5任務(wù)5數(shù)碼管顯示控制數(shù)碼管動(dòng)態(tài)顯示效果舉一反三(1)通過修改delay_ms函數(shù)內(nèi)的延時(shí)時(shí)間,觀察LED流水燈效果(注意延時(shí)函數(shù)內(nèi)的參數(shù)最大范圍,不能超過最大值,否則延時(shí)不準(zhǔn)確);(2)通過修改系統(tǒng)時(shí)鐘調(diào)節(jié)LED閃爍速度;(3)使用位操作實(shí)現(xiàn)D2指示燈閃爍;(4)使用位操作實(shí)現(xiàn)LED流水燈效果;(5)設(shè)計(jì)一個(gè)9秒鐘倒計(jì)時(shí)器。嵌入式系統(tǒng)原理及應(yīng)用
項(xiàng)目化教程項(xiàng)目4蜂鳴器控制設(shè)計(jì)與實(shí)現(xiàn)學(xué)習(xí)目標(biāo)1.掌握STM32中斷系統(tǒng)及其軟件配置;2.掌握按鍵控制程序設(shè)計(jì);3.掌握蜂鳴器控制程序設(shè)計(jì);4.利用外中斷實(shí)現(xiàn)按鍵控制蜂鳴器發(fā)聲。目錄4.1中斷介紹4.2任務(wù)6按鍵控制4.3任務(wù)7蜂鳴器控制4.4任務(wù)8外部中斷控制4.1中斷介紹中斷概念
在嵌入式系統(tǒng)應(yīng)用中,當(dāng)內(nèi)部、外部隨機(jī)事件發(fā)生時(shí),能及時(shí)響應(yīng)并實(shí)時(shí)處理都是利用中斷技術(shù)實(shí)現(xiàn)的。中斷的發(fā)生是由內(nèi)部或外部因素隨機(jī)決定的,程序中無法事先安排調(diào)用指令,所以響應(yīng)中斷服務(wù)程序的過程是由硬件自動(dòng)完成的。中斷系統(tǒng)的應(yīng)用大大提高了CPU的工作效率。程序在執(zhí)行過程中由于內(nèi)部或外界的隨機(jī)事件而被中間打斷的情況稱為“中斷”。引發(fā)中斷的稱為中斷源。4.1中斷介紹中斷嵌套(1)若是同級中斷源申請中斷,CPU將不予理睬;
(2)若是高級中斷源申請中斷,CPU將轉(zhuǎn)去響應(yīng)高級中斷請求,待高級中斷服務(wù)程序執(zhí)行完畢,CPU再轉(zhuǎn)回低級中斷服務(wù)程序斷點(diǎn)處接著執(zhí)行。
有些中斷還能夠被其他高優(yōu)先級的中斷所中斷,那么這種情況又叫做中斷的嵌套。當(dāng)CPU正在執(zhí)行中斷服務(wù)程序時(shí),又有其他中斷源發(fā)出中斷申請,CPU要分析判斷,決定是否響應(yīng)該中斷。判決規(guī)則如下:4.1中斷介紹NVIC英文全稱是NestedVectoredInterruptController,意思是嵌套向量中斷控制器,它屬于CM3內(nèi)核的一個(gè)外設(shè),控制著芯片的中斷相關(guān)功能。4.1中斷介紹中斷管理方法首先,對STM32中斷進(jìn)行分組,組0~4。同時(shí),對每個(gè)中斷設(shè)置一個(gè)搶占優(yōu)先級和一個(gè)響應(yīng)優(yōu)先級值。分組配置是在寄存器SCB->AIRCR中配置:組AIRCR[10:8]IPbit[7:4]分配情況分配結(jié)果01110:40位搶占優(yōu)先級,4位響應(yīng)優(yōu)先級11101:31位搶占優(yōu)先級,3位響應(yīng)優(yōu)先級21012:22位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級31003:13位搶占優(yōu)先級,1位響應(yīng)優(yōu)先級40114:04位搶占優(yōu)先級,0位響應(yīng)優(yōu)先級4.1中斷介紹搶占優(yōu)先級&響應(yīng)優(yōu)先級區(qū)別:高優(yōu)先級的搶占優(yōu)先級是可以打斷正在進(jìn)行的低搶占優(yōu)先級中斷的。搶占優(yōu)先級相同的中斷,高響應(yīng)優(yōu)先級不可以打斷低響應(yīng)優(yōu)先級的中斷。搶占優(yōu)先級相同的中斷,當(dāng)兩個(gè)中斷同時(shí)發(fā)生的情況下,哪個(gè)響應(yīng)優(yōu)先級高,哪個(gè)先執(zhí)行。如果兩個(gè)中斷的搶占優(yōu)先級和響應(yīng)優(yōu)先級都是一樣的話,則看哪個(gè)中斷先發(fā)生就先執(zhí)行;4.1中斷介紹中斷優(yōu)先級分組函數(shù):voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup);voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup){assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));SCB->AIRCR=AIRCR_VECTKEY_MASK|NVIC_PriorityGroup;}NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);4.1中斷介紹中斷設(shè)置相關(guān)寄存器__IOuint8_tIP[240];//中斷優(yōu)先級控制的寄存器組__IOuint32_tISER[8];//中斷使能寄存器組__IOuint32_tICER[8];//中斷失能寄存器組__IOuint32_tISPR[8];//中斷掛起寄存器組__IOuint32_tICPR[8];//中斷解掛寄存器組__IOuint32_tIABR[8];//中斷激活標(biāo)志位寄存器組4.1中斷介紹MDK中NVIC寄存器結(jié)構(gòu)體typedefstruct{__IOuint32_tISER[8];uint32_tRESERVED0[24];
__IOuint32_tICER[8];uint32_tRSERVED1[24];
__IOuint32_tISPR[8];uint32_tRESERVED2[24];
__IOuint32_tICPR[8];uint32_tRESERVED3[24];__IOuint32_tIABR[8];uint32_tRESERVED4[56];__IOuint8_tIP[240];uint32_tRESERVED5[644];__Ouint32_tSTIR;}NVIC_Type;4.1中斷介紹中斷優(yōu)先級設(shè)置步驟系統(tǒng)運(yùn)行后先設(shè)置中斷優(yōu)先級分組。調(diào)用函數(shù):voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup);
整個(gè)系統(tǒng)執(zhí)行過程中,只設(shè)置一次中斷分組。②針對每個(gè)中斷,設(shè)置對應(yīng)的搶占優(yōu)先級和響應(yīng)優(yōu)先級:voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct);③如果需要掛起/解掛,查看中斷當(dāng)前激活狀態(tài),分別調(diào)用相關(guān)函數(shù)即可。4.2任務(wù)6按鍵控制
按鍵是一種電子開關(guān),使用時(shí)按下開關(guān)按鈕就可使開關(guān)接通,釋放時(shí),開關(guān)斷開。通常的按鍵所用開關(guān)為機(jī)械彈性開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí),由于機(jī)械彈性作用的影響,通常伴隨有一定時(shí)間的觸點(diǎn)機(jī)械抖動(dòng),然后才穩(wěn)定下來。鍵按下時(shí)的抖動(dòng)被稱為前沿抖動(dòng),釋放時(shí)的抖動(dòng)被稱為后沿抖動(dòng),抖動(dòng)時(shí)間的長短與開關(guān)的機(jī)械特性有關(guān),持續(xù)時(shí)間一般為5~10ms4.2任務(wù)6按鍵控制硬件設(shè)計(jì)從原理圖可以知道,按鍵KEY0連接在芯片的PC1引腳上,按鍵KEY1連接在芯片的PC13引腳上。按鍵另一端是連接在GND上,采用獨(dú)立式按鍵接法,按下時(shí)輸入到芯片管腳即為低電平。4.2任務(wù)6按鍵控制軟件設(shè)計(jì)voidKEY_Init(void){GPIO_InitTypeDefGPIO_InitStructure;//定義結(jié)構(gòu)體變量RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_13;//選擇要設(shè)置的IO口GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉輸入GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//設(shè)置傳輸速率GPIO_Init(GPIOC,&GPIO_InitStructure);}KEY_Init()函數(shù)用來初始化按鍵的端口及時(shí)鐘。要知道按鍵是否按下,就需要讀取按鍵所對應(yīng)的IO口電平狀態(tài),因此需要把GPIO配置為輸入模式,因?yàn)榘存I一端是接地的,當(dāng)按下后管腳即為低電平,所以需要將管腳配置為上拉輸入模式,這樣管腳的默認(rèn)電平就為高電平,如果讀取到管腳的電平為低電平時(shí),就說明按鍵按下。4.2任務(wù)6按鍵控制按鍵檢測函數(shù)u8KEY_Scan(u8mode){staticu8key=1;if(key==1&&(KEY0==0||KEY1==0))//任意鍵按下{delay_ms(10);//消抖key=0;if(KEY0==0){returnKEY0;}elseif(KEY1==0){returnKEY1;}}elseif(KEY0==1&&KEY1==1)//無按鍵按下{key=1;}if(mode==1)//連續(xù)按鍵按下{key=1;}return0;}#ifndef_key_H#define_key_H#include"system.h"http://使用位操作定義#defineKEY0PCin(1)#defineKEY1PCin(13)4.2任務(wù)6按鍵控制主函數(shù)#include"system.h"#include"SysTick.h"#include"led.h"#include"key.h"intmain(){u8key;SysTick_Init(72);LED_Init();KEY_Init();while(1){key=KEY_Scan(0);//掃描按鍵switch(key){caseKEY0:led2=0;break;//按下KEY0按鍵,LED2指示燈亮caseKEY1:led2=1;break;//按下KEY1按鍵,LED2指示燈滅}}}4.2任務(wù)6按鍵控制測試效果當(dāng)按下KEY0鍵,LED2指示燈點(diǎn)亮;當(dāng)按下KEY1鍵,LED2指示燈熄滅4.3任務(wù)7蜂鳴器控制
蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。蜂鳴器主要分為壓電式和電磁式兩種類型。
有源蜂鳴器與無源蜂鳴器的區(qū)別:這里的“源”不是指電源,而是指震蕩源。也就是說,有源蜂鳴器內(nèi)部帶震蕩源,所以只要一通電就會叫;而無源內(nèi)部不帶震蕩源,所以如果用直流信號無法令其鳴叫,必須用2~5KHz的方波去驅(qū)動(dòng)它。有源蜂鳴器往往比無源的貴,就是因?yàn)槔锩娑鄠€(gè)震蕩電路。無源蜂鳴器的優(yōu)點(diǎn)是便宜、聲音頻率可控,可以做出“哆瑞咪發(fā)嗦啦西”的效果;有源蜂鳴器的優(yōu)點(diǎn)是程序控制方便。4.3任務(wù)7蜂鳴器控制硬件設(shè)計(jì)4.3任務(wù)7蜂鳴器控制蜂鳴器初始化函數(shù)voidBEEP_Init()//端口初始化{GPIO_InitTypeDefGPIO_InitStructure;//聲明一個(gè)結(jié)構(gòu)體變量,用來初始化GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*開啟GPIO時(shí)鐘*//*配置GPIO的模式和IO口*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;//選擇要設(shè)置的IO口GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//設(shè)置推挽輸出模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//設(shè)置傳輸速率GPIO_Init(GPIOA,&GPIO_InitStructure);/*初始化GPIO*/}4.3任務(wù)7蜂鳴器控制主函數(shù)#include"system.h"#include"SysTick.h"#include"beep.h"intmain(){u16i=0;SysTick_Init(72);LED_Init();BEEP_Init();while(1){i++;if(i%20==0){beep=!beep;}delay_us(10);}}4.3任務(wù)7蜂鳴器控制測試效果將工程程序編譯下載到開發(fā)板內(nèi),可以聽到蜂鳴器發(fā)聲4.4任務(wù)8外部中斷控制EXTI結(jié)構(gòu)框圖4.4任務(wù)8外部中斷控制STM32的每個(gè)IO都可以作為外部中斷輸入。STM32的中斷控制器支持19個(gè)外部中斷/事件請求:線0~15:對應(yīng)外部IO口的輸入中斷。線16:連接到PVD輸出。線17:連接到RTC鬧鐘事件。線18:連接到USB喚醒事件。每個(gè)外部中斷線可以獨(dú)立的配置觸發(fā)方式(上升沿,下降沿或者雙邊沿觸發(fā)),觸發(fā)/屏蔽,專用的狀態(tài)位。從上面可以看出,STM32供IO使用的中斷線只有16個(gè),但是STM32F10x系列的IO口多達(dá)上百個(gè),STM32F103ZET6(112),STM32F103RCT6(51),那么中斷線怎么跟io口對應(yīng)呢?4.4任務(wù)8外部中斷控制GPIOx.0映射到EXTI0GPIOx.1映射到EXTI1…GPIOx.15映射到EXTI154.4任務(wù)8外部中斷控制IO口外部中斷在中斷向量表中只分配了7個(gè)中斷向量,也就是
只能使用7個(gè)中斷服務(wù)函數(shù)從表中可以看出,外部中斷線5~9分配一個(gè)中斷向量,共用一個(gè)服務(wù)函數(shù)外部中斷線10~15分配一個(gè)中斷向量,共用一個(gè)中斷服務(wù)函數(shù)。4.4任務(wù)8外部中斷控制EXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI15_10_IRQHandler中斷服務(wù)函數(shù)列表:4.4任務(wù)8外部中斷控制外部中斷常用庫函數(shù)①voidGPIO_EXTILineConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);//設(shè)置IO口與中斷線的映射關(guān)系exp:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);②voidEXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct);//初始化中斷線:觸發(fā)方式等③ITStatusEXTI_GetITStatus(uint32_tEXTI_Line);//判斷中斷線中斷狀態(tài),是否發(fā)生④voidEXTI_ClearITPendingBit(uint32_tEXTI_Line);//清除中斷線上的中斷標(biāo)志位4.4任務(wù)8外部中斷控制EXTI_Init函數(shù)voidEXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct);typedef
struct{uint32_tEXTI_Line;//指定要配置的中斷線
EXTIMode_TypeDef
EXTI_Mode;//模式:事件OR中斷
EXTITrigger_TypeDef
EXTI_Trigger;//觸發(fā)方式:上升沿/下降沿/雙沿觸發(fā)
FunctionalState
EXTI_LineCmd;//使能OR失能}EXTI_InitTypeDef;
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure); 4.4任務(wù)8外部中斷控制初始化IO口為輸入。
GPIO_Init();②
開啟IO口復(fù)用時(shí)鐘。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);設(shè)置IO口與中斷線的映射關(guān)系。
voidGPIO_EXTILineConfig();初始化線上中斷,設(shè)置觸發(fā)條件等。
EXTI_Init();配置中斷分組(NVIC),并使能中斷。
NVIC_Init();⑥編寫中斷服務(wù)函數(shù)。
EXTIx_IRQHandler();清除中斷標(biāo)志位
EXTI_ClearITPendingBit();外部中斷的一般配置步驟:4.4任務(wù)8外部中斷控制EXTI初始化函數(shù)voidMy_EXTI_Init(void){NVIC_InitTypeDefNVIC_InitStructure;EXTI_InitTypeDefEXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);//選擇PC1管腳作為外部中斷線路//EXTI1NVIC配置NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;//EXTI1中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占優(yōu)先級NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//響應(yīng)優(yōu)先級NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能NVIC_Init(&NVIC_InitStructure);//根據(jù)指定的參數(shù)初始化NVIC寄存器
EXTI_InitStructure.EXTI_Line=EXTI_Line1;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStructure);}4.4任務(wù)8外部中斷控制EXTI中斷函數(shù)voidEXTI1_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line1)==1){delay_ms(10);if(KEY0==1){BEEP=0;}}EXTI_ClearITPendingBit(EXTI_Line1);}4.4任務(wù)8外部中斷控制主函數(shù)intmain(){u8i;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷優(yōu)先級分組,分2組BEEP_Init();KEY_Init();My_EXTI_Init();//外部中斷初始化while(1){i++;if(i%20==0){BEEP=!BEEP;}delay_ms(10); }}4.4任務(wù)8外部中斷控制測試效果將工程程序編譯后下載到開發(fā)板內(nèi),當(dāng)按下按鍵,蜂鳴器發(fā)聲舉一反三(1)打開之前編寫好的庫函數(shù)程序,查看misc.c、misc.h、core_cm3.h及startup_stm32f10x_hd.s文件內(nèi)容,對照本章提到的函數(shù)及結(jié)構(gòu)體等加深印象。(2)使用連續(xù)掃描模式調(diào)節(jié)蜂鳴器聲音和音調(diào)。(溫馨提示:如果連續(xù)掃描返回鍵值太快,可以進(jìn)行一定處理,間隔一段時(shí)間讓其按鍵鍵值返回)。(3)改變蜂鳴器發(fā)聲音調(diào)和聲音大?。剀疤崾荆焊淖円粽{(diào)即修改管腳輸出頻率,改變聲音大小即修改占空比)。(4)使用外部中斷方式來調(diào)節(jié)蜂鳴器的音調(diào)和聲音。(溫馨提示:方法和按鍵實(shí)驗(yàn)章節(jié)類似,只不過這里采用外部中斷來處理)。嵌入式系統(tǒng)原理及應(yīng)用
項(xiàng)目化教程項(xiàng)目5呼吸燈控制設(shè)計(jì)與實(shí)現(xiàn)學(xué)習(xí)目標(biāo)1.掌握STM32通用定時(shí)器的原理及軟件配置;2.掌握STM32通用定時(shí)器中斷及軟件配置;3.掌握STM32PWM的原理;4.利用定時(shí)器實(shí)現(xiàn)PWM呼吸燈。目錄5.1定時(shí)器介紹5.2任務(wù)9使用定時(shí)器實(shí)現(xiàn)PWM控制5.1定時(shí)器介紹通用定時(shí)器的內(nèi)部結(jié)構(gòu)框圖5.1定時(shí)器介紹5.1定時(shí)器介紹5.1定時(shí)器介紹5.1定時(shí)器介紹5.1定時(shí)器介紹5.1定時(shí)器介紹5.1定時(shí)器介紹定時(shí)器中斷實(shí)驗(yàn)APB1時(shí)鐘X1/X2F(CK_PSC)
÷NCK_CNT內(nèi)部時(shí)鐘選擇5.1定時(shí)器介紹定時(shí)器中斷實(shí)驗(yàn)時(shí)鐘計(jì)算方法:5.1定時(shí)器介紹定時(shí)器中斷實(shí)驗(yàn)通用定時(shí)器可以向上計(jì)數(shù)、向下計(jì)數(shù)、向上向下雙向計(jì)數(shù)模式。①向上計(jì)數(shù)模式:計(jì)數(shù)器從0計(jì)數(shù)到自動(dòng)加載值(TIMx_ARR),然后重新從0開始計(jì)數(shù)并且產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件。②向下計(jì)數(shù)模式:計(jì)數(shù)器從自動(dòng)裝入的值(TIMx_ARR)開始向下計(jì)數(shù)到0,然后從自動(dòng)裝入的值重新開始,并產(chǎn)生一個(gè)計(jì)數(shù)器向下溢出事件。③中央對齊模式(向上/向下計(jì)數(shù)):計(jì)數(shù)器從0開始計(jì)數(shù)到自動(dòng)裝入的值-1,產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件,然后向下計(jì)數(shù)到1并且產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件;然后再從0開始重新計(jì)數(shù)。計(jì)數(shù)器模式5.1定時(shí)器介紹向下計(jì)數(shù)模式(時(shí)鐘分頻因子=1)5.1定時(shí)器介紹向上計(jì)數(shù)模式(時(shí)鐘分頻因子=1)5.1定時(shí)器介紹中央對齊計(jì)數(shù)模式(時(shí)鐘分頻因子=1ARR=6)5.1定時(shí)器介紹計(jì)數(shù)器當(dāng)前值寄存器CNT5.1定時(shí)器介紹預(yù)分頻寄存器TIMx_PSC5.1定時(shí)器介紹自動(dòng)重裝載寄存器(TIMx_ARR)5.1定時(shí)器介紹控制寄存器1(TIMx_CR1)5.1定時(shí)器介紹DMA中斷使能寄存器(TIMx_DIER)5.1定時(shí)器介紹常用庫函數(shù)voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);定時(shí)器參數(shù)初始化:voidTIM_Cmd(TIM_TypeDef*TIMx,FunctionalStateNewState)定時(shí)器使能函數(shù):定時(shí)器中斷使能函數(shù):voidTIM_ITConfig(TIM_TypeDef*TIMx,uint16_tTIM_IT,FunctionalStateNewState);5.1定時(shí)器介紹狀態(tài)標(biāo)志位獲取和清除FlagStatusTIM_GetFlagStatus(TIM_TypeDef*TIMx,uint16_tTIM_FLAG);voidTIM_ClearFlag(TIM_TypeDef*TIMx,uint16_tTIM_FLAG);ITStatusTIM_GetITStatus(TIM_TypeDef*TIMx,uint16_tTIM_IT);voidTIM_ClearITPendingBit(TIM_TypeDef*TIMx,uint16_tTIM_IT);5.1定時(shí)器介紹定時(shí)器中斷實(shí)現(xiàn)步驟能定時(shí)器時(shí)鐘。
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 屋面水泥瓦施工方案
- 耐腐蝕泵項(xiàng)目風(fēng)險(xiǎn)識別與評估綜合報(bào)告
- 青少年心理健康與行為發(fā)展教育實(shí)踐
- 浙江華遠(yuǎn):盈利預(yù)測報(bào)告及審核報(bào)告
- 金浦鈦業(yè):上海東邑酒店管理有限公司2024年1-9月財(cái)務(wù)報(bào)表審計(jì)報(bào)告
- 山東石雕六角亭施工方案
- 埋地涂塑鋼管安裝施工方案
- 項(xiàng)目監(jiān)理實(shí)施方案
- 黃土邊坡錨桿施工方案
- 電氣設(shè)備二次搬運(yùn)施工方案
- 2024年上海市楊浦區(qū)高三二模英語試卷及答案
- MOOC 高等數(shù)學(xué)(上)-西北工業(yè)大學(xué) 中國大學(xué)慕課答案
- 部編版小學(xué)語文四年級下冊第二單元教材分析
- 等差數(shù)列公開課課件
- 小學(xué)生學(xué)習(xí)習(xí)慣養(yǎng)成知識講座(定)
- 2024年OTC焊接機(jī)器人基本操作培訓(xùn)
- 合肥通用職業(yè)技術(shù)學(xué)院單招《職業(yè)技能測試》參考試題庫(含答案)
- 小學(xué)五年級《美術(shù)》上冊知識點(diǎn)匯總
- 生物工程設(shè)備課件
- 提高團(tuán)隊(duì)協(xié)作與溝通技巧
- 2022版高中生物必修二第一章測試題及答案解析
評論
0/150
提交評論