為了實現脈沖測量有時候需要使用定時器計數,STM32的定時器計數精度不錯,獨立於程序之外。可以通過軟件對其設定。當想要對信號進行測量時,只要設置好定期器就行。
舉例說明:
例,如想要通過TIMER5定時器實現某信號周期測量。
void TIM5_IRQHandler(void) { if(TIM3->SR&0X0001)//溢出中斷 { LED1=!LED1; } //TIM3->CNT &= 0x0; TIM3->SR&=~(1<<0);//清除中斷標志位 } //通用定時器中斷初始化 //這里時鍾選擇為APB1的2倍,而APB1為36M //arr:自動重裝值。 //psc:時鍾預分頻數 //這里使用的是定時器3! void TIM5_Int_Init(u16 arr,u16 psc) { NVIC_InitTypeDef NVIC_InitStructure; RCC->APB1ENR|=1<<3; //TIM5時鍾使能 TIM5->ARR=arr; //設定計數器自動重裝值 TIM5->PSC=psc; //預分頻器設置 TIM5->DIER|=1<<0; //允許更新中斷 TIM5->CR1|=0x01; //使能定時器3 // 配置NVIC為優先級組1 / //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //配置中斷源:按鍵1 // NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //配置搶占優先級 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 配置子優先級 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // 使能中斷通道 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
先進行時鍾設置,開啟時鍾后,根據周期測量需要在測量地方獲取TIMX->CNT數值並進行保存。本例是測量數據發送周期,每次數據完成32bit時獲取計數器值進行保存,同時清空計數器值。
//串口任務的任務函數
void usart_task(void *pvParameters)
{
while(1)
{
if(dis_in_cnt == 32){ //第32位計數輸入完成則進入串口傳輸
timer3_cnt = TIM5->CNT;
TIM5->CNT = 0;
//省略部分無關代碼
}
vTaskDelay(10);
}
