新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32學(xué)習(xí)筆記time定時(shí)器

        STM32學(xué)習(xí)筆記time定時(shí)器

        作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
        STM32的定時(shí)器是個(gè)強(qiáng)大的模塊,定時(shí)器使用的頻率也是很高的,定時(shí)器可以做一些基本的定時(shí),還可以做PWM輸出或者輸入捕獲功能。從系統(tǒng)框架圖下看,名為TIMx的有八個(gè),其中TIM1和TIM8掛在APB2總線上,而TIM2-TIM7則掛在APB1總線上。其中TIM1&TIM8稱為高級(jí)控制定時(shí)器(advancedcontroltimer).他們所在的APB2總線也比APB1總線要好。APB2可以工作在72MHz下,而APB1最大是36MHz。

        本文引用地址:http://www.104case.com/article/201611/318485.htm


        由上圖可知,當(dāng)APB1的預(yù)分頻系數(shù)為1 時(shí),這個(gè)倍頻器不起作用,定時(shí)器的時(shí)鐘頻率等于APB1的頻率;當(dāng)APB1的預(yù)分頻系數(shù)為其它數(shù)值(即預(yù)分頻系數(shù)為2、4、8 或16)時(shí),這個(gè)倍頻器起作用,定時(shí)器的時(shí)鐘頻率等于APB1的頻率兩倍。也就是,當(dāng)APB1不分頻,TIM3的時(shí)鐘速度為36MHz,當(dāng)2分頻是,APB1變成18MHz,但是TIM又會(huì)倍頻,即TIM時(shí)鐘等于18*2=36MHz。這里我們用向上計(jì)數(shù)的方式,即TIMx_CNT中的計(jì)數(shù)值達(dá)到TIMx_ARR中的值時(shí),產(chǎn)生中斷,TIMx_CNT又從0開始計(jì)。

        無疑STM32的定時(shí)器是復(fù)雜的,主要有定時(shí),捕獲,PWM產(chǎn)生功能。我花了點(diǎn)時(shí)間看通用定時(shí)器2,3,4的框圖,tim1則在通用定時(shí)器的基礎(chǔ)上多加了些功能,稱為高級(jí)定時(shí)器。
        ////////////////////////////////////////////////////////////////////////////////
        根據(jù)程序來分析:
        /////////////定時(shí)器2配置500ms///////////////////////////////////////////////////////
        TIM_DeInit(TIM2);//TIM2,3,4:SystemClk=APB1(Max36Mhz)
        RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //使能TIM2的時(shí)鐘
        //////////定時(shí)器2配置///////////////////////////////
        //計(jì)劃:PSC = 349 則 CK_CNT = 36Mhz/(349+1) =>10us
        // ARR = 50 000 1us * 50 000 =50ms
        m_TIM_TimeBaseInitTypeDef.TIM_Prescaler = 349; //預(yù)分頻 PSC(0-65535)
        m_TIM_TimeBaseInitTypeDef.TIM_CounterMode = TIM_CounterMode_Up; //計(jì)數(shù)模
        m_TIM_TimeBaseInitTypeDef.TIM_Period = 50000; //自動(dòng)重載 ARR(0-65535)
        m_TIM_TimeBaseInitTypeDef.TIM_ClockDivision = TIM_CKD_DIV1; //時(shí)鐘分頻因子1,2,4
        m_TIM_TimeBaseInitTypeDef.TIM_RepetitionCounter = 0;//循環(huán)計(jì)數(shù)次數(shù)(只是TIM1,8有)
        TIM_TimeBaseInit(TIM2,&m_TIM_TimeBaseInitTypeDef);
        ////////////////////////////////////////////////////
        //使能配置中斷=>:使能更新事件中斷
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//Enables or disables the specified TIM interrupts.
        //注意TIM_UpdateDisableConfig 用DISABLE函數(shù)處才將對(duì)應(yīng)為清零而達(dá)到使能(UDIS=0:使能更新事件)
        TIM_UpdateDisableConfig(TIM2,DISABLE);//Enables or Disables the TIMx Update event.
        NVIC->ISER[0] |= (1 << (TIM2_IRQChannel & 0x1F)); // enable interrupt
        //開始計(jì)數(shù)
        TIM_Cmd(TIM2,ENABLE);//Enables or disables the specified TIM peripheral.
        首先在在定時(shí)功能上和傳統(tǒng)的51,avr比,多了些功能,其他的一樣。其輸入時(shí)鐘源為APB1/2,等同51,avr的系統(tǒng)時(shí)鐘。忘了51,至少avr有時(shí)鐘分頻功能,stm32也有在函數(shù)配置中TIM_ClockDivision = TIM_CKD_DIV1; //(時(shí)鐘分頻因子1,2,4)在時(shí)鐘輸入上,時(shí)鐘多了個(gè)選擇TIM_Prescaler(預(yù)分頻),這個(gè)的加入靈活性加大,它可以是0-65535的任意值,則預(yù)傳統(tǒng)的只能幾個(gè)選擇則體現(xiàn)了配置的靈活和實(shí)用。
        //m_TIM_TimeBaseInitTypeDef.TIM_Prescaler = 349;
        //m_TIM_TimeBaseInitTypeDef.TIM_ClockDivision = TIM_CKD_DIV1;

        再說:51,avr的計(jì)數(shù)器初值,也是決定定時(shí)大小的一個(gè)因素。具體實(shí)現(xiàn):就是計(jì)數(shù)器計(jì)數(shù)自減或者增加到某個(gè)值,發(fā)生溢出中斷,在自加的時(shí)候是從初值加到滿值 溢出。自減時(shí),是從初值減到0溢出,發(fā)生中斷,在每次定時(shí)完畢的定時(shí)器溢出后,其初值需要在中斷函數(shù)中重新賦值給計(jì)數(shù)器。
        在stm32中也是有個(gè)同樣的功能,但是這兒是不同的。在自加的時(shí)候,從0開始,直到寄存器TIMx_ARR值大小產(chǎn)生溢出中斷,自減是從TIMx_ARR值大小開始自動(dòng)減直到0溢出,不通點(diǎn)1。在進(jìn)入中斷后,中斷函數(shù)一個(gè)更新事件,這個(gè)更新事件將自動(dòng)重載TIMx_ARR到計(jì)數(shù)器,這一點(diǎn)與51中的自動(dòng)重載類似.
        //m_TIM_TimeBaseInitTypeDef.TIM_Period = 50000;



        關(guān)鍵詞: STM32time定時(shí)

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 莱西市| 武安市| 兴化市| 米脂县| 平舆县| 郑州市| 南宁市| 鸡东县| 靖安县| 江永县| 红河县| 广水市| 常德市| 阳春市| 莱芜市| 临清市| 静安区| 额敏县| 湾仔区| 房山区| 元阳县| 兰西县| 平谷区| 凤庆县| 东海县| 峨边| 禹州市| 融水| 聊城市| 尉犁县| 威海市| 湾仔区| 休宁县| 拉萨市| 化德县| 泰州市| 金乡县| 惠东县| 洞口县| 临沂市| 常山县|