新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM學習《八》——STM32定時器配置及其中斷設置!

        ARM學習《八》——STM32定時器配置及其中斷設置!

        作者: 時間:2016-11-20 來源:網絡 收藏
        好久沒有寫東西了,工作太忙都快沒時間學習了。今天調試了STM32的定時器功能,STM32定時器比較多,但調試都是一樣的,寄存器都是一一對應的。就拿TIM2舉例說明。在網上搜了好多關于定時器的設置,但大多數都是一個版本,而且都是針對庫函數操作的,讓人看起來一頭霧水,對于初學者很是不利(我也是初學者)。下面我將自己的定時器設置過程一一記錄下來,以供大家參考,我們共同學習……

        首先定義定時器頭文件,也就是定義寄存器以供操作:

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

        //*************************************************************************

        //

        // TIM2-Register

        //

        //*************************************************************************

        #define TIM2_CR1(*((volatile unsigned long *)0x40000000))

        #define TIM2_CR2(*((volatile unsigned long *)0x40000004))

        #define TIM2_DIER(*((volatile unsigned long *)0x4000000C))

        #define TIM2_SR(*((volatile unsigned long *)0x40000010))

        #define TIM2_EGR(*((volatile unsigned long *)0x40000014))

        #define TIM2_CNT(*((volatile unsigned long *)0x40000024))

        #define TIM2_PSC(*((volatile unsigned long *)0x40000028))

        #define TIM2_ARR(*((volatile unsigned long *)0x4000002C))

        然后配置定時器TIM2:

        void TIM2_Configuration(void)

        {

        RCC_APB1ENR|=0x00000001; //位0 IM2EN TIM2定時器時鐘使能

        TIM2_PSC |=19999; //設置預分頻,實現1ms,20M ,20000/20M

        TIM2_ARR = 1000;//1s產生一次中斷

        TIM2_DIER |=0X1;//允許tim2更新中斷

        SETENA0|=0x10000000;//允許T2中斷

        TIM2_CR1 |=0X1;//啟動tim2相當于//TIM_Cmd(TIM2, ENABLE); //是能定時器

        }

        注:RCC_APB1ENR,SETENA0前面的文章已經定義過

        中斷函數處理:

        void TIM2_IRQHandler(void)

        {

        if(TIM1_SR&0x01)

        {

        TIM1_SR&=0xFFFE;//清中斷標志

        USART1_DR=0xAA;

        while((USART1_SR)&0x80==0);

        }

        解釋:1S中斷來一次,向串口發送一字節數據0xAA;

        接下來就在main()函數中添加配置定時器就可以了:

        int main()

        {

        SystemInit0();//系統(時鐘)初始化

        stm32_GpioSetup (); //GPIO初始化

        stm32_UsartSetup ();//串口初始化

        TIM2_Configuration();//TIM1初始化

        while(1)

        {

        GPIO_PORTB_ODR|=(1<<5); //LED閃爍

        delay(10); //延時

        GPIO_PORTB_ODR&=~(1<<5);

        delay(10);

        }

        }

        當然以上TIM2的配置必須在系統(時鐘)初始化以后,因為這些外設的工作要有時鐘來源的,知道了時鐘來源,和頻率才能計算出定時的時間等參數,本程序是基于所有時鐘都設置成20M來執行的。前面的幾個初始化函數以及寄存器設置都是調用的前面文章中設置好的。

        好了,查看串口(9600),調試成功,1S發送1個0xAA,這樣看起來是很簡單,但調試的過程是艱難的,要一次次的實驗,一個寄存器一個寄存器的進行配置,學習本來就是一個緩慢而且艱辛的過程,但是當你看到LED在閃爍,串口上收到數據時,說有的付出都是值得的,天道酬勤,一切困難都是紙老虎!




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宜兰市| 邵东县| 图木舒克市| 墨江| 察哈| 淳化县| 通河县| 东莞市| 依安县| 冷水江市| 和静县| 深水埗区| 盐城市| 沈阳市| 如皋市| 泰州市| 靖宇县| 阿克| 阜康市| 施秉县| 乐业县| 阳新县| 安徽省| 会宁县| 民乐县| 寿宁县| 新宾| 临沭县| 报价| 民权县| 娱乐| 东山县| 墨玉县| 望江县| 惠水县| 集贤县| 大丰市| 巨野县| 泰和县| 自治县| 昆明市|