TIM-输出比较(PWM)——STM32

TIM-输出比较——STM32

Oc (Output Compare) 输出比较
输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
每个高级定时器和通用定时器都拥有4个输出比较通道高级定时器的前3个通道额外拥有死区生成和互补输出的功能

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第一步,RCC开启时钟,把我们要用的TIM外设和GPIO外设的时钟打开
第二步,配置时基单元,包括这前面的时钟源选择
第三步,配置输出比较单元,里面包括这个CCR的值、输出比较模式、极性选择、输出使能这些参数。
第四步,配置GPIO,把PWM对应的GPIO口,初始化为复用推挽输出的配置。
第五步,就是运行控制了。启动计数器,这样就能输出PWM了。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
预装功能就是影子寄存器(和缓冲寄存器类似)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
带个N的就是高级定时器里互补通道的配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果你不想把所有成员都列一遍赋值,那就可以先用Stiuctlnit赋一个初始值,再更改你想改的值就行了,
在这里插入图片描述
只有把GPIO设置成复用推挽输出
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include "stm32f10x.h"                  // Device header

void PWM_Inint(void)
{
	//第一步开启时钟,初始化RCC,选择TIM2
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	//设置输出PWM的GPIO端口
		//使能GPIOA的时钟 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	//GPIOA模式初始化
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//第二步选择时基单元的时钟,选择内部时钟,选择TIM2
	TIM_InternalClockConfig(TIM2);
	
	//第三步配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频系数 1分频
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数的模式 向上计数
	//频率为1KHz,占空比为50%的PWM波形
	//计数器溢出频率:CK CNT_OV = CKCNT /(ARR + 1)= CK PSC /(PSC + 1)/(ARR +1)
	//配置定时为1s,则CK CNT_OV=1;CKCNT=72MHz=72000000;
	TIM_TimeBaseInitStruct.TIM_Period = 100 - 1;//周期,ARR自动重装器的值 范围0~65536
	TIM_TimeBaseInitStruct.TIM_Prescaler = 720 - 1;//PSC预分频器的值 范围0~65536
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //重复计数器的值 高级计数器才有
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
	
	//第四步配置输出中断
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//更新中断
	
	//清除中断标志位,能够避免刚初始化完就进中断的问题
	TIM_ClearFlag(TIM2,TIM_IT_Update);
	
	//第五步,配置输出比较单元,里面包括这个CCR的值、输出比较模式、极性选择、输出使能这些参数。
	TIM_OCInitTypeDef TIM_OCInitStruct;
	//先对结构体中的全部成员赋予初始值
	TIM_OCStructInit(&TIM_OCInitStruct);
	//在修改需要用到成员的值
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//设置输出比较的模式
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//设置输出比较的极性
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//设置输出比较的使能
	TIM_OCInitStruct.TIM_Pulse = 0;//50;//用来设置CCR 
	TIM_OC1Init(TIM2,&TIM_OCInitStruct);

	//第六步,运行控制
	TIM_Cmd(TIM2,ENABLE);
}

//让LED呈现呼吸灯的效果,那就是不断更改CCR的值就行了
void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2,Compare);

}

#ifndef _PWM_H
#define _PWM_H

void PWM_Inint(void);
void PWM_SetCompare1(uint16_t Compare);

#endif

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
#include "PWM.h"

uint8_t i;//定义一个全局变量

int main(void)
{

	
	while(1)
	{
			for(i=0;i<100;i++)
			{
				PWM_SetCompare1(i);
				Delay_ms(10);
			}
			
			for(i=0;i<100;i++)
			{
				PWM_SetCompare1(100-i);
				Delay_ms(10);
			}
	}
}

引脚重映射

在这里插入图片描述
需要用到AFIO。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果你想让PA15、PB3、PB4这三个引脚当做GPIO来使用的话;
在这里插入图片描述
如果你想重映射定时器或者其他外设的复用引脚
在这里插入图片描述

	//第一步开启时钟,初始化RCC,选择TIM2
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
		//实现重映射,将TIM2_CH2通道重映射到PA15
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开AFIO时钟
	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);
	//关闭PA15端口的复用
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
	
	//设置输出PWM的GPIO端口
		//使能GPIOA的时钟 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	//GPIOA模式初始化
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;//GPIO_Pin_0;//将PA0改到PA15了
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);

猜你喜欢

转载自blog.csdn.net/qq_45159887/article/details/130464168