1. <th id="uou7b"></th>
        2. <tbody id="uou7b"></tbody>
          <tbody id="uou7b"></tbody>
        3. <span id="uou7b"></span>

          <tbody id="uou7b"></tbody>
          <em id="uou7b"></em>

          專注電子技術學習與研究
          當前位置:單片機教程網 >> STM32 >> 瀏覽文章

          STM32之呼吸燈

          作者:未知   來源:互聯網   點擊數:  更新時間:2014年09月14日   【字體:

          作為初學者,剛剛接觸STM32,所以文章有何不妥之處,敬請指出,一定會改。

          聽說呼吸燈是很久以前的事情了,那時候剛剛學習51單片機,沒有單片機的基礎。后來在網上看到了一個呼吸燈的電路圖,甚是復雜,根本看不懂,無奈之下放棄了呼吸燈的制作。在接觸了STM32后,發現呼吸燈還是比較容易實現的,而且不需要什么硬件知識就可以完成。于是開始嘗試做呼吸燈了。

           

          其實做呼吸燈還是有一些波折的,程序有各種版本,且由于剛剛學習STM32——看不懂程序,所以在了解了大概的思路后,便開始自己嘗試寫程序了。哈哈美圖隔開。



          下面進入今天的正題——呼吸燈。

          首先我們應該了解呼吸燈的基本原理——關鍵是用STM32輸出占空比可調的方波。

          用到了STM32的PWM輸出,我們就必須了解它。STM32是帶有PWM輸出功能的。我們以TIM3來實現PWM的輸出。

          關于TIM3大家可以查閱STM32的相關資料,在這里我不在詳解。

          由以上可知道我們必須讓STM32輸出PWM或者說輸出方波,因此我們必須知道怎么讓STM32輸出PWM。

          用STM32輸出占空比可調的PWM制作呼吸燈的步驟:(自己感覺很重要)

          ① 配置系統時鐘(RCC_Config)

          ② 配置GPIO口(TIM3_GPIO_Config)

          ③ 配置TIMER(TIM3_Mode_Config)

          ④ 寫實現呼吸燈的主體程序

          ⑤ 進行呼吸燈的調試

          現在我們來一步一步理解程序:

           ① 配置系統時鐘(RCC_Config):

               
          將TIM3和GPIO的時鐘打開。
          由以上可以看出:

                                      TIM3掛載在APB1

                                      GPIO掛載在APB2

          ② 配置GPIO口(TIM3_GPIO_Config):


          這里新手一般都會很疑惑,尤其是自學者都不知道為什么要設置Pin,Mode,Speed等等。

          還有人常常有疑問,再用某個功能之前我怎么知道都要設置哪些東西。其實大家可以看看學習STM32至關重要的資料——STM32固件庫手冊,便會有所了解。
          ③ 配置TIMER(TIM3_Mode_Config)

          void TIM3_Mode_Config(void)
          {
            TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//設置一個TIM_TimeBaseStructure結構體。
            TIM_OCInitTypeDef TIM_OCInitStructure;//設置一個TIM_OCInitStructure結構體。
            TIM_TimeBaseStructure.TIM_Period=1000-1;//個人理解就是計幾個數。(由此可以得到PWM的周期)
            TIM_TimeBaseStructure.TIM_Prescaler=0;//設置用來作為 TIMx 時鐘頻率除數的預分頻值。
            TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//設置時鐘分割。
            TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//選擇了計數器模式。
            TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//將設置好的參數初始化。
            TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//設置TIM輸出模式PWM1。
            TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//選擇輸出比較狀態(?)
            TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//TIM 輸出比較極性高。
            TIM_OCInitStructure.TIM_Pulse=CCR1_Val;//設置了待裝入捕獲比較寄存器的脈沖值。
            TIM_OC1Init(TIM3, &TIM_OCInitStructure);//將設定好的參數初始化給通道1。
            TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能TIM3在CCR1上的預裝載寄存器。
            TIM_OCInitStructure.TIM_Pulse=CCR2_Val;
            TIM_OC2Init(TIM3,&TIM_OCInitStructure);//通道2
            TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
            TIM_ARRPreloadConfig(TIM3,ENABLE);//使能TIM3在 ARR 上的預裝載寄存器。
            TIM_Cmd(TIM3,ENABLE);//使能TIM3的外設
          }

          ④ 寫實現呼吸燈的主體程序:



          其實這就是主函數,任何情況下主函數是必須有的。這個呼吸燈實現的方法和網上的大神寫的差很多,但是它實現了呼吸燈的逐漸明暗,自我感覺適合初學者學習呼吸燈以后大家把STM32學習的比較明白了后,就自然而然會寫那些更加“高大上”的呼吸燈程序了。

          為了方便自學初學的需要下面添加一些附件(芯片型號和整體程序)

          ① 芯片信號STM32F103RB,晶振用的是8M。

          ② 整體程序:

          #include "stm32f10x.h"
          u16 CCR1_Val=1000;
          u16 CCR2_Val=0;
          u8 a=0;
          void Delay(__IO u32 nCount)
          {
            while(nCount--);
          }
          void RCC_Config(void)
          {
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
          }
          void TIM3_GPIO_Config(void)
          {
            GPIO_InitTypeDef GPIO_InitStructure;//設置一個GPIO_InitStructure結構體。
            GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;//選擇引腳6和7。
            GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//選擇輸出模式為復用推挽輸出。
            GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//設置引腳最高輸出速率為50MHz。
            GPIO_Init(GPIOA,&GPIO_InitStructure);//將設定好的參數初始化。
          }
          void TIM3_Mode_Config(void)
          {
            TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//設置一個TIM_TimeBaseStructure結構體。
            TIM_OCInitTypeDef TIM_OCInitStructure;//設置一個TIM_OCInitStructure結構體。
            TIM_TimeBaseStructure.TIM_Period=1000-1;//個人理解就是計幾個數。(由此可以得到PWM的周期)
            TIM_TimeBaseStructure.TIM_Prescaler=0;//設置用來作為 TIMx 時鐘頻率除數的預分頻值。
            TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//設置時鐘分割。
            TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//選擇了計數器模式。
            TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//將設置好的參數初始化。
            TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//設置TIM輸出模式PWM1。
            TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//選擇輸出比較狀態(?)
            TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//TIM 輸出比較極性高。
            TIM_OCInitStructure.TIM_Pulse=CCR1_Val;//設置了待裝入捕獲比較寄存器的脈沖值。
            TIM_OC1Init(TIM3, &TIM_OCInitStructure);//將設定好的參數初始化給通道1。
            TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能TIM3在CCR1上的預裝載寄存器。
            TIM_OCInitStructure.TIM_Pulse=CCR2_Val;
            TIM_OC2Init(TIM3,&TIM_OCInitStructure);//通道2
            TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
            TIM_ARRPreloadConfig(TIM3,ENABLE);//使能TIM3在 ARR 上的預裝載寄存器。
            TIM_Cmd(TIM3,ENABLE);//使能TIM3的外設
          }
          int main(void)
          {
              RCC_Config();
           TIM3_GPIO_Config();
           TIM3_Mode_Config();
           while(1)

           {
               if(CCR1_Val>0&&a<40&&CCR2_Val<1000)
               {
                 CCR1_Val-=25;
                 CCR2_Val+=25;
                 TIM3_Mode_Config();
                 a++;
                 Delay(0XF424); 
               }
              else
              {
                 CCR1_Val+=25;
                 CCR2_Val-=25;
                 TIM3_Mode_Config();
                 Delay(0XF424);
                 a++;
              if(a==80)a=0;
               }
           }
          }

           

          關閉窗口

          相關文章

          日日噜噜夜夜狠狠久久无码区

              1. <th id="uou7b"></th>
              2. <tbody id="uou7b"></tbody>
                <tbody id="uou7b"></tbody>
              3. <span id="uou7b"></span>

                <tbody id="uou7b"></tbody>
                <em id="uou7b"></em>