亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

stm32通用定時器怎么使用

發布時間:2022-01-05 19:35:00 來源:億速云 閱讀:148 作者:柒染 欄目:互聯網科技

本篇文章為大家展示了stm32通用定時器怎么使用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

        stm32的定時器又多又復雜,但復雜意味著強大吧。我用的是stm32f103ZET6,有2個基本定時器TIM6和TIM7可以用來觸發DAC,4個通用定時器TIM2,TIM3,TIM4,TIM5,兩個高級定時器TIM1和TIM8,還有兩個專用定時器SysTick和RTC。

        TIM2,3,4,5,6掛在APB1總線上,TIM1,8掛在APB2總線上,V3.5固件庫默認時鐘為APB1=36MHz,APB2=72MHz。不過由于對于定時器來說APB1預分頻系數為1時頻率*2,所以定時器計數時鐘TIMXCLK都為72MHz。

        通用定時器功能:1、基本時基功能計時。2、輸入捕獲(可用于測量脈沖周期和占空比)。3、輸出比較(四個通道可以當做四個定時器使用)。4、PWM功能。5、正交編碼器。

        基本定時器:首先也是最重要的當然是定時器的時鐘配置了,如果TIMXCLK是72MHz,根據你的需要對時鐘進行分頻,分頻就是對結構體中的兩個成員進行賦值,

.TIM_Prescaler  //這個成員是預分頻,對應一個16位的分頻寄存器,也就是說你可以進行1-65536分頻。這個分頻一般都能滿足需求。
.TIM_ClockDivision //這個是分頻可能會對,定時器外部計數時的濾波器有影響,所以不用它就行,直接賦值為TIM_CKD_DIV1一分頻,就是不分頻。因為.TIM_Prescaler這個分頻就夠用了。

        簡單定時功能配置方式如下:

void tim2Config(void)          //簡單定時功能
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 	//使能時鐘
	TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);					
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;		//向上計數
	TIM_TimeBaseInitStructure.TIM_Prescaler = 71;	        //71+1分頻,1MHz周期1us
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;//時鐘不分頻
	TIM_TimeBaseInitStructure.TIM_Period = 1000-1;		//溢出周期1000	=  1ms	
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);	
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);	//開啟溢出中斷計數到TIM_Period時,發生中斷				
	TIM_Cmd(TIM2, ENABLE);			//使能TIM2		

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);		//配置中斷向量
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

        關于中斷向量可以看一下這個博客:http://www.cnblogs.com/dyllove98/archive/2013/08/01/3230973.html

中斷函數:

void TIM2_IRQHandler(void)
{
		
    if( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET ) //是否為溢出中斷
    {
		 
		
		TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update); //清除中斷掛起位           
    }
}

        這里注意一定要清除中斷掛起位,不然會一直中斷。

2、PWM模式:

    PWM模式理解起來簡單其實就是有兩個寄存器,一個是周期寄存器,另一個是比較寄存器。周期寄存器控制周期,比較寄存器控制有效電平(是高電平還是低電平由.TIM_OCPolarity_High的值決定)時間。假如向上計數時,計數器寄存器從零計數,計數到達比較寄存器中的值之前一直為有效電平,之后為另一個電平。計數到周期寄存器中的值時,一個周期完成。這樣就成了PWM了。

1、配置GPIO模式。2、配置TIM_TimeBaseInitTypeDef結構體。3、配置TIM_OCInitTypeDef結構體。

static void TIM3_GPIO_Config(void) 
{
  GPIO_InitTypeDef GPIO_InitStructure;

	/* TIM3 clock enable */
	//PCLK1經過2倍頻后作為TIM3的時鐘源等于72MHz
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 

  /* GPIOA and GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); 

  /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		    // 復用推挽輸出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /*GPIOB Configuration: TIM3 channel 3 and 4 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1;

  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/*
 * 函數名:TIM3_Mode_Config
 * 描述  :配置TIM3輸出的PWM信號的模式,如周期、極性、占空比
 * 輸入  :無
 * 輸出  :無
 * 調用  :內部調用
 */
static void TIM3_Mode_Config(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

	/* PWM信號電平跳變值 */
	u16 CCR1_Val = 500;        
	u16 CCR2_Val = 375;
	u16 CCR3_Val = 250;
	u16 CCR4_Val = 125;

/* -----------------------------------------------------------------------
    TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles:
    TIM3CLK = 72 MHz, Prescaler = 0x0, TIM3 counter clock = 72 MHz
    TIM3 ARR Register = 999 => TIM3 Frequency = TIM3 counter clock/(ARR + 1)
    TIM3 Frequency = 72 KHz.
    TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%
    TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%
    TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%
    TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%
  ----------------------------------------------------------------------- */

  /* Time base configuration */		 
  TIM_TimeBaseStructure.TIM_Period = 999;       //當定時器從0計數到999,即為1000次,為一個定時周期
  TIM_TimeBaseStructure.TIM_Prescaler = 71;	    //設置預分頻:不預分頻,即為72MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;	//設置時鐘分頻系數:不分頻
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上計數模式

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;	    //配置為PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;	   //設置跳變值,當計數器計數到這個值時,電平發生跳變
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //當定時器計數值小于CCR1_Val時為高電平

  TIM_OC1Init(TIM3, &TIM_OCInitStructure);	 //使能通道1

  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;	  //設置通道2的電平跳變值,輸出另外一個占空比的PWM

  TIM_OC2Init(TIM3, &TIM_OCInitStructure);	  //使能通道2

  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;	//設置通道3的電平跳變值,輸出另外一個占空比的PWM

  TIM_OC3Init(TIM3, &TIM_OCInitStructure);	 //使能通道3

  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;	//設置通道4的電平跳變值,輸出另外一個占空比的PWM

  TIM_OC4Init(TIM3, &TIM_OCInitStructure);	//使能通道4

  TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

  TIM_ARRPreloadConfig(TIM3, ENABLE);			 // 使能TIM3重載寄存器ARR

  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);                   //使能定時器3	
}

/*
 * 函數名:TIM3_PWM_Init
 * 描述  :TIM3 輸出PWM信號初始化,只要調用這個函數
 *         TIM3的四個通道就會有PWM信號輸出
 * 輸入  :無
 * 輸出  :無
 * 調用  :外部調用
 */
void TIM3_PWM_Init(void)
{
	TIM3_GPIO_Config();
	TIM3_Mode_Config();	
}

改變PWM占空比,即是改變比較寄存器的值。使用這個函數

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);

使用方法簡單例如要改變,TIM3通道1的占空比就這樣,TIM_SetCompare1(TIM3, 900); 900為新的比較寄存器的值。

上述內容就是stm32通用定時器怎么使用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

剑阁县| 壶关县| 乐业县| 通辽市| 安塞县| 封丘县| 陵川县| 旌德县| 黎城县| 瑞金市| 独山县| SHOW| 闽侯县| 防城港市| 乌兰察布市| 旬邑县| 台江县| 庆城县| 拉萨市| 靖远县| 巴马| 涞源县| 巴林右旗| 临漳县| 景宁| 宜州市| 黄梅县| 广安市| 驻马店市| 新干县| 哈密市| 怀仁县| 平远县| 芜湖市| 育儿| 河源市| 阜康市| 三江| 平遥县| 武宣县| 平塘县|