嵌入式系統導論(第2版) 課件 第8、9章 STM32的DMA接口、STM32的定時器接口_第1頁
嵌入式系統導論(第2版) 課件 第8、9章 STM32的DMA接口、STM32的定時器接口_第2頁
嵌入式系統導論(第2版) 課件 第8、9章 STM32的DMA接口、STM32的定時器接口_第3頁
嵌入式系統導論(第2版) 課件 第8、9章 STM32的DMA接口、STM32的定時器接口_第4頁
嵌入式系統導論(第2版) 課件 第8、9章 STM32的DMA接口、STM32的定時器接口_第5頁
已閱讀5頁,還剩78頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

嵌入式系統導論主講教師:第8章STM32的DMA接口本章內容提要8.1DMA控制器8.2DMA應用示例:USART接口的DMA傳輸8.3DMA、USART和GPIO的綜合應用數據傳送方式程序查詢傳送中斷傳送DMA傳送8.1DMA控制器DMA傳送希望克服程序控制傳送的不足:外設→CPU→存儲器外設←CPU←存儲器直接存儲器存取DMA:外設→存儲器外設←存儲器CPU釋放總線,由DMA控制器管理查詢要等,中斷太煩,來個直接的DMA傳送過程1)DMA預處理2)DMA請求和應答3)DMA傳送DMA讀:存儲器→外設DMA寫:存儲器←外設4)增減地址和計數,判斷傳送是否完成STM32的DMA控制器直接存儲器存取DMA(DirectMemoryAccess)利用系統總線直接在外設與存儲器之間進行 大量和高速數據傳輸的方法STM32設計有2個DMA控制器單元DMA1單元,支持7個DMA通道DMA2單元,支持5個DMA通道具有多達12個獨立的可配置DMA通道支持存儲器到存儲器、外設到存儲器、 存儲器到外設和外設到外設的自動傳輸每個通道都支持軟件觸發DMA框圖DMA1各通道的請求外設通道1通道2通道3通道4通道5通道6通道7ADC1ADC1SPI/I2SSPI1_RXSPI1_TXSPI/I2S2_RXSPI/I2S2_TXUSARTUSART3_TXUSART3_RXUSART1_TXUSART1_RXUSART2_RXUSART2_TXI2CI2C2_TXI2C2_RXI2C1_TXI2C1_RXTIM1TIM1_CH1TIM1_CH4TIM1_TRIGTIM1_COMTIM1_UPTIM1_CH3TIM2TIM2_CH3TIM2_UPTIM2_CH1TIM2_CH2TIM2_CH4TIM3TIM3_CH3TIM3_CH3TIM3_UPTIM3_CH1TIM3_TRIGTIM4TIM4_CH1TIM4_CH2TIM4_CH3TIM4_UPDMA1各條通道連接的外設參考手冊STM32主要外設都支持DMADMA2各通道的請求外設通道1通道2通道3通道4通道5ADC3ADC3SPI/I2S3SPI/I2S3_RXSPI/I2S3_TXUART4UART4_RXUART4_TXSDIOSDIOTIM5TIM1_CH1TIM1_CH4TIM1_TRIGTIM1_COMTIM1_UPTIM6/DAC_Channel1TIM6_UP/DAC_Channel1TIM7TIM7_UP/DAC_Channel2TIM8TIM8_CH3TIM8_UPTIM8_CH4TIM8_TRIGTIM8_COMTIM8_CH1TIM8_CH2DMA2各條通道連接的外設DMA通道的優先級和中斷每個DMA通道可以由應用程序賦予4個優先級之一(很高、高級、中級和低級)在仲裁階段,高優先級的通道優先獲得總線響應相同優先級時,通道號小的通道優先獲得總線響應每個DMA通道都可以在3個時刻產生中斷請求DMA傳輸過半HTIFDMA傳輸完成TCIFDMA傳輸錯誤TEIF每個DMA通道都有自己的中斷向量(除大容量產品中,DMA2通道4和DMA2通道5的中斷被映射在同一個中斷向量上)DMA通道的寄存器每個DMA通道由4個寄存器控制配置寄存器CCR定義DMA傳輸的特性傳輸數量寄存器CNDTR保存傳輸的數據個數外設地址寄存器CPAR保存外設的地址存儲器地址寄存器CMAR保存存儲器的地址中斷操作由兩個中斷寄存器控制中斷狀態寄存器ISR中斷標志清除寄存器IFCR參考手冊DMA寄存器寄存器縮寫寄存器中文名稱DMA_CCR配置寄存器DMA_CNDTR傳輸數量寄存器DMA_CPAR外設地址寄存器DMA_CMAR存儲器地址寄存器DMA_ISR中斷狀態寄存器DMA_IFCR中斷標志清除寄存器8.2DMA應用示例:USART接口的DMA傳輸【例8-1】將主存一個數據塊采用DMA方式傳輸到USART1發送接口(TX)DMA傳輸前,讓所有LED燈滅DMA傳輸中,處理器繼續執行程序讓LED1燈亮DMA傳輸后,產生中斷讓LED2燈亮將USART1端口連接PC機串口,重定向在PC機遠程終端程序中顯示傳輸結果使用DMA方式進行USART1發送屬于DMA1單元的通道4(USART1_TX)DMA傳輸的開發方法使用DMA傳輸之前,需要進行DMA初始化配置(1)開啟DMA時鐘:RCC_AHBPeriphClockCmd函數(2)如果使用中斷,進行DMA的NVIC配置(3)DMA傳輸的參數配置:DMA_Init函數(4)允許DMA傳輸:DMA_Cmd函數(5)如果使用中斷,設置DMA傳輸何時產生中斷:

