【STM8L】STM8L之timer2产生PWM
来源:互联网 发布:mac网络图 编辑:程序博客网 时间:2024/05/21 17:16
本篇博文最后修改时间: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
四、实验步骤
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口置低,否则红外射线会一直发出会导致功耗高。
2)写一个驱动头文件GUA_Timer2_PWM.h(存放在工程的USER文件夹中)
//****************************************************************************** //name: GUA_Timer2_PWM.h //introduce: 定时器2的PWM驱动的头文件 //author: 甜甜的大香瓜 //email: 897503845@qq.com //QQ group 香瓜单片机之STM8/STM32(164311667) //changetime: 2016.12.01 //****************************************************************************** #ifndef _GUA_TIMER2_PWM_H_#define _GUA_TIMER2_PWM_H_ /*********************宏定义************************/ //PWM的开关宏#define GUA_TIMER2_PWM_STATUS_ON 0 //PWM打开#define GUA_TIMER2_PWM_STATUS_OFF 1 //PWM关闭//PWM的频率值#define GUA_TIMER2_PWM_FREQUENCY_VALUE 16*26 //26us为一个周期/*********************外部函数声明************************/ void GUA_Timer2_PWM_Status(unsigned char nGUA_Timer2_PWM_Status);void GUA_Timer2_PWM_SetDutyCycle(unsigned char nGUA_Timer2_PWM_DutyCycle);void GUA_Timer2_PWM_Init(void);#endif
3)工程中添加GUA_Timer2_PWM.c
4)添加驱动的路径
$PROJ_DIR$\..\USER注意USER文件夹是与“Project”等文件夹同级的自定义文件,用于存放香瓜写的代码。
2、添加库的驱动
1)添加库的驱动文件
3、应用层中调用
1)添加头文件(main.c中)
#include "GUA_Timer2_PWM.h"
2)初始化(main.c的main函数中)
//定时器2的PWM初始化 GUA_Timer2_PWM_Init();
3)测试代码(可以自行放置在不同按键处理代码中)
①开启50%占空比的PWM
GUA_Timer2_PWM_SetDutyCycle(50); GUA_Timer2_PWM_Status(GUA_TIMER2_PWM_STATUS_ON);
②关闭PWM
GUA_Timer2_PWM_Status(GUA_TIMER2_PWM_STATUS_OFF);
③开启60%占空比的PWM
GUA_Timer2_PWM_SetDutyCycle(60); GUA_Timer2_PWM_Status(GUA_TIMER2_PWM_STATUS_ON);
4、复用IO口为timer2
stm8的复用功能比较特殊,需要手动修改,香瓜在此入坑了两天。
1)点开工程的ST-LINK下的Option Bytes(网上有些资料显示必须在仿真模式下,香瓜实测不一定要在仿真模式下)
2)配置并保存
3)形成.obc的配置文件
4)使工程能够自动加载保存的配置文件
5)rebuild all。
五、实验结果
用逻辑分析仪连接PB0,分别抓取三个测试代码的波形,实验结果如下:
1、开启50%占空比的PWM
可见PB0产生了38.647K的方波,占空比为13/25.875(约为50.2%)。
2、关闭PWM
无产生波形
3、开启60%占空比的PWM
可见PB0产生了38.647K的方波,占空比为15.5/25.875(约为59.9%)。
因此,实验成功。
注:香瓜实测仿真多次,不用重复配置复用功能的步骤。网上大多数是使用STVD产生复用配置,再用其他方式进行下载程序。在量产时本文的步骤能否依然有效,仍有待后续实测。
- 【STM8L】STM8L之timer2产生PWM
- 【STM8L】STM8L之timer2定时中断
- 【STM8L】STM8L之红外发射(PWM产生38K信号)
- STM8L
- 【STM8L】STM8L之按键中断
- 【STM8L】STM8L之按键中断
- 【STM8L】STM8L之红外发射(定时器中断产生38K信号)
- 【STM8L】STM8L之红外发射(定时器中断产生38K信号)
- 【STM8L】STM8L之自定义长短按键
- 【STM8L】STM8L之内部16M晶振
- 【STM8L】STM8L之低功耗模式
- 【STM8L】STM8L之定时器3的精确延时
- STM8L参考手册
- STM8L学习
- STM8L-Discovery开发板
- stm8l进步每一天
- STM8L外部中断
- STM8L系列产品分类
- Java中实例是什么意思?补充:new 一个对象是实例吗? 能举个小例子吗?
- 【REACT NATIVE 系列教程之三】函数绑定与FLEXBOX是用好REACT的基础
- 个人认为Android开发学习方向
- Android的Notification通知的简单实用
- 456. 132 Pattern
- 【STM8L】STM8L之timer2产生PWM
- QtCharts编译(编译环境MSVC12)和VS2013配置QtCharts
- 使用Visual Studio 2015开发Qt程序
- poj 2566 Bound Found
- C程序内存分布(译)
- 安装QT 5.6 与 VS 2015
- VC++ Runtime Error 异常捕获之不挂的程序
- VC++一些开发心得与调试技巧
- VS 2005使用map文件查找程序崩溃原因