娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年12月03日(星期二)

正在發生

2018年12月03日 | STM32基本定時器TIM6和TIM7

發布者:ziyunting 來源: eefocus關鍵字:STM32  基本定時器  TIM6  TIM7 手機看文章 掃描二維碼
隨時隨地手機看文章

1. STM32上定時器的分類


前面學習了STM32系統定時器SysTick,它的主要作用是為OS提供系統滴答,當然我們也可以利用它實現了精準延時。在STM32單片機中,除了屬于CM3內核中的一個外設的系統定時器外,還有幾個屬于片上外設的定時器:基本定時器(TIM6和TIM7)、通用定時器(TIM2/3/4/5)和高級定時器(TIM1和TIM8)。強調,這里指的是除互聯型的STM32F1系列單片機。 


這里寫圖片描述


它們各自具有的功能特點可以詳見《STM32中文參考手冊_V10.pdf》-P298,這里簡單描述: 


(1)基本定時器(TIM6和TIM7):16位的只能向上計數的定時器,只能實現定時,沒有外部IO通道與它關聯。 


(2)通用定時器(TIM2/3/4/5):16位的可向上或者向下、向上/向下的定時器,除了能實現定時功能,還可以實現輸入捕獲、輸出比較功能(PWM),每個定時器有4個外部IO通道與它關聯。 


(3)高級定時器(TIM1和TIM8):16位的可向上或者向下、向上/向下的定時器,除了能實現定時功能,還可以實現輸入捕獲、輸出比較功能(PWM)、輸出互補等專用功能,每個定時器有4個外部IO通道與它關聯。 


這里寫圖片描述


今天先學習基本定時器。 


個人在學習定時器時的想法:定時超時能產生中斷信號,本能反應,它涉及到中斷編程就有可能涉及到設置NVIC(中斷源優先級相關)和EXTI(外部中斷/事件線EXTI0/1…/15相關),在前面實現SysTick定時編程中,由于SysTick并非片上外設所以并不需要設置NVIC,而STM32中非SysTick的定時器都屬于片上外設,所以自然是要設置NVIC;EXTI是設置外部中斷/事件線的,它必須關聯于某個對應的IO引腳,在SysTick定時編程中不需要設置,在這里同樣不需要設置。


2. 基本定時器的時基


定時器的基本功能是定時,定時的核心則是時基,看基本定時器的框圖, 


這里寫圖片描述


2.1 時鐘源CK_INT


定時器的學習,從時鐘源說起,也就是圖中的TIMxCLK。在時鐘樹中, 

 

這里寫圖片描述 


定時器2~7的時鐘源是這樣確定的:如果PCLK1的預分頻系數為1,則它們的時鐘源為PCLK1,否則它們的時鐘源為PCLK1的2倍。PCLK1在前面的配置中,已經將APB1的預分頻系數設置為2,即PCLK1為36MHz,所以定時器2~7的時鐘源 = TIMxCLK = 72MHz。


2.2 計數器時鐘CK_CNT


TIMxCLK經過PSC預分頻器之后為CK_INT,作為CNT計數器的計數時鐘。PSC可以對定時器時鐘TIMxCLK進行1~65535之間任何一個數進行分頻,CK_CNT = TIMxCLK / (PSC + 1)。PSC的值設置于TIMx_PSC寄存器。


2.3 計數器CNT


CNT是一個16位的計數器,只能往上遞增計數,不能超過65535,當計數達到自動重裝載寄存器里的數值時產生更新事件,CNT清零并從頭開始計數,如果使能了中斷的話,定時器還會產生溢出中斷。使能的中斷項有TIM_IT_Update等,詳細見下面TIM_ITConfig()函數的講解。CNT的值設置于TIMx_CNT寄存器。


2.4 自動重裝寄存器ARR


ARR是一個16位的寄存器,里面裝著計數器能計數的最大數值。ARR值設置于TIMx_ARR寄存器。


2.5 定時時間的計算


了解了定時器的運行時基,定時時間計算就很容易了。定時器的定時時間等于計時器的中斷產生周期乘以中斷的次數。定時器計一個數的時間是1 / CK_CNT,產生一次中斷需要的時間是ARR / CK_CNT,利用產生多次中斷即可延時多個中斷產生所需要的時間。