DMA_ITConfig函數當進行DMA傳輸時,需要進行DMA請求例如,USART使用USART_DMACmd函數開始DMA傳輸后,處理器可以繼續執行程序啟動DMA單元時鐘使用STM32庫函數

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMAx,ENABLE);DMAx是DMA1或DMA2直接寄存器編程通過允許RCC單元的AHB時鐘寄存器實現

RCC->AHBENR|=0x000000001; //允許DMA時鐘DMA初始化DMA初始化函數

voidDMA_Init(DMA_Channel_TypeDef*DMAy_Channelx,DMA_InitTypeDef*DMA_InitStruct)按照DMA_InitStruct結構變量初始化DMAy通道x(y=1、2,x=1~12)DMA_InitStruct是指向DMA_InitTypeDef結構體的指針,包含對DMA通道的配置信息幫助文檔DMA初始化結構類型DMA_InitTypeDeftypedef

struct{uint32_tDMA_PeripheralBaseAddr; /*外設基地址*/uint32_tDMA_MemoryBaseAddr;/*存儲器基地址*/uint32_tDMA_DIR; /*傳輸方向:外設是源還是目的*/uint32_tDMA_BufferSize; /*緩沖區大小*/uint32_tDMA_PeripheralInc; /*外設地址是否增量*/uint32_tDMA_MemoryInc; /*存儲器地址是否增量*/uint32_tDMA_PeripheralDataSize; /*外設數據寬度*/uint32_tDMA_MemoryDataSize; /*存儲器數據寬度*/uint32_tDMA_Mode;

/*操作模式*/

uint32_tDMA_Priority; /*軟件優先級*/uint32_tDMA_M2M; /*是否存儲器到存儲器傳輸*/}DMA_InitTypeDef;DMA_InitTypeDef成員-1成員1:DMA_PeripheralBaseAddr,外設基地址本例的外設是USART1數據寄存器(USART1_DR)需要用戶定義給出這個地址(STM32庫沒有定義)成員2:DMA_MemoryBaseAddr,存儲器基地址通常是用戶程序定義的主存緩沖區首地址成員3:DMA_DIR,傳輸方向選擇外設是源(DMA_DIR_PeripheralSRC)還是目的(DMA_DIR_PeripheralDST)成員4:DMA_BufferSize,緩沖區大小傳輸的數據量(直接給出數值)單位是成員7給出的DMA_PeripheralDataSizeDMA_InitTypeDef成員-2成員5:DMA_PeripheralInc,外設地址增量允許(DMA_PeripheralInc_Enable)禁止(DMA_PeripheralInc_Disable)成員6:DMA_MemoryInc,存儲器地址增量允許(DMA_MemoryInc_Enable)禁止(DMA_MemoryInc_Disable)成員7:DMA_PeripheralDataSize,外設數據寬度字節(DMA_PeripheralDataSize_Byte)半字(DMA_PeripheralDataSize_HalfWord)字(DMA_PeripheralDataSize_Word)DMA_InitTypeDef成員-3成員8:DMA_MemoryDataSize,存儲器數據寬度字節(DMA_MemoryDataSize_Byte)半字(DMA_MemoryDataSize_HalfWord)字(DMA_MemoryDataSize_Word)成員9:DMA_Mode,操作模式正常(DMA_Mode_Normal):一次性傳輸循環(DMA_Mode_Circular):自動重復傳輸DMA_InitTypeDef成員-4成員10:DMA_Priority,軟件優先級選擇通道的4個優先級之一很高(DMA_Priority_VeryHigh)高級(DMA_Priority_High)中級(DMA_Priority_Medium)低級(DMA_Priority_Low)成員11:DMA_M2M,存儲器到存儲器傳輸允許(DMA_M2M_Enable)禁止(DMA_M2M_Disable)DMA初始化配置頭文件dma.h配置DMA傳輸的外設基地址(USART1數據寄存器DR)(DMA_InitStructure.DMA_PeripheralBaseAddr)STM32庫的頭文件沒有定義USART1_DR地址查閱STM32參考手冊USART1的起始地址(0x40013800)數據寄存器DR在USART的偏移量(0x04)相加得到USART1_DR地址(0x40013804)

