新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 重返STM32之---STM32定時器的誤解

        重返STM32之---STM32定時器的誤解

        作者: 時間:2016-11-11 來源:網絡 收藏
        說是接觸STM32都快3年了,說來也慚愧,很多東西都還沒搞明白;應該也是因為英文水平有待提到的原因,不能正確的理解英文的含義,畢竟我們的語言思維是不一樣的(找個借口吧哈哈)。

        最近在用STM32的定時器,以前都是匆匆走過,由于自己想標準化自己的編程代碼,所以這次很用心的用通用定時器寫通用的延時函數,網上很多都是用的系統滴答時鐘(SysTlck)來做的,但是想著自己要向操作系統方向發展,就不能用這個定時器了。

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

        平時因為用的是滴答時鐘來做的延時函數,就沒怎么去深究;這次用通用定時來做的時候,發現問題一大把。首先就是定時器的時鐘分頻,第二個就是如何不用中斷來實現定時。因為自己覺得對STM32很了解,所以就范范的寫了代碼,覺得自己肯定沒問題;編譯下載。What f**k?!居然定時不對,和我以前理解的定時器不一樣?還是我的代碼有問題?花了大半天去看每個寄存器;(其實我最開始用的就是直接操作寄存器,后來才用的庫函數)覺得沒問題呀;后來想要不在把每個寄存的意思在認真理解一遍;不看不知道,一看下一跳呀。哎,多的廢話就不說了,直接看圖吧。

        第一個就是我們認為是控制時鐘分頻的寄存器,以前大家都是設置為00,但是當把它設置為其他值時,發現定時沒有變化;其實是被名稱誤導了,仔細看后邊的說明,這個時鐘只是用于數字濾波器!!!更本沒有改變定時器的時鐘。它只影響ETR和TIX。

        第二個就是對于定時器時鐘和APB1時鐘是一致的誤解。

        其實定時器的時鐘和系統時鐘是一致的。所以更本不是APB1的時鐘。

        其實現在才發現自己以前有多么的不仔細,經過此事以后發現在技術方面對自己要求太低了,什么都是了解一個大概;要用的時候才發現自己千瘡百孔。

        這也算是提醒自己,也提醒正在嵌入式系統開發道路上的仁兄們,萬事要認真呀!!!

        貼一段我自己寫通用定時器代碼吧。

        void delay_init()

        {

        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

        TIM_TimeBaseStructure.TIM_Prescaler = 72-1;// 預分頻 72000000/72=1000000

        TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV2;//采樣時鐘分頻.不是定時器時鐘分頻。

        TIM_TimeBaseStructure.TIM_Period = 1;//重裝值

        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;

        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

        TIM_ARRPreloadConfig(TIM3, ENABLE);

        TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);

        TIM_Cmd(TIM3, DISABLE);

        }

        void delay_ms(uint16_t nms)

        {

        uint16_t count;

        count = nms*10;

        TIM3->PSC = 7200-1;

        TIM_GenerateEvent(TIM3,TIM_EventSource_Update);

        TIM_SetCounter(TIM3,count);

        TIM_Cmd(TIM3,ENABLE);

        while(count>1)

        {

        count = TIM3->CNT;

        }

        TIM_Cmd(TIM3,DISABLE);

        }

        void delay_us(uint16_t nus)

        {

        uint16_t count;

        count = nus;

        TIM3->PSC = 72-1;

        TIM_GenerateEvent(TIM3,TIM_EventSource_Update);

        TIM_SetCounter(TIM3,count);

        TIM_Cmd(TIM3,ENABLE);

        while(count>1)

        {

        count = TIM3->CNT;

        }

        TIM_Cmd(TIM3,DISABLE);

        }




        關鍵詞: STM32定時

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 隆昌县| 南宁市| 华安县| 正安县| 长宁县| 建瓯市| 措勤县| 和平区| 兰溪市| 新野县| 兴宁市| 台东市| 长白| 白朗县| 虎林市| 阿拉善右旗| 克拉玛依市| 景德镇市| 上饶市| 宁武县| 西丰县| 房产| 阿拉善左旗| 宁都县| 尖扎县| 桂阳县| 沁阳市| 永济市| 内乡县| 乌什县| 衡阳县| 卫辉市| 霍城县| 余干县| 佛坪县| 射阳县| 响水县| 防城港市| 色达县| 双江| 苗栗县|