1. 程式人生 > >stm32-定時器中斷

stm32-定時器中斷

cmd open 兩個 typedef clock 數據手冊 濾波 重裝 fin

由於現在是在學用庫函數操作,我的目標是知道用到的每個函數的作用,需要的時候可以加以更改使用,所以關鍵是要怎麽知道stm32各函數的作用

雖然從名字上也能知道個大概,但是細節還是要查stm32參考手冊,準確的說是技術參考手冊(主要講如何使用),另有數據手冊(註重數據的描述如內存,電壓電流等)

至於怎麽查 這個估計需要經驗,我的一點心得是:在代碼裏右鍵 點go to definition。。。想辦法找到這個代碼具體操作的是哪個寄存器的哪一位,再去手冊看這個位的作用。

下面兩張圖主要是說明定時器時鐘來源技術分享

技術分享

以下為代碼

#include "timer.h"
#include "led.h"
//中斷管理函數主要在misc裏定義
//通用定時器中斷初始化
//這裏時鐘選擇為APB1的2倍,而APB1為36M
//arr:自動重裝值。
//psc:時鐘預分頻數,psc接收的是TIMx_clk,是apb1倍頻後再根據psc分頻
//這裏使用的是定時器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時鐘使能

	TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值	 計數到5000為500ms,就是設定中斷發生周期
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值  10Khz的計數頻率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim   時鐘分割定義的是在定時器時鐘頻率(CK_INT)與數字濾波器(ETR,TIx)使用的采樣
	//頻率之間的分頻比例。數字濾波器(ETR,TIx)是為了將ETR進來的分頻後的信號濾波,保證通過信號頻率不超過某個限定。當fCK_INT=72MHz時,選擇fDTS=fCK_INT/2=36MHz,
	//采樣頻率fSAMPLING=fDTS/2=18MHz且N=6,則頻率高於3MHz的信號將被這個濾波器濾除,有效地屏蔽了高於3MHz的幹擾。fDTS=fCK_INT/2=36MHz這裏的2就是可以設置的
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位
 
	TIM_ITConfig(  //使能或者失能指定的TIM中斷
		TIM3, //TIM2
		TIM_IT_Update ,//中斷類型,如更新中斷(就是cnt到了arr就重裝),觸發中斷,輸入捕獲中斷
		ENABLE  //TIMx_DIER寄存器,應該是dma或時鐘專用的開關
		);
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //指明中斷名稱 在stm32f10x.h中定義
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占優先級0級,即搶占優先級,是對搶占時的優先級的劃分,高優先級能打斷低優先級,能有嵌套關系
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //從優先級3級,相同搶占優先級時,不能相互打斷,但同時發生時根據響應優先級來決定誰先,且不能有嵌套關系,另外兩個優先級都相同時誰先就誰先執行
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能,操作ISER寄存器,這是在NVIC中斷控制器中允許
	NVIC_Init(&NVIC_InitStructure);  //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器

	TIM_Cmd(TIM3, ENABLE);  //使能TIMx外設,開啟定時器   TIMx_CR1寄存器
							 
}

void TIM3_IRQHandler(void)   //TIM3中斷 名字在startup中定義
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發生與否:TIM 中斷源 ,判斷中斷類型(此處是更新中斷)
		{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中斷待處理位:TIM 中斷源 
		LED1=!LED1;
		}
}

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"
//ALIENTEK Mini STM32開發板範例代碼7
//定時器中斷實驗   
//技術支持:www.openedv.com
//廣州市星翼電子科技有限公司
 int main(void)
 {	
	delay_init();	    	 //延時函數初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設置中斷優先級分組2,分組x,則x位搶占優先級,(4-x)位響應優先級
	LED_Init();		  	//初始化與LED連接的硬件接口
	TIM3_Int_Init(4999,7199);//10Khz的計數頻率,計數到5000為500ms  72mhz/7200=10000hz
   	while(1)
	{
		LED0=!LED0;
		delay_ms(200);		   
	}
}

最後 註意

技術分享

NVIc裏的寄存器如iser是在這裏面才找得到描述

stm32-定時器中斷