#defineUSART1_DR_Base0x40013804#defineSENDBUF_SIZE0x4000 //緩沖區大小voidDMA1_Config(void);DMA配置源文件dma.c-1/*DMA的中斷配置函數*/voidNVIC_Config(void){NVIC_InitTypeDef

NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}DMA配置源文件dma.c-2//USART1進行DMA傳送的初始化配置(含中斷配置)uint8_t

SendBuf[SENDBUF_SIZE];//發送緩沖區voidDMA1_Config(void){DMA_InitTypeDefDMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); NVIC_Config(); /*配置DMA中斷

*/

//設置DMA源:串口數據寄存器地址

DMA_InitStructure.DMA_PeripheralBaseAddr=USART1_DR_Base;DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)SendBuf;/*內存地址(要傳輸的變量的指針)*/

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;/*方向:從內存到外設*/DMA配置源文件dma.c-3

DMA_InitStructure.DMA_BufferSize=SENDBUF_SIZE; /*傳輸大小*/

DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; /*外設地址不增*/

DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;

/*內存地址自增*/

DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;

/*外設數據單位,字節*/

DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;

/*內存數據單位,字節*/

DMA_InitStructure.DMA_Mode=DMA_Mode_Normal; /*DMA模式:一次傳輸,不循環*/DMA配置源文件dma.c-4

DMA_InitStructure.DMA_Priority=MA_Priority_Medium; /*優先級:中*/DMA_InitStructure.DMA_M2M=DMA_M2M_Disable; /*禁止內存到內存的傳輸 */

DMA_Init(DMA1_Channel4,&DMA_InitStructure);

/*配置DMA1的4通道*/

DMA_Cmd(DMA1_Channel4,ENABLE); /*允許DMA1的4通道進行DMA傳輸

*/

DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); /*設置DMA1的4通道DMA傳輸完成產生中斷*/}幫助文檔進行DMA傳輸的主程序main.c-1int

main(void){ inti; USART1_Config();

//

USART1配置:1152008-N-1

DMA1_Config();

LED_Config();

LED_Off_all(); //LED燈全滅

for(i=0;i<SENDBUFF_SIZE;i++) {SendBuf[i]='A'; //填充緩沖區

}進行DMA傳輸的主程序main.c-2

printf("\r\nDMA傳輸開始\r\n"); //USART1接口發出DMA請求

USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); LED_On(1); //點亮LED1燈

while(1) { //循環

}}中斷服務程序stm32f10x_it.cvoidDMA1_Channel4_IRQHandler(void){ //判斷是否為DMA發送完成中斷

if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)

{LED_On(2);

//LED2燈亮

DMA_ClearFlag(DMA1_FLAG_TC4);

//清除標志

printf("\r\nDMA傳輸結束\r\n");} }8.3DMA、USART和GPIO的綜合應用【例8-2】按鍵控制的應用項目按下KEY1鍵,觸發KEY1中斷, 讓3個LED燈逐個點亮、并停留在LED3燈上按下KEY2鍵,觸發KEY2中斷,

