Stm32 设置PWN定时器(完整的定时器复用表)多通道设置

目录

定时器复用表:

1、高级定时器设置(tim1,tim8)

2、通用定时器设置(以tim3为例)

3、调用


定时器复用表:

STM32F1xx官方资料:

《STM32中文参考手册V10》-第14章  通用定时器

具体资料自己查看,这个表是自己统计的,不在其中,需要资料可以留个邮箱或者自己百度

1、高级定时器设置(tim1,tim8)

定时器1初始化:(通道1,PA8)(IO与通道号对应查看上表)


//高级定时器1中断初始化
//arr:自动重装值。
//psc:时钟预分频值。
//(((arr+1) * (7199+1)) / 72 )us

void timer1_init(u16 arr,u16 psc)
{
    GPIO_InitTypeDef		GPIO_InitStruct;
    TIM_TimeBaseInitTypeDef	TIM_InitStruct;
    TIM_BDTRInitTypeDef		TIM_BdtrStruct;
    TIM_OCInitTypeDef		TIM_OCInitStruct;
    NVIC_InitTypeDef		NVIC_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1,ENABLE);

	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
    TIM_InitStruct.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_InitStruct.TIM_Period=arr;
    TIM_InitStruct.TIM_Prescaler=psc;
    TIM_InitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_InitStruct.TIM_RepetitionCounter=0;
    TIM_TimeBaseInit(TIM1,&TIM_InitStruct);

    TIM_BdtrStruct.TIM_AutomaticOutput=TIM_AutomaticOutput_Disable;
    TIM_BdtrStruct.TIM_LOCKLevel=TIM_LOCKLevel_OFF;
    TIM_BdtrStruct.TIM_DeadTime=0;
    TIM_BdtrStruct.TIM_Break=TIM_Break_Disable;
    TIM_BdtrStruct.TIM_BreakPolarity=TIM_BreakPolarity_Low;
    TIM_BdtrStruct.TIM_OSSIState=TIM_OSSIState_Enable;
    TIM_BdtrStruct.TIM_OSSRState=TIM_OSSRState_Enable;
    TIM_BDTRConfig(TIM1,&TIM_BdtrStruct);

    TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;
    TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
    //TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable;
    TIM_OCInitStruct.TIM_Pulse=0;
    TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;
    //TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCNPolarity_Low; 
    TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
    TIM_OCInitStruct.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
	
    TIM_OC1Init(TIM1,&TIM_OCInitStruct);

    TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
    TIM_ClearFlag(TIM1,TIM_FLAG_Update); 
    TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
    TIM_GenerateEvent(TIM1,TIM_EventSource_Update);
    NVIC_InitStruct.NVIC_IRQChannel=TIM1_UP_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
    NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    TIM_SetCompare1(TIM1,0);
    TIM_CtrlPWMOutputs(TIM1,ENABLE);
    TIM_ARRPreloadConfig(TIM1,ENABLE);
    TIM_Cmd(TIM1,ENABLE);        //不要忘了
}

定时器8初始化:(通道2,PC8、7)(IO与通道号对应查看上表)

void timer8_init(u16 arr,u16 psc)
{
    GPIO_InitTypeDef		GPIO_InitStruct;
    TIM_TimeBaseInitTypeDef	TIM_InitStruct;
    TIM_BDTRInitTypeDef		TIM_BdtrStruct;
    TIM_OCInitTypeDef		TIM_OCInitStruct;
    NVIC_InitTypeDef		NVIC_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_TIM8,ENABLE);

	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_Init(GPIOC,&GPIO_InitStruct);

    TIM_InitStruct.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_InitStruct.TIM_Period=arr;
    TIM_InitStruct.TIM_Prescaler=psc;
    TIM_InitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_InitStruct.TIM_RepetitionCounter=0;
    TIM_TimeBaseInit(TIM8,&TIM_InitStruct);

    TIM_BdtrStruct.TIM_AutomaticOutput=TIM_AutomaticOutput_Disable;
    TIM_BdtrStruct.TIM_LOCKLevel=TIM_LOCKLevel_OFF;
    TIM_BdtrStruct.TIM_DeadTime=0;
    TIM_BdtrStruct.TIM_Break=TIM_Break_Disable;
    TIM_BdtrStruct.TIM_BreakPolarity=TIM_BreakPolarity_Low;
    TIM_BdtrStruct.TIM_OSSIState=TIM_OSSIState_Enable;
    TIM_BdtrStruct.TIM_OSSRState=TIM_OSSRState_Enable;
    TIM_BDTRConfig(TIM8,&TIM_BdtrStruct);

    TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;
    TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
    //TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable;
    TIM_OCInitStruct.TIM_Pulse=0;
    TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;
    //TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCNPolarity_Low; 
    TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
    TIM_OCInitStruct.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
	
    TIM_OC2Init(TIM8,&TIM_OCInitStruct);
    TIM_OC3Init(TIM8,&TIM_OCInitStruct);

    TIM_OC2PreloadConfig(TIM8,TIM_OCPreload_Enable);
	TIM_OC3PreloadConfig(TIM8,TIM_OCPreload_Enable);
    TIM_ClearFlag(TIM8,TIM_FLAG_Update); 
    TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE);
    TIM_GenerateEvent(TIM8,TIM_EventSource_Update);
    NVIC_InitStruct.NVIC_IRQChannel=TIM8_UP_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
    NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    TIM_SetCompare2(TIM8,0);
    TIM_SetCompare3(TIM8,0);
    TIM_CtrlPWMOutputs(TIM8,ENABLE);
    // TIM_CtrlPWMOutputs(TIM8,DISABLE);
    TIM_ARRPreloadConfig(TIM8,ENABLE);
    TIM_Cmd(TIM8,ENABLE);
}

