STM32 定時器的4通道計數器應用

2020-11-28 電子產品世界
通用定時器確實比較強悍,功能極多我也比較暈

此為在不牽扯PWM與DMA下像C51那樣計數點燈。

本文引用地址:http://www.eepw.com.cn/article/201611/317176.htm

當然你要配置一些IO口作為點燈用這裡就不詳細說了。

就如

#defineLED2_ONGPIO_ResetBits(GPIOD,GPIO_Pin_7)
#define LED2_OFFGPIO_SetBits(GPIOD,GPIO_Pin_7)

這樣的。

然後啟用通用定時器2設置它的中斷等3.0的庫;

//Timer2中斷*//

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//TIM2全局中斷3.0的
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStructure);

}

//TIM2 clock enable

TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;

TIM_OCInitTypeDefTIM_OCInitStructure;

TIM_TimeBaseStructure.TIM_Period =8000;//計數值
TIM_TimeBaseStructure.TIM_Prescaler =7200-1;//預分頻,此值+1為分頻的除數
TIM_TimeBaseStructure.TIM_ClockDivision =0x0; //設置時鐘分割
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上計數


**********************************************************************************************
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

TIM_ClockDivision,設置時鐘分割

它就是RCC控制寄存器1(TIMx_CR1)的位9:8(CKD),具體含義如下:

CKD[1:0]:時鐘分頻因子
定義在定時器時鐘(CK_INT)頻率與數字濾波器(ETR,TIx)使用的採樣頻率之間的分頻比例。
0x00:tDTS = 1 xtCK_INT
0x01:tDTS = 2 xtCK_INT
0x10:tDTS = 4 xtCK_INT

TIM_TimeBaseStructure中應該還有一個更新報告uint8_t TIM_RepetitionCounter;不管他也行。

72M/7200=10K分頻後的結果就是,定時器速度為10K.計數器為向上計數,8000溢出,所以溢出時間就是
8000/10K=0.8秒.而捕獲的比較值則為:
u16 CCR1_Val = 4000;
u16 CCR2_Val = 2000;
u16 CCR3_Val = 1000;
u16 CCR4_Val = 500;
也就是說,在定時器開始計數後,第一通道的中斷發生在4000/10k=0.4秒,第二通道是0.2,第三
通道是0.1,第四是0.05*/

************************************************************************************************


//比較設置*/

TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Inactive;//輸出比較非主動模式

TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;//極性為正

//比較通道1*/
TIM_OCInitStructure.TIM_Pulse =CCR1_Val;//就是4000裝入捕獲比較寄存器的脈衝值

TIM_OC1Init(TIM2,&TIM_OCInitStructure);//寫入配置
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Disable);//禁止OC1重裝載,其實可以省掉這句,因為默是

//4路都不重裝的.

********************************************************************************************

typedef struct
{
uint16_t TIM_OCMode;//選擇定時器模式比較多有的功能也比較相似
uint16_t TIM_OutputState;//使能通道 為了和2.0兼容吧我不管他
uint16_tTIM_OutputNState;//失能??
uint16_tTIM_Pulse;//待裝入捕獲比較寄存器的脈衝值
uint16_t TIM_OCPolarity;//輸出極性
uint16_t TIM_OCNPolarity;//???
uint16_tTIM_OCIdleState;//???
uint16_t TIM_OCNIdleState;//???不懂得不管用默認就好
} TIM_OCInitTypeDef;

********************************************************************************************

//比較通道2 /
TIM_OCInitStructure.TIM_Pulse =CCR2_Val;

TIM_OC2Init(TIM2,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Disable);

//比較通道3 /
TIM_OCInitStructure.TIM_Pulse =CCR3_Val;

TIM_OC3Init(TIM2,&TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Disable);

//比較通道4 /
TIM_OCInitStructure.TIM_Pulse =CCR4_Val;

TIM_OC4Init(TIM2,&TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Disable);

//使能預裝載/
TIM_ARRPreloadConfig(TIM2,ENABLE);//這個歷程中沒有軟體修改寄存器所以沒他也行
//預先清除所有中斷位防止一啟用就有中斷從九九那抄的/
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 |TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update);

//4個通道和溢出都配置中斷/
TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 |TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update, ENABLE);
//允許TIM2開始計數/
TIM_Cmd(TIM2, ENABLE);

服務中斷函數比較簡單直接抄來

void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) !=RESET)
{
//必須清空標誌位/*/
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);

