• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 工程師STM32單片機學習手記(3):修修改改玩串口

    工程師STM32單片機學習手記(3):修修改改玩串口

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

     STM筆記——用定時器實現熒火蟲燈

    本文引用地址:http://www.czjhyjcfj.com/article/170736.htm

      在第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是什么


    負離子發生器相關文章:負離子發生器原理

    上一頁 1 2 3 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 长顺县| 纳雍县| 和林格尔县| 洪江市| 剑河县| 景谷| 安庆市| 张家港市| 江孜县| 镇巴县| 宽城| 宜宾县| 平阳县| 于田县| 嫩江县| 霍林郭勒市| 冷水江市| 阿拉善右旗| 惠水县| 曲阳县| 芜湖县| 宿州市| 永善县| 资阳市| 海阳市| 新建县| 绥中县| 苗栗县| 田阳县| 苍山县| 涡阳县| 西乡县| 泽州县| 巫山县| 枣强县| 常熟市| 怀集县| 广宗县| 杭锦后旗| 达州市| 蒙城县|