stm32f103c8t6使用PA0和PA3引脚输出pwm波
时间: 2025-07-22 12:07:27 浏览: 10
在 STM32F103C8T6 微控制器上配置 PA0 和 PA3 引脚输出 PWM 波形,需要对 GPIO、定时器(TIM)以及 PWM 模式进行详细配置。以下是完整的实现步骤及代码示例。
### 1. 硬件资源分配
- **PA0** 对应 **TIM2_CH1**
- **PA3** 对应 **TIM2_CH4**
因此,需要使用 **TIM2** 定时器来生成 PWM 波形,并将这两个通道配置为 PWM 输出模式。
### 2. 配置步骤
#### (1) 初始化 GPIO
将 PA0 和 PA3 配置为 **复用推挽输出模式**,以便将引脚控制权交给定时器模块。
```c
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
```
#### (2) 配置 TIM2 定时器
设置 TIM2 的自动重载值(ARR)和预分频器(PSC),以确定 PWM 的频率。
```c
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 72MHz / 72 = 1MHz
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 1MHz / 1000 = 1kHz
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
```
#### (3) 配置 PWM 输出通道(TIM2_CH1 和 TIM2_CH4)
```c
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 初始占空比 50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
// 配置 CH1(PA0)
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
// 配置 CH4(PA3)
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
```
#### (4) 启动定时器
```c
TIM_Cmd(TIM2, ENABLE);
TIM_CtrlPWMOutputs(TIM2, ENABLE); // 若使用高级定时器则需要此函数
```
### 3. 调整占空比
可以通过修改 `TIM_SetCompareX()` 函数来动态调整占空比:
```c
TIM_SetCompare1(TIM2, 200); // 设置 PA0 的占空比为 20%
TIM_SetCompare4(TIM2, 800); // 设置 PA3 的占空比为 80%
```
### 4. 完整示例代码
```c
#include "stm32f10x.h"
void PWM_Init(void) {
// 使能 GPIOA 和 TIM2 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 配置 PA0 和 PA3 为复用推挽输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置 TIM2 基础定时器
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 1MHz
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 1kHz
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 配置 PWM 输出
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 初始占空比 50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
// CH1(PA0)
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
// CH4(PA3)
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
// 启动定时器
TIM_Cmd(TIM2, ENABLE);
}
```
### 5. 注意事项
- 系统时钟应配置为 **72MHz**,否则需根据实际时钟调整预分频器和周期值。
- 若需要更高的精度或更低频率的 PWM,可以调整 `TIM_Period` 和 `TIM_Prescaler`。
- PWM 占空比可通过 `TIM_SetCompare1()` 和 `TIM_SetCompare4()` 动态调整。
---
阅读全文
相关推荐


















