<center id="qkqgy"><optgroup id="qkqgy"></optgroup></center>
  • <menu id="qkqgy"></menu>
    <nav id="qkqgy"></nav>
    <xmp id="qkqgy"><nav id="qkqgy"></nav>
  • <xmp id="qkqgy"><menu id="qkqgy"></menu>
    <menu id="qkqgy"><menu id="qkqgy"></menu></menu>
    <tt id="qkqgy"><tt id="qkqgy"></tt></tt>

  • 一、TIM(Timer)定時器
    定時器可以對輸入的時鐘進行計數,并在計數值達到設定值時觸發中斷;
    16位計數器、預分頻器、自動重裝寄存器的時基單元,在72MHz計數時鐘下可以實現最大59.65s的定時;
    不僅具備基本的定時中斷功能,而且還包含內外時鐘源選擇、輸入捕獲、輸出比較、編碼器接口、主從觸發模式等多種功能;
    根據復雜度和應用場景分為了高級定時器、通用定時器、基本定時器三種類型。
    二、定時器類型
    STM32F103C8T6定時器資源:TIM1、TIM2、TIM3、TIM4,一個高級定時器,三個通用定時器。
    基本定時器介紹:

    自動重裝載寄存器,預分頻器和CNT計數器組成時基單元,完成計數計時的功能。預分頻器之前,連接的是基準計數時鐘的輸入,由于基本定時器只能選擇內部時鐘,所以可以看做內部時鐘(CK
    INT)直接連接的是預分頻器,來自RCC的TINxCLK一般都是72MHZ;實際分頻系數=預分頻器值+1,預分頻器是16位的,可以寫65535,因此最大分頻系數為65536。計數器是對分頻后的時鐘進行計數,每來一個上升沿,計數器值+1,計數器是16位的,因此最大計數值的范圍是0-65535;當計數器的值等于自動重裝載寄存器的值時,產生一次中斷信號,并且計數器的值清零,圖中向上的箭頭表示更新中斷,向下的箭頭表示更新事件,CPU響應更新中斷,定時器中斷的任務就完成了。
    **

    - 通用定時器框圖

    *
    高級定時器框圖
    定時中斷的基本結構
    使用定時器定時中斷的步驟:
    1.開啟時鐘。每個程序都必須的第一步,打開內部時鐘源,GPIO外設。
    2.選擇時基單元的時鐘源。定時器定時中斷選擇內部時鐘源。
    3.配置時基單元。配置預分頻器,自動重裝器和計數器這三個寄存器。
    4.配置輸出中斷控制,允許更新中斷輸出到NVIC.
    5.配置NVIC,在NVIC 中打開定時器中斷的通道,并分配一個優先級。
    6.運行控制。
    7.使能定時器。開中斷。
    8.寫定時器中斷服務程序。
    定時器中斷實現沒秒加1程序
    定時器初始化和中斷服務程序: #include "stm32f10x.h" // Device header void timer_Init(void) {
    NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef
    TIM_TimeBaseInitStructure; //1.開啟時鐘,TIM2是APB1總線的外設
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //2.配置時鐘單元
    TIM_InternalClockConfig(TIM2); //選擇內部時鐘驅動TIM2的時基單元
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //選擇時鐘分頻
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數器模式選擇
    //定時時間的公式:CK_CNT_OV = CK_PSC / (PSC + 1) / (ARR + 1),定時1s,也就是1HZ;
    //預分頻器和計數器有一個數的偏差,因此要減1,PSC和ARR的取值0~65535; TIM_TimeBaseInitStructure.TIM_Period
    = 10000-1; //自動重裝器的值 TIM_TimeBaseInitStructure.TIM_Prescaler = 7200-1; //預分頻器的值
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重復計數器的值,基本定時器用不到
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
    TIM_ClearFlag(TIM2,TIM_FLAG_Update); //手動清除中斷標志位,避免剛初始化完就進入中斷 //3.使能中斷
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //打開更新中斷到NVIC的通道。 //4.配置NVIC
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC優先級分組
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //選擇中斷通道
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //搶占優先級
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //響應優先級
    NVIC_Init(&NVIC_InitStructure); //5.啟動定時器 TIM_Cmd(TIM2,ENABLE); } /* void
    TIM2_IRQHandler(void) //中斷函數 { if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){
    //中斷標志位判斷,確認進入中斷 TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中斷標志位 } }*/
    main:
    #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h"
    #include "Timer.h" uint16_t Num; int main(void) { OLED_SPI_Init(); OLED_Init();
    timer_Init(); OLED_ShowString(1,1,"Num:"); while(1) { OLED_ShowNum(1,5,Num,5);
    } } void TIM2_IRQHandler(void) //中斷函數 {
    if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){ //中斷標志位判斷,確認進入中斷 Num++;
    TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中斷標志位 } }
    **

    技術
    下載桌面版
    GitHub
    百度網盤(提取碼:draw)
    Gitee
    云服務器優惠
    阿里云優惠券
    騰訊云優惠券
    華為云優惠券
    站點信息
    問題反饋
    郵箱:ixiaoyang8@qq.com
    QQ群:766591547
    關注微信
    巨胸美乳无码人妻视频