大家好,我是单片机爱好者-MCU起航。这一节介绍如何使用库函数方式控制STM8S103F3P6片上的定时器2,也就是TIM2。上一节说了TIM2定时器自动装载,这一节看一下如何使用TIM2来输出一个我们想要的PWM。
其实PWM的功能是比较简单的,而且在讲TIM1的时候已经说过了。而TIM2的PWM功能和TIM1是很像的,所以这一节我们一切从简。毕竟在库函数方式下,很多操作都是非常方便的。
直接上例子,这次我们直接让TIM2的通道1输出一个PWM。具体需求:16MHZ的时钟下,PWM周期设置为1000微秒,占空比为800,管脚位置如图:
PD4,刚好是STM8S103F3P6的1号管脚。具体代码如下:
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "timer2_config.h"
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void Delay(uint16_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
void main(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST);
timer2_init();
while(1);
}
主函数里的代码比较简单,和之前不一样的地方在于多了一个系统时钟的频率设置。之前提过,STM8S103的单片机出厂的时候默认使用内部的RC提供时钟,频率最高16MHZ,出厂时设置为2MHZ。这个频率我们是可以通过寄存器或者库函数修改的,修改方法也很简单。
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
1分频,其实就是不分频,因为16/1还是16.
然后一个GPIO初始化,一个TIM2初始化,然后就是while(1)原地踏步。
看下TIM2初始化的代码:
#include "timer2_config.h"
#include "uart.h"
#define CCR1_Val ((uint16_t)800)
/***************************************
* TIMER1初始化
* 检测外部频率和脉冲
***************************************/
void timer2_init(void)
{
TIM2_DeInit();
TIM2_TimeBaseInit(TIM2_PRESCALER_16, 1000-1);
TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 800, TIM2_OCPOLARITY_HIGH);
/* TIM1 counter enable */
TIM2_Cmd(ENABLE);
}
函数功能也比较简单。
1、TIM2的寄存器恢复默认设置。
2、TIM2的时基初始化,系统时钟16分频,定时周期1000个周期。因为系统时钟是16MHZ,16分频后是1MHZ,一个周期是1us,1000个刚好1000微秒。
3、TIM2的PWM输出初始化,PWM1功能使能,输出状态使能,占空比800,输出比较极性为高电平。
4、TIM2启动。
最后,编译、下载、上电,使用示波器或者虚拟示波器观察PD4管脚的输出信号,功能正常!
打完收工!
要获取该程序完整的工程文件,可以关注公众号:单片机爱好者,然后回复关键词:STM8S。可以获取完整的下载链接,里面包含工程文件、视频、PPT、数据手册等所有相关资料。
我网站改版得差不多了,你的网址也加入友链了,有时间麻烦互加一下,谢谢。
已经添加了!