STM32F407高级定时器TIM8_CH1N输出PWM配置

本文详细介绍了STM32F407100的TIM8高级定时器如何配置TIM8_CH1N输出PWM波形,包括预分频、计数模式、OC初始化结构和CtrlPWMOutputs设置。重点讲解了TIM_OutputNState和TIM_OCNIdleState的正确使用方法,以及确保PWM输出的必要步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32的TIM1和TIM8是两个高级定时器,TIM8_CH1N和TIM8_CH1如果两路都需要输出PWM则不能独立输出不同的占空比,他们只能输出可以带死区控制的互补波形。这里只讨论如何在TIM8_CH1N上输出PWM波形。

        STM32F407 100引脚的Pin30 => PA5 => TIM8_CH1N

	//Pin30 PA5 TIM8_CH1N
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);  	//TIM8时钟使能    
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 	//使能PORTA时钟	
	RCC_GetClocksFreq(&freqInfo);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_TIM8); //PA5复用为定时器TIM8_CH1N功能
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;           //Pin5
	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);              //初始化PA5


    TIM_TimeBaseStructure.TIM_Prescaler = X_PRESCALER - 1;//预分频后频率为1MHz
	TIM_TimeBaseStructure.TIM_Period = X_MIN_US_PER_PULSE - 1;//自动重装载值,确定pwm周期为多少
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
	TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);//初始化TIM8定时器

    //初始化TIM8_CH1N PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;//禁用TIM8_CH1输出
	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//使能TIM8_CH1N输出
	TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//设置TIM8_CH1空闲电频状态
	TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;//设置TIM8_CH1N空闲电频状态
	//只要TIM的 计数器值<比较器值 都是有效电频,否则为无效。但是可以设置PWM的有效电频是低电频还是高电频。
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//设置TIM8_CH1有效电频状态
	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;//设置TIM8_CH1N有效电频状态

    TIM_CtrlPWMOutputs(TIM8 , ENABLE);//高级定时器TIM1和TIM8必须使能这一句否则无法输出pwm
	TIM_Cmd(TIM8 , ENABLE);//使能TIM8

    TIM_SetAutoreload(TIM8 , 1000);//设置自动重载值
    TIM_SetCompare1(TIM8 , (TIM8->ARR + 1) / 2);//设置TIM8_CH1N输出50%占空比

需要特别注意的是3个地方

1. TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;

注意这里使用的不是TIM_OutputState_Enable而是TIM_OutputNState_Enable

2. TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

注意这里使用的不是TIM_OCIdleState_Reset而是TIM_OCNIdleState_Reset

3. TIM_CtrlPWMOutputs(TIM8 , ENABLE);

高级定时器TIM1和TIM8必须使能这一句否则无法输出pwm

STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,其TIM1定时器1)模块可以用于生成PWM信号,特别是通过它的CH2N通道(通道2事件输入)。以下是使用该芯片输出PWM的基本步骤: 1. **配置TIM1**: - 首先,在GPIO寄存器中初始化TIM1的相关GPIO作为输出(例如PA5接PWM OUT),并设置模式为推挽输出(GPIO_MODE_OUTPUT_PP)。 - 将TIM1配置PWM模式,启用计数器,并设置时钟源(如系统时钟SYSCLK / 1000)。 2. **配置TIM1 Channel 2**: - 打开TIM1 CH2的中断请求(例如 TIM1_IT_UPDATE),这将触发计数器更新时的PWM周期改变。 - 设置CH2的捕获/比较寄存器(TIM1CCR2)为高电平值,以便当计数器达到这个值时发生中断。 3. **设置PWM周期占空比**: - 通过调整TIM1的预分频器、ARR(自动重装载寄存器)CCxP(CC寄存器x的极性)来设置PWM的周期长度。例如,如果希望周期为2us,首先计算出相应的ARR值。 - 调整CC2寄存器(即TIM1CCR2)来设置占空比。比如,如果你想得到50%的占空比,则设置CC2为ARR的一半。 4. **配置中断服务程序(ISER)**: - 当TIM1 CH2的中断被触发时,执行ISER,检查计数器状态并调整GPIO输出以同步PWM波形。 5. **启动定时器**: - 启动TIM1的计数器,开始生成PWM。 ```c // 示例C代码 void TIM1_PWM_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure; // ... 初始化GPIO PA5为推挽输出 ... // 配置TIM1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseInitStructure.TIM_Period = (SystemCoreClock / 1000) - 1; // 计算ARR值 TIM_TimeBaseInitStructure.TIM_Prescaler = ...; // 根据实际时钟频率设定 TIM_TimeBaseInitStructure.TIM_ClockDivision = 0; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure); // ... 其他TIM1 CH2配置 ... TIM_ClearFlag(TIM1, TIM_FLAG_Update); // 清除标志位 TIM_Cmd(TIM1, ENABLE); // 开启TIM1 // 设置PWM占空比 TIM_SetCompare1(TIM1, (TIM_TimeBaseInitStructure.TIM_Period * PWM_DutyCycle) / 100); // PWM_DutyCycle是占空比的百分比 // 映射开启TIM1 CH2的中断 TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); NVIC_EnableIRQ(TIM1_IRQn); // 开启中断请求 } // 中断服务函数 TIM1_IRQHandler() void TIM1_IRQHandler() { if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { TIM_ClearFlag(TIM1, TIM_FLAG_Update); // 清除标志 GPIO_SetBits(GPIOA, GPIO_Pin_5); // 输出高电平 GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 输出低电平(形成PWM波形) } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值