2401_83591674 2024-10-11 12:34 采纳率: 80.3%
浏览 365
已结题

报错make: *** [Makefile:122: build/main.elf] Error 1,如何解决?

报错:./lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: build/exti.o: in function EXTI_KEY_Init': /opt/lab/workspace/14082/76808/SYSTEM/exti/exti.c:26: undefined reference to EXTI_Init'
../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: build/main.o: in function EXTI1_IRQHandler': /opt/lab/workspace/14082/76808/USER/main.c:211: undefined reference to EXTI_GetITStatus'
../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: /opt/lab/workspace/14082/76808/USER/main.c:247: undefined reference to `EXTI_ClearITPendingBit'
collect2: error: ld returned 1 exit status
make: *** [Makefile:122: build/main.elf] Error 1

Makefile:

TARGET = main
DEBUG = 1
OPT = -Og
 
BUILD_DIR = build
PREFIX = arm-none-eabi-
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
CP = $(GCC_PATH)/$(PREFIX)objcopy
SZ = $(GCC_PATH)/$(PREFIX)size
else
CC = $(PREFIX)gcc
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
SZ = $(PREFIX)size
endif
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -S
 
C_SOURCES =  \
SYSTEM/exti/exti.c\
HARDWARE/Motor/Motor.c\
HARDWARE/Servo/Servo.c\
SYSTEM/pwm/pwm.c\
HARDWARE/MQ_Sensor/MQ_Sensor.c\
USER/main.c\
USER/stm32f10x_it.c\
USER/system_stm32f10x.c\
SYSTEM/delay/delay.c\
SYSTEM/sys/sys.c\
SYSTEM/usart/usart.c\
CORE/core_cm3.c\
STM32F10x_FWLib/src/misc.c\
STM32F10x_FWLib/src/stm32f10x_gpio.c\
STM32F10x_FWLib/src/stm32f10x_usart.c\
STM32F10x_FWLib/src/stm32f10x_rcc.c\
STM32F10x_FWLib/src/stm32f10x_tim.c\
STM32F10x_FWLib/src/stm32f10x_i2c.c\
STM32F10x_FWLib/src/stm32f10x_adc.c\
HARDWARE/LED/led.c\
HARDWARE/BEEP/beep.c\
HARDWARE/time/time.c\
HARDWARE/TFT/LCD_calculate.c\
HARDWARE/TFT/Lcd_Driver.c\
HARDWARE/DHT11/dht11.c\
HARDWARE/ADC/adc.c\
 
ASM_SOURCES =  \
startup_stm32f103xb.s
 
CPU = -mcpu=cortex-m3
 
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)
 
AS_DEFS = 
 
C_DEFS =  \
-DARM_GCC \
-DSTM32F10X_MD \
-DUSE_STDPERIPH_DRIVER\
 
AS_INCLUDES =
 
C_INCLUDES =  \
-ISYSTEM/exti\
-IHARDWARE/Motor\
-IHARDWARE/Servo\
-ISYSTEM/pwm\
-IHARDWARE/MQ_Sensor\
-IUSER\
-ICORE\
-ISTM32F10x_FWLib/inc\
-ISYSTEM/delay\
-ISYSTEM/sys\
-ISYSTEM/usart\
-IHARDWARE/LED\
-IHARDWARE/BEEP\
-IHARDWARE/IIC\
-IHARDWARE/DHT11\
-IHARDWARE/time\
-IHARDWARE/oled\
-IHARDWARE/delay\
-IHARDWARE/TFT\
-IHARDWARE/ADC\
 
ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
 
CFLAGS = -finput-charset=UTF-8 -fexec-charset=GBK $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
 
ifeq ($(DEBUG), 1)
CFLAGS += -g -gdwarf-2
CFLAGS+=-std=c11
endif
 
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
 
LDSCRIPT = STM32F103C8Tx_FLASH.ld
 
LIBS = -lc -lm -lnosys -u _printf_float -u _scanf_float
LIBDIR = 
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections
 
all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin
 
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))
# list of ASM program objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SOURCES)))
 
$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) 
    @echo build $@
    @$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@
 
$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
    @echo build $@
    @$(AS) -c $(CFLAGS) $< -o $@
 
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
    @echo build $@
    @$(CC) $(OBJECTS) $(LDFLAGS) -o $@
    @$(SZ) $@
 
$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
    $(HEX) $< $@
    
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
    $(BIN) $< $@    
    
$(BUILD_DIR):
    mkdir $@
 
clean:
    -rm -fR $(BUILD_DIR)
 
-include $(wildcard $(BUILD_DIR)/*.d)
 
 

main.c

/**
 *************************************************************************
 * @ 名称   智能家居系统实验
 * @ 版本   STD 库 V3.5.0
 * @ 描述   将 红外传感器模块接电源, 数据输出端接 STM32 模块的 PA5 端口
 *          将 蜂鸣器模块接电源,数据输入端接 STM32 模块的 PB3 端口
 *            将 DHT11传感器接电源,数据输入端接 STM32 模块的 PB1 端口
 *            将 光敏电阻接电源,数据输入端接 STM32 模块的 PA4 端口
 *            将 RGB灯 的 R通道接PB9 B通道接PB8
 *          LCD屏接线如下:
 *            SCL    ——> PB6
 *            SDA    ——> PB7
 *            RES    ——> PA15
 *            DC    ——> PB4
 *            CS    ——> PB5
 *          运行此程序,LCD屏显示各项环境信息,当有人靠近时,传感器灯点亮,蜂鸣器鸣响
 *          
 *            舵机引脚:
 *            VCC : VCC
 *            GND : GND
 *            PWM : PA3        
 *                         
 *            电机引脚:
 *            IN1 : PB15
 *            IN2 : PB14
 *            IN3 : PB13
 *            IN4 : PB12
 *            VCC : VCC
 *            GND : GND
 *            
 *            串口引脚:
 *            TX : PA10
 *            RX : PA9        
 *            
 * @ 注意  本程序只供学习使用 
 *           由于服务器性能与网络波动影响,仿真平台的实际仿真速度会慢于真实世界
 *         如果使用 printf 函数发送串口数据,不要省略 \n 符       
 *************************************************************************
*/
#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include "stm32f10x_exti.h"
 
#include <math.h>
#include <stdint.h>
#include <string.h>
#include "Servo.h"
#include "sys.h"
#include "delay.h"
#include "sys/types.h"
#include "usart.h"
#include "led.h"
#include "myiic.h"
#include "time.h"
#include "LCD_calculate.h"
#include "Lcd_Driver.h"
#include "dht11.h"
#include "adc.h"
#include "pwm.h"
#include "Servo.h"
#include "Motor.h"
#include "exti.h"
 
//光照阈值
#define lux 2200
 
//光敏电阻输入值
unsigned int lux_value = 0;
 
uint8_t mode = 0;
uint8_t i = 0;
uint8_t RxData;
 
char temp_buff[20], temp_buff2[20];
unsigned temptempdata = 0;
int main(void)
{
    u16 adcx;
    char vol[25];
    float volt = 0;
    float ppm = 0;
    char txt[32];
    char txt1[32];
    // unsigned char *dataPtr = NULL;
    // unsigned short timeCount = 300;    //发送间隔变量
 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    delay_init();                                    //延时函数初始化
    //delay_ms(500);
    TIME_Init();       //初始化定时器
    LED_Init();           //初始化RGB灯
    Lcd_Init();           // LCD屏幕初始化
    Lcd_Clear(GRAY0);  //清屏
    Redraw_Mainmenu(); //主页显示初始化
    DHT11_Init();       // DHT11温湿度
    SR_312_Init();       //人体红外传感器
    Adc_Init();           //MQ135
    PWM_Init();
    Servo_Init();
    motor_configuration();
    Serial_Init();
    EXTI_KEY_Init();
 
    while (1)
    {
        if (timecount2 > 10) // 100ms更新一次数据
        {
            timecount2 = 0;
            DHT11_Read_Data(&tempdata, &humidata); //读取温湿度值
            sprintf(txt, "%dC  ", tempdata);    //写入数据
            Gui_DrawFont_GBK16(85, 27, GREEN, BLUE, txt);//显示数据
            sprintf(txt1, "%d%%RH", humidata);    //写入数据
            Gui_DrawFont_GBK16(85, 50, GREEN, BLUE, txt1);//显示数据
 
            adcx = Get_Adc(ADC_Channel_7);        //获取MQ135数据
            volt = (float)adcx * 3.3 / 4095;    //转换为电压值
            ppm = log10(34.88*(volt-0.6)/(3.65-volt+0.6));
            ppm = pow(10, ppm/(0.3203*2));//转换为空气污染指数
            // ppm = pow(10, (log10(34.88*(volt-0.6)/(3.65-volt+0.6)))/(0.3203*2));//转换为空气污染指数
 
            // sprintf(adc, "%d ", adcx);        //写入数据
            sprintf(vol, "%0.1f ", ppm);    //写入数据
            Gui_DrawFont_GBK16(85, 73, GREEN, BLUE, vol);//显示数据
            
        }
 
        lux_value = Get_Adc(4);//获取光敏电阻数据
        //灯光
        //白天关灯
        if(lux_value < lux)
        {
            LED2 = LED_OFF;
 
            if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 1) 
            {
                Servo_SetAngle1(90);
                delay_ms(500);
                for (int i = 0 ; i <= 10; i++ )
                {
                    IN1_H;
                    delay_ms(100);
                    IN4_L;
                    delay_ms(100);
                    IN2_H;
                    delay_ms(100);
                    IN1_L;
                    delay_ms(100);
                    IN3_H;
                    delay_ms(100);
                    IN2_L;
                    delay_ms(100);
                    IN4_H;
                    delay_ms(100);
                    IN3_L;
                    delay_ms(100);
                }
            }
 
        }
        //夜晚开灯
        else
        {
            LED2 = LED_ON;                                                                 //晚上开灯
            if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == Bit_SET && timecount4 > 5) //间隔缩短到500ms监测到有人
            {
                timecount4 = 0;
                beep = 1;
                delay_ms(50);
                beep = 0;
            }
 
        }
        
        if (Serial_GetRxFlag() == 1)        //如果接收到数据包
        {
            RxData = Serial_GetRxData();
            Serial_SendByte(RxData);
            if    (RxData == 'a')                    //手机发送a,运行
            {
                Servo_SetAngle1(90);
                delay_ms(500);
                for (int i = 0 ; i <= 10; i++ )
                {
                    IN1_H;
                    delay_ms(100);
                    IN4_L;
                    delay_ms(100);
                    IN2_H;
                    delay_ms(100);
                    IN1_L;
                    delay_ms(100);
                    IN3_H;
                    delay_ms(100);
                    IN2_L;
                    delay_ms(100);
                    IN4_H;
                    delay_ms(100);
                    IN3_L;
                    delay_ms(100);
                }
            }
     
            Serial_RxFlag = 0;            //处理完成后,清零接收数据包标志位
        }
    }
}
// EXTI1 中断服务函数
void EXTI1_IRQHandler(void)
{
  static int flag = 0;
  if (EXTI_GetITStatus(EXTI_Line1) != RESET)
  { // 按键按下
    flag = ~flag; // 变量标志进行一次取反
    // 根据变量标志的值设置 LED 的亮灭
    if( flag )
        {
            mode = 1;
            if (mode == 1) 
            {
                for (i = 0; i <= 10; i++) 
                {
                    IN3_L;
                    delay_ms(100);
                    IN4_H;
                    delay_ms(100);
                    IN2_L;
                    delay_ms(100);
                    IN3_H;
                    delay_ms(100);
                    IN1_L;
                    delay_ms(100);
                    IN2_H;
                    delay_ms(100);
                    IN4_L;
                    delay_ms(100);
                    IN1_H;
                    delay_ms(100);
                }
                if (i == 10) 
                {
                    Servo_SetAngle1(0);
                    mode = 0;
                }
            }
 
        }
    EXTI_ClearITPendingBit(EXTI_Line1);
  }
}
 
 
 

exti.c

#include "exti.h"
#include "stm32f10x_conf.h"
 
 
// 将 GPIO A1 配置为外部中断
// 按键按下时,触发外部中断, LED 电平翻转一次
// 外部中断触发条件为 上升沿中断
// 外部中断初始化
void EXTI_KEY_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure; 
    NVIC_InitTypeDef NVIC_InitStructure;
    // 开启 GPIOA 的时钟
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
    // 将PA1引脚配置为下拉输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_Init(GPIOA, &GPIO_InitStructure);  
 
    // 将 EXTI 的中断线 line1 配置为 上升沿触发
    EXTI_InitStructure.EXTI_Line    = EXTI_Line1;
      EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Interrupt;    
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStructure);
    
    // 设置 EXTI1 中断的中断优先级
      NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;        
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;        
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            
      NVIC_Init(&NVIC_InitStructure);
 
    // 将 EXTI 中断线 line1 连接在 GPIO PA1 引脚上
      GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1 );
}
 
 
 

  • 写回答

1条回答 默认 最新

  • 趣享先生 优质创作者: 编程框架技术领域 2024-10-11 12:49
    关注

    这个错误是链接错误,提示找不到 EXTI_Init、EXTI_GetITStatus 和 EXTI_ClearITPendingBit 这几个函数的定义。这些函数应该是在你的代码中调用了,但链接阶段找不到对应的定义。请确认以下几点:

    EXTI_Init、EXTI_GetITStatus 和 EXTI_ClearITPendingBit 这几个函数是否在你的代码中有对应的定义,或者是否是外部引用的函数,需要链接对应的库文件。

    如果这些函数是你自己定义的,那么请确认这些函数的定义和声明是否正确,并且在链接阶段能够找到对应的实现文件。

    如果这些函数是来自外部库,那么请确认你是否链接了对应的库文件,并且库文件的路径是否正确。

    你可以检查一下以上几点,看看能否找到问题所在。如果需要进一步帮助,请提供一下 exti.c 和 main.c 中关于这几个函数的定义和调用部分的代码。

    (该回答引用于ChatGPT,如若有用,还请题主采纳!)

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月11日
  • 修改了问题 10月11日
  • 修改了问题 10月11日
  • 创建了问题 10月11日