新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32單片機簡易定時器PWM輸出

        STM32單片機簡易定時器PWM輸出

        作者: 時間:2016-11-30 來源:網絡 收藏

        void led_init(void);

        #endif

        //------------------------主函數-----------test.c-----------
        #include
        #include "sys.h"
        #include "delay.h"
        #include "usart.h"
        #include "led.h"
        #include "key.h"
        #include "time.h"

        char pwm; //pwm增減量
        char cnt; //pwm時間變量

        //-----------------------pwm增量按鍵----------------
        void key1_scan()
        {
        static u8 i,j;
        if(key1==0)
        {
        if(i==0)
        {
        j++;
        if(j>3)
        {
        i=1;j=0;
        pwm+=5;
        if(pwm>100)pwm=0;
        }
        }
        }
        else
        {
        i=j=0;
        }
        }

        //--------------------pwm減量按鍵--------------------
        void key2_scan()
        {
        static u8 i,j;
        if(key2==0)
        {
        if(i==0)
        {
        j++;
        if(j>3)
        {
        i=1;j=0;
        pwm-=5;
        if(pwm<10)pwm=0;
        }
        }
        }
        else
        {
        i=j=0;
        }
        }

        void TIM3_IRQHandler(void) //定時器2中斷函數
        {
        if(TIM3->SR&0x0001)
        {
        cnt++;
        if(cnt>100)cnt=0;
        if(cnt>pwm) //LED0作為pwm 輸出指示
        {
        LED0=0;
        }
        else
        {
        LED0=1;
        }
        }
        TIM3->SR&=~(1<<0); //清除中斷標志位
        }


        int main(void)
        {
        u16 i,t;
        Stm32_Clock_Init(9);
        delay_init(72);
        uart_init(72,9600);
        led_init();
        key_init();
        time_init(3600,1); //產生10K頻率 pwm只是~~100HZ 由于100分頻
        while(1)
        {
        key1_scan();
        key2_scan();
        t++;
        if(t>60000)
        {
        i++;
        if(i>11)
        {
        LED1=!LED1; //系統運行指示約1秒閃爍一次
        i=0;
        }
        t=0;
        }

        }
        }

        //--------------------------------關于定時器溢出時間計算--------------------------
        1)TIM3時鐘使能。
        這里我們通過APB1ENR的第1位來設置TIM3的時鐘,因為Stm32_Clock_Init函數里面把APB1的分頻設置為2了,所以我們的TIM3時鐘就是APB1時鐘的2被,等于系統時鐘。(72M)

        Tout= (arr*(psc+1))/Tclk;
        其中:
        Tclk:TIM3的輸入時鐘頻率(單位為Khz)。
        Tout:TIM3溢出時間(單位為ms)。

        Tout=(3600*(1+1))/72M=0.1ms

        //------------------------------系統時鐘初始化函數對于定時器TIM3時鐘簡易分析-----------------
        void Stm32_Clock_Init(u8 PLL)
        {
        unsigned char temp=0;
        MYRCC_DeInit(); //復位并配置向量表
        RCC->CR|=0x00010000; //外部高速時鐘使能HSEON
        while(!(RCC->CR>>17));//等待外部時鐘就緒
        RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
        PLL-=2;//抵消2個單位
        RCC->CFGR|=PLL<<18; //設置PLL值 2~16
        RCC->CFGR|=1<<16; //PLLSRC ON
        FLASH->ACR|=0x32; //FLASH 2個延時周期

        RCC->CR|=0x01000000; //PLLON
        while(!(RCC->CR>>25));//等待PLL鎖定
        RCC->CFGR|=0x00000002;//PLL作為系統時鐘
        while(temp!=0x02) //等待PLL作為系統時鐘設置成功
        {
        temp=RCC->CFGR>>2;
        temp&=0x03;
        }
        }


        上一頁 1 2 下一頁

        關鍵詞: STM32單片機定時器PWM輸

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 礼泉县| 萍乡市| 房山区| 璧山县| 乐山市| 玉田县| 绥滨县| 绥江县| 二连浩特市| 鄂州市| 皮山县| 南江县| 项城市| 周口市| 娄烦县| 闻喜县| 桃园市| 忻城县| 阿拉善盟| 湾仔区| 晋宁县| 枣庄市| 金秀| 神农架林区| 磐安县| 仁怀市| 阜南县| 雷波县| 应用必备| 蒲江县| 玉田县| 锡林郭勒盟| 淳化县| 高雄县| 沈阳市| 肥东县| 江源县| 赤城县| 霍林郭勒市| 宁武县| 万全县|