新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32單片機學習手記

        STM32單片機學習手記

        作者: 時間:2012-10-26 來源:網絡 收藏

          STM學習筆記——用實現熒火蟲燈

          在第6篇筆記中,我用軟件延時的方法實現了熒火蟲,學了,當然就要用一用了,這里仍是用熒火蟲燈為例。

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

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

          void RCC_Configuration(void)

          中的:

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

          改為

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

          (2) 將四個通道全部設置為TIM_OCMode_Toggle模式,即將

          /* Output Compare Timing Mode configuration: Channel1 *

          TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;

          改為:

          TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;

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

          __IO uint16_t CCR4_Val = 8192;改為

          __IO uint16_t CCR4_Val = 2048;

          這樣,這個通道的中斷頻率變為

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

          (4) 到stm32f10x_it.c中作修改中斷處理函數如下:

          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的時間是滅著的,于是就產生了漸亮效果。請原諒我在學習時的代碼寫得很粗糙了。

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

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

          再除以16那就是:9.1Hz,閃爍現像應該很明顯了。

        萬用表相關文章:萬用表怎么用


        pwm相關文章:pwm是什么


        51單片機相關文章:51單片機教程


        單片機相關文章:單片機教程


        單片機相關文章:單片機視頻教程


        單片機相關文章:單片機工作原理


        負離子發生器相關文章:負離子發生器原理
        塵埃粒子計數器相關文章:塵埃粒子計數器原理

        上一頁 1 2 3 下一頁

        關鍵詞: STM32 串口 PWM 定時器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 如东县| 天峻县| 南通市| 宁远县| 西平县| 喀喇| 岐山县| 靖江市| 德昌县| 文登市| 浠水县| 酒泉市| 萨嘎县| 西乡县| 桃园县| 彭阳县| 柯坪县| 澄江县| 疏勒县| 台南县| 庆城县| 吉隆县| 那曲县| 邻水| 永兴县| 土默特左旗| 河池市| 昆山市| 高阳县| 邛崃市| 蛟河市| 雷波县| 依安县| 广汉市| 新闻| 平乐县| 固原市| 汾西县| 福安市| 涪陵区| 隆昌县|