使用VSCode+CubeMx开发STM32,这里介绍分别使用串口以及SWD调试接口输出日志功能;

1.建立工程

1.1 创建项目文件

从已有的仓库中创建一个工程:

1
git clone https://github.com/makerinchina-iot/vscode_stm32cubemx_hello.git hc_sr04

使用VSCode打开工程后,需要更改如下名字:

  • 文件夹根目录下CMakeLists.txt 文件中修改工程名字为hc_sr04:
1
set(CMAKE_PROJECT_NAME hc_sr04)
  • stm32cubemx配置文件更改为 hc_sr04.ioc ,并更改以下文件名:
1
2
3
4
...
ProjectManager.ProjectFileName=hc_sr04.ioc
ProjectManager.ProjectName=hc_sr04
...
1.2 引脚配置

使用STM32CubeMx打开ioc配置文件,然后配置对应的trig引脚为输出,echo引脚为输入捕获并设置定时器参数:

2. 编写代码

2.1 模块测量时序

超声波模块测量时序如下:

2.2 按照上图编写代码
  • 发出trig信号并开启定时器进行捕获
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
__HAL_TIM_SetCounter(&htim1, 0);
__HAL_TIM_SET_CAPTUREPOLARITY(&htim1, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);

while (1)
{

// start capture
HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET);
delay_us(30);
HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET);

...

}
  • 发出Trig信号后在定时器捕获中断中计算Echo高电平时间:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
static volatile uint8_t capture_state = 0;
uint32_t rising_cnt = 0;
uint32_t falling_cnt = 0;
uint32_t echo_time = 0;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if ((htim->Instance == TIM1) && (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1))
{
switch (capture_state)
{
case 0:
// when rising edge
rising_cnt = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
capture_state = 1;
break;
case 1:
// when falling edge
falling_cnt = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
capture_state = 0;

// get pulse width
if (falling_cnt >= rising_cnt)
{
echo_time = falling_cnt - rising_cnt;
}
else
{
echo_time = (0xFFFF - rising_cnt) + falling_cnt;
}

break;
}
}
}
  • 转换为实际距离值:
1
2
3
4
5
float distance = echo_time * 0.034 / 2;

char buf[32];
float_to_string(buf, distance);
log_debug("distance result: %s cm", buf);

3.编译并烧录代码

3.1 编译和烧录
  • 点击生成按键即可编译工程;

  • 在VSCode中执行task:openocd-flash烧录;

3.2 硬件连接与结果
  • 按照如下方式连接硬件:
STM32 超声波模块
5V VCC
PA9 Trig
PA8 Echo
- Out
GND GND

超声波模块工作在5v,需要连接5V电源,如果连接3.3V可能工作不正常;

  • 程序运行后可以看到打印信息: