色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32單片機(jī)學(xué)習(xí)手記

          STM32單片機(jī)學(xué)習(xí)手記

          作者: 時間:2012-10-26 來源:網(wǎng)絡(luò) 收藏

            STM學(xué)習(xí)筆記——用實現(xiàn)熒火蟲燈

            在第6篇筆記中,我用軟件延時的方法實現(xiàn)了熒火蟲,學(xué)了,當(dāng)然就要用一用了,這里仍是用熒火蟲燈為例。

            用ST庫所帶的例子Tim中的TimBase為例來修改,這個例子的位置以及如何建立工程請參考第7篇筆記,這里就不再重復(fù)了,下面簡述一下修改的過程。

            (1) 由于我的板子上的燈是由PD8~PD11來控制的,因此,要將

            void RCC_Configuration(void)

            中的:

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //打開GPIOC的時鐘

            改為

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //打開GPIOD的時鐘

           ?。?) 將四個通道全部設(shè)置為TIM_OCMode_Toggle模式,即將

            /* Output Compare Timing Mode configuration: Channel1 *

            TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;

            改為:

            TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;

           ?。?)例子中原來中斷產(chǎn)生的頻率很低,是不適合于做這種熒火蟲燈的,但為了比較,我只改了最后一個值:

            __IO uint16_t CCR4_Val = 8192;改為

            __IO uint16_t CCR4_Val = 2048;

            這樣,這個通道的中斷頻率變?yōu)?/P>

            CC4 update rate = TIM2 counter clock / CCR4_Val = 3515.6 Hz

           ?。?) 到stm32f10x_it.c中作修改中斷處理函數(shù)如下:

            uint8_t allCount=16;

            uint8_t upDown1,upDown2,upDown3,upDown4;

            void TIM2_IRQHandler(void)

            { static uint8_t Count1,Count2,Count3,Count4;

            static uint8_t hCnt1,hCnt2,hCnt3,hCnt4;

            if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)

            {

            TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

            if(Count1《hCnt1)

            { GPIO_SetBits(GPIOD, GPIO_Pin_8); //點亮燈

            }

            else

            { GPIO_ResetBits(GPIOD, GPIO_Pin_8); //熄滅燈

            }

            Count1++;

            if(Count1》=allCount)

            { Count1=0;

            if(upDown1)

            { hCnt1++;

            if(hCnt1》=(allCount-1))

            upDown1=!upDown1;

            }

            else

            { hCnt1--;

            if(hCnt1《2)

            upDown1=!upDown1;

            }

            }

           capture = TIM_GetCapture1(TIM2);

            TIM_SetCompare1(TIM2, capture + CCR1_Val);

            }

            else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)

            {

            TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);

            if(Count2《hCnt2)

            { GPIO_SetBits(GPIOD, GPIO_Pin_9); //點亮燈

            }

            else

            { GPIO_ResetBits(GPIOD, GPIO_Pin_9); //熄滅燈

            }

            Count2++;

            if(Count2》=allCount)

            { Count2=0;

            if(upDown2)

            { hCnt2++;

            if(hCnt2》=(allCount-1))

            upDown2=!upDown2;

            }

            else

            { hCnt2--;

            if(hCnt2《2)

            upDown1=!upDown1;

            }

            }

            capture = TIM_GetCapture2(TIM2);

            TIM_SetCompare2(TIM2, capture + CCR2_Val);

            }

            else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)

            {

            TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);

            if(Count3《hCnt3)

            { GPIO_SetBits(GPIOD, GPIO_Pin_10); //點亮燈

            }

            else

            { GPIO_ResetBits(GPIOD, GPIO_Pin_10); //熄滅燈

            }

            Count3++;

            if(Count3》=allCount)

            { Count3=0;

            if(upDown3)

            { hCnt3++;

            if(hCnt3》=(allCount-1))

            upDown3=!upDown3;

            }

            else

            { hCnt3--;

            if(hCnt3《2)

            upDown3=!upDown3;

            }

            }

            capture = TIM_GetCapture3(TIM2);

            TIM_SetCompare3(TIM2, capture + CCR3_Val);

            }

            else

            {

            TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);

            if(Count4《hCnt4)

            { GPIO_SetBits(GPIOD, GPIO_Pin_11); //點亮燈

            }

            else

            { GPIO_ResetBits(GPIOD, GPIO_Pin_11); //熄滅燈

            }

            Count4++;

            if(Count4》=allCount)

            { Count4=0;

            if(upDown4)

            { hCnt4++;

            if(hCnt4》=(allCount-1))

            upDown4=!upDown4;

            }

            else

            { hCnt4--;

            if(hCnt4《2)

            upDown4=!upDown4;

            }

            }

            capture = TIM_GetCapture4(TIM2);

            TIM_SetCompare4(TIM2, capture + CCR4_Val);

            }

            }

            即將LED點亮的過程分成16(allCount)份,第一次是點亮1/16時間,而15/16的時間都是滅著的,這個1是變量hCnt來控制的,隨著中斷16次完畢,hCnt會加1,于是第二個周期來了,在這個周期中,LED會被點亮2/16,而14/16的時間是滅著的,依次類推,到最后會有 15/16的時間被點亮,而1/16的時間是滅著的,于是就產(chǎn)生了漸亮效果。請原諒我在學(xué)習(xí)時的代碼寫得很粗糙了。

            由于TIM2_CH1通道的中斷頻率是:

            CC1 update rate = TIM2 counter clock / CCR1_Val = 146.48 Hz

            再除以16那就是:9.1Hz,閃爍現(xiàn)像應(yīng)該很明顯了。

          萬用表相關(guān)文章:萬用表怎么用


          pwm相關(guān)文章:pwm是什么


          51單片機(jī)相關(guān)文章:51單片機(jī)教程


          單片機(jī)相關(guān)文章:單片機(jī)教程


          單片機(jī)相關(guān)文章:單片機(jī)視頻教程


          單片機(jī)相關(guān)文章:單片機(jī)工作原理


          負(fù)離子發(fā)生器相關(guān)文章:負(fù)離子發(fā)生器原理
          塵埃粒子計數(shù)器相關(guān)文章:塵埃粒子計數(shù)器原理

          上一頁 1 2 3 下一頁

          關(guān)鍵詞: STM32 串口 PWM 定時器

          評論


          相關(guān)推薦

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

          關(guān)閉