STM32F103C8T6基本库超声波代码
时间: 2025-05-04 09:46:37 浏览: 34
<think>好的,用户需要STM32F103C8T6使用标准外设库实现超声波测距的代码示例。首先,我得回忆一下超声波模块的工作原理,通常是Trig触发测距,Echo接收回波。STM32需要配置GPIO和定时器。
用户提到的是标准外设库,也就是StdPeriph库,所以应该使用传统的寄存器配置方式,而不是HAL库。接下来,我需要考虑如何配置Trig引脚为输出,Echo引脚为输入,可能还需要外部中断或者输入捕获来测量高电平时间。
定时器的配置是关键,需要计算回波高电平的时间,进而得到距离。可能使用输入捕获功能,或者简单的GPIO中断配合定时器计数。需要设置定时器的时钟频率,比如72MHz,分频后计算时间精度。
还需要考虑代码的结构,初始化函数、触发信号、时间测量和距离计算。可能还需要处理超时情况,避免程序卡死。此外,用户可能需要示例代码的结构,比如主循环中触发测距,然后读取距离。
需要检查是否有常见的错误点,比如Trig信号的持续时间是否符合模块要求(通常10us以上),Echo信号的高电平时间测量是否正确。同时,注意定时器的溢出问题,可能需要处理中断或者增加溢出计数。
最后,生成相关问题,帮助用户深入理解,比如温度补偿、不同模块的驱动差异、滤波方法以及定时器模式的比较。确保回答结构清晰,代码正确,并符合标准外设库的写法。</think>### STM32F103C8T6超声波测距实现示例(标准外设库)
#### 硬件连接
- Trig引脚:PA1(输出)
- Echo引脚:PA2(输入)
- 超声波模块:HC-SR04(5V供电)
#### 代码实现
```c
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
#define TRIG_PIN GPIO_Pin_1
#define ECHO_PIN GPIO_Pin_2
#define GPIO_PORT GPIOA
volatile uint32_t capture_value = 0;
volatile uint8_t capture_flag = 0;
void GPIO_Config(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// Trig引脚配置(输出)
GPIO_InitStructure.GPIO_Pin = TRIG_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_PORT, &GPIO_InitStructure);
// Echo引脚配置(输入)
GPIO_InitStructure.GPIO_Pin = ECHO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIO_PORT, &GPIO_InitStructure);
}
void TIM3_Config(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// 定时器基础配置
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 72-1; // 1MHz计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// 输入捕获配置
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
}
float Get_Distance(void) {
// 发送触发信号
GPIO_SetBits(GPIO_PORT, TRIG_PIN);
delay_us(20);
GPIO_ResetBits(GPIO_PORT, TRIG_PIN);
// 等待回波信号
while(GPIO_ReadInputDataBit(GPIO_PORT, ECHO_PIN) == RESET);
TIM3->CNT = 0;
while(GPIO_ReadInputDataBit(GPIO_PORT, ECHO_PIN) == SET);
capture_value = TIM3->CNT;
// 计算距离(单位:cm)
return (capture_value * 340.0) / (2 * 10000);
}
int main(void) {
SystemInit();
GPIO_Config();
TIM3_Config();
while(1) {
float distance = Get_Distance();
delay_ms(200); // 测量间隔
}
}
```
#### 关键点说明
1. 定时器配置:使用TIM3实现微秒级计时,预分频设置为72-1(72MHz主频下分频得到1MHz计数频率)
2. 距离计算公式:$$ \text{距离} = \frac{\text{高电平时间} \times \text{声速}}{2} $$,其中声速按340m/s计算
3. 触发信号需要保持至少10us高电平,实际使用20us更可靠[^1]
阅读全文
相关推荐

















