STM32从零开始(八)PWM

STM32从零开始(八)PWM_第1张图片
STM32从零开始(八)PWM_第2张图片
这个是用来控制她是输入捕获还是输出比较的,咱们pwm就是输出比较。

在这里插入图片描述

所以要写的位有这几个:
STM32从零开始(八)PWM_第3张图片

一般置pwm即可

STM32从零开始(八)PWM_第4张图片
一般置1,为了安全,无法立即写入

STM32从零开始(八)PWM_第5张图片
STM32从零开始(八)PWM_第6张图片
ccer的这个寄存器也是有用的
STM32从零开始(八)PWM_第7张图片
这个是设置输出是高电平有效还是低电平有效
STM32从零开始(八)PWM_第8张图片
和这个搭配着看,比如当cnt小于ccr1,110的时候是高电平,然后cc1p设置为0,oc1高有效,向上计数的话,那就是先亮再灭。
http://www.360doc.com/content/14/1211/10/6828497_432083097.shtml 看这篇文章即可

STM32从零开始(八)PWM_第9张图片
这就是他的原理图,我们说的oc1ref和真正的输出oc1不一样
STM32从零开始(八)PWM_第10张图片

重大问题,关于tim2重映射到pb3不起作用的问题解决

STM32从零开始(八)PWM_第11张图片

完全重映射到pb3为什么不起用呢?
因为没有关闭JTDI和JTDO
加上下面代码就可以:
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE);
AFIO->MAPR&=0XF8FFFFFF;
AFIO->MAPR|=0X04000000;

如果同时开启默认的复用功能(USART3_TX)和重映射后的复用功能(TIM2_CH3)的时钟,外设功能会产生冲突,造成工作异常的情况。
这两句代码就是把它之前的默认的usart禁用掉,这样就可以了。
STM32从零开始(八)PWM_第12张图片
禁用的是这俩

#include "stm32f10x.h"

/*
尝试设置tim2输出pwm在pb0的基础上,同时添加pb1通过tim2定时器中断来点亮
需要设置的有:tim,rcc,gpio,nvic,tim_pwm
2020.7.29

如果只是pwm,似乎不用设置nvic,尝试一下
*/
void delay_ms(unsigned int i)
{
	while(i--);
}

void TIM(uint16_t pre, uint16_t cnt);
int main(void)
{
	unsigned int i=0;  
	unsigned int fx=0;	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
	
	TIM(71, 500);
	while(1)
	{
		
		if(fx==0)
		{
			i++;
			if(i==300)
			{
				fx=1;
			}
		}
		else
		{
			i--;
			if(i==0)
			{
				fx=0;
			}
		}
		TIM_SetCompare2(TIM2,i);  //i值最大可以取499,因为ARR最大值是499.
		delay_ms(100000);	
	}
	return 0;
}

void TIM(uint16_t pre, uint16_t cnt)
{
	GPIO_InitTypeDef GPIO_InitStruct; 
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	AFIO->MAPR&=0XF8FFFFFF; 
AFIO->MAPR|=0X04000000;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //读取的时候是一下readoutput,为啥input也行?
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	
	TIM_TimeBaseInitStructure.TIM_Period=cnt;   //自动装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler=pre; //分频系数
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);	
	
	GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
//	TIM_OCInitStructure.TIM_Pulse = 10;
	TIM_OC2Init(TIM2,&TIM_OCInitStructure); //输出比较通道1初始化

	TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable); //使能TIMx在 CCR1 上的预装载寄存器
	TIM_ARRPreloadConfig(TIM2,ENABLE);//使能预装载寄存器
	
	TIM_Cmd(TIM2,ENABLE); //使能定时器
}

你可能感兴趣的:(嵌入式,c)