中断

//----------中断----------
void TIM1_UP_IRQHandler(void)//TIM1中断
{
   
    if(TIM_GetITStatus(TIM1,TIM_IT_Update)!=RESET)
    {
        TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
    }
        
}
//----------中断----------
void TIM8_UP_IRQHandler(void)//TIM1中断
{
   
    if(TIM_GetITStatus(TIM8,TIM_IT_Update)!=RESET)
    {
        TIM_ClearITPendingBit(TIM8, TIM_IT_Update);
    }
        
}

2、通用定时器设置(以tim3为例)

//TIM3 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//使能定时器3时钟
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    
 
   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形	GPIOB.5
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
 
   //初始化TIM3
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	
	//初始化TIM3 Channel2 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
 
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
 
	TIM_Cmd(TIM3, ENABLE);  //使能TIM3
	
 
}

中断

void TIM3_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
        //ProcessInTimerX();            //不启用y轴,暂做编码盘使用
   		CodeDisk_Count();
		//IO_MechanicalSWHandel();	//机械开关

    }
}

3、调用

int main(void)
 {		
	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	                     //串口初始化为115200
 	TIM3_PWM_Init(899,0);	                 //PWN3初始化
    timer8_init(9999,71);                 	 //PWN8初始化
	timer1_init(9999,71);                 	 //PWN1初始化
    TIM_SetCompare2(TIM3,1000);              //设置斩波频率,0:为关闭,1000为斩波频率
    TIM_SetCompare1(TIM1,0);		
    TIM_SetCompare3(TIM8,5000); 
    TIM_SetCompare3(TIM8,5000);       
   	while(1)
	{
									 
		   
	}	 
 }

 

### STM32 定时器 PWM 输出 示例代码及配置教程 #### 配置定时器用于PWM输出 STM32定时器模块可以被配置来生成PWM信号。这涉及到设置特定寄存器以定义PWM周期占空比[^1]。 对于PWM输出,主要涉及以下几个方面: - **初始化定时器**:选择合适的预分频系数(PSC)以及自动重装载值(ARR),这些决定了PWM频率。 - **通道配置**:指定哪个GPIO引脚作为PWM输出,并关联到相应的定时器通道。 - **模式设定**:通常采用向上计数模式,在此模式下当计数值达到捕获/比较寄存器(CCRx)所设之值时会改变电平状态从而形成方波形PWM输出。 下面是一个简单的例子展示如何使用HAL库函数完成上述操作并启动PWM输出: ```c #include "stm32f1xx_hal.h" TIM_HandleTypeDef htim3; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM3_PWM_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM3_PWM_Init(); while (1){} } // 初始化 TIM3 为 PWM 模式 static void MX_TIM3_PWM_Init(void){ __HAL_RCC_TIM3_CLK_ENABLE(); // 启用 TIM3 的时钟 // 设置定时器参数 htim3.Instance = TIM3; htim3.Init.Prescaler = 8000 - 1; // 设定预分频值, 影响PWM频率 htim3.Init.CounterMode = TIM_COUNTERMODE_UP; // 上升沿计数模式 htim3.Init.Period = 999; // 自动重载值, 即PWM周期长度 htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if(HAL_TIM_PWM_Init(&htim3)!= HAL_OK){ Error_Handler(); } // 配置通道1为PWM输出 TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; // 使用PWM模式1 sConfigOC.Pulse = 750; // 初始占空比对应的CCR值 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if(HAL_TIM_PWM_ConfigChannel(&htim3,&sConfigOC,TIM_CHANNEL_1)!= HAL_OK){ Error_Handler(); } // 开启中断或DMA传输(如果需要) /* ... */ // 启动PWM输出 HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); } ``` 这段程序展示了怎样通过调用`MX_TIM3_PWM_Init()`来进行必要的硬件资源分配与初始化工作,之后便可以通过调整`sConfigOC.Pulse`变量来动态控制PWM的占空比。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值