讓主存數據DMA傳輸給USART1發送接口

DMA傳輸前、滅燈,DMA傳輸中、LED1燈亮,

DMA傳輸后、LED2燈亮USART接口連接PC機串口,

在PC機上查閱發送結果KEY2鍵中斷能夠打斷KEY1鍵中斷【例8-2】綜合應用項目分析源程序文件文件功能led.c和led.hLED燈初始化和驅動程序key.c和key.h按鍵初始化和驅動程序key.ini軟件模擬按鍵的調試函數usart1.c和usart1.hUSART1初始化和驅動程序exti.c和exti.hEXTI初始化和驅動程序dma.c和dma.hDMA初始化和驅動程序nvic.c和nvic.hNVIC的中斷配置程序stm32f10x_it.c和stm32f10x_it.h中斷服務程序main.c主程序文件嵌入式系統導論主講教師:第9章STM32的定時器接口本章內容提要9.1系統時鐘(SysTick)9.2STM32看門狗9.3STM32定時器(TIMx)9.4STM32實時時鐘(RTC)定時器基于計數器電路實現STM32微控制器的定時器接口系統時鐘(SysTick)看門狗WatchDog獨立看門狗(IWDG)獨窗口看門狗(WWDG)通用定時器基本定時器(TIM6和TIM7)通用定時器(TIM2、TIM3、TIM4和TIM5)高級控制定時器(TIM1和TIM8)實時時鐘RTC9.1系統時鐘(SysTick)Corte-M3在內核包含的簡單定時器該定時器的時鐘源可以來自CM3內部時鐘(FCLK),或CM3外部時鐘(STCLK)在STM32微控制器中,SysTick的時鐘源可以是:“AHB時鐘”、或者“AHB時鐘/8”SysTick定時器是一個24位遞減計數器設置初值、允許計數,每來一個時鐘,計數值減1計數值減為0,計數器被自動載入初值、繼續計數同時內部標志COUNTFLAG被置位、并觸發中斷SysTick中斷連接中斷控制器NVIC,異常號為15SysTick寄存器SysTick是CM3內核的定時單元參閱“Cortex-M3一般用戶手冊”(不是“STM32參考手冊”)寄存器縮寫寄存器中文名稱SysTick_CTRL控制和狀態寄存器SysTick_LOAD重載值寄存器SysTick_VAL當前值寄存器SysTick_CALIB校準值寄存器控制和狀態寄存器(SysTick_CTRL)用于控制SysTick工作和獲取計數歸0的狀態名稱功能ENABLE計數器使能:0=禁止SysTick定時器,1=允許SysTick定時器TICKINTSysTick異常請求使能:0=不觸發異常請求,1=觸發異常請求(中斷)CLKSOURCE選擇時鐘源:0=外部時鐘,1=處理器時鐘COUNTFLAG計數狀態:上次讀取后定時器計數到0,返回1SysTick寄存器編程(1)禁止SysTick定時器(因為SysTick可能已經被允許了)

SysTick->CTRL=0;//關閉SysTick(2)寫入重載值

SysTick->LOAD=256-1;//假設計數值為256(3)清除當前值為0(向當前值寄存器SysTick_VAL寫入任何值)

SysTick->VAL=0;(4)允許SysTick定時器

SysTick->CTRL=5;//使用處理器時鐘SysTick結構定義系統時鐘SysTick屬于Cortex內核部件驅動程序定義在core_cm3.h(不是core_cm3.c)文件SysTick寄存器的結構類型

typedef

struct {__IOuint32_tCTRL; __IOuint32_tLOAD; __IOuint32_tVAL; __Iuint32_tCALIB; }SysTick_Type;有關地址定義的語句如下:

#defineSCS_BASE(0xE000E000) #defineSysTick_BASE(SCS_BASE+0x0010) #defineSysTick((SysTick_Type*)SysTick_BASE)SysTick配置函數_STATIC__INLINEuint32_tSysTick_Config(uint32_tticks){if((ticks-1UL)>SysTick_LOAD_RELOAD_Msk){return(1UL); }

SysTick->LOAD=(uint32_t)(ticks-1UL);NVIC_SetPriority(SysTick_IRQn,(1UL<<__NVIC_PRIO_BITS)-1UL);

