STM32学习日记3---定时器TIM3重映射PWM波呼吸灯实验

文章目录


关于PWM波的输出,我们需要用到定时器的4个通道(通用定时器和高级定时器有,基本定时器没有这4个通道)里面的PWM生成。然后查看数据手册,了解定时器的重映射引脚情况。所以配置时,需要:开GPIO时钟,引脚复用时钟,定时器时钟;定时器部分重映射;GPIO引脚初始化配置,定时器初始化配置,定时器的PWM模式配置;使能定时器CCRx重装载;最后使能时钟。

在main函数里面,TIM_SetCompare2(TIM3,PWM_Val);//通过设置比较值来调占空比。这个后面一定是需要一点延时的,不然呼吸灯不会亮!

留有一个疑问:我看的书上用定时器输出PWM波的时候用到了定时器中断,我并不知道为什么。


1. 代码

main.c

#include "stm32f10x.h"                  // Device header

#include "pwm.h"
#include "Delay.h"

int main (void)
{
	uint16_t PWM_Val = 0;//定义变量PWM_Val为PWM的占空比
	uint8_t cnt = 1;//定义一个变量,用于判断。
	
	PWM_remapGPIO_Init(899,0);
	while(1)
	{
	
		if(cnt)
			PWM_Val ++;
		else
			PWM_Val --;
		if(PWM_Val > 600)
			cnt = 0;
		if(PWM_Val==0)
			cnt = 1;
		
		TIM_SetCompare2(TIM3,PWM_Val);//通过设置比较值来调占空比。
		Delay_ms(5);
	}
}


pwm.c

#include "stm32f10x.h"                  // Device header

/**
   * @brief    通用定时器TIM3的PWM波输出
   * @param
   * @retval
   */
void PWM_remapGPIO_Init(uint16_t ARR,uint8_t psc)
{
	
	
	GPIO_InitTypeDef PWM_GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef TIM_OCInitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);//使能GPIO外设与AFIO复用功能模块时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//选则TIM3部分重映像
	
	
	//  1·配置PWM输出通道,开启TIM3时钟
	//  TIM2的通道2(CH2)作为PWM的输出引脚,就需要对PB5进行配置
	PWM_GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	PWM_GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
	PWM_GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&PWM_GPIO_InitStruct);
	
	
	//2·初始化定时器3(TIM3)
	TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period = ARR;
	TIM_TimeBaseInitStruct.TIM_Prescaler = psc;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	
	
	//3·设置TIM3_CH2的PWM模式,使能TIM3的CH2输出
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;//设置定时器模式:PWM2模式
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
	TIM_OCInitStruct.TIM_OCNPolarity = TIM_OCNPolarity_High;
	TIM_OC2Init(TIM3,&TIM_OCInitStruct);
	
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能TIM3重载CCR2上的预装载寄存器
	
	TIM_Cmd(TIM3,ENABLE);
	

}

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值