【STM8L】STM8L之timer2产生PWM
本篇博文最 后修改时 间 :本篇博文最 后修改时 间 : 2016年年12月月13日 ,日, 06:20。。
一、简介一、简介
本文介绍STM8L系列如何使用timer2产生38K频率的PWM。
其中,本文使用的是timer2的第1通道(PB0)。
二、实验平 台二、实验平 台
编译软件:IAR for STM8 1.42.2
硬件平台:stm8l101f3p6开发板
仿真器:ST-LINK
库函数版本:STM8L_STMTouch_Lib_V1.1.0
三三、、 版权声明版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.NET/feilusia
联系方式:897503845@qq.com
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
香瓜BLE之Android群:541462902
香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
四、四、 实验 步 骤实验 步骤
1、工程中 添 加自己写 的、工程中添 加自己写 的 定 时 器定时器 2的的 驱 动驱动
1)写一个 驱 动)写一个 驱 动 GUA_Timer2_PWM.c (存放在工 程 的(存放在工 程的 USER文件夹 中 )文件夹中)
//******************************************************************************
//name: GUA_Timer2_PWM.c
//introduce: 定时器2的PWM驱动
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.01
//******************************************************************************
#include "stm8l10x.h"
#include "GUA_Timer2_PWM.h"
/*********************宏定义************************/
#ifndef U8
typedef unsigned char U8;
#endif
#ifndef U16
typedef unsigned short U16;
#endif
#ifndef U32
typedef unsigned long U32;
#endif
//红外引脚宏
#define GUA_TIMER2_PWM_PORT GPIOB
#define GUA_TIMER2_PWM_PIN GPIO_Pin_0
#define GUA_TIMER2_PWM_MODE GPIO_Mode_Out_PP_High_Fast
//红外开关宏
#define GUA_TIMER2_PWM_ON SET //高电平开
#define GUA_TIMER2_PWM_OFF RESET //低电平关
//******************************************************************************
//name: GUA_Timer2_PWM_Status
//introduce: 定时器2的PWM开关
//parameter: nGUA_Timer2_PWM_Status: GUA_TIMER2_PWM_STATUS_ON or GUA_TIMER2_PWM_STATUS_OFF
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.01
//******************************************************************************
void GUA_Timer2_PWM_Status(U8 nGUA_Timer2_PWM_Status)
{
//打开PWM
if(nGUA_Timer2_PWM_Status == GUA_TIMER2_PWM_STATUS_ON)
{
TIM2_CtrlPWMOutputs(ENABLE);
//GPIO_WriteBit(GUA_TIMER2_PWM_OFF, GUA_TIMER2_PWM_PIN, GUA_TIMER2_PWM_ON);
}
//关闭PWM
else
{
TIM2_CtrlPWMOutputs(DISABLE);
GPIO_WriteBit(GUA_TIMER2_PWM_PORT, GUA_TIMER2_PWM_PIN, GUA_TIMER2_PWM_OFF);
}
}
//******************************************************************************
//name: GUA_Timer2_PWM_SetDutyCycle
//introduce: 定时器2的PWM设置占空比
//parameter: nGUA_Timer2_PWM_DutyCycle: 0~100为0%~100%
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.01
//******************************************************************************
void GUA_Timer2_PWM_SetDutyCycle(U8 nGUA_Timer2_PWM_DutyCycle)
{
TIM2_SetCompare1(GUA_TIMER2_PWM_FREQUENCY_VALUE*nGUA_Timer2_PWM_DutyCycle/100);
}
//******************************************************************************
//name: GUA_Timer2_PWM_Init
//introduce: 定时器2的PWM初始化
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.01
//******************************************************************************
void GUA_Timer2_PWM_Init(void)
{
//PB0通道IO配置为输出
GPIO_Init(GUA_TIMER2_PWM_PORT, GUA_TIMER2_PWM_PIN, GUA_TIMER2_PWM_MODE);
//时钟配置
CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,ENABLE);
//配置
TIM2_DeInit(); //复位
TIM2_TimeBaseInit(TIM2_Prescaler_1, TIM2_CounterMode_Up, GUA_TIMER2_PWM_FREQUENCY_VALUE); //每26us定时重新计数一次,38K
TIM2_OC1Init(TIM2_OCMode_PWM2, TIM2_OutputState_Enable, 0, TIM2_OCPolarity_High, TIM2_OCIdleState_Reset); //先空闲后运行的模式、输出使能、占空比初始化为0、运行时为高、死区时为低
TIM2_Cmd(ENABLE); //使能定时器2
//关闭PWM
GUA_Timer2_PWM_Status(GUA_TIMER2_PWM_STATUS_OFF);
}
这里总计数值为26us,占空比暂时初始化为0%。
注意,关闭PWM时需要把IO口置低,否则红外射线会一直发出会导致功耗高。