使用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 按照上图编写代码
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) {
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: 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: falling_cnt = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); capture_state = 0;
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 编译和烧录
3.2 硬件连接与结果
STM32 |
超声波模块 |
5V |
VCC |
PA9 |
Trig |
PA8 |
Echo |
- |
Out |
GND |
GND |
超声波模块工作在5v,需要连接5V电源,如果连接3.3V可能工作不正常;