一、使用定时器TIM2的CH1、CH2、CH3通道PWM输出
1. 在使用stm8s系列的单片机的时候,使用的头文件大部分都是通用的stm8s.,第一步修改头文件:
/* Uncomment the line below according to the target STM8S or STM8A device used in your
application. */
/* #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;