淺談STM32CubeIDE
前面文章有寫,我上手時採用了IDE,但後來實踐中,我再也沒打開過STM32CubeIDE,原因比較多吧,
- 啓動太臃腫
- 配置複雜
- 電腦配置差
- 用着不爽
- ……
當然後兩點純粹個人原因 哈哈
實際學習中,我基本上是採用的gcc+sublime text
或者gcc+vim
。因爲我習慣這麼用了,雖然用着談不上方便,但是順手。
我的感受
可是,開始上手時,對於源碼的不瞭解,加之GCC
下只有一個HelloWorld
,讓我對TencentOS-tiny的探索之旅無所適從。所以,爲了後人乘涼,我乾脆就把我編寫好的Makefile文件和當時修改文件的思路拿出來分享給大家。
修改方法
標準Makefile的樣子
首先,我們先看看標準Makefile到底長啥樣子,這裏,我們打開board/TencentOS_tiny_EVB_MX/GCC/hello_world/Makefile
文件,分析一下里面的結構,就發現其實大部分地方不需要改動,我們只用將我們的examples
需要編譯的c文件,以及需要包含的頭文件包含進去就可以了。
所以,找到待編譯的文件,還有頭文件,就是我們的目標。
尋找目標Keil文件
現在轉戰到KEIL目錄下,我們以farm_ai_demo
文件爲例,使用文本編輯器打開board/TencentOS_tiny_EVB_MX/KEIL/farm_ai_demo/TencentOS_tiny.uvprojx
文件,就可以看到裏面的文件結構,大致瀏覽一下,發現這就是個xml文件。
頭文件
接下來就發現,我們的目標就靜靜的躺在那裏,等待我們的到來:
就在<IncludePath>
標籤之中,所有的頭文件包含都在這裏了。我們把這段複製出來,進行處理一下:
先將Windows下的路徑分隔符\
轉換爲/
,然後使用換行替換掉;
再將../
轉換爲對應的路徑,這樣,就可以把這段代碼添加到Makefile文件的頭文件包含段了。我們對他們再進行一些模塊劃分,最終頭文件包含的效果就是這樣:
# C includes
KERNEL_INC = \
-I $(TOP_DIR)/kernel/core/include \
-I $(TOP_DIR)/kernel/pm/include \
-I $(TOP_DIR)/kernel/hal/include \
-I $(TOP_DIR)/arch/arm/arm-v7m/common/include \
-I $(TOP_DIR)/arch/arm/arm-v7m/cortex-m4/gcc
C_INCLUDES += $(KERNEL_INC)
CMSIS_INC = \
-I $(TOP_DIR)/osal/cmsis_os
C_INCLUDES += $(CMSIS_INC)
PLATFORM_INC = \
-I $(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Inc \
-I $(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Inc/Legacy \
-I $(TOP_DIR)/platform/vendor_bsp/st/CMSIS/Device/ST/STM32L4xx/Include \
-I $(TOP_DIR)/platform/vendor_bsp/st/CMSIS/Include
C_INCLUDES += $(PLATFORM_INC)
BOARD_INC = \
-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/TOS-CONFIG \
-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Inc \
-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/DHT11 \
-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/BH1750 \
-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/E53_IA1 \
-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/OLED
C_INCLUDES += $(BOARD_INC)
NET_INC = \
-I $(TOP_DIR)/net/at/include \
-I $(TOP_DIR)/net/sal_module_wrapper \
-I $(TOP_DIR)/devices/esp8266
C_INCLUDES += $(NET_INC)
COMPONENTS_INC = \
-I $(TOP_DIR)/components/utils/JSON/include \
-I $(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/wrapper/include \
-I $(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/include
C_INCLUDES += $(COMPONENTS_INC)
EXAMPLES_INC = \
-I $(TOP_DIR)/examples/farm_ai_demo
C_INCLUDES += $(EXAMPLES_INC)
源碼文件
有了頭文件的經驗,我們繼續尋找源碼,
不過,跟剛纔的頭文件稍有不同,這裏每個源碼都是單獨的標籤,不再擁擠在一起,而且,路徑也單獨標識出來,看着好像不太好搞。不過,沒關係,這點根本難不倒讀文章到這裏的你:
複製所有的FilePath
標籤行到新文件,替換掉標籤,並且把Windows下的路徑分隔符\
轉換爲/
,操作跟之前都相似。
最終,我們得到了一個個熱氣騰騰的源碼文件列表,把他們稍加分類,添加到我們的Makefile中:
# C sources
KERNEL_SRC = \
${wildcard $(TOP_DIR)/kernel/core/*.c}
C_SOURCES += $(KERNEL_SRC)
ARCH_SRC = \
${wildcard $(TOP_DIR)/arch/arm/arm-v7m/cortex-m4/gcc/*.c} \
${wildcard $(TOP_DIR)/arch/arm/arm-v7m/common/*.c}
C_SOURCES += $(ARCH_SRC)
CMSIS_SRC = \
${wildcard $(TOP_DIR)/osal/cmsis_os/*.c}
C_SOURCES += $(CMSIS_SRC)
PLATFORM_SRC = \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dac.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dac_ex.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c \
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c \
$(TOP_DIR)/platform/hal/st/stm32l4xx/src/tos_hal_uart.c
C_SOURCES += $(PLATFORM_SRC)
NET_SRC = \
$(TOP_DIR)/net/at/src/tos_at.c \
$(TOP_DIR)/net/at/src/tos_at_utils.c \
$(TOP_DIR)/net/sal_module_wrapper/sal_module_wrapper.c \
$(TOP_DIR)/devices/esp8266/esp8266.c
C_SOURCES += $(NET_SRC)
BSP_SRC = \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/gpio.c \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/main.c \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/mcu_init.c \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/stm32l4xx_hal_msp.c \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/stm32l4xx_it_module.c \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/usart.c \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/adc.c \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/dac.c \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/i2c.c \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/spi.c \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/system_stm32l4xx.c \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/DHT11/DHT11_BUS.c \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/OLED/oled.c \
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/E53_IA1/E53_IA1.c
C_SOURCES += $(BSP_SRC)
COMPONENTS_SRC = \
$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/wrapper/src/mqtt_wrapper.c \
$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/wrapper/src/transport_wrapper.c \
$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTConnectClient.c \
$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTConnectServer.c \
$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTDeserializePublish.c \
$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTFormat.c \
$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTPacket.c \
$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTSerializePublish.c \
$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTSubscribeClient.c \
$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTSubscribeServer.c \
$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTUnsubscribeClient.c \
$(TOP_DIR)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src/MQTTUnsubscribeServer.c \
$(TOP_DIR)/components/utils/JSON/src/cJSON.c
C_SOURCES += $(COMPONENTS_SRC)
EXAMPLES_SRC = \
$(TOP_DIR)/examples/farm_ai_demo/farm_ai_demo.c
C_SOURCES += $(EXAMPLES_SRC)
# ASM sources
ASM_SOURCES = \
startup_stm32l431xx.s \
ASM_SOURCES_S = \
$(TOP_DIR)/arch/arm/arm-v7m/cortex-m4/gcc/port_s.S
就這樣,一個嶄新的Makefile誕生了!
BUG修復
在之前的文章中也有提到,默認的編譯器,對浮點型的printf("%f")
是不支持的,這裏我們改一下:
LDFLAGS = $(MCU) -u _printf_float -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) \
-Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections
在這句中,我們添加了一個參數 -u _printf_float
, 這樣,就可以順利打印浮點型數據了。
結語
其實這篇文章挺水的,都開始看操作系統源碼以及應用了,不可能改個Makefile都不會。不過我對自己的認識,算是一個澆花匠吧,我不澆水,花兒也可以正常生長,但我澆了水,可以讓花兒長的更好,不用再期待雨水的降臨。所謂 錦上添花,大概如此吧。
萬丈高樓平地起,雖不像那些大樓設計師、高級技師,可以建設棟樑,但現在這個階段,TencentOS-tiny的文檔和代碼都不是很完善,就需要很多我這樣的基層勞動者進行修修補補,搬磚添瓦。我相信我的工作是有意義的。
願未來更好!