通用定时器TIM2——单独控制三路PWM输出

主函数

#include "BSP_TIM2.h"   
#include "BSP_GPIO.h"



int main(void)
{
	TIM2_Init();
  KEY_GPIO_Config();
	while(1)
	{
		// ON
		if(KEY_Scan(KEY_PORT, KEY_ON_PIN) == 1)
		{
			TIM2->CCR2 = CCR_Val;
			Delay_ms(2000);     //2s
//			TIM2->CCR2 = 0;
		}
			
		// OFF
	  if(KEY_Scan(KEY_PORT, KEY_OFF_PIN) == 1)
		{
//			TIM2->CCR2 = 0;
//			TIM2->CCR4 = 0;
			TIM2->CCR3 = CCR_Val;
			Delay_ms(2000);     //1s
//			TIM2->CCR3 = 0;
		}
		
		// RESET
		if(KEY_Scan(KEY_PORT, KEY_RESET_PIN) == 1)
		{
//			TIM2->CCR2 = 0;
//			TIM2->CCR3 = 0;
			TIM2->CCR4 = CCR_Val;
			Delay_ms(2000);     //1s
//			TIM2->CCR4 = 0;
		}
	}
}

GPIO.C

#include "BSP_GPIO.h"

void KEY_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(KEY_CLK,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = KEY_ON_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(KEY_PORT,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = KEY_OFF_PIN;
	GPIO_Init(KEY_PORT,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = KEY_RESET_PIN;
	GPIO_Init(KEY_PORT,&GPIO_InitStructure);
}

uint8_t KEY_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
	if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == 1)
	{
//		while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == 1);
		return 1;
	}
	else
		return 0;
}

GPIO.H

#ifndef __BSP_GPIO_H
#define __BSP_GPIO_H

#include "stm32f10x.h"

#define KEY_CLK         RCC_APB2Periph_GPIOB
#define KEY_PORT     GPIOB

#define KEY_ON_PIN      GPIO_Pin_11
#define KEY_OFF_PIN     GPIO_Pin_12
#define KEY_RESET_PIN   GPIO_Pin_13


void KEY_GPIO_Config(void);
uint8_t KEY_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

#endif

TIM2.C

#include "BSP_TIM2.h"

void Delay_us(uint32_t Tim)
{
	uint32_t i=0; 
	for(i=0;i<Tim;i++)
	{  
			__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();  
			__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();  
			__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();  
			__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();  
			__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();  
	}  
}

void Delay_ms(uint32_t Tim)
{
	uint32_t i;
	for(i=0;i<Tim;i++)
		Delay_us(1000);
}

static void TIM2_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(TIM2_GPIO_CLK, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = TIM2_GPIO_PIN1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(TIM2_GPIO_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = TIM2_GPIO_PIN2;
	GPIO_Init(TIM2_GPIO_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = TIM2_GPIO_PIN3;
	GPIO_Init(TIM2_GPIO_PORT, &GPIO_InitStructure);
}

static void TIM2_MODE_Config(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimBaseStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(TIM2_CLK, ENABLE);
	
	TIM_TimBaseStructure.TIM_Period = TIM2_Period;
	TIM_TimBaseStructure.TIM_Prescaler = TIM2_Prescaler;
	TIM_TimBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimBaseStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimBaseStructure);
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_Pulse = 0;
	
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);
	TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
	
	TIM_OC3Init(TIM2, &TIM_OCInitStructure);
	TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
	
	TIM_OC4Init(TIM2, &TIM_OCInitStructure);
	TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	
	TIM_Cmd(TIM2, ENABLE);
	
}

static void TIM2_NVIC_Config(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	
	NVIC_Init(&NVIC_InitStructure);
}

void TIM2_Init(void)
{
	TIM2_NVIC_Config();
	TIM2_GPIO_Config();
	TIM2_MODE_Config();
}

TIM2.H

#ifndef __BSP_TIM2_H
#define __BSP_TIM2_H

#include "stm32f10x.h"

#define   TIM2_Period         399   // 200ms(399)
#define   TIM2_Prescaler      35999 // 2KHz
#define   CCR_Val             320   // 
#define   TIM2_CLK            RCC_APB1Periph_TIM2

#define   TIM2_GPIO_PORT      GPIOA
#define   TIM2_GPIO_CLK       RCC_APB2Periph_GPIOA

#define   TIM2_GPIO_PIN1      GPIO_Pin_1
#define   TIM2_GPIO_PIN2      GPIO_Pin_2
#define   TIM2_GPIO_PIN3      GPIO_Pin_3

void Delay_us(uint32_t Tim);
void Delay_ms(uint32_t Tim);

void TIM2_Init(void);

#endif

中断函数

void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
	{
		TIM2->CCR2 = 0;
		TIM2->CCR3 = 0;
		TIM2->CCR4 = 0;
		TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
	}
//	TIM_Cmd(TIM2, DISABLE);
//	Delay_ms(1000);
}

该程序实现的是按键控制TIM2通道2,3,4输出PWM波,每按一次,输出一个脉冲。把与中断相关的去掉,可实现按键按的时候一直输出脉冲。

现在遗留的问题是,没办法检测到按键弹开。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用STM32控制定时器TIM2输出PWM的代码示例: ```c #include "stm32f10x.h" void TIM2_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; GPIO_InitTypeDef GPIO_InitStruct; // 使能TIM2和GPIOA的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置GPIOA的PA0引脚为GPIO输出模式 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置TIM2的基本参数 TIM_TimeBaseInitStruct.TIM_Period = 999; // PWM周期为1ms TIM_TimeBaseInitStruct.TIM_Prescaler = 719; // 时钟预分频为720,计数频率为100KHz TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct); // 配置TIM2PWM参数 TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse = 500; // 占空比为50% TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStruct); // 启动TIM2 TIM_Cmd(TIM2, ENABLE); } int main(void) { TIM2_PWM_Init(); while (1) { // 无限循环,保持PWM输出 } } ``` 在上述代码中,我们首先定义了`TIM2_PWM_Init()`函数,该函数用于初始化定时器TIM2和GPIOA的配置,以便输出PWM信号。在该函数中,我们首先使能了TIM2和GPIOA的时钟,然后配置了GPIOA的PA0引脚为GPIO输出模式。 接下来,我们配置了TIM2的基本参数和PWM参数。其中,我们设置了PWM周期为1ms,时钟预分频为720,计数频率为100KHz,占空比为50%。最后,我们启动了定时器TIM2。 在主函数中,我们调用`TIM2_PWM_Init()`函数进行初始化,然后进入一个无限循环,以保持PWM输出

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值