SysTick->VAL=0UL;

SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|

SysTick_CTRL_TICKINT_Msk|

SysTick_CTRL_ENABLE_Msk;return(0UL);}初始化、并啟動SysTick計數器和中斷設置每隔ticks脈沖引起一次中斷配置成功返回0值,不成功則返回1值SysTick_Config函數-11、將ticks參數作為重載值賦給重載值寄存器(SysTick_LOAD)定時時間T是:T=ticks×(1/f)秒f是時鐘源的時鐘頻率2、使用NVIC_SetPriority函數 配置系統時鐘中斷(SysTickIRQ)為15如果要改變SysTick中斷的優先級,使用

NVIC_SetPriority(SysTick_IRQn,...)(定義在core_cm3.h文件)SysTick_Config函數-23、復位SysTick計數器(清零)4、設置控制和狀態寄存器(SysTick_CTRL)允許計數和中斷選擇處理器時鐘源(STM32是“AHB時鐘”)如果使用STM32的“AHB時鐘/8”直接編程控制和狀態寄存器(SysTick_CTRL) 設置CLKSOURCE(D2位)為0使用STM32庫的SysTick_CLKSourceConfig函數(在misc.c文件中)SysTick應用示例:精確定時SysTick可服務于操作系統也可用于精確定時、時間測量等系統時鐘72MHz,最小的計時單位(時鐘周期)(1/72)×10-6秒、即72分之一的微秒結合GPIO控制LED燈的示例【例9-1】使用SysTick精確的硬件定時主程序需要對SysTick進行初始化例如配置1ms產生一次中斷SysTick初始化主程序SysTick_Config函數配置1ms產生一次中斷

if(SysTick_Config(SystemCoreClock/1000)){while(1);/*沒有初始化成功,死循環*/}

SysTick->CTRL&=~1;/*關閉SysTick定時器*/SystemCoreClock常量表示系統主時鐘頻率開發板的時鐘頻率是最高72MHz定時時間(SystemCoreClock與f相同):

T=(SystemCoreClock/1000)×(1/f)秒

=10-3

秒=1毫秒=1ms硬件定時的延時函數定義TimingDelay為靜態變量每次進入函數時,讓其保持上次退出的數值 這個變量的改變是在中斷服務程序中static__IOuint32_tTimingDelay=0;voidDelay_ms(__IOuint32_tnTime){TimingDelay=nTime;/*

nTime是延時時間

*/

SysTick->CTRL|=1;/*

啟動SysTick定時器*/

while(TimingDelay!=0);}

