fputc重复定义——你在main.cusart.c里都写了fputc函数。

🔴 问题原因

你在main.c/* USER CODE BEGIN 0 */区域里写了:

c

#include <stdio.h>
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
  return ch;
}

同时,usart.c文件里在/* USER CODE BEGIN 1 */区域也可能有相同的fputc定义(或者CubeMX自动生成过)。

✅ 解决方案

方案1:注释掉main.c里的fputc(推荐)

main.c中找到fputc函数,把它注释掉:

c

// #include <stdio.h>
// int fputc(int ch, FILE *f)
// {
//   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
//   return ch;
// }

方案2:确保usart.c里有fputc

打开usart.c文件,在/* USER CODE BEGIN 1 */区域检查是否有fputc。如果没有,可以加上:

c

/* USER CODE BEGIN 1 */
#include <stdio.h>
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
  return ch;
}
/* USER CODE END 1 */

方案3:最简单的修复

直接把main.c里的#include <stdio.h>fputc函数删掉,因为usart.c里已经有了。

📝 修改后的main.c(只删掉fputc部分)

/* USER CODE BEGIN 0 */区域,只保留:

c

// 用于存储捕获时间和状态的全局变量
static uint32_t ic_rising_tick = 0;
static uint32_t ic_falling_tick = 0;
static uint8_t ic_capture_complete = 0;
static uint8_t ic_capture_state = 0; // 0: 等待上升沿, 1: 等待下降沿

// 微秒级延时函数
void delay_us(uint32_t us)
{
    us = us * 20;  // 168MHz下粗略估算:1us ≈ 20个空循环
    while(us--)
    {
        __NOP();  // 空操作
    }
}

// 发送Trig触发信号
void HCSR04_Trigger(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
    delay_us(20);  // 触发脉冲 >10us
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
}

// 定时器输入捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM9)
    {
        if (ic_capture_state == 0) // 捕获到上升沿
        {
            ic_rising_tick = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
            ic_capture_state = 1;
        }
        else if (ic_capture_state == 1) // 捕获到下降沿
        {
            ic_falling_tick = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
            ic_capture_state = 0;
            ic_capture_complete = 1;
        }
    }
}

// 注意:这里不要写fputc!因为usart.c里已经有了

删掉后重新编译,应该就能通过了!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