新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 定時器的4通道計數器應用

        STM32 定時器的4通道計數器應用

        作者: 時間:2016-11-10 來源:網絡 收藏
        通用定時器確實比較強悍,功能極多我也比較暈

        此為在不牽扯PWM與DMA下像C51那樣計數點燈。

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

        當然你要配置一些IO口作為點燈用這里就不詳細說了。

        就如

        #defineLED2_ONGPIO_ResetBits(GPIOD,GPIO_Pin_7)
        #define LED2_OFFGPIO_SetBits(GPIOD,GPIO_Pin_7)

        這樣的。

        然后啟用通用定時器2設置它的中斷等3.0的庫;

        //Timer2中斷*//

        void NVIC_Configuration(void)
        {
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//TIM2全局中斷3.0的
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
        NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        }

        //TIM2 clock enable

        TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;

        TIM_OCInitTypeDefTIM_OCInitStructure;

        TIM_TimeBaseStructure.TIM_Period =8000;//計數值
        TIM_TimeBaseStructure.TIM_Prescaler =7200-1;//預分頻,此值+1為分頻的除數
        TIM_TimeBaseStructure.TIM_ClockDivision =0x0; //設置時鐘分割
        TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上計數


        **********************************************************************************************
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

        TIM_ClockDivision,設置時鐘分割

        它就是RCC控制寄存器1(TIMx_CR1)的位9:8(CKD),具體含義如下:

        CKD[1:0]:時鐘分頻因子
        定義在定時器時鐘(CK_INT)頻率與數字濾波器(ETR,TIx)使用的采樣頻率之間的分頻比例。
        0x00:tDTS = 1 xtCK_INT
        0x01:tDTS = 2 xtCK_INT
        0x10:tDTS = 4 xtCK_INT

        TIM_TimeBaseStructure中應該還有一個更新報告uint8_t TIM_RepetitionCounter;不管他也行。

        72M/7200=10K分頻后的結果就是,定時器速度為10K.計數器為向上計數,8000溢出,所以溢出時間就是
        8000/10K=0.8秒.而捕獲的比較值則為:
        u16 CCR1_Val = 4000;
        u16 CCR2_Val = 2000;
        u16 CCR3_Val = 1000;
        u16 CCR4_Val = 500;
        也就是說,在定時器開始計數后,第一通道的中斷發生在4000/10k=0.4秒,第二通道是0.2,第三
        通道是0.1,第四是0.05*/

        ************************************************************************************************


        //比較設置*/

        TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Inactive;//輸出比較非主動模式

        TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;//極性為正

        //比較通道1*/
        TIM_OCInitStructure.TIM_Pulse =CCR1_Val;//就是4000裝入捕獲比較寄存器的脈沖值

        TIM_OC1Init(TIM2,&TIM_OCInitStructure);//寫入配置
        TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Disable);//禁止OC1重裝載,其實可以省掉這句,因為默是

        //4路都不重裝的.

        ********************************************************************************************

        typedef struct
        {
        uint16_t TIM_OCMode;//選擇定時器模式比較多有的功能也比較相似
        uint16_t TIM_OutputState;//使能通道 為了和2.0兼容吧我不管他
        uint16_tTIM_OutputNState;//失能??
        uint16_tTIM_Pulse;//待裝入捕獲比較寄存器的脈沖值
        uint16_t TIM_OCPolarity;//輸出極性
        uint16_t TIM_OCNPolarity;//???
        uint16_tTIM_OCIdleState;//???
        uint16_t TIM_OCNIdleState;//???不懂得不管用默認就好
        } TIM_OCInitTypeDef;

        ********************************************************************************************

        //比較通道2 /
        TIM_OCInitStructure.TIM_Pulse =CCR2_Val;

        TIM_OC2Init(TIM2,&TIM_OCInitStructure);
        TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Disable);

        //比較通道3 /
        TIM_OCInitStructure.TIM_Pulse =CCR3_Val;

        TIM_OC3Init(TIM2,&TIM_OCInitStructure);
        TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Disable);

        //比較通道4 /
        TIM_OCInitStructure.TIM_Pulse =CCR4_Val;

        TIM_OC4Init(TIM2,&TIM_OCInitStructure);
        TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Disable);

        //使能預裝載/
        TIM_ARRPreloadConfig(TIM2,ENABLE);//這個歷程中沒有軟件修改寄存器所以沒他也行
        //預先清除所有中斷位防止一啟用就有中斷從九九那抄的/
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 |TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update);

        //4個通道和溢出都配置中斷/
        TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 |TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update, ENABLE);
        //允許TIM2開始計數/
        TIM_Cmd(TIM2, ENABLE);

        服務中斷函數比較簡單直接抄來

        void TIM2_IRQHandler(void)
        {
        if (TIM_GetITStatus(TIM2, TIM_IT_CC1) !=RESET)
        {
        //必須清空標志位/*/
        TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);

        //點亮LED5 一定要是中文的 不然中間的 內容就不見了 本想大家移植到自己的作品中方便 看來SINA不可這樣用



        關鍵詞: STM32定時器計數

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 英德市| 天津市| 紫云| 谷城县| 左云县| 宝兴县| 乐平市| 万全县| 甘泉县| 樟树市| 石泉县| 定兴县| 堆龙德庆县| 晋城| 大方县| 呼图壁县| 双鸭山市| 曲水县| 长治县| 苗栗市| 斗六市| 积石山| 西昌市| 合山市| 黎川县| 新丰县| 汨罗市| 新余市| 景谷| 邢台县| 酒泉市| 新民市| 尼勒克县| 周至县| 巢湖市| 清远市| 当雄县| 调兵山市| 扶绥县| 砚山县| 蒲城县|