feat: add STM32 four-channel weighing firmware
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
PROJECT_XML := ../src/Project/Project.uvprojx
|
||||
BUILD_DIR := build
|
||||
TARGET := $(BUILD_DIR)/V2.1_260709_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 stm32f103rc.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) stm32f103rc.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 = 256K
|
||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 48K
|
||||
}
|
||||
|
||||
_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) }
|
||||
}
|
||||
Reference in New Issue
Block a user