报错:./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 );
}