定時器還有TIMx_CR1和TIMx_CR2控制寄存器、TIMx_DIER中斷使能寄存器、TIMx_SR狀態寄存器,TIMx_EGR事件產生寄存器,具體意義詳見參考手冊,因為是使用標準庫編程,所以不再贅述。


編程常用的庫函數有: 


(1)使能/失能定時器中斷


TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)

1

參數1:TIMx的取值為TIM[1…8] 

參數2:表示超時后產生的中斷類型,有更新事件中斷TIM_IT_Update、TIM_IT_CCx[x=1..4]、TIM_IT_COM、TIM_IT_Trigger、TIM_IT_Break 

基本定時器定時取TIM_IT_Update即可。 

參數3:NewState即為DISABLE / ENABLE 


(2)清除中斷標志位


void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)

1

參數1:TIMx的取值為TIM[1…8] 

參數2:表示超時后產生的中斷類型,有更新事件中斷TIM_IT_Update、TIM_IT_CCx[x=1..4]、TIM_IT_COM、TIM_IT_Trigger、TIM_IT_Break 


(3)使能/失能計數器


void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

1

參數1:TIMx的取值為TIM[1…8] 

參數2:NewState即為DISABLE / ENABLE 


(4)開啟/關閉定時器的時鐘


void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)

1

定時器6是掛接在APB1總線上的,所以要開啟該定時器的時鐘需要調用RCC_APB1PeriphClockCmd函數 

參數1:


RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,

RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,

RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,

RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, 

RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,

RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,

RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,

RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14可選


參數2:NewState即為DISABLE / ENABLE


3. 基本定時器描述結構體


在標準外設庫中的stm32f10x_tim.h中有對定時器描述的4個結構體: 


(1)時基初始化結構體TIM_TimeBaseInitTypeDef 


(2)輸出比較功能初始化結構體TIM_OCInitTypeDef 


(3)輸入捕獲功能初始化結構體TIM_ICInitTypeDef 


(4)剎車和死區功能初始化結構體TIM_BDTRInitTypeDef 


基本定時器需要用到的描述結構體只是第(1)個TIM_TimeBaseInitTypeDef:


typedef struct

{

  uint16_t TIM_Prescaler;        //預分頻器

  uint16_t TIM_CounterMode;      //計數模式,向上/向下

  uint16_t TIM_Period;           //定時器周期

  uint16_t TIM_ClockDivision;    //時鐘分頻

  uint8_t TIM_RepetitionCounter; //重復計數器,利用它可以控制pwm個數,高級定時器用

} TIM_TimeBaseInitTypeDef;   


(1)TIM_Prescaler:定時器預分頻設置,定時器的時鐘是經過預分頻后時鐘源CK_INT,它操作的是TIMx_PSC寄存器的值,可設置的范圍為0~65535,注意TIMx_PSC會自動對設置值加1,所以實現的是1~65536分頻 

(2)TIM_CounterMode:定時器計數方式,取值可為:


#define TIM_CounterMode_Up                 ((uint16_t)0x0000)   //向上

#define TIM_CounterMode_Down               ((uint16_t)0x0010)   //向下    

#define TIM_CounterMode_CenterAligned1     ((uint16_t)0x0020)   //中間對齊1

#define TIM_CounterMode_CenterAligned2     ((uint16_t)0x0040)   //中間對齊2

#define TIM_CounterMode_CenterAligned3     ((uint16_t)0x0060)   //中間對齊3


基本定時器只能向上計數,即TIMx_CNT只能從0開始遞增,所以不需要對此值進行初始化 

(3)TIM_Period:定時器周期,即設定自動重裝載寄存器TIMx_ARR的值。設置值的范圍是0~65536 

(4)TIM_ClockDivision:時鐘分頻設置,設置定時器時鐘CK_INT頻率與數字濾波器采樣時鐘頻率分拼比,基本定時器沒有這功能,不管 

(5)TIM_RepetitionCounter:重復計數器,高級定時器TIM1和TIM8才具有的功能,控制輸出PWM波的輸出個數 

TIM_TimeBaseInitTypeDef結構體雖然有5個成員,但是對于基本定時器只需要設置TIM_Prescaler和TIM_Period。


4. 編程實踐


實現功能:利用基本定時器TIM6定時1S,超時則反轉兩個板載LED燈的狀態。 


(1)開啟TIM6定時器的時鐘 


(2)初始化定時器時基描述結構 


