makefile 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. # DECLARATIONS
  2. # Directory where QEMU_STM32 ARM executable is located - used for running
  3. # program in emulator.
  4. QEMU_ARM_DIR ?=
  5. # OpenOCD interface file used for programming/debugging the micronctroller
  6. OPENOCD_INTERFACE ?= interface/olimex-arm-usb-tiny-h.cfg
  7. # Declare command line tools - assume these are in the path
  8. CC = arm-none-eabi-gcc
  9. LD = arm-none-eabi-ld
  10. AS = arm-none-eabi-as
  11. CP = arm-none-eabi-objcopy
  12. OD = arm-none-eabi-objdump
  13. # Declare command line flags
  14. CORE_CFLAGS = -I./ -I$(CORE_SRC) -I$(DEVICE_SRC) -I$(STD_PERIPH)/inc -Idemos/common -fno-common -O0 -g -mcpu=cortex-m3 -mthumb
  15. CFLAGS = $(CORE_CFLAGS) -c
  16. CFLAGS_LINK = -Wl,-Tdemos/main.ld -nostartfiles $(CORE_CFLAGS)
  17. ASFLAGS = -mcpu=cortex-m3 -mthumb -g
  18. LDFLAGS = -Tdemos/main.ld
  19. CPFLAGS = -Obinary
  20. ODFLAGS = -S
  21. # Declare library source paths
  22. SRC = $(realpath .)
  23. CORE_SRC = $(SRC)/libraries/CMSIS/CM3/CoreSupport
  24. DEVICE_SRC = $(SRC)/libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x
  25. STD_PERIPH = $(SRC)/libraries/STM32F10x_StdPeriph_Driver
  26. STD_PERIPH_SRC = $(STD_PERIPH)/src
  27. # List common and system library source files
  28. # (i.e. for accessing STM32/Cortex M3 hardware)
  29. COMMON_FILES = $(CORE_SRC)/core_cm3.c
  30. COMMON_FILES += $(DEVICE_SRC)/system_stm32f10x.c
  31. COMMON_FILES += $(DEVICE_SRC)/startup/gcc_ride7/startup_stm32f10x_md.s
  32. COMMON_FILES += demos/common/stm32_p103.c
  33. COMMON_FILES += demos/common/myprintk.c
  34. COMMON_FILES += $(STD_PERIPH_SRC)/stm32f10x_rcc.c
  35. COMMON_FILES += $(STD_PERIPH_SRC)/stm32f10x_gpio.c
  36. COMMON_FILES += $(STD_PERIPH_SRC)/stm32f10x_usart.c
  37. COMMON_FILES += $(STD_PERIPH_SRC)/stm32f10x_exti.c
  38. COMMON_FILES += $(STD_PERIPH_SRC)/stm32f10x_adc.c
  39. COMMON_FILES += $(STD_PERIPH_SRC)/stm32f10x_tim.c
  40. COMMON_FILES += $(STD_PERIPH_SRC)/stm32f10x_rtc.c
  41. COMMON_FILES += $(STD_PERIPH_SRC)/stm32f10x_dac.c
  42. COMMON_FILES += $(STD_PERIPH_SRC)/misc.c
  43. # List all demos
  44. DEMOS = printf_demo
  45. DEMOS += systick
  46. # List all demo folders
  47. DEMO_FOLDERS = $(addprefix demos/,$(DEMOS))
  48. # List FreeRTOS resources
  49. FREE_RTOS_SRC = $(SRC)/libraries/FreeRTOS
  50. FREE_RTOS_SRC_FILES = $(FREE_RTOS_SRC)/croutine.c $(FREE_RTOS_SRC)/list.c $(FREE_RTOS_SRC)/queue.c $(FREE_RTOS_SRC)/tasks.c $(FREE_RTOS_SRC)/croutine.c $(FREE_RTOS_SRC)/stream_buffer.c $(FREE_RTOS_SRC)/portable/GCC/ARM_CM3/port.c
  51. FREE_RTOS_INC = $(FREE_RTOS_SRC)/include/
  52. FREE_RTOS_PORT_INC = $(FREE_RTOS_SRC)/portable/GCC/ARM_CM3/
  53. # List path to demo build output files
  54. OUTPUT_FILES = $(addsuffix /main,$(DEMO_FOLDERS))
  55. ELF_FILES = $(addsuffix .elf,$(OUTPUT_FILES))
  56. LIST_FILES = $(addsuffix .list,$(OUTPUT_FILES))
  57. BIN_FILES = $(addsuffix .bin,$(OUTPUT_FILES))
  58. # Declare target names for each demo
  59. ALL_TARGETS = $(addsuffix _ALL,$(DEMOS))
  60. PROG_TARGETS = $(addsuffix _PROG,$(DEMOS))
  61. QEMU_RUN_TARGETS = $(addsuffix _QEMURUN,$(DEMOS))
  62. QEMU_RUN_PTY_TARGETS = $(addsuffix _QEMURUN_PTY,$(DEMOS))
  63. QEMU_RUN_TEL_TARGETS = $(addsuffix _QEMURUN_TEL,$(DEMOS))
  64. QEMU_DBG_TARGETS = $(addsuffix _QEMUDBG,$(DEMOS))
  65. QEMU_DBG_PTY_TARGETS = $(addsuffix _QEMUDBG_PTY,$(DEMOS))
  66. QEMU_DBG_TEL_TARGETS = $(addsuffix _QEMUDBG_TEL,$(DEMOS))
  67. # TARGETS - See README for descriptions of the targets
  68. # Generic targets
  69. .PHONY: clean $(ALL_TARGETS) $(PROG_TARGETS) openocd_dbg
  70. all: $(ALL_TARGETS)
  71. clean:
  72. find . -type f -name "*.o" -exec rm {} \;
  73. find . -type f -name "*.elf" -exec rm {} \;
  74. find . -type f -name "*.bin" -exec rm {} \;
  75. find . -type f -name "*.list" -exec rm {} \;
  76. # Compile targets (builds all output files)
  77. $(ALL_TARGETS): %_ALL : demos/%/main.elf demos/%/main.bin demos/%/main.list
  78. # Targets to program a microntroller using OpenOCD
  79. $(PROG_TARGETS): %_PROG : %_ALL
  80. -killall -q openocd
  81. openocd -f $(OPENOCD_INTERFACE) -f openocd/openocd_stm32_p103.cfg -c "program_flash demos/$*/main.bin"
  82. # Target to launch OpenOCD - by default, OpenOCD creates a GDB server at port 3333.
  83. DBG:
  84. -killall -q openocd
  85. openocd -f $(OPENOCD_INTERFACE) -f openocd/openocd_stm32_p103.cfg -c "init_stm32"
  86. # QEMU run targets
  87. $(QEMU_RUN_TARGETS): %_QEMURUN : %_ALL
  88. -killall -q qemu-system-arm
  89. $(QEMU_ARM_DIR)qemu-system-arm -M stm32-p103 -kernel demos/$*/main.bin
  90. $(QEMU_RUN_PTY_TARGETS): %_QEMURUN_PTY : %_ALL
  91. -killall -q qemu-system-arm
  92. $(QEMU_ARM_DIR)qemu-system-arm -M stm32-p103 -kernel demos/$*/main.bin -serial pty
  93. $(QEMU_RUN_TEL_TARGETS): %_QEMURUN_TEL : %_ALL
  94. -killall -q qemu-system-arm
  95. $(QEMU_ARM_DIR)qemu-system-arm -M stm32-p103 -kernel demos/$*/main.bin -serial tcp::7777,server
  96. # QEMU debug targets
  97. $(QEMU_DBG_TARGETS): %_QEMUDBG : %_ALL
  98. -killall -q qemu-system-arm
  99. $(QEMU_ARM_DIR)qemu-system-arm -M stm32-p103 -gdb tcp::3333 -S -kernel demos/$*/main.bin
  100. $(QEMU_DBG_PTY_TARGETS): %_QEMUDBG_PTY : %_ALL
  101. -killall -q qemu-system-arm
  102. $(QEMU_ARM_DIR)qemu-system-arm -M stm32-p103 -gdb tcp::3333 -S -kernel demos/$*/main.bin -serial pty
  103. $(QEMU_DBG_TEL_TARGETS): %_QEMUDBG_TEL : %_ALL
  104. -killall -q qemu-system-arm
  105. $(QEMU_ARM_DIR)qemu-system-arm -M stm32-p103 -gdb tcp::3333 -S -kernel demos/$*/main.bin -serial tcp::7777,server
  106. # Note: Use this command to run QEMU in low-level debug mode:
  107. # qemu-system-arm -cpu cortex-m3 -M stm32-p103 -nographic -singlestep -kernel main.bin -d in_asm,out_asm,exec,cpu,int,op,op_opt
  108. # Compile targets to build individual files
  109. $(LIST_FILES): %.list : %.elf
  110. $(OD) $(ODFLAGS) $< > $@
  111. $(BIN_FILES): %.bin : %.elf
  112. $(CP) $(CPFLAGS) $< $@
  113. # Targets to build individual demos
  114. demos/blink_flash/main.elf: demos/blink_flash/main.c
  115. demos/blink_flash/main.elf: $(STD_PERIPH_SRC)/stm32f10x_rcc.c
  116. demos/blink_flash/main.elf: $(STD_PERIPH_SRC)/stm32f10x_gpio.c
  117. demos/blink_flash/main.elf: $(COMMON_FILES)
  118. $(CC) $(CFLAGS_LINK) -Idemos/blink_flash/ -o $@ $^
  119. demos/blink_flash_asm/main.elf: demos/blink_flash_asm/main.o
  120. $(LD) $(LDFLAGS) -o $@ $<
  121. demos/blink_flash_asm/main.o: demos/blink_flash_asm/main.s
  122. $(AS) $(ASFLAGS) -o $@ $<
  123. demos/adc_single/main.elf: demos/adc_single/main.c
  124. demos/adc_single/main.elf: $(COMMON_FILES)
  125. $(CC) $(CFLAGS_LINK) -Idemos/adc_single/ -o $@ $^
  126. demos/button/main.elf: demos/button/main.c
  127. demos/button/main.elf: $(COMMON_FILES)
  128. $(CC) $(CFLAGS_LINK) -Idemos/button/ -o $@ $^
  129. demos/button_int/main.elf: demos/button_int/main.c
  130. demos/button_int/main.elf: $(COMMON_FILES)
  131. $(CC) $(CFLAGS_LINK) -Idemos/button_int/ -o $@ $^
  132. demos/button_int_infinite/main.elf: demos/button_int/main.c
  133. demos/button_int_infinite/main.elf: $(COMMON_FILES)
  134. $(CC) -DDO_NOT_CLEAR_IT_PENDING_FLAG $(CFLAGS_LINK) -Idemos/button_int/ -o $@ $^
  135. demos/c_mem_model/main.o: demos/c_mem_model/main.c
  136. $(CC) $(CFLAGS_LINK) -Idemos/c_mem_model/ -c -o $@ $^
  137. demos/c_mem_model/main.elf: demos/c_mem_model/main.o
  138. demos/c_mem_model/main.elf: $(COMMON_FILES)
  139. $(CC) $(CFLAGS_LINK) -Idemos/c_mem_model/ -o $@ $^
  140. demos/freertos_singlethread/main.elf: demos/freertos_singlethread/main.c
  141. demos/freertos_singlethread/main.elf: $(COMMON_FILES)
  142. demos/freertos_singlethread/main.elf: $(FREE_RTOS_SRC_FILES)
  143. demos/freertos_singlethread/main.elf: $(FREE_RTOS_SRC)/portable/MemMang/heap_1.c
  144. $(CC) $(CFLAGS_LINK) -Idemos/freertos_singlethread/ -I$(FREE_RTOS_INC) -I$(FREE_RTOS_PORT_INC) -o $@ $^
  145. demos/freertos_multithread/main.elf: demos/freertos_multithread/main.c
  146. demos/freertos_multithread/main.elf: $(COMMON_FILES)
  147. demos/freertos_multithread/main.elf: $(FREE_RTOS_SRC_FILES)
  148. demos/freertos_multithread/main.elf: $(FREE_RTOS_SRC)/portable/MemMang/heap_1.c
  149. $(CC) $(CFLAGS_LINK) -Idemos/freertos_multithread/ -I$(FREE_RTOS_INC) -I$(FREE_RTOS_PORT_INC) -o $@ $^
  150. demos/freertos_streambuffer/main.elf: demos/freertos_streambuffer/main.c
  151. demos/freertos_streambuffer/main.elf: $(COMMON_FILES)
  152. demos/freertos_streambuffer/main.elf: $(FREE_RTOS_SRC_FILES)
  153. demos/freertos_streambuffer/main.elf: $(FREE_RTOS_SRC)/portable/MemMang/heap_1.c
  154. $(CC) $(CFLAGS_LINK) -Idemos/freertos_streambuffer/ -I$(FREE_RTOS_INC) -I$(FREE_RTOS_PORT_INC) -o $@ $^
  155. demos/qemu_test/main.elf: demos/qemu_test/main.c
  156. demos/qemu_test/main.elf: $(COMMON_FILES)
  157. $(CC) $(CFLAGS_LINK) -Idemos/qemu_test/ -o $@ $^
  158. demos/software_int/main.elf: demos/software_int/main.c
  159. demos/software_int/main.elf: $(COMMON_FILES)
  160. $(CC) $(CFLAGS_LINK) -Idemos/software_int/ -o $@ $^
  161. demos/stkalign/main.elf: demos/stkalign/main.c
  162. demos/stkalign/main.elf: $(COMMON_FILES)
  163. $(CC) $(CFLAGS_LINK) -Idemos/stkalign/ -o $@ $^
  164. demos/systick/main.elf: demos/systick/main.c
  165. demos/systick/main.elf: $(COMMON_FILES)
  166. $(CC) $(CFLAGS_LINK) -Idemos/systick/ -o $@ $^
  167. demos/timer/main.elf: demos/timer/main.c
  168. demos/timer/main.elf: $(COMMON_FILES)
  169. $(CC) $(CFLAGS_LINK) -Idemos/timer/ -o $@ $^
  170. demos/uart_echo/main.elf: demos/uart_echo/main.c
  171. demos/uart_echo/main.elf: $(COMMON_FILES)
  172. $(CC) $(CFLAGS_LINK) -Idemos/uart_echo/ -o $@ $^
  173. demos/printf_demo/main.elf: demos/printf_demo/main.c
  174. demos/printf_demo/main.elf: $(COMMON_FILES)
  175. $(CC) $(CFLAGS_LINK) -Idemos/printf_demo/ -o $@ $^
  176. demos/uart_repeat_write/main.elf: demos/uart_repeat_write/main.c
  177. demos/uart_repeat_write/main.elf: $(COMMON_FILES)
  178. $(CC) $(CFLAGS_LINK) -Idemos/uart_repeat_write/ -o $@ $^
  179. demos/uart_echo_int/main.elf: demos/uart_echo_int/main.c
  180. demos/uart_echo_int/main.elf: $(COMMON_FILES)
  181. $(CC) $(CFLAGS_LINK) -Idemos/uart_echo_int/ -o $@ $^
  182. demos/uart_repeat_write_int/main.elf: demos/uart_repeat_write_int/main.c
  183. demos/uart_repeat_write_int/main.elf: $(COMMON_FILES)
  184. $(CC) $(CFLAGS_LINK) -Idemos/uart_repeat_write_int/ -o $@ $^
  185. demos/dac/main.elf: demos/dac/main.c
  186. demos/dac/main.elf: $(COMMON_FILES)
  187. $(CC) $(CFLAGS_LINK) -Idemos/dac/ -o $@ $^
  188. demos/rtc/main.elf: demos/rtc/main.c
  189. demos/rtc/main.elf: $(COMMON_FILES)
  190. $(CC) $(CFLAGS_LINK) -Idemos/rtc/ -o $@ $^
  191. demos/freertos_semaphore1/main.elf: demos/freertos_semaphore1/main.c
  192. demos/freertos_semaphore1/main.elf: $(COMMON_FILES)
  193. demos/freertos_semaphore1/main.elf: $(FREE_RTOS_SRC_FILES)
  194. demos/freertos_semaphore1/main.elf: $(FREE_RTOS_SRC)/portable/MemMang/heap_1.c
  195. $(CC) $(CFLAGS_LINK) -Idemos/freertos_semaphore1/ -I$(FREE_RTOS_INC) -I$(FREE_RTOS_PORT_INC) -o $@ $^
  196. demos/freertos_cycletask/main.elf: demos/freertos_cycletask/main.c
  197. demos/freertos_cycletask/main.elf: $(COMMON_FILES)
  198. demos/freertos_cycletask/main.elf: $(FREE_RTOS_SRC_FILES)
  199. demos/freertos_cycletask/main.elf: $(FREE_RTOS_SRC)/portable/MemMang/heap_1.c
  200. $(CC) $(CFLAGS_LINK) -Idemos/freertos_cycletask/ -I$(FREE_RTOS_INC) -I$(FREE_RTOS_PORT_INC) -o $@ $^