STM32F407 TIM1的PWM输出

本文详细介绍了STM32微控制器中TIM1定时器的PWM初始化过程,包括配置时钟、设置GPIO复用模式、初始化定时器参数等关键步骤。
//TIM1 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u32 arr,u32 psc)
{		 					 
	//此部分需手动修改IO口设置
	
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);  	//TIM1时钟使能    
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 	//使能PORTA时钟	
	
	//复用不能写成下面,会出问题
	//GPIO_PinAFConfig(GPIOA,GPIO_PinSource8|GPIO_PinSource11,GPIO_AF_TIM1); //GPIO复用为定时器1
	
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_TIM1); //复用GPIOA_Pin8为TIM1_Ch1, 
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_TIM1);//复用GPIOA_Pin11为TIM1_Ch4,注意没有CH4N 
		
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11;           //GPIO
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure);              //初始化P
	
	TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
	TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	//TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;//默认就为0
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//初始化定时器1



	//初始化TIM1  PWM模式	 
	//PWM 模式 1–– 在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为有效状态,否则为无效状态。在递减计数模式下,
	  

	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1为正常占空比模式,PWM2为反极性模式
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低,有效电平为低电平

	TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//在空闲时输出     低,这里的设置可以改变TIM_OCPolarity 如果没这句,第1通道有问题
	
	TIM_OCInitStructure.TIM_Pulse = 2000; //输入通道1 CCR1(占空比数值)
	TIM_OC1Init(TIM1, &TIM_OCInitStructure); //Ch1初始化
	
	TIM_OCInitStructure.TIM_Pulse = 5000;
	TIM_OC4Init(TIM1, &TIM_OCInitStructure);//通道4
	
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM1在CCR1上的预装载寄存器,CCR自动装载默认也是打开的
	
	TIM_ARRPreloadConfig(TIM1,ENABLE);//ARPE使能 
	TIM_Cmd(TIM1, ENABLE);  //使能TIM1
	TIM_CtrlPWMOutputs(TIM1, ENABLE);//使能TIM1的PWM输出,TIM1与TIM8有效,如果没有这行会问题
						  
}  


### STM32F407 使用 TIM14 进行 PWM 输出 对于 STM32F407 微控制器而言,利用定时器进行 PWM 信号输出是一种常见的操作方式。TIM14 是一个基本定时器,在此背景下可以配置成用于生成 PWM 波形。 #### 初始化设置 为了使能 TIM14 的外设时钟并初始化其参数以便于后续的操作,需调用 `__HAL_RCC_TIM14_CLK_ENABLE()` 函数开启时钟供给。接着定义结构体变量存储初始化所需的数据成员,比如周期值(自动重装载寄存器)、脉冲宽度(捕获/比较寄存器),以及模式选择等信息[^1]。 ```c // 开启 TIM14 外设时钟 __HAL_RCC_TIM14_CLK_ENABLE(); // 定义 TIM 时间基类初始化结构体实例化对象 tim_base_init_struct LL_TIM_InitTypeDef tim_base_init_struct; tim_base_init_struct.Prescaler = (SystemCoreClock / 8000000) - 1; // 设置预分频系数 tim_base_init_struct.CounterMode = LL_TIM_COUNTERMODE_UP; // 计数方向向上计数 tim_base_init_struct.Autoreload = 999; // 自动重载值设定为最大周期减一后的数值 LL_TIM_Init(TIM14, &tim_base_init_struct); // 对应定时器按照指定参数完成初始化工作 ``` #### 配置通道与极性 由于 TIM14 只有一个输入捕捉/输出比较通道 OC1,因此这里仅针对该单一路由做具体说明。需要注意的是,当作为 PWM 发生装置运作时,应当把对应 IO 端口映射到相应功能上,并且指明所期望的工作状态——即高电平有效还是低电平有效的PWM波形形式。 ```c // 定义 TIM 输出比较初始化结构体实例化对象 oc_init_struct LL_TIM_OC_InitTypeDef oc_init_struct; oc_init_struct.OCState = LL_TIM_OCSTATE_DISABLE; // 初始状态下关闭输出比较功能 oc_init_struct.OCPolarity = LL_TIM_OCPOLARITY_HIGH; // 设定输出比较匹配后产生的动作是上升沿触发 oc_init_struct.CompareValue = 500; // 指定初始占空比对应的比较值大小 LL_TIM_OC_Init(TIM14, LL_TIM_CHANNEL_CH1, &oc_init_struct); LL_TIM_CC_EnableChannel(TIM14, LL_TIM_CHANNEL_CH1); // 启用选定的通道 ``` #### 启动定时器 最后一步就是启动定时器本身及其关联的更新事件中断服务程序(如果有的话)。这可以通过简单的 API 调用来达成目的: ```c LL_TIM_EnableCounter(TIM14); // 启动定时器开始计数过程 ``` 上述代码片段展示了如何基于 HAL 库或底层库对 STM32F407 上的 TIM14 实现基础版 PWM 功能的方法概述。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oshan2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值