(3)使能TIM6的更新中斷 


(4)開啟定時器 


(5)中斷服務函數 


硬件平臺是正點原子的miniSTM32開發板。


BaseTIM.h:


#ifndef __BASETIM_H__

#define __BASETIM_H__


#include "stm32f10x_conf.h"


void Led_CfgInit(void);

void BaseTIM_CfgInit(void);

void NVIC_CfgInit(void);


#endif /* __BASETIM_H__ */


main.c中,初始化外接LED燈的GPIO:


//PA8-->LED0,PD2-->LED1

void Led_CfgInit(void)

{

    GPIO_InitTypeDef GPIO_InitTypeStu;


    //開啟PA和PD的時鐘

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD, ENABLE);


    //PA8為推挽輸出

    GPIO_InitTypeStu.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitTypeStu.GPIO_Pin = GPIO_Pin_8;

    GPIO_InitTypeStu.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitTypeStu);

    GPIO_SetBits(GPIOA,GPIO_Pin_8);             //初始化滅燈


    //PD2為推挽輸出

    GPIO_InitTypeStu.GPIO_Pin = GPIO_Pin_2;

    GPIO_Init(GPIOD, &GPIO_InitTypeStu);

    GPIO_ResetBits(GPIOD,GPIO_Pin_2);           //初始化亮燈

}


初始化定時器的時基描述結構體:


//設置中斷產生間隔為1ms,CLK_INT=72,預分頻系數 = 1000

void BaseTIM_CfgInit(void)

{

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStu;


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); 


    TIM_TimeBaseInitStu.TIM_Prescaler = 1000;           //預分頻系數

    TIM_TimeBaseInitStu.TIM_Period = 72 - 1;            //重裝載值  

    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStu);


    //注意要開啟定時器中斷,這里使用更新事件中斷

    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);


    //開啟計數器

    TIM_Cmd(TIM6, ENABLE);

}


初始化NVIC結構體:


void NVIC_CfgInit(void)

{

    NVIC_InitTypeDef NVIC_InitStu;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);     //設置中斷分組寄存器

    NVIC_InitStu.NVIC_IRQChannel = TIM6_IRQn;           //外部中斷線,定時器6

    NVIC_InitStu.NVIC_IRQChannelCmd = ENABLE;

    NVIC_InitStu.NVIC_IRQChannelPreemptionPriority = 1; //搶占優先級

    NVIC_InitStu.NVIC_IRQChannelSubPriority = 1;        //子優先級

    NVIC_Init(&NVIC_InitStu);

}


主函數實現模塊函數的調用及阻塞:


int main(void)

{

    Led_CfgInit();  


    BaseTIM_CfgInit();

    NVIC_CfgInit();


    while(1)

    {

        while (nTime < 1000);       //1000次中斷需要經歷1s,超時反轉led燈

        GPIO_WriteBit(GPIOD, GPIO_Pin_2, ((BitAction)!GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_2)));

        GPIO_WriteBit(GPIOA, GPIO_Pin_8, ((BitAction)!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)));

        nTime = 0;

    }

    return 0;

}


在stm32f10x_it.c中實現定時器超時的中斷處理函數:


void TIM6_IRQHandler(void)

{

    //判斷是否為定時器6的更新中斷

    if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)

    {

        nTime++;


        //注意要清除中斷標志

        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);

    }   

}


注意如果沒有在中斷服務函數中清除中斷標志,那么中斷服務函數會被cpu反復執行,也就是說接下來的其他操作將永遠得不到cpu資源。


關鍵字:STM32  基本定時器  TIM6  TIM7 引用地址:STM32基本定時器TIM6和TIM7

上一篇:STM32共用中斷和共用中斷函數的判斷
下一篇:stm32外部中斷常用庫函數

推薦閱讀

