當中有一個範例名為:Example_PWM_LED
是利用PWM控制位在PB6接腳的LED的亮度的實驗
並且利用PA0與PA1兩隻腳的輸入來控制PWM的程度
這裡我們修改成自動變化,也就是呼吸燈的形式
首先我們先在eclipse中開立一個新專案
在File->New->Project選擇C Project
在Executable選擇STM32F10x C/C++ Project並且設定專案名稱
在下一頁的「目標處理器設定」中將Content選擇Empty
並且確定Use system calls:是否為POSIX
確定Trace output:是否為ARM ITM(via SWO)
接著後面的選項都是預設值
隨後進入eclipse主頁面
檢查一下新開立的專案中資料夾是否到齊:
src,system,include,ldscripts
其中system中應包含cmsis,cortexm,diag,newlib,stm32f1-stdperiph
這一個空的專案檔已經將相關的原始碼備妥,所以我們只要填入新的程式碼就可以
先把專案中自動產生的main.c刪除
然後來到example這邊,在example->Example_PWM_LED裡面我們只需要複製main.c這個檔案過來專案就可以,複製的方法就是在main.c這個檔案所在的目錄裡面用滑鼠將檔案複製起來,然後到eclipse的專案瀏覽器視窗中,在剛剛開好的專案上點選滑鼠右鍵,將檔案接上即可。
接著打開main.c檔
這個範例程式的流程如下
設定GPIO,將A0,A1設為輸入,將B6設為輸出
接著設定Timer4主體以及Time4的輸出
接著初始化Timer4的OC1
然後啟動Timer4
隨即進入程式的主迴圈
先讀取A0,若按下則增加Timer CCR的數值
讀取A1,若按下則減少Timer CCR的數值
接下來我們進行修改
因為範例程式是將LED安排在PB6的端子輸出
但是我們的板子是把LED連接在PB8
根據 http://www.st.com/resource/en/datasheet/stm32f103c8.pdf 第33頁指出
說明了Timer4一共有四個輸出端子分別是PB6,PB7,PB8,PB9
目前範例是使用PB6,而我們要改成的PB8剛好是Timer4的第三組輸出
所以我們先回到範例程式前半段
其中有一道指令是用來設定Timer要用哪一組輸出端子
TIM_OCStructInit(&timerPWM);
timerPWM.TIM_Pulse = 10;
timerPWM.TIM_OCMode = TIM_OCMode_PWM1;
timerPWM.TIM_OutputState = TIM_OutputState_Enable;
timerPWM.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM4, &timerPWM);
這一段程式首先將結構變數timerPWM設定了相關參數,然後它送給TIM_OC1Init()做設定
這裡只需要把
TIM_OC1Init
改成
TIM_OC3Init
即可
接著看到主迴圈中負責設定CCR的程式
TIM4->CCR1 = TIM_Pulse;
將它改成
TIM4->CCR3 = TIM_Pulse;
即可最後要將PWM LED的動作改成自動變化
因此我們需要一個變數來記錄「明」與「滅」的狀態
以便讓變數自動增加或減少
因此我們加入這樣的程式
if(countDir == 0){
if (TIM_Pulse < PERIOD)
TIM_Pulse++;
else
countDir = 1;
TIM4->CCR3 = TIM_Pulse;
}else{
if (TIM_Pulse > 0)
TIM_Pulse--;
else
countDir = 0;
TIM4->CCR3 = TIM_Pulse;
}
如此一來,迴圈每次回頭就會把CCR3的數值更新,於是就可以看到LED燈明滅之間漸層變化。