stm32f103vct6超声波测距cubemx配置和LL库详细代码
时间: 2023-08-22 09:07:24 浏览: 169
对于STM32F103VCT6的超声波测距,你可以使用Cubemx进行配置,并使用STM32的LL库编写代码。下面是一个简单的示例代码,演示了如何使用超声波传感器测量距离:
首先,你需要使用Cubemx进行硬件配置。确保你已经正确连接了超声波传感器到STM32F103VCT6的GPIO引脚。
接下来,打开Cubemx并进行以下配置:
1. 在Pinout & Configuration选项卡中,选择合适的GPIO引脚来连接超声波传感器的触发引脚和回响引脚。
2. 在Configuration选项卡中,选择UART模式,并配置UART参数,以便与超声波传感器进行通信。确保波特率设置正确。
3. 在Configuration选项卡中,选择TIM模式,并配置TIM参数,以便生成适当的触发信号来激活超声波传感器。
完成配置后,生成代码并导出到工程中。
在生成的工程中,打开main.c文件,并在while(1)循环中添加以下代码:
```c
#include "main.h"
#include "stm32f1xx_ll_gpio.h"
#include "stm32f1xx_ll_tim.h"
#include "stm32f1xx_ll_usart.h"
// 定义超声波传感器触发和回响引脚
#define TRIG_PIN LL_GPIO_PIN_0
#define ECHO_PIN LL_GPIO_PIN_1
// 定义UART句柄
UART_HandleTypeDef huart1;
// 定义距离变量
volatile uint32_t distance = 0;
// 初始化函数
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_TIM2_Init(void);
// 超声波传感器触发函数
void trigger(void) {
LL_GPIO_SetOutputPin(GPIOA, TRIG_PIN); // 持续一段时间的高电平
LL_TIM_EnableCounter(TIM2); // 开始计数
}
// 超声波传感器回响函数
void echo(void) {
LL_TIM_DisableCounter(TIM2); // 停止计数
distance = LL_TIM_GetCounter(TIM2); // 获取计数值
LL_TIM_SetCounter(TIM2, 0); // 重置计数器
}
int main(void) {
// 系统初始化
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_TIM2_Init();
// 启动定时器2
LL_TIM_EnableCounter(TIM2);
while (1) {
// 发送触发信号
trigger();
// 短暂延时,等待回响信号稳定
HAL_Delay(10);
// 接收回响信号
echo();
// 将距离通过UART发送出去
char buffer[10];
sprintf(buffer, "%lu\r\n", distance);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
// 延时一段时间
HAL_Delay(500);
}
}
// 系统时钟配置
void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
Error_Handler();
}
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
// GPIO初始化
void MX_GPIO_Init(void) {
LL_GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = TRIG_PIN;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = ECHO_PIN;
GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// UART初始化
void MX_USART1_UART_Init(void) {
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_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK) {
Error_Handler();
}
}
// 定时器初始化
void MX_TIM2_Init(void) {
LL_TIM_InitTypeDef TIM_InitStruct;
__HAL_RCC_TIM2_CLK_ENABLE();
TIM_InitStruct.Prescaler = 0;
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = UINT16_MAX;
TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
LL_TIM_Init(TIM2, &TIM_InitStruct);
LL_TIM_SetTriggerOutput(TIM2, LL_TIM_TRGO_UPDATE);
}
```
这个例子中,我们使用了定时器2来测量回响信号的脉冲宽度。当触发信号发送后,定时器开始计数,当回响信号到达时,定时器停止计数,并将计数值存储在distance变量中。然后,我们通过UART将距离值发送到串口终端。
请注意,这只是一个简单的示例代码,你可能需要根据你的具体需要进行修改和优化。另外,确保你已经正确配置了硬件连接,并正确选择了GPIO引脚和定时器。
希望这能帮助到你!如有任何问题,请随时提问。
阅读全文