說明:里面可能有不少錯誤的觀念,希望大家發現后及時的糾正。首先了解一下雙堆棧的知識,下面的圖片來自《Cortex-M3權威指南》,有點枯燥,但還是要看的。 總結:1.系統復位后默認使用的是MSP,復位后的狀態是特權級線程狀態,在這個狀態下是允許修改寄存器CONTROL[1](見上面的圖片)的。進入到用戶特權以后就不能修改這些寄存器了。2.用戶特權的情況(...
液冷的HEV電池今天朋友和我交流混合動力電池的情況,目前國內也是需要兩條腿走路,往混合動力方向上給傳統內燃機做出延續,這就需要我們從傳統內燃機的角度,考慮 HEV 和 PHEV 兩者兼容的過渡模式。所以除了 HEV 的省油的考慮點以外,追求一些動力性,追求兩套系統兼容的考慮就成為了一個有價值的討論。在一定的成本選擇下,能夠導出熱量更快,液冷的...
蘋果打算提升Apple Watch電池壽命,以及增加更多傳感器。美國專利商標局周二授予蘋果公司兩項專利,兩項專利中的第一項,簡單地命名為 “電池表帶”,從它所提供的內容來看,非常簡單明了。實際上,這是一個可以容納多個電池的表帶,它以某種方式與Apple Watch相連。  蘋果在專利當中表示,表帶中包括多個相互平行的電池單元,安裝在沿著用戶...
丈量時的接線辦法如圖所示。將兆歐表接線柱E接電纜外殼,接線柱G接電纜芯與外殼之間的絕緣層上,接線柱L接電纜線芯,搖擺兆歐表的發電機手柄讀數。丈量效果是電纜線芯與電纜外殼的絕緣電阻值。圖 兆歐表丈量電纜絕緣電阻

史海拾趣

問答坊 | AI 解惑

求助電路板設計

有沒有會設計電子電路的朋友或者會E-CAD的朋友幫忙看一下這個題目,該怎么設計,因為是第一次接觸這種設計電路的東西,一點頭緒都沒有。或者哪位朋友能提供下現成的設計樣例參考一下,感激不盡, 根據你目前所學的電子技術知識,檢索一個芯 ...…

查看全部問答∨

EP3C25開發板初體驗NO.1

因為到外地安家,亂七八糟事情一大堆,所以來晚了. 板子入的的第一感覺:很有質感: 一看居然有三條電源線,分別是國標雙口,美標和歐標(日標)的吧 可惜三張光盤有兩張是重復的,居然都是LINUX的,WINDOWS下的沒有.(廠家配錯了) 嘿嘿,厚實的PCB,扎 ...…

查看全部問答∨

也來談談為什么企業不給新人事情做

本來看到靜若幽蘭的帖子,還以為這是她個人遇到的事,后來發現還有其他人也有同樣的遭遇。所以來說一說這事。             仔細回想,其實我個人也曾經遇到過這樣的事。記得那時我剛進某雜志社,被分配給 ...…

查看全部問答∨

求助板子間以太網互連為什么不能通信?

我用兩塊9b92的板子,一個作為服務器端,一個做客戶端,而且兩個板子分別與電腦進行以太網通信過沒有問題,但是直接把兩個板子互連后就不能建立連接,我交叉網線和直連網線都試過了,到底哪里出問題了呢?希望高手指點一下…

查看全部問答∨

關于學習飛思卡爾單片機

我是應屆畢業生,還沒畢業,公司是做ECU汽車電子的,要求我們提前去看看freescale hcs16或者powerpc的單片機,但是我今天去了圖書館,只找到了兩本freescale hcs08 和coldfire的書,我想問一下,這幾個系列是不是相差很大,看后面的兩種書是否能夠 ...…

查看全部問答∨

C8051F論文集

由于內容較多 無法全部傳完  陸續更新中....…

查看全部問答∨

LaunchPad PCB奮斗中

LaunchPad PCB奮斗中,剛把布局弄好,還是TI的牛逼啊,仿照都仿不好 [ 本帖最后由 Sur 于 2013-8-20 08:23 編輯 ]…

查看全部問答∨

430單片機

MSP430F5438型號的和別的430型號的單片機  為什么 都是用IVR編程  但是 他們的寄存器不一樣呢??…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 改则县| 区。| 闸北区| 固安县| 邵东县| 青岛市| 沁源县| 阳新县| 伊宁县| 金山区| 绥芬河市| 仙桃市| 伊宁县| 彩票| 瓦房店市| 沁阳市| 鱼台县| 玉门市| 廊坊市| 兰溪市| 河南省| 罗田县| 赫章县| 乐安县| 察雅县| 石嘴山市| 广河县| 鄂托克旗| 望城县| 玉林市| 县级市| 大丰市| 双辽市| 泸定县| 文山县| 班戈县| 资兴市| 西华县| 西平县| 定襄县| 桑日县|