fix: enable four-channel weighing in MCU2

This commit is contained in:
FinleyHsu
2026-07-28 11:10:13 +08:00
parent c2377565dc
commit d1073dc3bc
12 changed files with 2117 additions and 2335 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,76 @@
PROJECT_XML := ../src/Project/Project.uvproj
BUILD_DIR := build
TARGET := $(BUILD_DIR)/MCU2_V2.1_260728_4CH
CC := arm-none-eabi-gcc
OBJCOPY := arm-none-eabi-objcopy
SIZE := arm-none-eabi-size
C_SOURCES := $(filter-out ../src/CMSIS/core_cm3.c,$(shell perl extract_sources.pl $(PROJECT_XML)))
S_SOURCES := startup_stm32f10x_hd_gcc.S
OBJECTS := $(patsubst ../src/%.c,$(BUILD_DIR)/%.o,$(C_SOURCES))
OBJECTS += $(BUILD_DIR)/gcc_syscalls.o
OBJECTS += $(BUILD_DIR)/startup_stm32f10x_hd_gcc.o
INCLUDES := \
-I../src/USER -I../src/CORE -I../src/CMSIS \
-I../src/SYSTEM/delay -I../src/SYSTEM/debug -I../src/SYSTEM/usart \
-I../src/STM32F10x_FWLib/inc \
-I../src/HARDWARE/LED -I../src/HARDWARE/KEY -I../src/HARDWARE/LCD \
-I../src/HARDWARE/24CXX -I../src/HARDWARE/FLASH -I../src/HARDWARE/IIC \
-I../src/HARDWARE/SPI -I../src/HARDWARE/BUZZER -I../src/HARDWARE/RFID \
-I../src/HARDWARE/EXTI -I../src/HARDWARE/TIMER \
-I../src/HARDWARE/UltrasonicWave -I../src/HARDWARE/USART \
-I../src/HARDWARE/GPS -I../src/HARDWARE/GSM -I../src/HARDWARE/QR_Code \
-I../src/HARDWARE/DEVICE -I../src/HARDWARE/NTC_ADC -I../src/HARDWARE/WDG \
-I../src/HARDWARE/SCALE -I../src/HARDWARE/ElectronicLock \
-I../src/HARDWARE/MOTOR -I../src/HARDWARE/AUDIO -I../src/HARDWARE/OPTO_SWITCH \
-I../src/HARDWARE/IR_Distancer -I../src/HARDWARE/RS485 \
-I../src/HARDWARE/STMFLASH -I../src/HARDWARE/Disinfection
ARCH_FLAGS := -mcpu=cortex-m3 -mthumb
DEFINES := -DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER -Dsignal=gsm_signal_strength
WARNINGS := -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable \
-Wno-unused-but-set-variable -Wno-sign-compare -Wno-implicit-int \
-Wno-unknown-pragmas -Wno-format
CFLAGS := $(ARCH_FLAGS) -std=gnu99 -Os -g3 -ffunction-sections -fdata-sections \
-fcommon -fno-strict-aliasing -fno-builtin -include gcc_compat.h $(DEFINES) $(INCLUDES) $(WARNINGS)
ASFLAGS := $(ARCH_FLAGS) -x assembler-with-cpp -g3
LDFLAGS := $(ARCH_FLAGS) -T stm32f103ve.ld -Wl,--gc-sections \
-Wl,-Map=$(TARGET).map,--cref -Wl,--print-memory-usage \
--specs=nano.specs --specs=nosys.specs -u _printf_float
LDLIBS := -Wl,--start-group -lc -lm -Wl,--end-group
.PHONY: all clean verify
all: $(TARGET).hex $(TARGET).bin
$(SIZE) $(TARGET).elf
$(TARGET).elf: $(OBJECTS) stm32f103ve.ld | $(BUILD_DIR)
$(CC) $(OBJECTS) $(LDFLAGS) $(LDLIBS) -o $@
$(TARGET).hex: $(TARGET).elf
$(OBJCOPY) -O ihex $< $@
$(TARGET).bin: $(TARGET).elf
$(OBJCOPY) -O binary $< $@
$(BUILD_DIR)/%.o: ../src/%.c gcc_compat.h
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -MMD -MP -c $< -o $@
$(BUILD_DIR)/startup_stm32f10x_hd_gcc.o: startup_stm32f10x_hd_gcc.S
@mkdir -p $(dir $@)
$(CC) $(ASFLAGS) -c $< -o $@
$(BUILD_DIR)/gcc_syscalls.o: gcc_syscalls.c gcc_compat.h
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -MMD -MP -c $< -o $@
$(BUILD_DIR):
mkdir -p $@
clean:
rm -rf $(BUILD_DIR)
-include $(OBJECTS:.o=.d)
@@ -0,0 +1,13 @@
#!/usr/bin/env perl
use strict;
use warnings;
my $project = shift @ARGV or die "usage: $0 Project.uvprojx\n";
open my $fh, '<', $project or die "cannot open $project: $!\n";
while (my $line = <$fh>) {
next unless $line =~ m{<FilePath>\.\.\\(.+\.c)</FilePath>};
my $path = $1;
$path =~ s{\\}{/}g;
print "../src/$path ";
}
close $fh;
@@ -0,0 +1,12 @@
#ifndef GCC_COMPAT_H
#define GCC_COMPAT_H
#ifndef __align
#define __align(n) __attribute__((aligned(n)))
#endif
#ifndef __packed
#define __packed __attribute__((packed))
#endif
#endif
@@ -0,0 +1,17 @@
#include "stm32f10x.h"
int _write(int file, char *data, int length)
{
int index;
(void)file;
for (index = 0; index < length; ++index)
{
while (USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET)
{
}
USART_SendData(UART5, (uint8_t)data[index]);
}
return length;
}
@@ -0,0 +1,201 @@
.syntax unified
.cpu cortex-m3
.thumb
.global g_pfnVectors
.global Reset_Handler
.extern SystemInit
.extern main
.extern __libc_init_array
.section .isr_vector,"a",%progbits
.type g_pfnVectors, %object
g_pfnVectors:
.word _estack
.word Reset_Handler
.word NMI_Handler
.word HardFault_Handler
.word MemManage_Handler
.word BusFault_Handler
.word UsageFault_Handler
.word 0, 0, 0, 0
.word SVC_Handler
.word DebugMon_Handler
.word 0
.word PendSV_Handler
.word SysTick_Handler
.word WWDG_IRQHandler
.word PVD_IRQHandler
.word TAMPER_IRQHandler
.word RTC_IRQHandler
.word FLASH_IRQHandler
.word RCC_IRQHandler
.word EXTI0_IRQHandler
.word EXTI1_IRQHandler
.word EXTI2_IRQHandler
.word EXTI3_IRQHandler
.word EXTI4_IRQHandler
.word DMA1_Channel1_IRQHandler
.word DMA1_Channel2_IRQHandler
.word DMA1_Channel3_IRQHandler
.word DMA1_Channel4_IRQHandler
.word DMA1_Channel5_IRQHandler
.word DMA1_Channel6_IRQHandler
.word DMA1_Channel7_IRQHandler
.word ADC1_2_IRQHandler
.word USB_HP_CAN1_TX_IRQHandler
.word USB_LP_CAN1_RX0_IRQHandler
.word CAN1_RX1_IRQHandler
.word CAN1_SCE_IRQHandler
.word EXTI9_5_IRQHandler
.word TIM1_BRK_IRQHandler
.word TIM1_UP_IRQHandler
.word TIM1_TRG_COM_IRQHandler
.word TIM1_CC_IRQHandler
.word TIM2_IRQHandler
.word TIM3_IRQHandler
.word TIM4_IRQHandler
.word I2C1_EV_IRQHandler
.word I2C1_ER_IRQHandler
.word I2C2_EV_IRQHandler
.word I2C2_ER_IRQHandler
.word SPI1_IRQHandler
.word SPI2_IRQHandler
.word USART1_IRQHandler
.word USART2_IRQHandler
.word USART3_IRQHandler
.word EXTI15_10_IRQHandler
.word RTCAlarm_IRQHandler
.word USBWakeUp_IRQHandler
.word TIM8_BRK_IRQHandler
.word TIM8_UP_IRQHandler
.word TIM8_TRG_COM_IRQHandler
.word TIM8_CC_IRQHandler
.word ADC3_IRQHandler
.word FSMC_IRQHandler
.word SDIO_IRQHandler
.word TIM5_IRQHandler
.word SPI3_IRQHandler
.word UART4_IRQHandler
.word UART5_IRQHandler
.word TIM6_IRQHandler
.word TIM7_IRQHandler
.word DMA2_Channel1_IRQHandler
.word DMA2_Channel2_IRQHandler
.word DMA2_Channel3_IRQHandler
.word DMA2_Channel4_5_IRQHandler
.size g_pfnVectors, .-g_pfnVectors
.section .text.Reset_Handler,"ax",%progbits
.thumb_func
Reset_Handler:
ldr r0, =_sidata
ldr r1, =_sdata
ldr r2, =_edata
1:
cmp r1, r2
bcc 2f
b 3f
2:
ldr r3, [r0], #4
str r3, [r1], #4
b 1b
3:
ldr r1, =_sbss
ldr r2, =_ebss
movs r3, #0
4:
cmp r1, r2
bcc 5f
b 6f
5:
str r3, [r1], #4
b 4b
6:
bl SystemInit
bl __libc_init_array
bl main
7:
b 7b
.section .text.Default_Handler,"ax",%progbits
.thumb_func
Default_Handler:
b Default_Handler
.macro weak_handler name
.weak \name
.thumb_set \name, Default_Handler
.endm
weak_handler NMI_Handler
weak_handler HardFault_Handler
weak_handler MemManage_Handler
weak_handler BusFault_Handler
weak_handler UsageFault_Handler
weak_handler SVC_Handler
weak_handler DebugMon_Handler
weak_handler PendSV_Handler
weak_handler SysTick_Handler
weak_handler WWDG_IRQHandler
weak_handler PVD_IRQHandler
weak_handler TAMPER_IRQHandler
weak_handler RTC_IRQHandler
weak_handler FLASH_IRQHandler
weak_handler RCC_IRQHandler
weak_handler EXTI0_IRQHandler
weak_handler EXTI1_IRQHandler
weak_handler EXTI2_IRQHandler
weak_handler EXTI3_IRQHandler
weak_handler EXTI4_IRQHandler
weak_handler DMA1_Channel1_IRQHandler
weak_handler DMA1_Channel2_IRQHandler
weak_handler DMA1_Channel3_IRQHandler
weak_handler DMA1_Channel4_IRQHandler
weak_handler DMA1_Channel5_IRQHandler
weak_handler DMA1_Channel6_IRQHandler
weak_handler DMA1_Channel7_IRQHandler
weak_handler ADC1_2_IRQHandler
weak_handler USB_HP_CAN1_TX_IRQHandler
weak_handler USB_LP_CAN1_RX0_IRQHandler
weak_handler CAN1_RX1_IRQHandler
weak_handler CAN1_SCE_IRQHandler
weak_handler EXTI9_5_IRQHandler
weak_handler TIM1_BRK_IRQHandler
weak_handler TIM1_UP_IRQHandler
weak_handler TIM1_TRG_COM_IRQHandler
weak_handler TIM1_CC_IRQHandler
weak_handler TIM2_IRQHandler
weak_handler TIM3_IRQHandler
weak_handler TIM4_IRQHandler
weak_handler I2C1_EV_IRQHandler
weak_handler I2C1_ER_IRQHandler
weak_handler I2C2_EV_IRQHandler
weak_handler I2C2_ER_IRQHandler
weak_handler SPI1_IRQHandler
weak_handler SPI2_IRQHandler
weak_handler USART1_IRQHandler
weak_handler USART2_IRQHandler
weak_handler USART3_IRQHandler
weak_handler EXTI15_10_IRQHandler
weak_handler RTCAlarm_IRQHandler
weak_handler USBWakeUp_IRQHandler
weak_handler TIM8_BRK_IRQHandler
weak_handler TIM8_UP_IRQHandler
weak_handler TIM8_TRG_COM_IRQHandler
weak_handler TIM8_CC_IRQHandler
weak_handler ADC3_IRQHandler
weak_handler FSMC_IRQHandler
weak_handler SDIO_IRQHandler
weak_handler TIM5_IRQHandler
weak_handler SPI3_IRQHandler
weak_handler UART4_IRQHandler
weak_handler UART5_IRQHandler
weak_handler TIM6_IRQHandler
weak_handler TIM7_IRQHandler
weak_handler DMA2_Channel1_IRQHandler
weak_handler DMA2_Channel2_IRQHandler
weak_handler DMA2_Channel3_IRQHandler
weak_handler DMA2_Channel4_5_IRQHandler
.section .note.GNU-stack,"",%progbits
@@ -0,0 +1,95 @@
ENTRY(Reset_Handler)
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
}
_estack = ORIGIN(RAM) + LENGTH(RAM);
_Min_Heap_Size = 0x200;
_Min_Stack_Size = 0x400;
SECTIONS
{
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector))
. = ALIGN(4);
} > FLASH
.text :
{
. = ALIGN(4);
*(.text .text.*)
*(.rodata .rodata.*)
KEEP(*(.init))
KEEP(*(.fini))
. = ALIGN(4);
_etext = .;
} > FLASH
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > FLASH
.ARM.exidx :
{
__exidx_start = .;
*(.ARM.exidx*)
__exidx_end = .;
} > FLASH
.preinit_array :
{
PROVIDE_HIDDEN(__preinit_array_start = .);
KEEP(*(.preinit_array*))
PROVIDE_HIDDEN(__preinit_array_end = .);
} > FLASH
.init_array :
{
PROVIDE_HIDDEN(__init_array_start = .);
KEEP(*(SORT(.init_array.*)))
KEEP(*(.init_array*))
PROVIDE_HIDDEN(__init_array_end = .);
} > FLASH
.fini_array :
{
PROVIDE_HIDDEN(__fini_array_start = .);
KEEP(*(SORT(.fini_array.*)))
KEEP(*(.fini_array*))
PROVIDE_HIDDEN(__fini_array_end = .);
} > FLASH
_sidata = LOADADDR(.data);
.data :
{
. = ALIGN(4);
_sdata = .;
*(.data .data.*)
. = ALIGN(4);
_edata = .;
} > RAM AT > FLASH
.bss (NOLOAD) :
{
. = ALIGN(4);
_sbss = .;
__bss_start__ = _sbss;
*(.bss .bss.*)
*(COMMON)
. = ALIGN(4);
_ebss = .;
__bss_end__ = _ebss;
} > RAM
._user_heap_stack (NOLOAD) :
{
. = ALIGN(8);
PROVIDE(end = .);
PROVIDE(_end = .);
. += _Min_Heap_Size;
. += _Min_Stack_Size;
. = ALIGN(8);
} > RAM
/DISCARD/ : { *(.note.GNU-stack) }
}
@@ -20,7 +20,7 @@
#include "scale.h"
#define VersionNumber "V2.0_200319"
#define VersionNumber "V2.1_260728_4CH"
/*
***********************************************************************
@@ -412,8 +412,8 @@ void WeightDetectionTask(void)
{
WeightDetection1();
WeightDetection2();
// WeightDetection3();
// WeightDetection4();
WeightDetection3();
WeightDetection4();
ScaleCmdDecodeTask();
CalibrationErrorHandler();
}
@@ -9,7 +9,6 @@
#include "device.h"
#include "data_typedef.h"
#include "m_s_comm.h"
#include "gps.h"
void NVIC_Configuration(void);
void RegularUploadTask(void);
@@ -25,8 +24,8 @@ int main(void)
USART1_Init(2400); //秤2
USART2_Init(38400); //主从MCU通信接口
USART3_Init(2400); //秤1
USART4_Init(9600); //GPS
USART5_Init(115200); //秤4
USART4_Init(2400); //Scale 3
USART5_Init(2400); //秤4
TIM2_Int_Init(1000, 7200-1); //10Khz的计数频率,计数到1000为100ms (即每个周期为0.1ms
TIM3_Int_Init(100, 7200-1); //10Khz的计数频率(每个周期为0.1ms),定时10ms用于限位开关和按钮扫描
@@ -36,7 +35,6 @@ int main(void)
printf("\r\n***************System Running***************\r\n");
DeviceInit(); //硬件设备初始化
GPS_Init();
IWDG_Init(5, 625); //看门狗初始化,分频数为128,重载值为625,溢出时间为2s
@@ -49,7 +47,6 @@ int main(void)
KeysSendTask(); //按键状态发送任务
RegularUploadTask(); //定时上传任务
M_S_DataDecodeTask(); //主从机通信任务
GPS_Task(); //GPS定位处理任务
SystemExceptionTask(); //系统异常处理任务
IWDG_FeedTask(); //看门狗喂狗任务
@@ -73,14 +70,12 @@ int main(void)
void RegularUploadTask(void)
{
static timer sendDevStaTimer; //上传设备运行状态信息(温度、信号、测距)
static timer gpsOutputTimer; //gps输出定时
static uint8_t timer_ok = 0;
if(timer_ok == 0)
{
timer_ok = 1;
timer_set(&sendDevStaTimer, 5);
timer_set(&gpsOutputTimer, CLOCK_SECOND*10);
}
//设备运行状态信息上传
@@ -89,12 +84,6 @@ void RegularUploadTask(void)
timer_restart(&sendDevStaTimer);
M_S_CommandSend(0x01);
}
if(timer_expired(&gpsOutputTimer))
{
timer_restart(&gpsOutputTimer);
M_S_CommandSend(0x03);
}
}
/*