基于正点原子精英STM32F103ZET6开发板的用GPIO输出PWM的参考代码注:本代码是标准库代码,不是HAL库代码

1 篇文章 0 订阅
1 篇文章 0 订阅
文章提供了一个基于STM32F10x的PWM配置代码示例,包括TIM3的3、4通道和TIM4的1通道,用于生成不同占空比的PWM信号。代码中详细展示了如何初始化定时器、配置GPIO和设置比较寄存器以改变占空比,实现PWM输出功能。
摘要由CSDN通过智能技术生成

这是PWM.h头文件

#ifndef    ___PWM__h_____
#define   ____PWM_h_____

void PWM_init_TIM3_3();
void setcompare_TIM3_3(uint16_t compare);
	
void PWM_init_TIM3_4();
void setcompare_TIM3_4(uint16_t compare);

void PWM_init_TIM4_1();
void setcompare_TIM4_1(uint16_t compare);

#endif

 

下面这是PWM.c文件代码

代码中只用到了TIM3的3通道和4通道,以及TIM4的1通道,想用其他通用定时器的其他通道可以在本代码的基础上小改一下

#include "stm32f10x.h"         
void PWM_init_TIM3_3()                               //TIM3的通道3输出PWM,分辨率1/100
{
	
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);          //使能TM3外设
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);          //用AFIO映射TIM3
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;               //要用复用推挽模式
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);                      //配置GPIOB
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);       //将TIM3映射到GPIO口,是部分映射
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;            
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period=100-1;              //ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;           //PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=80;       //频率=72MHz/(PSC+1)/(ARR+1)
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);      //配置TIM3时基单元
	
	TIM_InternalClockConfig(TIM3);                           //用内部时钟模式
	
	
	TIM_OCInitTypeDef TIM_OCInitStructure;                   //配置TIM3的输出
	TIM_OCStructInit(&TIM_OCInitStructure);                  //用这个结构体配置不需要用到的部分
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;         
	TIM_OCInitStructure.TIM_Pulse=50;                                   //CCR
	TIM_OC3Init(TIM3, &TIM_OCInitStructure);                         //占空比=CCR/(ARR+1)
	                                                                //分辨率=1/(ARR+1)
	                                                               //PWM频率和时钟频率一致
	
	TIM_Cmd(TIM3, ENABLE);
}

void PWM_init_TIM3_4()                  //用TIM3的通道4输出PWM,分辨率1/100
{
	
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);          //使能TM3外设
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);         //用AFIO映射TIM3
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;               //要用复用推挽模式
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);                      //配置GPIOB
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);       //将TIM3映射到GPIO口,是部分映射
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;            
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period=100-1;              //ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;           //PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=50;       //频率=72MHz/(PSC+1)/(ARR+1)
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);      //配置TIM3时基单元
	
	TIM_InternalClockConfig(TIM3);                           //用内部时钟模式
	
	
	TIM_OCInitTypeDef TIM_OCInitStructure;                   //配置TIM3的输出
	TIM_OCStructInit(&TIM_OCInitStructure);                  //用这个结构体配置不需要用到的部分
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;           //一定要设置成这个模式
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;         
	TIM_OCInitStructure.TIM_Pulse=50;                                   //CCR
	TIM_OC4Init(TIM3, &TIM_OCInitStructure);                         //占空比=CCR/(ARR+1)
	                                                                //分辨率=1/(ARR+1)
	                                                               //PWM频率和时钟频率一致
	
	TIM_Cmd(TIM3, ENABLE);
}

void PWM_init_TIM4_1()                       //用TIM4的1通道输出PWM,分辨率1/1000
{
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	 GPIO_InitTypeDef GPIO_InitStructure;
	 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
	 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	 GPIO_Init(GPIOD, &GPIO_InitStructure);
	
	GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE);
	
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period=100-1;
	TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);
	
	TIM_InternalClockConfig(TIM4);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=50;
	TIM_OC1Init(TIM4,&TIM_OCInitStructure);
   
	TIM_Cmd(TIM4, ENABLE);
	
}	

void setcompare_TIM3_3(uint16_t compare)
{
	TIM_SetCompare3(TIM3,compare);                         //更改TIM3_Pulse的值来改变占空比
}
void setcompare_TIM3_4(uint16_t compare)
{
	TIM_SetCompare4(TIM3,compare);                         //更改TIM3_Pulse的值来改变占空比
}
void setcompare_TIM4_1(uint16_t compare)
{
	TIM_SetCompare1(TIM4,compare); 
}

 

 下面这是主函数main.c的例程

#include "stm32f10x.h"   
#include  "PWM.h"
#include  "Delay.h"
#include  "OLED.h"
uint8_t i=0;
int main()
{
	PWM_init_TIM3_3();
    PWM_init_TIM3_4();
	PWM_init_TIM4_1();
	while(1)
	{

		//以下这些代码的效果是:在对应的引脚插上LED正极后会呈现呼吸灯的效果。
        //此处例程用的引脚是GPIOB0、GPIOB1
		for(i=0;i<=100;i++)
		{
			 setcompare_TIM3_3(uint16_t compare);
			 setcompare_TIM3_4(uint16_t compare);
			Delay_ms(50);
		}
		for(i=100;i>0;i--)
		{
			setcompare_TIM3_3(uint16_t compare);
			setcompare_TIM3_3(uint16_t compare);
			Delay_ms(50);
		}
		
	}
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值