历史上的今天
今天是:2025年01月30日(星期四)
2020年01月30日 | STM32之timer3产生PWM
2020-01-30 来源:eefocus
一、简介
本文介绍STM32系列如何使用timer3的第3通道(PB0)产生38K频率的PWM。
二、实验平台
库版本:STM32F10x_StdPeriph_Lib_V3.5.0
编译软件:MDK4.53
硬件平台:STM32开发板(主芯片stm32f103c8t6)
仿真器:JLINK
三、版权声明
四、实验前提
1、在进行本文步骤前,请先阅读以下博文:
暂无
2、在进行本文步骤前,请先实现以下博文:
暂无
五、基础知识
暂无
六、实验步骤
1、编写并添加PWM驱动
1)编写驱动GUA_Timer3_PWM.c(存放在“……HARDWARE”)
//******************************************************************************
//name: GUA_Timer3_PWM.c
//introduce: 定时器3的PWM驱动
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2017.01.14
//******************************************************************************
#include "stm32f10x.h"
#include "GUA_Timer3_PWM.h"
/*********************宏定义************************/
//引脚宏
#define GUA_TIMER3_PWM_PORT GPIOB
#define GUA_TIMER3_PWM_PIN GPIO_Pin_0
#define GUA_TIMER3_PWM_MODE GPIO_Mode_AF_PP
#define GUA_TIMER3_PWM_GPIO_CLOCK RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO
#define GUA_TIMER3_PWM_PERIPH_CLOCK RCC_APB1Periph_TIM3
//计数值
#define GUA_TIMER3_PWM_PERIOD (72 - 1)
/*********************内部函数声明************************/
static void GUA_Timer3_PWM_IO_Init(void);
static void GUA_Timer3_PWM_Config_Init(GUA_U16 nGUA_Timer3_PWM_Prescaler);
//******************************************************************************
//name: GUA_Timer3_PWM_IO_Init
//introduce: 定时器3的PWM的IO初始化
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2017.01.14
//******************************************************************************
static void GUA_Timer3_PWM_IO_Init(void)
{
//IO结构体
GPIO_InitTypeDef GPIO_InitStructure;
//时钟配置
RCC_APB2PeriphClockCmd(GUA_TIMER3_PWM_GPIO_CLOCK, ENABLE);
//IO初始化
GPIO_InitStructure.GPIO_Pin = GUA_TIMER3_PWM_PIN;
GPIO_InitStructure.GPIO_Mode = GUA_TIMER3_PWM_MODE;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GUA_TIMER3_PWM_PORT, &GPIO_InitStructure);
}
//******************************************************************************
//name: GUA_Timer3_PWM_Config_Init
//introduce: 定时器3的PWM的配置初始化
//parameter: nGUA_Timer3_PWM_Prescaler:预分频数值,如100则表示1000000/100=10000Hz
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2017.01.14
//******************************************************************************
static void GUA_Timer3_PWM_Config_Init(GUA_U16 nGUA_Timer3_PWM_Prescaler)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//时钟配置
RCC_APB1PeriphClockCmd(GUA_TIMER3_PWM_PERIPH_CLOCK, ENABLE);
//定时器配置
TIM_TimeBaseStructure.TIM_Period = GUA_TIMER3_PWM_PERIOD; //设置计数值
TIM_TimeBaseStructure.TIM_Prescaler = nGUA_Timer3_PWM_Prescaler - 1; //设置预分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数溢出模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//PWM配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1(小于计数值时为有效电平)
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //有效电平为低电平
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //使能通道3
//默认关闭PWM
GUA_Timer3_PWM_Status(GUA_TIMER3_PWM_STATUS_OFF);
//使能
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //CH3预装载使能
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIM3重载寄存器ARR
TIM_Cmd(TIM3, ENABLE); //使能定时器3
}
//******************************************************************************
//name: GUA_Timer3_PWM_Status
//introduce: 定时器3的PWM开关
//parameter: nGUA_Timer3_PWM_Status: GUA_TIMER3_PWM_STATUS_ON or GUA_TIMER3_PWM_STATUS_OFF
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2017.01.14
//******************************************************************************
void GUA_Timer3_PWM_Status(GUA_U8 nGUA_Timer3_PWM_Status)
{
//打开PWM
if(nGUA_Timer3_PWM_Status == GUA_TIMER3_PWM_STATUS_ON)
{
TIM_SetCounter(TIM3, 0);
TIM_CCxCmd(TIM3, TIM_Channel_3, TIM_CCx_Enable);
}
//关闭PWM
else
{
TIM_CCxCmd(TIM3, TIM_Channel_3, TIM_CCx_Disable);
}
}
//******************************************************************************
//name: GUA_Timer3_PWM_SetDutyCycle
//introduce: 定时器3的PWM设置占空比
//parameter: nGUA_Timer3_PWM_DutyCycle: 0~100为0%~100%
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2017.01.14
//******************************************************************************
void GUA_Timer3_PWM_SetDutyCycle(GUA_U8 nGUA_Timer3_PWM_DutyCycle)
{
TIM_SetCompare3(TIM3, GUA_TIMER3_PWM_PERIOD*nGUA_Timer3_PWM_DutyCycle/100);
}
//******************************************************************************
//name: GUA_Timer3_PWM_Init
//introduce: 定时器3的PWM初始化
//parameter: nGUA_Timer3_PWM_Prescaler:预分频数值,如100则表示1000000/100=10000Hz
//return: none
//author: 甜甜的大香瓜
上一篇:STM32之限位开关
下一篇:STM32之SWD
史海拾趣
|
在Keil C51 uVision3 中调试w77E58如何设置才能使用片上的1K外部存贮器呀? 伟福V8仿真调试Winbond77E58不能正常使用片上1K外部存贮器的问题: 我用伟福V8/L仿真调试Winbond77E58板子, W77E58有片上1K外部存贮器,我不知是我的编译环境设置不对, 还是伟福不能仿真片上1K外部存贮器?在下面的程序中,将 int xdata i ...… 查看全部问答> |
|
想在ucosII上开发一款pdf查看程序(平台君正 Xburst MIPS jz4740),现有Foxit Embedded PDF SDK可惜不免费!!!!!!!!! 总不能从头开发吧,难度太了点吧!!可有免费的库!!!推荐一个!!… 查看全部问答> |
|
【求助】74HC165的操作,只能控制一个按键,其他的控制不了,搞不明白 #define PL P2_3//SHIFT/LOAD引脚 #define CLOCK P2_4 #define SETBSC P2_5//OUTPUT QH引脚 read74hc165m() {uchar basic,c; PL=1; nop(); PL=0;//使能端为低电平时8位数据进入寄存器 nop(); PL=1;//高电平数据锁存,同时165数据自动 ...… 查看全部问答> |
|
三 书包小帮手 它的功能简单,却有很大的用处。我们大学生常常忘记星期几上什么课,几点上,教室在哪儿,老师的名字,电话等。它就像一个学习小管家,功能简单,外形小巧,可以放进书包上的挂饰,娃娃等,它采用防水功能。 它有个显示 ...… 查看全部问答> |
|
我做了个RTC。。初始化时间然后查询出来都是正常的。。但是设置的时候代码如下: void RTC_WaitForLastTask(void) { /* Loop until RTOFF flag is set */ while ((RTC->CRL & RTC_FLAG_RTOFF) == (u16)RESET) ...… 查看全部问答> |




