版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第6章
定時器及其應用第6章
定時器及其應用【實踐案例6-1】基本定時器中斷方式實現定時【照貓畫虎6-1】基本定時器查詢方式實現定時【實踐案例6-2】PWM信號的產生和測量【照貓畫虎6-2】
輸入捕獲和輸出比較功能的應用來源:STM32Datasheet(數據手冊)第6章
定時器及其應用第6章
定時器及其應用定時器在檢測、控制領域有廣泛應用,可作為應用系統運行的控制節拍,實現信號檢測、控制、輸入信號周期測量或電機驅動等功能。在很多的應用場合,都會用到定時器,因此定時器系統是現在微控制器中的一個不可缺少的組成部分。定時器有很多用途,包括基本定時功能、生成輸出波形(輸出比較、PWM和帶死區插入的互補PWM)和測量輸入信號的脈沖寬度(輸入捕抓)等。第6章
定時器及其應用6.1定時器的基本特性分
類主要功能計數脈沖計數,使用外部時鐘(PCLK)來計數。定時時間控制,通過對微控制器內部的標準時鐘脈沖進行計數實現定時功能。輸入捕獲對輸入信號進行捕獲,實現對脈沖的頻率測量,可用于對外部輸入信號脈沖寬度的測量,比如測量電機轉速。輸出比較將計數器計數值和設定值進行比較,根據比較結果輸出不同電平,用于控制輸出波形,比如直流電機的調速。6.1定時器的基本特性主要特性6.1定時器的基本特性6.2基本定時器6.2.1功能框圖
6.2.2基本定時器的初始化 6.2.3相關HAL庫函數【實踐案例6-1】基本定時器中斷方式實現定時【照貓畫虎6-1】基本定時器查詢方式實現定時STM32F407有兩個基本定時器TIM6和TIM7,其功能完全相同,資源相互獨立,可以同時使用。這兩個基本定時器的主要特性如下:16位自動重載遞增計數器16位可編程預分頻器預分頻系數1~65536一般用于對計數器時鐘頻率進行分頻,或者觸發DAC的同步電路,以及生成中斷請求等。6.2基本定時器6.2基本定時器6.2.1功能框圖時鐘源兩個基本定時器掛載在APB1總線上,其計數時鐘CK_INT由APB1總線時鐘經過2倍頻得到。一般在CubeMX的時鐘樹中配置APB1總線時鐘為42MHz,因此基本定時器TIM6和TIM7的內部時鐘CK_INT頻率為84MHz。6.2基本定時器時基單元基本定時器的計數過程主要涉及到3個部件,即計數器CNT(Count)、預分頻器PSC(Prescaler)和自動重載寄存器ARR(AutomaticReload)。這3個部件分別對應3個16位的寄存器,可設置的數值范圍都為0~65535。3個寄存器合起來又稱為時基單元(TimeBae)。6.2基本定時器PSC=1,ARR=36預分頻器PSC的輸入時鐘CK_PSC來自于控制器,即84MHz的CK_INT時鐘。不同的應用系統中所需要定時的時間長度或間隔不同,通過設置預分頻器PSC的值可以非常方便地得到不同的計數時鐘CK_CNT。PSC寄存器的輸出時鐘CK_CNT頻率與輸入時鐘CK_PSC脈沖頻率之間的關系為fCK_CNT=fCK_PSC/(PSC+1)在運行過程中可以修改PSC中的數值,但新的預分頻數值必須在當前一輪計數結束時起作用。6.2基本定時器預分頻寄存器在定時器使能時,計數器CNT在預分頻器輸出計數脈沖CK_CNT的作用下遞增計數。當CNT=ARR時,將自動發出更新事件UEV(UpdateEvent),并將CNT的計數值清零,然后自動重新開始計數。對遞增計數過程,當CNT中的計數值遞增到與ARR中的計數值相同時,稱為定時器上溢(Overflow)。通過設置預分頻系數PSC和ARR中的計數值,可以控制發出更新事件的時間間隔。定時時間T的計算公式為T=(PSC+1)(ARR+1)/fCK_PSC。6.2基本定時器計數器與自動重載寄存器定時到,出現計數上溢時,定時器內部狀態寄存器SR中最低位將被置位,該標志位稱為更新事件中斷標志位UIF(UpdateInterruptFlag)。如果將DMA/中斷使能寄存器DIER的最低位UIE(UpdateInterruptEnable)置位,表示使能定時器中斷,則當UIF位置位的同時,定時器將發出更新事件中斷。6.2基本定時器6.2基本定時器6.2.2基本定時器的初始化CubeMX中的參數配置預分頻系數計數模式定時間隔是否自動預重載6.2基本定時器typedefstruct{uint32_tPrescaler; /*預分頻系數,取值范圍0x0000~0xffff*/uint32_tCounterMode; /*計數模式*/uint32_tPeriod; /*定時間隔,取值范圍0x0000~0xffff*/
uint32_tClockDivision; /*時鐘分頻系數*/uint32_tRepetitionCounter; /*重復計數值*/uint32_tAutoReloadPreload; /*自動重載計數值*/}TIM_Base_InitTypeDef;定時器初始化結構體基本定時器的初始化6.2基本定時器voidMX_TIM7_Init(void){TIM_MasterConfigTypeDefsMasterConfig={0};
htim7.Instance=TIM7;htim7.Init.Prescaler=8399;htim7.Init.CounterMode=TIM_COUNTERMODE_UP;htim7.Init.Period=9999;htim7.Init.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE;if(HAL_TIM_Base_Init(&htim7)!=HAL_OK){Error_Handler();}
……}CubeMX自動創建的定時器初始化函數6.2基本定時器voidHAL_TIM_Base_MspInit(TIM_HandleTypeDef*tim_baseHandle){if(tim_baseHandle->Instance==TIM7){__HAL_RCC_TIM7_CLK_ENABLE(); /*開啟TIM7總線時鐘
*/HAL_NVIC_SetPriority(TIM7_IRQn,0,0); /*設置TIM7中斷優先級
*/HAL_NVIC_EnableIRQ(TIM7_IRQn); /*開TIM7中斷
*/}}HAL_TIM_Base_Init()調用TIM_Base_SetConfig(),根據初始化配置參數,實現定時器的初始化,包括初始化時基單元及相關句柄。如果啟用了定時器中斷6.2基本定時器定時器結構體typedefstruct{__IOuint32_tCR1; /*控制寄存器1*/__IOuint32_tCR2; /*控制寄存器2*/……__IOuint32_tCNT; /*計數器寄存器*/__IOuint32_tPSC; /*預分頻寄存器*/__IOuint32_tARR; /*自動重載寄存器*/……}TIM_TypeDef;6.2基本定時器typedefstruct{TIM_TypeDef Instance; /*寄存器基地址*/TIM_Base_InitTypeDef Init; /*定時器初始化結構體變量*/HAL_TIM_ActiveChannel Channel; /*定時器有效通道*/……__IOHAL_TIM_StateTypeDef State; /*定時器工作狀態*/}TIM_HandleTypeDef;定時器句柄結構體6.2基本定時器定時器的啟動和停止6.2.3相關HAL庫函數6.2基本定時器如果以查詢方式啟動定時,則在程序中需要不斷查詢定時器的狀態,以判斷定時是否到。在stm32f4xx_hal_tim.h文件中,定義了宏函數__HAL_TIM_GET_FLAG(__HANDLE__,__FLAG__)
當入口參數__FLAG__為TIM_SR_UIF時,則讀取定時器狀態寄存器中的UIF標志位。當該標志位為1時,表示計數溢出和定時到。查詢時,TIM_SR_UIF標志位不會自動清除,此時可以調用宏函數__HAL_TIM_CLEAR_FLAG(__HANDLE__,__FLAG__)清除UIF標志位。定時器狀態的查詢6.2基本定時器例如,如下語句
while(__HAL_TIM_GET_FLAG(&htim7,TIM_SR_UIF)==RESET){};
/*等待定時到*/在啟動定時器TIM7(其中htim7為定時器TIM7的句柄結構體變量)后,不斷檢測其狀態寄存器中的UIF標志位。如果該標志位為0,則重復讀取并檢測,從而實現查詢等待定時到的功能。6.2基本定時器定時器更新事件中斷如果以中斷方式啟動定時,則當定時器計數到定時溢出時,定時器將發出更新事件中斷請求。在響應更新事件中斷請求的過程中,將依次執行TIMx_IRQHandler()、HAL_TIM_IRQHandler()函數,最后進入到如下定時器更新事件回調函數:voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim)在應用程序中,只需要將上述回調函數重新定義在main.c文件中,并在該文件中編寫事先具體功能的代碼。6.2基本定時器【實踐案例6-1】基本定時器中斷方式實現定時使用基本定時器TIM7循環定時,每定時1s使紅燈閃爍(亮/滅切換)一次。6.2基本定時器配置RCC時鐘,特別注意配置APB1Timerclocks為84MHz配置PF6引腳為GPIO_Output,用戶標簽為LED_R,用于開發板中紅色LED的顯示。要求初始輸出低電平,紅色LED處于點亮狀態。按照圖6-3對TIM7進行模式和參數配置。根據參數設置,TIM7的定時時間為(8399+1)×(9999+1)/84M=1s。開啟TIM7的全局中斷(globalinterrup),并根據需要配置中斷優先級。CubeMX中的配置6.2基本定時器6.2基本定時器應用程序的編寫6.2基本定時器【照貓畫虎6-1】基本定時器查詢方式實現定時
使用基本定時器TIM7控制使開發板上的綠色LED每隔0.2s閃爍一次。要求采用查詢方式檢測定時是否到。6.3通用定時器6.3.1功能框圖6.3.2時鐘源和計數模式6.3.3輸入捕獲和比較輸出6.3.4PWM信號的產生和測量【實踐案例6-2】PWM信號的產生和測量【照貓畫虎6-2】輸入捕獲和輸出比較功能的應用6.3通用定時器通用定時器包括TIM2~TIM5和TIM9~TIM14,這幾個定時器在基本定時器的基礎上,添加了一些其他功能,例如輸入捕獲、輸出比較、輸出PWM和單脈沖模式等。除了更新和輸入捕獲、輸出比較事件外,通用定時器TIM2~TIM5、TIM9和TIM12在出現計數器啟動、停止、初始化或通過內部/外部觸發計數等觸發事件時也能發出中斷請求。此外還可以工作在從模式,使用外部信號進行觸發控制,并可實現多個定時器的級聯和同步。6.3通用定時器6.3.1功能框圖輸入輸出通道:實現輸入捕獲和比較輸出等功能。6.3通用定時器兩個輸入輸出通道觸發事件6.3通用定時器4個輸入輸出通道外部時鐘6.3.2時鐘源和計數模式6.3通用定時器內部時鐘源:APB1或APB2定時器時鐘,84/168MHz外部時鐘源:由TIMx_ETR引腳送入,對TIM2~TIM4,分別為PA0、PD2、PE0引腳的復用模式觸發源:
ITR0~3,來自另一個定時器的輸出,用于定時器的級聯;
TI1F_ED、TI1FP1和TI2FP2:由捕獲輸入通道送入的外部脈沖TI1或TI2作為計數脈沖6.3通用定時器通用定時器的時基單元也包括計數器CNT、預分頻器PSC和自動重載寄存器ARR。但TIM2~5的計數模式有3種計數模式,即遞增(Up)、遞減(Down)和中心對齊(CenterAligned)模式。在遞增計數模式下,定時器會發出上溢事件。定時時間等于ARR+1個計數脈沖;在遞減計數模式下,每送來一個計數脈沖,計數器就減1,直到計數值減到0時,出現定時器下溢事件,之后計數器又從設置的自動重載值(計數初值)開始繼續遞減計數。定時時間等于ARR+1個計數脈沖。6.3通用定時器在中心對齊模式下,計數器先從0開始遞增計數,直到計數器的值等于計數初值減1時,定時器上溢,同時生成更新事件。之后,從計數初值開始遞減計算,直到計數值等于1時,定時器下溢,并生成更新事件,然后又從0開始遞增計數,依此循環。定時時間等于ARR個或2ARR個計數脈沖。設ARR=66.3通用定時器注
意每次計數上溢和下溢都會產生更新事件UEV,但不是都會更新中斷標志位UIF置位,從而發出更新中斷。通過配置計數模式為中心對齊模式1、中心對齊模式2和中心對齊模式3,可以設置在計數器下溢、上溢或者上溢/下溢時才將UIF標志位置位。6.3通用定時器6.3.3輸入捕獲和比較輸出通用定時器增加了捕獲/比較通道。每個捕獲/比較通道都包括一個捕獲/比較寄存器、一個捕獲輸入通道(輸入濾波、邊沿檢測、多路復用開關和預分頻器)和一個比較輸出通道(比較器和輸出控制電路)。輸入捕獲通道利用輸入濾波器和邊沿檢測器對輸入信號的上升沿或下降沿進行檢測和捕捉,并通過預分頻器控制捕獲/比較寄存器數據的存取。比較輸出通道利用捕獲/比較寄存器和輸出控制電路實現計數值的比較并輸出相應的脈沖信號。輸入捕獲
6.3通用定時器工作過程
外部脈沖從定時器的外部引腳CH1~CH4進入,記為TI1~TI4,稱為輸入通道。這些輸入引腳由GPIO指定的引腳工作在復用模式來提供,例如TIM9的第一輸入通道CH1為復用的PE5引腳。基本原理:當捕獲到輸入信號跳變沿時,將計數器CNT中的計數值鎖存到捕獲寄存器CCR中。6.3通用定時器輸入通道由輸入濾波器、邊沿檢測器組成,檢測和捕獲信號的邊沿,輸出脈沖的第一邊沿FP1、第二邊沿FP2或雙邊沿ED(包括相鄰的一個上升沿和一個下降沿)。這里的第一、第二邊沿指的是計數器開始計數后輸入脈沖的相鄰兩個邊沿,兩個邊沿都可以配置為上升沿或下降沿。對一個連續的輸入脈沖來說,如果配置第一邊沿為上升沿,則第二邊沿自動為下降沿。6.3通用定時器在圖6-4到圖6-6中,IC1~IC4表示4個捕獲通道,每個捕獲通道的輸入可以是上述輸入通道捕捉到的上升沿、下降沿或雙邊沿,也可以是內部觸發信號ITR0~ITR3通過多路開關的選擇輸出信號TRC。捕獲通道的輸出信號經過預分頻器后得到ICxPS信號,送到捕獲/比較寄存器,實現捕獲功能,也可用作從模式控制器的觸發輸入并作為計數脈沖。每個捕獲通道都有對應的捕獲/比較寄存器CCR1~CCR4。當捕獲到輸入脈沖的邊沿時,計數器CNT的當前計數值被鎖存到捕獲寄存器中。
比較輸出6.3通用定時器當計數器CNT的值與比較寄存器CCR中的預設值相等時,輸出參考信號OCxREF的極性將發生改變,其中高電平為有效電平,低電平為無效電平。OCxREF再經過輸出控制電路后成為實際的輸出信號OCx。比較輸出信號最終是通過定時器的外部IO引腳來輸出的,分別為CH1~CH4。對同一個定時器的同一個通道,輸入捕獲和比較輸出是同一個GPIO引腳。通過定時器的外部引腳對外輸出控制信號,用于控制輸出波形,或指示已經過某一時間段。6.3通用定時器6.3.4PWM信號的產生和測量基本原理PWM的全稱是脈沖寬度調制(PulseWidthModulation),是利用微處理器輸出的數字量對模擬電路進行控制的一種非常有效的技術,通常用于LED亮度調節、電動機轉速控制等。PWM信號是周期寬度和占空比可以靈活調節的脈沖信號,利用定時器的輸入捕獲和比較輸出功能,可以很方便地產生指定頻率和寬度的PWM脈沖,也能對送入的PWM脈沖進行寬度和頻率的測量。6.3通用定時器PWM信號的產生在STM32F407中提供了PWM1和PWM2兩種工作方式,兩種方式又可進一步分為邊沿對齊和中心對齊兩種工作模式,如表6-2所示。6.3通用定時器在計數脈沖的頻率固定時,輸出PWM脈沖的頻率或周期由定時器中的自動重載寄存器ARR中設置的計數值決定,其占空比由捕獲/比較寄存器CCR中的值決定。6.3通用定時器PWM信號的測量PWM脈沖寬度和頻率的測量需要同時占用定時器的兩個捕獲通道。以輸入通道TI1工作在PWM輸入模式為例,PWM信號由輸入通道TI1送入后分為兩路,即TI1FP1和TI2FP2,分別送到兩個捕獲通道IC1和IC2。這兩路可以分別設置為直接輸入或非直接輸入,并可分別設置觸發極性(上升沿還是下降沿)。6.3通用定時器假設配置TI1FP1為直接輸入觸發信號、上升沿觸發;配置TI1FP2為非直接輸入、下降沿觸發。PWM輸入模式的工作時序和脈沖測量的基本原理如圖6-11所示。
CCR1+1代表脈沖周期,CCR2+1代表脈寬6.3通用定時器PWM通道配置另外注意配置:配置PA5引腳為TIM2_CH1復用模式,作為TIM2的CH1通道輸出PWM脈沖。6.3通用定時器圖6-12
PWM輸出模式和參數配置6.3通用定時器根據上述參數配置,通用定時器TIM2的預分頻系數為83,計數脈沖的頻率為84MHz/(83+1)=1MHz,輸出脈沖的頻率為1/(100-1+1)=10kHz,周期為0.1ms。TIM2的PWM產生通道1(PWMGenerationChannel1)配置為PWM1輸出模式,設置Pulse參數為50,該參數與CounterPeriod參數值加1之比,即為輸出PWM脈沖的占空比,這里等于50/(99+1)=50%。6.3通用定時器用通道1輸入脈沖信號的第一邊沿觸發捕獲6.3通用定時器圖6-13
PWM輸入模式和參數配置計數脈沖頻率為168/(167+1)=1MHz在不發生上下溢的前提下能夠獲得的最長定時為0.1ms6.3通用定時器相關HAL庫函數6.3通用定時器6.3通用定時器定時中斷處理回調函數【實踐案例6-2】PWM信號的產生和測量本案例要求利用通用定時器TIM2產生PWM信號,其頻率固定為10kHz,占空比可以任一給定。同時,利用高級定時器TIM9的輸入捕獲功能實現對所產生的PWM信號的占空比和頻率進行測量。6.3通用定時器首先按照圖6-12和圖6-13對TIM2和TIM9進行配置,注意確認TIM2的PWM輸出引腳和TIM9的PWM輸入引腳分別為PA5和PE5,并將這兩個引腳配置為相應的復用模式。在本案例中,TIM9捕獲到輸入PWM信號的上升沿和下降時,都允許發出中斷,在NVICSettings面板中勾選TIM1breakinterrupandTIM9globalinterrupt。6.3通用定時器應用程序的編寫6.3通用定時器6.3通用定時器6.3通用定時器6.3通用定時器圖6-14案例6-2運行結果【照貓畫虎6-2】輸入捕獲和輸出比較功能的應用6.3通用定時器要求利用開發板上的按鍵KEY1觸發通用定時器TIM3輸出給定頻率和寬度的脈沖信號。6.3通用定時器根據PWM產生的基本原理,要在程序中動態調節PWM波的頻率和占空比,只需要分別修改ARR和CCR寄存器的值即可。在stm32f4xx_hal_tim.h文件中,定義了如下宏函數
__HAL_TIM_SET_COMPARE(__HANDLE__,__CHANNEL__,__COMPARE__)用于重新設置和修改定時器的CCR寄存器。其中3個參數分別為定時器句柄結構體指針、PWM輸出通道和比較值。例如,如下語句
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,20);重新設置定時器TIM2通道1的CCR值為20。6.3通用定時器在程序中,如果以查詢方式產生PWM信號,只需要在運行過程直接執行上述宏函數,即可調節PWM信號的占空比。如果以中斷方式啟動定時并產生PWM信號,可以在中斷回調函數中執行上述宏函數,該中斷回調函數名為HAL_TIM_PWM_
PulseFinished
Callback(),對應一個周期的PWM信號輸出結束時刻發出的中斷請求。第7章
模擬外設及其應用第7章
模擬外設【實踐案例7-1】利用DAC輸出鋸齒波【照貓畫虎7-1】利用DAC輸出正弦波【實踐案例7-2】單通道模擬電壓采集【照貓畫虎7-2】單通道模擬電壓采集【實踐案例7-3】多通道模擬電壓采集【照貓畫虎7-3】多通道模擬電壓采集第7章
模擬外設第7章
模擬外設
7.1.1DAC功能框圖7.1.2DAC相關HAL庫驅動【實踐案例7-1】利用DAC輸出鋸齒波【照貓畫虎7-1】利用DAC輸出正弦波7.1DAC及其應用STM32F407中的DAC具有如下主要特性:一個DAC轉換器,有兩個獨立的輸出通道12位模式下數據可以采用左對齊或右對齊同步更新功能可以生成噪聲波、三角波等各種波形兩個通道可單獨或同時轉換,每個通道都具有DMA功能具有DMA下溢錯誤檢測功能可以通過外部觸發信號進行轉換可以外接參考電壓VREF+以獲得更高的轉換分辨率7.1DAC及其應用7.1DAC及其應用7.1.1DAC功能框圖通道1:PA4通道2:PA5數據保持寄存器數據輸出寄存器觸發輸入DMA使能待轉換數據通過DHRx間接傳給DORx。數據送入DOR寄存器后,立即進行轉換,輸出模擬電壓與DOR中數據的關系為:DAC_OUT=VREF+
×DOR/40957.1DAC及其應用
數據格式支持8位和12位模式。在8位模式下,待轉換的數據是右對齊的。當DAC配置為12位模式時,數據可以設置為左對齊或右對齊。在12位模式下,如果選擇左對齊,那么數據的高12位將被轉換,而低4位將被忽略。如果選擇12位右對齊模式,那么待轉換的數據將被放置在最低12位,而高4位將被填充為0。這種模式允許直接使用一個12位的數據字進行DAC轉換,而不需要擔心數據對齊的問題,因此使用最頻繁。7.1DAC及其應用觸發方式指的是啟動DAC轉換的方式,可以配置為通過軟件或者硬件觸發轉換,也可以配置為不使用觸發。不使用觸發方式:當向DHRx寫入待轉換數據后,數據會在一個APB1時鐘周期后自動送到寄存器DORx,并立即轉換輸出。
軟件觸發:待轉換數據輸出到DHRx后,必須再啟動DAC轉換,才能將寫入的數據送到DORx并轉換輸出。硬件觸發:數據傳輸在觸發發生以后3個APB1時鐘周期后完成。觸發源可以通過DAC控制寄存器CR中的TSEL位進行設置和選擇,8個觸發事件如表7-1所示。
DAC的觸發方式7.1DAC及其應用7.1DAC及其應用7.1.2DAC相關HAL庫驅動與其他外設一樣,要使用DAC,必須調用HAL_DAC_Init()函數對DAC進行初始化配置,并啟用DAC總線時鐘。之后,調用HAL_DAC_Start()函數啟動DAC。此外,在stm32f407xx.h頭文件中,將DAC內部所有的寄存器封裝為DAC結構體,在stm32f4xx.h中定義了DAC句柄結構體DAC_
HandleTypeDef、DAC通道結構體DAC_ChannelConfTypeDef和DAC狀態枚舉類型。注意:DAC沒有初始化結構體。7.1DAC及其應用在stm32f4xx_hal_dac.c/.h文件中,實現DAC外設初始化及所用的DAC通道配置的函數是HAL_DAC_Init()和HAL_DAC_ConfigChannel()。通道配置主要包括設置通道的觸發方式和指定輸出緩沖器。這兩項設置參數封裝為DAC_ChannelConfTypeDef結構體。DAC初始化和通道配置通道觸發方式DAC輸出緩沖器DAC通道配置結構體7.1DAC及其應用通道觸發方式DAC輸出緩沖器7.1DAC及其應用7.1DAC及其應用例如,如下代碼配置DAC的通道1為定時器TIM2定時觸發,啟用輸出緩沖功能:DAC_ChannelConfTypeDefsConfig;sConfig.DAC_Trigger=DAC_TRIGGER_T2_TRGO;sConfig.DAC_OutputBuffer=DAC_OUTPUTBUFFER_ENABLE;if(HAL_DAC_ConfigChannel(&hdac,&sConfig,DAC_CHANNEL_1)!=HAL_OK)
{
Error_Handler();}7.1DAC及其應用DAC的啟動如果將DAC配置為軟件觸發方式,必須在送出待轉換的數據后,再調用HAL_DAC_Start()啟動DAC轉換。如果配置為不使用觸發,當輸出數字量后,將立即啟動DAC轉換,因此不需要調用上述函數。7.1DAC及其應用數字量的輸出7.1DAC及其應用【實踐案例7-1】利用DAC輸出鋸齒波本案例要求利用DAC通道1和2產生鋸齒波,兩個通道分別采用定時器TIM7觸發和軟件觸發。7.1DAC及其應用圖7-2
DAC配置CubeMX中的配置7.1DAC及其應用定時間隔(采樣間隔):1/[84/84/5000]=5ms圖7-3
TIM7參數配置7.1DAC及其應用應用程序的編寫7.1DAC及其應用7.1DAC及其應用觀察分析:程序中都是延時5ms輸出一個點,為什么兩個通道輸出的鋸齒波周期不同?7.1DAC及其應用【照貓畫虎7-1】利用DAC輸出正弦波本案例要求利用DAC通道1產生正弦波,采用定時器TIM7觸發。正弦波的頻率通過TIM7的參數配置進行設置,幅度在程序中設置。7.2ADC及其應用7.2.1
功能框圖7.2.2ADC的初始化及相關HAL庫驅動函數 【實踐案例7-2】單通道模擬電壓采集——中斷方式【照貓畫虎7-2】單通道模擬電壓采集——查詢方式7.2ADC及其應用STM32F4xx系列芯片擁有3個ADC外設,這些ADC可以獨立使用,其中ADC1和ADC2還可以組成雙重模式(提高采樣率)。STM32F407的ADC具有如下主要特性:
1)可配置12位、10位、8位或6位分辨率;
2)單次/連續轉換模式和間斷模式
3)雙重模式(帶2個或以上ADC的器件)
4)采樣間隔可以按通道分別編程
5)規則轉換和注入轉換均有外部觸發選項
6)ADC轉換時間:最大轉換速率為2.4MHz,轉換時間為0.41us7)轉換結束、注入轉換結束和發生模擬看門狗事件時產生中斷
8)規則通道轉換期間可以產生DMA請求
7.2.1功能框圖7.2ADC及其應用外部觸發輸入模擬輸入通道
中斷請求APB2外設時鐘PCLK2STM32的每個ADC多達19個通道,其中16個外部通道IN0~IN15來自與GPIO的模擬模式。模擬輸入通道每個ADC還有內部通道。其中ADC1的通道IN16~18分別連接到內部的VSS、內部參考電壓VREFINT、芯片內部的溫度傳感器或者備用電源VBAT。ADC2和ADC3的通道16、17、18全部連接到內部的VSS。7.2ADC及其應用7.2ADC及其應用注意:很多通道是多個ADC共用,從GPIO引腳的角度看,共24個外部通道。根據封裝的不同,有些通道不能用。規則通道(RegularChannel)又稱為規則組通道,其中多個通道輸入的模擬電壓按照事先指定的順序進行轉換。注入通道(InjectionChannel)可以理解為插入或插隊的意思,是一種在規則通道轉換的過程中強行插入轉換的通道。如果在規則通道轉換過程中,有注入通道插隊,則先轉換完注入通道輸入的模擬電壓,之后再回到規則通道的轉換流程。7.2ADC及其應用每個ADC的規則組中最多允許有16個通道,這些通道構成一個轉換序列,序列中各通道按照配置好的順序依次進行轉換。例如,假設規則組中包括3個通道IN0~IN2,則轉換序列可以為IN0-IN1-IN2,也可以為IN0-IN2-IN1、IN1-IN0-IN2等,具體轉換順序可以由規則序列寄存器SQR進行配置。類似地,每個ADC的注入組最多允許有4個通道,各通道的轉換順序可以通過注入序列寄存器JSQR進行配置。7.2ADC及其應用轉換序列與轉換順序7.2ADC及其應用規則通道組中的各通道按照規則序列寄存器中指定的順序轉換。一旦啟動注入通道,則立即執行注入通道組的轉換,并按照注入序列寄存器中各位確定的順序進行轉換。軟件觸發是通過將控制寄存器CR2中的ADON位置位來啟動A/D轉換,寫入0時則停止轉換。這種方式常用于查詢方式的A/D轉換。硬件觸發也就是通過外部事件觸發轉換,可以是定時器輸出觸發事件(TRGO)或定時器通道輸入捕獲信號(CHx),也可以是GPIO引腳輸入外部信號等,如圖7-8所示。規則組和注入組的觸發源分別由CR2中的EXTSEL[2:0]和JEXTSEL[2:0]位進行配置。對外部觸發事件,還可以通過設置CR2的EXTEN[1:0]和JEXTEN[1:0]位來控制觸發極性,可以是禁止觸發檢測、上升沿檢測、下降沿檢測以及上升沿和下降沿均檢測。觸發源7.2ADC及其應用7.2ADC及其應用注入組數據寄存器JDR注入組最多可以有4個通道,剛好注入數據寄存器也有4個,每個通道對應著自己的寄存器,不會出現數據覆蓋的問題。JDR是32位的,低16位有效,數據同樣分為左對齊和右對齊,具體由CR2中的D11位ALIGN進行設置。數據寄存器7.2ADC及其應用規則組數據寄存器每個ADC外設中的規則組數據寄存器DR只有一個,這是一個32位的寄存器,但只有低16位有效并且只是用于獨立模式存放轉換完成數據。因為ADC的最大精度是12位,而DR是16位有效,這樣允許ADC存放數據時候選擇左對齊或者右對齊,具體由CR2寄存器中的D11位ALIGN進行設置。假如設置ADC的轉換精度為12位,如果設置數據為左對齊,那轉換結果數據存放在DR寄存器中的D4~15位;如果為右對齊,則存放在D0~11位。
7.2ADC及其應用7.2ADC及其應用ADC的輸入時鐘ADC_CLK由PCLK2經過分頻產生,分頻系數可以為2、4、6和8。對于STM32F407ZGT6,一般設置PCLK2=HCLK/2=84MHz,所以程序一般使用4分頻或者6分頻,以保證轉換速率不超過最大值36MHz。
ADC需要若干個ADC_CLK周期完成對輸入的電壓進行采樣,每個通道可以分別用不同的時間采樣。其中采樣周期最小是3個ADC_CLK周期。轉換時間7.2ADC及其應用ADC的總轉換時間與ADC的輸入時鐘和采樣時間有關,可以表示為:
Tconv=采樣時間+12個周期假設PCLK2=84MHz,預分頻系數為4分頻,則ADC_CLK時鐘頻率為21MHz,采樣時間設置為最小值3個周期,則轉換時間為15個周期,即15/21≈0.71ms。7.2ADC及其應用連續轉換(ContinuousConversion)模式這種模式只適用于規則組通道。當規則組中所有通道轉換完畢后,立即從第一個通道開始自動啟動下一輪轉換。連續轉換模式通常用于對單個通道進行連續不斷的轉換,此時規則組中只有一個通道,每次轉換結束將數據存入DR后,同時將轉換結束標志位EOC置位。轉換模式7.2ADC及其應用掃描(ScanConversion)模式在這種模式下,每個通道轉換結束后,會立即自動轉換規則組或注入組中的下一個通道。每個通道轉換結束,都將當前通道的轉換結果存放到DR或對應的JDR中。在掃描模式下,可以配置規則組中所有通道轉換結束還是在每個規則通道轉換結束時將EOC置位。但是注入通道組只有在最后一個通道轉換結束時才將JEOC置位。非連續轉換(DisontinuousConversion)模式將規則組或注入組通道分成多個子序列,每個子序列相當于合起來相當于一個通道。每次觸發,對一個子序列進行轉換。對子序列內的多個通道可以進一步配置為連續轉換或掃描轉換模式。7.2ADC及其應用應用及配置要點——如果規則組中只有一個通道,并且配置禁用掃描模式、啟用連續模式,則實現連續轉換。單次觸發后持續轉換同一通道,結果不斷更新。這種模式適用于高頻信號監測(如音頻采樣、振動傳感器數據采集)、閉環控制系統的實時反饋等。
如果配置禁用掃描和連續模式,則實現單次轉換。在這種模式下,每次觸發僅轉換一個通道,轉換完成后停止,適用于低功耗設備的偶發采樣(如按鍵檢測、電池電壓監測)和單次高精度測量(如實驗室儀器的單點數據采集)等場合。7.2ADC及其應用如果規則組中有多個通道,并且配置啟用掃描模式、禁用連續模式,則實現掃描轉換。在這種模式下,對多個通道按指定順序轉換,完成后停止,適用于多路傳感器的周期性采樣、設備啟動時各傳感器狀態的自檢等。
如果配置啟用掃描模式和連續模式,則實現連續掃描轉換。每次觸發后循環掃描所有通道,各通道轉換完后立即從頭開始重新掃描轉換。這種模式適用于實時多通道周期測量和數據記錄。此時需要配合DMA傳輸,以避免數據覆蓋。7.2ADC及其應用對多個規則組通道,配置啟用掃描模式和不連續模式,并配置子序列中的通道數,則實現不連續掃描轉換。在這種模式下,將規則序列分成多個子序列,每個子序列單獨觸發(如軟件觸發SWSTART),適用于按需采樣和長序列分段處理(避免單次轉換時間過長導致的系統阻塞)等。7.2.2ADC的初始化及相關HAL庫驅動7.2ADC及其應用設置通道8為規則組中的第一個通道規則組中的通道數7.2ADC及其應用軟件觸發7.2ADC及其應用在CubeMX生成的MDK工程中,實現ADC及規則組初始化的操作通過調用MX_ADCx_Init()函數實現,其中x=1~3。該函數定義在ADC.c文件中,依次實現如下3項操作:調用HAL_ADC_Init()函數,配置ADC的全局特性,例如ADC時鐘、轉換變量、數據對齊格式、啟用的通道數等。調用HAL_ADC_ConfigChannel()函數配置規則組通道的轉換順序、采樣時間等。調用HAL_ADCEx_InjectedConfigChannel()函數配置注入組通道的轉換順序、采樣時間等,該函數定義在stm32f4xx_hal_adc_ex.c文件中。ADC的初始化7.2ADC及其應用ADC的操作訪問庫函數程序的基本流程如下:調用HAL_ADC_Start()或HAL_ADCEx_InjectedStart()函數,以啟動規則組或注入組通道的轉換;調用HAL_ADC_PollForConversion()或HAL_ADCEx_InjectedPollForConversion()函數以查詢轉換是否結束;當查詢返回結果為HAL_OK時,調用HAL_ADC_GetValue()或HAL_ADCEx_InjectedGetValue()函數讀取轉換結果。
查詢方式7.2ADC及其應用__IOuint16_tbuf[1];HAL_ADCEx_InjectedStart(&hadc1); /*啟動ADC*/while(HAL_ADC_PollForConversion(&hadc1,10)!=HAL_OK);/*等待轉換結束*/buf=HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_2); /*讀取轉換結果*/例如,要求以查詢方式控制ADC1注入組中通道2的轉換并讀取轉換結果,相應的語句如下:7.2ADC及其應用中斷方式如果要求采用中斷方式進行A/D轉換,程序的基本流程如下:調用HAL_ADC_Start_IT()或HAL_ADCEx_InjectedStart_IT()函數,以啟動規則組或注入組通道的轉換;當轉換結束時,執行ADC_IRQHandler()通用中斷服務函數,最后執行相應的中斷回調函數HAL_ADC_ConvCpltCallback()或HAL_ADCEx_InjectedConvCpltCallback(),在該函數中讀取轉換結果。7.2ADC及其應用【實踐案例7-2】單通道模擬電壓采集——中斷方式開發板板載一個貼片滑動變阻器,電路連接如圖7-10所示。當旋轉滑動變阻器調節旋鈕時,其動觸點電壓也會隨之改變,電壓變化范圍為0~3.3V,亦是開發板默認的ADC電壓采集范圍。本案例采用軟件觸發和中斷方式實現對滑動變阻器輸出單個模擬電壓的采集。7.2ADC及其應用CubeMX中的配置及初始化7.2ADC及其應用首先在CubeMX中配置RCC系統時鐘,并啟用USART1串口。此外,配置啟用ADC1的通道8(IN8),并按照圖7-11配置其相關參數。在NVICSettings中勾選使能ADC1中斷。應用程序的編寫7.2ADC及其應用7.2ADC及其應用配置ADC1的轉換位數為12位,因此分辨率為1LSB≈0.806mV。7.2ADC及其應用由于程序中將模擬電壓用浮點數格式顯示,因此注意在工程選項中的C/C++Build/Setting/ToolsSettings/MCU/MPUSettins中勾選Usefloatwithprintffromnewlib-nano選項。【照貓畫虎7-2】單通道模擬電壓采集修改上述案例,要求用查詢方式讀取ADC的轉換結果,每隔5s用TIM2觸發一次A/D轉換。7.2ADC及其應用7.3ADC的DMA傳輸7.3.1DMA控制器7.3.2DMA初始化配置7.3.3DMA的啟動和數據傳輸【實踐案例7-3】多通道模擬電壓采集【照貓畫虎7-3】內部溫度監測STM32F407的規則通道可以有16個,但是規則數據寄存器只有一個,如果采用掃描轉換模式,則前一個通道的轉換結果就會被后一個通道的轉換結果覆蓋。如果需要用利用同一個ADC外設的多個通道實現多個外部模擬電壓的采集,通常需要采用DMA傳輸技術,以便將轉換結果及時轉存到存儲器中。7.3ADC的DMA傳輸7.3.1DMA控制器DMA(DirectMemoryAccess,直接存儲器訪問)傳輸方式是利用DMA控制器直接控制總線,在外設與存儲器之間建立一條直接通道。可以實現外設(例如ADC)到存儲器、存儲器到外設(例如DAC)或存儲器到存儲器的數據傳輸。STM32F4有2個DMA控制器DMA1和DMA2,每個DMA控制器有8個數據流,每個數據流都與一個外設DMA請求(如ADC、DAC和定時器等)相關聯,如圖7-13和表7-4所示。7.3ADC的DMA傳輸7.3ADC的DMA傳輸7.3ADC的DMA傳輸7.3ADC的DMA傳輸當達到FIFO的閾值級別時,FIFO的內容移出并存儲到目標中。在直接模式下,每完成一次從外設到FIFO的數據傳輸后,相應的數據立即就會移出并存儲到目標器件中。DMA數據傳輸過程中,可以配置外設和存儲器指針在每次傳輸后自動向后遞增或保持不變。當通過單個寄存器訪問外設源或目標數據時,一般采用禁止遞增模式,即地址保持不變。如果使能了遞增模式,則根據配置的數據寬度是字節Byte、半字(HalfWord)或字(Word),每次數據傳輸后地址遞增1、2或4。對于ADC的掃描轉換模式,可以配置DMA工作在循環(Circular)模式,以便處理循環緩沖區和連續數據流。當激活循環模式時,要傳輸的數據個數在數據流配置階段自動用設置的初始值進行加載,并繼續響應DMA請求。7.3.2DMA初始化配置7.3ADC的DMA傳輸圖7-15
DMA參數配置界面7.3.3DMA的啟動和數據傳輸根據上述設置,在生成的工程中即可調用HAL_ADC_Start_DMA()函數實現ADC轉換結果的DMA傳輸。該函數啟動ADC外設,并在ADC數據傳輸結束時允許發出DMA請求。函數的原型聲明如下:HAL_StatusTypeDefHAL_ADC_Start_DMA(ADC_HandleTypeDef*hadc,uint32_t*pData,uint32_tLength)其中,第一個參數指定所啟用的ADC,第二個參數指定數據傳送到存儲器的地址指針,第3個參數指定傳送數據的個數。7.3ADC的DMA傳輸例如,如下語句HAL_StatusTypeDefHAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_data,3);將啟用ADC1外設及其DMA請求。其中ADC_data可以是程序中定義的uint32_t數組,數組長度等于ADC規則組中的通道數,在調用上述函數中將其強制轉換為地址指針。上述函數的第3個參數相應設置為等于ADC的通道數。執行上述函數時,將進一步調用HAL_DMA_Start_IT()函數,以便用中斷方式啟動DMA數據傳輸。7.3ADC的DMA傳輸需要注意的是,在MCU中,DMA一定與某個外設相關聯,也就是說在DMA的中斷處理中,最終都是調用所關聯外設的中斷回調函數。例如,在DMA數據傳輸結束時,將ADC的轉換結果存入存儲器后,DMA將發出中斷請求,最終將執行ADC的中斷回調函數:
voidHAL_ADC_ConvCpltCallback(ADC_HandleTypeDef*hadc)在程序中,對ADC轉換結果的處理必須放在該回調函數中。7.3ADC的DMA傳輸【實踐案例7-3】多通道模擬電壓采集多通道模擬電壓的采集一般使用DMA數據傳輸。本案例假設利用ADC1的通道IN6、IN8和IN9采集3路模擬電壓,并將電壓值顯示到串口調試助手。7.3ADC的DMA傳輸在CubeMX中配置RCC系統時鐘為168MHz,PCLK2時鐘為84MH,并啟用USART1串口。此外,在CubeMX主設計窗口左側的外設列表中,勾選SystemCore(系統內核)下面的DMA,并按照圖7-15對DMA控制器的參數進行配置。之后啟用ADC1外設,并配置啟用ADC1的通道IN6、IN8和IN9,并按照圖7-16配置ADC1的相關參數。根據上述配置,ADC1工作在獨立模式,采用12位右對齊數據格式,采用連續掃描模式。此外,啟用DMA傳輸,并設置在規則組中所有通道轉換結束時發出轉換結束信號。CubeMX中的配置7.3ADC的DMA傳輸7.3ADC的DMA傳輸應用程序的編寫7.3ADC的DMA傳輸7.3ADC的DMA傳輸【照貓畫虎7-3】多通道模擬電壓采集
修改上述案例,要求每隔5s用TIM2觸發一次3個通道的轉換。
提示:1)注意設置ADC禁用連續轉換模式ContinuousConversionMode;2)轉換結果的讀取和顯示在ADC的中斷回調函數中實現。
7.3ADC的DMA傳輸第8章FreeRTOS基礎第8章FreeRTOS基礎【實踐案例8-1】基于FreeRTOS工程的創建【照貓畫虎8-1】基于FreeRTOS工程的創建【實踐案例8-2】軟件定時器的使用【照貓畫虎8-2】軟件定時器的使用
8.1.1嵌入式操作系統8.1.2FreeRTOS的功能和特性
8.1.3固件包中的FreeRTOS8.1FreeRTOS簡介8.1.1嵌入式操作系統從計算機用戶的角度來說,計算機操作系統(Operating-System,OS)體現為提供的各項服務和管理功能;從程序員的角度來說,操作系統主要是指用戶登錄的界面或者接口;從設計人員的角度來說,操作系統指的是各種程序模塊和單元及其相互之間的聯系。8.1FreeRTOS簡介操作系統的基本功能進程管理存儲管理設備管理文件管理作業管理
嵌入式操作系統(EmbeddedOperating-System,EOS)是指用于嵌入式系統的操作系統,是一種用途廣泛的系統軟件,通常包括與硬件相關的底層驅動軟件、系統內核、設備驅動接口、通信協議、圖形界面、標準化瀏覽器等。嵌入式操作系統負責嵌入式系統的全部硬件和軟件資源的分配和任務調度,控制和協調各種并發活動。8.1FreeRTOS簡介嵌入式操作系統特
點:系統內核小專用性強系統精簡高實時性對于一般的嵌入式系統,如果功能要求相對比較簡單,通過精心的程序設計,采用不帶操作系統支持的裸機系統也能很好地實現其功能。但是,如果系統功能比較復雜,需要分解為很多子任務才能實現,或者為了保證系統的實時性等要求,這種情況下就必須使用實時操作系統(RTOS,Real-TimeOperating-System)。在編程和系統運行過程中,借助操作系統的支持,可以將復雜的功能分解為多個任務,便于實現系統功能的模塊化設計,使得程序結構簡單,易于維護和擴展,能夠有效地提高開發效率。8.1FreeRTOS簡介多任務實時操作系統實時系統又分為兩類,即硬實時系統和軟實時系統。實時嵌入系統是為執行特定功能而設計的,可以嚴格的按時序執行功能,其最大的特征就是程序的執行具有確定性。在實時系統中,如果系統在指定的時間內未能實現某個確定的任務,會導致系統的全面失敗,則稱為硬實時系統。而在軟實時系統中,雖然響應時間同樣重要,但是超時卻不會導致致命錯誤。一個硬實時系統往往在硬件上需要添加專門用于時間和優先級管理的控制芯片,而軟實時系統則主要在軟件方面通過編程實現時限的管理。8.1FreeRTOS簡介8.1.2FreeRTOS的功能和特性FreeRTOS是迷你型的多任務實時操作系統,已經作為一個中間件集成到STM32固件包中,在CubeIDE和固件包的安裝過程中將自動安裝。FreeRTOS的功能包括任務管理、時間管理、信號量、消息隊列、內存管理、資源管理、軟件定時器、中斷管理、事件組和任務通知等,可基本滿足較小系統的需要。FreeRTOS支持基于任務優先級的搶占式任務調度算法,能滿足硬實時系統的要求,能夠可以將復雜的系統功能分解為若干小的任務,便于實現程序功能的模塊化,便于簡化系統結構、便于系統功能擴展和運行維護。8.1FreeRTOS簡介FreeRTOS具有如下特性和功能:
(1)搶占式(Pre-emptive)或合作式(Co-operative)任務調度方式
(2)靈活的優先級管理
(3)提供了隊列(Queues)、二值(Binary)和計數(Counting)信號量(Semaphore)、互斥量(Mutexes)和遞歸互斥量(RecursiveMutexes)以及事件組(EventGroups)等功能組件以及靈活、快速而輕量化的任務通知(TaskNotification)機制
(4)提供了軟件定時器(SoftwareTimers)
(5)運行任務統計收集(TaskRun-TimeStaticsGathering)
(6)用于超低功耗的無節拍(Tick-less)特性
(7)全中斷嵌套模型(Fullinterruptnestingmodel)
(8)可選的商業許可和支持(Optionalcommerciallicensingandsupport)。8.1FreeRTOS簡介8.1.3固件包中的FreeRTOS8.1FreeRTOS簡介CMSIS標準接口文件,提供了FreeRTOS與固件包的接口,也就是為固件包增加了支持FreeRTOS的功能。FreeRTOS核心文件8.2FreeRTOS的初始化配置8.2.1CubeMX工程配置8.2.2工程文件的基本結構8.2.3主程序文件【實踐案例8-1】基于FreeRTOS工程的創建【照貓畫虎8-1】基于FreeRTOS工程的創建8.2.1CubeMX工程配置8.2FreeRTOS的初始化配置8.2FreeRTOS的初始化配置8.2FreeRTOS的初始化配置在基于FreeRTOS的應用程序中,系統滴答定時器SysTick將被用作FreeRTOS的基礎時鐘,所以需要另外設置一個定時器作為HAL庫的基礎時鐘。為此,在CubeMX主頁窗口左側單擊SYS,在模式配置窗口的TimebaseSource下拉列表中選擇除SysTick以外的其他定時器作為HAL時基源,例如選擇定時器TIM7。在FreeRTOS配置面板的AdvancedSettings(高級設置)選項卡中配置使能USE_NEWLIB_REENTRANT選項,以便提高內存使用效率。注
意8.2FreeRTOS的初始化配置8.2.2工程文件的基本結構存放工程所需的FreeRTOS內核源碼文件用戶配置和程序文件8.2FreeRTOS的初始化配置用戶配置和程序文件FreeRTOSConfig.h該文件在Core/Inc文件夾中,用于對FreeRTOS進行各種配置,FreeRTOS的功能裁剪通過該文件中各種宏定義參數的設置實現。freertos.c實現FreeRTOS初始化、創建用戶任務并實現用戶任務函數。stm32f4xx_hal_timebase_tim.c對配置的HAL庫基礎時鐘定時器進行初始化。8.2FreeRTOS的初始化配置FreeRTOS通用文件FreeRTOS通用功能文件包含FreeRTOS所需的部分缺省宏定義、數據類型定義、接口函數定義等,以便根據CubeMX中的初始化配置實現FreeRTOS的功能裁剪。提供了FreeRTOS中的一些通用定義,如錯誤編號宏定義,邏輯值的宏定義等,常用的幾個宏定義如下:#definepdFALSE ((BaseType_t)0)#definepdTRUE ((BaseType_t)1)#definepdPASS (pdTRUE)#definepdFAIL (pdFALSE)8.2FreeRTOS的初始化配置8.2FreeRTOS的初始化配置CMSIS-RTOS標準接口文件CMSIS-RTOS是在CMSIS接口標準中提供的與FreeRTOS的通用接口,應用程序和中間件組件可以使用該接口中的API,以便在各種軟件生態系統中更好地實現代碼重用和集成。在具體實現上,這些函數再調用移植得到的RTOS通用功能函數實現具體功能,稱為CMSIS-RTOS接口函數。在FreeRTOS中,有V1和V2兩個版本的CMSIS-RTOS接口,其中V1版本使得軟件能夠在不同的實時操作系統下運行(屏蔽了不同RTOS提供的API的差別),而V2版本能夠兼容更多的CPU架構和實時操作系統,但編譯的代碼更大。8.2FreeRTOS的初始化配置如果在模式面板中選擇CMSIS_V2,則表示配置使用CMSIS_V2版本接口。在基于CubeMX生成的工程代碼中,將生成Middlewares/ThirdParty/FreeRTOS/Source/CMSIS_RTOS_V2目錄。在該目錄下的文件主要是cmsis_os2.h/.c,其中提供了各種宏常量和宏函數、數據類型、CMSIS接口函數的定義,這些數據類型和函數名稱的前綴都是“os”。8.2FreeRTOS的初始化配置硬件相關移植文件硬件相關的移植文件就是需要根據硬件類型進行改寫的文件,這些文件在Middlewares/ThirdParty/FreeRTOS/Source/portable目錄下,具體又分為架構與編譯器、內存管理兩類文件。
處理器架構和編譯器相關文件這類文件位于/portable/GCC/ARM_CM4F文件夾中,其中主要是portmacro.h和port.c文件。這兩個文件中是一些基礎數據類型、宏定義和函數定義,這些數據類型和函數的功能實現涉及底層操作,其實現代碼甚至是用匯編語言寫的,所以與硬件密切相關。8.2FreeRTOS的初始化配置
內存管理相關文件內存管理涉及內存動態分配和釋放等操作,與具體的處理器密切相關。FreeRTOS提供了5種內存管理方案,即heap_1至heap_5,在CubeMX中的默認配置為heap_4,則在工程代碼中的Middlewares/ThirdParty/FreeRTOS/Source/portable/memMang文件夾中將提供內存管理文件heap_4.c。8.2FreeRTOS的初始化配置8.2.3主程序文件#include"main.h"#include"cmsis_os.h"#include"gpio.h"intmain(void){
HAL_Init();
/*HAL庫初始化*/
MX_GPIO_Init();
/*GPIO外設初始化*/
osKernelInitialize();
/*啟動FreeRTOS內核組件*/
MX_FREERTOS_Init();
/*FreeRTOS初始化*/
osKernelStart();
/*啟動FreeRTOS任務調度器*/
while(1){
……
}}在生成的工程代碼中,編寫用戶程序主要涉及main.c和freertos.c這兩個文件。主程序文件main.c中的初始化相關主要代碼如下:8.2FreeRTOS的初始化配置函數MX_FREERTOS_Init()實現FreeRTOS的初始化,實現的主要功能是根據應用程序的需要,創建任務、隊列、進程、信號量、互斥量等。特別注意到其中調用了定義在cmsis_os2.c文件中的osThreadNew()函數,創建了一個名為defaultTaskHandle的任務句柄。句柄名稱的前綴為defaultTask,這是在CubeMX的Tasks面板中設置的默認任務名。FreeRTOS的初始化8.2FreeRTOS的初始化配置8.2FreeRTOS的初始化配置函數osKernelStart()是定義在cmsis_os2.c文件中的CMSIS-FreeRTOS接口函數,其中主要的操作是調用vTaskStartScheduler()函數啟動任務調度器。與普通基于HAL庫的應用程序不同的是,在基于RTOS的應用程序中,一旦啟動任務調度器,main()函數中后面的代碼(包括后面的while循環)將永遠不會執行。程序執行流程的控制完全由FreeRTOS任務調度器接管。任務調度器的啟動8.2FreeRTOS的初始化配置CubeMX中任務的創建8.2FreeRTOS的初始化配置在調用osThreadNew()函數時,第一個參數StartDefaultTask稱為任務函數,該函數將實現具體的任務功能。任務函數及其定義在freertos.c文件中,自動創建的默認任務函數代碼如下:voidStartDefaultTask(void*argument){ /*USERCODEBEGINStartDefaultTask*/ /*Infiniteloop*/ for(;;){ osDelay(1); } /*USERCODEENDStartDefaultTask*/}8.2FreeRTOS的初始化配置任務函數是一個死循環,將無限程序運行,for循環體應根據要求實現的功能編寫替換。如果應用程序中還需要其他的任務,只需要在CubeMX再創建所需的任務。在生成的工程代碼中,除了在MX_FREERTOS_Init()中再次調用osThreadNew()函數創建該任務以外,用戶編寫程序的主要工作就是在freertos.c文件中編寫相應的任務函數,以便實現所需的應用功能。如果在CubeMX的工程管理器(ProjectManager)中不勾選Generateperipheralinitiation…選項,則FreeRTOS的初始化函數MX_FREERTOS_Init()和任務函數的定義代碼都將自動放在main.c文件中,而不是在freertos.c文件中。8.2FreeRTOS的初始化配置【實踐案例8-1】基于FreeRTOS工程的創建
本案例要求采用基于FreeRTOS的程序設計方法編寫控制程序,實現開發板上紅色LED以1s的間隔的不斷閃爍。首先在CubeMX中配置系統時鐘,配置開發板上連接紅色LED的PF6為GPIO_Output模式。為了采用基于FreeRTOS的程序開發,還需要啟用FreeRTOS,并做相關參數設置。這里假設FreeRTOS相關的所有參數都取默認配置。注意到在參數配置面板的TasksandQueues(任務和隊列)選項卡中,默認創建了一個名為defaultTask的任務。8.2FreeRTOS的初始化配置與此相對應,在freertos.c文件的MX_FREERTOS_Init()中,通過調用osThreadNew()函數創建了該任務,并在該文件中創建了默認任務函數StartDefaultTask()。在上述默認任務函數中,將其中的for循環語句修改如下:8.2FreeRTOS的初始化配置8.3FreeRTOS編程基礎8.3.1數據類型和代碼格式8.3.2FreeRTOS的移植和裁減文件portmacro.h中將標準C語言中的一些基礎數據類型(char、double等)重新定義,得到FreeRTOS程序中常用的數據類型符號。8.3.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年秋新教材譯林版九年級上冊英語Unit 8 Detective stories單元測試卷(含答案)
- 江蘇省蘇州市昆山市2025-2026學年四年級上學期期末語文試題(文字版含答案)
- 2026年醫院后勤運維管理專員醫療衛生事業招聘考試筆試試題(含答案)
- 2026年職業衛生宣教醫療衛生事業招聘考試筆試試題(含答案)
- 2026年煙草財務核算外勤專員煙草公司招聘考試筆試試題(含答案)
- 2026 年重癥急性胰腺炎早期腸內營養護理個案
- 2026年秋季高中開學第一課 防溺水安全教育教學設計
- 2026年秋季高中開學主題班會 行為規范與品德培養課件
- 2026年秋季生物科學專業開學第一課 職業發展前景分析教學設計
- 紅十字會救護員培訓理論考試試卷及答案
- 2026年云南省地礦測繪院有限公司招聘(37人)筆試備考試題及答案詳解
- 2026浙江省交通投資集團有限公司成員單位中后臺職能崗位(第二批)聯合招聘15人筆試模擬試題及答案詳解
- 臨床成人危重癥ENI全程防治新進展
- 2026年執業醫師鄉村全科執業助理醫師考試真題及答案
- 《PLC應用項目工單實踐教程》課件 模塊3 S7-1500PLC定時器計數器指令應用
- 益陽事業單位筆試真題2024
- 涂裝工考試:初級涂裝工題庫知識點(題庫版)
- 兒童護理:兒童保健各年齡兒童保健課件
- NB/T 10731-2021煤礦井下防水密閉墻設計施工及驗收規范
- LY/T 2111-2013美國白蛾防治技術規程
- GB/T 25000.10-2016系統與軟件工程系統與軟件質量要求和評價(SQuaRE)第10部分:系統與軟件質量模型
評論
0/150
提交評論