#include "stm32f10x_gpio.h" #include "pwm.h" /* ********************************************************************************************************* * º¯ Êý Ãû: PWM_GPIO_Init * ¹¦ÄÜ˵Ã÷:PWMµÄÏà¹ØÒý½Å³õʼ»¯ * ÐÎ ²Î: * ·µ »Ø Öµ: ÎÞ ********************************************************************************************************* */ void PWM_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM8_CH1N GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //¶¨Ê±Æ÷ÐèÒª¸´ÓÿªÂ©Êä³ö£¬ÒòÍⲿÉÏÀ5V GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //TIM8_CH2N,TIM8_CH3N GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //¶¨Ê±Æ÷ÐèÒª¸´ÓÿªÂ©Êä³ö£¬ÒòÍⲿÉÏÀ5V GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8; //TIM8_CH1,TIM8_CH2,TIM8_CH3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //¶¨Ê±Æ÷ÐèÒª¸´ÓÿªÂ©Êä³ö£¬ÒòÍⲿÉÏÀ5V GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } /* ********************************************************************************************************* * º¯ Êý Ãû: PWM_Init * ¹¦ÄÜ˵Ã÷: ³õʼ»¯TIM8£¬ÊµÏÖ3ͨµÀµÄ»¥²¹PWMÊä³ö * ÐÎ ²Î: Ô¤×°ÔØÖµarrºÍÔ¤·ÖƵֵpsc * ·µ »Ø Öµ: ÎÞ ********************************************************************************************************* */ void PWM_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; PWM_GPIO_Init();//³õʼ»¯PWMÒý½Å RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); TIM_DeInit(TIM8); TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓÆµÂʳýÊýµÄÔ¤·ÖƵֵ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//ÏòÉϼÆÊýģʽ TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWMģʽ2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //ʹÄÜCHͨµÀ TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //ʹÄÜCHN£¨»¥²¹£©Í¨µÀ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //¿ÕÏÐµÍµçÆ½ TIM_OCInitStructure.TIM_OCNPolarity= TIM_OCNPolarity_Low; //¿ÕÏÐµÍµçÆ½ TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //ËÀÇøºóÊä³ö״̬ TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OC1Init(TIM8, &TIM_OCInitStructure); //Êä³öPWM TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable); TIM_OC1FastConfig(TIM8,TIM_OCFast_Enable); TIM_OC2Init(TIM8, &TIM_OCInitStructure); //Êä³öPWM TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable); TIM_OC2FastConfig(TIM8,TIM_OCFast_Enable); TIM_OC3Init(TIM8, &TIM_OCInitStructure); //Êä³öPWM TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable); TIM_OC3FastConfig(TIM8,TIM_OCFast_Enable); TIM_ARRPreloadConfig(TIM8,ENABLE); TIM_Cmd(TIM8, ENABLE); TIM_CtrlPWMOutputs(TIM8, ENABLE);//ÕâÒ»²½Ò»¶¨ÒªÅäÖã¬Ö÷¶¯´ò¿ª¸ß¼¶¶¨Ê±Æ÷ TIM_CCxCmd(TIM8,TIM_Channel_1,TIM_CCx_Enable);//´ò¿ª¶¨Ê±Æ÷8ͨµÀ1 TIM_CCxCmd(TIM8,TIM_Channel_2,TIM_CCx_Enable);//´ò¿ª¶¨Ê±Æ÷8ͨµÀ2 TIM_CCxCmd(TIM8,TIM_Channel_3,TIM_CCx_Enable);//´ò¿ª¶¨Ê±Æ÷8ͨµÀ3 } /* ********************************************************************************************************* * º¯ Êý Ãû: PWM_SetCompare * ¹¦ÄÜ˵Ã÷: É趨±È½ÏPWM±È½ÏÖµ * ÐÎ ²Î: ´«ÈëÊýÖµ·¶Î§0~99 * ·µ »Ø Öµ: ÎÞ ********************************************************************************************************* */ void PWM_SetCompare(uint16_t ch1,uint16_t ch2,uint16_t ch3) { if(ch1>99) ch1=99; if(ch2>99) ch2=99; if(ch3>99) ch3=99; TIM8->CCR1 = ch1; TIM8->CCR2 = ch2; TIM8->CCR3 = ch3; }
时间: 2025-06-01 20:02:33 浏览: 28
### STM32F10x 系列 PWM 初始化与配置示例
以下是一个完整的 STM32F10x 系列 PWM 初始化和配置的代码示例,涵盖定时器 TIM2 的初始化、PWM 模式设置以及 GPIO 配置。
#### 定义头文件与宏
在代码开始前,定义必要的头文件和宏[^1]:
```c
#include "stm32f10x.h"
#define PWM_FREQUENCY 1000 // PWM 频率 (Hz)
#define DUTY_CYCLE 75 // 占空比 (%)
```
#### GPIO 配置
GPIO 配置用于指定 PWM 输出引脚。以下是配置 GPIOA 的代码[^1]:
```c
void GPIO_Config(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// 使能 GPIOA 和 TIM2 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 配置 PA0 为复用推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
```
#### 定时器 TIM2 初始化
TIM2 初始化用于生成 PWM 信号,包括预分频器、计数周期和频率设置[^1]:
```c
void TIM2_PWM_Init(uint16_t arr, uint16_t psc) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 配置 TIM2 基础时间
TIM_TimeBaseStructure.TIM_Period = arr; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = psc; // 预分频器
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 配置 TIM2 通道 1 为 PWM 模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = arr * DUTY_CYCLE / 100; // 占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
// 使能 TIM2
TIM_Cmd(TIM2, ENABLE);
TIM_CtrlPWMOutputs(TIM2, ENABLE); // 如果使用高级控制功能(如互补输出)
}
```
#### 主函数
主函数中调用上述配置函数,并计算合适的自动重装载值和预分频器值[^1]:
```c
int main(void) {
uint16_t prescaler_value, arr_value;
// 计算 TIM2 的自动重装载值和预分频器值
prescaler_value = (SystemCoreClock / 2) / (PWM_FREQUENCY * 1000) - 1;
arr_value = PWM_FREQUENCY - 1;
// 配置 GPIO 和 TIM2
GPIO_Config();
TIM2_PWM_Init(arr_value, prescaler_value);
while (1) {
// 主循环空闲
}
}
```
---
###
阅读全文
相关推荐



















