#include "stm32f10x.h" #include "stdio.h" #include "string.h" // 定义全局变量 uint32_t freq = 0; // 用于存储测量得到的频率值 TIM_HandleTypeDef htim2; // 定时器2的句柄 // 定时器2初始化函数 void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_IC_InitTypeDef sConfigIC = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 72 - 1; // 预分频,72MHz系统时钟下得到1MHz计数频率 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0xFFFF; // 自动重装载值 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim2)!= HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig)!= HAL_OK) { Error_Handler(); } if (HAL_TIM_IC_Init(&htim2)!= HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig)!= HAL_OK) { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1)!= HAL_OK) { Error_Handler(); } } // GPIO初始化函数 void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); // 这里可以添加其他GPIO初始化代码,比如LED、按键等相关GPIO初始化 } // USART1初始化函数 void MX_USART1_UART_Init(void) { UART_HandleTypeDef huart1; huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTR
时间: 2025-04-07 13:03:25 浏览: 64
### STM32F10x 定时器 TIM2 和 USART1 初始化配置
对于 STM32F10x 系列微控制器中的定时器 TIM2 和 USART1 的初始化配置,通常涉及多个外设的设置。以下是详细的说明以及示例代码。
#### 配置概述
在 STM32F10x 中,TIM2 是一个通用定时器,而 USART1 则是一个串口通信模块。为了使这两个外设正常工作,需要完成以下几个方面的配置:
1. **RCC 时钟配置**
启用 TIM2 和 USART1 所需的时钟源。
2. **GPIO 配置**
将 GPIO 引脚分配给 TIM2 或 USART1 使用的功能模式(如复用功能)。
3. **TIM2 初始化**
设置计数器的工作方式、预分频系数及时基参数等。
4. **USART1 初始化**
配置波特率、数据位长度、停止位数量及校验方式等。
---
#### 示例代码
以下是一段基于标准库的 C 语言实现代码,用于初始化 TIM2 和 USART1。
```c
#include "stm32f10x.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void TIM2_Configuration(void);
void USART1_Configuration(void);
int main(void) {
// 系统时钟、GPIO 及其他外设初始化
RCC_Configuration();
GPIO_Configuration();
// 定时器 TIM2 初始化
TIM2_Configuration();
// 串口 USART1 初始化
USART1_Configuration();
while (1) {
// 主循环逻辑
}
}
// RCC 时钟配置函数
void RCC_Configulation() {
// 开启 TIM2 和 USART1 的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // TIM2 位于 APB1 总线[^1]
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // USART1 和 PA 位于 APB2 总线[^2]
// 如果使用外部晶振作为系统时钟,则在此处进行进一步配置
}
// GPIO 配置函数
void GPIO_Configuration() {
GPIO_InitTypeDef GPIO_InitStructure;
// 配置 TIM2 的通道输出引脚(假设使用 TIM2_CH1 -> 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);
// 配置 USART1 的 TX/RX 引脚(PA9/PA10)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
// TIM2 初始化函数
void TIM2_Configuration() {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 填充 TIM2 参数结构体
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 预分频值,假设系统时钟为 72 MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数方向向上
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 使能 TIM2 并开启中断(如果需要)
TIM_Cmd(TIM2, ENABLE);
NVIC_EnableIRQ(TIM2_IRQn);
}
// USART1 初始化函数
void USART1_Configuration() {
USART_InitTypeDef USART_InitStruct;
// 填充 USART1 参数结构体
USART_StructInit(&USART_InitStruct);
USART_InitStruct.USART_BaudRate = 9600; // 波特率为 9600 bps
USART_InitStruct.USART_WordLength = USART_WordLength_8b; // 数据字长为 8 位
USART_InitStruct.USART_StopBits = USART_StopBits_1; // 停止位为 1
USART_InitStruct.USART_Parity = USART_Parity_No; // 无奇偶校验
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 关闭硬件流控
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 接收和发送模式均启用
USART_Init(USART1, &USART_InitStruct);
// 使能 USART1
USART_Cmd(USART1, ENABLE);
}
```
---
#### 代码解释
1. **RCC 时钟配置**
- `RCC_APB1PeriphClockCmd` 函数用于启动 TIM2 的时钟,因为 TIM2 连接至 APB1 总线[^1]。
- `RCC_APB2PeriphClockCmd` 函数则负责启动 USART1 和 GPIOA 的时钟,它们连接到 APB2 总线[^2]。
2. **GPIO 配置**
- 对于 TIM2 的通道输出引脚(例如 PA0),将其配置为复用推挽输出模式。
- 对于 USART1 的 TX 和 RX 引脚(PA9 和 PA10),同样采用复用推挽输出模式。
3. **TIM2 初始化**
- 设定自动重装载值 (`TIM_Period`) 和预分频值 (`TIM_Prescaler`) 来控制计数值和频率。
- 默认情况下,计数器以向上的方向运行,并可通过中断触发事件处理程序。
4. **USART1 初始化**
- 配置波特率、数据帧格式以及其他通信属性。
- 最终通过调用 `USART_Cmd` 函数来激活 USART1 功能。
---
#### 注意事项
- 上述代码假定了系统的主时钟频率为 72 MHz。如果实际应用中使用的时钟不同,请调整相应的预分频值和其他时间相关参数。
- 若要扩展功能,可以考虑加入 DMA 控制传输或更复杂的错误检测机制。
---
阅读全文
相关推荐



