voidDecrement(void){if(TimingDelay!=0)TimingDelay--;}中斷服務程序voidSysTick_Handler(void){Decrement(); //每次中斷,TimingDelay減1}延時500ms的延時函數調用

Delay_ms(500);9.2STM32看門狗WatchDog看門狗是嵌入式應用系統的一個安全機制常用于防止程序失去控制,避免系統導致嚴重后果各種干擾可能影響程序的正常執行,導致“跑飛”如果系統在規定的時間內沒有執行特定的“喂狗”程序,看門狗就會報警,系統可以及時糾正錯誤看門狗機制的實質是定時器,當計數器達到給定的超時值時,觸發一個中斷或產生系統復位STM32微控制器支持兩個看門狗獨立看門狗(IWDG)窗口看門狗(WWDG)9.2.1獨立看門狗(IWDG)由專門的低速時鐘(LSI)驅動即使系統主時鐘發生故障也仍然有效適合看門狗作為獨立于主程序之外的處理進程、對時間精度要求不高的應用場合一個獨立運行的12位減量計數器啟動后,當計數值減量為0,導致系統復位Independentwatchdog獨立看門狗結構寄存器縮寫寄存器英文名稱寄存器中文名稱IWDG_KRKeyRegister關鍵寄存器IWDG_PRPrescalerRegister預分頻寄存器IWDG_RLRReloadRegister重載寄存器IWDG_SRStatusRegister狀態寄存器獨立看門狗的啟動和重載啟動獨立看門狗向關鍵寄存器(IWDG_KR)寫入數值0xCCCC計數器從復位值0xFFF開始減量計數當計數值減至結束值0x000時,觸發復位沒有及時“喂狗”導致系統復位、進入初始狀態重載獨立看門狗(喂狗)向關鍵寄存器(IWDG_KR)寫入關鍵值0xAAAA重載寄存器(IWDG_RLR)內的數值被重新加載到計數器,這樣就防止了看門狗復位及時進行了“喂狗”,系統可以正常運行IWDG寄存器關鍵寄存器(IWDG_KR)在待機模式被復位為0只能寫入0xCCCC(啟動看門狗)、0xAAAA(重載計數值)和0x5555(允許訪問預分頻和重載寄存器)預分頻寄存器(IWDG_PR)表示8種分頻系數(4/8/16/32/64/128/256)重載寄存器(IWDG_RLR)用于寫入重載的計數初值(12位計數器)可寫入編碼0x000~0xFFF依次表示1~4096計數值待機模式會將其復位為最大值0xFFFIWDG寄存器寄存器縮寫寄存器英文名稱寄存器中文名稱IWDG_KRKeyRegister關鍵寄存器IWDG_PRPrescalerRegister預分頻寄存器IWDG_RLRReloadRegister重載寄存器IWDG_SRStatusRegister狀態寄存器IWDG定時時間分頻系數最小定時(ms)最大定時(ms)40.1409.680.2819.2160.41638.4320.83276.8641.66553.61283.213107.22566.426214.4LSI=40KHzIWDG函數設置重載寄存器值voidIWDG_SetReload(uint16_tReload)

設置預分頻系數voidIWDG_SetPrescaler(uint8_tIWDG_Prescaler)將重載寄存器的值重新裝載給IWDG計數器voidIWDG_ReloadCounter(void)允許或禁止對重載寄存器和重載寄存器寫入voidIWDG_WriteAccessCmd(uint16_tIWDG_WriteAccess)允許IWDG(寫入重載寄存器和重載寄存器被禁止)voidIWDG_Enable(void)檢測IWDG標志置位與否FlagStatus

IWDG_GetFlagStatus(uint16_tIWDG_FLAG)RCC標志檢測和清除函數RCC_GetFlagStatus函數獲得系統復位原因

FlagStatus

RCC_GetFlagStatus(uint8_tRCC_FLAG)參數RCC_FLAG表示要檢測的標志,例如復位標志有RCC_FLAG_PINRST(引腳復位)RCC_FLAG_PORRST(電源開/電源關復位)RCC_FLAG_SFTRST(軟件復位)RCC_FLAG_IWDGRST(IWDG復位)RCC_FLAG_WWDGRST(WWDG復位)RCC_FLAG_LPWRRST(低電源電壓復位)FlagStatus返回置位(SET),表示發生了檢測的復位返回復位(RESET),表示沒有發生檢測的復位RCC_ClearFlag函數清除(復位)上述所有復位標志

voidRCC_ClearFlag(void)【例9-2】IWDG應用示例:IWDG復位啟用獨立看門狗,設置約10秒的喂狗間隔用戶在10秒內按下KEY1按鍵(需要每隔10秒內,連續按下)、讓系統進行喂狗如果在10s內“喂狗”、LED3燈常亮,表示正常用戶(連續)按下KEY1間隔超過10s程序沒有及時“喂狗”,系統將復位復位后,系統重新執行程序檢測到是由于IWDG導致的復位,LED2指示燈亮如果是其他原因導致的復位,LED1指示燈亮IWDG初始化配置voidIWDG_Config(void){//允許看門狗寄存器寫入IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//時鐘分頻系數256IWDG_SetPrescaler(IWDG_Prescaler_256);//喂狗時間10s,設置計數值1562.5IWDG_SetReload(1563);//寫入計數值(喂狗)IWDG_ReloadCounter();//允許IWDG看門狗IWDG_Enable();}IWDG主程序-1int

main(void){KEY_Config();

LED_Config();IWDG_Config();LED_ON_all();Delay(0x990000);//LED等亮一會表示系統復位

LED_OFF_all();//LED燈全滅IWDG主程序-2//

如果上次復位是IWDG復位,LED2亮if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)==SET)

{LED_ON(2);

Delay(0x990000); //延時,讓用戶觀察到

LED_OFF(2);

RCC_ClearFlag();

}//如果上次復位是不是IWDG復位,LED1亮else

{LED_ON(1); Delay(0x990000); //延時,讓用戶觀察到

LED_OFF(1); }IWDG主程序-3//檢測按鍵,適時喂狗while(1)

{if(KEY_scan(1)==

0){while(KEY_scan(1)==0);

IWDG_ReloadCounter();

LED_ON(3); Delay(0x990000); LED_OFF(3);

}}}9.2.3窗口看門狗(WWDG)時鐘由APB1時鐘分頻后得到具有可配置的時間窗口用于檢測應用程序過遲或過早的非正常操作適合在精確計時窗口起作用的應用程序一個獨立運行的可編程減量計數器啟動后,就設置了一個刷新時間間隔(窗口)在這個時間窗口內寫入計數值,才保證系統不復位“喂狗”時間既不能太早、也不能太晚(或不喂)Windowwatchdog窗口看門狗結構窗口看門狗的定時時間【例9-3】WWDG應用示例:適時喂狗啟用WWDG,設置約43~58ms的喂狗時間窗口系統如果在刷新時間窗口內“喂狗”LED2燈閃爍,表示正常工作使用按鍵KEY1按下模擬“喂狗”時間“喂狗”時間太早或時間太晚系統會復位讓LED1燈閃爍啟用提前喚醒中斷EWI當喂狗時間太晚進入EWI中斷服務程序讓LED3燈閃爍WWDG初始化函數voidWWDG_Config(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);WWDG_SetPrescaler(WWDG_Prescaler_8);WWDG_SetWindowValue(0x50);WWDG_Enable(0x7F);WWDG_ClearFlag();WWDG_EnableIT();}0x50=0x7F–0x2F啟用WWDG提前喚醒中斷NVIC初始化函數

……NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn; ……WWDG中斷程序voidWWDG_IRQHandler(void){LED_On(3);//LED3燈閃爍1次

Delay(0xffff);LED_Off(3); WWDG_ClearFlag();//清除WWDG中斷標志位

}WWDG應用的主程序

WWDG_Config();//配置WWDGwhile(1){if(KEY_scan(1)==0){while(KEY_scan(1)==0); //等待按鍵結束

WWDG_SetCounter(0x7F);LED_On(2);

//喂狗時間合適時,LED2燈閃爍1次

Delay(0xffff);LED_Off(2); }}9.3STM32定時器2個基本定時器(TIM6、TIM7)主要用于產生數字模擬轉換器(DAC)的觸發信號也可用于普通的16位時基計數器4個普通定時器(TIM2-TIM5)能夠測量輸入信號的脈沖長度(輸入捕獲功能)產生需要的輸出波形(輸出比較、脈沖寬度調制PWM脈沖和單脈沖輸出等)2個高級控制定時器(TIM1、TIM8)能夠產生3對PWM互補輸出的高級定時器常用于三相電機的驅動基本定時器(TIM6和TIM7)結構基本定時器(TIM6和TIM7)工作原理分頻系數為2,計數值36基本定時器應用示例:周期性定時中斷【例9-4】周期性定時中斷,控制LED燈閃爍利用基本定時器(TIM6)的基本定時功能產生周期性定時中斷控制LED燈每隔1秒閃爍一次定時時間=(計數值+1)×(預分頻值+1)÷定時器時鐘1s=2000×36000÷72M基本定時器的初始化配置voidTIM6_Config(void){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);TIM_TimeBaseStructure.TIM_Prescaler=36000-1;TIM_TimeBaseStructure.TIM_Period=2000-1;TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_RepetitionCounter=0;

TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);

TIM_UpdateRequestConfig(TIM6,TIM_UpdateSource_Regular);

TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);TIM_Cmd(TIM6,ENABLE);}基本定時器的中斷服務程序voidTIM6_IRQHandler(void){if(TIM_GetITStatus(TIM6,TIM_IT_Update)==SET){TIM_ClearITPendingBit(TIM6,TIM_FLAG_Update);GPIOB->ODR^=GPIO_Pin_0; //LED1燈反轉

GPIOF->ODR^=GPIO_Pin_7; //LED2燈反轉

GPIOF->ODR^=GPIO_Pin_8; //LED3燈反轉

}}9.4STM32實時時鐘可以依靠后備電池供電、維持運行的定時器提供日歷、

溫馨提示

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

評論

0/150

提交評論