stm32f103c8t6配置PA7引脚输出PWM源码
时间: 2025-05-25 09:08:19 浏览: 21
### STM32F103C8T6 PA7 PWM 输出配置
以下是针对 STM32F103C8T6 的 PA7 引脚配置为 PWM 输出的完整源码示例。此代码基于标准库开发,使用 TIM1 通道 1 来生成 PWM 波形。
#### 初始化时钟
为了使能 GPIO 和定时器外设时钟,需调用 `RCC_APB2PeriphClockCmd` 函数来开启相应的时钟模块。
```c
// 开启 GPIOA 和 TIM1 外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);
```
#### 配置 GPIO 引脚
PA7 是 TIM1 的 CH1N(互补通道),因此需要将其设置为复用推挽输出模式。
```c
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // 设置引脚为 PA7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置最大速度为 50 MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化 GPIOA
```
#### 定时器初始化
通过配置 TIM1 的预分频器和自动重装载寄存器,可以设定所需的 PWM 频率。
```c
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
uint16_t PrescalerValue;
PrescalerValue = (uint16_t) ((SystemCoreClock / 2) / 1000000) - 1; // 计算预分频值,假设期望频率为 1 MHz
TIM_TimeBaseStructure.TIM_Period = 999; // 自动重装载值,决定占空比范围
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; // 设定预分频器
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 不启用时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 初始化 TIM1 基础结构体
```
#### 配置 PWM 模式
将 TIM1 的通道 1 配置为 PWM 模式 1,并调整比较值以改变占空比。
```c
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMODE_PWM1; // PWM 模式 1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能输出
TIM_OCInitStructure.TIM_Pulse = 500; // 初始脉冲宽度,对应 50% 占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 极性高有效
TIM_OC1Init(TIM1, &TIM_OCInitStructure); // 初始化 TIM1 通道 1
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); // 使能预加载
```
#### 启动定时器
最后启动 TIM1 并使其开始工作。
```c
TIM_Cmd(TIM1, ENABLE); // 使能 TIM1
```
完整的代码如下所示:
```c
#include "stm32f10x.h"
void TIM1_PWM_Init(void) {
// 使能 GPIOA 和 TIM1 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);
// 配置 PA7 作为复用推挽输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置 TIM1 基础参数
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
uint16_t PrescalerValue;
PrescalerValue = (uint16_t)((SystemCoreClock / 2) / 1000000) - 1; // 预分频值计算
TIM_TimeBaseStructure.TIM_Period = 999; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; // 预分频器
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 不启用时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
// 配置 TIM1 通道 1 为 PWM 模式
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMODE_PWM1; // PWM 模式 1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能输出
TIM_OCInitStructure.TIM_Pulse = 500; // 脉冲宽度初始值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 极性高有效
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); // 使能预加载
// 启动 TIM1
TIM_Cmd(TIM1, ENABLE);
}
int main(void) {
TIM1_PWM_Init();
while (1) {}
}
```
以上代码实现了 STM32F103C8T6 中 PA7 引脚的 PWM 功能[^1]。
---
阅读全文
相关推荐


















