STM32G431 LLPWM输出
时间: 2025-06-22 15:24:20 浏览: 12
### STM32G431 使用 LL 库实现 PWM 输出的配置与示例
STM32G431 微控制器支持通过低层(Low Layer, LL)库来控制外设功能,包括定时器产生的脉宽调制信号(PWM)。以下是基于 LL 库实现 TIMx 定时器生成 PWM 的具体方法。
#### 1. 初始化硬件资源
在使用 LL 库之前,需确保已正确配置时钟树并使能相关外设的时钟。例如,对于 TIM17 定时器:
```c
// 启用 TIM17 和 GPIOA 的时钟
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM17);
```
#### 2. 配置 GPIO 引脚为复用模式
假设 TIM17_CH1 映射到 PA8,则需要将 PA8 设置为复用推挽输出模式:
```c
// 配置 PA8 作为 TIM17 CH1 复用功能
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_8, LL_GPIO_MODE_ALTERNATE);
LL_GPIO_SetAFPin_8_15(GPIOA, LL_GPIO_PIN_8, LL_GPIO_AF_5); // AF5 对应 TIM17_CH1
LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_8, LL_GPIO_SPEED_FREQ_HIGH);
LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_8, LL_GPIO_OUTPUT_PUSHPULL);
LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_8, LL_GPIO_PULL_NO);
```
#### 3. 配置定时器基本参数
设定预分频器(PSC)、自动重载寄存器(ARR),以及启用向上计数模式:
```c
// 配置 TIM17 基本参数
LL_TIM_SetPrescaler(TIM17, 17000 - 1); // PSC = 17000-1
LL_TIM_SetAutoReload(TIM17, 100 - 1); // ARR = 100-1
LL_TIM_SetCounterMode(TIM17, LL_TIM_COUNTERMODE_UP); // 上升计数模式
LL_TIM_DisableARRPreload(TIM17); // 禁用自动重装载缓冲区
```
#### 4. 配置 PWM 模式
选择 PWM 模式 1 或者模式 2 并设置捕获/比较寄存器(CCR)初值:
```c
// 配置 TIM17 CH1 为 PWM 模式 1
LL_TIM_OC_InitTypeDef OC_InitStruct;
OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1; // PWM 模式 1
OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;// 高有效
OC_InitStruct.OCFastMode = LL_TIM_OCFAST_DISABLE; // 禁用快速模式
OC_InitStruct.CompareValue = 50; // 初始占空比 CCR = 50
OC_InitStruct.OIDLEState = LL_TIM_OCIDLESTATE_RESET;
LL_TIM_OC_Init(TIM17, LL_TIM_CHANNEL_CH1, &OC_InitStruct);
// 启用 TIM17 CH1 输出
LL_TIM_CC_EnableChannel(TIM17, LL_TIM_CHANNEL_CH1);
```
#### 5. 启动定时器
最后启动 TIM17 定时器以开始 PWM 波形输出:
```c
// 启动 TIM17 计数器
LL_TIM_EnableCounter(TIM17);
```
以上代码实现了基于 LL 库的 TIM17 定时器 PWM 输出配置[^self]。需要注意的是,在实际应用中可能还需要调整具体的频率和占空比数值以满足需求。
---
### 示例总结
完整的代码框架可以按照以下顺序组织:
```c
#include "stm32g4xx_ll_tim.h"
#include "stm32g4xx_ll_gpio.h"
void TIM17_PWM_Init(void) {
// 1. 使能时钟
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM17);
// 2. 配置 GPIOA -> PA8 为 TIM17_CH1
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_8, LL_GPIO_MODE_ALTERNATE);
LL_GPIO_SetAFPin_8_15(GPIOA, LL_GPIO_PIN_8, LL_GPIO_AF_5);
LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_8, LL_GPIO_SPEED_FREQ_HIGH);
LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_8, LL_GPIO_OUTPUT_PUSHPULL);
LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_8, LL_GPIO_PULL_NO);
// 3. 配置 TIM17 参数
LL_TIM_SetPrescaler(TIM17, 17000 - 1);
LL_TIM_SetAutoReload(TIM17, 100 - 1);
LL_TIM_SetCounterMode(TIM17, LL_TIM_COUNTERMODE_UP);
LL_TIM_DisableARRPreload(TIM17);
// 4. 配置 PWM 模式
LL_TIM_OC_InitTypeDef OC_InitStruct = {0};
OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
OC_InitStruct.OCFastMode = LL_TIM_OCFAST_DISABLE;
OC_InitStruct.CompareValue = 50;
OC_InitStruct.OIDLEState = LL_TIM_OCIDLESTATE_RESET;
LL_TIM_OC_Init(TIM17, LL_TIM_CHANNEL_CH1, &OC_InitStruct);
LL_TIM_CC_EnableChannel(TIM17, LL_TIM_CHANNEL_CH1);
// 5. 启动定时器
LL_TIM_EnableCounter(TIM17);
}
```
---
阅读全文
相关推荐


