//點亮LED5 一定要是中文的 不然中間的 內容就不見了 本想大家移植到自己的作品中方便 看來SINA不可這樣用

相關焦點

  • stm32庫函數學習篇通用定時器輸入捕獲功能
    本文引用地址:http://www.eepw.com.cn/article/201611/318488.htm先有必要了解stm32定時器的輸入觸發模塊,如下圖:需要注意的是,一眼望去一個定時器似乎有8個通道,左邊四個,右邊四個,但其實左邊和右邊是共用相同的IO引腳,所以名稱標註是一模一樣。
  • 如何採用STM32中的控制定時器Tim1實現計數器功能
    STM32中的高級控制定時器(Tim1)是由一個16位的自動裝載計數器組成,它由一個可編程預分頻器驅動。 用途在於:測量輸入信號的脈衝寬度(輸入捕獲),或者產生輸出波形(輸出比較,PWM,嵌入死區時間的互補PWM等)。 使用定時器預分頻器和RCC時鐘控制預分頻器,可以實現脈衝寬度和波形周期從幾個微秒到幾個毫秒的調節。
  • 51單片機---定時器 計數器
    1/12;作為計數器使用時,通過引腳T0(P3.4)或T1(P3.5)對外部脈衝信號進行計數,當輸入的外部脈衝信號發生從1到0的負跳變時,計數器的值就自動加1;計數器的最高頻率一般是時鐘振蕩頻率的1/24;由此可知,不論是定時器還是計數器工作方式,定時器T0和T1均不佔用CPU的時間,除非定時器/計數器T0和T1溢出,才可能引起
  • 51單片機定時器/計數器的結構和原理
    作計數器時,只要在單片機外部引腳T0(或T1)有從1到0電平的負跳變,計數器就自動加1。計數的最高頻率一般為振蕩頻率的l/24。  工作方式:  T0或T1無論用作定時器或計數器都有4種工作方式:方式0、方式1、方式2和方式3。除方式3外,T0和T1有完全相同的工作狀態。下面以T1為例,分述各種工作方式的特點和用法。
  • 單片機定時器/計數器基本原理
    在AT89S52晶片內包含有三個16位的定時器/計數器:T0、T1和T2,其核心是加1計數器。我們主要要求掌握T0和T1的結構和功能。學習中要注意從電路結構上來理解功能的實現。定時器/計數器方式寄存器TMOD和定時器/計數器控制寄存器TCON是用以設定定時器/計數器的工作方式、定時或計數功能,控制啟動或停止以及產生溢出中斷的重要模塊,應該對這兩個寄存器中的逐位的定義和功能進行學習和掌握。
  • 單片機原理|定時器/計數器的工作原理及應用作業
    A、12B、1C、2D、1/12我的答案:B 得分: 2.3分 4用8051的定時器T0定時,用方式2,則應( )。
  • 基於STM32定時器的紅外遙控數據接收設計原理
    2、定時器計數和輸入捕獲 定時器就是按照一個特定的頻率對計數值進行加一或減一操作,當數值溢出時則產生一個標誌或中斷。 定時器的輸入捕獲就是可以測量輸入信號的脈衝寬度。 本次就是通過普通計數和輸入捕獲的結合來實現的。
  • 通過51單片機定時器/計數器實現精確延時
    在實際應用時,應首先根據需要對這些寄存器進行初始化,即設置TO和Tl的工作方式並對TO和Tl定時器裝入初始值以得到精確的定時時間。TO和Tl的工作方式及運行狀態是由TMOD和TCON兩個特殊功能寄存器控制的,而TMOD和TCON是由用戶所編的程序控制的。    定時器的核心是一個加l計數器,加l計數器的脈衝有兩個來源:一個是系統時鐘振蕩器,另一個是外部脈衝,計數器對脈衝進行計數。
  • 單片機定時器計數器初值的計算
    1.計數器初值的計算把計數器計滿為零所需要的計數值設定為C,計數初值設定為TC,由此可得到公式:TC=M-C式中,M為計數器模值,該值和計數器工作方式有關。
  • 51單片機計數器與定時器的區別
    在51單片機的學習過程中,我們經常會發現中斷、計數器/定時器、串口是學習單片機的難點,對於初學者來說,這幾部分的內容很難理解。
  • STM32 高級定時器-PWM簡單使用
    高級定時器與通用定時器比較類似,下面是一個TIM1 的PWM 程序,TIM1是STM32唯一的高級定時器。共有4個通道有 死區有互補。TIM_TimeBaseStructure.TIM_Period = 144;//裝載值 18k/144=125hz 就是說向上加的144便滿了TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//設置了時鐘分割不懂得不管TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;//周期計數器值
  • STM32定時器捕獲PWM脈衝頻率
    每個定時器有四個輸入捕獲通道IC1、IC2、IC3、IC4。且IC1 IC2一組,IC3 IC4一組。並且可是設置管腳和寄存器的對應關係。2. 同一個TIx輸入映射了兩個ICx信號。3. 這兩個ICx信號分別在相反的極性邊沿有效。4. 兩個邊沿信號中的一個被選為觸發信號,並且從模式控制器被設置成復位模式。5.
  • 單片機中各種周期的關係與定時器原理
    以STM32F103為例,進行解析  STM32的TIM一般有高級定時器TIM1,(TIM8隻有在互聯性產品有),普通定時器TIM2,TIM3,TIM4,(TIM5,TIM6,TIM7有點設備中沒有);今天就只介紹普通定時器,因為高級定時器我還不會!每一個普通定時器都有4路通道!
  • LPC1114/LPC11U14和LPC1343對比學習(四)定時器
    本文引用地址:http://www.eepw.com.cn/article/201611/322523.htm在這4個定時器中,基本操作是一模一樣的,所以在下面我們只拿一個定時器作為實例進行說明,對於其他定時器,只需要把寄存器名稱改成相應的寄存器就可以了。
  • stm32 霍爾傳感器接口
    異或門連接到TI1輸入通道(通過設置TIMx_CR2寄存器中的TI1S位來選擇),「接口定時器」捕獲這個信號。每當3個輸入之一變化時,計數器從新從0開始計數。這樣產生一個由霍爾輸入端的任何變化而觸發的時間基準。 「接口定時器」上的捕獲/比較通道1配置為捕獲模式,捕獲信號為TRC(見圖76)。捕獲值反映了兩個輸入變化間的時間延遲,給出了馬達速度的信息。
  • STM32f103 定時器之編碼器接口模式
    買了個Arduino的旋轉編碼器模塊,配合STM32定時器的編碼器模式實現了旋轉角度以及圈數的計數。這種旋轉編碼器我能想到的實際應用場景暫時只有實體音量旋鈕,滑鼠的滾輪等,所以只實現了計數。其實原理一樣,將旋轉編碼器的「CLK(A)」、「DT(B)」腳接入到TIMx的通道,將對應通道引腳配置為編碼器接口模式,使能計數,然後STM32的值就會在硬體上按照上述規對計數器的值進行加減。
  • 為什麼高速數據通道需要重定時器?
    轉接驅動器或重定時器晶片的典型應用包括:mykednc 到達大型PCB的最遠端 使用額外的連接器 支持子卡 連接擴展架 使用低端PCB材料 允許擁有較短距SerDes的晶片支持需要較長距離SerDes的應用 增強設備功能轉接驅動器和重定時器的比較典型的轉接驅動器數據通路包含連續時間線性均衡器(CTLE)、可變增益放大器(VGA)和線性驅動器。
  • 一個定時器生成多路PWM波形的原理和方法
    在很多工程應用中,需要使用到PWM波(脈寬調製),例如電機調速、溫度控制調整功率等。本文講述怎麼利用單片機的一個定時器生成多路PWM波形。一般的,PWM的周期t1是一個固定值,如1ms,10ms,100ms等,在一個周期中包含了高電平t2和低電平t3,它們的關係是t2+t3=t1。
  • stm32編碼器的接口模式
    編碼器是什麼玩意呢,它可是一個好玩的東西,做小車測速必不可少的玩意,下面,我將從編碼器的原理講起,一直到用stm32的編碼器接口模式,測出電機轉速與方向。2.stm32編碼器接口模式(寄存器)        stm32的編碼器接口模式在STM32中文參考手冊中有詳細的說明,在手冊273頁,14.3.12節。程序是完全按照 下圖方式,設置寄存器的。
  • avr單片機和stm32區別與優缺點分析
    摘要:avr單片機和stm32單片機是目前使用較廣泛的單片機,那麼avr單片機和stm32單片機有什麼區別呢?有什麼優劣勢呢?其基於專為要求高性能、低成 本、低功耗的嵌入式應用專門設計的ARM Cortex-M內核,同時具有一流的外設:1μs的雙12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表 現,當然和MSP430的功耗比起來是稍微遜色的一些,但這並不影響工程師們對它的熱捧程度,由於其簡單的結構和易用的工具再配合其強大的功能在行業中赫赫有名。