使用STM8S003定時器的PWM功能輸出PWM波

2021-09-12 16:02:50 字數 2911 閱讀 1530

一、使用定時器tim2的ch1、ch2、ch3通道pwm輸出

1. 在使用stm8s系列的微控制器的時候,使用的標頭檔案大部分都是通用的stm8s.,第一步修改標頭檔案:

/* #define stm8s208 */      /*!< stm8s high density devices with can */

/* #define stm8s207  */    /*!< stm8s high density devices without can */

/* #define stm8af52ax */    /*!< stm8a high density devices with can */

/* #define stm8af62ax */    /*!< stm8a high density devices without can */

/* #define stm8s105 */      /*!< stm8s medium density devices */

/* #define stm8af626x */    /*!< stm8a medium density devices */

#define stm8s103       /*!< stm8s low density devices */

/* #define stm8s903 */      /*!< stm8s low density devices */

2. 取消stm8s103的注釋,103和003的暫存器位址都是一樣的,所以我們這裡用103替代003.

3. 引腳使用pwm功能時無需配置gpio狀態,直接配置暫存器即可。例如tim2的庫函式配置如下:

tim2_timebaseinit(tim2_prescaler_1, 7999);         /*    1分頻 ,計數值8000,頻率=16m/8000=2khz   */

/* pwm1 mode configuration: channel1 */

tim2 channel1 duty cycle = [tim2_ccr1/(tim2_arr + 1)] * 100 = 50%*/ 

tim2_oc1init(tim2_ocmode_pwm1, tim2_outputstate_enable,2000, tim2_ocpolarity_high);

tim2_oc1preloadconfig(enable);

/* pwm2 mode configuration: channel2 */

tim2_oc2init(tim2_ocmode_pwm2, tim2_outputstate_enable,2000, tim2_ocpolarity_high);

tim2_oc2preloadconfig(enable);

/* pwm3 mode configuration: channel3*/

tim2_oc3init(tim2_ocmode_pwm2, tim2_outputstate_enable,2000, tim2_ocpolarity_high);

tim2_oc3preloadconfig(enable);

tim2_cmd(enable);

4.  配置完成後,除錯輸出2khz 占空比為25%的pwm波,如下圖所示:

5. 因為tim2的這3個pwm通道都沒有用到alternative功能,不需要配置options bytes。

二、使用定時器tim1的ch1、ch2、ch3通道的pwm功能

1. tim1的ch1、ch2為需要配置的引腳復用功能,在除錯程式之前,需要配置option bytes。afr0設定為alternate active.

2. tim1三通道輸出pwm暫存器例項:

clk->ckdivr= 0x00; //內部16m時鐘不分頻

tim2->pscr = 0x00; //定時器2預分頻係數為1

tim2->cr1 = 0x01; //內部計數器使能;

tim2->arrh = 0x00;//0140,320分頻,16m/320=50k,實測49.75k

tim2->arrl = 0x8a;//自動裝載暫存器低位;實測013e正好為50.0k

/*pwm通道1設定*/

tim2->ccer1 |= 0x01; //開啟oc1訊號輸出腳

tim2->ccmr1 = 0x60; //pwm1模式

tim2->ccr1h = 0x00; //占空比高位

tim2->ccr1l = 0x37; //占空比低位

tim2->ccmr1 |= 0x08; //輸出比較1預裝載使能

/*pwm通道2設定*/

tim2->ccer1 |= 0x10; //開啟oc2訊號輸出腳

tim2->ccmr2 = 0x60; //pwm1模式

tim2->ccr2h = 0x00; //占空比高位

tim2->ccr2l = 0x37; //占空比低位

tim2->ccmr2 |= 0x08; //輸出比較2預裝載使能

/*pwm通道3設定*/

tim2->ccer2 |= 0x01; //開啟oc3訊號輸出腳

tim2->ccmr3 = 0x60; //pwm1模式

tim2->ccr3h = 0x00; //占空比高位

tim2->ccr3l = 0x37; //占空比低位

tim2->ccmr3 |= 0x08; //輸出比較3預裝載使能

tim2->cr1 |= 0x01;

stm8s003使用心得 時鐘(CLK)

本文介紹stm8s003mcu的時鐘 clk 前幾天直接使用官方的庫開發的程式,直接利用了庫函式進行的時鐘及timer的配置,其中有一些不太明白的地方,今天又仔細看了datasheet,有了更多的了解。由於產品要控制成本,我選擇使用的是mcu的內部時鐘hsi 16mhz rc。通過下圖1,可以更直觀...

STM8S003 上公升沿進不去外部中斷問題

硬體配置中為雙邊沿觸發 問題 下降沿觸發部分程式可以執行,上公升沿進不去。測試結果 上公升沿可以進入中斷,但是判斷語句不滿足條件。if gpio readinputpin led1 port,led1 pin 1 下降沿觸發中斷 條件函式為 bitstatus gpio readinputpin g...

STM32的定時器的使用

一,基本定時器的使用 定時1s的時間led翻轉一次 需要設定的關鍵的引數 1,分頻係數 如果主頻是72m,那麼一般設定72 那麼沒1 71m 時間就累加一次 2,自動重裝載暫存器的值 這裡設定1000 那麼更新中斷的頻率就是 1000hz,中斷週期就是1ms 二,高階定時器的輸入捕捉 高階定時器 捕...