STM32F407 是一款性能强大的微控制器,适用于多种嵌入式应用。本文将介绍 STM32F407 的基本功能,并通过一个简单的 PWM 控制 LED 的示例代码,带你入门这一强大的 MCU。
STM32F407 的主要特性STM32F407 属于 ST 的 Cortex-M4 系列微控制器,具有以下核心特性:
- 主频高达 168 MHz
- 高达 1 MB 的 Flash 和 192 KB 的 SRAM
- 丰富的外设接口,包括 I2C、SPI、UART、CAN、USB OTG 等
- 支持多个定时器,适合实时控制应用
- 提供硬件 DSP 和 FPU 支持,增强信号处理能力
开发环境搭建在开始编写代码之前,需要搭建 STM32 的开发环境:
- 安装 Keil 或 STM32CubeIDE。
- 下载并安装 STM32CubeMX,用于生成外设初始化代码。
- 配置好开发板(例如,STM32F4 Discovery)。
实践案例:使用 PWM 控制 LED下面是一个简单的案例:通过定时器产生 PWM 信号来调节 LED 的亮度。
硬件连接将 LED 的正极连接到 STM32F407 的某个定时器输出引脚(例如,PA8,TIM1_CH1),负极通过电阻接地。
软件实现以下是完整的代码实现:
#include "stm32f4xx.h"
// 初始化 TIM1 用于 PWM 输出
void TIM1_PWM_Init(void) {
// 使能 TIM1 和 GPIOA 时钟
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
// 配置 PA8 为复用功能 TIM1_CH1
GPIOA->MODER &= ~GPIO_MODER_MODER8;
GPIOA->MODER |= GPIO_MODER_MODER8_1; // 复用模式
GPIOA->AFR[1] |= (0x01 << GPIO_AFRH_AFSEL8_Pos); // AF1: TIM1
// 配置 TIM1
TIM1->PSC = 168 - 1; // 设置预分频器 (时钟频率为 1 MHz)
TIM1->ARR = 1000 - 1; // 自动重装值 (PWM 频率为 1 kHz)
TIM1->CCR1 = 500; // 初始占空比为 50%
TIM1->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM 模式 1
TIM1->CCMR1 |= TIM_CCMR1_OC1PE; // 输出比较预装载使能
TIM1->CCER |= TIM_CCER_CC1E; // 使能通道 1 输出
TIM1->BDTR |= TIM_BDTR_MOE; // 主输出使能
// 启动计数器
TIM1->CR1 |= TIM_CR1_CEN;
}
// 主函数
int main(void) {
// 初始化 PWM
TIM1_PWM_Init();
while (1) {
// 简单循环,调整占空比
for (int i = 0; i <= 1000; i++) {
TIM1->CCR1 = i; // 调整占空比
for (int j = 0; j < 10000; j++); // 延时
}
for (int i = 1000; i >= 0; i--) {
TIM1->CCR1 = i;
for (int j = 0; j < 10000; j++);
}
}
}
代码解析- 时钟配置:使能 TIM1 和 GPIOA 的时钟。
- GPIO 配置:将 PA8 配置为复用功能,连接 TIM1_CH1。
- TIM1 初始化:设置预分频器和自动重装值,生成 1 kHz 的 PWM 信号。
- 循环占空比调整:通过循环改变 TIM1->CCR1 的值,从而动态调节 LED 的亮度。
注意事项- 确保使用的引脚支持定时器输出功能。
- 如果 LED 的亮度没有变化,检查时钟是否正确配置,以及 GPIO 引脚是否正确连接。
结论STM32F407 的强大之处在于其高性能和丰富的外设支持。通过这个简单的案例,我们看到了它在 PWM 应用中的潜力。结合硬件 DSP 和多种通信接口,STM32F407 可以胜任从简单控制到复杂信号处理的多种任务。
|